+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+"""
+This module is for to handling console attaching and / or creation in Windows
+binaries that are built for the Windows subsystem and therefore do not
+automatically allocate a console.
+"""
+
+import sys
+import os
+import ctypes
+import atexit
+
+STD_OUTPUT_HANDLE = -11
+FILE_TYPE_DISK = 1
+
+def parent_process_pids() -> int:
+ """
+ Returns all parent process PIDs, starting with the closest parent
+ """
+ try:
+ import psutil
+ pid = os.getpid()
+ while pid > 0:
+ pid = psutil.Process(pid).ppid()
+ yield pid
+ except psutil.NoSuchProcess:
+ # Parent process not found, likely terminated, nothing we can do
+ pass
+
+def get_console_title() -> str:
+ ''' Return the current console title as a string. May return None on error. '''
+ b = bytes(1024)
+ b_ptr = ctypes.c_char_p(b)
+ title = None
+ title_len = ctypes.windll.kernel32.GetConsoleTitleW(b_ptr, len(b)//2) # GetConsoleTitleW expects size in 2-byte chars
+ if title_len > 0:
+ title = b.decode('utf-16')[:title_len]
+ return title
+
+def create_or_attach_console(*, attach: bool = True, create: bool = False,
+ title: str = None) -> bool:
+ """
+ Workaround to the fact that cmd.exe based execution of this program means
+ it has no stdout handles and thus is always silent, thereby rendering
+ vernbose console output or command-line usage problematic.
+
+ First, check if we have STD_OUTPUT_HANDLE (a console) and do nothing if
+ there is one, returning True.
+
+ Otherwise, try to attach to the console of any ancestor process, and return
+ True.
+
+ If not successful, optionally (create=True) create a new console.
+
+ NB: Creating a new console results in a 'cmd.exe' console window to be
+ created on the Windows desktop, so only pass create=True if that's
+ acceptable.
+
+ If a console was found or created, we redirect current output handles
+ (sys.stdout, sys.stderr) to this found and/or created console.
+
+ Always return True on success or if there was a console already,
+ False or None on failure (a None return indicates a missing lib or some
+ other unspecified exception was raised when attempting to create a console).
+ """
+ std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
+
+ has_console = std_out_handle > 0
+
+ if has_console:
+ # Output is being redirected to a file, or we have an msys console.
+ # do nothing
+ return True
+
+ try:
+ if attach:
+ # Try to attach to a parent console
+ for pid in parent_process_pids():
+ if ctypes.windll.kernel32.AttachConsole(pid):
+ has_console = True
+ break
+ except ImportError:
+ # User's system lacks psutil
+ return # Return None in case caller wants to differntiate exceptional failures from regular False return
+
+ created = False
+
+ if not has_console and create:
+ # Try to allocate a new console
+ if ctypes.windll.kernel32.AllocConsole():
+ has_console = True
+ created = True
+
+ if not has_console:
+ # Indicate to caller no console is to be had.
+ return False
+
+ try:
+ # Reopen Pythons console input and output handles
+ conout = open('CONOUT$', 'w')
+ sys.stdout = conout
+ sys.stderr = conout
+ sys.stdin = open('CONIN$', 'r')
+ except OSError:
+ # If we get here, we likely were in MinGW / MSYS where CONOUT$ / CONIN$
+ # are not valid files or some other weirdness occurred. Give up.
+ return # return None to indicate underlying exception
+
+ if title:
+ old_title = get_console_title() if not created else None # save the old title only if not created by us
+ # Set the console title, if specified
+ ctypes.windll.kernel32.SetConsoleTitleW(title)
+ if old_title is not None:
+ # undo the setting of the console title at app exit
+ atexit.register(ctypes.windll.kernel32.SetConsoleTitleW, old_title)
+
+ return True
diff --git a/lib/wordlist/chinese_simplified.txt b/electroncash/wordlist/chinese_simplified.txt
similarity index 100%
rename from lib/wordlist/chinese_simplified.txt
rename to electroncash/wordlist/chinese_simplified.txt
diff --git a/lib/wordlist/english.txt b/electroncash/wordlist/english.txt
similarity index 100%
rename from lib/wordlist/english.txt
rename to electroncash/wordlist/english.txt
diff --git a/lib/wordlist/japanese.txt b/electroncash/wordlist/japanese.txt
similarity index 100%
rename from lib/wordlist/japanese.txt
rename to electroncash/wordlist/japanese.txt
diff --git a/lib/wordlist/portuguese.txt b/electroncash/wordlist/portuguese.txt
similarity index 100%
rename from lib/wordlist/portuguese.txt
rename to electroncash/wordlist/portuguese.txt
diff --git a/lib/wordlist/spanish.txt b/electroncash/wordlist/spanish.txt
similarity index 100%
rename from lib/wordlist/spanish.txt
rename to electroncash/wordlist/spanish.txt
diff --git a/lib/x509.py b/electroncash/x509.py
similarity index 95%
rename from lib/x509.py
rename to electroncash/x509.py
index 37eaa724a9b7..eeecccd86a64 100644
--- a/lib/x509.py
+++ b/electroncash/x509.py
@@ -299,9 +299,13 @@ def check_date(self):
not_before = time.mktime(time.strptime(self.notBefore.decode('ascii'), TIMESTAMP_FMT))
not_after = time.mktime(time.strptime(self.notAfter.decode('ascii'), TIMESTAMP_FMT))
if not_before > now:
- raise CertificateError('Certificate has not entered its valid date range. (%s)' % self.get_common_name())
+ raise CertificateError('Certificate for {} has not yet entered its valid date range. ({})'
+ .format(self.get_common_name(),
+ time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(not_before))))
if not_after <= now:
- raise CertificateError('Certificate has expired. (%s)' % self.get_common_name())
+ raise CertificateError('Certificate for {} has expired at {}'
+ .format(self.get_common_name(),
+ time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(not_after))))
def getFingerprint(self):
return hashlib.sha1(self.bytes).digest()
diff --git a/gui/__init__.py b/electroncash_gui/__init__.py
similarity index 100%
rename from gui/__init__.py
rename to electroncash_gui/__init__.py
diff --git a/electroncash_gui/qt/__init__.py b/electroncash_gui/qt/__init__.py
new file mode 100644
index 000000000000..427abfd5b31b
--- /dev/null
+++ b/electroncash_gui/qt/__init__.py
@@ -0,0 +1,1023 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Electrum - lightweight Bitcoin client
+# Copyright (C) 2012 thomasv@gitorious
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+import gc
+import os
+import platform
+import shutil
+import signal
+import sys
+import traceback
+
+try:
+ import PyQt5
+except Exception:
+ if sys.platform.startswith('win'):
+ msg = ("\n\nError: Could not import PyQt5.\n"
+ "If you are running the release .exe, this is a bug (please"
+ " contact the developers in that case).\n"
+ "If you are running from source, then you may try this from the command-line:\n\n"
+ " python -m pip install pyqt5\n\n")
+ elif sys.platform.startswith('darw'):
+ msg = ("\n\nError: Could not import PyQt5.\n"
+ "If you are running the release .app, this is a bug (please"
+ " contact the developers in that case).\n"
+ "If you are running from source, then you may try this from the command-line:\n\n"
+ " python3 -m pip install --user -I pyqt5\n\n")
+ else:
+ msg = ("\n\nError: Could not import PyQt5.\n"
+ "You may try:\n\n"
+ " python3 -m pip install --user -I pyqt5\n\n"
+ "Or, if on Linux Ubuntu, Debian, etc:\n\n"
+ " sudo apt-get install python3-pyqt5\n\n")
+ sys.exit(msg)
+
+from PyQt5.QtGui import *
+from PyQt5.QtWidgets import *
+from PyQt5.QtCore import *
+
+from electroncash.i18n import _
+from electroncash import i18n
+from electroncash.plugins import run_hook
+from electroncash import WalletStorage
+from electroncash.util import (UserCancelled, PrintError, print_error,
+ standardize_path, finalization_print_error, Weak,
+ get_new_wallet_name, Handlers)
+from electroncash import version
+from electroncash.address import Address
+
+from .installwizard import InstallWizard, GoBack
+
+from . import icons # This needs to be imported once app-wide then the :icons/ namespace becomes available for Qt icon filenames.
+from .util import * # * needed for plugins
+from .main_window import ElectrumWindow
+from .network_dialog import NetworkDialog
+from .exception_window import Exception_Hook
+from .update_checker import UpdateChecker
+from .token_meta import TokenMetaQt
+
+
+class ElectrumGui(QObject, PrintError):
+ new_window_signal = pyqtSignal(str, object)
+ new_window_initialized_signal = pyqtSignal()
+ update_available_signal = pyqtSignal(bool)
+ cashaddr_toggled_signal = pyqtSignal() # app-wide signal for when cashaddr format is toggled. This used to live in each ElectrumWindow instance but it was recently refactored to here.
+ cashaddr_status_button_hidden_signal = pyqtSignal(bool) # app-wide signal for when cashaddr toggle button is hidden from the status bar
+ shutdown_signal = pyqtSignal() # signal for requesting an app-wide full shutdown
+ do_in_main_thread_signal = pyqtSignal(object, object, object)
+ token_metadata_updated_signal = pyqtSignal(str) # Param is: category_id (hex)
+
+ instance = None
+
+ def __init__(self, config, daemon, plugins):
+ super(__class__, self).__init__() # QObject init
+ assert __class__.instance is None, "ElectrumGui is a singleton, yet an instance appears to already exist! FIXME!"
+ __class__.instance = self
+ i18n.set_language(config.get('language'))
+
+ self.config = config
+ self.daemon = daemon
+ self.plugins = plugins
+ self.token_meta = TokenMetaQt(self.config)
+ self.windows = []
+
+ self._setup_do_in_main_thread_handler()
+
+ # Uncomment this call to verify objects are being properly
+ # GC-ed when windows are closed
+ #if daemon.network:
+ # from electroncash.util import DebugMem
+ # from electroncash.wallet import Abstract_Wallet
+ # from electroncash.verifier import SPV
+ # from electroncash.synchronizer import Synchronizer
+ # daemon.network.add_jobs([DebugMem([Abstract_Wallet, SPV, Synchronizer,
+ # ElectrumWindow], interval=5)])
+
+ call_after_app = self._pre_and_post_app_setup()
+ try:
+ self.app = QApplication(sys.argv)
+ finally:
+ call_after_app()
+
+ self._load_fonts() # this needs to be done very early, before the font engine loads fonts.. out of paranoia
+ self._exit_if_required_pyqt_is_missing() # This may immediately exit the app if missing required PyQt5 modules, so it should also be done early.
+ self.new_version_available = None
+ self._set_icon()
+ self.app.installEventFilter(self)
+ self.timer = QTimer(self); self.timer.setSingleShot(False); self.timer.setInterval(500) #msec
+ self.gc_timer = QTimer(self); self.gc_timer.setSingleShot(True); self.gc_timer.timeout.connect(ElectrumGui.gc); self.gc_timer.setInterval(500) #msec
+ self.nd = None
+ self._last_active_window = None # we remember the last activated ElectrumWindow as a Weak.ref
+ Address.show_cashaddr(self.is_cashaddr())
+ # Dark Theme -- ideally set this before any widgets are created.
+ self.qdarkstyle_is_enabled = False
+ self.set_dark_theme_if_needed()
+ # /
+ # Wallet Password Cache
+ # wallet -> (password, QTimer) map for some plugins (like CashShuffle)
+ # that need wallet passwords to operate, and we don't want to prompt
+ # for pw twice right after the InstallWizard runs (see #106).
+ # Entries in this map are deleted after 10 seconds by the QTimer (which
+ # also deletes itself)
+ self._wallet_password_cache = Weak.KeyDictionary()
+ # /
+ self.update_checker = UpdateChecker()
+ self.update_checker_timer = QTimer(self); self.update_checker_timer.timeout.connect(self.on_auto_update_timeout); self.update_checker_timer.setSingleShot(False)
+ self.update_checker.got_new_version.connect(self.on_new_version)
+ # init tray
+ self.dark_icon = self.config.get("dark_icon", False)
+ self.tray = QSystemTrayIcon(self.tray_icon(), self)
+ self.tray.setToolTip('Electron Cash')
+ self.tray.activated.connect(self.tray_activated)
+ self.build_tray_menu()
+ self.tray.show()
+ self.new_window_signal.connect(self.start_new_window)
+ if self.has_auto_update_check():
+ self._start_auto_update_timer(first_run = True)
+ self.app.focusChanged.connect(self.on_focus_change) # track last window the user interacted with
+ self.shutdown_signal.connect(self.close, Qt.QueuedConnection)
+ run_hook('init_qt', self)
+
+ self._check_and_warn_qt_version()
+
+ def __del__(self):
+ stale = True
+ if __class__.instance is self:
+ stale = False
+ __class__.instance = None
+ print_error("[{}] finalized{}".format(__class__.__name__, ' (stale instance)' if stale else ''))
+ if hasattr(super(), '__del__'):
+ super().__del__()
+
+ def _setup_do_in_main_thread_handler(self):
+ ''' Sets up "do_in_main_thread" handler mechanism for Qt GUI. '''
+ self.do_in_main_thread_signal.connect(self._do_in_main_thread_handler_slot)
+ orig_handler = Handlers.do_in_main_thread
+ weakSelf = Weak.ref(self)
+ def my_do_in_main_thread_handler(func, *args, **kwargs):
+ strongSelf = weakSelf()
+ if strongSelf:
+ # We are still alive, emit the signal which will be handled
+ # in the main thread.
+ strongSelf.do_in_main_thread_signal.emit(func, args, kwargs)
+ else:
+ # We died. Uninstall this handler, invoke original handler.
+ Handlers.do_in_main_thread = orig_handler
+ orig_handler(func, *args, **kwargs)
+ Handlers.do_in_main_thread = my_do_in_main_thread_handler
+
+ def _do_in_main_thread_handler_slot(self, func, args, kwargs):
+ """
+ Hooked in to util.Handlers.do_in_main_thread via the
+ do_in_main_thread_signal. This ensures that there is an app-wide
+ mechanism for posting invocations to the main thread. Currently
+ CashFusion uses this mechanism, but other code may as well.
+ """
+ func(*args, **kwargs)
+
+ def _pre_and_post_app_setup(self):
+ """
+ Call this before instantiating the QApplication object. It sets up
+ some platform-specific miscellany that need to happen before the
+ QApplication is constructed.
+
+ A function is returned. This function *must* be called after the
+ QApplication is constructed.
+ """
+ callables = []
+ def call_callables():
+ for func in callables:
+ func()
+ ret = call_callables
+
+ if hasattr(QGuiApplication, 'setDesktopFileName'):
+ QGuiApplication.setDesktopFileName('electron-cash.desktop')
+
+ if self.windows_qt_use_freetype:
+ # Use FreeType for font rendering on Windows. This fixes rendering
+ # of the Schnorr sigil and allows us to load the Noto Color Emoji
+ # font if needed.
+ os.environ['QT_QPA_PLATFORM'] = 'windows:fontengine=freetype'
+
+ QCoreApplication.setAttribute(Qt.AA_X11InitThreads)
+ if hasattr(Qt, "AA_ShareOpenGLContexts"):
+ QCoreApplication.setAttribute(Qt.AA_ShareOpenGLContexts)
+ if sys.platform not in ('darwin',) and hasattr(Qt, "AA_EnableHighDpiScaling"):
+ # The below only applies to non-macOS. On macOS this setting is
+ # never used (because it is implicitly auto-negotiated by the OS
+ # in a differernt way).
+ #
+ # qt_disable_highdpi will be set to None by default, or True if
+ # specified on command-line. The command-line override is intended
+ # to supporess high-dpi mode just for this run for testing.
+ #
+ # The more permanent setting is qt_enable_highdpi which is the GUI
+ # preferences option, so we don't enable highdpi if it's explicitly
+ # set to False in the GUI.
+ #
+ # The default on Linux, Windows, etc is to enable high dpi
+ disable_scaling = self.config.get('qt_disable_highdpi', False)
+ enable_scaling = self.config.get('qt_enable_highdpi', True)
+ if not disable_scaling and enable_scaling:
+ QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
+ if hasattr(Qt, "AA_UseHighDpiPixmaps"):
+ QCoreApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)
+
+ # Set mac_ver to the appropriate macOS version e.g.: (10,15,1) for Catalina, etc or None if not macOS
+ mac_ver = None
+ if sys.platform in ('darwin',):
+ try:
+ mac_ver = tuple(int(a) for a in platform.mac_ver()[0].split('.'))
+ self.print_error("macOS version:", mac_ver)
+ except (TypeError, ValueError) as e:
+ self.print_error("WARNING: Cannot parse platform.mac_ver:", repr(e))
+
+ # macOS Mojave "font rendering looks terrible on PyQt5.11" workaround.
+ # See: https://old.reddit.com/r/apple/comments/9leavs/fix_mojave_font_rendering_issues_on_a_perapp_basis/
+ # This affects PyQt 5.11 (which is what we ship in the macOS El Capitan
+ # .dmg). We apply the workaround and also warn the user to not use
+ # the El Capitan compatibility .dmg.
+ if mac_ver and mac_ver >= (10, 14) and self.qt_version() < (5, 12):
+ # macOS hacks. On Mojave with PyQt <5.12 the font rendering is terrible.
+ # As a workaround we need to temporarily set this 'defaults' keys
+ # which we immediately disable after the QApplication is started.
+ from electroncash.utils import macos
+ self.print_error("Mojave+ with PyQt<5.12 detected; applying CGFontRenderingFontSmoothingDisabled workaround...")
+ bundle = macos.get_bundle_identifier()
+ os.system(f'defaults write {bundle} CGFontRenderingFontSmoothingDisabled -bool NO')
+ def undo_hack():
+ os.system(f'defaults delete {bundle} CGFontRenderingFontSmoothingDisabled')
+ self.print_error("Mojave+ font rendering workaround applied.")
+
+ callables.append(undo_hack)
+
+ # macOS Big Sur workaround for Qt>=5.13.2 sometimes not working at all
+ # See: https://bugreports.qt.io/browse/QTBUG-87014
+ # See also: https://stackoverflow.com/questions/64818879/is-there-any-solution-regarding-to-pyqt-library-doesnt-work-in-mac-os-big-sur
+ if mac_ver and mac_ver >= (10, 16) and self.qt_version() >= (5, 13, 2) and self.qt_version() < (5, 15, 2):
+ # Setting this env var causes Qt to use some other macOS API that always works on Big Sur
+ os.environ['QT_MAC_WANTS_LAYER'] = '1'
+ self.print_error(f"macOS Big Sur Qt workaround applied")
+
+ def setup_layout_direction():
+ """Sets the app layout direction depending on language. To be called
+ after self.app is created successfully. Note this *MUST* be called
+ after set_language has been called."""
+ assert i18n.set_language_called > 0
+ lc = i18n.language.info().get('language')
+ lc = '' if not isinstance(lc, str) else lc
+ lc = lc.split('_')[0]
+ layout_direction = Qt.LeftToRight
+ blurb = "left-to-right"
+ if lc in {'ar', 'fa', 'he', 'ps', 'ug', 'ur'}: # Right-to-left languages
+ layout_direction = Qt.RightToLeft
+ blurb = "right-to-left"
+ self.print_error("Setting layout direction:", blurb)
+ self.app.setLayoutDirection(layout_direction)
+ # callable will be called after self.app is set-up successfully
+ callables.append(setup_layout_direction)
+
+ return ret
+
+ def _exit_if_required_pyqt_is_missing(self):
+ ''' Will check if required PyQt5 modules are present and if not,
+ display an error message box to the user and immediately quit the app.
+
+ This is because some Linux systems break up PyQt5 into multiple
+ subpackages, and for instance PyQt5 QtSvg is its own package, and it
+ may be missing.
+ '''
+ try:
+ from PyQt5 import QtSvg
+ except ImportError:
+ # Closes #1436 -- Some "Run from source" Linux users lack QtSvg
+ # (partial PyQt5 install)
+ msg = _("A required Qt module, QtSvg was not found. Please fully install all of PyQt5 5.12 or above to resolve this issue.")
+ if sys.platform == 'linux':
+ msg += "\n\n" + _("On Linux, you may try:\n\n python3 -m pip install --user -I pyqt5")
+ if shutil.which('apt'):
+ msg += "\n\n" + _("On Debian-based distros, you can run:\n\n sudo apt install python3-pyqt5.qtsvg")
+
+ QMessageBox.critical(None, _("QtSvg Missing"), msg) # this works even if app is not exec_() yet.
+ self.app.exit(1)
+ sys.exit(msg)
+
+ def is_dark_theme_available(self):
+ if sys.platform in ('darwin',):
+ # On OSX, qdarkstyle is kind of broken. We instead rely on Mojave
+ # dark mode if (built in to the OS) for this facility, which the
+ # user can set outside of this application.
+ return False
+ try:
+ import qdarkstyle
+ except:
+ return False
+ return True
+
+ def set_dark_theme_if_needed(self):
+ if sys.platform in ('darwin',):
+ # On OSX, qdarkstyle is kind of broken (bad UI). We instead rely on Mojave
+ # dark mode if (built in to the OS) for this facility, which the
+ # user can set outside of this application.
+ self.qdarkstyle_is_enabled = False
+ else:
+ self.qdarkstyle_is_enabled = self.config.get('qt_gui_color_theme', 'default') == 'dark'
+ darkstyle_ver = None
+ if self.qdarkstyle_is_enabled:
+ try:
+ import qdarkstyle
+ self.app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
+ try:
+ darkstyle_ver = version.normalize_version(qdarkstyle.__version__)
+ except (ValueError, IndexError, TypeError, NameError, AttributeError) as e:
+ self.print_error("Warning: Could not determine qdarkstyle version:", repr(e))
+ except BaseException as e:
+ self.qdarkstyle_is_enabled = False
+ self.print_error('Error setting dark theme: {}'.format(repr(e)))
+ # Apply any necessary stylesheet patches
+ from . import style_patcher
+ style_patcher.patch(use_dark_theme=self.qdarkstyle_is_enabled, darkstyle_ver=darkstyle_ver)
+ # Even if we ourselves don't set the dark theme,
+ # the OS/window manager/etc might set *a dark theme*.
+ # Hence, try to choose colors accordingly:
+ ColorScheme.update_from_widget(QWidget(), force_dark=self.qdarkstyle_is_enabled)
+
+ def get_cached_password(self, wallet):
+ ''' Passwords in the cache only live for a very short while (10 seconds)
+ after wallet window creation, and only if it's a new window. This
+ mechanism is a convenience for plugins that need access to the wallet
+ password and it would make for poor UX for the user to enter their
+ password twice when opening a new window '''
+ entry = self._wallet_password_cache.get(wallet)
+ if entry:
+ return entry[0]
+
+ def _expire_cached_password(self, weakWallet):
+ ''' Timer callback, called after 10 seconds. '''
+ wallet = weakWallet() if isinstance(weakWallet, Weak.ref) else weakWallet
+ if wallet:
+ entry = self._wallet_password_cache.pop(wallet, None)
+ if entry:
+ timer = entry[1]
+ timer.stop(); timer.deleteLater()
+
+ def _cache_password(self, wallet, password):
+ self._expire_cached_password(wallet)
+ if password is None:
+ return
+ timer = QTimer() # NB a top-level parentless QObject will get delete by Python when its Python refct goes to 0, which is what we want here. Future programmers: Do not give this timer a parent!
+ self._wallet_password_cache[wallet] = (password, timer)
+ weakWallet = Weak.ref(wallet)
+ weakSelf = Weak.ref(self)
+ def timeout():
+ slf = weakSelf()
+ slf and slf._expire_cached_password(weakWallet)
+ timer.setSingleShot(True); timer.timeout.connect(timeout); timer.start(10000) # 10 sec
+
+ def cache_password(self, wallet, password):
+ self._cache_password(wallet, password)
+
+ def _set_icon(self):
+ icon = None
+ if sys.platform == 'darwin':
+ # on macOS, in "running from source" mode, we want to set the app
+ # icon, otherwise we get the generic Python icon.
+ # In non-running-from-source mode, macOS will get the icon from
+ # the .app bundle Info.plist spec (which ends up being
+ # electron.icns). However, in .app mode, Qt will not know about
+ # this icon and won't be able to use it for e.g. the About dialog.
+ # In the latter case the branch below will tell Qt to use
+ # electron-cash.svg as the "window icon".
+ icon = QIcon("electron.icns") if os.path.exists("electron.icns") else None
+ if not icon:
+ # Set this on all other platforms (and macOS built .app) as it can
+ # only help and never harm, and is always available.
+ icon = QIcon(":icons/electron-cash.svg")
+ if icon:
+ self.app.setWindowIcon(icon)
+
+ @staticmethod
+ def qt_version() -> tuple:
+ ''' Returns a 3-tuple of the form (major, minor, revision) eg
+ (5, 12, 4) for the current Qt version derived from the QT_VERSION
+ global provided by Qt. '''
+ return ( (QT_VERSION >> 16) & 0xff, (QT_VERSION >> 8) & 0xff, QT_VERSION & 0xff )
+
+ def _load_fonts(self):
+ ''' All apologies for the contorted nature of this platform code.
+ Fonts on Windows & Linux are .. a sensitive situation. :) '''
+ # Only load the emoji font on Linux and Windows
+ if sys.platform not in ('linux', 'win32', 'cygwin'):
+ return
+
+ # TODO: Check if we already have the needed emojis
+ # TODO: Allow the user to download a full color emoji set
+
+ linux_font_config_file = os.path.join(os.path.dirname(__file__), 'data', 'fonts.xml')
+ emojis_ttf_name = 'ecsupplemental_lnx.ttf'
+ emojis_ttf_path = os.path.join(os.path.dirname(__file__), 'data', emojis_ttf_name)
+ did_set_custom_fontconfig = False
+
+ if (sys.platform == 'linux'
+ and self.linux_qt_use_custom_fontconfig # method-backed property, checks config settings
+ and not os.environ.get('FONTCONFIG_FILE')
+ and os.path.exists('/etc/fonts/fonts.conf')
+ and os.path.exists(linux_font_config_file)
+ and os.path.exists(emojis_ttf_path)
+ and self.qt_version() >= (5, 12)): # doing this on Qt < 5.12 causes harm and makes the whole app render fonts badly
+ # On Linux, we override some fontconfig rules by loading our own
+ # font config XML file. This makes it so that our custom emojis and
+ # other needed glyphs are guaranteed to get picked up first,
+ # regardless of user font config. Without this some Linux systems
+ # had black and white or missing emoji glyphs. We only do this if
+ # the user doesn't have their own fontconfig file in env and
+ # also as a sanity check, if they have the system
+ # /etc/fonts/fonts.conf file in the right place.
+ os.environ['FONTCONFIG_FILE'] = linux_font_config_file
+ did_set_custom_fontconfig = True
+
+ if sys.platform in ('win32', 'cygwin'):
+ env_var = os.environ.get('QT_QPA_PLATFORM')
+ if not env_var or 'windows:fontengine=freetype' not in env_var.lower():
+ # not set up to use freetype, so loading the .ttf would fail.
+ # abort early.
+ return
+ del env_var
+ # use a different .ttf file on Windows
+ emojis_ttf_name = 'ecsupplemental_win.ttf'
+ emojis_ttf_path = os.path.join(os.path.dirname(__file__), 'data', emojis_ttf_name)
+
+ if QFontDatabase.addApplicationFont(emojis_ttf_path) < 0:
+ self.print_error('Failed to add unicode emoji font to application fonts:', emojis_ttf_path)
+ if did_set_custom_fontconfig:
+ self.print_error('Deleting custom (fonts.xml) FONTCONFIG_FILE env. var')
+ del os.environ['FONTCONFIG_FILE']
+
+ def _check_and_warn_qt_version(self):
+ if sys.platform == 'linux' and self.qt_version() < (5, 12):
+ msg = _("Electron Cash on Linux requires PyQt5 5.12+.\n\n"
+ "You have version {version_string} installed.\n\n"
+ "Please upgrade otherwise you may experience "
+ "font rendering issues with emojis and other unicode "
+ "characters used by Electron Cash.").format(version_string=QT_VERSION_STR)
+ QMessageBox.warning(None, _("PyQt5 Upgrade Needed"), msg) # this works even if app is not exec_() yet.
+
+
+ def eventFilter(self, obj, event):
+ ''' This event filter allows us to open bitcoincash: URIs on macOS '''
+ if event.type() == QEvent.FileOpen:
+ if len(self.windows) >= 1:
+ self.windows[0].pay_to_URI(event.url().toString())
+ return True
+ return False
+
+ def build_tray_menu(self):
+ ''' Rebuild the tray menu by tearing it down and building it new again '''
+ m_old = self.tray.contextMenu()
+ if m_old is not None:
+ # Tray does NOT take ownership of menu, so we are tasked with
+ # deleting the old one. Note that we must delete the old one rather
+ # than just clearing it because otherwise the old sub-menus stick
+ # around in Qt. You can try calling qApp.topLevelWidgets() to
+ # convince yourself of this. Doing it this way actually cleans-up
+ # the menus and they do not leak.
+ m_old.clear()
+ m_old.deleteLater() # C++ object and its children will be deleted later when we return to the event loop
+ m = QMenu()
+ m.setObjectName("SysTray.QMenu")
+ self.tray.setContextMenu(m)
+ destroyed_print_error(m)
+ for window in self.windows:
+ submenu = m.addMenu(window.wallet.basename())
+ submenu.addAction(_("Show/Hide"), window.show_or_hide)
+ submenu.addAction(_("Close"), window.close)
+ m.addAction(_("Dark/Light"), self.toggle_tray_icon)
+ m.addSeparator()
+ m.addAction(_("&Check for updates..."), lambda: self.show_update_checker(None))
+ m.addSeparator()
+ m.addAction(_("Exit Electron Cash"), self.close)
+ self.tray.setContextMenu(m)
+
+ def tray_icon(self):
+ if self.dark_icon:
+ return QIcon(':icons/electron_dark_icon.svg')
+ else:
+ return QIcon(':icons/electron_light_icon.svg')
+
+ def toggle_tray_icon(self):
+ self.dark_icon = not self.dark_icon
+ self.config.set_key("dark_icon", self.dark_icon, True)
+ self.tray.setIcon(self.tray_icon())
+
+ def tray_activated(self, reason):
+ if reason == QSystemTrayIcon.DoubleClick:
+ if all([w.is_hidden() for w in self.windows]):
+ for w in self.windows:
+ w.bring_to_top()
+ else:
+ for w in self.windows:
+ w.hide()
+
+ def close(self):
+ for window in list(self.windows):
+ window.close()
+
+ def new_window(self, path, uri=None):
+ # Use a signal as can be called from daemon thread
+ self.new_window_signal.emit(path, uri)
+
+ def show_network_dialog(self, parent, *, jumpto : str = ''):
+ if self.warn_if_no_network(parent):
+ return
+ if self.nd:
+ self.nd.on_update()
+ run_hook("on_network_dialog", self.nd)
+ self.nd.show()
+ self.nd.raise_()
+ if jumpto: self.nd.jumpto(jumpto)
+ return
+ self.nd = NetworkDialog(self.daemon.network, self.config)
+ run_hook("on_network_dialog", self.nd)
+ self.nd.show()
+ if jumpto: self.nd.jumpto(jumpto)
+
+ def create_window_for_wallet(self, wallet):
+ w = ElectrumWindow(self, wallet)
+ self.windows.append(w)
+ finalization_print_error(w, "[{}] finalized".format(w.diagnostic_name()))
+ self.build_tray_menu()
+ run_hook('on_new_window', w)
+ return w
+
+ def get_wallet_folder(self):
+ ''' may raise FileNotFoundError '''
+ return os.path.dirname(os.path.abspath(self.config.get_wallet_path()))
+
+ def get_new_wallet_path(self):
+ ''' may raise FileNotFoundError '''
+ wallet_folder = self.get_wallet_folder()
+ filename = get_new_wallet_name(wallet_folder)
+ full_path = os.path.join(wallet_folder, filename)
+ return full_path
+
+ def on_focus_change(self, ignored, new_focus_widget):
+ ''' Remember the last wallet window that was activated because
+ start_new_window uses this information. We store the ElectrumWindow
+ in a weak reference so that we don't interfere with its gc when it is
+ closed.'''
+ if not new_focus_widget:
+ return
+ if isinstance(new_focus_widget, QWidget):
+ window = QWidget.window(new_focus_widget) # call base class because some widgets may actually override 'window' with Python attributes.
+ if isinstance(window, ElectrumWindow):
+ self._last_active_window = Weak.ref(window)
+
+ def start_new_window(self, path, uri):
+ '''Raises the window for the wallet if it is open. Otherwise
+ opens the wallet and creates a new window for it.
+
+ `path=None` is a special usage which will raise the last activated
+ window or open the 'last wallet' if no windows are open.'''
+
+ if not path:
+ if not self.windows:
+ # This branch is taken if nothing is currently open but
+ # path == None, in which case set path=last wallet
+ self.config.open_last_wallet()
+ path = self.config.get_wallet_path()
+ elif self._last_active_window:
+ # This branch is taken if we have windows open and we have
+ # _last_active_window defined, in which case we specify
+ # that this window should be activated by setting path
+ # so that the for loop below will trigger on this window.
+ w = self._last_active_window() # weak ref -> strong ref
+ if w and w in self.windows: # check ref still alive
+ # this will cause the last active window to be used in the
+ # for loop below
+ path = w.wallet.storage.path
+
+ # NB: path may still be None here if it came in as None from args and
+ # if the above logic couldn't select a window to use -- in which case
+ # we'll end up picking self.windows[0]
+
+ path = path and standardize_path(path) # just make sure some plugin didn't give us a symlink
+ for w in self.windows:
+ if not path or w.wallet.storage.path == path:
+ path = w.wallet.storage.path # remember path in case it was None
+ w.bring_to_top()
+ break
+ else:
+ try:
+
+ if not self.windows:
+ self.warn_if_no_secp(relaxed=True)
+
+ try:
+ wallet = self.daemon.load_wallet(path, None)
+ if wallet is not None:
+ self.daemon.cmd_runner.wallet = wallet
+ except BaseException as e:
+ self.print_error(repr(e))
+ if self.windows:
+ # *Not* starting up. Propagate exception out to present
+ # error message box to user.
+ raise e
+ # We're just starting up, so we are tolerant of bad wallets
+ # and just want to proceed to the InstallWizard so the user
+ # can either specify a different wallet or create a new one.
+ # (See issue #1189 where before they would get stuck)
+ path = self.get_new_wallet_path() # give up on this unknown wallet and try a new name.. note if things get really bad this will raise FileNotFoundError and the app aborts here.
+ wallet = None # fall thru to wizard
+ if not wallet:
+ storage = WalletStorage(path, manual_upgrades=True)
+ wizard = InstallWizard(self.config, self.app, self.plugins, storage)
+ try:
+ wallet, password = wizard.run_and_get_wallet() or (None, None)
+ except UserCancelled:
+ pass
+ except GoBack as e:
+ self.print_error('[start_new_window] Exception caught (GoBack)', e)
+ finally:
+ wizard.terminate()
+ del wizard
+ gc.collect() # wizard sticks around in memory sometimes, otherwise :/
+ if not wallet:
+ return
+ wallet.start_threads(self.daemon.network)
+ self.daemon.add_wallet(wallet)
+ self.daemon.cmd_runner.wallet = wallet
+ self._cache_password(wallet, password)
+ except BaseException as e:
+ traceback.print_exc(file=sys.stdout)
+ if '2fa' in str(e):
+ self.warning(title=_('Error'), message = '2FA wallets for Bitcoin Cash are currently unsupported by TrustedCoin. Follow this guide in order to recover your funds.')
+ else:
+ self.warning(title=_('Error'), message = 'Cannot load wallet:\n' + str(e), icon=QMessageBox.Critical)
+ return
+ w = self.create_window_for_wallet(wallet)
+ self.new_window_initialized_signal.emit()
+ if uri:
+ w.pay_to_URI(uri)
+ w.bring_to_top()
+ w.setWindowState(w.windowState() & ~Qt.WindowMinimized | Qt.WindowActive)
+
+ # this will activate the window
+ w.activateWindow()
+ return w
+
+ def close_window(self, window):
+ self.windows.remove(window)
+ self.build_tray_menu()
+ # save wallet path of last open window
+ run_hook('on_close_window', window)
+ # GC on ElectrumWindows takes forever to actually happen due to the
+ # circular reference zoo they create around them (they end up stuck in
+ # generation 2 for a long time before being collected). The below
+ # schedules a more comprehensive GC to happen in the very near future.
+ # This mechanism takes on the order of 40-100ms to execute (depending
+ # on hardware) but frees megabytes of memory after closing a window
+ # (which itslef is a relatively infrequent UI event, so it's
+ # an acceptable tradeoff).
+ self.gc_schedule()
+
+ if not self.windows:
+ self.config.save_last_wallet(window.wallet)
+ # NB: We see if we should quit the app after the last wallet
+ # window is closed, even if a network dialog or some other window is
+ # open. It was bizarre behavior to keep the app open when
+ # things like a transaction dialog or the network dialog were still
+ # up.
+ self._quit_after_last_window() # central point that checks if we should quit.
+
+ #window.deleteLater() # <--- This has the potential to cause bugs (esp. with misbehaving plugins), so commented-out. The object gets deleted anyway when Python GC kicks in. Forcing a delete may risk python to have a dangling reference to a deleted C++ object.
+
+ def gc_schedule(self):
+ ''' Schedule garbage collection to happen in the near future.
+ Note that rapid-fire calls to this re-start the timer each time, thus
+ only the last call takes effect (it's rate-limited). '''
+ self.gc_timer.start() # start/re-start the timer to fire exactly once in timeInterval() msecs
+
+ @staticmethod
+ def gc():
+ ''' self.gc_timer timeout() slot '''
+ gc.collect()
+
+ def init_network(self):
+ # Show network dialog if config does not exist
+ if self.daemon.network:
+ if self.config.get('auto_connect') is None:
+ wizard = InstallWizard(self.config, self.app, self.plugins, None)
+ wizard.init_network(self.daemon.network)
+ wizard.terminate()
+
+ def on_new_version(self, newver):
+ ''' Called by the auto update check mechanism to notify
+ that a new version is available. We propagate the signal out
+ using our own update_available_signal as well as post a message
+ to the system tray. '''
+ self.new_version_available = newver
+ self.update_available_signal.emit(True)
+ self.notify(_("A new version of Electron Cash is available: {}").format(newver))
+
+ def show_update_checker(self, parent, *, skip_check = False):
+ if self.warn_if_no_network(parent):
+ return
+ self.update_checker.show()
+ self.update_checker.raise_()
+ if not skip_check:
+ self.update_checker.do_check()
+
+ def on_auto_update_timeout(self):
+ if not self.daemon.network:
+ # auto-update-checking never is done in offline mode
+ self.print_error("Offline mode; update check skipped")
+ elif not self.update_checker.did_check_recently(): # make sure auto-check doesn't happen right after a manual check.
+ self.update_checker.do_check()
+ if self.update_checker_timer.first_run:
+ self._start_auto_update_timer(first_run = False)
+
+ def _start_auto_update_timer(self, *, first_run = False):
+ self.update_checker_timer.first_run = bool(first_run)
+ if first_run:
+ interval = 10.0*1e3 # do it very soon (in 10 seconds)
+ else:
+ interval = 4.0*3600.0*1e3 # once every 4 hours (in ms)
+ self.update_checker_timer.start(int(interval))
+ self.print_error("Auto update check: interval set to {} seconds".format(interval//1e3))
+
+ def _stop_auto_update_timer(self):
+ self.update_checker_timer.stop()
+ self.print_error("Auto update check: disabled")
+
+ def warn_if_cant_import_qrreader(self, parent, show_warning=True):
+ ''' Checks it QR reading from camera is possible. It can fail on a
+ system lacking QtMultimedia. This can be removed in the future when
+ we are unlikely to encounter Qt5 installations that are missing
+ QtMultimedia '''
+ try:
+ from .qrreader import QrReaderCameraDialog
+ except ImportError as e:
+ if show_warning:
+ self.warning(parent=parent,
+ title=_("QR Reader Error"),
+ message=_("QR reader failed to load. This may "
+ "happen if you are using an older version "
+ "of PyQt5.
Detailed error: ") + str(e),
+ rich_text=True)
+ return True
+ return False
+
+ def warn_if_no_network(self, parent):
+ if not self.daemon.network:
+ self.warning(message=_('You are using Electron Cash in offline mode; restart Electron Cash if you want to get connected'), title=_('Offline'), parent=parent, rich_text=True)
+ return True
+ return False
+
+ def warn_if_no_secp(self, parent=None, message=None, icon=QMessageBox.Warning, relaxed=False):
+ ''' Returns True if it DID warn: ie if there's no secp and ecc operations
+ are slow, otherwise returns False if we have secp.
+
+ Pass message (rich text) to provide a custom message.
+
+ Note that the URL link to the HOWTO will always be appended to the custom message.'''
+ from electroncash import ecc_fast
+ has_secp = ecc_fast.is_using_fast_ecc()
+ if has_secp:
+ return False
+
+ # When relaxwarn is set return True without showing the warning
+ from electroncash import get_config
+ if relaxed and get_config().cmdline_options["relaxwarn"]:
+ return True
+
+ # else..
+ howto_url='https://github.com/Electron-Cash/Electron-Cash/blob/master/contrib/secp_HOWTO.md#libsecp256k1-0-for-electron-cash'
+ template = '''
+
+
+ {message}
+
+ {url_blurb}
+
+ Electron Cash Secp Mini-HOWTO
+
+ '''
+ msg = template.format(
+ message = message or _("Electron Cash was unable to find the secp256k1 library on this system. Elliptic curve cryptography operations will be performed in slow Python-only mode."),
+ url=howto_url,
+ url_blurb = _("Please visit this page for instructions on how to correct the situation:")
+ )
+ self.warning(parent=parent, title=_("Missing libsecp256k1"),
+ message=msg, rich_text=True)
+ return True
+
+ def warning(self, title, message, icon = QMessageBox.Warning, parent = None, rich_text=False):
+ if not isinstance(icon, QMessageBox.Icon):
+ icon = QMessageBox.Warning
+ if isinstance(parent, MessageBoxMixin):
+ parent.msg_box(title=title, text=message, icon=icon, parent=None, rich_text=rich_text)
+ else:
+ parent = parent if isinstance(parent, QWidget) else None
+ d = QMessageBoxMixin(icon, title, message, QMessageBox.Ok, parent)
+ if not rich_text:
+ d.setTextFormat(Qt.PlainText)
+ d.setTextInteractionFlags(Qt.TextSelectableByMouse)
+ else:
+ d.setTextFormat(Qt.AutoText)
+ d.setTextInteractionFlags(Qt.TextSelectableByMouse|Qt.LinksAccessibleByMouse)
+ d.setWindowModality(Qt.WindowModal if parent else Qt.ApplicationModal)
+ d.exec_()
+ d.setParent(None)
+
+ def lin_win_maybe_show_highdpi_caveat_msg(self, parent):
+ ''' Called from main_window.py -- tells user once and only once about
+ the high DPI mode and its caveats on Linux only. Is a no-op otherwise. '''
+ is_win = sys.platform[:3] in ('win', 'cyg')
+ is_lin = sys.platform in ('linux',)
+ if not is_win and not is_lin:
+ return
+ if (hasattr(Qt, "AA_EnableHighDpiScaling")
+ and self.app.testAttribute(Qt.AA_EnableHighDpiScaling)
+ # first run check:
+ and self.config.get('qt_enable_highdpi', None) is None
+ and (is_lin # we can't check pixel ratio on linux as apparently it's unreliable, so always show this message on linux
+ # on some windows systems running in highdpi causes
+ # glitches to the QMessageBox windows, so we need
+ # to also warn Windows users that they can turn this off,
+ # but only if they actually are using a high dpi display
+ or (is_win and hasattr(QScreen, 'devicePixelRatio')
+ and any(s.devicePixelRatio() > 1.0 # do they have any screens that are high dpi?
+ for s in self.app.screens()) ))):
+ # write to the config key to immediately suppress this warning in
+ # the future -- it only appears on first-run if key was None
+ self.config.set_key('qt_enable_highdpi', True)
+ if is_lin:
+ msg = (_("Automatic high DPI scaling has been enabled for Electron Cash, which should result in improved graphics quality.")
+ + "\n\n" + _("However, on some esoteric Linux systems, this mode may cause disproportionately large status bar icons.")
+ + "\n\n" + _("If that is the case for you, then you may disable automatic DPI scaling in the preferences, under 'General'."))
+ else: # is_win
+ msg = (_("Automatic high DPI scaling has been enabled for Electron Cash, which should result in improved graphics quality.")
+ + "\n\n" + _("However, on some Windows systems, bugs in Qt may result in minor graphics glitches in system 'message box' dialogs.")
+ + "\n\n" + _("If that is the case for you, then you may disable automatic DPI scaling in the preferences, under 'General'."))
+ parent.show_message( title = _('Automatic High DPI'), msg = msg)
+
+ def has_auto_update_check(self):
+ return bool(self.config.get('auto_update_check', True))
+
+ def set_auto_update_check(self, b):
+ was, b = self.has_auto_update_check(), bool(b)
+ if was != b:
+ self.config.set_key('auto_update_check', b, save=True)
+ if b:
+ self._start_auto_update_timer()
+ else:
+ self._stop_auto_update_timer()
+
+ def _quit_after_last_window(self):
+ if any(1 for w in self.windows
+ if isinstance(w, ElectrumWindow) and not w.cleaned_up):
+ # We can get here if we have some top-level ElectrumWindows that
+ # are "minimized to tray" (hidden). "lastWindowClosed "is emitted
+ # if there are no *visible* windows. If we actually have hidden
+ # app windows (because the user hid them), then we want to *not*
+ # quit the app. https://doc.qt.io/qt-5/qguiapplication.html#lastWindowClosed
+ # This check and early return fixes issue #1727.
+ return
+ qApp.quit()
+
+ def notify(self, message):
+ ''' Display a message in the system tray popup notification. On macOS
+ this is the GROWL thing. On Windows it's a balloon popup from the system
+ tray. On Linux it's usually a banner in the top of the screen.'''
+ if self.tray:
+ try:
+ # this requires Qt 5.9
+ self.tray.showMessage("Electron Cash", message, QIcon(":icons/electron-cash.svg"), 20000)
+ except TypeError:
+ self.tray.showMessage("Electron Cash", message, QSystemTrayIcon.Information, 20000)
+
+ def is_cashaddr(self):
+ return bool(self.config.get('show_cashaddr', True))
+
+ def toggle_cashaddr(self, on = None):
+ was = self.is_cashaddr()
+ if on is None:
+ on = not was
+ else:
+ on = bool(on)
+ self.config.set_key('show_cashaddr', on)
+ Address.show_cashaddr(on)
+ if was != on:
+ self.cashaddr_toggled_signal.emit()
+
+ def is_cashaddr_status_button_hidden(self):
+ return bool(self.config.get('hide_cashaddr_button', False))
+
+ def set_cashaddr_status_button_hidden(self, b):
+ b = bool(b)
+ was = self.is_cashaddr_status_button_hidden()
+ if was != b:
+ self.config.set_key('hide_cashaddr_button', bool(b))
+ self.cashaddr_status_button_hidden_signal.emit(b)
+
+ @property
+ def windows_qt_use_freetype(self):
+ ''' Returns True iff we are windows and we are set to use freetype as
+ the font engine. This will always return false on platforms where the
+ question doesn't apply. This config setting defaults to True for
+ Windows < Win10 and False otherwise. It is only relevant when
+ using the Qt GUI, however. '''
+ if sys.platform not in ('win32', 'cygwin'):
+ return False
+ try:
+ winver = float(platform.win32_ver()[0]) # '7', '8', '8.1', '10', etc
+ except (AttributeError, ValueError, IndexError):
+ # We can get here if cygwin, which has an empty win32_ver tuple
+ # in some cases.
+ # In that case "assume windows 10" and just proceed. Cygwin users
+ # can always manually override this setting from GUI prefs.
+ winver = 10
+ # setting defaults to on for Windows < Win10
+ return bool(self.config.get('windows_qt_use_freetype', winver < 10))
+
+ @windows_qt_use_freetype.setter
+ def windows_qt_use_freetype(self, b):
+ if self.config.is_modifiable('windows_qt_use_freetype') and sys.platform in ('win32', 'cygwin'):
+ self.config.set_key('windows_qt_use_freetype', bool(b))
+
+ @property
+ def linux_qt_use_custom_fontconfig(self):
+ ''' Returns True iff we are Linux and we are set to use the fonts.xml
+ fontconfig override, False otherwise. This config setting defaults to
+ True for all Linux, but only is relevant to Qt GUI. '''
+ return bool(sys.platform in ('linux',) and self.config.get('linux_qt_use_custom_fontconfig', True))
+
+ @linux_qt_use_custom_fontconfig.setter
+ def linux_qt_use_custom_fontconfig(self, b):
+ if self.config.is_modifiable('linux_qt_use_custom_fontconfig') and sys.platform in ('linux',):
+ self.config.set_key('linux_qt_use_custom_fontconfig', bool(b))
+
+
+ def main(self):
+ try:
+ self.init_network()
+ except UserCancelled:
+ return
+ except GoBack:
+ return
+ except BaseException as e:
+ traceback.print_exc(file=sys.stdout)
+ return
+ self.timer.start()
+ self.config.open_last_wallet()
+ path = self.config.get_wallet_path()
+ if not self.start_new_window(path, self.config.get('url')):
+ return
+ signal.signal(signal.SIGINT, lambda signum, frame: self.shutdown_signal.emit())
+
+ self.app.setQuitOnLastWindowClosed(False) # we want to control this in our slot (since we support non-visible, backgrounded windows via the systray show/hide facility)
+ self.app.lastWindowClosed.connect(self._quit_after_last_window)
+
+ def clean_up():
+ # Just in case we get an exception as we exit, uninstall the Exception_Hook
+ Exception_Hook.uninstall()
+ # Shut down the timer cleanly
+ self.timer.stop()
+ self.gc_timer.stop()
+ self._stop_auto_update_timer()
+ # clipboard persistence. see http://www.mail-archive.com/pyqt@riverbankcomputing.com/msg17328.html
+ event = QEvent(QEvent.Clipboard)
+ self.app.sendEvent(self.app.clipboard(), event)
+ self.tray.hide()
+ if self.nd:
+ self.nd.deleteLater()
+ self.nd = None
+ self.app.aboutToQuit.connect(clean_up)
+
+ Exception_Hook(self.config) # This wouldn't work anyway unless the app event loop is active, so we must install it once here and no earlier.
+ # main loop
+ self.app.exec_()
+ # on some platforms the exec_ call may not return, so use clean_up()
diff --git a/electroncash_gui/qt/address_dialog.py b/electroncash_gui/qt/address_dialog.py
new file mode 100644
index 000000000000..e156e777099e
--- /dev/null
+++ b/electroncash_gui/qt/address_dialog.py
@@ -0,0 +1,215 @@
+#!/usr/bin/env python3
+#
+# Electrum - lightweight Bitcoin client
+# Copyright (C) 2012 thomasv@gitorious
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from electroncash.i18n import _
+from electroncash.address import Address
+from electroncash.util import PrintError
+
+from PyQt5.QtCore import *
+from PyQt5.QtGui import *
+from PyQt5.QtWidgets import *
+
+from .util import *
+from .history_list import HistoryList
+from .qrtextedit import ShowQRTextEdit
+from . import cashacctqt
+
+
+class AddressDialog(PrintError, WindowModalDialog):
+
+ MIN_WIDTH_NO_FX_HIST = 700
+ MIN_WIDTH_FX_HIST = MIN_WIDTH_NO_FX_HIST + 75
+
+ def __init__(self, parent, address, *, windowParent=None):
+ assert isinstance(address, Address)
+ windowParent = windowParent or parent
+ WindowModalDialog.__init__(self, windowParent, _("Address"))
+ self.address = address
+ self.parent = parent
+ self.config = parent.config
+ self.wallet = parent.wallet
+ self.app = parent.app
+ self.saved = True
+
+ self.setMinimumWidth(self.MIN_WIDTH_FX_HIST if self.parent.fx and self.parent.fx.show_history() else self.MIN_WIDTH_NO_FX_HIST)
+ vbox = QVBoxLayout()
+ self.setLayout(vbox)
+
+ vbox.addWidget(QLabel(_("Address:")))
+ self.addr_e = ButtonsLineEdit()
+ icon = ":icons/qrcode_white.svg" if ColorScheme.dark_scheme else ":icons/qrcode.svg"
+ self.addr_e.addButton(icon, self.show_qr, _("Show QR Code"))
+ self.addr_e.addCopyButton()
+ self.addr_e.setReadOnly(True)
+ vbox.addWidget(self.addr_e)
+
+ tooltip = _('This is the token-aware version of this address.')
+ lbl = QLabel(_("Token Address:"))
+ lbl.setToolTip(tooltip)
+ vbox.addWidget(lbl)
+ self.tok_addr_e = ButtonsLineEdit()
+ icon = ":icons/qrcode_white.svg" if ColorScheme.dark_scheme else ":icons/qrcode.svg"
+ self.tok_addr_e.addButton(icon, self.show_token_addr_qr, _("Show QR Code"))
+ self.tok_addr_e.addCopyButton()
+ self.tok_addr_e.setReadOnly(True)
+ self.tok_addr_e.setToolTip(tooltip)
+ vbox.addWidget(self.tok_addr_e)
+
+ self.update_addr()
+
+ try:
+ # the below line only works for deterministic wallets, other wallets lack this method
+ pubkeys = self.wallet.get_public_keys(address)
+ except BaseException as e:
+ try:
+ # ok, now try the usual method for imported wallets, etc
+ pubkey = self.wallet.get_public_key(address)
+ pubkeys = [pubkey.to_ui_string()]
+ except:
+ # watching only wallets (totally lacks a private/public key pair for this address)
+ pubkeys = None
+ if pubkeys:
+ vbox.addWidget(QLabel(_("Public keys") + ':'))
+ for pubkey in pubkeys:
+ pubkey_e = ButtonsLineEdit(pubkey)
+ pubkey_e.addCopyButton()
+ vbox.addWidget(pubkey_e)
+
+ try:
+ redeem_script = self.wallet.pubkeys_to_redeem_script(pubkeys)
+ except BaseException as e:
+ redeem_script = None
+ if redeem_script:
+ vbox.addWidget(QLabel(_("Redeem Script") + ':'))
+ redeem_e = ShowQRTextEdit(text=redeem_script)
+ redeem_e.addCopyButton()
+ vbox.addWidget(redeem_e)
+
+ # Cash Accounts
+ ca_infos = self.wallet.cashacct.get_cashaccounts(self.get_domain())
+ vbox.addSpacing(10)
+ self.cashacct_gb = gb = cashacctqt.InfoGroupBox(self, self.parent, show_addresses=False)
+ self.update_cash_accounts(ca_infos)
+ def on_button_click():
+ item = gb.selectedItem()
+ if item:
+ info, ch, mch = item
+ self.wallet.cashacct.set_address_default(info)
+ QToolTip.showText(QCursor.pos(), _("Cash Account has been made the default for this address"), gb)
+ self.parent.ca_address_default_changed_signal.emit(info)
+ gb.buttonGroup().buttonClicked.connect(on_button_click)
+ vbox.addWidget(gb)
+ # /Cash Accounts
+
+ vbox.addWidget(QLabel(_("History")))
+ self.hw = HistoryList(self.parent)
+ self.hw.get_domain = self.get_domain
+ vbox.addWidget(self.hw)
+
+ vbox.addLayout(Buttons(CloseButton(self)))
+ self.format_amount = self.parent.format_amount
+ self.hw.update()
+
+ def _ca_on_address_default_change(self, info):
+ if info.address == self.address:
+ self.update_cash_accounts()
+
+ def connect_signals(self):
+ """Connect slots so the embedded history list gets updated whenever the history changes."""
+ self.parent.gui_object.cashaddr_toggled_signal.connect(self.update_addr)
+ self.parent.history_updated_signal.connect(self.hw.update)
+ self.parent.labels_updated_signal.connect(self.hw.update_labels)
+ self.parent.network_signal.connect(self.got_verified_tx)
+ self.parent.ca_address_default_changed_signal.connect(self._ca_on_address_default_change)
+
+ def disconnect_signals(self):
+ try: self.parent.history_updated_signal.disconnect(self.hw.update)
+ except TypeError: pass
+ try: self.parent.network_signal.disconnect(self.got_verified_tx)
+ except TypeError: pass
+ try: self.parent.gui_object.cashaddr_toggled_signal.disconnect(self.update_addr)
+ except TypeError: pass
+ try: self.parent.labels_updated_signal.disconnect(self.hw.update_labels)
+ except TypeError: pass
+ try: self.parent.ca_address_default_changed_signal.disconnect(self._ca_on_address_default_change)
+ except TypeError: pass
+
+ def got_verified_tx(self, event, args):
+ if event == 'verified2' and args[0] is self.wallet:
+ self.hw.update_item(*args[1:])
+ elif event in ('ca_verified_tx', 'ca_verification_failed') and args[0] == self.wallet.cashacct and args[1].address == self.address:
+ self.update_cash_accounts()
+
+ def update_addr(self):
+ self.addr_e.setText(self.address.to_full_ui_string())
+ self.tok_addr_e.setText(self.address.to_full_token_string())
+
+ def update_cash_accounts(self, ca_infos=None):
+ gb = self.cashacct_gb
+ ca_infos = ca_infos or self.wallet.cashacct.get_cashaccounts(self.get_domain())
+ tups = []
+ for info in ca_infos:
+ tups.append((info, self.wallet.cashacct.get_minimal_chash(info.name, info.number, info.collision_hash)))
+ default = self.wallet.cashacct.get_address_default(ca_infos)
+ saved_tups = getattr(self, '_ca_saved_tups', None)
+ if tups != saved_tups:
+ # setItems is a bit slow so we only do it if things have changed...
+ # also, on macOS, it can sometimes cause a bit of extra UI flicker.
+ gb.setItems(tups)
+ self._ca_saved_tups = tups
+ if tups:
+ gb.checkItemWithInfo(default)
+ if not gb.selectedItem():
+ gb.checkItemWithInfo(ca_infos[-1])
+ gb.setHidden(False)
+ else:
+ gb.setHidden(True)
+
+ def get_domain(self):
+ return [self.address]
+
+ def _show_qr(self, is_token):
+ text = self.address.to_full_ui_string() if not is_token else self.address.to_full_token_string()
+ try:
+ title = _("Address") if not is_token else _("Token Address")
+ self.parent.show_qrcode(text, title, parent=self)
+ except Exception as e:
+ self.show_message(str(e))
+
+ def show_qr(self):
+ self._show_qr(False)
+
+ def show_token_addr_qr(self):
+ self._show_qr(True)
+
+ def exec_(self):
+ """ Overrides super class and does some cleanup after exec """
+ self.connect_signals()
+ retval = super().exec_()
+ self.disconnect_signals()
+ # run GC in 10 ms. Otherwise this window sticks around in memory for way too long
+ import gc
+ QTimer.singleShot(10, lambda: gc.collect())
+ return retval
diff --git a/electroncash_gui/qt/address_list.py b/electroncash_gui/qt/address_list.py
new file mode 100644
index 000000000000..c3f55629e76e
--- /dev/null
+++ b/electroncash_gui/qt/address_list.py
@@ -0,0 +1,491 @@
+#!/usr/bin/env python3
+#
+# Electrum - lightweight Bitcoin client
+# Copyright (C) 2015 Thomas Voegtlin
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from functools import partial
+from collections import defaultdict
+
+from .util import MyTreeWidget, MONOSPACE_FONT, SortableTreeWidgetItem, rate_limited, webopen, ColorScheme
+from PyQt5.QtCore import Qt, pyqtSignal
+from PyQt5.QtGui import QFont, QColor, QKeySequence, QCursor, QIcon
+from PyQt5.QtWidgets import QTreeWidgetItem, QAbstractItemView, QMenu, QToolTip
+from electroncash.i18n import _
+from electroncash.address import Address
+from electroncash.plugins import run_hook
+import electroncash.web as web
+from electroncash.util import profiler
+from electroncash import networks
+from enum import IntEnum
+from . import cashacctqt
+
+class AddressList(MyTreeWidget):
+ filter_columns = [0, 1, 2] # Address, Label, Balance
+
+ _ca_minimal_chash_updated_signal = pyqtSignal(object, str)
+ _cashacct_icon = None
+
+ class DataRoles(IntEnum):
+ address = Qt.UserRole + 0
+ can_edit_label = Qt.UserRole + 1
+ cash_accounts = Qt.UserRole + 2
+
+ def __init__(self, parent, *, picker=False):
+ super().__init__(parent, self.create_menu, [], 2, deferred_updates=True)
+ self.refresh_headers()
+ self.picker = picker
+ if self.picker:
+ self.setSelectionMode(QAbstractItemView.SingleSelection)
+ self.editable_columns = []
+ else:
+ self.setSelectionMode(QAbstractItemView.ExtendedSelection)
+ self.setSortingEnabled(True)
+ self.wallet = self.parent.wallet
+ self.monospace_font = QFont(MONOSPACE_FONT)
+ assert self.wallet
+ self.cleaned_up = False
+
+ # Cash Accounts support
+ self._ca_cb_registered = False
+ self._ca_minimal_chash_updated_signal.connect(self._ca_update_chash)
+
+ self.parent.gui_object.cashaddr_toggled_signal.connect(self.update)
+ self.parent.ca_address_default_changed_signal.connect(self._ca_on_address_default_change)
+
+ if not __class__._cashacct_icon:
+ # lazy init the icon
+ __class__._cashacct_icon = QIcon(":icons/cashacct-logo.png") # TODO: make this an SVG
+
+ def clean_up(self):
+ self.cleaned_up = True
+ if self.wallet.network:
+ self.wallet.network.unregister_callback(self._ca_updated_minimal_chash_callback)
+ self._ca_cb_registered = False
+ # paranoia -- we have seen Qt not clean up the signal before the object is destroyed on Python 3.7.3 PyQt 5.12.3, see #1531
+ try: self.parent.gui_object.cashaddr_toggled_signal.disconnect(self.update)
+ except TypeError: pass
+ try: self.parent.ca_address_default_changed_signal.disconnect(self._ca_on_address_default_change)
+ except TypeError: pass
+
+ def filter(self, p):
+ ''' Reimplementation from superclass filter. Chops off the
+ "bitcoincash:" prefix so that address filters ignore this prefix.
+ Closes #1440. '''
+ cashaddr_prefix = f"{networks.net.CASHADDR_PREFIX}:".lower()
+ p = p.strip()
+ if len(p) > len(cashaddr_prefix) and p.lower().startswith(cashaddr_prefix):
+ p = p[len(cashaddr_prefix):] # chop off prefix
+ super().filter(p) # call super on chopped-off-piece
+
+ def refresh_headers(self):
+ headers = [ _('Address'), _('Index'),_('Label'), _('Balance'), _('Tx')]
+ fx = self.parent.fx
+ if fx and fx.get_fiat_address_config():
+ headers.insert(4, '{} {}'.format(fx.get_currency(), _('Balance')))
+ self.update_headers(headers)
+
+ @rate_limited(1.0, ts_after=True) # We rate limit the address list refresh no more than once every second
+ def update(self):
+ if self.cleaned_up:
+ # short-cut return if window was closed and wallet is stopped
+ return
+ super().update()
+
+ @profiler
+ def on_update(self):
+ def item_path(item): # Recursively builds the path for an item eg 'parent_name/item_name'
+ return item.text(0) if not item.parent() else item_path(item.parent()) + "/" + item.text(0)
+ def remember_expanded_items(root):
+ # Save the set of expanded items... so that address list updates don't annoyingly collapse
+ # our tree list widget due to the update. This function recurses. Pass self.invisibleRootItem().
+ expanded_item_names = set()
+ for i in range(0, root.childCount()):
+ it = root.child(i)
+ if it and it.childCount():
+ if it.isExpanded():
+ expanded_item_names.add(item_path(it))
+ expanded_item_names |= remember_expanded_items(it) # recurse
+ return expanded_item_names
+ def restore_expanded_items(root, expanded_item_names):
+ # Recursively restore the expanded state saved previously. Pass self.invisibleRootItem().
+ for i in range(0, root.childCount()):
+ it = root.child(i)
+ if it and it.childCount():
+ restore_expanded_items(it, expanded_item_names) # recurse, do leaves first
+ old = bool(it.isExpanded())
+ new = bool(item_path(it) in expanded_item_names)
+ if old != new:
+ it.setExpanded(new)
+ if not self._ca_cb_registered and self.wallet.network:
+ self.wallet.network.register_callback(self._ca_updated_minimal_chash_callback, ['ca_updated_minimal_chash'])
+ self._ca_cb_registered = True
+ had_item_count = self.topLevelItemCount()
+ sels = self.selectedItems()
+ addresses_to_re_select = {item.data(0, self.DataRoles.address) for item in sels}
+ expanded_item_names = remember_expanded_items(self.invisibleRootItem())
+ del sels # avoid keeping reference to about-to-be delete C++ objects
+ self.clear()
+ # Note we take a shallow list-copy because we want to avoid
+ # race conditions with the wallet while iterating here. The wallet may
+ # touch/grow the returned lists at any time if a history comes (it
+ # basically returns a reference to its own internal lists). The wallet
+ # may then, in another thread such as the Synchronizer thread, grow
+ # the receiving or change addresses on Deterministic wallets. While
+ # probably safe in a language like Python -- and especially since
+ # the lists only grow at the end, we want to avoid bad habits.
+ # The performance cost of the shallow copy below is negligible for 10k+
+ # addresses even on huge wallets because, I suspect, internally CPython
+ # does this type of operation extremely cheaply (probably returning
+ # some copy-on-write-semantics handle to the same list).
+ receiving_addresses = list(self.wallet.get_receiving_addresses())
+ change_addresses = list(self.wallet.get_change_addresses())
+
+ if self.parent.fx and self.parent.fx.get_fiat_address_config():
+ fx = self.parent.fx
+ else:
+ fx = None
+ account_item = self
+ sequences = [0,1] if change_addresses else [0]
+ items_to_re_select = []
+ for is_change in sequences:
+ if len(sequences) > 1:
+ name = _("Receiving") if not is_change else _("Change")
+ seq_item = QTreeWidgetItem( [ name, '', '', '', '', ''] )
+ account_item.addChild(seq_item)
+ if not had_item_count: # first time we create this widget, auto-expand the default address list
+ seq_item.setExpanded(True)
+ expanded_item_names.add(item_path(seq_item))
+ else:
+ seq_item = account_item
+ hidden_item = QTreeWidgetItem( [ _("Empty") if is_change else _("Used"), '', '', '', '', ''] )
+ has_hidden = False
+ addr_list = change_addresses if is_change else receiving_addresses
+ # Cash Account support - we do this here with the already-prepared addr_list for performance reasons
+ ca_list_all = self.wallet.cashacct.get_cashaccounts(addr_list)
+ ca_by_addr = defaultdict(list)
+ for info in ca_list_all:
+ ca_by_addr[info.address].append(info)
+ del ca_list_all
+ # / cash account
+ for n, address in enumerate(addr_list):
+ num = len(self.wallet.get_address_history(address))
+ if is_change:
+ is_hidden = self.wallet.is_empty(address)
+ else:
+ is_hidden = self.wallet.is_used(address)
+ balance = sum(self.wallet.get_addr_balance(address))
+ address_text = address.to_ui_string()
+ # Cash Accounts
+ ca_info, ca_list = None, ca_by_addr.get(address)
+ if ca_list:
+ # Add Cash Account emoji -- the emoji used is the most
+ # recent cash account registration for said address
+ ca_list.sort(key=lambda x: ((x.number or 0), str(x.collision_hash)))
+ for ca in ca_list:
+ # grab minimal_chash and stash in an attribute. this may kick off the network
+ ca.minimal_chash = self.wallet.cashacct.get_minimal_chash(ca.name, ca.number, ca.collision_hash)
+ ca_info = self._ca_get_default(ca_list)
+ if ca_info:
+ address_text = ca_info.emoji + " " + address_text
+ # /Cash Accounts
+ label = self.wallet.labels.get(address.to_storage_string(), '')
+ balance_text = self.parent.format_amount(balance, whitespaces=True)
+ columns = [address_text, str(n), label, balance_text, str(num)]
+ if fx:
+ rate = fx.exchange_rate()
+ fiat_balance = fx.value_str(balance, rate)
+ columns.insert(4, fiat_balance)
+ address_item = SortableTreeWidgetItem(columns)
+ if ca_info:
+ # Set Cash Accounts: tool tip.. this will read the minimal_chash attribute we added to this object above
+ self._ca_set_item_tooltip(address_item, ca_info)
+ address_item.setTextAlignment(3, Qt.AlignRight | Qt.AlignVCenter)
+ address_item.setFont(3, self.monospace_font)
+ if fx:
+ address_item.setTextAlignment(4, Qt.AlignRight | Qt.AlignVCenter)
+ address_item.setFont(4, self.monospace_font)
+
+ # Set col0 address font to monospace
+ address_item.setFont(0, self.monospace_font)
+
+ # Set UserRole data items:
+ address_item.setData(0, self.DataRoles.address, address)
+ address_item.setData(0, self.DataRoles.can_edit_label, True) # label can be edited
+ if ca_list:
+ # Save the list of cashacct infos, if any
+ address_item.setData(0, self.DataRoles.cash_accounts, ca_list)
+
+ if self.wallet.is_frozen(address):
+ address_item.setBackground(0, ColorScheme.BLUE.as_color(True))
+ address_item.setToolTip(0, _("Address is frozen, right-click to unfreeze"))
+ if self.wallet.is_beyond_limit(address, is_change):
+ address_item.setBackground(0, ColorScheme.RED.as_color(True))
+ if is_change and self.wallet.is_retired_change_addr(address):
+ address_item.setForeground(0, ColorScheme.GRAY.as_color())
+ old_tt = address_item.toolTip(0)
+ if old_tt:
+ old_tt += "\n"
+ address_item.setToolTip(0, old_tt + _("Change address is retired"))
+ if is_hidden:
+ if not has_hidden:
+ seq_item.insertChild(0, hidden_item)
+ has_hidden = True
+ hidden_item.addChild(address_item)
+ else:
+ seq_item.addChild(address_item)
+ if address in addresses_to_re_select:
+ items_to_re_select.append(address_item)
+
+ for item in items_to_re_select:
+ # NB: Need to select the item at the end becasue internally Qt does some index magic
+ # to pick out the selected item and the above code mutates the TreeList, invalidating indices
+ # and other craziness, which might produce UI glitches. See #1042
+ item.setSelected(True)
+
+ # Now, at the very end, enforce previous UI state with respect to what was expanded or not. See #1042
+ restore_expanded_items(self.invisibleRootItem(), expanded_item_names)
+
+
+ def create_menu(self, position):
+ if self.picker:
+ # picker mode has no menu
+ return
+ from electroncash.wallet import Multisig_Wallet
+ is_multisig = isinstance(self.wallet, Multisig_Wallet)
+ can_delete = self.wallet.can_delete_address()
+ selected = self.selectedItems()
+ multi_select = len(selected) > 1
+ addrs = [item.data(0, self.DataRoles.address) for item in selected]
+ if not addrs:
+ return
+ addrs = [addr for addr in addrs if isinstance(addr, Address)]
+
+ menu = QMenu()
+
+ where_to_insert_dupe_copy_cash_account = None
+
+ def doCopy(txt):
+ txt = txt.strip()
+ self.parent.copy_to_clipboard(txt)
+
+ col = self.currentColumn()
+ column_title = self.headerItem().text(col)
+
+ if not multi_select:
+ item = self.itemAt(position)
+ if not item:
+ return
+ if not addrs:
+ item.setExpanded(not item.isExpanded())
+ return
+ addr = addrs[0]
+
+ alt_copy_text, alt_column_title, token_text = None, None, None
+ if col == 0:
+ copy_text = addr.to_full_ui_string()
+ if Address.FMT_UI == Address.FMT_LEGACY:
+ alt_copy_text, alt_column_title = addr.to_full_string(Address.FMT_CASHADDR), _('Cash Address')
+ else:
+ alt_copy_text, alt_column_title = addr.to_full_string(Address.FMT_LEGACY), _('Legacy Address')
+ token_text = addr.to_full_token_string()
+ if token_text in (copy_text, alt_copy_text):
+ token_text = None
+ else:
+ copy_text = item.text(col)
+ menu.addAction(_("Copy {}").format(column_title), lambda: doCopy(copy_text))
+ if alt_copy_text and alt_column_title:
+ # Add 'Copy Legacy Address' and 'Copy Cash Address' alternates if right-click is on column 0
+ menu.addAction(_("Copy {}").format(alt_column_title), lambda: doCopy(alt_copy_text))
+ if token_text:
+ menu.addAction(_("Copy {}").format(_("Token Address")), lambda: doCopy(token_text))
+ a = menu.addAction(_('Details') + "...", lambda: self.parent.show_address(addr))
+ if col == 0:
+ where_to_insert_dupe_copy_cash_account = a
+ if col in self.editable_columns:
+ menu.addAction(_("Edit {}").format(column_title), lambda: self.editItem(self.itemAt(position), # NB: C++ item may go away if this widget is refreshed while menu is up -- so need to re-grab and not store in lamba. See #953
+ col))
+ a = menu.addAction(_("Request payment"), lambda: self.parent.receive_at(addr))
+ if self.wallet.get_num_tx(addr) or self.wallet.has_payment_request(addr):
+ # This address cannot be used for a payment request because
+ # the receive tab will refuse to display it and will instead
+ # create a request with a new address, if we were to call
+ # self.parent.receive_at(addr). This is because the recieve tab
+ # now strongly enforces no-address-reuse. See #1552.
+ a.setDisabled(True)
+ if self.wallet.can_export():
+ menu.addAction(_("Private key"), lambda: self.parent.show_private_key(addr))
+ if not is_multisig and not self.wallet.is_watching_only():
+ menu.addAction(_("Sign/verify message") + "...", lambda: self.parent.sign_verify_message(addr))
+ menu.addAction(_("Encrypt/decrypt message") + "...", lambda: self.parent.encrypt_message(addr))
+ if can_delete:
+ menu.addAction(_("Remove from wallet"), lambda: self.parent.remove_address(addr))
+ addr_URL = web.BE_URL(self.config, 'addr', addr)
+ if addr_URL:
+ menu.addAction(_("View on block explorer"), lambda: webopen(addr_URL))
+ else:
+ # multi-select
+ if col > -1:
+ texts, alt_copy, alt_copy_text = None, None, None
+ if col == 0: # address column
+ texts = [a.to_ui_string() for a in addrs]
+ # Add additional copy option: "Address, Balance (n)"
+ alt_copy = _("Copy {}").format(_("Address") + ", " + _("Balance")) + f" ({len(addrs)})"
+ alt_copy_text = "\n".join([a.to_ui_string() + ", " + self.parent.format_amount(sum(self.wallet.get_addr_balance(a)))
+ for a in addrs])
+ else:
+ texts = [i.text(col).strip() for i in selected]
+ texts = [t for t in texts if t] # omit empty items
+ if texts:
+ copy_text = '\n'.join(texts)
+ menu.addAction(_("Copy {}").format(column_title) + f" ({len(texts)})", lambda: doCopy(copy_text))
+ if alt_copy and alt_copy_text:
+ menu.addAction(alt_copy, lambda: doCopy(alt_copy_text))
+
+ freeze = self.parent.set_frozen_state
+ if any(self.wallet.is_frozen(addr) for addr in addrs):
+ menu.addAction(_("Unfreeze"), partial(freeze, addrs, False))
+ if not all(self.wallet.is_frozen(addr) for addr in addrs):
+ menu.addAction(_("Freeze"), partial(freeze, addrs, True))
+
+ coins = self.wallet.get_spendable_coins(domain = addrs, config = self.config)
+ if coins:
+ menu.addAction(_("Spend from"),
+ partial(self.parent.spend_coins, coins))
+
+ run_hook('address_list_context_menu_setup', self, menu, addrs)
+
+ # Add Cash Accounts section at the end, if relevant
+ if not multi_select:
+ ca_list = item.data(0, self.DataRoles.cash_accounts)
+ menu.addSeparator()
+ a1 = menu.addAction(_("Cash Accounts"), lambda: None)
+ a1.setDisabled(True)
+ if ca_list:
+ ca_default = self._ca_get_default(ca_list)
+ for ca_info in ca_list:
+ ca_text = self.wallet.cashacct.fmt_info(ca_info, ca_info.minimal_chash)
+ ca_text_em = self.wallet.cashacct.fmt_info(ca_info, ca_info.minimal_chash, emoji=True)
+ m = menu.addMenu(ca_info.emoji + " " + ca_text)
+ a_ca_copy = m.addAction(_("Copy Cash Account"), lambda x=None, text=ca_text_em: doCopy(text))
+ a = m.addAction(_("Details") + "...", lambda x=None,ca_text=ca_text: cashacctqt.cash_account_detail_dialog(self.parent, ca_text))
+ a = m.addAction(_("View registration tx") + "...", lambda x=None, ca=ca_info: self.parent.do_process_from_txid(txid=ca.txid))
+ a = a_def = m.addAction(_("Make default for address"), lambda x=None, ca=ca_info: self._ca_set_default(ca, True))
+ if ca_info == ca_default:
+ if where_to_insert_dupe_copy_cash_account and a_ca_copy:
+ # insert a dupe of "Copy Cash Account" for the default cash account for this address in the top-level menu
+ menu.insertAction(where_to_insert_dupe_copy_cash_account, a_ca_copy)
+ m.setTitle(m.title() + " " + "★")
+ a_def.setDisabled(True)
+ a_def.setCheckable(True)
+ a_def.setChecked(True)
+ a_def.setText(_("Is default for address"))
+ else:
+ a1.setText(_("No Cash Accounts"))
+ a_new = menu.addAction(_("Register new..."), lambda x=None, addr=addr: self.parent.register_new_cash_account(addr))
+ a_new.setIcon(__class__._cashacct_icon)
+
+
+ run_hook('receive_menu', menu, addrs, self.wallet)
+ menu.exec_(self.viewport().mapToGlobal(position))
+
+ def keyPressEvent(self, event):
+ if event.matches(QKeySequence.Copy) and self.currentColumn() == 0:
+ addrs = [i.data(0, self.DataRoles.address) for i in self.selectedItems()]
+ if addrs and isinstance(addrs[0], Address):
+ text = addrs[0].to_full_ui_string()
+ self.parent.app.clipboard().setText(text)
+ else:
+ super().keyPressEvent(event)
+
+ def update_labels(self):
+ if self.should_defer_update_incr():
+ return
+ def update_recurse(root):
+ child_count = root.childCount()
+ for i in range(child_count):
+ item = root.child(i)
+ addr = item.data(0, self.DataRoles.address)
+ if isinstance(addr, Address):
+ label = self.wallet.labels.get(addr.to_storage_string(), '')
+ item.setText(2, label)
+ if item.childCount():
+ update_recurse(item)
+ update_recurse(self.invisibleRootItem())
+
+ def on_doubleclick(self, item, column):
+ if self.permit_edit(item, column):
+ super(AddressList, self).on_doubleclick(item, column)
+ else:
+ addr = item.data(0, self.DataRoles.address)
+ if isinstance(addr, Address):
+ self.parent.show_address(addr)
+
+ #########################
+ # Cash Accounts related #
+ #########################
+ def _ca_set_item_tooltip(self, item, ca_info):
+ minimal_chash = getattr(ca_info, 'minimal_chash', None)
+ info_str = self.wallet.cashacct.fmt_info(ca_info, minimal_chash)
+ item.setToolTip(0, "" + _("Cash Account:") + " "
+ + f"{info_str}")
+
+ def _ca_update_chash(self, ca_info, minimal_chash):
+ ''' Called in GUI thread as a result of the cash account subsystem
+ figuring out that a collision_hash can be represented shorter.
+ Kicked off by a get_minimal_chash() call that results in a cache miss. '''
+ if self.cleaned_up:
+ return
+ items = self.findItems(ca_info.address.to_ui_string(), Qt.MatchContains|Qt.MatchWrap|Qt.MatchRecursive, 0) or []
+ for item in items: # really items should contain just 1 element...
+ ca_list = item.data(0, self.DataRoles.cash_accounts) or []
+ ca_info_default = self._ca_get_default(ca_list)
+ for ca_info_saved in ca_list:
+ if ( (ca_info_saved.name.lower(), ca_info_saved.number, ca_info_saved.collision_hash)
+ == (ca_info.name.lower(), ca_info.number, ca_info.collision_hash) ):
+ ca_info_saved.minimal_chash = minimal_chash # save minimal_chash as a property
+ if ca_info_saved == ca_info_default:
+ # this was the default one, also set the tooltip
+ self._ca_set_item_tooltip(item, ca_info)
+
+ def _ca_updated_minimal_chash_callback(self, event, *args):
+ ''' Called from the cash accounts minimal_chash thread after a network
+ round-trip determined that the minimal collision hash can be shorter.'''
+ if (event == 'ca_updated_minimal_chash'
+ and not self.cleaned_up
+ and args[0] is self.wallet.cashacct):
+ self._ca_minimal_chash_updated_signal.emit(args[1], args[2])
+
+ def _ca_get_default(self, ca_list):
+ ''' Alias for self.wallet.cashacct.get_address_default '''
+ return self.wallet.cashacct.get_address_default(ca_list)
+
+ def _ca_set_default(self, ca_info, show_tip = False):
+ ''' Similar to self.wallet.cashacct.set_address_default, but also
+ shows a tooltip optionally, and updates self. '''
+ self.wallet.cashacct.set_address_default(ca_info)
+ if show_tip:
+ QToolTip.showText(QCursor.pos(), _("Cash Account has been made the default for this address"), self)
+ self.parent.ca_address_default_changed_signal.emit(ca_info) # eventually calls self.update
+
+ def _ca_on_address_default_change(self, ignored):
+ self.update()
diff --git a/gui/qt/amountedit.py b/electroncash_gui/qt/amountedit.py
similarity index 86%
rename from gui/qt/amountedit.py
rename to electroncash_gui/qt/amountedit.py
index fdb647cd8392..53e084ac784f 100644
--- a/gui/qt/amountedit.py
+++ b/electroncash_gui/qt/amountedit.py
@@ -5,8 +5,8 @@
from PyQt5.QtWidgets import (QLineEdit, QStyle, QStyleOptionFrame)
from decimal import Decimal as PyDecimal # Qt 5.12 also exports Decimal
-from electroncash.util import format_satoshis_plain
-
+from electroncash.util import format_satoshis_plain, inv_base_units
+from .util import ColorScheme
class MyLineEdit(QLineEdit):
frozen = pyqtSignal()
@@ -27,7 +27,6 @@ def __init__(self, base_unit, is_int = False, parent=None):
self.textChanged.connect(self.numbify)
self.is_int = is_int
self.is_shortcut = False
- self.help_palette = QPalette()
def decimal_point(self):
return 8
@@ -60,7 +59,7 @@ def paintEvent(self, event):
textRect = self.style().subElementRect(QStyle.SE_LineEditContents, panel, self)
textRect.adjust(2, 0, -10, 0)
painter = QPainter(self)
- painter.setPen(self.help_palette.brush(QPalette.Disabled, QPalette.Text).color())
+ painter.setPen(ColorScheme.GRAY.as_color()) # NB: we hard-code gray here. It works ok for dark and light. FIXME: figure out why palette broke on Mojave dark mode see #1262
painter.drawText(textRect, Qt.AlignRight | Qt.AlignVCenter, self.base_unit())
def get_amount(self):
@@ -78,13 +77,8 @@ def __init__(self, decimal_point, is_int = False, parent=None):
def _base_unit(self):
p = self.decimal_point()
- assert p in [2, 5, 8]
- if p == 8:
- return 'BCH'
- if p == 5:
- return 'mBCH'
- if p == 2:
- return 'cash'
+ if p in inv_base_units:
+ return inv_base_units[p]
raise Exception('Unknown base unit')
def get_amount(self):
@@ -97,7 +91,7 @@ def get_amount(self):
def setAmount(self, amount):
if amount is None:
- self.setText(" ") # Space forces repaint in case units changed
+ self.setText(" ") # Space forces repaint in case units changed
else:
self.setText(format_satoshis_plain(amount, self.decimal_point()))
@@ -115,9 +109,9 @@ def get_amount(self):
x = float(PyDecimal(str(self.text())))
except:
return None
- return x if x > 0.0 else None
+ return x if x > 0.0 else None
def setAmount(self, amount):
if amount is None:
- self.setText(" ") # Space forces repaint in case units changed
+ self.setText(" ") # Space forces repaint in case units changed
else:
self.setText(str(round(amount*100.0)/100.0))
diff --git a/electroncash_gui/qt/bip38_importer.py b/electroncash_gui/qt/bip38_importer.py
new file mode 100644
index 000000000000..1fd38f5c32e7
--- /dev/null
+++ b/electroncash_gui/qt/bip38_importer.py
@@ -0,0 +1,252 @@
+# -*- mode: python3 -*-
+# Electron Cash - (C) 2019 The Electron Cash Developers and Electron Cash LLC
+#
+import threading
+
+from PyQt5.QtCore import *
+from PyQt5.QtGui import *
+from PyQt5.QtWidgets import *
+
+from .util import *
+
+from electroncash.i18n import _
+from electroncash import util, bitcoin, address
+
+class Bip38Importer(WindowModalDialog, util.PrintError):
+ ''' A drop-in GUI element for implementing a BIP38 import dialog.
+ For each of the passed-in bip38 keys, it will prompt the user to enter their
+ password and it will attempt to decrypt the keys.
+ Requires bitcoin.is_bip38_available() == True otherwise will raise
+ RuntimeError on instantiation. '''
+
+ decrypted_sig = pyqtSignal(object, object) # Decrypt thread emits this with _decrypt_thread.self, (decrypted_wif, Address) or _decrypt_thread.self, () on failure due to bad password
+
+ def __init__(self, bip38_keys, *,
+ parent=None, title=None,
+ message=None, # The message to display as a label up top
+ show_count=True, # If false, don't show 'Key 1/n:' in UI instead just say: 'Key: '
+ on_success=None, # Callback will be called with a dict of bip38key -> (decoded_wif_str, Address) objects
+ on_cancel=None): # Callback will be called if user hits cancel
+ ''' bip38_keys should be a list of '6P' strings, representing bip38
+ keys. The user will be prompted for each key to enter a password
+ and will be shown the decoded address and WIF key. Note that this
+ method will raise RuntimeError if not bitcion.is_bip38_available().
+
+ on_success: if specified, will be called after the window has closed
+ (exec_ has finished) with a single argument: a dict of
+ bip38key -> (decoded_wif, Address).
+ on_cancel: if specified, will be called after the window was closed
+ (exec_ has finished) with no arguments.
+
+ If you don't specify any callbacks, results are still available in
+ the self.decoded_keys dict.
+
+ The dialog will always terminate with either all keys successfully
+ decrypted or a user cancel.
+ '''
+ if not title:
+ title = 'Electron Cash - ' + _('BIP38 Import')
+ WindowModalDialog.__init__(self, parent=parent, title=title)
+ if not bitcoin.is_bip38_available():
+ raise RuntimeError('Bip38Importer: bip38 decoding is not available')
+ self.bip38_keys = tuple(bip38_keys)
+ assert self.bip38_keys and all(bitcoin.is_bip38_key(k) for k in self.bip38_keys)
+ if not parent:
+ self.setWindowModality(Qt.ApplicationModal)
+
+ self.decoded_keys = dict() # results are placed here on success
+ self.success_cb, self.cancel_cb = on_success, on_cancel
+ self.cur, self.decoded_wif, self.decoded_address = 0, None, None
+ self.decrypter = None
+ self.show_count = show_count
+
+ self.decrypted_sig.connect(self.on_decrypted)
+
+ self._setup_ui(message)
+
+ util.finalization_print_error(self)
+
+ def _setup_ui(self, message=None):
+ num = len(self.bip38_keys)
+ if message is None:
+ message = _('{} BIP38 keys were detected and require a password to decode').format(num)
+ grid = QGridLayout(self)
+ grid.setContentsMargins(24,24,24,24)
+ grid.setSpacing(10)
+ top_title = QLabel('{} - {}'
+ .format(_('BIP38 Import'), message), self)
+ top_title.setWordWrap(True)
+
+ grid.addWidget(top_title, 0, 0, 1, 2)
+
+ self.key_tit = QLabel(' ', self)
+ self.key_lbl = QLabel(' ', self)
+ f = self.key_lbl.font()
+ f.setBold(True); f.setFamily(MONOSPACE_FONT)
+ self.key_lbl.setFont(f)
+ self.key_lbl.setTextInteractionFlags(Qt.TextSelectableByMouse|Qt.TextSelectableByKeyboard)
+
+ grid.addWidget(self.key_tit, 1, 0)
+ grid.addWidget(self.key_lbl, 1, 1)
+
+ pw_tit = HelpLabel(_('Password:'),
+ _('BIP38 keys are strongly encrypted with a password. To decode this key, please specify the password you used when creating the key.'))
+ self.pw_le = QLineEdit()
+ self.pw_le.setEchoMode(QLineEdit.Password)
+
+ timer = QTimer(self)
+ timer.setSingleShot(True)
+
+ def start_decrypter():
+ if not self.isVisible():
+ return
+ # starts a new thread. note that the old thread is not cancelled and just allowed to run until completion, with its results ignored
+ pw = self.pw_le.text()
+ self.decoded_address, self.decoded_wif = ('decrypting', 'decrypting') if pw else (None, None)
+ b38key = self.bip38_keys[self.cur]
+ self.decoded_keys.pop(b38key, None)
+ self.refresh()
+ if pw:
+ self.decrypter = _decrypt_thread(self, b38key, self.pw_le.text()) # starts a new thread
+ else:
+ self.decrypter = None
+
+ def on_edit():
+ self.ok.setDisabled(True) # Disable the Next/Ok button right away
+ self.decrypter = None # Indicate the current decryptor is totally defunct (its results will now be ignored)
+ # re-start the timer to fire in 500 ms. this way there is some
+ # delay before we start another decrypter thread, in case the user
+ # wants to type more characters
+ timer.start(500)
+
+ timer.timeout.connect(start_decrypter)
+ self.pw_le.textEdited.connect(on_edit)
+
+ grid.addWidget(pw_tit, 2, 0)
+ grid.addWidget(self.pw_le, 2, 1)
+
+ hlp = _('The decrypted private key (WIF key) originally used to create this BIP38 key.')
+ wif_tit = HelpLabel(_('Decrypted Private Key:'), hlp)
+ self.wif_lbl = QLabel(' ', self)
+ self.wif_lbl.setTextInteractionFlags(Qt.TextSelectableByMouse|Qt.TextSelectableByKeyboard)
+
+ grid.addWidget(wif_tit, 3, 0)
+ grid.addWidget(self.wif_lbl, 3, 1)
+
+ hlp = _('The address for the decrypted private key.')
+ adr_tit = HelpLabel(_('Address:'), hlp)
+ self.adr_lbl = QLabel(' ', self)
+ self.adr_lbl.setTextInteractionFlags(Qt.TextSelectableByMouse|Qt.TextSelectableByKeyboard)
+
+ grid.addWidget(adr_tit, 4, 0)
+ grid.addWidget(self.adr_lbl, 4, 1)
+
+ self.ok = OkButton(self)
+ cancel = CancelButton(self)
+
+ buttons = Buttons(cancel, self.ok)
+
+ grid.addLayout(buttons, 5, 0, 1, 2)
+
+ self.setLayout(grid)
+
+ self.clear()
+ self.refresh()
+
+ def showEvent(self, e):
+ super().showEvent(e)
+ if e.isAccepted():
+ self.cur = 0
+ self.clear()
+ self.refresh()
+
+ def clear(self):
+ self.pw_le.setText('')
+ self.decrypter = None
+ self.decoded_address, self.decoded_wif = None, None
+
+ def refresh(self):
+ num = len(self.bip38_keys)
+ cur = self.cur
+ self.key_tit.setText(_('Encrypted Key') + ( (' ' + _('({} of {}):').format(cur+1, num)) if self.show_count else ':') )
+ self.key_lbl.setText(self.bip38_keys[cur])
+
+ pw_req = _('(password required)') if self.decoded_wif != 'decrypting' else _('decrypting...')
+ is_ok = bool(self.decoded_wif and self.decoded_wif not in ('bad', 'decrypting'))
+ bad_txt = pw_req if not self.decoded_wif or self.decoded_wif != 'bad' else '{}'.format(ColorScheme.RED._get_color(False), _('password incorrect'))
+ # set wif_lbl font
+ f = self.wif_lbl.font(); f.setFamily(MONOSPACE_FONT if is_ok else QFont().family()); f.setItalic(not is_ok); self.wif_lbl.setFont(f)
+ self.wif_lbl.setText((is_ok and self.decoded_wif) or bad_txt)
+ # set adr_lbl font
+ f = self.adr_lbl.font(); f.setFamily(MONOSPACE_FONT if is_ok else QFont().family()); f.setItalic(not is_ok); self.adr_lbl.setFont(f)
+ self.adr_lbl.setText((is_ok and self.decoded_address.to_ui_string()) or bad_txt)
+
+ self.ok.setEnabled(isinstance(self.decoded_address, address.Address))
+ self.ok.setText(_('OK') if cur+1 == num else _("Next"))
+
+ def accept(self):
+ ''' Overrides QDialog.accept '''
+ num = len(self.bip38_keys)
+ self.cur += 1
+ if self.cur == num:
+ if set(self.bip38_keys) != set(self.decoded_keys.keys()):
+ raise RuntimeError("Dialog finished but something's wrong -- not all passed-in keys are in the decoded keys dict. FIXME!")
+ self.decrypter = None # just in case a decrypter was running
+ super().accept()
+ if self.success_cb:
+ # we call the callback after we are definitely off-screen
+ QTimer.singleShot(250, lambda: self.success_cb(self.decoded_keys.copy()))
+ else:
+ self.clear()
+ self.refresh()
+
+ def reject(self):
+ ''' Overrides QDialog.reject '''
+ super().reject()
+ self.decrypter = None # just in case a decrypter was running
+ self.decoded_keys.clear() # indicate to caller it was cancelled.
+ if self.cancel_cb:
+ # we call the callback after we are definitely off-screen
+ QTimer.singleShot(250, lambda: self.cancel_cb())
+
+ def on_decrypted(self, sender, tup):
+ if sender is not self.decrypter or not self.isVisible():
+ # ignore sender if it's not the currently-active decrypter or if we're already done
+ return
+ b38key = sender.key
+ if b38key != self.bip38_keys[self.cur]:
+ self.print_error("Warning: Got a result from decrypter but decrypter.key != self.cur. FIXME!")
+ return
+ if tup:
+ wif, adr = tup
+ self.decoded_keys[b38key] = (wif, adr)
+ self.decoded_wif = wif
+ self.decoded_address = adr
+ else:
+ self.decoded_keys.pop(b38key, None)
+ self.decoded_wif = 'bad'
+ self.decoded_address = 'bad'
+ self.refresh()
+
+class _decrypt_thread(threading.Thread, util.PrintError):
+ ''' Helper for the above Bip38Importer class. Does the computationally
+ expensive scrypt-based decode of a bip38 key in another thread in order to
+ keep the GUI responsive. Note that we create a new one of these each time
+ the user edits the password text edit, and the old ones continue to run
+ until they complete, at which point they emit the decrypted_sig. Only
+ the most recent decrypt_thread's results are accepted by the dialog, however.'''
+
+ def __init__(self, w, key, pw):
+ super().__init__(daemon=True, target=self.decrypt)
+ self.w = util.Weak.ref(w) # We keep a weak ref to parent because parent may die while we are still running. In which case we don't want to call into parent when it's already closed/done executing
+ self.key = key
+ self.pw = pw
+ self.start()
+
+ def decrypt(self):
+ result = bitcoin.bip38_decrypt(self.key, self.pw) # Potentially slow-ish operation. Note: result may be None or empty; client code's slot checks for that condition, so no need to check result here.
+ parent = self.w() # grab strong ref from weak ref if weak ref still alive
+ if parent:
+ parent.decrypted_sig.emit(self, result)
+ else:
+ self.print_error("parent widget was no longer alive, silently ignoring...")
diff --git a/electroncash_gui/qt/cashacctqt.py b/electroncash_gui/qt/cashacctqt.py
new file mode 100644
index 000000000000..9a4303ed77f8
--- /dev/null
+++ b/electroncash_gui/qt/cashacctqt.py
@@ -0,0 +1,940 @@
+##!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Electron Cash - A Bitcoin Cash SPV Wallet
+# This file Copyright (c) 2019 Calin Culianu
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+'''
+Cash Accounts related classes and functions - Qt UI related.
+'''
+
+# TODO: whittle these * imports down to what we actually use
+from PyQt5.QtCore import *
+from PyQt5.QtGui import *
+from PyQt5.QtWidgets import *
+from .util import *
+from .qrcodewidget import QRCodeWidget
+
+import queue
+import time
+import requests
+from typing import Tuple, List, Callable
+from enum import IntEnum
+from electroncash import cashacct
+from electroncash import util
+from electroncash import web
+from electroncash.address import Address, UnknownAddress
+from electroncash.i18n import _, ngettext
+from electroncash.wallet import Abstract_Wallet
+
+
+class VerifyingDialog(WaitingDialog):
+
+ def __init__(self, parent, message, task, on_success=None, on_error=None, auto_cleanup=True,
+ *, auto_show=True, auto_exec=False, title=None, disable_escape_key=False):
+ super().__init__(parent, message, task, on_success=on_success,
+ on_error=on_error, auto_cleanup=auto_cleanup,
+ auto_show=False, auto_exec=False,
+ title=title or _('Verifying Cash Account'),
+ disable_escape_key=disable_escape_key)
+ hbox = QHBoxLayout()
+ self._vbox.removeWidget(self._label)
+ icon_lbl = QLabel()
+ icon_lbl.setPixmap(QIcon(":icons/cashacct-logo.png").pixmap(50))
+ hbox.addWidget(icon_lbl)
+ hbox.addWidget(self._label)
+ self._vbox.addLayout(hbox)
+ prog = QProgressBar()
+ prog.setRange(0,0)
+ self._vbox.addWidget(prog)
+ if auto_show and not auto_exec:
+ self.open()
+ elif auto_exec:
+ self.exec_()
+ destroyed_print_error(self)
+
+
+def verify_multiple_blocks(blocks : List[int], parent : MessageBoxMixin, wallet : Abstract_Wallet, timeout=10.0) -> int:
+ ''' Pass a list of blocks and will attempt to verify them all in 1 pass.
+ This is used by the Contacts tab to verify unverified Cash Accounts that
+ may have been imported. Returns the number of successfully verified blocks
+ or None on user cancel. '''
+ if not len(blocks):
+ return 0
+ blocks = set(blocks)
+ nblocks = len(blocks)
+ q = queue.Queue()
+ def done_cb(thing):
+ if isinstance(thing, cashacct.ProcessedBlock) and thing.reg_txs:
+ q.put(thing)
+ else:
+ q.put(None)
+ ctr = 0
+ def thread_func():
+ nonlocal ctr
+ for number in blocks:
+ wallet.cashacct.verify_block_asynch(number, success_cb=done_cb, error_cb=done_cb, timeout=timeout)
+ errs = 0
+ while ctr + errs < nblocks:
+ try:
+ thing = q.get(timeout=timeout)
+ if thing is None:
+ errs += 1
+ else:
+ ctr += 1
+ except queue.Empty:
+ return
+ code = VerifyingDialog(parent.top_level_window(),
+ ngettext("Verifying {count} block please wait ...",
+ "Verifying {count} blocks please wait ...", nblocks).format(count=nblocks),
+ thread_func, auto_show=False, on_error=lambda e: parent.show_error(str(e))).exec_()
+ if code != QDialog.Accepted:
+ return None
+ return ctr
+
+
+def resolve_cashacct(parent : MessageBoxMixin, name : str, wallet : Abstract_Wallet = None) -> Tuple[cashacct.Info, str]:
+ ''' Throws up a WaitingDialog while it resolves a Cash Account.
+
+ Goes out to network, verifies all tx's.
+
+ Returns: a tuple of: (Info, Minimally_Encoded_Formatted_AccountName)
+
+ Argument `name` should be a Cash Account name string of the form:
+
+ name#number.123
+ name#number
+ name#number.; etc
+
+ If the result would be ambigious, that is considered an error, so enough
+ of the account name#number.collision_hash needs to be specified to
+ unambiguously resolve the Cash Account.
+
+ On failure throws up an error window and returns None.'''
+ from .main_window import ElectrumWindow
+ if isinstance(parent, ElectrumWindow) and not wallet:
+ wallet = parent.wallet
+ assert isinstance(wallet, Abstract_Wallet)
+ class Bad(Exception): pass
+ try:
+ if not wallet.network or not wallet.network.interface:
+ raise Bad(_("Cannot verify Cash Account as the network appears to be offline."))
+ ca_tup = wallet.cashacct.parse_string(name)
+ if not ca_tup:
+ raise Bad(_("Invalid Cash Account name specified: {name}").format(name=name))
+ results = None
+ def resolve_verify():
+ nonlocal results
+ results = wallet.cashacct.resolve_verify(name)
+ code = VerifyingDialog(parent.top_level_window(),
+ _("Verifying Cash Account {name} please wait ...").format(name=name),
+ resolve_verify, on_error=lambda e: parent.show_error(str(e)), auto_show=False).exec_()
+ if code == QDialog.Rejected:
+ # user cancel operation
+ return
+ if not results:
+ raise Bad(_("Cash Account not found: {name}").format(name=name) + "\n\n"
+ + _("Could not find the Cash Account name specified. "
+ "It either does not exist or there may have been a network connectivity error. "
+ "Please double-check it and try again."))
+ if len(results) > 1:
+ tup = multiple_result_picker(parent=parent, wallet=wallet, results=results)
+ if not tup:
+ # user cancel
+ return
+ results = [tup]
+ info, mch = results[0]
+ name = wallet.cashacct.fmt_info(info, mch)
+ if not isinstance(info.address, Address):
+ raise Bad(_("Unsupported payment data type.") + "\n\n"
+ + _("The Cash Account {name} uses an account type that "
+ "is not supported by Electron Cash.").format(name=name))
+ return info, name
+ except Bad as e:
+ parent.show_error(str(e))
+ return None
+
+
+class ButtonAssociatedLabel(QLabel):
+ ''' A QLabel, that if clicked on, sends a 'click()' call to an associated
+ QAbstractButton. '''
+
+ def __init__(self, *args, **kwargs):
+ but = kwargs.pop('button', None)
+ super().__init__(*args, **kwargs)
+ self.but = but
+ self.setTextInteractionFlags(self.textInteractionFlags() | Qt.TextSelectableByMouse)
+
+ def setButton(self, b : QAbstractButton): self.but = b
+ def button(self) -> QAbstractButton: return self.but
+
+ def mouseReleaseEvent(self, e):
+ super().mouseReleaseEvent(e)
+ if self.but:
+ if self.but.isEnabled():
+ self.but.click()
+ elif self.but.toolTip() and not self.hasSelectedText():
+ QToolTip.showText(QCursor.pos(), self.but.toolTip(), self)
+
+
+def naked_button_style() -> str:
+ ''' Returns a stylesheet for a small 'naked' (flat) QPushButton button which
+ is used in the lookup results and other associated widgets in this file '''
+ but_style_sheet = 'QPushButton { border-width: 1px; padding: 0px; margin: 0px; }'
+ if not ColorScheme.dark_scheme:
+ but_style_sheet += ''' QPushButton { border: 1px solid transparent; }
+ QPushButton:hover { border: 1px solid #3daee9; }'''
+ return but_style_sheet
+
+def button_make_naked(but: QAbstractButton) -> QAbstractButton:
+ ''' Just applied a bunch of things to a button to "make it naked"
+ which is the look we use for the lookup results and various other odds and
+ ends. Returns the button passed to it. '''
+ but.setStyleSheet(naked_button_style())
+ but.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
+ return but
+
+class InfoGroupBox(PrintError, QGroupBox):
+
+ class ButtonType(IntEnum):
+ NoButton = 0 # If this is specified to button_type, then the buttons will be hidden. selectedItem and selectedItems will have undefined results.
+ Radio = 1 # If specified, the on-screen buttons will be QRadioButtons and selectedItems() will always have 0 or 1 item.
+ CheckBox = 2 # If specified, the on-screen buttons will be QCheckBox and selectedItems() may be a list of more than 1 result
+
+ def __init__(self,
+ parent : QWidget, # widget parent for layout/embedding/etc
+ main_window : MessageBoxMixin, # may be same as 'parent'; will raise if not an ElectrumWindow instance
+ items: List[Tuple[cashacct.Info, str, str]] = [], # list of 2 or 3 tuple : Info, minimal_chash[, formatted_string]
+ title : str = None,
+ button_type : ButtonType = ButtonType.Radio, # Note that if CheckBox, the buttonGroup will be made non-exclusive and selectedItems() may return more than 1 item.
+ extra_buttons : List[Callable[[Tuple[cashacct.Info, str, str]], QAbstractButton]] = [], # pass a list of callables that take a 3-tuple for each item and return a button
+ show_addresses : bool = True, # if False, the address label remains hidden
+ custom_contents_margins : Tuple[int] = None, # if specified, use this as the contents margins for the internal layout widget
+ ):
+ from .main_window import ElectrumWindow
+ assert isinstance(main_window, ElectrumWindow)
+ super().__init__(parent)
+ self.main_window = main_window
+ self.wallet = self.main_window.wallet
+ self.extra_buttons = extra_buttons or []
+ self.show_addresses = bool(show_addresses)
+ if isinstance(custom_contents_margins, (tuple, list)) and len(custom_contents_margins) == 4 and all(isinstance(x, (int, float)) for x in custom_contents_margins):
+ self.custom_contents_margins = custom_contents_margins
+ else:
+ self.custom_contents_margins = None
+ assert isinstance(self.wallet, Abstract_Wallet)
+ self._setup()
+ self.setItems(items=items, title=title, auto_resize_parent=False, button_type=button_type)
+
+ def _setup(self):
+ self.w = QWidget(self)
+ self.vbox = QVBoxLayout(self)
+ self.vbox.setContentsMargins(0,0,0,0)
+ self.vbox.addWidget(self.w)
+ self._but_grp = QButtonGroup(self) # client code shouldn't use this but instead use selectedItems(), etc
+ self.no_items_text = _('No Cash Accounts') # client code may set this directly
+
+ def setItems(self,
+ items : List[Tuple[cashacct.Info, str, str]], # list of 2 or 3 tuple : Info, minimal_chash[, formatted_string]
+ title = None, auto_resize_parent = True, sort=True,
+ button_type : ButtonType = ButtonType.Radio):
+ items = items or []
+ nitems = len(items)
+ title = ngettext("{number} Cash Account", "{number} Cash Accounts", nitems).format(number=nitems) if title is None else title
+ wallet = self.wallet
+ if items and (sort or len(items[0]) != 3):
+ # sort items by formatted cash account string, also adding the string to
+ # the items tuples; tuples now are modified to 3 elements:
+ # (info, min_chash, formatted_ca_string)
+ formatter = lambda x: (x[0], x[1], wallet.cashacct.fmt_info(x[0], x[1]))
+ if sort:
+ items = sorted((formatter(x) for x in items), key=lambda tup:tup[2])
+ else:
+ items = [formatter(x) for x in items]
+ self._items = items
+ self.button_type = button_type
+ self.setTitle(title)
+ self.refresh()
+ if auto_resize_parent and self.parent():
+ weakParent = util.Weak.ref(self.parent())
+ QTimer.singleShot(0, lambda: weakParent() and weakParent().resize(weakParent().sizeHint()))
+
+ def buttonGroup(self) -> QButtonGroup:
+ ''' The button group id's will point to indices in self.items() '''
+ return self._but_grp
+
+ def checkItemWithInfo(self, info : cashacct.Info):
+ ''' Pass an info object and the item that corresponds to that
+ Info object will be checked. Pass None to uncheck all items. '''
+ for i, item in enumerate(self._items):
+ if info is None:
+ self._but_grp.button(i).setChecked(False)
+ elif item[0] == info:
+ self._but_grp.button(i).setChecked(True)
+
+ def items(self) -> List[Tuple[cashacct.Info, str, str]]:
+ ''' The list of items on-screen. self.buttonGroup()'s ids will point
+ to indices in this list.
+
+ Returned list items are 3-tuples of:
+ (Info, min_chash: str, fmtd_acct_name: str) '''
+ return self._items
+
+ def selectedItem(self) -> Tuple[cashacct.Info, str, str]:
+ ''' Returns the currently selected item tuple or None if none is selected '''
+ items = self.selectedItems()
+ if items:
+ return items[0]
+
+ def selectedItems(self) -> List[Tuple[cashacct.Info, str, str]]:
+ ''' In multi-select mode (CheckBox mode), returns the currently selected
+ items as a list of 3-tuple. '''
+ ret = []
+ buts = self._but_grp.buttons()
+ for but in buts:
+ if but.isChecked():
+ which = self._but_grp.id(but)
+ if which > -1 and which < len(self._items):
+ ret.append(self._items[which])
+ return ret
+
+ def refresh(self):
+ from .main_window import ElectrumWindow
+ parent = self.main_window
+ wallet = self.wallet
+ items = self._items
+ button_type = self.button_type
+ assert all(len(x) == 3 for x in items)
+ but_grp = self._but_grp
+ cols, col, row = 2, 0, -1
+
+ if self.w:
+ # save selection
+ saved_selection = [tup[0] for tup in self.selectedItems()]
+ # tear down the dummy container widget from before and everything
+ # in it
+ for c in self.findChildren(QAbstractButton, "InfoGroupBoxButton"):
+ if isinstance(c, QAbstractButton):
+ but_grp.removeButton(c)
+ self.w.hide()
+ self.vbox.removeWidget(self.w)
+ self.w.setParent(None)
+ self.w.deleteLater()
+ self.w = None
+ self.w = w = QWidget(self)
+ self.vbox.addWidget(w)
+
+ grid = QGridLayout(w)
+
+ if self.custom_contents_margins:
+ grid.setContentsMargins(*self.custom_contents_margins)
+
+ def details_link_activated(castr):
+ if isinstance(parent, ElectrumWindow):
+ if castr.startswith('txid:'):
+ txid = castr.split(':', 1)[-1]
+ parent.do_process_from_txid(txid=txid, tx_desc=wallet.get_label(txid))
+ else:
+ cash_account_detail_dialog(parent, castr)
+
+ def view_addr_link_activated(addr):
+ if isinstance(parent, ElectrumWindow):
+ try:
+ address = Address.from_string(addr)
+ parent.show_address(address, parent=parent.top_level_window())
+ except Exception as e:
+ parent.print_error(repr(e))
+
+
+ # We do it this way with BUTTON_FACTORY in case we want to expand
+ # this facility later to generate even more dynamic buttons.
+ if button_type == __class__.ButtonType.CheckBox:
+ BUTTON_FACTORY = lambda *args: QCheckBox()
+ but_grp.setExclusive(False)
+ else:
+ BUTTON_FACTORY = lambda *args: QRadioButton()
+ but_grp.setExclusive(True)
+ hide_but = button_type == __class__.ButtonType.NoButton
+
+ grid.setVerticalSpacing(4)
+
+ if not items:
+ label = WWLabel("" + self.no_items_text + "")
+ label.setAlignment(Qt.AlignCenter)
+ grid.addWidget(label, 0, 0, -1, -1)
+
+
+ for i, item in enumerate(items):
+ col = col % cols
+ if not col:
+ row += 1
+ info, min_chash, ca_string = item
+ ca_string_em = f"{ca_string} {info.emoji}"
+ # Radio button (by itself in colum 0)
+ rb = BUTTON_FACTORY(info, min_chash, ca_string, ca_string_em)
+ rb.setObjectName("InfoGroupBoxButton")
+ rb.setHidden(hide_but)
+ rb.setDisabled(hide_but) # hidden buttons also disabled to prevent user clicking their labels to select them
+ is_valid = True
+ is_mine = False
+ is_change = False
+ if not isinstance(info.address, Address):
+ rb.setDisabled(True)
+ is_valid = False
+ rb.setToolTip(_('Electron Cash currently only supports Cash Account types 1 & 2'))
+ elif wallet.is_mine(info.address):
+ is_mine = True
+ is_change = wallet.is_change(info.address)
+ but_grp.addButton(rb, i)
+ grid.addWidget(rb, row*3, col*5, 1, 1)
+ pretty_string = info.emoji + " " + ca_string[:-1]
+ chash_extra = info.collision_hash[len(min_chash):]
+ if not min_chash:
+ chash_extra = "." + chash_extra
+
+ # Cash Account name
+ ca_lbl = ButtonAssociatedLabel(f'{pretty_string}{chash_extra};', button=rb)
+ grid.addWidget(ca_lbl, row*3, col*5+1, 1, 1)
+
+ # Details and/or View tx ...
+ if not is_valid:
+ # Unsupported account type -- just offer View tx...
+ viewtx = _("View tx")
+ details_lbl = WWLabel(f'{viewtx}...')
+ details_lbl.setToolTip(_("View Registration Transaction"))
+ else:
+ details = _("Details")
+ details_lbl = WWLabel(f'{details}...')
+ details_lbl.setToolTip(_("View Details"))
+ grid.addWidget(details_lbl, row*3, col*5+2, 1, 1)
+
+ # misc buttons
+ hbox = QHBoxLayout()
+ hbox.setContentsMargins(0,0,0,0)
+ hbox.setSpacing(4)
+ for func in self.extra_buttons:
+ if callable(func):
+ ab = func(item)
+ if isinstance(ab, QAbstractButton):
+ button_make_naked(ab)
+ hbox.addWidget(ab)
+ # copy button
+ copy_but = QPushButton(QIcon(":icons/copy.png"), "")
+ button_make_naked(copy_but)
+ hbox.addWidget(copy_but)
+ grid.addLayout(hbox, row*3, col*5+3, 1, 1)
+ # end button bar
+
+ if isinstance(parent, ElectrumWindow):
+ details_lbl.linkActivated.connect(details_link_activated)
+ copy_but.clicked.connect(lambda ignored=None, ca_string_em=ca_string_em, copy_but=copy_but:
+ parent.copy_to_clipboard(text=ca_string_em, tooltip=_('Cash Account copied to clipboard'), widget=copy_but) )
+ copy_but.setToolTip(''
+ + _("Copy {cash_account_name}").format(cash_account_name=ca_string_em)
+ + '')
+ else:
+ details_lbl.setHidden(True)
+ copy_but.setHidden(True)
+
+ if self.show_addresses:
+ addr_lbl = ButtonAssociatedLabel('', button=rb)
+ if is_valid:
+ if is_mine:
+ addr_lbl.setText(f'{info.address.to_ui_string()}
')
+ addr_lbl.linkActivated.connect(view_addr_link_activated)
+ addr_lbl.setToolTip(_('Wallet') + ' - ' + (_('Change Address') if is_change else _('Receiving Address')))
+ addr_lbl.setButton(None) # disable click to select
+ else:
+ addr_lbl.setText(f'{info.address.to_ui_string()}
')
+ else:
+ addr_lbl.setText('' + _('Unsupported Account Type') + '')
+ addr_lbl.setToolTip(rb.toolTip())
+ grid.addWidget(addr_lbl, row*3+1, col*5+1, 1, 3)
+
+ if (col % cols) == 0:
+ # insert stretch in between the two columns
+ spacer = QSpacerItem(1,0)
+ grid.addItem(spacer, row, col*5+4, 1, 1)
+ grid.setColumnStretch(col*5+4, 10)
+
+ if self.show_addresses:
+ # in-between row spaer. Only added if showing addresses
+ # to make the address line visually closer to the line above it
+ spacer = QSpacerItem(1, 8)
+ grid.addItem(spacer, row*3+2, col*5, 1, 4)
+
+ col += 1
+
+
+ if len(items) == 1:
+ # just 1 item, put it on the left
+ grid.addItem(QSpacerItem(2,1), 0, 5)
+ grid.setColumnStretch(5, 100)
+ if len(items) <= 2:
+ # just 1 row, push it up to the top
+ grid.addItem(QSpacerItem(1,2), 3, 0, -1, -1)
+ grid.setRowStretch(3, 100)
+
+
+ if saved_selection and self.button_type != self.ButtonType.NoButton:
+ for info in saved_selection:
+ self.checkItemWithInfo(info)
+ else:
+ self.checkItemWithInfo(None)
+
+def multiple_result_picker(parent, results, wallet=None, msg=None, title=None, gbtext=None):
+ ''' Pops up a modal dialog telling you to pick a results. Used by the
+ Contacts tab edit function, etc. '''
+ assert parent
+ from .main_window import ElectrumWindow
+ if isinstance(parent, ElectrumWindow) and not wallet:
+ wallet = parent.wallet
+ assert isinstance(wallet, Abstract_Wallet)
+
+ msg = msg or _('Multiple results were found, please select an option from the items below:')
+ title = title or _("Select Cash Account")
+
+ d = WindowModalDialog(parent, title)
+ util.finalization_print_error(d) # track object lifecycle
+ destroyed_print_error(d)
+
+ vbox = QVBoxLayout(d)
+ lbl = WWLabel(msg)
+ vbox.addWidget(lbl)
+
+ gb = InfoGroupBox(d, parent, results)
+ vbox.addWidget(gb)
+
+ ok_but = OkButton(d)
+ buts = Buttons(CancelButton(d), ok_but)
+ vbox.addLayout(buts)
+ ok_but.setEnabled(False)
+
+ but_grp = gb.buttonGroup()
+ but_grp.buttonClicked.connect(lambda x=None: ok_but.setEnabled(gb.selectedItem() is not None))
+
+ code = d.exec_()
+
+ if code == QDialog.Accepted:
+ item = gb.selectedItem()
+ if item:
+ return item[:-1]
+
+def lookup_cash_account_dialog(
+ parent, wallet, *, # parent and wallet are required and parent must be an ElectrumWindow instance.
+ title: str = None, # the title to use, defaults to "Lookup Cash Account" (translated) and is bold and larger. Can be rich text.
+ blurb: str = None, # will appear in the same label, can be rich text, will get concatenated to title.
+ title_label_link_activated_slot: Callable[[str], None] = None, # if you embed links in the blub, pass a callback to handle them
+ button_type: InfoGroupBox.ButtonType = InfoGroupBox.ButtonType.NoButton, # see InfoGroupBox
+ add_to_contacts_button: bool = False, # if true, the button bar will include an add to contacts button
+ pay_to_button: bool = False # if true, the button bar will include a "pay to" button
+) -> List[Tuple[cashacct.Info, str, str]]: # Returns a list of tuples
+ ''' Shows the generic Cash Account lookup interface. '''
+ from .main_window import ElectrumWindow
+ ok_disables = button_type != InfoGroupBox.ButtonType.NoButton
+ title = title or _("Lookup Cash Account")
+ blurb = blurb or ''
+ assert isinstance(parent, ElectrumWindow) and isinstance(wallet, Abstract_Wallet)
+ if parent.gui_object.warn_if_no_network(parent):
+ return None
+ d = WindowModalDialog(parent.top_level_window(), title)
+ d.setObjectName("WindowModalDialog - " + title)
+ finalization_print_error(d)
+ destroyed_print_error(d)
+ all_cashacct_contacts = set(contact.name for contact in wallet.contacts.get_all(nocopy=True) if contact.type == 'cashacct')
+
+ vbox = QVBoxLayout(d)
+ hbox = QHBoxLayout()
+ label = QLabel()
+ label.setPixmap(QIcon(":icons/cashacct-logo.png").pixmap(50))
+ hbox.addWidget(label)
+ hbox.addItem(QSpacerItem(10, 1))
+ label = QLabel("" + title + "" + blurb)
+ if callable(title_label_link_activated_slot):
+ label.linkActivated.connect(title_label_link_activated_slot)
+ label.setAlignment(Qt.AlignVCenter|Qt.AlignLeft)
+ hbox.addWidget(label)
+ hbox.addStretch(2)
+ vbox.addLayout(hbox)
+ grid = QGridLayout()
+ grid.setContentsMargins(62, 32, 12, 12)
+ acct = QLineEdit()
+ acct.setPlaceholderText(_("Cash Account e.g. satoshi#123.45"))
+ acct.setMinimumWidth(280)
+ label2 = WWLabel('' + _("Search online...") + "")
+ label2.linkActivated.connect(webopen)
+
+
+ #acct.setFixedWidth(280)
+ label = HelpLabel(_("&Cash Account Name"), _("Enter a Cash Account name of the form Name#123.45, and Electron Cash will search for the contact and present you with its resolved address."))
+ label.setBuddy(acct)
+ search = QPushButton(_("Lookup"))
+ search.setEnabled(False)
+ grid.addWidget(label, 0, 0, 1, 1, Qt.AlignRight)
+ grid.addWidget(acct, 0, 1, 1, 1, Qt.AlignLeft)
+ grid.addWidget(search, 0, 2, 1, 1, Qt.AlignLeft)
+ grid.addWidget(label2, 0, 3, 1, 1, Qt.AlignLeft)
+ grid.setColumnStretch(3, 5)
+ vbox.addLayout(grid)
+ vbox.addItem(QSpacerItem(20,10))
+ frame = QScrollArea()
+ tit_lbl = QLabel()
+ vbox.addWidget(tit_lbl)
+ extra_buttons = []
+ # Extra Buttons
+ if add_to_contacts_button:
+ def create_add_to_contacts_button_callback(item: tuple) -> QPushButton:
+ info, min_chash, ca_string = item
+ ca_string_em = wallet.cashacct.fmt_info(info, min_chash, emoji=True)
+ but = QPushButton(QIcon(":icons/tab_contacts.png"), "")
+ if isinstance(info.address, Address):
+ if ca_string in all_cashacct_contacts or wallet.is_mine(info.address):
+ but.setDisabled(True)
+ but.setToolTip(_('{cash_account} already in Contacts').format(cash_account=ca_string_em))
+ else:
+ add_str = _("Add to Contacts")
+ but.setToolTip(f'{add_str}
{ca_string_em}')
+ del add_str
+ def add_contact_slot(ign=None, but=but, item=item):
+ # label, address, typ='address') -> str:
+ new_contact = parent.set_contact(label=ca_string, address=info.address, typ='cashacct')
+ if new_contact:
+ msg = _('{cash_account} added to Contacts').format(cash_account=ca_string_em)
+ but.setDisabled(True)
+ but.setToolTip(msg)
+ all_cashacct_contacts.add(new_contact.name)
+ else:
+ msg = _("Error occurred adding to Contacts")
+ QToolTip.showText(QCursor.pos(), msg, frame, QRect(), 5000)
+ # /add_contact
+ but.clicked.connect(add_contact_slot)
+ else:
+ but.setDisabled(True)
+ but.setToolTip("" + _("Unsupported Account Type") + "")
+ return but
+ extra_buttons.append(create_add_to_contacts_button_callback)
+ if pay_to_button:
+ def create_payto_but(item):
+ info, min_chash, ca_string = item
+ ca_string_em = wallet.cashacct.fmt_info(info, min_chash, emoji=True)
+ icon_file = ":icons/paper-plane.svg" if not ColorScheme.dark_scheme else ":icons/paper-plane_dark_theme.svg"
+ but = QPushButton(QIcon(icon_file), "")
+ if isinstance(info.address, Address):
+ payto_str = _("Pay to")
+ but.setToolTip(f'{payto_str}
{ca_string_em}')
+ but.clicked.connect(lambda: parent.is_alive() and parent.payto_payees([ca_string_em]))
+ but.clicked.connect(d.reject)
+ else:
+ but.setDisabled(True)
+ but.setToolTip("" + _("Unsupported Account Type") + "")
+ return but
+ extra_buttons.append(create_payto_but)
+ # /Extra Buttons
+ ca = InfoGroupBox(frame, parent, button_type = button_type, title = '', extra_buttons=extra_buttons)
+ ca.refresh()
+ frame.setMinimumWidth(765)
+ frame.setMinimumHeight(250)
+ frame.setWidget(ca)
+ frame.setWidgetResizable(True)
+ vbox.addWidget(frame)
+ search.setDefault(True)
+ if ok_disables:
+ need_to_fwd_return = True
+ ok = OkButton(d)
+ ok.setDisabled(ok_disables)
+ vbox.addLayout(Buttons(CancelButton(d), ok))
+ else:
+ need_to_fwd_return = False
+ ok = CloseButton(d)
+ ok.setDefault(False)
+ vbox.addLayout(Buttons(ok))
+
+ def ca_msg(m, clear=False):
+ ca.no_items_text = m
+ if clear:
+ ca.setItems([], auto_resize_parent=False, title = '')
+ else:
+ ca.refresh()
+ tit_lbl.setText('')
+
+ def on_return_pressed():
+ if need_to_fwd_return and search.isEnabled():
+ search.click()
+
+ def on_text_changed(txt):
+ txt = txt.strip() if txt else ''
+ search.setEnabled(bool(wallet.cashacct.parse_string(txt)))
+ if not txt and not ca.items():
+ ca_msg(" ")
+
+ def on_search():
+ ok.setDisabled(ok_disables)
+ name = acct.text().strip()
+ tup = wallet.cashacct.parse_string(name)
+ if tup:
+ ca_msg(_("Searching for {cash_account_name} please wait ...").format(cash_account_name=name), True)
+ results = None
+ exc = []
+ t0 = time.time()
+ def resolve_verify():
+ nonlocal results
+ results = wallet.cashacct.resolve_verify(name, exc=exc)
+ code = VerifyingDialog(parent.top_level_window(),
+ _("Verifying Cash Account {name} please wait ...").format(name=name),
+ resolve_verify, auto_show=False).exec_()
+ if code == QDialog.Rejected:
+ # user cancel -- the waiting dialog thread will continue to run in the background but that's ok.. it will be a no-op
+ d.reject()
+ return
+ if results:
+ ca.setItems(results, auto_resize_parent=False, title='', button_type = button_type) # suppress groupbox title
+ else:
+ ca_msg(_("The specified Cash Account does not appear to be associated with any address"), True)
+ if time.time()-t0 >= cashacct.timeout:
+ if (wallet.verifier and wallet.synchronizer and # check these are still alive: these could potentially go away from under us if wallet is stopped when we get here.
+ (not wallet.verifier.is_up_to_date() or not wallet.synchronizer.is_up_to_date())):
+ parent.show_message(_("No results found. However, your wallet is busy updating."
+ " This can interfere with Cash Account lookups."
+ " You may want to try again when it is done."))
+ else:
+ parent.show_message(_("A network timeout occurred while looking up this Cash Account. "
+ "You may want to check that your internet connection is up and "
+ "not saturated processing other requests."))
+ elif exc and isinstance(exc[-1], requests.ConnectionError):
+ parent.show_error(_("A network connectivity error occured. Please check your internet connection and try again."))
+ nres = len(results or [])
+ title = "" + name + " - " + ngettext("{number} Cash Account", "{number} Cash Accounts", nres).format(number=nres)
+ tit_lbl.setText(title)
+ else:
+ ca_msg(_("Invalid Cash Account name, please try again"), True)
+
+ acct.textChanged.connect(on_text_changed)
+ search.clicked.connect(on_search)
+ acct.returnPressed.connect(on_return_pressed)
+ ca.buttonGroup().buttonClicked.connect(lambda x=None: ok.setEnabled(ok_disables and ca.selectedItem() is not None))
+
+ ca_msg(" ")
+
+ if d.exec_() == QDialog.Accepted:
+ return ca.selectedItems()
+ return None
+
+
+def cash_account_detail_dialog(parent : MessageBoxMixin, # Should be an ElectrumWindow instance
+ ca_string : str, # Cash acount string eg: "satoshi#123.1
+ *, title : str = None # The modal dialog window title
+ ) -> bool: # returns True on success, False on failure
+ ''' Shows the Cash Account details for any cash account.
+ Note that parent should be a ElectrumWindow instance.
+ `ca_string` is just a Cash Account string of the form:
+ name#number[.collision_hash_prefix]
+ Returns False on failure or True on success. User is presented with an error
+ message box on False return.'''
+ from .main_window import ElectrumWindow
+ assert isinstance(parent, ElectrumWindow)
+ wallet = parent.wallet
+ assert isinstance(wallet, Abstract_Wallet)
+
+ if not wallet.cashacct.parse_string(ca_string):
+ parent.show_error(_("Invalid Cash Account:") + f" {ca_string}")
+ return False
+
+ ca_string = wallet.cashacct.strip_emoji(ca_string)
+
+ # validate ca_string arg & resolve if need be
+ info = wallet.cashacct.get_verified(ca_string)
+ if not info:
+ # need to look it up
+ tup = resolve_cashacct(parent, wallet)
+ if not tup:
+ # Error window was provided by resolve_cashacct, just return
+ return False
+ info, ca_string = tup
+ ca_string_em = ca_string + f" {info.emoji}"
+ parsed = wallet.cashacct.parse_string(ca_string)
+ assert parsed
+ minimal_chash = parsed[-1]
+
+ # . <-- at this point we have a verified cash account to display
+
+ # Make sure it's not an unsupported type as the code at the end of this
+ # file assumes info.address is an Address.
+ if not isinstance(info.address, Address):
+ parent.show_error(_("Unsupported payment data type.") + "\n\n"
+ + _("The Cash Account {name} uses an account type that "
+ "is not supported by Electron Cash.").format(name=ca_string))
+ return False
+
+ title = title or _("Cash Account Details")
+ # create dialog window
+ d = WindowModalDialog(parent.top_level_window(), title)
+ d.setObjectName("WindowModalDialog - " + title)
+ finalization_print_error(d)
+ destroyed_print_error(d)
+
+ grid = QGridLayout(d)
+ em_lbl = QLabel(f'{info.emoji}')
+ em_lbl.setToolTip(f'{ca_string_em}')
+ grid.addWidget(em_lbl, 0, 0, 3, 1)
+ fsize = 26
+ if len(info.name) > 20:
+ fsize = 15
+ if len(info.name) > 30:
+ fsize = 12
+ if len(info.name) > 50:
+ fsize = 10
+ if len(info.name) > 90:
+ fsize = 8
+ name_txt = f'{info.name}#{info.number}.'
+ if minimal_chash:
+ name_txt += f'{minimal_chash}'
+ name_txt += ''
+ if len(minimal_chash) < len(info.collision_hash):
+ if not info.collision_hash.startswith(minimal_chash):
+ parent.print_error(f"WARNING: {ca_string} minimal_chash {minimal_chash} and collision_hash {info.collision_hash} mismatch!")
+ else:
+ extra = info.collision_hash[len(minimal_chash):]
+ name_txt += f'{extra}'
+
+ def open_link(link):
+ if Address.is_valid(link):
+ addr = Address.from_string(link)
+ if wallet.is_mine(addr):
+ parent.show_address(addr)
+ else:
+ addr_URL = web.BE_URL(parent.config, 'addr', addr)
+ if addr_URL:
+ webopen(addr_URL)
+ return
+ if link.startswith('http'):
+ webopen(link)
+ elif len(link) == 64: # 64 character txid
+ tx = wallet.transactions.get(link)
+ if tx:
+ parent.show_transaction(tx, tx_desc=wallet.get_label(link))
+ else:
+ parent.do_process_from_txid(txid=link, tx_desc=wallet.get_label(link))
+ return
+
+ # name
+ name_lbl = QLabel(name_txt)
+ grid.addWidget(name_lbl, 0, 1, 1, 1)
+ # copy name
+ copy_name_but = QPushButton()
+ copy_name_but.setIcon(QIcon(":icons/copy.png"))
+ button_make_naked(copy_name_but)
+ copy_name_but.setToolTip(''
+ + _("Copy {cash_account_name}").format(cash_account_name=ca_string_em)
+ + '')
+ copy_name_but.clicked.connect(lambda ignored=None, ca_string_em=ca_string_em, copy_but=copy_name_but:
+ parent.copy_to_clipboard(text=ca_string_em, tooltip=_('Cash Account copied to clipboard'), widget=copy_but) )
+ grid.addWidget(copy_name_but, 0, 2, 1, 1)
+ # address label
+ addr_lbl = QLabel(f'{info.address.to_ui_string()}
')
+ addr_lbl.linkActivated.connect(open_link)
+ grid.addWidget(addr_lbl, 1, 1, 1, 1)
+ # copy address label
+ copy_addr_but = QPushButton()
+ copy_addr_but.setIcon(QIcon(":icons/copy.png"))
+ button_make_naked(copy_addr_but)
+ copy_addr_but.setToolTip(_("Copy {}").format(_("Address")))
+ copy_addr_but.clicked.connect(lambda ignored=None, text=info.address.to_ui_string(), copy_but=copy_addr_but:
+ parent.copy_to_clipboard(text=text, tooltip=_('Address copied to clipboard'), widget=copy_but) )
+ grid.addWidget(copy_addr_but, 1, 2, 1, 1)
+
+ if not wallet.is_mine(info.address):
+ ismine_txt = _("External Address") + ', '
+ else:
+ ismine_txt = ''
+
+ # Mined in block
+ viewtx_txt = _("Mined in block")
+ view_tx_lbl = QLabel(f'{ismine_txt}{viewtx_txt}: {cashacct.num2bh(info.number)}')
+ view_tx_lbl.setToolTip(_("View Registration Transaction"))
+ view_tx_lbl.linkActivated.connect(open_link)
+ grid.addWidget(view_tx_lbl, 2, 1, 1, 1, Qt.AlignTop | Qt.AlignRight)
+
+ grid.setRowStretch(2, 1)
+
+ # QR
+ tabs = QTabWidget()
+ full_addr_str = info.address.to_full_ui_string()
+ qr_address = QRCodeWidget(full_addr_str, fixedSize=True)
+ qr_address.setToolTip(full_addr_str)
+ tabs.addTab(qr_address, _("Address"))
+ qr_ca_string = QRCodeWidget(ca_string, fixedSize=True)
+ qr_ca_string.setToolTip(ca_string)
+ tabs.addTab(qr_ca_string, _("Cash Account"))
+ qr_address.setMinimumSize(300, 300)
+ qr_ca_string.setMinimumSize(300, 300)
+
+ grid.addWidget(tabs, 3, 0, 1, -1, Qt.AlignTop | Qt.AlignHCenter)
+
+ def_but = QPushButton()
+ mk_def_txt = _("Make default for address")
+ is_def_txt = _("Is default for address")
+ mk_def_tt = _("Make this Cash Account the default for this address")
+ is_def_tt = _("Cash Account has been made the default for this address")
+ def make_default():
+ wallet.cashacct.set_address_default(info)
+ parent.ca_address_default_changed_signal.emit(info) # updates all concerned widgets, including self
+ tt = is_def_txt
+ QToolTip.showText(QCursor.pos(), tt, def_but)
+ def update_def_but(new_def):
+ if new_def and new_def.address != info.address:
+ # not related, abort
+ return
+ if new_def != info:
+ def_but.setDisabled(False)
+ def_but.setText(mk_def_txt)
+ def_but.setToolTip(mk_def_tt)
+ else:
+ def_but.setDisabled(True)
+ def_but.setText(is_def_txt)
+ def_but.setToolTip(is_def_tt)
+ def_but.clicked.connect(make_default)
+ infos = wallet.cashacct.get_cashaccounts([info.address])
+ def_now = infos and wallet.cashacct.get_address_default(infos)
+ if wallet.is_mine(info.address):
+ update_def_but(def_now)
+ else:
+ def_but.setHidden(True) # not related to wallet, hide the button
+ del infos, def_now
+
+ # Bottom buttons
+ buttons = Buttons(def_but, OkButton(d))
+ grid.addLayout(buttons, 4, 0, -1, -1)
+
+
+ # make all labels allow select text & click links
+ for c in d.children():
+ if isinstance(c, QLabel):
+ c.setTextInteractionFlags(c.textInteractionFlags() | Qt.TextSelectableByMouse | Qt.LinksAccessibleByMouse)
+
+ try:
+ parent.ca_address_default_changed_signal.connect(update_def_but)
+ d.exec_()
+ finally:
+ # Unconditionally detach slot to help along Python GC
+ try: parent.ca_address_default_changed_signal.disconnect(update_def_but)
+ except TypeError: pass
+
+ return True
diff --git a/electroncash_gui/qt/console.py b/electroncash_gui/qt/console.py
new file mode 100644
index 000000000000..ea8bd83fbe91
--- /dev/null
+++ b/electroncash_gui/qt/console.py
@@ -0,0 +1,486 @@
+
+# source: http://stackoverflow.com/questions/2758159/how-to-embed-a-python-interpreter-in-a-pyqt-widget
+
+import sys
+import os
+import re
+import traceback
+import platform
+
+from PyQt5 import QtCore
+from PyQt5 import QtGui
+from PyQt5 import QtWidgets
+
+from electroncash import util, get_config
+from electroncash.i18n import _
+from .util import ColorScheme, MONOSPACE_FONT
+
+
+class ConsoleWarningOverlay(QtWidgets.QWidget):
+ STYLESHEET = '''
+ QLabel, QLabel link {
+ color: rgb(0, 64, 0);
+ background-color: rgba(200, 220, 200, 215);
+ border-color: rgba(16, 120, 16, 215);
+ }
+ '''
+
+ STYLESHEET_DARK = '''
+ QLabel, QLabel link {
+ color: rgb(180, 220, 180);
+ background-color: rgba(3, 12, 3, 215);
+ border-color: rgba(3, 96, 3, 215);
+ }
+ '''
+
+ STYLESHEET_COMMON = '''
+ QLabel, QLabel link {
+ border: 2px solid;
+ padding: 8px;
+ font: 12pt;
+ }
+ '''
+
+ BORDER_RADIUS = 16
+ STYLESHEET_BORDER_RADIUS = '''
+ QLabel, QLabel link {{
+ border-radius: {0}px;
+ }}
+ '''.format(BORDER_RADIUS)
+
+ CONFIRM_TEXT = _("I UNDERSTAND THE RISK").upper()
+
+ acknowledged = QtCore.pyqtSignal(bool)
+
+ def __init__(self, parent):
+ super().__init__(parent)
+
+ util.finalization_print_error(self)
+
+ warning_fmt = '{0}
{1} {2}
{3}
{4}
'
+ warning_text = warning_fmt.format(
+ _('WARNING'),
+ _('Do not enter code here that you don\'t understand. Executing the wrong code could '
+ 'lead to your coins being irreversibly lost.'),
+ _("If someone you do not trust wants you to enter something here, that person might "
+ "be attempting a social engineering / phishing attack on you."),
+ 'https://en.wikipedia.org/wiki/Social_engineering_(security)',
+ _("Type: '{}' below to proceed").format('' + self.CONFIRM_TEXT + ''),
+ 'style="color: #3399ff;"' if ColorScheme.dark_scheme else '',
+ )
+
+ style_sheet = self.STYLESHEET_DARK if ColorScheme.dark_scheme else self.STYLESHEET
+ style_sheet = style_sheet + self.STYLESHEET_COMMON
+ style_sheet = style_sheet + self.STYLESHEET_BORDER_RADIUS
+ self.setStyleSheet(style_sheet)
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.setContentsMargins(25,25,25,25)
+ self.setLayout(layout)
+
+ warning_label = QtWidgets.QLabel(warning_text)
+ warning_label.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
+ QtWidgets.QSizePolicy.MinimumExpanding)
+ warning_label.setWordWrap(True)
+ warning_label.setOpenExternalLinks(True)
+ layoutLbl = QtWidgets.QVBoxLayout()
+ layoutLbl.addWidget(warning_label)
+ layout.addLayout(layoutLbl, 1)
+
+ if not ColorScheme.dark_scheme:
+ drop_shadow_effect = QtWidgets.QGraphicsDropShadowEffect()
+ drop_shadow_effect.setBlurRadius(5.0)
+ drop_shadow_effect.setOffset(2.0, 2.0)
+ drop_shadow_effect.setColor(QtGui.QColor(63,63,63,100))
+ warning_label.setGraphicsEffect(drop_shadow_effect)
+
+ hbox_layout = QtWidgets.QHBoxLayout()
+ layout.addLayout(hbox_layout)
+
+ fixed = QtWidgets.QSizePolicy.Fixed
+ hbox_layout.addSpacerItem(QtWidgets.QSpacerItem(self.BORDER_RADIUS, 0, fixed, fixed))
+
+ self.input_edit = QtWidgets.QLineEdit()
+ self.input_edit.textChanged.connect(self.on_text_changed)
+ self.input_edit.returnPressed.connect(self.on_confirm)
+ hbox_layout.addWidget(self.input_edit)
+
+ self.confirm_btn = QtWidgets.QPushButton(_("&Confirm"))
+ self.confirm_btn.setEnabled(False)
+ self.confirm_btn.clicked.connect(self.on_confirm)
+ hbox_layout.addWidget(self.confirm_btn)
+
+ self.dontaskagain_cbx = QtWidgets.QCheckBox(_("&Don't ask again"))
+ hbox_layout.addWidget(self.dontaskagain_cbx)
+
+ hbox_layout.addSpacerItem(QtWidgets.QSpacerItem(self.BORDER_RADIUS, 0, fixed, fixed))
+
+ def input_ok(self) -> bool:
+ """
+ Returns true if the value in the text input field matches the confirmation text
+ """
+ return self.input_edit.text().strip().upper() == self.CONFIRM_TEXT
+
+ @QtCore.pyqtSlot()
+ def on_text_changed(self):
+ """
+ Enables the confirm button when the input text matches
+ """
+ self.confirm_btn.setEnabled(self.input_ok())
+
+ @QtCore.pyqtSlot()
+ def on_confirm(self):
+ """
+ Closes the dialog if the input text matches
+ """
+ if not self.input_ok():
+ return
+
+ self.hide()
+ self.acknowledged.emit(self.dontaskagain_cbx.isChecked())
+
+class ConsoleTextEdit(QtWidgets.QPlainTextEdit):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ def keyPressEvent(self, event: QtGui.QKeyEvent):
+ # Let the warning overlay process key presses when active
+ if self.parent().warningOverlay:
+ self.parent().warningOverlay.keyPressEvent(event)
+ return
+
+ if event.key() == QtCore.Qt.Key_Tab or event.key() == QtCore.Qt.Key_Backtab:
+ if (event.modifiers() & QtCore.Qt.ControlModifier) == QtCore.Qt.ControlModifier:
+ # Ctrl + Tab / Ctrl + Shift + Tab for navigating the tab control, just let the parent handle it
+ pass
+ elif (event.modifiers() & QtCore.Qt.ShiftModifier) == QtCore.Qt.ShiftModifier:
+ # Shift + Tab, give focus to previous widget
+ self.parent().focusPreviousChild()
+ return
+ else:
+ # No Ctrl / Shift pressed, show completions
+ self.parent().completions()
+ return
+
+ closed_completions = self.parent().hide_completions()
+
+ if event.key() in (QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return):
+ self.parent().runCommand()
+ return
+ if event.key() == QtCore.Qt.Key_Home:
+ self.parent().setCursorPosition(0)
+ return
+ if event.key() == QtCore.Qt.Key_PageUp:
+ return
+ elif event.key() in (QtCore.Qt.Key_Left, QtCore.Qt.Key_Backspace):
+ if self.parent().getCursorPosition() == 0:
+ return
+ elif event.key() == QtCore.Qt.Key_Up:
+ self.parent().setCommand(self.parent().getPrevHistoryEntry())
+ return
+ elif event.key() == QtCore.Qt.Key_Down:
+ self.parent().setCommand(self.parent().getNextHistoryEntry())
+ return
+ elif event.key() == QtCore.Qt.Key_L and event.modifiers() == QtCore.Qt.ControlModifier:
+ self.parent().clear()
+ elif event.key() == QtCore.Qt.Key_Insert and event.modifiers() == QtCore.Qt.NoModifier:
+ self.setOverwriteMode(not self.overwriteMode())
+
+ super(ConsoleTextEdit, self).keyPressEvent(event)
+
+class Console(QtWidgets.QWidget):
+ CONFIG_DONTASKAGAIN_KEY = 'console_warning_dontaskagain'
+
+ def __init__(self, wallet, prompt='>> ', startup_message='', parent=None):
+ super().__init__(parent)
+
+ self.prompt = prompt
+ self.history = []
+ self.namespace = {}
+ self.construct = []
+
+ self.setGeometry(50, 75, 600, 400)
+
+ self.editor = ConsoleTextEdit(self)
+ self.editor.resize(self.size())
+ self.editor.setWordWrapMode(QtGui.QTextOption.WrapAnywhere)
+ self.editor.setUndoRedoEnabled(False)
+ self.editor.setFont(QtGui.QFont(MONOSPACE_FONT, 10, QtGui.QFont.Normal))
+
+ self.showMessage(startup_message)
+
+ self.updateNamespace({'run':self.run_script})
+ self.set_json(False)
+
+ self.warningOverlay = None
+
+ wallet_storage = wallet.storage
+ config_dontaskagain = wallet_storage.get(self.CONFIG_DONTASKAGAIN_KEY, False)
+
+ # Don't show the warning if the user chose to have it not shown again
+ if not config_dontaskagain:
+ self.warningOverlay = ConsoleWarningOverlay(self)
+ self.warningOverlay.resize(self.size())
+
+ fp = self.editor.focusPolicy()
+ blur_effect = QtWidgets.QGraphicsBlurEffect()
+ blur_effect.setBlurRadius(5)
+ self.editor.setGraphicsEffect(blur_effect)
+ self.editor.setFocusPolicy(QtCore.Qt.NoFocus)
+ self.editor.setFocusProxy(self.warningOverlay)
+ def on_acknowledged(dontaskagain: bool):
+ wallet_storage.put(self.CONFIG_DONTASKAGAIN_KEY, dontaskagain or None) # None deletes the key
+ self.editor.setGraphicsEffect(None)
+ self.editor.setFocusPolicy(fp)
+ self.editor.setFocusProxy(None)
+ # Focus the editor after confirming
+ self.editor.setFocus()
+ self.warningOverlay.deleteLater()
+ self.warningOverlay = None
+ self.warningOverlay.acknowledged.connect(on_acknowledged)
+
+ def resizeEvent(self, e):
+ super().resizeEvent(e)
+ self.editor.resize(self.size())
+ if self.warningOverlay:
+ self.warningOverlay.resize(self.size())
+
+ def set_json(self, b):
+ self.is_json = b
+
+ def run_script(self, filename):
+ with open(filename, encoding='utf-8') as f:
+ script = f.read()
+
+ # eval is generally considered bad practice. use it wisely!
+ result = eval(script, self.namespace, self.namespace)
+
+ def updateNamespace(self, namespace):
+ self.namespace.update(namespace)
+
+ def showMessage(self, message):
+ self.editor.appendPlainText(message)
+ self.newPrompt()
+
+ def clear(self):
+ self.editor.setPlainText('')
+ self.newPrompt()
+
+ def newPrompt(self):
+ if self.construct:
+ prompt = '.' * len(self.prompt)
+ else:
+ prompt = self.prompt
+
+ self.completions_pos = self.editor.textCursor().position()
+ self.completions_visible = False
+
+ self.editor.appendPlainText(prompt)
+ self.editor.moveCursor(QtGui.QTextCursor.End)
+
+ def getCommand(self):
+ doc = self.editor.document()
+ curr_line = doc.findBlockByLineNumber(doc.lineCount() - 1).text()
+ curr_line = curr_line.rstrip()
+ curr_line = curr_line[len(self.prompt):]
+ return curr_line
+
+ def setCommand(self, command):
+ if self.getCommand() == command:
+ return
+
+ doc = self.editor.document()
+ curr_line = doc.findBlockByLineNumber(doc.lineCount() - 1).text()
+ self.editor.moveCursor(QtGui.QTextCursor.End)
+ for i in range(len(curr_line) - len(self.prompt)):
+ self.editor.moveCursor(QtGui.QTextCursor.Left, QtGui.QTextCursor.KeepAnchor)
+
+ self.editor.textCursor().removeSelectedText()
+ self.editor.textCursor().insertText(command)
+ self.editor.moveCursor(QtGui.QTextCursor.End)
+
+ def show_completions(self, completions):
+ if self.completions_visible:
+ self.hide_completions()
+
+ c = self.editor.textCursor()
+ c.setPosition(self.completions_pos)
+
+ completions = map(lambda x: x.split('.')[-1], completions)
+ t = '\n' + ' '.join(completions)
+ if len(t) > 500:
+ t = t[:500] + '...'
+ c.insertText(t)
+ self.completions_end = c.position()
+
+ self.editor.moveCursor(QtGui.QTextCursor.End)
+ self.completions_visible = True
+
+ def hide_completions(self) -> bool:
+ if not self.completions_visible:
+ return False
+ c = self.editor.textCursor()
+ c.setPosition(self.completions_pos)
+ l = self.completions_end - self.completions_pos
+ for x in range(l): c.deleteChar()
+
+ self.editor.moveCursor(QtGui.QTextCursor.End)
+ self.completions_visible = False
+ return True
+
+ def getConstruct(self, command):
+ if self.construct:
+ prev_command = self.construct[-1]
+ self.construct.append(command)
+ if not prev_command and not command:
+ ret_val = '\n'.join(self.construct)
+ self.construct = []
+ return ret_val
+ else:
+ return ''
+ else:
+ if command and command[-1] == (':'):
+ self.construct.append(command)
+ return ''
+ else:
+ return command
+
+ def addToHistory(self, command):
+ if command[0:1] == ' ':
+ return
+
+ if command and (not self.history or self.history[-1] != command):
+ self.history.append(command)
+ self.history_index = len(self.history)
+
+ def getPrevHistoryEntry(self):
+ if self.history:
+ self.history_index = max(0, self.history_index - 1)
+ return self.history[self.history_index]
+ return ''
+
+ def getNextHistoryEntry(self):
+ if self.history:
+ hist_len = len(self.history)
+ self.history_index = min(hist_len, self.history_index + 1)
+ if self.history_index < hist_len:
+ return self.history[self.history_index]
+ return ''
+
+ def getCursorPosition(self):
+ c = self.editor.textCursor()
+ return c.position() - c.block().position() - len(self.prompt)
+
+ def setCursorPosition(self, position):
+ self.editor.moveCursor(QtGui.QTextCursor.StartOfLine)
+ for i in range(len(self.prompt) + position):
+ self.editor.moveCursor(QtGui.QTextCursor.Right)
+
+ def runCommand(self):
+ command = self.getCommand()
+ self.addToHistory(command)
+
+ command = self.getConstruct(command)
+
+ if command:
+ tmp_stdout = sys.stdout
+
+ class stdoutProxy():
+ def __init__(self, write_func):
+ self.write_func = write_func
+ self.skip = False
+
+ def flush(self):
+ pass
+
+ def write(self, text):
+ if not self.skip:
+ stripped_text = text.rstrip('\n')
+ self.write_func(stripped_text)
+ QtCore.QCoreApplication.processEvents()
+ self.skip = not self.skip
+
+ if type(self.namespace.get(command)) == type(lambda:None):
+ self.editor.appendPlainText("'{}' is a function. Type '{}()' to use it in the Python console."
+ .format(command, command))
+ self.newPrompt()
+ return
+
+ sys.stdout = stdoutProxy(self.editor.appendPlainText)
+ try:
+ try:
+ # eval is generally considered bad practice. use it wisely!
+ result = eval(command, self.namespace, self.namespace)
+ if result is not None:
+ if self.is_json:
+ util.print_msg(util.json_encode(result))
+ else:
+ self.editor.appendPlainText(repr(result))
+ except SyntaxError:
+ # exec is generally considered bad practice. use it wisely!
+ exec(command, self.namespace, self.namespace)
+ except SystemExit:
+ self.close()
+ except (Exception, BaseException):
+ # Catch errors in the network layer as well, as long as it uses BaseException.
+ traceback_lines = traceback.format_exc().split('\n')
+ # Remove traceback mentioning this file, and a linebreak
+ for i in (3,2,1,-1):
+ traceback_lines.pop(i)
+ self.editor.appendPlainText('\n'.join(traceback_lines))
+ sys.stdout = tmp_stdout
+ self.newPrompt()
+ self.set_json(False)
+
+ def completions(self):
+ cmd = self.getCommand()
+ lastword = re.split(' |\(|\)',cmd)[-1]
+ beginning = cmd[0:-len(lastword)]
+
+ path = lastword.split('.')
+ ns = self.namespace.keys()
+
+ if len(path) == 1:
+ ns = ns
+ prefix = ''
+ else:
+ obj = self.namespace.get(path[0])
+ prefix = path[0] + '.'
+ ns = dir(obj)
+
+
+ completions = []
+ for x in ns:
+ if x[0] == '_':continue
+ xx = prefix + x
+ if xx.startswith(lastword):
+ completions.append(xx)
+ completions.sort()
+
+ if not completions:
+ self.hide_completions()
+ elif len(completions) == 1:
+ self.hide_completions()
+ self.setCommand(beginning + completions[0])
+ else:
+ # find common prefix
+ p = os.path.commonprefix(completions)
+ if len(p)>len(lastword):
+ self.hide_completions()
+ self.setCommand(beginning + p)
+ else:
+ self.show_completions(completions)
+
+
+welcome_message = '''
+ ---------------------------------------------------------------
+ Welcome to a primitive Python interpreter.
+ ---------------------------------------------------------------
+'''
+
+if __name__ == '__main__':
+ app = QtWidgets.QApplication(sys.argv)
+ console = Console(startup_message=welcome_message)
+ console.updateNamespace({'myVar1' : app, 'myVar2' : 1234})
+ console.show()
+ sys.exit(app.exec_())
diff --git a/electroncash_gui/qt/contact_list.py b/electroncash_gui/qt/contact_list.py
new file mode 100644
index 000000000000..8c793f6cc981
--- /dev/null
+++ b/electroncash_gui/qt/contact_list.py
@@ -0,0 +1,520 @@
+#!/usr/bin/env python3
+#
+# Electrum - lightweight Bitcoin client
+# Copyright (C) 2015 Thomas Voegtlin
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from electroncash.i18n import _, ngettext
+import electroncash.web as web
+from electroncash.address import Address
+from electroncash.contacts import Contact, contact_types
+from electroncash.plugins import run_hook
+from electroncash.util import FileImportFailed, PrintError, finalization_print_error
+# TODO: whittle down these * imports to what we actually use when done with
+# our changes to this class -Calin
+from PyQt5.QtGui import *
+from PyQt5.QtCore import *
+from PyQt5.QtWidgets import *
+from .util import (MyTreeWidget, webopen, WindowModalDialog, Buttons,
+ CancelButton, OkButton, HelpLabel, WWLabel,
+ destroyed_print_error, webopen, ColorScheme, MONOSPACE_FONT,
+ rate_limited)
+from enum import IntEnum
+from collections import defaultdict
+from typing import List, Set, Dict, Tuple
+from . import cashacctqt
+
+
+class ContactList(PrintError, MyTreeWidget):
+ filter_columns = [1, 2, 3] # Name, Label, Address
+ default_sort = MyTreeWidget.SortSpec(1, Qt.AscendingOrder)
+
+ do_update_signal = pyqtSignal()
+ _ca_minimal_chash_updated_signal = pyqtSignal(object, str)
+
+ class DataRoles(IntEnum):
+ Contact = Qt.UserRole + 0
+
+ def __init__(self, parent):
+ MyTreeWidget.__init__(self, parent, self.create_menu,
+ ["", _('Name'), _('Label'), _('Address'), _('Type') ], 2, [1,2], # headers, stretch_column, editable_columns
+ deferred_updates=True, save_sort_settings=True)
+ self.setSelectionMode(QAbstractItemView.ExtendedSelection)
+ self.setSortingEnabled(True)
+ self.wallet = parent.wallet
+ self.setIndentation(0)
+ self._edited_item_cur_sel = (None,) * 3
+ self.monospace_font = QFont(MONOSPACE_FONT)
+ self.cleaned_up = False
+ self.do_update_signal.connect(self.update)
+ self.icon_cashacct = QIcon(":icons/cashacct-logo.png" if not ColorScheme.dark_scheme else ":icons/cashacct-button-darkmode.png")
+ self.icon_openalias = QIcon(":icons/openalias-logo.svg")
+ self.icon_contacts = QIcon(":icons/tab_contacts.png")
+ self.icon_unverif = QIcon(":/icons/unconfirmed.svg")
+ # the below dict is ephemeral and goes away on wallet close --
+ # it's populated ultimately by the notify() subsystem in main_window
+ self._ca_pending_conf : Dict[str, Tuple[str, Address]] = dict() # "txid" -> ("name", Address)
+
+ if self.wallet.network:
+ self.wallet.network.register_callback(self._ca_callback, ['ca_verified_tx', 'ca_updated_minimal_chash'] )
+ self._ca_minimal_chash_updated_signal.connect(self._ca_update_chash)
+ self.parent.gui_object.cashaddr_toggled_signal.connect(self.update)
+
+
+ def clean_up(self):
+ self.cleaned_up = True
+ try: self._ca_minimal_chash_updated_signal.disconnect(self._ca_update_chash)
+ except TypeError: pass
+ try: self.do_update_signal.disconnect(self.update)
+ except TypeError: pass
+ try: self.parent.gui_object.cashaddr_toggled_signal.disconnect(self.update)
+ except TypeError: pass
+ if self.wallet.network:
+ self.wallet.network.unregister_callback(self._ca_callback)
+
+ def on_permit_edit(self, item, column):
+ # openalias items shouldn't be editable
+ if column == 2: # Label, always editable
+ return True
+ return item.data(0, self.DataRoles.Contact).type in ('address', 'cashacct')
+
+ def on_edited(self, item, column, prior_value):
+ contact = item.data(0, self.DataRoles.Contact)
+ if column == 2: # Label
+ label_key = contact.address
+ try: label_key = Address.from_string(label_key).to_storage_string()
+ except: pass
+ self.wallet.set_label(label_key, item.text(2))
+ self.update() # force refresh in case 2 contacts use the same address
+ return
+ # else.. Name
+ typ = contact.type
+ was_cur, was_sel = bool(self.currentItem()), item.isSelected()
+ name, value = item.text(1), item.text(3)
+ del item # paranoia
+
+ # On success, parent.set_contact returns the new key (address text)
+ # if 'cashacct'.. or always the same key for all other types.
+ key = self.parent.set_contact(name, value, typ=typ, replace=contact)
+
+ if key:
+ # Due to deferred updates, on_update will actually be called later.
+ # So, we have to save the edited item's "current" and "selected"
+ # status here. 'on_update' will look at this tuple and clear it
+ # after updating.
+ self._edited_item_cur_sel = (key, was_cur, was_sel)
+
+ def import_contacts(self):
+ wallet_folder = self.parent.get_wallet_folder()
+ filename, __ = QFileDialog.getOpenFileName(self.parent, "Select your wallet file", wallet_folder)
+ if not filename:
+ return
+ try:
+ num = self.parent.contacts.import_file(filename)
+ self.parent.show_message(_("{} contacts successfully imported.").format(num))
+ except Exception as e:
+ self.parent.show_error(_("Electron Cash was unable to import your contacts.") + "\n" + repr(e))
+ self.on_update()
+
+ def export_contacts(self):
+ if self.parent.contacts.empty:
+ self.parent.show_error(_("Your contact list is empty."))
+ return
+ try:
+ fileName = self.parent.getSaveFileName(_("Select file to save your contacts"), 'electron-cash-contacts.json', "*.json")
+ if fileName:
+ num = self.parent.contacts.export_file(fileName)
+ self.parent.show_message(_("{} contacts exported to '{}'").format(num, fileName))
+ except Exception as e:
+ self.parent.show_error(_("Electron Cash was unable to export your contacts.") + "\n" + repr(e))
+
+ def find_item(self, key: Contact) -> QTreeWidgetItem:
+ ''' Rather than store the item reference in a lambda, we store its key.
+ Storing the item reference can lead to C++ Runtime Errors if the
+ underlying QTreeWidgetItem is deleted on .update() while the right-click
+ menu is still up. This function returns a currently alive item given a
+ key. '''
+ for item in self.get_leaves():
+ if item.data(0, self.DataRoles.Contact) == key:
+ return item
+
+ def _on_edit_item(self, key : Contact, column : int):
+ ''' Callback from context menu, private method. '''
+ item = self.find_item(key)
+ if item:
+ self.editItem(item, column)
+
+ @staticmethod
+ def _i2c(item : QTreeWidgetItem) -> Contact:
+ return item.data(0, ContactList.DataRoles.Contact)
+
+ def _get_ca_unverified(self, include_temp=False) -> Set[Contact]:
+ i2c = self._i2c
+ types = ('cashacct', 'cashacct_W')
+ if include_temp:
+ types = (*types, 'cashacct_T')
+ return set(
+ i2c(item)
+ for item in self.get_leaves()
+ if i2c(item).type in types and not self.wallet.cashacct.get_verified(i2c(item).name)
+ )
+
+ def create_menu(self, position):
+ menu = QMenu()
+ selected = self.selectedItems()
+ i2c = self._i2c
+ ca_unverified = self._get_ca_unverified(include_temp=False)
+ if selected:
+ names = [item.text(1) for item in selected]
+ keys = [i2c(item) for item in selected]
+ payable_keys = [k for k in keys if k.type != 'cashacct_T']
+ deletable_keys = [k for k in keys if k.type in contact_types]
+ needs_verif_keys = [k for k in keys if k in ca_unverified]
+ column = self.currentColumn()
+ column_title = self.headerItem().text(column)
+ column_data = '\n'.join([item.text(column) for item in selected])
+ item = self.currentItem()
+ typ = i2c(item).type if item else 'unknown'
+ ca_info = None
+ if item and typ in ('cashacct', 'cashacct_W'):
+ ca_info = self.wallet.cashacct.get_verified(i2c(item).name)
+ if column == 1 and len(selected) == 1:
+ # hack .. for Cash Accounts just say "Copy Cash Account"
+ column_title = _('Cash Account')
+ if ca_info:
+ column_data = self.wallet.cashacct.fmt_info(ca_info, emoji=True)
+ if len(selected) > 1:
+ column_title += f" ({len(selected)})"
+ menu.addAction(_("Copy {}").format(column_title), lambda: self.parent.app.clipboard().setText(column_data))
+ if item and column in self.editable_columns and self.on_permit_edit(item, column):
+ key = item.data(0, self.DataRoles.Contact)
+ # this key & find_item business is so we don't hold a reference
+ # to the ephemeral item, which may be deleted while the
+ # context menu is up. Accessing the item after on_update runs
+ # means the item is deleted and you get a C++ object deleted
+ # runtime error.
+ menu.addAction(_("Edit {}").format(column_title), lambda: self._on_edit_item(key, column))
+ a = menu.addAction(_("Pay to"), lambda: self.parent.payto_contacts(payable_keys))
+ if needs_verif_keys or not payable_keys:
+ a.setDisabled(True)
+ a = menu.addAction(_("Delete"), lambda: self.parent.delete_contacts(deletable_keys))
+ if not deletable_keys:
+ a.setDisabled(True)
+ # Add sign/verify and encrypt/decrypt menu - but only if just 1 thing selected
+ if len(keys) == 1 and Address.is_valid(keys[0].address):
+ signAddr = Address.from_string(keys[0].address)
+ a = menu.addAction(_("Sign/verify message") + "...", lambda: self.parent.sign_verify_message(signAddr))
+ if signAddr.kind != Address.ADDR_P2PKH:
+ a.setDisabled(True) # We only allow this for P2PKH since it makes no sense for P2SH (ambiguous public key)
+ URLs = [web.BE_URL(self.config, 'addr', Address.from_string(key.address))
+ for key in keys if Address.is_valid(key.address)]
+ a = menu.addAction(_("View on block explorer"), lambda: [URL and webopen(URL) for URL in URLs])
+ if not any(URLs):
+ a.setDisabled(True)
+ if ca_info:
+ menu.addAction(_("View registration tx..."), lambda: self.parent.do_process_from_txid(txid=ca_info.txid, tx_desc=self.wallet.get_label(ca_info.txid)))
+ if typ in ('cashacct_W', 'cashacct'):
+ _contact_d = i2c(item)
+ menu.addAction(_("Details..."), lambda: cashacctqt.cash_account_detail_dialog(self.parent, _contact_d.name))
+
+ menu.addSeparator()
+
+ menu.addAction(self.icon_cashacct,
+ _("Add Contact") + " - " + _("Cash Account"), self.new_cash_account_contact_dialog)
+ menu.addAction(self.icon_contacts, _("Add Contact") + " - " + _("Address"), self.parent.new_contact_dialog)
+ menu.addSeparator()
+ menu.addAction(self.icon_cashacct,
+ _("Register Cash Account..."), self.parent.register_new_cash_account)
+ menu.addSeparator()
+ menu.addAction(QIcon(":icons/import.svg" if not ColorScheme.dark_scheme else ":icons/import_dark_theme.svg"),
+ _("Import file"), self.import_contacts)
+ if not self.parent.contacts.empty:
+ menu.addAction(QIcon(":icons/save.svg" if not ColorScheme.dark_scheme else ":icons/save_dark_theme.svg"),
+ _("Export file"), self.export_contacts)
+
+ menu.addSeparator()
+ a = menu.addAction(_("Show My Cash Accounts"), self.toggle_show_my_cashaccts)
+ a.setCheckable(True)
+ a.setChecked(self.show_my_cashaccts)
+
+ if ca_unverified:
+ def kick_off_verify():
+ bnums = set()
+ for contact in ca_unverified:
+ tup = self.wallet.cashacct.parse_string(contact.name)
+ if not tup:
+ continue
+ bnums.add(tup[1]) # number
+ ret = cashacctqt.verify_multiple_blocks(bnums, self.parent, self.wallet)
+ if ret is None:
+ # user cancel
+ return
+ verified = ca_unverified - self._get_ca_unverified()
+ if not verified:
+ self.parent.show_error(_("Cash Account verification failure"))
+
+ menu.addSeparator()
+ num = len(ca_unverified)
+ a = menu.addAction(self.icon_unverif,
+ ngettext("Verify {count} Cash Account",
+ "Verify {count} Cash Accounts",
+ num).format(count=num), kick_off_verify)
+ if not self.wallet.network:
+ a.setDisabled(True)
+
+ run_hook('create_contact_menu', menu, selected)
+ menu.exec_(self.viewport().mapToGlobal(position))
+
+ @property
+ def show_my_cashaccts(self) -> bool:
+ ''' Returns the current setting from wallet storage. '''
+ return bool(self.wallet.storage.get('contact_list_show_cash_accounts', True))
+
+ @show_my_cashaccts.setter
+ def show_my_cashaccts(self, b : bool):
+ ''' Saves the flag to wallet storage. Does not update GUI. '''
+ self.wallet.storage.put('contact_list_show_cash_accounts', bool(b))
+
+ def toggle_show_my_cashaccts(self):
+ ''' Toggles the flag in wallet storage, also updates GUI. '''
+ b = not self.show_my_cashaccts
+ self.show_my_cashaccts = b
+ self.update()
+ if b:
+ tip = _("Your own Cash Accounts are now shown")
+ else:
+ tip = _("Your own Cash Accounts are now hidden")
+ QToolTip.showText(QCursor.pos(), tip, self)
+
+ def get_full_contacts(self, include_pseudo_types: List[str] = ['cashacct']) -> List[Contact]:
+ """ Returns all the contacts, with the "My CashAcct" pseudo-contacts clobbering dupes of the same type that
+ were manually added. Client code should scan for type == 'cashacct' and type == 'cashacct_W' """
+ if not include_pseudo_types:
+ return self.parent.contacts.get_all(nocopy=True)
+ else:
+ contacts = [contact for contact in self.parent.contacts.get_all(nocopy=True)
+ if contact.type not in ['cashacct']
+ # or if it is, it can have invalid address as it's clearly 'not mine"
+ or not Address.is_valid(contact.address)
+ or not self.wallet.is_mine(Address.from_string(contact.address))]
+ if 'cashacct' in include_pseudo_types:
+ contacts = contacts + self._make_wallet_cashacct_pseudo_contacts()
+ return contacts
+
+ def _make_wallet_cashacct_pseudo_contacts(self, exclude_contacts = []) -> List[Contact]:
+ ''' Returns a list of 'fake' contacts that come from the wallet's
+ own registered Cash Accounts. These contacts do not exist in the
+ wallet.contacts object but are created on-the-fly from the
+ wallet.cashacct list of registered & verified Cash Accounts.
+
+ The creation of this list is relatively cheap and scales as the lookups
+ are O(logN) in the cashaccts caches.
+
+ This is a convenience so that the Contacts tab shows "my" cash accounts
+ after registration as well as external Cash Accounts. Note that the
+ "mine" entries won't be shown if the user explicitly added his own as
+ "external"... '''
+ try:
+ excl_chk = set((c.name, Address.from_string(c.address)) for c in exclude_contacts if c.type == 'cashacct')
+ except:
+ # Hmm.. invalid address?
+ excl_chk = set()
+ wallet_cashaccts = []
+ v_txids = set()
+ # Add the [Mine] pseudo-contacts
+ for ca_info in self.wallet.cashacct.get_wallet_cashaccounts():
+ v_txids.add(ca_info.txid)
+ name = self.wallet.cashacct.fmt_info(ca_info, emoji=False)
+ if (name, ca_info.address) in excl_chk:
+ continue
+ wallet_cashaccts.append(Contact(
+ name = name,
+ address = ca_info.address.to_ui_string(),
+ type = 'cashacct_W'
+ ))
+ # Add the [Pend] pseudo-contacts
+ for txid, tup in self._ca_pending_conf.copy().items():
+ if txid in v_txids or self.wallet.cashacct.is_verified(txid):
+ self._ca_pending_conf.pop(txid, None)
+ continue
+ if tup in excl_chk:
+ continue
+ name, address = tup
+ wallet_cashaccts.append(Contact(
+ name = name,
+ address = address.to_ui_string(),
+ type = 'cashacct_T'
+ ))
+ return wallet_cashaccts
+
+ @rate_limited(0.333, ts_after=True) # We rate limit the contact list refresh no more 3 per second
+ def update(self):
+ if self.cleaned_up:
+ # short-cut return if window was closed and wallet is stopped
+ return
+ super().update()
+
+ def on_update(self):
+ if self.cleaned_up:
+ return
+ item = self.currentItem()
+ current_contact = item.data(0, self.DataRoles.Contact) if item else None
+ selected = self.selectedItems() or []
+ selected_contacts = set(item.data(0, self.DataRoles.Contact) for item in selected)
+ del item, selected # must not hold a reference to a C++ object that will soon be deleted in self.clear()..
+ self.clear()
+ type_names = defaultdict(lambda: _("Unknown"))
+ type_names.update({
+ 'openalias' : _('OpenAlias'),
+ 'cashacct' : _('Cash Account'),
+ 'cashacct_W' : _('Cash Account') + ' [' + _('Mine') + ']',
+ 'cashacct_T' : _('Cash Account') + ' [' + _('Pend') + ']',
+ 'address' : _('Address'),
+ })
+ type_icons = {
+ 'openalias' : self.icon_openalias,
+ 'cashacct' : self.icon_cashacct,
+ 'cashacct_W' : self.icon_cashacct,
+ 'cashacct_T' : self.icon_unverif,
+ 'address' : self.icon_contacts,
+ }
+ selected_items, current_item = [], None
+ edited = self._edited_item_cur_sel
+ pseudo_types = []
+ if self.show_my_cashaccts:
+ pseudo_types.append('cashacct')
+ acceptable_type_set = {'cashacct', 'cashacct_W', 'cashacct_T', 'address'}
+ for contact in self.get_full_contacts(include_pseudo_types=pseudo_types):
+ _type, name, address = contact.type, contact.name, contact.address
+ label_key = address
+ if _type in acceptable_type_set:
+ try:
+ # try and re-parse and re-display the address based on current UI string settings
+ addy = Address.from_string(address)
+ address = addy.to_ui_string()
+ label_key = addy.to_storage_string()
+ del addy
+ except:
+ ''' This may happen because we may not have always enforced this as strictly as we could have in legacy code. Just move on.. '''
+ label = self.wallet.get_label(label_key)
+ item = QTreeWidgetItem(["", name, label, address, type_names[_type]])
+ item.setData(0, self.DataRoles.Contact, contact)
+ item.DataRole = self.DataRoles.Contact
+ if _type in ('cashacct', 'cashacct_W', 'cashacct_T'):
+ ca_info = self.wallet.cashacct.get_verified(name)
+ tt_warn = None
+ if ca_info:
+ if self.wallet.is_mine(ca_info.address) and not self.show_my_cashaccts:
+ # user may have added the contact to "self" manually
+ # but since they asked to not see their own cashaccts,
+ # we must do this to suppress it from being shown regardless
+ continue
+ item.setText(0, ca_info.emoji)
+ tt = _('Validated Cash Account: {emoji} {account_string}
').format(
+ emoji = ca_info.emoji,
+ account_string = f'{ca_info.name}#{ca_info.number}.{ca_info.collision_hash};'
+ )
+ else:
+ item.setIcon(0, self.icon_unverif)
+ if _type == 'cashacct_T':
+ tt_warn = tt = _('Cash Account pending confirmation and/or verification')
+ else:
+ tt_warn = tt = _('Warning: This Cash Account is not verified')
+ item.setToolTip(0, tt)
+ if tt_warn: item.setToolTip(1, tt_warn)
+ if _type in type_icons:
+ item.setIcon(4, type_icons[_type])
+ # always give the "Address" field a monospace font even if it's
+ # not strictly an address such as openalias...
+ item.setFont(3, self.monospace_font)
+ self.addTopLevelItem(item)
+ if contact == current_contact or (contact == edited[0] and edited[1]):
+ current_item = item # this key was the current item before and it hasn't gone away
+ if contact in selected_contacts or (contact == edited[0] and edited[2]):
+ selected_items.append(item) # this key was selected before and it hasn't gone away
+
+ if selected_items: # sometimes currentItem is set even if nothing actually selected. grr..
+ # restore current item & selections
+ if current_item:
+ # set the current item. this may also implicitly select it
+ self.setCurrentItem(current_item)
+ for item in selected_items:
+ # restore the previous selection
+ item.setSelected(True)
+ self._edited_item_cur_sel = (None,) * 3
+ run_hook('update_contacts_tab', self)
+
+ def new_cash_account_contact_dialog(self):
+ ''' Context menu callback. Shows the "New Cash Account Contact"
+ interface. '''
+
+ items = cashacctqt.lookup_cash_account_dialog(
+ self.parent, self.wallet, title=_("New Cash Account Contact"),
+ blurb = _("
Add anyone's Cash Account to your Contacts"),
+ button_type=cashacctqt.InfoGroupBox.ButtonType.Radio
+ )
+ if items:
+ info, min_chash, name = items[0]
+ self.parent.set_contact(name, info.address.to_ui_string(), typ='cashacct')
+ run_hook('update_contacts_tab', self)
+
+ def ca_update_potentially_unconfirmed_registrations(self, d : Dict[str, Tuple[str, Address]]):
+ added = 0
+ for txid, tup in d.items():
+ if self.wallet.cashacct.is_verified(txid):
+ continue
+ if txid not in self._ca_pending_conf:
+ name, address = tup
+ name += "#???.???;"
+ self._ca_pending_conf[txid] = (name, address)
+ added += 1
+ if added:
+ self.update()
+
+ def _ca_callback(self, e, *args):
+ ''' Called from the network thread '''
+ if self.cleaned_up or not args or args[0] != self.wallet.cashacct:
+ # not for us or we are cleaned_up
+ return
+ if e == 'ca_verified_tx':
+ # it's relevant to us when a verification comes in, so we need to
+ # schedule an update then. We don't check if the info object
+ # is "one of ours" because at this point it may be a NEW relevant
+ # contact.
+ self.do_update_signal.emit()
+ elif e == 'ca_updated_minimal_chash':
+ # In this case we do check if the update object is "one of ours"
+ # in the slot that this signal targets.
+ self._ca_minimal_chash_updated_signal.emit(args[1], args[2])
+
+ def _ca_update_chash(self, ca_info, ignored):
+ ''' Called in GUI thread as a result of the cash account subsystem
+ figuring out that a collision_hash can be represented shorter.
+ Kicked off by a get_minimal_chash() call that results in a cache miss. '''
+ if self.cleaned_up:
+ return
+ # performance -- don't update unless the new minimal_chash is one
+ # we care about
+ key = f'{ca_info.name}#{ca_info.number}'
+ items = self.findItems(key, Qt.MatchContains|Qt.MatchWrap|Qt.MatchRecursive, 1) or []
+ if items:
+ self.do_update_signal.emit()
diff --git a/electroncash_gui/qt/data/ecsupplemental_lnx.ttf b/electroncash_gui/qt/data/ecsupplemental_lnx.ttf
new file mode 100644
index 000000000000..265118cbe49e
Binary files /dev/null and b/electroncash_gui/qt/data/ecsupplemental_lnx.ttf differ
diff --git a/electroncash_gui/qt/data/ecsupplemental_win.ttf b/electroncash_gui/qt/data/ecsupplemental_win.ttf
new file mode 100644
index 000000000000..eb64c211fc02
Binary files /dev/null and b/electroncash_gui/qt/data/ecsupplemental_win.ttf differ
diff --git a/electroncash_gui/qt/data/fonts.xml b/electroncash_gui/qt/data/fonts.xml
new file mode 100644
index 000000000000..5a8e44bf3b7b
--- /dev/null
+++ b/electroncash_gui/qt/data/fonts.xml
@@ -0,0 +1,69 @@
+
+
+
+ /etc/fonts/fonts.conf
+
+
+ sans
+ EC Supplemental
+
+
+
+ serif
+ EC Supplemental
+
+
+
+ sans-serif
+ EC Supplemental
+
+
+
+ monospace
+ EC Supplemental
+
+
+
+
+
+
+
+ DejaVu Sans
+
+
+
+
+ DejaVu Serif
+
+
+
+
+ DejaVu Sans Mono
+
+
+
+
+
+
+
+
+ EC Supplemental
+
+
+
+ charset
+
+ 0x0023
+ 0x0026
+ 0x0027
+ 0x002b
+ 0x01f3
+ 0x01f4
+ 0x01f5
+ 0x01f6
+ 0x01f9
+
+
+
+
+
diff --git a/gui/qt/exception_window.py b/electroncash_gui/qt/exception_window.py
similarity index 84%
rename from gui/qt/exception_window.py
rename to electroncash_gui/qt/exception_window.py
index a7e167008069..d0fe0f19e4d2 100644
--- a/gui/qt/exception_window.py
+++ b/electroncash_gui/qt/exception_window.py
@@ -71,21 +71,26 @@ def __init__(self, config, exctype, value, tb):
self.setMinimumSize(600, 300)
main_box = QVBoxLayout()
+ main_box.setContentsMargins(20,20,20,20)
heading = QLabel('' + _('Sorry!') + '
')
main_box.addWidget(heading)
- main_box.addWidget(QLabel(_('Something went wrong running Electron Cash.')))
-
- main_box.addWidget(QLabel(
- _('To help us diagnose and fix the problem, you can send us a bug report that contains useful debug '
- 'information:')))
-
- collapse_info = QPushButton(_("Show report contents"))
- collapse_info.clicked.connect(lambda: QMessageBox.about(self, "Report contents", self.get_report_string()))
- main_box.addWidget(collapse_info)
-
- label = QLabel(_("Please briefly describe what led to the error (optional):") +"
"+
- ""+ _("Feel free to add your email address if you are willing to provide further detail, but note that it will appear in the relevant github issue.") +"")
+ l = QLabel(_('Something went wrong running Electron Cash.'))
+ l.setWordWrap(True)
+ main_box.addWidget(l)
+
+ l = QLabel(_('To help us diagnose and fix the problem, you can send us'
+ ' a bug report that contains useful debug information:'))
+ l.setWordWrap(True)
+ main_box.addWidget(l)
+
+ label = QLabel(
+ '
' + _("Please briefly describe what led to the error (optional):")
+ + '
' + '' +
+ _("Feel free to add your email address if you are willing to provide"
+ " further detail, but note that it will appear in the relevant"
+ " github issue.") + '')
+ label.setWordWrap(True)
label.setTextFormat(QtCore.Qt.RichText)
main_box.addWidget(label)
@@ -94,19 +99,26 @@ def __init__(self, config, exctype, value, tb):
self.description_textfield.setFixedHeight(50)
main_box.addWidget(self.description_textfield)
- main_box.addWidget(QLabel(_("Do you want to send this report?")))
buttons = QHBoxLayout()
+ l = QLabel(_("Do you want to send this report?"))
+ l.setWordWrap(True)
+
+ buttons.addWidget(l)
+
+ collapse_info = QPushButton(_("Show report contents"))
+ collapse_info.clicked.connect(lambda: QMessageBox.about(self, "Report contents", self.get_report_string()))
+
+ buttons.addWidget(collapse_info)
+
+ buttons.addStretch(1)
+
report_button = QPushButton(_('Send Bug Report'))
report_button.clicked.connect(self.send_report)
report_button.setIcon(QIcon(":icons/tab_send.png"))
buttons.addWidget(report_button)
- never_button = QPushButton(_('Never'))
- never_button.clicked.connect(self.show_never)
- buttons.addWidget(never_button)
-
close_button = QPushButton(_('Not Now'))
close_button.clicked.connect(self.close)
buttons.addWidget(close_button)
@@ -129,11 +141,6 @@ def on_close(self):
sys.__excepthook__(*self.exc_args)
self.close()
- def show_never(self):
- _disable(self.config)
- Exception_Hook.uninstall()
- self.close()
-
def closeEvent(self, event):
self.on_close()
event.accept()
@@ -174,11 +181,11 @@ def _show_window(config, exctype, value, tb):
if not Exception_Window._active_window:
Exception_Window._active_window = Exception_Window(config, exctype, value, tb)
-def _is_enabled(config):
- return config.get("show_crash_reporter", default=True)
+def is_enabled(config) -> bool:
+ return bool(config.get("show_crash_reporter2", default=True))
-def _disable(config):
- config.set_key("show_crash_reporter", False)
+def set_enabled(config, b: bool):
+ config.set_key("show_crash_reporter2", bool(b))
def _get_current_wallet_types():
wtypes = { str(getattr(w.wallet, 'wallet_type', 'Unknown'))
@@ -197,9 +204,6 @@ class Exception_Hook(QObject):
def __init__(self, config):
super().__init__(None) # Top-level Object
if Exception_Hook._instance: return # This is ok, we will be GC'd later.
- if not _is_enabled(config):
- print_error("[{}] Not installed due to user config.".format(__class__.__qualname__))
- return # self will get auto-gc'd
Exception_Hook._instance = self # strong reference to self should keep us alive until uninstall() is called
self.config = config
sys.excepthook = self.handler # yet another strong reference. We really won't die unless uninstall() is called
@@ -216,7 +220,7 @@ def uninstall():
Exception_Hook._instance = None
def handler(self, exctype, value, tb):
- if exctype is KeyboardInterrupt or exctype is SystemExit or not _is_enabled(self.config):
+ if exctype is KeyboardInterrupt or exctype is SystemExit or not is_enabled(self.config):
sys.__excepthook__(exctype, value, tb)
else:
self._report_exception.emit(self.config, exctype, value, tb)
diff --git a/gui/qt/external_plugins_window.py b/electroncash_gui/qt/external_plugins_window.py
similarity index 94%
rename from gui/qt/external_plugins_window.py
rename to electroncash_gui/qt/external_plugins_window.py
index 96a4da0f9b5f..12816f61f057 100644
--- a/gui/qt/external_plugins_window.py
+++ b/electroncash_gui/qt/external_plugins_window.py
@@ -49,12 +49,13 @@
ExternalPluginCodes.INVALID_MAMIFEST_VERSION: _("The plugin manifest lacks a valid version."),
ExternalPluginCodes.INVALID_MAMIFEST_MINIMUM_EC_VERSION: _("The plugin manifest lacks a valid minimum Electron Cash version."),
ExternalPluginCodes.INVALID_MAMIFEST_PACKAGE_NAME: _("The plugin manifest lacks a valid package name."),
+ ExternalPluginCodes.UNSPECIFIED_ERROR: _("An unspecified exception was raised. Cannot open plugin.")
}
class ExternalPluginsPreviewDialog(WindowModalDialog):
def __init__(self, plugin_dialog, main_window, title, plugin_path=None, plugin_metadata=None):
- WindowModalDialog.__init__(self, main_window.top_level_window(), title)
+ WindowModalDialog.__init__(self, parent=main_window.top_level_window(), title=title)
self.is_preview = plugin_metadata is None
@@ -203,10 +204,10 @@ def refresh_plugin(self):
available_for = self.plugin_metadata.get("available_for", [])
if "qt" in available_for:
self.qtInterfaceLabel.setToolTip(_("This interface is supported."))
- self.qtInterfaceLabel.setPixmap(QIcon(":icons/confirmed.png").pixmap(QSize(15, 15)))
+ self.qtInterfaceLabel.setPixmap(QIcon(":icons/confirmed.svg").pixmap(15))
if "cmdline" in available_for:
self.qtInterfaceLabel.setToolTip(_("This interface is supported."))
- self.cmdLineInterfaceLabel.setPixmap(QIcon(":icons/confirmed.png").pixmap(QSize(15, 15)))
+ self.cmdLineInterfaceLabel.setPixmap(QIcon(":icons/confirmed.svg").pixmap(15))
def refresh_ui(self):
are_widgets_enabled = self.is_plugin_valid()
@@ -248,12 +249,12 @@ def on_install(self):
class ExternalPluginsDialog(WindowModalDialog, MessageBoxMixin):
def __init__(self, parent, title):
- WindowModalDialog.__init__(self, parent.top_level_window(), title)
+ WindowModalDialog.__init__(self, parent=parent.top_level_window(), title=title)
self.main_window = parent
self.config = parent.config
self.setMinimumWidth(600)
- self.setMaximumWidth(600)
+ #self.setMaximumWidth(600)
vbox = QVBoxLayout(self)
@@ -274,12 +275,12 @@ def __init__(self, parent, title):
# The row of buttons under the plugin list for actions related to the plugins within it.
hbox = QHBoxLayout()
- self.installButton = QPushButton("Add Plugin")
+ self.installButton = QPushButton(_("Add Plugin"))
hbox.addWidget(self.installButton)
hbox.addStretch(1)
- self.settingsButton = QPushButton("Settings")
+ self.settingsButton = QPushButton(_("Settings"))
self.toggleButton = QPushButton("")
- self.uninstallButton = QPushButton("Uninstall")
+ self.uninstallButton = QPushButton(_("Uninstall"))
hbox.addWidget(self.settingsButton)
hbox.addWidget(self.toggleButton)
hbox.addWidget(self.uninstallButton)
@@ -404,11 +405,10 @@ def __init__(self, parent, main_window):
self.setSelectionBehavior(QAbstractItemView.SelectRows)
self.setSortingEnabled(False)
- self.horizontalHeader().setStretchLastSection(True)
verticalHeader = self.verticalHeader()
verticalHeader.setVisible(False)
- verticalHeader.setSectionResizeMode(QHeaderView.Fixed)
- verticalHeader.setDefaultSectionSize(80)
+ verticalHeader.setSectionResizeMode(QHeaderView.Fixed) # FIXME: won't look good on all platforms with all fonts
+ verticalHeader.setDefaultSectionSize(80) # FIXME: won't look good on all platforms with all fonts
self.setStyleSheet("QTableWidget::item { padding: 10px; }")
self.itemSelectionChanged.connect(self.on_item_selection_changed)
@@ -472,7 +472,13 @@ def refresh_ui(self):
self.setColumnWidth(1, 300)
self.setColumnWidth(2, 60)
self.setColumnWidth(3, 60)
- self.setHorizontalHeaderLabels([ "Name", "Description", "Version", "Enabled" ])
+ self.setHorizontalHeaderLabels([_("Name"), _("Description"), _("Version"), _("Enabled")])
+ header = self.horizontalHeader()
+ header.setStretchLastSection(False)
+ for col in range(header.count()):
+ sm = QHeaderView.Stretch if col == 1 else QHeaderView.ResizeToContents # description field is the stretch column, others are resized to contents
+ header.setSectionResizeMode(col, sm)
+ del header
self.row_keys = []
for row_index, (package_name, metadata) in enumerate(plugin_manager.external_plugin_metadata.items()):
diff --git a/gui/qt/fee_slider.py b/electroncash_gui/qt/fee_slider.py
similarity index 55%
rename from gui/qt/fee_slider.py
rename to electroncash_gui/qt/fee_slider.py
index e6cd6614187e..31d60b244a83 100644
--- a/gui/qt/fee_slider.py
+++ b/electroncash_gui/qt/fee_slider.py
@@ -5,8 +5,6 @@
from PyQt5.QtCore import *
from PyQt5.QtWidgets import QSlider, QToolTip
-import threading
-
class FeeSlider(QSlider):
def __init__(self, window, config, callback):
@@ -15,17 +13,15 @@ def __init__(self, window, config, callback):
self.window = window
self.callback = callback
self.dyn = False
- self.lock = threading.RLock()
self.update()
self.valueChanged.connect(self.moved)
def moved(self, pos):
- with self.lock:
- fee_rate = self.config.dynfee(pos) if self.dyn else self.config.static_fee(pos)
- tooltip = self.get_tooltip(pos, fee_rate)
- QToolTip.showText(QCursor.pos(), tooltip, self)
- self.setToolTip(tooltip)
- self.callback(self.dyn, pos, fee_rate)
+ fee_rate = self.config.dynfee(pos) if self.dyn else self.config.static_fee(pos)
+ tooltip = self.get_tooltip(pos, fee_rate)
+ QToolTip.showText(QCursor.pos(), tooltip, self)
+ self.setToolTip(tooltip)
+ self.callback(self.dyn, pos, fee_rate)
def get_tooltip(self, pos, fee_rate):
from electroncash.util import fee_levels
@@ -33,7 +29,7 @@ def get_tooltip(self, pos, fee_rate):
if self.config.has_custom_fee_rate():
tooltip = _('Custom rate: ') + rate_str
elif self.dyn:
- tooltip = fee_levels[pos] + '\n' + rate_str
+ tooltip = _(fee_levels[pos]) + '\n' + rate_str
else:
tooltip = _('Fixed rate: ') + rate_str
if self.config.has_fee_estimates():
@@ -48,25 +44,23 @@ def update(self):
self.update_no_custom_fee_rate()
def update_no_custom_fee_rate(self):
- with self.lock:
- self.fee_step = self.config.max_fee_rate() / 10
- fee_rate = self.config.fee_per_kb()
- pos = min(fee_rate / self.fee_step, 10)
- self.setRange(0, 9)
- self.setValue(pos)
- self.setEnabled(True)
- tooltip = self.get_tooltip(pos, fee_rate)
- self.setToolTip(tooltip)
+ self.fee_step = self.config.max_fee_rate() / 10
+ fee_rate = self.config.fee_per_kb()
+ pos = max(min(fee_rate / self.fee_step, 10) - 1, 0)
+ self.setEnabled(True)
+ self.setRange(0, 9)
+ self.setValue(int(pos))
+ tooltip = self.get_tooltip(pos, fee_rate)
+ self.setToolTip(tooltip)
# configuraing this as is done is here still required, can't just set range 0,0 to deactivate.
# chose to make this a seperate function from update for easier code maintainence
def update_has_custom_fee_rate(self):
- with self.lock:
- self.fee_step = self.config.max_fee_rate() / 10
- fee_rate = self.config.fee_per_kb()
- pos = max(0,min(fee_rate / self.fee_step, 1))
- self.setRange(0, 1)
- self.setValue(pos)
- self.setEnabled(False)
- tooltip = self.get_tooltip(pos, fee_rate)
- self.setToolTip(tooltip)
+ self.fee_step = self.config.max_fee_rate() / 10
+ fee_rate = self.config.fee_per_kb()
+ pos = max(0,min(fee_rate / self.fee_step, 1))
+ self.setRange(0, 1)
+ self.setValue(0)
+ self.setEnabled(False)
+ tooltip = self.get_tooltip(pos, fee_rate)
+ self.setToolTip(tooltip)
diff --git a/gui/qt/history_list.py b/electroncash_gui/qt/history_list.py
similarity index 64%
rename from gui/qt/history_list.py
rename to electroncash_gui/qt/history_list.py
index 727ece76b90d..e96b7e882864 100644
--- a/gui/qt/history_list.py
+++ b/electroncash_gui/qt/history_list.py
@@ -23,45 +23,51 @@
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
-import webbrowser
-
from .util import *
import electroncash.web as web
-from electroncash.i18n import _
+from electroncash.i18n import _, ngettext
from electroncash.util import timestamp_to_datetime, profiler, Weak
+from electroncash.plugins import run_hook
TX_ICONS = [
"warning.png",
"warning.png",
- "unconfirmed.png",
- "unconfirmed.png",
- "clock1.png",
- "clock2.png",
- "clock3.png",
- "clock4.png",
- "clock5.png",
- "confirmed.png",
+ "unconfirmed.svg",
+ "unconfirmed.svg",
+ "clock1.svg",
+ "clock2.svg",
+ "clock3.svg",
+ "clock4.svg",
+ "clock5.svg",
+ "confirmed.svg",
]
-
class HistoryList(MyTreeWidget):
filter_columns = [2, 3, 4] # Date, Description, Amount
+ filter_data_columns = [0] # Allow search on tx_hash (string)
statusIcons = {}
+ default_sort = MyTreeWidget.SortSpec(0, Qt.AscendingOrder)
- def __init__(self, parent=None):
- super().__init__(parent, self.create_menu, [], 3)
+ def __init__(self, parent):
+ super().__init__(parent, self.create_menu, [], 3, deferred_updates=True)
self.refresh_headers()
self.setColumnHidden(1, True)
- self.setSortingEnabled(True)
- self.sortByColumn(0, Qt.AscendingOrder)
# force attributes to always be defined, even if None, at construction.
self.wallet = self.parent.wallet
+ self.cleaned_up = False
self.monospaceFont = QFont(MONOSPACE_FONT)
self.withdrawalBrush = QBrush(QColor("#BC1E1E"))
self.invoiceIcon = QIcon(":icons/seal")
+ self.cashTokensIcon = QIcon(":icons/tab_token.svg")
self._item_cache = Weak.ValueDictionary()
+ self.itemChanged.connect(self.item_changed)
+
+ self.has_unknown_balances = False
+
+ def clean_up(self):
+ self.cleaned_up = True
def refresh_headers(self):
headers = ['', '', _('Date'), _('Description') , _('Amount'), _('Balance')]
@@ -76,7 +82,7 @@ def get_domain(self):
@rate_limited(1.0, classlevel=True, ts_after=True) # We rate limit the history list refresh no more than once every second, app-wide
def update(self):
- if self.wallet and (not self.wallet.thread or not self.wallet.thread.isRunning()):
+ if self.cleaned_up:
# short-cut return if window was closed and wallet is stopped
return
super().update()
@@ -98,7 +104,7 @@ def addTopLevelItem(self, item, tx_hash=None):
self._item_cache[tx_hash] = item
@classmethod
- def _get_icon_for_status(cls, status):
+ def get_icon_for_status(cls, status):
ret = cls.statusIcons.get(status)
if not ret:
cls.statusIcons[status] = ret = QIcon(":icons/" + TX_ICONS[status])
@@ -107,19 +113,34 @@ def _get_icon_for_status(cls, status):
@profiler
def on_update(self):
self.wallet = self.parent.wallet
- h = self.wallet.get_history(self.get_domain(), reverse=True)
+ h = self.wallet.get_history(self.get_domain(), reverse=True, receives_before_sends=True,
+ include_tokens=True, include_tokens_balances=False)
sels = self.selectedItems()
current_tx = sels[0].data(0, Qt.UserRole) if sels else None
del sels # make sure not to hold stale ref to C++ list of items which will be deleted in clear() call below
self.clear()
+ self.has_unknown_balances = False
fx = self.parent.fx
if fx: fx.history_used_spot = False
for h_item in h:
- tx_hash, height, conf, timestamp, value, balance = h_item
+ tx_hash, height, conf, timestamp, value, balance, token_deltas, token_balances = h_item
label = self.wallet.get_label(tx_hash)
+ should_skip = run_hook("history_list_filter", self, h_item[:6], label, multi=True) or []
+ if any(should_skip):
+ # For implementation of fast plugin filters (such as CashShuffle
+ # shuffle tx filtering), we short-circuit return. This is
+ # faster than using the MyTreeWidget filter definted in .util
+ continue
+ if value is None or balance is None:
+ # Workaround to the fact that sometimes the wallet doesn't
+ # know the actual balance for history items while it's
+ # downloading history, and we want to flag that situation
+ # and redraw the GUI sometime later when it finishes updating.
+ # This flag is checked in main_window.py, TxUpadteMgr class.
+ self.has_unknown_balances = True
status, status_str = self.wallet.get_tx_status(tx_hash, height, conf, timestamp)
has_invoice = self.wallet.invoices.paid.get(tx_hash)
- icon = self._get_icon_for_status(status)
+ icon = self.get_icon_for_status(status)
v_str = self.parent.format_amount(value, True, whitespaces=True)
balance_str = self.parent.format_amount(balance, whitespaces=True)
entry = ['', tx_hash, status_str, label, v_str, balance_str]
@@ -134,14 +155,22 @@ def on_update(self):
item.setData(0, SortableTreeWidgetItem.DataRole, (status, conf))
if has_invoice:
item.setIcon(3, self.invoiceIcon)
+ elif token_deltas:
+ item.setIcon(3, self.cashTokensIcon)
+ num = len(token_deltas)
+ item.setToolTip(3, ngettext("Transaction contains {num} CashToken category involving this wallet",
+ "Transaction contains {num} CashToken categories involving this wallet",
+ num).format(num=num))
+ item.setToolTip(2, item.toolTip(3))
for i in range(len(entry)):
if i>3:
- item.setTextAlignment(i, Qt.AlignRight)
+ item.setTextAlignment(i, Qt.AlignRight | Qt.AlignVCenter)
if i!=2:
item.setFont(i, self.monospaceFont)
if value and value < 0:
item.setForeground(3, self.withdrawalBrush)
item.setForeground(4, self.withdrawalBrush)
+ item.setForeground(6, self.withdrawalBrush)
item.setData(0, Qt.UserRole, tx_hash)
self.addTopLevelItem(item, tx_hash)
if current_tx == tx_hash:
@@ -162,23 +191,55 @@ def on_doubleclick(self, item, column):
self.parent.show_transaction(tx, label)
def update_labels(self):
+ if self.should_defer_update_incr():
+ return
root = self.invisibleRootItem()
child_count = root.childCount()
for i in range(child_count):
item = root.child(i)
txid = item.data(0, Qt.UserRole)
- label = self.wallet.get_label(txid)
- item.setText(3, label)
+ h_label = self.wallet.get_label(txid)
+ current_label = item.text(3)
+ item.setText(3, h_label)
+ if current_label != h_label:
+ self.item_changed(item, 3)
+
+ def item_changed(self, item, column):
+ # Run the label of the changed item thru the filter hook
+ if column != 3:
+ return
+
+ label = item.text(3)
+ # NB: 'h_item' parameter is None due to performance reasons
+ should_skip = run_hook("history_list_filter", self, None, label, multi=True) or []
+ if any(should_skip):
+ item.setHidden(True)
def update_item(self, tx_hash, height, conf, timestamp):
if not self.wallet: return # can happen on startup if this is called before self.on_update()
item = self._item_cache.get(tx_hash)
if item:
+ idx = self.invisibleRootItem().indexOfChild(item)
+ was_cur = False
+ if idx > -1:
+ # We must take the child out of the view when updating.
+ # This is because otherwise for widgets with many thousands of
+ # items, this method becomes *horrendously* slow (500ms per
+ # call!)... but doing this hack makes it fast (~1ms per call).
+ was_cur = self.currentItem() is item
+ self.invisibleRootItem().takeChild(idx)
status, status_str = self.wallet.get_tx_status(tx_hash, height, conf, timestamp)
- icon = self._get_icon_for_status(status)
+ icon = self.get_icon_for_status(status)
if icon: item.setIcon(0, icon)
item.setData(0, SortableTreeWidgetItem.DataRole, (status, conf))
item.setText(2, status_str)
+ if idx > -1:
+ # Now, put the item back again
+ self.invisibleRootItem().insertChild(idx, item)
+ if was_cur:
+ self.setCurrentItem(item)
+ elif self.should_defer_update_incr():
+ return False
return bool(item) # indicate to client code whether an actual update occurred
def create_menu(self, position):
@@ -189,7 +250,7 @@ def create_menu(self, position):
tx_hash = item.data(0, Qt.UserRole)
if not tx_hash:
return
- if column is 0:
+ if column == 0:
column_title = "ID"
column_data = tx_hash
else:
@@ -200,25 +261,23 @@ def create_menu(self, position):
height, conf, timestamp = self.wallet.get_tx_height(tx_hash)
tx = self.wallet.transactions.get(tx_hash)
if not tx: return # this happens sometimes on wallet synch when first starting up.
- is_relevant, is_mine, v, fee = self.wallet.get_wallet_delta(tx)
is_unconfirmed = height <= 0
pr_key = self.wallet.invoices.paid.get(tx_hash)
menu = QMenu()
- menu.addAction(_("Copy {}").format(column_title), lambda: self.parent.app.clipboard().setText(column_data))
+ menu.addAction(_("&Copy {}").format(column_title), lambda: self.parent.app.clipboard().setText(column_data.strip()))
if column in self.editable_columns:
# We grab a fresh reference to the current item, as it has been deleted in a reported issue.
- menu.addAction(_("Edit {}").format(column_title),
+ menu.addAction(_("&Edit {}").format(column_title),
lambda: self.currentItem() and self.editItem(self.currentItem(), column))
label = self.wallet.get_label(tx_hash) or None
- menu.addAction(_("Details"), lambda: self.parent.show_transaction(tx, label))
- if is_unconfirmed and tx:
- child_tx = self.wallet.cpfp(tx, 0)
- if child_tx:
- menu.addAction(_("Child pays for parent"), lambda: self.parent.cpfp(tx, child_tx))
+ menu.addAction(_("&Details"), lambda: self.parent.show_transaction(tx, label))
if pr_key:
menu.addAction(self.invoiceIcon, _("View invoice"), lambda: self.parent.show_invoice(pr_key))
if tx_URL:
- menu.addAction(_("View on block explorer"), lambda: webbrowser.open(tx_URL))
+ menu.addAction(_("View on block explorer"), lambda: webopen(tx_URL))
+
+ run_hook("history_list_context_menu_setup", self, menu, item, tx_hash) # Plugins can modify menu
+
menu.exec_(self.viewport().mapToGlobal(position))
diff --git a/electroncash_gui/qt/icons.py b/electroncash_gui/qt/icons.py
new file mode 100644
index 000000000000..1f2f93418546
--- /dev/null
+++ b/electroncash_gui/qt/icons.py
@@ -0,0 +1,19767 @@
+# -*- coding: utf-8 -*-
+
+# Resource object code
+#
+# Created by: The Resource Compiler for PyQt5 (Qt v5.15.2)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x13\x19\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
+\x6e\x6f\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x43\x72\x65\x61\x74\
+\x65\x64\x20\x77\x69\x74\x68\x20\x49\x6e\x6b\x73\x63\x61\x70\x65\
+\x20\x28\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x2e\x6f\x72\x67\x2f\x29\x20\x2d\x2d\x3e\x0a\
+\x3c\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x36\x34\x22\
+\x20\x77\x69\x64\x74\x68\x3d\x22\x36\x34\x22\x20\x78\x6d\x6c\x6e\
+\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\
+\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\
+\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\
+\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x3e\x0a\x20\x20\x3c\x64\x65\
+\x66\x73\x3e\x0a\x20\x20\x20\x20\x3c\x66\x69\x6c\x74\x65\x72\x20\
+\x69\x64\x3d\x22\x66\x69\x6c\x74\x65\x72\x33\x35\x31\x36\x22\x3e\
+\x0a\x20\x20\x20\x20\x20\x20\x3c\x66\x65\x47\x61\x75\x73\x73\x69\
+\x61\x6e\x42\x6c\x75\x72\x20\x73\x74\x64\x44\x65\x76\x69\x61\x74\
+\x69\x6f\x6e\x3d\x22\x2e\x35\x31\x38\x36\x31\x33\x35\x39\x22\x2f\
+\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x66\x69\x6c\x74\x65\x72\x3e\x0a\
+\x20\x20\x20\x20\x3c\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\
+\x65\x6e\x74\x20\x69\x64\x3d\x22\x6c\x69\x6e\x65\x61\x72\x47\x72\
+\x61\x64\x69\x65\x6e\x74\x33\x35\x33\x35\x22\x3e\x0a\x20\x20\x20\
+\x20\x20\x20\x3c\x73\x74\x6f\x70\x20\x6f\x66\x66\x73\x65\x74\x3d\
+\x22\x30\x22\x20\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3d\x22\
+\x23\x66\x39\x63\x63\x63\x61\x22\x2f\x3e\x0a\x20\x20\x20\x20\x20\
+\x20\x3c\x73\x74\x6f\x70\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\
+\x22\x20\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x66\
+\x39\x63\x63\x63\x61\x22\x20\x73\x74\x6f\x70\x2d\x6f\x70\x61\x63\
+\x69\x74\x79\x3d\x22\x30\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x2f\
+\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\x0a\
+\x20\x20\x20\x20\x3c\x66\x69\x6c\x74\x65\x72\x20\x69\x64\x3d\x22\
+\x66\x69\x6c\x74\x65\x72\x33\x37\x33\x32\x22\x3e\x0a\x20\x20\x20\
+\x20\x20\x20\x3c\x66\x65\x47\x61\x75\x73\x73\x69\x61\x6e\x42\x6c\
+\x75\x72\x20\x73\x74\x64\x44\x65\x76\x69\x61\x74\x69\x6f\x6e\x3d\
+\x22\x2e\x34\x38\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x66\x69\
+\x6c\x74\x65\x72\x3e\x0a\x20\x20\x20\x20\x3c\x6c\x69\x6e\x65\x61\
+\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x20\x69\x64\x3d\x22\x6c\x69\
+\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x32\x33\x38\x33\
+\x22\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x54\x72\x61\x6e\x73\x66\
+\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\x28\x2e\x36\x36\x36\
+\x36\x36\x36\x36\x20\x30\x20\x30\x20\x2e\x38\x33\x33\x33\x33\x33\
+\x32\x20\x2d\x32\x39\x2e\x33\x33\x33\x33\x34\x35\x20\x2d\x34\x34\
+\x2e\x36\x36\x36\x36\x35\x31\x29\x22\x20\x67\x72\x61\x64\x69\x65\
+\x6e\x74\x55\x6e\x69\x74\x73\x3d\x22\x75\x73\x65\x72\x53\x70\x61\
+\x63\x65\x4f\x6e\x55\x73\x65\x22\x20\x78\x31\x3d\x22\x39\x33\x2e\
+\x30\x39\x39\x38\x33\x38\x22\x20\x78\x32\x3d\x22\x39\x33\x2e\x30\
+\x39\x39\x38\x33\x38\x22\x20\x79\x31\x3d\x22\x31\x31\x32\x2e\x30\
+\x38\x32\x34\x31\x22\x20\x79\x32\x3d\x22\x36\x36\x2e\x38\x33\x32\
+\x37\x32\x36\x22\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x73\x74\x6f\
+\x70\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x30\x22\x20\x73\x74\x6f\
+\x70\x2d\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x65\x30\x65\x30\x65\x30\
+\x22\x2f\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x73\x74\x6f\x70\x20\
+\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\x22\x20\x73\x74\x6f\x70\x2d\
+\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x66\x66\x66\x22\x2f\x3e\x0a\x20\
+\x20\x20\x20\x3c\x2f\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\
+\x65\x6e\x74\x3e\x0a\x20\x20\x20\x20\x3c\x72\x61\x64\x69\x61\x6c\
+\x47\x72\x61\x64\x69\x65\x6e\x74\x20\x69\x64\x3d\x22\x72\x61\x64\
+\x69\x61\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\x32\x33\x38\x36\x22\
+\x20\x63\x78\x3d\x22\x33\x34\x2e\x32\x38\x31\x32\x35\x22\x20\x63\
+\x79\x3d\x22\x39\x31\x2e\x39\x39\x38\x32\x39\x31\x22\x20\x67\x72\
+\x61\x64\x69\x65\x6e\x74\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\
+\x22\x6d\x61\x74\x72\x69\x78\x28\x35\x2e\x32\x38\x31\x39\x32\x36\
+\x35\x20\x30\x20\x30\x20\x33\x2e\x34\x32\x35\x33\x38\x30\x39\x20\
+\x2d\x31\x34\x39\x2e\x30\x37\x31\x30\x37\x20\x2d\x32\x38\x33\x2e\
+\x31\x32\x39\x31\x38\x29\x22\x20\x67\x72\x61\x64\x69\x65\x6e\x74\
+\x55\x6e\x69\x74\x73\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\
+\x4f\x6e\x55\x73\x65\x22\x20\x72\x3d\x22\x36\x22\x3e\x0a\x20\x20\
+\x20\x20\x20\x20\x3c\x73\x74\x6f\x70\x20\x6f\x66\x66\x73\x65\x74\
+\x3d\x22\x30\x22\x20\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3d\
+\x22\x23\x35\x39\x30\x30\x30\x30\x22\x2f\x3e\x0a\x20\x20\x20\x20\
+\x20\x20\x3c\x73\x74\x6f\x70\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\
+\x31\x22\x20\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3d\x22\x23\
+\x35\x39\x30\x30\x30\x30\x22\x20\x73\x74\x6f\x70\x2d\x6f\x70\x61\
+\x63\x69\x74\x79\x3d\x22\x30\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\
+\x2f\x72\x61\x64\x69\x61\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\
+\x0a\x20\x20\x20\x20\x3c\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\
+\x69\x65\x6e\x74\x20\x69\x64\x3d\x22\x6c\x69\x6e\x65\x61\x72\x47\
+\x72\x61\x64\x69\x65\x6e\x74\x32\x33\x38\x39\x22\x20\x67\x72\x61\
+\x64\x69\x65\x6e\x74\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\
+\x6d\x61\x74\x72\x69\x78\x28\x2e\x38\x37\x36\x32\x38\x33\x31\x20\
+\x30\x20\x30\x20\x2e\x38\x30\x39\x33\x36\x36\x38\x20\x2e\x34\x34\
+\x30\x30\x39\x39\x20\x2d\x34\x34\x2e\x35\x36\x30\x37\x38\x32\x29\
+\x22\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\x3d\
+\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\x22\
+\x20\x78\x31\x3d\x22\x34\x31\x2e\x32\x34\x36\x38\x32\x36\x22\x20\
+\x78\x32\x3d\x22\x33\x38\x2e\x37\x33\x37\x39\x31\x39\x22\x20\x78\
+\x6c\x69\x6e\x6b\x3a\x68\x72\x65\x66\x3d\x22\x23\x6c\x69\x6e\x65\
+\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x33\x35\x33\x35\x22\x20\
+\x79\x31\x3d\x22\x35\x38\x2e\x38\x35\x31\x36\x35\x34\x22\x20\x79\
+\x32\x3d\x22\x31\x30\x34\x2e\x36\x39\x32\x30\x32\x22\x2f\x3e\x0a\
+\x20\x20\x20\x20\x3c\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\
+\x65\x6e\x74\x20\x69\x64\x3d\x22\x6c\x69\x6e\x65\x61\x72\x47\x72\
+\x61\x64\x69\x65\x6e\x74\x32\x33\x39\x32\x22\x20\x67\x72\x61\x64\
+\x69\x65\x6e\x74\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\
+\x61\x74\x72\x69\x78\x28\x2e\x38\x38\x33\x32\x34\x35\x35\x20\x30\
+\x20\x30\x20\x2e\x38\x30\x35\x30\x33\x31\x35\x20\x2e\x30\x35\x32\
+\x39\x39\x37\x20\x2d\x34\x34\x2e\x33\x30\x31\x38\x38\x39\x29\x22\
+\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\x3d\x22\
+\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\x22\x20\
+\x78\x31\x3d\x22\x36\x35\x2e\x34\x39\x30\x38\x30\x37\x22\x20\x78\
+\x32\x3d\x22\x35\x34\x2e\x34\x32\x37\x34\x31\x38\x22\x20\x78\x6c\
+\x69\x6e\x6b\x3a\x68\x72\x65\x66\x3d\x22\x23\x6c\x69\x6e\x65\x61\
+\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x33\x35\x33\x35\x22\x20\x79\
+\x31\x3d\x22\x31\x30\x31\x2e\x31\x37\x35\x38\x39\x22\x20\x79\x32\
+\x3d\x22\x37\x34\x2e\x33\x32\x37\x32\x37\x38\x22\x2f\x3e\x0a\x20\
+\x20\x20\x20\x3c\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\
+\x6e\x74\x20\x69\x64\x3d\x22\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\
+\x64\x69\x65\x6e\x74\x32\x33\x39\x35\x22\x20\x67\x72\x61\x64\x69\
+\x65\x6e\x74\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\
+\x74\x72\x69\x78\x28\x2e\x38\x37\x37\x31\x33\x34\x31\x20\x30\x20\
+\x30\x20\x2e\x38\x30\x35\x30\x30\x31\x20\x2e\x34\x36\x34\x35\x32\
+\x38\x20\x2d\x34\x34\x2e\x32\x39\x38\x38\x33\x33\x29\x22\x20\x67\
+\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\x3d\x22\x75\x73\
+\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\x22\x20\x78\x31\
+\x3d\x22\x35\x37\x2e\x34\x37\x37\x39\x36\x36\x22\x20\x78\x32\x3d\
+\x22\x37\x31\x2e\x30\x36\x39\x34\x37\x33\x22\x20\x78\x6c\x69\x6e\
+\x6b\x3a\x68\x72\x65\x66\x3d\x22\x23\x6c\x69\x6e\x65\x61\x72\x47\
+\x72\x61\x64\x69\x65\x6e\x74\x33\x35\x33\x35\x22\x20\x79\x31\x3d\
+\x22\x34\x38\x2e\x37\x38\x34\x32\x33\x37\x22\x20\x79\x32\x3d\x22\
+\x31\x30\x33\x2e\x32\x39\x36\x37\x38\x22\x2f\x3e\x0a\x20\x20\x20\
+\x20\x3c\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\
+\x20\x69\x64\x3d\x22\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\
+\x65\x6e\x74\x32\x33\x39\x39\x22\x20\x67\x72\x61\x64\x69\x65\x6e\
+\x74\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\
+\x69\x78\x28\x30\x20\x31\x20\x2d\x31\x20\x30\x20\x2d\x33\x39\x2e\
+\x39\x39\x38\x35\x20\x31\x34\x30\x2e\x30\x30\x32\x39\x29\x22\x20\
+\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\x3d\x22\x75\
+\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\x22\x20\x78\
+\x31\x3d\x22\x2d\x37\x30\x2e\x30\x30\x32\x38\x39\x39\x22\x20\x78\
+\x32\x3d\x22\x2d\x31\x31\x2e\x39\x31\x36\x34\x38\x22\x20\x79\x31\
+\x3d\x22\x2d\x33\x38\x33\x2e\x39\x39\x37\x31\x22\x20\x79\x32\x3d\
+\x22\x2d\x33\x38\x33\x2e\x39\x39\x37\x31\x22\x3e\x0a\x20\x20\x20\
+\x20\x20\x20\x3c\x73\x74\x6f\x70\x20\x6f\x66\x66\x73\x65\x74\x3d\
+\x22\x30\x22\x20\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3d\x22\
+\x23\x65\x32\x30\x38\x30\x30\x22\x2f\x3e\x0a\x20\x20\x20\x20\x20\
+\x20\x3c\x73\x74\x6f\x70\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\
+\x22\x20\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x62\
+\x66\x30\x33\x30\x33\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x6c\
+\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\x0a\x20\
+\x20\x20\x20\x3c\x72\x61\x64\x69\x61\x6c\x47\x72\x61\x64\x69\x65\
+\x6e\x74\x20\x69\x64\x3d\x22\x72\x61\x64\x69\x61\x6c\x47\x72\x61\
+\x64\x69\x65\x6e\x74\x32\x34\x30\x31\x22\x20\x63\x78\x3d\x22\x33\
+\x36\x2e\x30\x31\x34\x34\x22\x20\x63\x79\x3d\x22\x31\x32\x37\x2e\
+\x37\x32\x32\x39\x38\x22\x20\x66\x79\x3d\x22\x31\x34\x31\x2e\x31\
+\x34\x34\x39\x31\x22\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x54\x72\
+\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\x28\
+\x2e\x38\x35\x32\x32\x36\x31\x20\x30\x20\x30\x20\x2e\x32\x34\x34\
+\x39\x32\x31\x35\x20\x35\x2e\x33\x32\x30\x37\x33\x33\x20\x38\x37\
+\x2e\x34\x31\x32\x32\x35\x38\x29\x22\x20\x67\x72\x61\x64\x69\x65\
+\x6e\x74\x55\x6e\x69\x74\x73\x3d\x22\x75\x73\x65\x72\x53\x70\x61\
+\x63\x65\x4f\x6e\x55\x73\x65\x22\x20\x72\x3d\x22\x33\x31\x2e\x39\
+\x38\x35\x36\x22\x20\x78\x6c\x69\x6e\x6b\x3a\x68\x72\x65\x66\x3d\
+\x22\x23\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\
+\x33\x35\x33\x35\x22\x2f\x3e\x0a\x20\x20\x3c\x2f\x64\x65\x66\x73\
+\x3e\x0a\x20\x20\x3c\x67\x3e\x0a\x20\x20\x20\x20\x3c\x63\x69\x72\
+\x63\x6c\x65\x20\x63\x78\x3d\x22\x33\x34\x33\x2e\x39\x39\x38\x39\
+\x39\x22\x20\x63\x79\x3d\x22\x39\x32\x22\x20\x66\x69\x6c\x6c\x3d\
+\x22\x75\x72\x6c\x28\x23\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\
+\x69\x65\x6e\x74\x32\x33\x39\x39\x29\x22\x20\x72\x3d\x22\x33\x36\
+\x22\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\
+\x72\x69\x78\x28\x2d\x2e\x38\x35\x38\x34\x32\x34\x38\x20\x2e\x32\
+\x33\x30\x30\x31\x33\x39\x20\x2d\x2e\x32\x33\x30\x30\x31\x34\x34\
+\x20\x2d\x2e\x38\x35\x38\x34\x32\x33\x35\x20\x33\x34\x38\x2e\x34\
+\x35\x38\x35\x39\x20\x33\x31\x2e\x38\x35\x30\x34\x30\x35\x29\x22\
+\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\
+\x6d\x33\x35\x2e\x37\x30\x31\x35\x30\x39\x20\x31\x32\x33\x2e\x37\
+\x35\x63\x2d\x32\x2e\x36\x33\x38\x31\x39\x36\x2d\x2e\x30\x32\x35\
+\x38\x32\x2d\x35\x2e\x33\x30\x33\x33\x34\x2d\x2e\x33\x37\x39\x35\
+\x36\x2d\x37\x2e\x39\x36\x38\x37\x35\x2d\x31\x2e\x30\x39\x33\x37\
+\x35\x2d\x31\x36\x2e\x31\x33\x39\x32\x39\x39\x2d\x34\x2e\x33\x32\
+\x34\x35\x31\x2d\x32\x36\x2e\x30\x36\x35\x30\x30\x39\x37\x2d\x32\
+\x30\x2e\x32\x38\x34\x36\x39\x2d\x32\x33\x2e\x32\x31\x38\x37\x34\
+\x39\x36\x2d\x33\x36\x2e\x34\x33\x37\x35\x20\x37\x2e\x39\x30\x31\
+\x35\x34\x34\x36\x2d\x31\x2e\x34\x32\x30\x38\x30\x33\x20\x31\x36\
+\x2e\x34\x39\x38\x39\x37\x32\x36\x2d\x32\x2e\x32\x31\x38\x37\x35\
+\x20\x32\x35\x2e\x34\x39\x39\x39\x39\x39\x36\x2d\x32\x2e\x32\x31\
+\x38\x37\x35\x20\x31\x33\x2e\x39\x36\x33\x32\x36\x32\x20\x30\x20\
+\x32\x36\x2e\x39\x36\x34\x33\x39\x31\x20\x31\x2e\x38\x39\x31\x36\
+\x37\x37\x20\x33\x37\x2e\x38\x37\x35\x20\x35\x2e\x31\x32\x35\x2e\
+\x32\x39\x35\x32\x32\x38\x20\x33\x2e\x35\x36\x39\x39\x35\x34\x2e\
+\x30\x31\x31\x31\x39\x36\x20\x37\x2e\x32\x34\x39\x30\x34\x31\x2d\
+\x2e\x39\x36\x38\x37\x35\x20\x31\x30\x2e\x39\x30\x36\x32\x35\x2d\
+\x33\x2e\x38\x35\x36\x36\x35\x20\x31\x34\x2e\x33\x39\x33\x32\x31\
+\x2d\x31\x36\x2e\x39\x37\x32\x34\x39\x31\x20\x32\x33\x2e\x38\x35\
+\x38\x31\x39\x2d\x33\x31\x2e\x32\x31\x38\x37\x35\x20\x32\x33\x2e\
+\x37\x31\x38\x37\x35\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x75\x72\
+\x6c\x28\x23\x72\x61\x64\x69\x61\x6c\x47\x72\x61\x64\x69\x65\x6e\
+\x74\x32\x34\x30\x31\x29\x22\x20\x66\x69\x6c\x74\x65\x72\x3d\x22\
+\x75\x72\x6c\x28\x23\x66\x69\x6c\x74\x65\x72\x33\x35\x31\x36\x29\
+\x22\x20\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x2e\x39\x22\x20\x74\
+\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\
+\x28\x2e\x38\x36\x32\x39\x37\x37\x32\x20\x30\x20\x30\x20\x2e\x38\
+\x36\x32\x39\x37\x37\x32\x20\x31\x2e\x33\x30\x34\x36\x37\x34\x20\
+\x2d\x34\x36\x2e\x37\x39\x34\x37\x34\x33\x29\x22\x2f\x3e\x0a\x20\
+\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x6d\x33\x31\x2e\
+\x37\x36\x37\x32\x35\x20\x34\x2e\x30\x30\x31\x32\x32\x33\x37\x63\
+\x2d\x32\x2e\x33\x31\x34\x30\x35\x33\x2e\x30\x32\x30\x37\x38\x36\
+\x36\x2d\x34\x2e\x36\x35\x31\x37\x34\x2e\x33\x30\x35\x35\x34\x33\
+\x39\x2d\x36\x2e\x39\x38\x39\x36\x36\x33\x2e\x38\x38\x30\x34\x36\
+\x39\x35\x2d\x31\x34\x2e\x31\x35\x36\x33\x32\x38\x20\x33\x2e\x34\
+\x38\x31\x32\x33\x35\x36\x2d\x32\x32\x2e\x38\x36\x32\x35\x30\x37\
+\x36\x20\x31\x36\x2e\x33\x32\x39\x32\x30\x30\x38\x2d\x32\x30\x2e\
+\x33\x36\x35\x39\x35\x34\x39\x20\x32\x39\x2e\x33\x33\x32\x32\x32\
+\x31\x38\x20\x36\x2e\x39\x33\x30\x37\x31\x31\x39\x20\x31\x2e\x31\
+\x34\x33\x37\x34\x39\x20\x31\x34\x2e\x34\x37\x31\x38\x30\x39\x39\
+\x20\x31\x2e\x37\x38\x36\x30\x39\x36\x20\x32\x32\x2e\x33\x36\x36\
+\x39\x31\x37\x39\x20\x31\x2e\x37\x38\x36\x30\x39\x36\x20\x31\x32\
+\x2e\x32\x34\x37\x36\x35\x20\x30\x20\x32\x33\x2e\x36\x35\x31\x33\
+\x38\x35\x2d\x31\x2e\x35\x32\x32\x38\x30\x31\x20\x33\x33\x2e\x32\
+\x32\x31\x34\x35\x2d\x34\x2e\x31\x32\x35\x36\x32\x39\x2e\x32\x35\
+\x38\x39\x35\x34\x2d\x32\x2e\x38\x37\x33\x38\x31\x36\x2e\x30\x30\
+\x39\x38\x32\x31\x2d\x35\x2e\x38\x33\x35\x34\x38\x34\x2d\x2e\x38\
+\x34\x39\x37\x32\x33\x2d\x38\x2e\x37\x37\x39\x35\x34\x32\x2d\x33\
+\x2e\x33\x38\x32\x37\x39\x39\x2d\x31\x31\x2e\x35\x38\x36\x35\x34\
+\x38\x2d\x31\x34\x2e\x38\x38\x37\x31\x35\x31\x2d\x31\x39\x2e\x32\
+\x30\x35\x38\x36\x35\x38\x2d\x32\x37\x2e\x33\x38\x33\x30\x32\x37\
+\x2d\x31\x39\x2e\x30\x39\x33\x36\x31\x36\x33\x7a\x22\x20\x66\x69\
+\x6c\x6c\x3d\x22\x75\x72\x6c\x28\x23\x6c\x69\x6e\x65\x61\x72\x47\
+\x72\x61\x64\x69\x65\x6e\x74\x32\x33\x39\x35\x29\x22\x2f\x3e\x0a\
+\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x6d\x33\x31\
+\x2e\x33\x35\x33\x30\x30\x38\x20\x34\x63\x31\x32\x2e\x31\x38\x34\
+\x38\x38\x39\x2e\x34\x30\x31\x32\x38\x34\x39\x20\x32\x33\x2e\x32\
+\x30\x35\x36\x38\x38\x20\x37\x2e\x37\x38\x32\x38\x35\x39\x20\x32\
+\x36\x2e\x35\x32\x34\x39\x36\x33\x20\x31\x38\x2e\x37\x39\x32\x34\
+\x35\x32\x2e\x38\x37\x33\x38\x37\x34\x20\x32\x2e\x38\x39\x38\x35\
+\x31\x39\x20\x31\x2e\x31\x31\x38\x39\x31\x36\x20\x35\x2e\x38\x32\
+\x34\x37\x32\x34\x2e\x38\x35\x35\x36\x34\x35\x20\x38\x2e\x36\x35\
+\x34\x30\x39\x2d\x39\x2e\x37\x32\x39\x35\x39\x38\x20\x32\x2e\x35\
+\x36\x32\x35\x36\x38\x2d\x32\x31\x2e\x33\x33\x32\x33\x32\x20\x34\
+\x2e\x30\x35\x30\x33\x31\x34\x2d\x33\x33\x2e\x37\x38\x34\x31\x33\
+\x39\x20\x34\x2e\x30\x35\x30\x33\x31\x34\x2d\x37\x2e\x33\x35\x33\
+\x39\x31\x33\x20\x30\x2d\x31\x34\x2e\x34\x30\x30\x32\x31\x36\x2d\
+\x2e\x35\x32\x39\x33\x31\x39\x2d\x32\x30\x2e\x39\x34\x39\x34\x37\
+\x37\x2d\x31\x2e\x34\x38\x34\x32\x37\x36\x2e\x30\x31\x32\x34\x34\
+\x36\x37\x2e\x30\x36\x37\x35\x31\x35\x2e\x30\x31\x34\x35\x34\x37\
+\x33\x2e\x31\x33\x33\x37\x33\x33\x2e\x30\x32\x37\x36\x30\x31\x31\
+\x2e\x32\x30\x31\x32\x35\x36\x20\x36\x2e\x39\x37\x39\x30\x30\x33\
+\x39\x20\x31\x2e\x31\x34\x33\x37\x39\x20\x31\x34\x2e\x35\x37\x32\
+\x36\x34\x33\x39\x20\x31\x2e\x37\x38\x36\x31\x36\x34\x20\x32\x32\
+\x2e\x35\x32\x32\x37\x35\x38\x39\x20\x31\x2e\x37\x38\x36\x31\x36\
+\x34\x20\x31\x32\x2e\x33\x33\x32\x39\x38\x38\x20\x30\x20\x32\x33\
+\x2e\x38\x31\x36\x31\x37\x36\x2d\x31\x2e\x35\x32\x32\x38\x35\x38\
+\x20\x33\x33\x2e\x34\x35\x32\x39\x32\x32\x2d\x34\x2e\x31\x32\x35\
+\x37\x38\x36\x2e\x32\x36\x30\x37\x36\x2d\x32\x2e\x38\x37\x33\x39\
+\x32\x36\x2e\x30\x30\x39\x38\x38\x38\x2d\x35\x2e\x38\x33\x35\x37\
+\x30\x37\x2d\x2e\x38\x35\x35\x36\x34\x35\x2d\x38\x2e\x37\x37\x39\
+\x38\x37\x36\x2d\x33\x2e\x34\x30\x36\x33\x36\x38\x2d\x31\x31\x2e\
+\x35\x38\x36\x39\x38\x36\x2d\x31\x34\x2e\x39\x39\x30\x38\x37\x35\
+\x2d\x31\x39\x2e\x32\x30\x36\x35\x39\x31\x35\x2d\x32\x37\x2e\x35\
+\x37\x33\x38\x31\x38\x2d\x31\x39\x2e\x30\x39\x34\x33\x33\x38\x2d\
+\x2e\x30\x37\x33\x38\x30\x37\x2e\x30\x30\x30\x36\x35\x38\x33\x2d\
+\x2e\x31\x34\x36\x39\x35\x37\x2d\x2e\x30\x30\x31\x31\x38\x39\x37\
+\x2d\x2e\x32\x32\x30\x38\x31\x31\x20\x30\x7a\x22\x20\x66\x69\x6c\
+\x6c\x3d\x22\x75\x72\x6c\x28\x23\x6c\x69\x6e\x65\x61\x72\x47\x72\
+\x61\x64\x69\x65\x6e\x74\x32\x33\x39\x32\x29\x22\x2f\x3e\x0a\x20\
+\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x6d\x33\x31\x2e\
+\x37\x31\x32\x34\x35\x33\x20\x34\x2e\x30\x30\x31\x32\x33\x30\x34\
+\x63\x2d\x32\x2e\x33\x31\x31\x38\x30\x36\x2e\x30\x32\x30\x38\x39\
+\x38\x37\x2d\x34\x2e\x36\x34\x37\x32\x32\x37\x2e\x33\x30\x37\x32\
+\x2d\x36\x2e\x39\x38\x32\x38\x38\x2e\x38\x38\x35\x32\x34\x35\x2d\
+\x31\x32\x2e\x30\x36\x34\x34\x30\x33\x20\x32\x2e\x39\x38\x35\x37\
+\x38\x37\x38\x2d\x32\x30\x2e\x31\x35\x37\x32\x30\x30\x38\x20\x31\
+\x32\x2e\x38\x33\x32\x33\x39\x31\x36\x2d\x32\x30\x2e\x37\x32\x39\
+\x35\x37\x33\x20\x32\x33\x2e\x37\x37\x35\x31\x35\x30\x36\x2e\x37\
+\x32\x38\x31\x37\x33\x33\x2d\x31\x30\x2e\x32\x39\x36\x35\x38\x33\
+\x20\x38\x2e\x37\x39\x36\x37\x35\x38\x2d\x31\x39\x2e\x34\x39\x32\
+\x33\x32\x35\x33\x20\x32\x30\x2e\x37\x32\x39\x35\x37\x33\x2d\x32\
+\x32\x2e\x33\x30\x38\x31\x37\x34\x20\x32\x2e\x33\x33\x35\x36\x35\
+\x33\x2d\x2e\x35\x35\x31\x31\x35\x36\x37\x20\x34\x2e\x36\x37\x31\
+\x30\x37\x34\x2d\x2e\x38\x34\x30\x30\x32\x34\x20\x36\x2e\x39\x38\
+\x32\x38\x38\x2d\x2e\x38\x35\x39\x39\x35\x32\x20\x31\x32\x2e\x34\
+\x38\x33\x37\x35\x37\x2d\x2e\x31\x30\x37\x36\x30\x38\x20\x32\x33\
+\x2e\x39\x37\x36\x39\x34\x37\x20\x37\x2e\x32\x30\x34\x34\x32\x37\
+\x20\x32\x37\x2e\x33\x35\x36\x34\x36\x34\x20\x31\x38\x2e\x33\x31\
+\x31\x39\x32\x35\x2e\x35\x33\x36\x36\x39\x34\x20\x31\x2e\x37\x36\
+\x33\x39\x35\x38\x2e\x38\x34\x35\x38\x32\x20\x33\x2e\x35\x33\x33\
+\x37\x31\x33\x2e\x39\x33\x31\x30\x35\x31\x20\x35\x2e\x32\x38\x36\
+\x31\x37\x38\x2d\x2e\x30\x36\x31\x39\x30\x35\x2d\x31\x2e\x39\x35\
+\x32\x31\x38\x36\x2d\x2e\x33\x36\x30\x32\x32\x32\x2d\x33\x2e\x39\
+\x32\x35\x35\x32\x31\x2d\x2e\x39\x33\x31\x30\x35\x31\x2d\x35\x2e\
+\x38\x39\x33\x32\x30\x34\x2d\x33\x2e\x33\x37\x39\x35\x31\x37\x2d\
+\x31\x31\x2e\x36\x34\x39\x33\x38\x35\x2d\x31\x34\x2e\x38\x37\x32\
+\x37\x30\x37\x2d\x31\x39\x2e\x33\x31\x30\x30\x32\x37\x36\x2d\x32\
+\x37\x2e\x33\x35\x36\x34\x36\x34\x2d\x31\x39\x2e\x31\x39\x37\x31\
+\x36\x38\x36\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x75\x72\x6c\x28\
+\x23\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x32\
+\x33\x38\x39\x29\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\
+\x68\x20\x64\x3d\x22\x6d\x32\x37\x2e\x39\x39\x39\x39\x38\x34\x20\
+\x31\x32\x2e\x30\x30\x30\x30\x31\x31\x76\x32\x38\x68\x38\x76\x2d\
+\x32\x38\x7a\x6d\x30\x20\x33\x32\x76\x38\x68\x38\x76\x2d\x38\x7a\
+\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x6f\x70\x61\x63\x69\x74\x79\
+\x3a\x2e\x37\x3b\x66\x69\x6c\x6c\x3a\x6e\x6f\x6e\x65\x3b\x73\x74\
+\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x34\x3b\x73\x74\x72\
+\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\x3a\x72\x6f\x75\
+\x6e\x64\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x75\x72\x6c\x28\x23\x72\
+\x61\x64\x69\x61\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\x32\x33\x38\
+\x36\x29\x3b\x66\x69\x6c\x74\x65\x72\x3a\x75\x72\x6c\x28\x23\x66\
+\x69\x6c\x74\x65\x72\x33\x37\x33\x32\x29\x22\x2f\x3e\x0a\x20\x20\
+\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x6d\x32\x37\x2e\x39\
+\x39\x39\x39\x38\x34\x20\x31\x32\x2e\x30\x30\x30\x30\x31\x31\x76\
+\x32\x38\x68\x38\x76\x2d\x32\x38\x7a\x6d\x30\x20\x33\x32\x76\x38\
+\x68\x38\x76\x2d\x38\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x75\x72\
+\x6c\x28\x23\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\
+\x74\x32\x33\x38\x33\x29\x22\x2f\x3e\x0a\x20\x20\x3c\x2f\x67\x3e\
+\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\
+\x00\x00\x0e\xed\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x6c\x00\x00\x00\x6c\x08\x06\x00\x00\x00\x8f\x66\x57\xcd\
+\x00\x00\x0e\xb4\x49\x44\x41\x54\x78\xda\xed\x9d\x7b\x54\x54\xd7\
+\xbd\xc7\xbf\xfb\xcc\x83\x87\xc3\x30\x3c\x87\x41\x50\xf0\x11\x40\
+\x11\x47\x26\x82\x57\xab\x58\x5a\x6b\x6d\x6a\x24\x2a\xc1\xc4\x8b\
+\x41\xaf\xd1\x2c\x89\x36\xa6\xeb\x86\xac\x26\x77\x55\x63\x52\x74\
+\xd1\xc4\x18\x93\x54\xb1\x51\xdb\xa4\x06\x8d\x29\x57\x13\x63\x48\
+\x22\xb1\x3e\x20\x2a\x1a\x50\xc1\x07\xbe\x19\x94\x81\xe9\xf0\x1a\
+\x18\x66\x98\x99\xdd\x3f\x5a\x53\xef\x4d\x9c\x33\x8f\x33\x67\x06\
+\x39\xdf\xb5\xce\x62\x2d\xd6\xef\x9c\xb3\xcf\xfe\x9c\xfd\xdb\xbf\
+\xbd\xcf\x6f\xef\x21\x18\x04\xea\xe8\x6d\xa7\x9f\x9f\xfa\x1c\x37\
+\x9b\x6e\xa2\xc3\xd0\xe9\xd4\x39\x21\x72\x19\xe2\xe3\xe2\xf1\xd3\
+\x87\x67\x40\xa5\x50\x11\x08\xf2\xbe\x4e\x7e\x7b\x8a\x8e\x7f\x64\
+\x3c\x25\x32\x86\x02\x70\xef\x08\x22\x74\x44\xd6\x28\xfa\xd9\xa1\
+\x83\x54\xa8\x51\x2f\xc9\x68\x34\x6a\x0a\x96\x14\x50\x10\xb8\x0f\
+\xea\x07\x8e\x47\x66\x3f\x42\x5b\x5b\x5b\x05\x70\x5c\xaa\xa9\xa9\
+\x89\xaa\xd5\x6a\x4e\x41\xdd\x7b\x24\x24\x24\xd0\x73\xe7\xce\x09\
+\xd0\xb8\x50\x77\x77\xf7\xb2\xb4\xb4\x34\xaf\xc1\xba\x7b\xa8\x54\
+\x2a\xda\xd4\xd4\x24\x40\xf3\x54\xf9\xf9\xf9\x5e\x87\x75\xf7\x98\
+\x3a\x75\xaa\x00\xcc\x13\x9d\x3a\x75\x8a\x12\x42\x78\x03\x06\x80\
+\xee\xdd\xbb\x57\x80\xe6\xae\xf2\xf2\xf2\x78\x85\x05\x80\x66\x64\
+\x64\x08\xc0\xdc\x95\x5c\x2e\xe7\x1d\x18\x21\x84\xf7\xbe\x4c\xfc\
+\x20\xc0\x3a\x71\xe2\x04\xcd\xcc\xcc\x74\x68\x43\x86\x30\x10\x3d\
+\x16\x02\x49\x9c\x18\x36\xc2\x5e\xc7\xa4\x85\xc2\xbc\xbf\x0b\xf8\
+\xbb\xed\xbe\x36\x94\x52\x1c\x3f\x7e\x1c\x02\x30\x17\x75\xfb\xf6\
+\x6d\x56\x1b\xe9\xe3\xa1\x60\x32\x03\x00\x00\x22\x67\x2e\x3a\x1c\
+\x90\x46\x86\xc2\x52\x62\x70\x68\xd6\xdc\xdc\xcc\xeb\xb3\x32\x0f\
+\x02\x30\xbd\x5e\xcf\x6e\x94\x20\x71\xf9\xba\xa2\x44\xf6\x73\xda\
+\xda\xda\x04\x60\xae\xca\x6e\xb7\x3b\xf1\xa4\x6e\x74\x35\x0c\xfb\
+\x14\x22\xa5\x54\x00\x26\x48\x00\x26\x00\x13\x24\x00\x13\x24\x00\
+\x13\x80\x09\xf2\xb1\x06\xd4\xc0\x59\xaf\xd7\xd3\xce\xce\xef\x7f\
+\xe2\x2f\x2b\x2b\x13\x80\xf9\x83\xf6\xee\xdd\x4b\xbf\xfc\xf2\x4b\
+\x54\x55\x55\xa1\xa1\xa1\x01\x91\x91\x91\x6e\x5f\xcb\xb6\xdf\x08\
+\x3a\x39\x08\x34\x59\x0a\x31\x11\x80\x71\xa6\xcb\x97\x2f\xd3\x92\
+\x92\x12\xec\xd9\xb3\x07\xf3\xe7\xcf\xe7\xec\xba\xd6\x53\x26\xe0\
+\x94\x09\xcc\x50\x31\x98\x39\x32\x30\x69\x81\x02\x30\x4f\xa4\xd5\
+\x6a\x69\x51\x51\x11\x52\x52\x52\x60\xb3\xd9\xbc\x76\x1f\x7b\xb3\
+\x15\xe6\x77\x3b\x20\x9a\x14\x0c\x66\x81\x1c\xe2\x40\x01\x98\xcb\
+\xda\xbc\x79\x33\x1d\x33\x66\x0c\xba\xba\xba\x78\xbb\xa7\xed\x9b\
+\x5e\x50\xbd\x15\xa2\x42\x05\x48\xd0\xc0\x89\xbd\x7c\x5e\xd2\xbc\
+\xbc\x3c\xba\x72\xe5\x4a\x5e\x61\x7d\xd7\xda\xae\x58\x60\xd9\xd2\
+\x01\xd8\xa9\x00\x8c\x4d\x5d\x5d\x5d\x5b\x33\x32\x32\xe8\xee\xdd\
+\xbb\x7d\x5a\x01\xf6\x4b\x16\x58\x3e\xed\x15\x80\xb1\x29\x27\x27\
+\x67\xd9\xc9\x93\x27\xfd\xa2\x12\x6c\x5f\x18\x61\x6f\xb3\x09\xc0\
+\xee\xa7\x97\x5f\x7e\x99\x56\x56\x56\xfa\x4f\x2d\x58\x29\xac\x07\
+\x7a\x84\xa0\xe3\x87\xd4\xd0\xd0\x40\xd5\x6a\xb5\xd3\xf6\x91\xa1\
+\x62\x64\xa5\xc9\x90\x12\x17\x04\x85\x5c\x84\x90\x20\x91\xd3\xe7\
+\x76\x18\x6d\xa8\xac\xeb\x42\xc5\x29\xf6\xfe\xd1\xf6\xad\x09\xd6\
+\x01\x10\x35\xf2\x0e\x6c\xed\xda\xb5\xb0\x58\x2c\xac\x76\x09\x4a\
+\x29\x5e\x5b\x1c\x87\x27\x7e\x1c\x06\xe2\xc1\x40\xf7\x85\xc7\x95\
+\x38\x70\xa2\x0b\xb9\xaf\x5e\x81\xc9\xec\x20\xb8\x30\x53\x30\x17\
+\xcc\xc0\x84\x00\xbf\x06\xc6\xeb\x98\xff\xc2\x85\x0b\x34\x35\x35\
+\x95\x75\x9c\x95\x99\x32\x04\x9f\xae\x1b\x85\x48\x39\x77\xef\xd3\
+\xdb\xfb\xda\xb0\xf2\x9d\x5b\x0e\x6d\x24\xb3\x64\x60\x32\x82\x80\
+\x5b\x56\xd8\x7a\x6c\x20\xfd\x14\xfd\xe5\xdd\x0e\xcf\xc9\xca\xca\
+\xc2\xac\x59\xb3\xbe\xf7\x7f\x85\x42\x81\xd8\xd8\x58\x68\x34\x1a\
+\x0c\x1d\x3a\x94\x0c\x48\x60\xf9\xf9\xf9\xf4\xfd\xf7\xdf\x77\x68\
+\x33\x2c\x5a\x8a\x33\x7f\x48\x41\x44\x08\xb7\x8d\xbf\xcf\x62\x43\
+\xc4\xfc\xb3\xe8\xed\xb3\x3b\xae\x0d\x8e\x23\x7c\x42\x08\x26\x4e\
+\x9c\x88\x67\x9f\x7d\x16\x8b\x16\x2d\x22\x03\x06\xd8\x95\x2b\x57\
+\x68\x72\x72\x32\xac\x56\xab\x43\xbb\xc3\xbf\x1f\x8d\xac\x34\xb9\
+\x57\xca\x90\xfa\xf4\x05\xd4\xdf\xf4\x5d\x08\xaf\x56\xab\x51\x56\
+\x56\x86\xe4\xe4\x64\xb7\xeb\x9d\xb7\x28\x71\xfd\xfa\xf5\xac\xb0\
+\xe6\xfe\x28\xcc\x6b\xb0\x40\x01\x7d\x57\xbf\x4f\xfb\x9f\xda\xda\
+\x5a\x4c\x9a\x34\x09\x95\x95\x95\x6e\xb7\x63\x5e\x82\x8e\x9b\x37\
+\x6f\xd2\xd1\xa3\x47\xb3\xb8\x0e\xe0\x95\xa7\x54\x5e\x2b\xc3\xe1\
+\xb3\xdd\xd0\xb5\xfb\x16\x18\x00\x74\x74\x74\xe0\xb1\xc7\x1e\x43\
+\x43\x43\x03\x1d\x33\x66\x0c\xf1\xcb\x16\xb6\x61\xc3\x06\xd6\xc8\
+\x70\x86\x46\x8e\xb1\xc3\x83\xbc\x72\xff\xb6\xae\x7e\x3c\xb3\xe9\
+\x96\xdf\x44\x7a\x9d\x9d\x9d\xc8\xcd\xcd\xf5\x4f\x97\xd8\xdc\xdc\
+\x4c\xb7\x6f\xdf\xce\x6a\xf7\xab\x9c\x68\x4e\xef\x6b\xee\xa7\xb8\
+\xde\x62\x46\xe9\x67\x7a\xa4\x3f\x73\x11\x97\xb4\x7d\x7e\x15\x9e\
+\xd7\xd7\xd7\xa3\xb4\xb4\xd4\x65\xd7\xe8\x75\x97\x58\x52\x52\x82\
+\xbe\x3e\xc7\x95\x95\x14\x17\x88\x5f\x4c\x0c\xe5\x04\xd2\xa6\xf2\
+\x56\xfc\xf1\x73\x3d\x1a\xfd\x0c\xd0\x0f\x69\xd3\xa6\x4d\xfe\xd5\
+\x87\xe9\x74\x3a\x9a\x98\x98\xc8\x6a\xb7\x32\x27\xca\xe3\x78\xb5\
+\xa7\x8f\xe2\xe7\x2f\x5d\xc6\xb1\x73\x46\x0c\x14\xd5\xd7\xd7\xa3\
+\xb1\xb1\x91\x8e\x1e\x3d\x9a\xf8\x05\xb0\xd7\x5f\x7f\x1d\xbd\xbd\
+\x8e\xc3\xe8\xa8\x50\x31\x0a\x7e\x16\xe5\xf1\xbd\x9e\xfb\x43\x13\
+\x67\xb0\xe6\x4d\x55\xe0\xb5\xc5\xb1\x88\x0e\x93\xba\x7d\x8d\x4b\
+\x4d\x7d\x28\xdc\xdc\x84\x33\x8d\x8e\xe7\x28\xbf\xf9\xe6\x1b\xff\
+\x68\x61\x37\x6e\xdc\xa0\xa9\xa9\xa9\xec\x15\x3d\x37\x06\x43\x02\
+\x3d\x6b\x5e\xad\x1d\x16\xec\xa8\xd0\x73\x52\xee\x50\x99\x08\x1f\
+\x14\x25\x20\x50\x2a\xf2\xe8\x3a\x93\x92\x87\xe0\x4f\xff\x9d\x80\
+\x71\xcb\xea\x1d\xda\x39\xb3\xf2\x86\x97\xa0\x63\xf1\xe2\xc5\x30\
+\x1a\x1d\xbf\xf1\xe1\x21\x62\x3c\x3b\xc7\xf3\xd6\x75\xf4\xbc\x09\
+\x36\x8e\x3e\x42\x46\x84\x88\x3d\x86\x75\x57\xb1\x91\xec\xd7\x31\
+\x99\x4c\xbe\x05\xa6\xd7\xeb\x69\x76\x76\x36\xfd\xfa\xeb\xaf\x59\
+\x6d\x57\xcd\x51\x42\x1e\xec\x79\x11\x0c\x1c\x0e\x88\xaf\xb7\x98\
+\xf1\xd7\xe3\x1d\xdc\x74\x09\x7b\x74\xac\x36\x43\x87\x0e\xf5\xbe\
+\x4b\x34\x1a\x8d\x9a\xd6\xd6\xd6\x9a\xbb\x4b\x6d\xcc\x66\x33\xae\
+\x5c\xb9\x82\xaf\xbe\xfa\x0a\x89\x89\x89\xe8\xee\xee\x66\xbd\x86\
+\x3c\x58\x84\x55\xf3\xa2\x38\xa9\x18\x2e\xa7\xff\x28\x05\x72\x5f\
+\xb9\x8a\x29\xe3\x64\x50\x2a\xdc\xef\xc3\x2e\x6b\x4d\x38\x7b\x8d\
+\xbd\xf5\x8c\x1c\x39\xd2\x7b\xc0\xde\x7d\xf7\x5d\xba\x75\xeb\x56\
+\xc8\x64\x32\x8f\x2b\xa6\x28\x4f\x85\xb0\x21\x22\xf0\xa6\x50\x06\
+\xa2\x89\xc1\x90\x0e\x13\xc3\xb4\xdd\x71\x0b\xb2\x53\xe0\xe8\x59\
+\xef\x47\x9b\xe1\xe1\xe1\xc8\xce\xce\x76\xa9\x03\x77\xca\x1f\x19\
+\x0c\x06\x3a\x75\xea\x54\xba\x62\xc5\x0a\xd4\xd5\xd5\x79\x5c\xd0\
+\x91\xb1\x01\xf8\xf5\xfc\x68\xf0\xa9\xe0\x5f\x47\x40\x3a\x5f\x06\
+\x64\x04\x82\x89\x97\xc2\x1f\x94\x96\x96\xe6\x9d\x99\x8e\xdc\xdc\
+\x5c\x1c\x3d\x7a\x94\x93\x42\x06\x4a\x19\xec\xfe\x4d\x22\x02\x24\
+\xfc\xa6\xdf\xda\xee\xb9\x9d\xe8\x51\x99\x5f\x00\x3b\x7c\xf8\x30\
+\x56\xaf\x5e\x4d\x39\x05\xb6\x6b\xd7\x2e\x7a\xe8\xd0\x21\x4e\x0a\
+\xc8\x10\x60\xeb\x73\xf1\xd0\x3c\x34\xc4\xa7\x15\x25\x1e\x27\x85\
+\x78\x62\x90\x5f\x40\xdb\xb8\x71\x23\x8a\x8b\x8b\x29\x67\xc0\x76\
+\xec\xd8\xc1\x4d\x25\x89\x08\xfe\x5c\x34\x02\x8b\x7e\x1a\xe9\x17\
+\x15\x45\xf2\x43\x40\x46\xfa\x47\x3a\xc0\x9a\x35\x6b\xd0\xd0\xd0\
+\x40\x39\x01\x76\xe6\xcc\x19\x8f\x0b\x34\x5c\x29\xc5\xdf\x5e\x7f\
+\x08\x0b\xb3\xc3\xfc\x66\x5a\x48\x2c\x65\x10\xb0\x4a\x01\x66\x98\
+\xc4\xe7\x65\x31\x9b\xcd\x28\x2a\x2a\xe2\xa6\x85\x19\x0c\x06\xf7\
+\x3b\xfa\x40\x06\xbf\x59\xa0\x44\xdd\x96\x14\x4c\x1e\x23\x83\xbf\
+\xc9\x26\x25\xa0\x46\xbb\x5f\x94\xe5\xe0\xc1\x83\xd0\xe9\x74\xac\
+\xad\x8c\x35\xac\x77\x75\x5b\x03\x89\x98\x40\xf3\x50\x10\x16\x4c\
+\x8f\xc0\xc2\xec\x70\x4e\x13\x69\x38\x77\x8b\x37\xfa\x41\x0d\xec\
+\x09\xa4\x52\x31\x10\x13\xe6\x7e\x90\xd4\xde\x4d\xd1\xcd\xf2\xf1\
+\xc0\x6a\xb5\xe2\xe3\x8f\x3f\xf6\xce\xc0\xf9\x5e\xcd\x9c\x28\xc7\
+\xe3\xd3\xc2\x10\x11\x22\x46\x74\x98\x04\xea\x11\x41\x08\x0a\x18\
+\x18\x8b\x0b\xe8\x1d\xf6\x19\x92\xd9\xe9\xc0\xe6\x25\x40\xb0\xd4\
+\xfd\xe1\xb9\x9d\x02\x1b\xf6\x03\x1b\x0f\x38\xb6\x3b\x7d\xfa\xb4\
+\xf7\x81\xa9\x13\x83\xb1\x64\x66\x24\x06\xa2\x68\x07\x3b\x84\x57\
+\x17\x10\x8f\x60\xdd\x8d\x8e\x5f\x7c\x14\xf8\xcb\x51\xa0\xd5\x41\
+\x4e\xab\x4e\xc7\x3e\x95\x35\xa8\xd7\x38\x33\xf6\x81\xb7\x7b\xde\
+\xe0\x5e\x94\x1e\xc2\xde\x2f\xbd\xf4\x21\xd0\x63\xf6\x30\xb8\xb1\
+\x03\xc5\xfb\x1d\xb7\x2e\x00\x50\x2a\x95\xde\x77\x89\x03\x59\xa2\
+\xe1\xec\x53\x54\x9f\x7e\x4b\x51\xb1\x1a\x50\x79\x10\x74\x18\xba\
+\x29\x8c\x4e\x64\x2c\x68\x34\x1a\xbc\xf7\xde\x7b\x02\xb0\xfb\x6a\
+\x98\x18\x44\xce\x80\x76\x39\x0e\xed\xfb\xad\xc0\xad\x36\xef\xba\
+\x4f\x89\x44\x82\x79\xf3\xe6\x61\xc5\x8a\x15\x82\x4b\x74\x14\x0d\
+\x88\xa7\x04\xfb\x45\x51\x66\xcd\x9a\x05\xa5\x52\xc9\xda\x8c\x85\
+\x8d\x55\x66\x0c\x01\x51\xf8\xb6\x1a\x02\x02\x02\x50\x5c\x5c\x2c\
+\x04\x1d\xce\x48\x1c\x4c\x20\x9a\xe0\xdb\x45\x61\x6b\xd7\xae\xc5\
+\xd8\xb1\x63\x89\x00\xcc\x99\xd9\x8e\x56\x1b\xac\xc7\x4c\x3e\xbb\
+\xff\xf3\xcf\x3f\x8f\x17\x5f\x7c\xd1\xe9\x88\x66\xd0\x03\xeb\xff\
+\xa2\x07\xe8\xf7\xcd\x78\x6c\xfa\xf4\xe9\x78\xe3\x8d\x37\xb8\xff\
+\xe2\xfc\xa0\xca\x6a\xb1\xa3\xff\xa4\xef\x5a\xd7\xd9\xb3\x67\x5d\
+\x77\xe1\x83\x7a\x1c\x76\xcd\x86\x7e\x0b\x7b\xeb\x52\x8f\x0a\xc6\
+\xa8\x58\xd7\xfa\xb9\x46\xad\x09\x75\x2c\x49\x38\x06\x83\x01\x95\
+\x95\x95\xd4\x95\xbc\x8e\x41\x0d\xcc\x7a\x9b\x7d\xf2\xf7\x7f\x9e\
+\x8c\xc5\x2b\x05\xee\x2d\x83\x7a\x79\xc7\x6d\xbc\xf6\xe1\x1d\x87\
+\x36\x57\xaf\x5e\x75\x6d\x24\x32\x98\x81\x51\x23\x7b\xeb\x5a\x9d\
+\xeb\x7e\xb2\xd0\xf3\xb9\xec\x69\x7c\xae\xee\x7b\x3f\xa8\x81\x11\
+\x27\xfc\x4b\x73\x9b\xfb\x49\xaa\xce\x9c\xcb\x30\xae\x21\x18\xd4\
+\x2e\x91\x09\x65\xaf\xac\xa7\x4a\x6e\xe0\x9d\x95\xf1\x48\x8a\x77\
+\xad\x0f\xbb\x78\xab\x0f\x85\x6f\xdf\x64\xb5\x8b\x8b\x8b\x13\x80\
+\x39\xfd\xf0\x89\x62\xb0\xed\x18\x72\xa6\xb1\x07\xff\xb1\xea\xa2\
+\xd7\xca\x90\x91\x91\xc1\x2f\xb0\xea\x4b\x3d\x58\x5f\xd6\x02\x00\
+\x90\x4a\x09\xc2\x43\xc4\x88\x0d\x17\x23\x23\x59\x06\x05\x9f\x99\
+\xbd\xee\x8c\xc1\x54\x12\x90\x18\x31\x68\x8b\xd5\x27\xf7\x4f\x4a\
+\x4a\x42\x6a\x6a\x2a\xe1\x15\xd8\x91\xba\x6e\x1c\xa9\xfb\x7e\x2e\
+\x3d\x43\x80\x71\x89\x41\x58\xf8\x93\x08\x3c\x35\x23\x0c\xd1\x0a\
+\xa9\xff\xb5\x30\x02\x90\xac\x60\x58\x76\x77\xf9\xe4\xfe\xab\x56\
+\xad\x42\x61\x61\x21\xb7\x41\x07\x71\x73\xdf\x20\x3b\x05\xea\xae\
+\x99\xf0\xc2\x36\x2d\x12\xf2\xcf\xe3\xa5\xed\x5a\x74\x9b\xfc\x6f\
+\xc7\x34\xe6\x47\x81\x20\x32\xfe\x63\xaf\xb1\x63\xc7\xa2\xb0\xb0\
+\x90\xfb\x5d\x04\x3c\xd9\x18\xf9\xae\x4c\x66\x8a\xdf\x95\xe9\x30\
+\x7e\xf9\x05\xd4\x5c\xf2\x9f\xbd\x09\xad\x46\x3b\x2c\x9b\x3b\x78\
+\x4f\x75\x0b\x09\x09\xc1\xae\x5d\xbb\xdc\x7b\xc1\xb8\xee\x14\x1d\
+\xe9\x7a\x8b\x19\x53\x56\x5f\xc4\xde\xa3\x1d\xbe\x87\xd5\x4b\x61\
+\xdb\x68\x80\xfd\xb2\x85\x77\x58\xfb\xf6\xed\xc3\xf8\xf1\xe3\x89\
+\x57\x80\x3d\xfd\xf4\xd3\x9c\x16\xd8\x62\xa5\x78\xb2\xf8\x1a\xf6\
+\x55\xf9\x16\x9a\x7d\x7b\x07\xec\xcd\xfc\x06\x1b\xa3\x46\x8d\x42\
+\x75\x75\xb5\xcb\x4b\x8c\x5c\x02\x96\x93\x93\x43\x72\x72\x72\xb8\
+\x8d\xce\xac\x14\xf9\x1b\x6e\xa0\xb1\xd9\x37\x5b\x33\xd8\x4f\x98\
+\x61\x3b\x6f\xe6\xfd\xbe\x7d\x7d\x7d\x2e\x47\x85\x6e\xcd\x74\x7c\
+\xf0\xc1\x07\x0f\xcf\x9e\x3d\x9b\xd3\xc2\x77\x9b\x6c\x78\x72\xfd\
+\x75\xf0\xfc\x7b\x69\xb0\x52\xc0\x72\xb0\xdb\x27\x2f\x8a\x56\xab\
+\xc5\x9b\x6f\xbe\x49\xbd\x0e\x4c\x26\x93\x9d\xfe\xe4\x93\x4f\xc8\
+\xee\xdd\xbb\x91\x9d\x9d\x8d\x80\x00\x6e\x56\x7d\xd4\x5c\xea\xc5\
+\xfb\x87\xf4\xbc\x56\x1a\xb9\x66\xf1\xd9\xb8\x0b\x00\x76\xee\xdc\
+\xe9\xd9\x50\xc4\x15\xe3\xbc\xbc\xbc\xef\x9a\x73\x7b\x7b\x3b\xfd\
+\xff\x79\xf7\x3d\x3d\x3d\x68\x6c\x6c\xc4\x81\x03\x07\x50\x5a\x5a\
+\xea\xd4\x5a\xe7\x35\x7f\x6e\xc1\xc2\x1f\x47\x40\x24\xe2\x67\x81\
+\x9f\xfd\x12\xfb\xfc\x9e\x44\x04\xfc\x24\x15\x88\x74\x61\x63\x39\
+\xbb\x9d\xa0\xf6\x16\x45\x43\x93\x63\xbb\xba\xba\x3a\xe8\xf5\x7a\
+\x1a\x19\x19\x49\xbc\x0e\xec\x5e\x85\x85\x39\x4e\xd4\x6b\x6d\x6d\
+\xa5\x73\xe6\xcc\x41\x75\x75\x35\x6b\xe4\xb8\xf7\x58\x07\xf2\xb2\
+\xf8\x59\x8a\x44\x59\x3e\xa9\x10\x02\x7c\xf8\x1c\x30\x2d\xc9\xe5\
+\x2b\xc3\x4e\x81\x67\xb6\x11\xfc\x6f\xcd\xfd\xbd\x1e\xa5\x14\x0d\
+\x0d\x0d\xde\x75\x89\xee\x28\x3a\x3a\x9a\x54\x57\x57\x93\xf4\xf4\
+\x74\x56\xdb\x8d\x7f\xd5\xf1\xe7\x93\x4c\x8e\xbb\x90\xe1\x51\xee\
+\xc0\xfa\xf7\xec\xce\x7f\x66\xb1\x77\x51\xed\xed\xed\xfe\x07\xec\
+\xae\xb6\x6d\xdb\x06\x91\xc8\xf1\x9c\xe2\x89\x0b\x3d\x28\xfb\x5b\
+\x3b\x3f\xc0\x82\x1c\x7b\x22\x7d\x17\x58\x97\x06\x39\xd2\x35\x1d\
+\xbb\xa7\x93\xcb\xdd\xdf\xc4\xd3\xeb\xb3\xf5\x1a\x8d\x86\xe4\xe6\
+\xe6\xd2\x8f\x3e\xfa\xc8\xa1\xdd\xaf\xde\xb9\x85\x71\x09\x81\x5e\
+\xdb\x33\xf1\x3b\x97\x17\xea\xf8\xe5\x31\xf6\x01\x4b\xb6\x02\x2f\
+\xcc\x06\xa2\x42\x9c\xef\x66\x6c\x94\xe2\xf4\x35\xe0\x77\xe5\xec\
+\x2d\x2c\x36\x36\xd6\xfd\xf2\xf3\xf1\x52\x57\x55\x55\xd1\xc9\x93\
+\x27\xb3\xda\x45\xc8\xc5\x78\xab\x30\x1e\x4f\x4e\x0f\x77\xa9\x64\
+\xa5\x9f\xe9\xb1\xfc\x4d\xc7\xdf\x9e\x02\xd6\x45\x81\x89\x12\xc1\
+\x7e\xba\x0f\xe6\x6d\xbe\x1b\xb4\x2b\x95\x4a\xe8\x74\x3a\xff\xde\
+\xf3\x77\xf2\xe4\xc9\x64\xda\xb4\x69\xac\x76\x7f\xef\xb2\x62\x61\
+\xf1\x75\x24\xff\x57\x3d\x56\xbe\x7d\x0b\x7f\x3c\xd8\x86\x03\x27\
+\xba\x50\x7b\xb5\x17\xba\x76\x0b\x27\x63\x36\xfb\xd8\x40\x40\xe2\
+\xbb\x5f\x7c\xf3\x74\x3c\xcb\x5b\xc9\x8f\x1c\x39\x42\x9d\x81\xe6\
+\xd0\x7f\x8b\x08\x94\x61\x62\xc4\x46\x4a\xa1\x0a\x93\x20\x36\x5c\
+\x02\x55\xb8\x04\x17\x9b\xfb\xf0\x61\xa5\xc1\xa9\x16\x06\x00\xd6\
+\x3d\x9d\xe8\xaf\xe4\x3f\xbd\x4d\x24\x12\xa1\xae\xae\xce\xe3\xd9\
+\x0e\xde\x54\x50\x50\x40\xf1\xcf\xad\xa1\x78\x3f\x02\xd6\x45\xd1\
+\xa0\x2d\x31\x34\x68\x4b\x0c\x0d\x2c\x89\xa6\x64\x08\xc3\x7b\x19\
+\x96\x2d\x5b\xe6\xb1\x8f\xe0\xf5\x43\xd0\x5b\x6f\xbd\x55\x9a\x94\
+\x94\xe4\xf3\x17\x87\x84\x30\x90\x2c\x55\xf0\xfa\xf4\xe9\xe9\xe9\
+\x28\x2d\x2d\x25\x03\x0a\x98\x5c\x2e\x5f\x5e\x51\x51\xe1\x72\xe2\
+\x89\x57\xdc\x53\x8a\x14\x01\x4f\x85\x81\x8f\x5f\x30\x55\xab\xd5\
+\xd8\xbf\x7f\x3f\x27\xd7\xe2\xfd\x53\x6b\x42\x42\x02\x39\x72\xe4\
+\x08\x9c\xd9\xad\xd4\xdb\x62\x32\x03\x20\x5d\x1d\x06\xa2\xf4\xce\
+\xe8\x86\x61\x18\x14\x14\x14\xe0\xd8\xb1\x63\x0f\xc7\xc5\xc5\x91\
+\x01\x09\x0c\x00\x46\x8c\x18\x41\xaa\xaa\xaa\x4a\x97\x2e\x5d\xea\
+\x76\x0a\x02\x67\x2d\x6d\xa4\x14\x81\xbf\x8d\x80\x74\xa1\x1c\xa2\
+\x44\x09\x27\x61\x58\x68\x68\x28\x9e\x78\xe2\x09\xd4\xd4\xd4\x60\
+\xe7\xce\x9d\x44\x26\x93\x9d\xe6\xaa\xbc\x3e\x8f\x56\x8e\x1f\x3f\
+\x4e\xd7\xad\x5b\x87\x8a\x8a\x0a\x97\x37\x71\x71\x45\xf7\x46\x89\
+\x8e\x44\x3b\x6d\x80\xce\x06\x62\xb0\xc1\xd6\x4f\x61\xf9\x8b\xe3\
+\x04\x9d\x99\x33\x67\x62\xee\xdc\xb9\x00\x80\x98\x98\x18\xa8\x54\
+\x2a\x64\x64\x64\x78\xad\x5e\x7d\x9e\x97\x38\x65\xca\x14\x02\xfc\
+\xf3\xa7\xaa\xca\xcb\xcb\x51\x51\x51\x81\x73\xe7\xce\x79\xb4\x65\
+\x92\xc7\x33\x21\xff\x9a\x0d\x11\x01\x00\x0b\x30\xb5\x5a\x8d\xe5\
+\xcb\x97\xf3\xf6\xe2\xfb\x4d\x22\x69\x4a\x4a\xca\xff\x79\xe8\xd6\
+\xd6\x56\x7a\xe7\xce\x1d\x68\xb5\x5a\xe8\x74\xba\xfb\xfe\xed\xef\
+\xef\xc7\x60\x92\xdf\x66\xfe\x46\x47\x47\x3b\xf5\xd6\xb6\xb4\xb4\
+\xd0\x2d\x5b\xb6\x60\xcd\x9a\x35\x83\x02\xd8\x80\x5f\x0c\x11\x13\
+\x13\x43\x9c\xda\x99\xda\xee\x86\xd7\x72\x62\xa7\x1c\xbe\x83\xa6\
+\x07\x62\xf5\x8a\x33\xb9\x93\xcc\x75\xd7\x93\x6e\x6c\x57\xd9\x53\
+\xe0\xa2\xa2\xa2\x78\x7d\xd6\x07\x62\x31\x84\x33\x9f\x2b\xfa\x3e\
+\xea\x86\xa4\x9f\x42\x14\x2f\x81\x8d\x38\xd1\x72\x5a\x28\x2c\xfb\
+\xd9\x53\xb8\x5d\xdd\x77\x5e\xd0\xbf\xa4\x50\x28\x78\x9f\x1b\x24\
+\x84\xd0\xa6\xa6\x26\x2a\xd4\xbe\x1b\x5a\xb0\x60\x01\xef\xc0\x32\
+\x33\x33\x05\x58\xee\xaa\xb6\xb6\x96\x32\x0c\xbf\x33\xf0\xe5\xe5\
+\xe5\x02\x30\x4f\xb4\x68\xd1\x22\xde\x60\x65\x65\x65\x09\xb0\xb8\
+\x90\x46\xa3\xf1\x3a\x2c\x95\x4a\x45\xb5\x5a\xad\x00\x8c\x0b\x69\
+\xb5\x5a\x3a\x61\xc2\x04\xaf\xc1\x4a\x4c\x4c\xa4\xe7\xcf\x9f\x17\
+\x60\x71\x29\xa3\xd1\xa8\x59\xb2\x74\x09\x25\x0c\xe1\x14\xd6\xa3\
+\x39\x8f\xd2\xb6\xb6\x36\x01\x96\xb7\x54\x53\x7b\x9a\xaa\x7f\x99\
+\x4e\x99\x50\x91\xfb\xa0\x82\x08\x1d\x9d\xfd\x10\xfd\xbc\xb2\xc2\
+\x2f\x40\x91\xc1\x00\xae\xab\xaf\xb3\xe6\x8b\x93\x15\x9a\xeb\xda\
+\x1b\x30\xe8\x9d\x4b\x58\x95\x2b\x42\x10\x3f\x74\x18\x66\x4c\x9c\
+\x01\xa5\x5c\xe9\x37\xf5\xf4\x0f\x81\x3a\xda\x1d\x79\x97\x10\x7d\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x0b\xab\
+\x00\
+\x00\x38\x6f\x78\x9c\xed\x5a\xd9\x72\xe3\xc6\x15\x7d\x9f\xaf\x40\
+\x69\x1e\xec\xa9\x90\x60\xef\x0b\xb5\xb8\x1c\xbb\xec\x24\xe5\x2c\
+\xe5\xb1\x2b\xcf\x20\xd8\xa2\x60\x81\x84\x02\x82\x5a\xe6\x6f\xf2\
+\x2d\xf9\xb1\x9c\x06\x48\x02\x10\xc1\x4d\xe2\xcc\x64\x5c\xa1\x1e\
+\x04\x34\x6f\x2f\xf7\xde\x73\xd7\xe6\xc5\x37\x8f\xd3\x34\xb8\x77\
+\xf9\x3c\xc9\x66\x97\x67\x34\x24\x67\x81\x9b\xc5\xd9\x38\x99\x4d\
+\x2e\xcf\x7e\xfd\xe5\x87\xbe\x39\x0b\xe6\x45\x34\x1b\x47\x69\x36\
+\x73\x97\x67\xb3\xec\xec\x9b\xab\x37\x17\xf3\xfb\xc9\x9b\x20\x08\
+\x30\x79\x36\x1f\x8e\xe3\xcb\xb3\x9b\xa2\xb8\x1b\x0e\x06\x77\x8b\
+\x3c\x0d\xb3\x7c\x32\x18\xc7\x03\x97\xba\xa9\x9b\x15\xf3\x01\x0d\
+\xe9\xe0\xac\x26\x8f\x6b\xf2\x38\x77\x51\x91\xdc\xbb\x38\x9b\x4e\
+\xb3\xd9\xbc\x9c\x39\x9b\xbf\x6d\x10\xe7\xe3\xeb\x35\xf5\xc3\xc3\
+\x43\xf8\xc0\x4b\x22\x6a\xad\x1d\x10\x36\x60\xac\x0f\x8a\xfe\xfc\
+\x69\x56\x44\x8f\xfd\xf6\x54\x9c\xb1\x6b\x2a\x23\x84\x0c\xf0\x5d\
+\x4d\x79\x18\xd5\xf0\x31\x4d\x66\xb7\x5b\x0f\x53\x7e\x5b\x52\xb7\
+\xa4\xe9\x07\x92\xf1\xe5\x19\x96\xa2\x94\x93\x6a\xe0\xc6\x25\x93\
+\x9b\xe2\xf2\x8c\x49\x55\xbe\x3f\x24\xe3\xe2\xa6\x7a\xbd\xc2\xfb\
+\xc5\xd8\x5d\xcf\xfd\x78\x35\xd5\xbf\xf1\xf2\x0b\x7c\x85\x5d\x5c\
+\x94\xff\x98\x47\xe3\x04\xb2\xad\x88\x2a\xb2\xf6\x37\x92\x73\xb9\
+\x9c\x83\x59\xf3\x22\xbb\x5b\xd1\x2e\xcf\x83\x11\xd0\xe8\xb3\x7a\
+\x38\xbb\xbe\x9e\x3b\x9c\x8a\x34\xc6\xe6\xc5\x53\xea\x2a\xea\x7e\
+\x9c\xa5\x59\x3e\x7c\x7b\x5d\x7e\xce\xcb\xa1\xec\x2e\x8a\x93\xe2\
+\x69\x48\xcf\xcf\x82\xc1\xfe\xdd\x6c\xc7\x6e\xf4\xf8\xdd\x48\xbd\
+\xdb\xc5\xa0\xcd\xf6\xd1\x52\xa2\x7c\x9b\x94\x3a\x0e\x63\xed\xc8\
+\x8c\x9f\xb3\xbe\x47\x82\x35\xfb\x54\x1e\x24\x24\xde\xb5\x60\xc8\
+\xb8\x26\x92\x18\xb5\x5b\x5a\xdc\x2a\x1b\x99\x97\xe8\x86\x76\x22\
+\x21\x94\x42\x13\x45\x94\xde\xbd\xad\xb8\xd6\x6e\x14\x1d\xbe\x6d\
+\x97\x68\xd5\x48\x8d\xf5\x01\xa2\x0d\xb5\x90\x52\x2b\xcb\x3a\x65\
+\xcc\xe8\x41\x32\xee\x5e\xd9\x68\xcc\x17\x7c\x8f\x8c\x23\x32\x1a\
+\x8f\xe3\xe7\x27\x3d\x86\x57\xcd\xec\x75\xbc\x69\x41\xbb\x6d\xa3\
+\xa1\x2a\x7b\x2a\xf8\x1b\x2a\xd9\x3e\x27\x01\x1a\x71\xbc\x93\xe0\
+\x42\xc9\x48\xbc\x0a\x11\x5b\x40\xd5\x89\xd2\x0e\x39\x01\xd1\x62\
+\x3f\x16\xc0\x9d\x3a\xde\x29\x6d\x51\xe0\x89\xb4\xc2\x19\xd1\xfb\
+\xb4\x02\x9a\x2e\x67\xba\x47\x2b\xce\x7f\x9e\x41\x97\x84\x30\x71\
+\x69\x0c\x13\x07\xf8\x09\xd8\x47\x97\xe9\xec\x11\x57\xe7\xb6\x27\
+\x13\x17\x33\x62\xaf\xb8\x40\xf3\x02\x71\x1d\x0b\xe2\x7a\x37\xf9\
+\x02\x29\x75\xed\x76\x4a\x29\xc1\xe9\xed\x3d\x77\x77\xf0\xf9\xe8\
+\xa6\x2e\x47\x46\x8d\xdc\x41\xa6\xce\xab\x8f\xe8\xb0\x78\x88\xfd\
+\x80\x08\x0b\x26\xe5\xf1\xca\x31\x3c\x32\x63\xf3\xb1\x94\x63\x94\
+\xda\xef\x87\x95\x7a\x81\x1f\x26\xe5\xe7\x78\x08\x63\xb7\x17\xf8\
+\xc5\xae\xdd\x5e\x2a\xa5\x27\x86\xed\x6c\x48\xa9\xa4\xac\x8e\xf5\
+\x8f\x7e\x54\x86\x82\x5a\xd1\xc8\x58\x9e\x28\x46\x49\xa8\x40\x49\
+\xea\x63\x3f\xfa\x51\x0e\xf7\x06\x5c\xd4\xa2\x9b\x2c\xf7\xf9\x25\
+\x8f\x66\xf3\xeb\x2c\x9f\x5e\x9e\x4d\xa3\x22\x4f\x1e\xbf\x46\xba\
+\x6e\xa8\x57\x45\x8f\xe0\x0f\x45\x0b\x55\x0a\x96\xdc\xeb\x23\x33\
+\x80\x4b\x16\x86\xf5\xfa\x34\x34\x8a\x31\xc1\xc5\xbb\x8d\x05\x7f\
+\x9d\x25\x05\x4a\x89\xc5\xdc\xe5\xef\xc1\xbb\xfb\xfb\xec\xd7\xb9\
+\x3b\xdb\xae\x74\x2a\x1a\xd9\x5c\x59\x3d\x0c\x6f\x72\x87\x6a\xe7\
+\x6d\x87\xe5\xae\x45\xb8\x5d\x58\x4c\x85\x86\x10\x4b\x79\x4b\x58\
+\x5c\x87\x82\x30\x29\x5b\xb2\x62\x36\x44\x08\x53\x44\xb6\x64\x05\
+\x52\xca\x0c\x91\xec\x00\x59\xf5\xdb\xc2\xea\xd7\xd2\x92\x24\x24\
+\x56\x48\xdb\x13\x36\x54\x42\x18\x79\x1a\x51\x99\xc3\x44\x85\x50\
+\xb0\x16\x95\x1f\x8c\xd2\xe7\xa2\xca\x4b\x00\xe1\x64\xba\x51\xfc\
+\x5c\x3f\x81\x7d\x15\x0a\x84\x37\xd6\x18\x7d\x84\xa8\x44\x68\xb8\
+\xa6\xac\x56\x55\xdc\x49\x1b\x77\xd2\xee\x00\x5b\x29\x37\xa4\x2e\
+\x5c\x69\xc6\x3d\xde\x94\xcf\x3f\x89\x7a\x89\xb4\xda\x9c\x52\x49\
+\xf8\x21\xd2\x2a\xbd\xce\x1e\x60\x1d\x76\x86\xa5\xad\x6a\xad\x88\
+\x90\x6d\x5b\x85\xc1\x18\xca\xa9\x69\xe1\x0f\x48\xb3\x44\x10\x65\
+\x5a\xf8\x03\x60\x04\x2c\x58\xeb\x1d\x48\x40\xbe\x76\x10\x12\xca\
+\xcc\xf6\x00\xa3\xf9\xb4\x1e\x66\xbb\xd5\x08\x13\x2a\x6e\x61\x2c\
+\x3d\xa1\x97\x2e\xe6\xf5\x66\x63\xa8\x26\x5f\xac\x87\xd9\xea\x8d\
+\x59\xc8\xb4\x14\xb0\xf4\x5e\x9f\x9f\xcc\xc3\x40\x54\xec\x78\x0f\
+\xb3\x13\x57\x27\xb7\x86\x57\xf0\x26\x4e\x69\x33\x4c\x43\xb7\x94\
+\xf0\x36\x6f\x42\x86\xd4\x1a\xcb\x68\x1b\x07\xbe\x85\x40\x94\x6e\
+\xdb\x8c\x0c\x41\x28\xed\x69\x78\x3b\xc8\x1f\x94\x35\xd5\x21\xbc\
+\x95\x19\xa6\x6d\x74\xaa\x4a\xbd\x91\xd0\x2a\x4b\x0d\x6b\xf3\x66\
+\x42\x22\xac\x6a\xa0\xd9\xf3\xa6\x68\x28\x35\x93\x8d\x4c\xfa\xe5\
+\xbc\x99\x83\xcc\xb7\x6c\x62\x9d\xcc\x8f\x33\x19\x32\x25\x55\x23\
+\xb4\x79\x09\x48\x06\xcb\x65\x4a\xf3\xb6\x04\x36\x69\x31\x0a\x57\
+\x66\xe0\x11\x1b\x3a\xef\x6a\xbc\x09\x7a\x18\x6f\x5c\x7e\x69\x7a\
+\xa3\x52\x1d\x14\x7f\x0f\xd1\xdb\xc7\xd2\xc8\x2b\x78\x93\x47\xea\
+\xed\x62\xe0\x1b\xd8\xe5\xd3\xd4\x15\xd1\x38\x2a\xa2\x37\xeb\xd5\
+\x57\x23\x62\xd5\xdf\xce\xc7\xd7\xc3\x9f\xbf\xff\x61\x5d\x9e\xc4\
+\xf1\xf0\x9f\x59\x7e\x5b\x97\x1d\x9e\x20\x1a\x65\x0b\x54\x23\xeb\
+\x92\xc9\xb7\xcc\xe3\xa1\x0f\x1f\x51\x71\x95\x4c\xa3\x89\xf3\xad\
+\xfb\x3f\x3c\x4e\x53\x6c\xbe\xfe\xa2\x45\x5c\x3c\xdd\xb9\x7a\xd1\
+\x6a\xd9\xdc\xcd\xb3\x45\x1e\xbb\xce\xdb\x8c\x71\x3c\x4d\xfc\xa4\
+\xc1\xfb\x22\x49\xd3\x3f\xfb\x4d\x1a\x65\x54\xb5\x68\x79\x9d\x91\
+\xe5\x57\x8d\x85\x3d\x03\xdf\x4e\xd6\xc5\x4e\xeb\x08\x49\x91\xba\
+\xab\xbf\x44\xb7\x8b\x51\xf0\xbe\x70\x90\x5f\x5e\x1e\xb7\x1a\x6f\
+\xae\x31\xd8\x5c\xa4\xa4\xdc\xd8\xcf\x2f\x5b\xf1\x70\xb5\x64\xe1\
+\xb7\x64\x3a\x8d\xe2\x70\xba\x98\x27\xf1\x4d\x94\xa6\x61\xfc\xa1\
+\x9c\xba\xa4\xaa\x67\x62\x8b\x34\x89\xdd\x6c\xbe\x5f\x2c\x5d\xb7\
+\x36\xcb\xb9\xf3\xc1\x8f\xff\xf8\x69\xc0\x42\x32\xd8\x10\x4e\xc5\
+\x56\x17\x87\xe5\xa9\x17\xa3\xdf\x5c\xdc\x92\x52\x89\x85\x3f\x46\
+\x93\x67\x92\xf3\xa3\x69\x72\x95\xbb\x34\x8b\xc6\x17\x83\xe5\xeb\
+\x16\x9a\x6b\x1c\xfe\x66\x37\xd1\x7d\xe2\x1e\xba\x28\xaa\xb1\xd6\
+\xfe\x95\xe4\x9e\x9f\xb4\xd4\x7c\x36\x43\xd6\x32\x5a\x1c\xab\xfd\
+\x9f\x93\x38\xca\xc7\x59\xf0\x15\x1e\x6e\xbf\x0a\x7e\xcc\x66\x1f\
+\xfe\xf3\xef\xd4\x7d\x38\x16\x08\x9b\xdb\x97\xb4\xde\x74\x9a\xa6\
+\xf4\xd3\x73\x0d\x37\xac\xe9\x28\xe5\xb6\x81\x73\xe7\x72\x18\xc7\
+\x7c\x2f\x70\x1e\xdc\x28\x5c\x0d\x96\x0b\xc7\xf1\xe0\x67\x77\x97\
+\x67\xe3\x45\x5c\x24\xd9\xac\x8d\x99\x57\x2e\xfc\x7d\x32\xaf\x64\
+\xd2\xb5\x70\xee\xfe\xb5\x48\x30\xe3\x45\x2b\xff\x2d\x2b\x20\x90\
+\xd3\x1e\xd6\xe5\xc9\x7d\x29\x77\xaf\xb2\xf9\x69\xcf\xfb\xfe\x26\
+\xca\xdd\xb7\x69\x72\xbb\x79\xe6\xd7\xad\x5b\xbe\x7d\x97\x8d\x9b\
+\xeb\x96\xb8\x5b\xe2\x6c\xd5\xf6\x69\x38\xf5\x8b\xc1\xca\xe5\x97\
+\x6f\x93\x6a\x56\x51\xa7\xff\xe5\x63\x1a\x15\xee\x6b\x4a\x44\xa8\
+\xac\x62\xa6\x47\x09\xf3\x89\x73\x5d\x1c\x97\x81\x29\x7a\x72\xf9\
+\xaa\xa7\xb9\x5a\x68\xdd\x96\xaa\xdb\xdb\xf2\xfc\x1a\x0e\x7b\x38\
+\xcb\x66\xae\x7c\x6a\xf4\xc1\x00\x90\xec\xd6\x35\x2e\x19\xfd\x6b\
+\xc7\xf5\x53\xb1\x51\x9d\x10\x24\xbb\xc4\x28\x83\x0a\x9e\xa2\x28\
+\x54\xeb\xff\xfd\xf5\x37\x78\xd2\xfe\x91\xf7\x50\x4e\xa2\xb0\xa7\
+\x8d\x8a\xce\x9f\x7f\xc2\x04\xab\x6f\x28\x6a\x06\x36\x37\x43\x35\
+\x4a\xa8\xb2\x7e\x17\xfc\xc9\x50\x5b\xcb\x39\xc1\x0e\x5e\x2e\x52\
+\x4b\x6c\xd1\xa7\x8c\x86\x82\x59\x63\x9e\x6d\x82\x80\xdd\xe8\xfb\
+\xba\x34\x4d\xee\x5a\xf6\xff\xe4\xb3\x03\x6e\x95\xb1\xad\xb6\x68\
+\xfe\xd8\xd5\x26\xd9\xd6\xfc\xd8\xd6\xfe\xe8\x62\x06\x45\xaf\xa4\
+\x42\xa1\x80\xab\x6a\x60\x48\xc9\x52\x7f\x03\xd1\x53\xc8\xd6\x18\
+\x67\x5c\xf7\x94\x0d\x25\x2a\xad\xa6\xc4\x2a\x76\xee\xa2\xe2\x06\
+\x35\x61\x47\xd3\xb3\xdd\x81\x1c\x27\xf3\x3b\xe0\x63\x98\xcc\x7c\
+\x5a\x72\x9e\xdd\xbb\xfc\x3a\xcd\x1e\x86\xf7\xc9\x3c\x19\xa5\xee\
+\xbc\xfc\x9f\xa4\x5e\xcb\xab\xa1\x1a\x30\x5c\x51\x7c\x88\xad\x70\
+\x83\x14\xe0\xeb\xb7\x9b\x0d\x96\x77\xcf\xb1\x54\xbe\xe6\x8b\xd4\
+\x0d\xdd\xbd\x9b\x65\xe3\xf1\x0a\x5d\x25\xf0\x96\xd0\x2a\x2f\xfa\
+\xd7\xc0\xeb\xfb\xc3\xc5\xd1\xdd\x10\x4e\xaa\x68\x8e\xfd\x96\x25\
+\xb3\x21\x7c\x89\xcb\x57\xa3\xe5\x4b\x9a\xe0\xdf\x90\x92\xd5\xe0\
+\x38\x9a\xc3\xb2\x73\xf0\xd9\xdc\xc3\x8f\x56\xfd\xda\x21\xd9\x80\
+\xf4\xf9\x34\xca\x6f\x5d\x5e\x4d\xa8\x9e\xfb\xf3\x22\xca\x8b\xd6\
+\xc8\x34\x19\xb7\xde\xdd\xac\x7a\x6f\x9a\xb9\x57\xc5\x81\x5a\x18\
+\xa5\x59\x7c\x7b\xa4\x12\x24\x8a\x1f\xcd\x38\x6f\x28\x61\xb3\x7d\
+\xba\x43\x09\x38\xee\x07\x97\x67\x2b\x25\x74\x2f\x60\xde\x3d\x53\
+\x0c\x0a\x03\x4e\x80\x45\xf6\x2a\x0d\x89\xcf\xa7\xa0\x5a\x23\x3e\
+\xb9\x0e\x98\xbf\xdd\x33\xc2\xea\x9e\xef\x47\x50\xd8\x9d\x0e\xe2\
+\x00\x76\x17\xf4\x75\x68\x84\x94\xc4\x96\x3d\x6d\xa6\xfd\x2d\x4e\
+\xd0\x57\x21\x80\x2f\xb4\xe8\x51\x1a\x32\xff\x8b\x05\xca\x83\x3f\
+\x05\xa8\xec\x09\x33\x4a\x9a\xe5\x5c\xd8\x29\x91\x4a\x81\xac\xef\
+\xbb\x5f\xf8\x06\xd5\x75\xe0\xbd\x9c\x46\xe9\x43\x7d\x9b\xbc\x9e\
+\xfe\xa1\xc3\x84\xfd\x62\x4d\x2c\x4d\xda\x24\x13\x6a\x1a\x55\x7d\
+\xa7\x13\x29\x5b\x71\x96\xf9\x96\xbc\xc7\x8a\x14\xdc\xd0\xea\xd1\
+\xb3\xeb\xdd\xb1\xa2\x84\xe0\x84\xd2\xd7\x3e\x8a\x2a\xb0\xc4\x43\
+\x4b\x29\x8c\xfb\xdd\xa6\xf7\xd8\x06\x32\xdf\x6e\xdc\x00\xd9\x2a\
+\x6a\x30\x22\x22\xa3\x9f\x23\x88\x09\xcb\x19\xbc\xd7\xf1\xb8\xa8\
+\xe3\x4e\x23\x46\xb7\xcd\xac\x16\x21\x35\xa6\xe9\x05\x4b\x7d\xff\
+\x35\x10\xd2\x37\x0f\xa1\x2d\xdf\x86\x87\x52\x25\x63\xc1\x77\x81\
+\x62\x70\xac\x42\x70\xd6\xe3\x02\x05\x31\x27\x32\x10\x3a\x84\x17\
+\x63\x82\xfa\xe0\x64\x99\x05\x36\x02\xc6\x42\xad\x88\x62\x10\x15\
+\xc2\x0a\xe5\x56\xf0\xe0\x27\x3f\x0a\xa9\x49\xad\x7b\x1c\x53\x98\
+\xff\x81\x44\xa0\x21\x5d\x8e\x12\xbe\xe7\xdb\x3b\x94\xe0\xb9\x9c\
+\x4c\x38\x4e\xd5\xe3\x3c\x84\x17\x17\x62\x05\x34\x1c\x44\x18\x8e\
+\xc8\x68\x11\xc3\x7d\x5d\xd8\x35\x44\x0d\x62\x87\x24\x4a\x43\x73\
+\x16\x87\xd5\x36\xe0\x2c\xf4\xb7\xdc\x4a\xf9\xe3\x70\xa6\x2d\x57\
+\x01\x03\xdc\xe0\x16\xa0\x57\xa6\x70\x6c\x25\xa8\x6e\x01\xec\xe4\
+\x8e\x88\x6e\xf7\x3f\x80\xfa\xe1\xfe\x67\x3b\x58\xb4\xb6\x42\x7d\
+\xa9\xee\xa6\x99\xf6\x4d\xba\xcc\x79\x33\x1b\x13\x86\x7a\xbb\xdd\
+\x9b\x94\x75\x88\xdc\x37\x8d\x36\x3c\x36\x44\xe8\xdd\x09\x7f\x8d\
+\xbd\xed\x77\x35\x86\xd2\x95\xa7\x11\x44\x2d\x3d\x8d\x06\x60\x57\
+\x9e\x46\xd9\xd2\xd5\x78\x07\xc8\xd7\xae\x46\x3e\xcf\x5f\x26\xb0\
+\x10\xb9\xcb\xbc\x3f\x0e\x7c\xbb\xc4\x7c\x54\xa8\x94\x60\x65\x9f\
+\xe0\xbf\x34\xec\x76\x79\x55\xa8\xc7\x6e\x7a\x55\xe6\xf3\x02\x66\
+\xa1\x62\x15\x72\x84\x12\xf8\xc8\xc0\x22\xa5\x37\xd2\x72\xe3\x7d\
+\x20\x7c\xa1\xa4\xca\xd3\x09\x44\x3d\x26\x7b\x1c\xf8\x40\x0c\xb3\
+\xd4\x8f\x31\x4d\x7d\xb6\x0b\xdf\x85\xf8\x18\x44\x01\x45\x85\x00\
+\xd7\x0c\x5f\xb7\x7e\x0a\x10\x54\x03\x1a\xf8\xa8\x69\x35\x3c\x1e\
+\x62\x32\x2b\xfb\x78\x70\xa2\xd6\xdf\x0c\x21\x29\xf1\x97\x85\x00\
+\x15\x3c\x23\xd5\x80\x17\x57\x48\xfb\x79\xa8\x40\xc6\x4b\xef\x2b\
+\x41\xa5\x7a\x26\xd4\xfe\xe7\x27\x32\xc0\x6e\x56\x0b\xe2\x69\xa4\
+\xf1\x60\x0c\x90\x9e\x53\x04\x27\x0e\x1a\x26\x85\xe2\x06\x34\x86\
+\xfb\x5b\x27\x0f\x58\x2e\x24\x1c\xb8\x3f\x42\x85\x70\x94\xf9\xd8\
+\x8c\xdb\x00\x0f\x9e\x7b\x04\x7b\x11\x12\xb8\x5e\xf8\x7f\xb6\xe2\
+\x09\x09\x03\x21\x7e\x5f\x44\x19\xe9\x2f\x37\x14\xb2\x07\x1f\x65\
+\xa4\x44\xc9\x12\x20\x08\x61\xc4\x60\x2e\x04\x62\x25\x91\x48\x21\
+\x84\x09\x91\x3b\xf8\x2d\x98\x0e\x3d\xb7\x12\x27\x83\xbd\x68\x2d\
+\x38\xf5\xc2\x84\xd4\x10\x13\x02\x2c\xc2\x98\x66\xb4\x2a\x9f\xa4\
+\x55\xd2\x7a\x36\x39\xf1\xb9\x8a\x3f\xb0\xf2\x97\x6e\x7a\xa7\x3c\
+\xfd\x7d\x5b\xa9\x0f\x7f\xd3\xe6\xd5\x26\x9f\x45\x8b\xee\xba\x13\
+\x3c\x19\x42\x98\x72\x7d\x14\x9c\xdd\x2e\xae\x6d\xb7\xeb\xd2\x84\
+\xb6\x4a\x93\x2a\x05\xd3\x10\x2d\x81\x14\x7a\xa8\x9b\x18\xf3\xf1\
+\x6e\x19\x19\xd7\x19\xd8\x32\x01\xd3\xc1\x3a\xfd\xaa\x13\xa8\xe0\
+\x06\x00\x80\x8e\xe9\x3a\xfb\xea\x2f\xd3\x2f\xd3\x5b\x25\x5f\x9e\
+\xd1\x65\xf2\xc5\xea\xcc\xad\xc5\xea\xa7\xcf\xcf\xfd\xe5\xe3\xab\
+\xf2\x73\x7f\x25\xf7\xbb\xcb\xcf\xbb\x93\xde\xbd\x59\xa8\x16\x9f\
+\x21\x0b\xdd\x15\x15\xcb\xa8\x47\x39\xf0\x56\x05\x45\x6b\xed\xf2\
+\xc9\x54\x89\xb8\xff\x5a\x68\xea\x7b\x14\x78\x36\x48\x35\x7b\x48\
+\xe8\x08\xe0\x2f\xd5\x46\x54\x84\xdd\xb0\x4f\x1f\x15\x3b\x25\x6d\
+\x8e\x00\xed\x36\xd9\x4b\x06\x4b\xd4\xaf\xab\xf2\x3f\x1f\x46\xcf\
+\xdd\x2c\x82\xb4\xfa\xa3\x28\xbe\x9d\xe4\xd9\x02\xc3\x51\x1c\x2f\
+\xa6\x0b\xef\x1c\x3f\x53\xc9\x41\x57\x25\x07\xd7\xff\x83\x35\x47\
+\xc3\xfd\x8b\xfd\x29\xf1\x0a\xf1\xbb\xdb\x64\xcb\xac\x93\xe8\x5e\
+\x9d\x75\xae\x92\x4e\xb1\x34\xb0\x32\xeb\xf4\x06\x66\x90\x9f\x21\
+\x41\xa8\x0c\x4c\x71\xb9\xad\xc2\xdd\xd5\x03\xdd\xea\x47\x5e\x9d\
+\x5d\xef\x30\xec\x2e\xbe\xad\x45\x5c\x01\xdf\xe0\x11\x41\x58\x28\
+\xc4\xba\xd6\xb3\xa7\x30\x44\x09\xef\x7a\x98\x4f\x5a\x98\x77\x3d\
+\x8c\x68\x60\xaf\x55\xdb\xff\x3f\x7b\xfb\x9d\x67\x6f\x0d\xbb\x33\
+\x9f\xa0\x09\xf0\xda\x2a\xca\xff\x56\xa5\xab\x8a\xd2\x9c\xda\xcf\
+\x15\x2b\x48\x58\xfd\xf8\x9f\xcb\xd3\x77\x02\x96\x0f\xe5\xbf\x0b\
+\x7f\x21\x7f\xf5\xe6\xbf\xbb\x2d\x83\x8a\
+\x00\x00\x25\x6e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x96\x00\x00\x00\x96\x08\x06\x00\x00\x00\x3c\x01\x71\xe2\
+\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xd2\x00\xd2\x00\xd2\xec\xa6\
+\xc5\xe0\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\
+\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x20\x00\x49\x44\x41\x54\x78\
+\xda\xed\x7d\x69\x8c\x64\xd7\x75\xde\x77\xef\xbb\x6f\xad\xb5\x97\
+\xe9\x99\xe9\xe9\xe9\x21\x87\xdb\x90\x14\x29\xc9\x8a\xec\xc8\xb6\
+\x14\x29\xb0\x64\xd8\xa6\x94\xb1\x6c\xc3\x88\x05\x47\x0e\x62\x28\
+\x41\x14\x07\x48\xec\x40\x40\x2c\x05\x46\x12\x25\x86\x13\xe4\x47\
+\x12\xc3\xd1\x62\xad\x14\x64\x91\xa6\x38\x22\x29\xee\xe2\x22\x91\
+\x14\xf7\x65\x86\x1c\xce\xbe\x74\x4f\xef\x4b\x75\x2d\xaf\xde\x7e\
+\x6f\x7e\xdc\x57\xaf\xaa\xba\x7b\x7a\x7a\xa9\xea\x65\xe6\x1d\x60\
+\x00\x82\xdd\x5d\xf5\x96\xef\x9d\xe5\x3b\xdf\x39\x0f\x48\x2d\xb5\
+\xd4\x52\x4b\x2d\xb5\xd4\x52\x4b\x2d\xb5\xd4\x52\x4b\x2d\xb5\xd4\
+\x52\x4b\x2d\xb5\xd4\x52\x4b\x2d\xb5\xd4\x52\x4b\x2d\xb5\xd4\x52\
+\x4b\x2d\xb5\xd4\x52\x4b\x2d\xb5\x6b\xce\x48\x7a\x09\xb6\xcf\xbd\
+\xd8\x7f\xd7\xbe\xac\x10\xa2\x00\xc0\x20\x94\xf4\x0b\x2e\x7c\x00\
+\x81\x08\xc5\x02\x0f\x85\x3b\xf1\x93\xc9\x79\x00\x22\xfe\x7d\xd1\
+\xf2\xdf\x29\xb0\x52\x93\x36\x7c\x78\x88\x42\xe0\x1f\x00\xf8\x27\
+\x00\x6e\x07\xc1\xfb\x01\xec\x02\x60\x5e\xe6\x4f\x22\xca\xc8\x98\
+\x10\xe2\xe7\x41\x25\xbc\x67\xee\xb5\xf9\x27\xbd\x79\xdf\x05\x10\
+\x01\xe0\x2d\x60\x4b\x81\x75\x8d\x02\xea\xfd\x00\xfe\x04\xc0\x27\
+\x01\xf4\xaf\xfb\xc6\x51\x84\xa0\x18\x05\x17\x0f\xf8\x0b\xe1\xc3\
+\xb3\xaf\xce\xbf\x10\x54\x02\x2f\x06\x9a\xd8\x6a\xa0\xa5\xc0\xda\
+\x3c\x40\x7d\x08\xc0\x7f\x06\xf0\x8f\x01\xd0\x8e\xdf\x48\x46\xea\
+\x84\x88\xe3\xa1\xcd\xef\x77\x67\xbc\x7b\x2b\xa7\x2a\x63\x7e\x39\
+\xf0\x63\x6f\xb6\xe9\x61\x33\x05\x56\xf7\x01\x35\x04\xe0\xbf\x00\
+\xf8\xa3\x4d\xbd\xb1\x0c\x0b\x84\xe0\xc5\xa0\x1a\xdd\xeb\x4c\xba\
+\x8f\xcf\xbf\x59\x9a\x69\x09\x9b\x5d\x07\x5a\x0a\xac\xee\x01\xca\
+\x8c\x43\xde\x97\x00\x64\xb7\x38\xe1\x11\x94\x91\x09\x1e\xf2\x87\
+\xc3\x5a\xf8\x43\x7b\xd4\x79\xa5\x7c\xa2\x52\xe9\x66\x7e\x96\x02\
+\xab\x3b\xa0\xfa\x5d\x00\xff\x0d\xc0\x4d\xdb\xb2\x62\x23\x08\xa9\
+\x46\x4e\x45\x2e\x7f\xdc\x99\xf2\xbe\x39\xf3\xe2\xec\x69\x00\x61\
+\x27\xf3\xb3\x14\x58\x9d\x05\xd4\x9d\x00\xfe\x07\x80\x4f\xec\x28\
+\x9e\x83\xc2\x27\x0a\x5e\x89\x7c\xfe\x90\x3b\xe5\x1d\x99\x79\x71\
+\xee\x42\x0c\xb4\x75\x87\xcd\x14\x58\x9d\x01\x54\x2f\x80\xbf\x02\
+\xf0\x59\x00\x6c\x47\x9f\x0c\x81\xa0\x0a\x99\x17\x42\xbc\x19\x94\
+\xc3\xaf\xdb\xa3\xf5\xa7\xca\x27\x2b\xe5\xb5\xe6\x67\x29\xb0\x36\
+\x06\x28\x1d\xc0\xbf\x04\xf0\x17\x00\x7a\xae\xca\x93\x94\xf9\xd9\
+\x39\x11\xf1\xe7\x9c\x49\xef\xff\x4e\xbf\x30\x7b\x1c\x40\xd0\x12\
+\x36\x45\x0a\xac\xce\x82\xea\x53\x31\x7d\xf0\xde\x6b\xe6\xa4\x09\
+\x84\x9a\xa1\x93\x7e\xd9\xfb\xd7\xa3\x0f\x4e\x3d\x0b\xc0\x8e\x41\
+\x26\x52\x60\x6d\x1c\x50\xb7\xc7\x79\xd4\x6f\x5c\xab\xd7\x80\x6a\
+\x04\xe6\x6e\xe5\xa7\x17\xfe\x7e\xe2\x73\xce\x84\x37\x06\xa0\xde\
+\x52\x5d\xa6\xc0\x5a\x23\xa0\xfa\x00\x7c\x01\xc0\xbf\x07\xa0\x5c\
+\xeb\xd7\x83\xaa\x04\xb9\x1b\xb5\x0b\xa3\x0f\x4c\x7d\x66\xe1\x9d\
+\xda\xdb\x00\x6a\xad\xe0\x52\x52\xc8\x5c\x11\x50\x4a\xe1\x50\xfe\
+\x8f\x01\xdc\x03\xe0\xd7\xd1\x05\xd6\x7c\x27\x9a\xe0\x00\xf7\x44\
+\xb1\xff\x83\xb9\x5f\x98\x7e\xae\xf4\x93\x38\x2c\x86\x29\xb0\x56\
+\x07\xaa\x8f\x01\xb8\x17\xc0\xe7\x00\xe4\xd2\x2b\xd2\x6e\xdc\x17\
+\x30\xfa\xd9\xde\xdc\x41\x93\x94\xde\xaa\xbe\xd1\x1a\x12\x59\x7a\
+\x79\x96\x05\xd4\xcd\x31\x7d\x70\x57\xfa\xf0\xad\x6c\xf5\xb1\x00\
+\xf9\x43\x99\x3f\x50\x73\xec\xef\x83\x6a\x58\x01\x50\x06\x20\xd2\
+\x8b\xd6\x0e\xa8\xde\xc2\xa1\xfc\x97\x00\x7c\x1b\xc0\x7b\xd2\xb0\
+\xb7\x3a\xaf\x65\xee\x56\x0d\x66\xd1\x85\xf2\x09\xfb\x28\x80\x2a\
+\x00\x9e\x7a\x2c\xc4\xda\x28\xe0\x9f\xc6\x5e\x6a\x30\xbd\x22\x6b\
+\xb3\xc8\xe1\xc8\xdf\x94\xf9\x38\x80\xef\x01\x98\x02\x10\xd2\x14\
+\x54\x43\x1f\x06\xf0\x3c\x80\xbb\x53\x50\xad\xd3\x6b\x85\x00\x61\
+\x24\x07\xa0\x08\x40\x03\x40\xd8\x35\x0c\xa8\xfd\x90\x8d\xe2\xcf\
+\xe0\x2a\xa1\x5d\x08\x05\x14\x8b\x42\xcd\x50\x08\x01\xf0\x50\x20\
+\x58\x88\x20\x78\xf7\xbf\x9b\x99\xb4\x00\xc0\x68\xe4\xed\xec\x1a\
+\x04\x54\x16\xc0\xbf\x01\xf0\x45\x00\x99\xab\xe1\x9c\x14\x93\x22\
+\x33\xac\x42\xef\x63\x08\xab\xe1\xac\x33\xed\x8f\xb8\x33\xfe\x48\
+\x50\x0d\xe7\xd4\x1c\xcb\x6b\xbd\xda\x21\x11\x90\x9b\x83\x2a\xd7\
+\xbb\xf1\xfd\x94\x01\x91\xcb\xed\x38\x27\x25\xd7\x14\xb0\xe2\x3c\
+\xea\xf7\x00\xfc\x4f\x00\x43\x57\xcb\x79\x59\xfb\x54\x64\x0e\x68\
+\x08\x6b\xe1\xdc\xd8\x23\x33\x8f\x4e\x3e\x3d\xff\x2c\x80\x69\x00\
+\xa5\x96\xf2\x5f\x03\x90\x1b\xfc\xf8\xc0\x3f\x53\x73\xda\x1f\x08\
+\xde\xd9\xa2\x44\x2d\x28\xf0\x4b\x81\x8b\xa6\x22\xe2\xda\x00\x56\
+\x2c\x0b\xfe\xaf\x90\xb2\xe0\x2e\x87\x23\x02\xc1\x37\x47\x05\x9c\
+\xbb\x41\x83\xb9\x57\x45\xf5\x5c\xfd\xed\xb3\xdf\x1e\xff\x56\x68\
+\x47\xef\x02\xb8\x08\x60\x2e\x06\x55\x08\xd9\xc7\xa3\x00\xf4\xf1\
+\x27\xa6\x4f\xf6\xdc\x51\x78\x2c\x7f\x53\xee\x2b\x82\xc3\xea\x94\
+\xb7\xa4\x2a\x81\x3d\xe2\x9e\x6a\xfd\x4e\x76\x95\x03\x6a\x08\xc0\
+\x5f\xc6\x79\x54\x57\x8d\x6a\x14\x99\xfd\x16\x14\x5d\xc1\xc2\xf1\
+\x72\xf7\x3d\xd5\xa0\x0a\x73\xaf\x8a\xf2\x09\xfb\xb5\xd3\x5f\xbf\
+\xf4\x35\x00\x6f\x03\x38\x1f\x7b\xaa\x86\xd6\xbd\xd5\x1c\x00\xd5\
+\xd2\xb1\xf2\x03\x2c\xa3\x0a\x73\x8f\xf1\xdd\x4e\xe4\x96\x7a\xaf\
+\x64\xac\x4a\x6f\x57\xdf\x02\x50\x89\xbf\xfb\xea\xe4\x69\x86\x0f\
+\x0f\x19\xc3\x87\x87\xbe\x08\xe0\xd8\x66\x80\x0a\x00\x32\x43\x16\
+\xcc\xbd\x26\xb4\x1e\x0d\x54\xa3\x5d\x06\x31\x41\xe6\x80\x0a\xbf\
+\x14\x4c\x9d\xbb\x7b\xfc\xbb\x00\x8e\x02\x38\x09\x60\x06\x40\x63\
+\x24\x4c\x2c\xfa\xc7\x21\x95\x08\xb5\x99\x17\x67\xef\xe3\x01\x7f\
+\xb0\x13\xc7\xa2\xf5\x2a\xe0\x1e\x77\xaa\xa7\xeb\x67\x62\x60\x05\
+\x00\x04\xbd\x0a\x41\xf5\xdb\x00\xde\x82\x1c\x60\x28\x76\xf3\xbb\
+\xf4\x5e\x0d\x6a\x5e\x05\x00\xb8\xb3\x5e\x1c\x0b\x01\xa3\x5f\xef\
+\xea\x39\x1a\x03\x0c\x44\x21\x98\x7c\xa6\xf4\x70\xe4\xf2\x13\xb1\
+\xa7\x5a\x68\x09\x7d\x2b\xb2\x03\x00\x3c\xee\xf3\x2f\x6f\x3c\xee\
+\x03\x6a\x86\xc2\x1e\x75\x4f\x44\x1e\x9f\x41\x4b\x23\x9a\x5e\x45\
+\x80\xba\x6d\xf8\xf0\xd0\xb3\x00\xee\x03\x70\x73\xb7\xbf\xaf\x70\
+\x6b\x1e\x85\xdb\x0a\xb0\xf6\xca\xf9\xd2\xa0\x12\x20\x72\x23\x09\
+\xb8\x18\x58\x5a\x51\x43\xe1\x50\x1e\xa4\xc3\x64\x86\xb9\x9b\x21\
+\xa8\x84\xb3\xd3\xcf\x97\x5e\x00\x30\x12\x83\x2a\xc2\xea\x25\xc4\
+\x62\xfc\x89\xc9\x57\x85\x10\x2f\x6f\x28\x69\xcf\x52\x10\x46\xe0\
+\x95\x82\x89\x45\xc5\xc2\xce\x4f\xde\x87\x0f\x0f\xf5\x03\xf8\xf3\
+\x98\x42\xd8\xb4\xf3\x21\x71\x7a\xa2\xf5\x6a\x20\x0a\x81\x88\x04\
+\xbc\x59\x0f\xd6\x90\x05\x35\xa7\xa2\x78\x7b\x01\x5a\x8f\x26\x3d\
+\x4c\xd9\x84\x33\xe1\x74\x2c\x0c\x2a\x06\x45\xf5\x6c\xfd\x24\x80\
+\x49\x00\xf3\xb8\x8c\xd8\xee\x4a\xe0\x22\x20\x27\x01\xfc\xe2\xfa\
+\xc3\x20\x03\x04\xc4\xdc\xab\x95\x57\x20\x7b\x84\x7e\xc2\x6b\xed\
+\x60\x40\x69\x00\xfe\x10\xc0\xff\x06\x3a\x53\xe1\xac\xc5\xdc\x59\
+\x17\x5a\x9f\x04\x95\xde\xa7\xc3\x9d\x76\xe1\xcd\xfb\xb0\x86\x2c\
+\x80\x20\x01\x95\x08\x45\x47\x07\xab\x08\x25\x00\x01\xec\x51\xf7\
+\x4c\x0c\xaa\xfa\x32\x89\xfa\xaa\x80\x15\x7b\x99\xf5\xe7\x57\x05\
+\x8a\xb0\x1e\x55\xaa\x67\xeb\xe7\xe2\xfc\x2a\x09\xc5\x6c\x87\x82\
+\xea\x53\x00\xfe\x3b\x80\xdb\xb6\xea\x18\xbc\x79\x1f\x22\x12\x20\
+\x0a\x81\xb1\x4b\x07\x21\x40\x66\xb8\x9d\x6f\x75\x27\x5d\xd4\x46\
+\x6c\x70\xbf\xf3\xd4\x37\xa1\x08\xe2\x4a\x2f\xdc\x48\x8e\xb4\x6e\
+\xcf\xc9\x08\xd4\xbc\x82\xf2\xbb\xf6\x89\x18\xe0\xb5\x38\x1c\xef\
+\x3c\x8f\x35\x7c\x78\xe8\xb6\x18\x50\x9f\xda\xea\x63\x11\x91\x80\
+\x3f\xef\x43\xdf\xa5\x43\xeb\xd1\x12\x0f\xd5\xea\x0f\xea\x13\x4e\
+\xc7\x41\x25\x78\xe2\x01\xf9\x1a\xf3\xaa\xe5\x6c\xdd\xc5\x0d\xcb\
+\xca\xf4\xbc\x36\xe2\x9c\x8c\x3d\x9f\xd3\x7a\x2c\x6c\x87\x00\xaa\
+\x07\xc0\x7f\x04\xf0\x6f\x21\x59\xe4\x2d\x37\x45\x97\x89\x6b\x5b\
+\xb9\xe5\x46\xa8\x4f\x38\xc8\x5e\x9f\x4d\xaa\xc3\x9a\x1d\xc2\xd8\
+\xa5\x43\xef\xd7\x51\x3e\x51\xd9\x70\x58\xe4\xbe\x40\xe8\x70\xa8\
+\x05\xd6\x03\xa9\x15\xdb\x48\x69\xf0\xab\xeb\xae\x88\xfb\x19\x04\
+\x17\x51\xe5\x84\xfd\x6e\x9c\x5f\x05\x6d\xc0\xdb\xe6\x80\x62\x00\
+\xfe\x18\xb2\xaf\xb7\x6f\x3b\x1c\x13\x51\x08\xac\x41\x13\xd6\x90\
+\x05\xa2\x34\xef\x69\xe4\x46\x98\x7f\xa3\x04\x11\x09\x18\x03\x06\
+\x58\x86\x41\xdf\xa5\x43\xcd\xab\x50\x0b\x92\x92\x30\x76\x19\x70\
+\xa7\xdd\x8d\xe7\x77\x53\x21\x72\xd7\x5b\x77\x42\x8e\xee\xab\x31\
+\x77\xb5\xd6\x6b\xfb\x61\x00\x07\x37\x92\x5f\xf9\xa5\x70\xd2\x1e\
+\x75\x2f\x2e\xce\xaf\xb6\x35\xdd\x30\x7c\x78\xe8\x23\x00\x5e\x02\
+\xf0\x37\xdd\x06\xd5\x62\xcf\x73\xa5\xdf\x4d\x40\x25\x00\xee\xf1\
+\xd8\x83\x29\xa0\x4c\x5e\x4e\x6f\x4e\x72\x5a\x8a\xa1\x24\xa0\xe2\
+\x6e\x04\x11\x74\x26\x2c\x3a\x53\x21\xd4\xa2\x7a\x73\xee\x06\xeb\
+\xc6\x18\x5c\xeb\x11\x6c\x7e\x61\xdd\xde\xda\xa4\x50\x4c\x8a\xfa\
+\x58\x52\x40\xd8\x8b\x0b\x08\xba\x0d\x01\xb5\x7f\xf8\xf0\xd0\x77\
+\x00\x3c\x05\xe0\x17\xba\xf9\x5d\x94\x51\xe4\x0e\x66\xd1\xf7\x81\
+\xde\x55\xb3\xe5\xdc\xe3\xa8\x5f\xaa\x23\xac\x86\x28\x1d\x5b\x40\
+\xf9\x64\x25\x49\x84\x8d\x01\x1d\xd6\x90\x05\x6b\xd0\x6a\xcb\xc5\
+\xec\x8b\x36\xe6\xde\x28\xc1\x2b\xf9\x9d\xc9\xb3\x42\x01\xfb\xbc\
+\x4f\x86\x0f\x0f\x7c\x1e\xc0\x00\x00\x7d\x2d\x21\x71\xf8\xf0\xd0\
+\x5d\x90\x83\x21\xeb\xe3\xaf\xf2\xf2\x5a\x55\x4e\xd7\xdf\x89\xf3\
+\x2b\x77\x71\xae\xa7\x6c\x23\x40\xe5\x0a\x87\xf2\x5f\x04\xf0\x77\
+\x00\x3e\xd0\x6d\xd0\x6b\x05\x15\x3d\x77\x16\xa1\x16\x25\x65\x40\
+\x19\x85\x37\xbf\xba\x1b\x1f\x54\x03\x38\x93\x2e\xb8\xc7\xc1\x7d\
+\x0e\x73\xb7\x09\xc2\x08\xb4\xa2\x06\xad\xa8\x49\x4a\xa0\x01\x82\
+\x80\xcb\xdc\xaa\xc3\x85\x61\x58\xe7\x50\x73\xca\x60\x66\x48\xaf\
+\x94\xdf\xb5\xdf\x89\x93\x67\xbe\x8a\xeb\xfc\x21\x00\x3f\x82\xd4\
+\x4e\xad\xcb\xac\x41\x15\x2c\x43\xc5\xd9\x6f\x8e\x7d\x1d\xc0\xa9\
+\xd8\x6b\x85\xdb\xce\x63\x0d\x1f\x1e\xfa\x0c\x64\xaf\xeb\x4b\x1b\
+\x39\xe1\x35\xdd\x18\x27\x42\x2b\x25\x6e\x0c\x18\x50\x73\xab\x4c\
+\x39\x5b\x9e\x4d\x66\x31\x88\xa8\x3d\x23\x0f\x2a\x01\xdc\x29\x99\
+\xf6\x50\x5d\x81\x16\xb7\x7d\x3a\x6d\xf6\x48\x00\xbd\xcf\xfc\xb3\
+\xeb\x7e\x6f\xcf\x67\x01\xf4\xc5\x85\x0d\x59\xe1\x3a\x7f\x1e\xc0\
+\x23\xd8\xe0\x5a\x25\xbd\x4f\x81\x33\xe9\x9d\x13\x02\x0b\x8b\x69\
+\x86\x6d\xe1\xb1\x86\x0f\x0f\xfd\x72\xe1\x50\xfe\x08\x80\xcf\x63\
+\x93\xc7\xab\x1a\x60\xd0\x8a\x5a\x12\xca\x98\xc5\x56\x9d\x5c\x53\
+\x46\x91\xbd\x2e\x83\xfc\x4d\xb9\xb6\x30\xea\xcd\x78\x58\x38\x5e\
+\x46\x68\x47\xb0\x06\x4d\x80\x48\x8a\xc0\xef\x50\x18\x5c\xf2\x80\
+\xd8\x9c\x10\xaa\x7c\xac\xf7\xfd\x85\x8f\xb2\x2c\x3b\x5e\xbf\xe4\
+\xcc\xb7\x7a\xae\xa1\xdf\x1c\x2c\x16\x6f\x2b\x7c\xa2\x70\x6b\xfe\
+\xfb\x00\xfe\xc5\x46\x1f\x5c\x96\xa1\xb0\xf6\xa9\x28\x1f\xb7\x5f\
+\x5c\x38\x5e\x7b\x0a\xb2\xa5\xb4\x24\x14\xb2\x2d\x02\xd4\x10\xa4\
+\x3e\xea\x0f\xb7\xd2\x6b\x3a\xe3\x0e\xcc\xdd\x06\x14\x53\x89\x73\
+\x07\x15\x46\xbf\x0e\x77\xc6\xbb\x32\xb0\x74\x0a\x73\xaf\x04\x0e\
+\xb8\x80\xe0\x32\xb1\x67\x19\xf9\x59\x91\x17\x21\xa8\x06\xc9\x67\
+\xd6\xce\xdb\x5d\xd3\x69\xf1\x50\x80\x87\xf8\x80\xb9\xc7\x7a\xe6\
+\xc0\xa7\x2d\x1b\xc0\x25\xc1\x31\x05\x81\x22\x08\x6e\x89\x73\xb0\
+\x8e\x58\x43\x26\x53\x3e\x61\xbf\x1d\xe7\x57\xde\x72\x5c\x1a\xdb\
+\x64\x40\x65\x62\xef\xd4\xfd\x2d\x77\x44\x96\xf7\x5a\x51\x45\xe5\
+\x54\xf5\xb2\x64\x63\xed\x82\x8d\xc2\xad\xf9\xe4\xff\x65\xaf\xcb\
+\x24\xac\xfa\xca\x9e\x22\x84\x33\xe9\x80\x6a\x14\xb5\xf3\x36\x8c\
+\x01\x1d\x99\xe1\x0c\x14\x8b\x81\x65\x19\xc2\x5a\x08\x77\xc6\x93\
+\xea\x07\x22\xfb\x7b\x61\x3d\xea\xb2\x1b\x06\x84\x40\x06\xc0\x2d\
+\x00\x6e\xe9\x86\x92\x5f\xcd\x2b\x08\xed\xa8\x5c\x3a\x56\x6d\xe5\
+\xaf\xb6\x06\x58\xc3\x87\x87\x08\x80\xdf\xc1\x26\x6d\xb9\x53\xb3\
+\x0c\xb9\x1b\xb2\x60\x39\x35\x2e\xff\xfd\x84\x02\x58\x6c\xde\x9c\
+\x07\x7f\xc1\x4f\x42\x22\xd5\x15\x58\xfb\x2c\xd8\x23\xf6\x15\xbf\
+\xa7\x7a\xae\x96\x5c\x52\x77\xc6\x4b\x5a\x3a\xc6\x2e\x1d\xb5\x5a\
+\x08\x6f\xce\x83\x9a\x63\xb0\x2f\xda\x88\x3c\x8e\x9d\x6e\x84\xca\
+\x8a\xb0\x3e\xe1\x35\xd4\x0c\xcb\xe6\x57\x9b\x92\xbc\x0f\x1f\x1e\
+\xba\x15\xc0\x63\x90\xa3\xea\x9b\xb2\x3a\x51\xb1\x58\x02\xaa\x86\
+\x17\x6a\xad\xd4\x96\x82\xab\x3d\xff\xb1\xf6\x99\x50\x74\x65\x55\
+\x1e\xa2\x61\x91\x13\x21\xa8\x48\xf2\xd9\xe8\xd3\x01\x02\x70\x9f\
+\xa3\x72\xaa\x7a\x55\x80\xaa\xe1\xad\x88\x42\x50\x3d\x55\x7f\xeb\
+\x72\x34\x43\xd7\x3d\x56\xbc\xe5\xee\x8b\x71\xe8\xdb\xd4\x36\x8c\
+\x3b\xe3\xc2\xdc\x63\x24\x22\x3c\xc5\x54\x60\x0d\x9a\xb0\x2f\xd5\
+\xdb\x01\x68\x28\xc8\x5e\x9f\x81\xde\xd7\x9e\x82\x10\x85\x20\x7b\
+\x5d\xa6\xc9\x51\xad\xfa\x7b\x3d\x28\x86\x82\xda\x48\x7d\x1b\xbf\
+\x33\x62\x03\x14\x4d\x31\xc9\xaf\x8e\x43\x6a\xc0\x2e\x9b\x8c\xb2\
+\x2e\x81\xea\x5f\xc5\x79\x54\xd7\x07\x40\x59\x96\x41\xcb\xab\x50\
+\x0c\x45\x86\xa6\xd8\x93\xd4\xce\xdb\xe8\xb9\xb3\x98\x14\xdf\xd6\
+\x90\x05\x67\x46\x72\x4f\x44\x21\xc8\xec\xb7\x64\xd5\x76\x19\x4f\
+\xa6\xf7\xeb\xd0\x26\x55\xf8\xe5\x60\xf5\xc0\x9a\x76\xe1\x4e\xbb\
+\x57\xcc\xcf\x76\xaa\xe9\x7d\x0a\xbc\xf9\x60\xa2\x7a\x2e\x91\xc9\
+\x44\x9b\xe2\xb1\x86\x0f\x0f\x7d\x02\xc0\xff\x41\x97\x15\x9c\x84\
+\x12\x98\x7b\x0c\x58\x83\x26\xa8\xd1\x0c\x59\xf5\xb1\x7a\x12\x76\
+\x82\x6a\x00\x77\xda\x85\xb1\x5b\x56\xd7\x84\x11\x64\x87\x33\xf0\
+\xcb\x01\xb2\xd7\x65\x96\x30\xed\xfe\xbc\x8f\xb0\x1e\x4a\x3d\x55\
+\x9c\xfc\x67\xaf\xcf\x62\xfe\xad\xd2\xaa\xbd\xcf\xd5\x0a\xa8\xc6\
+\xf5\x53\x0c\x8a\xda\xf9\xfa\x05\x2c\x23\x93\xe9\x0a\xb0\x86\x0f\
+\x0f\x0d\x03\xf8\x5f\x00\x3e\x8d\x2e\x4f\x15\xab\x59\x86\xfc\x2d\
+\xf9\x84\x22\x68\x4b\x18\x0d\xa5\x2d\x9f\xa9\x8d\xd8\xd0\xfb\xf4\
+\xa4\x17\x68\xec\x36\x12\xa0\x25\xb9\x51\x3d\x42\xf5\x7c\x0d\x7e\
+\xc9\x07\xa1\x04\x7a\x8f\x06\x25\xc3\x12\x6f\x68\x0e\x18\x70\xa6\
+\x5c\x5c\xeb\xa6\xf7\x2a\x0d\x81\xe1\xe9\x95\x68\x86\x8e\x00\x2b\
+\xa6\x0f\xbe\x00\x29\x69\xe9\x3a\xd9\xaa\xe6\x54\x14\xdf\x53\x68\
+\x53\x15\x80\x0b\x04\xd5\x10\xa1\x1d\x2e\x69\xf2\x36\xfa\x7a\x99\
+\xeb\x96\x0e\x3c\x8b\x90\xc3\x1e\xad\xc3\x19\x77\x20\x44\x93\x7e\
+\xa8\x5e\xb0\x51\xbc\xbd\x90\xfc\x5e\xe6\x40\x06\xee\x9c\x27\x95\
+\xa0\xd7\xb0\xa9\x39\x0a\x11\x89\x70\xe6\xa5\xf2\x6b\x58\x24\x43\
+\xee\x18\xb0\x86\x0f\x0f\x29\x00\xfe\x39\x80\x2f\x43\x36\x41\x37\
+\xa1\xd4\x25\xc8\xdf\x9c\x6b\x82\x8a\x0b\xd8\x97\xea\x70\x26\x5c\
+\xf0\x15\x54\x03\xf5\x71\x07\x46\x0b\x09\x0a\x00\xfe\x82\x8f\xca\
+\xc9\xea\xb2\x7f\xe7\x97\x24\x35\xd1\x48\xe8\xa9\x46\x91\x19\xb2\
+\x50\xbb\x60\x6f\xca\x0d\x6c\xa8\x52\xb7\x57\x1c\x04\xf4\x3e\x06\
+\x7f\x21\x9c\x0a\x2a\xe1\x14\xe4\xaa\xa2\x15\x45\x86\x74\x1d\xa0\
+\xfa\x65\x48\x39\xcb\xd7\x36\x0b\x54\xb2\x22\x51\xdb\xc0\x51\x39\
+\x53\x83\x3d\x52\x5f\x11\x54\x0d\x2f\x54\xbb\xd8\x0e\x0a\x66\xb2\
+\x15\x59\xf0\xda\x05\x1b\x68\xf9\xb9\x35\xb8\x4a\xfa\x61\x83\x80\
+\x72\x26\x5d\xd8\xa3\xf5\x8e\x68\xb6\x3a\x4a\xdf\x68\x04\x54\x23\
+\xa8\x5d\x70\x8e\xc7\x61\x70\x89\x4c\x66\xdd\xc0\x1a\x3e\x3c\x34\
+\x34\x7c\x78\xe8\xef\x00\xfc\x0c\x52\x7d\xb0\xb9\x27\x67\xb4\xdf\
+\xd8\x60\x0d\xd5\x9a\x37\xeb\x21\x58\x68\xfe\x3e\xd5\x29\xac\x7d\
+\x97\x9f\xbf\x88\x1c\xa9\x04\x05\xa4\x8e\xaa\x72\xba\x8a\xc8\xdb\
+\x20\x6b\x2e\x80\xa0\x16\xa2\x3e\xee\x2c\x0b\xea\xa0\xda\x1c\x1f\
+\x0b\xeb\x51\xf2\xdf\xdb\x82\x66\xe8\x91\xd7\xde\xbe\xe8\xac\x2a\
+\xbf\x5a\x55\x28\x8c\x5f\x36\xf4\xa7\x00\xfe\x0c\x40\x61\xab\x4e\
+\x8e\x2f\xca\x71\xac\x21\xb3\xad\xff\x46\x18\x91\x24\xa8\x00\x78\
+\xc8\x97\x9c\x76\xf5\x7c\x0d\xbd\xef\xeb\x69\xd2\x0f\xfb\x4c\xb8\
+\x53\xee\x65\x01\x63\x8f\xd6\xc1\x03\x01\x67\xc2\xe9\x48\xb5\xe7\
+\xce\x7a\x08\xed\x30\x0e\xc5\x01\xf4\xde\x76\x6a\xaf\xad\x4a\x25\
+\xd8\x56\xe1\x50\xef\x65\xe0\x3e\x77\x67\x5f\xa9\xbc\x85\x15\xda\
+\x38\xab\x02\x56\x2c\x0b\xfe\x14\xe4\x78\x55\x77\x65\xc1\x44\x7a\
+\xa4\xc8\xb9\xfc\x53\xea\x97\xfc\xb6\xfc\xc3\xdc\x6b\xc2\xdc\x6d\
+\xc8\xe6\x2f\x85\x94\xc0\x90\x66\x42\xef\x97\x02\xd4\x46\xec\xe4\
+\x66\x86\x76\x08\x67\xca\x81\xb9\x47\x0e\x98\x12\x85\x20\x7b\x7d\
+\x46\x6a\xa5\x96\x73\x30\xa1\x40\x7d\x11\xa1\xba\x91\x30\x17\xd6\
+\xc3\x36\xef\xa4\xe6\x18\xa8\xda\x04\x13\xb3\x18\xf4\x1e\x81\x28\
+\xe0\x50\xb3\xed\x3f\xdb\xd2\xf4\x8a\x02\x2c\x47\xe1\x4c\x7a\x17\
+\x78\xc0\x67\xaf\x44\x33\xac\x18\x0a\x63\x59\xf0\xf3\x90\x53\xc5\
+\x5d\x05\x95\x9a\x57\xd1\x7b\x67\x0f\xfa\xde\xdf\x03\x73\xcf\xe5\
+\x15\x1d\x3c\xe0\x4b\x6f\x34\x25\x92\x4a\xa0\xa4\x9d\xe4\xa0\x04\
+\x5a\x9f\x26\x85\x7c\x2d\x5a\x28\xfb\x62\x1d\x22\xe4\x2d\x84\x9f\
+\x0e\xad\xa0\x76\xfd\xe6\x04\xb5\xb0\xfd\xf9\x16\x58\x56\x46\xa3\
+\x16\xa4\x12\x62\x71\xd8\xdf\xd2\x6a\xb0\xa0\xc8\x6d\x32\xa3\xee\
+\x49\xac\x61\x8e\x51\x59\x04\x28\xa3\x70\x28\xff\x57\x00\xfe\x1f\
+\xba\xbc\x43\x8a\x6a\x14\xb9\x1b\xb2\xc8\x1d\xcc\x82\xea\x14\x20\
+\x04\x7a\xaf\x0e\x42\x08\xfc\xca\xf2\xf9\x53\x50\x0d\x40\x14\x02\
+\x35\xcb\xb0\x9a\xb9\x75\x42\x09\xb4\x82\x0a\x77\xd2\x95\x9d\x7f\
+\x2e\x00\xde\x1c\x26\x05\x01\x58\x86\x75\x97\xa7\x12\xb2\xd1\x2d\
+\xb8\x3c\xe7\x46\x58\xe5\x81\x90\x3a\x79\x75\x7b\x6f\x39\xc8\x5e\
+\xa7\x41\xd1\x49\x74\xf1\xde\xa9\x6f\x87\xb5\xe8\x18\xe4\xee\xad\
+\x2b\xce\x32\xb2\x16\x50\x0d\x40\xee\xe1\xfc\xf8\xa6\xc4\xed\x1e\
+\x0d\xc6\xc0\x52\x0f\x65\xed\xb7\xa0\x98\x0a\x2a\xa7\xaa\x4b\x93\
+\xdc\xb8\x55\xe3\x4c\xb8\xd0\xfb\xb4\xa4\x52\x13\x91\x00\x8f\x04\
+\xc0\x05\x08\xa3\x30\x77\xeb\xa0\xf1\xcf\x14\x43\x81\xd6\xa3\x25\
+\xea\x06\x67\x52\xf6\x11\x15\x8b\xc9\x90\xb9\xe0\x83\x10\x02\x21\
+\xba\xc3\x53\x45\x5e\x04\x1e\xc4\xa2\xc2\x82\x8a\xa0\x16\x26\x21\
+\xdf\x9b\xf7\x13\x31\xe0\x76\x34\xaa\x12\xe8\x7d\x0c\xb5\x11\xe7\
+\xa4\x33\xe9\x35\x56\x24\xad\x6a\x9c\x9f\x35\x3c\x15\x80\x6f\x6e\
+\x16\xa8\x92\xf0\xb0\x28\x07\x51\x63\x45\x82\xde\xaf\xa3\xa8\x51\
+\x94\x4f\x54\x96\x1d\xf8\x8c\xdc\x08\xf5\x31\x67\xc5\x2a\xb0\xf7\
+\xfd\xcd\x44\x9d\x65\x14\x78\x73\x2d\x24\xe8\x79\x1b\xd6\x1e\x13\
+\xd5\x0b\xb5\x15\xf3\xba\x55\x01\xc7\x89\xe0\x57\x02\x19\x62\x29\
+\x01\xb3\x18\xd4\x1c\x4b\xd4\x14\x8d\xf3\x24\x8a\xfc\x19\x65\x14\
+\x75\xd7\x91\x45\x46\xc0\x13\x31\xe0\x95\x0a\x17\xca\x36\x1f\x7d\
+\x99\x03\x1a\x00\xf0\xb9\x57\x2a\xcf\x02\x98\x80\xec\x0f\xae\x4a\
+\xaa\xd1\xf0\xc3\x9f\x03\xf0\x9b\x9b\x79\xd0\x91\x17\x25\x5c\x11\
+\x51\x08\x6a\xe7\x6c\xf8\x0b\x7e\x5b\xee\xd5\x73\x67\x11\xcc\x52\
+\x36\xf4\xd9\x12\xb8\x4b\x0b\x81\x85\x77\xcb\x1b\x06\x95\x37\xe7\
+\xc1\x99\x72\x11\x39\xd2\x2b\x71\x8f\xc3\x2f\xf9\x92\xb4\x8d\xab\
+\x58\x3d\x9e\x92\x96\x82\x3f\x49\x75\xa8\x19\xd6\x42\xd6\x06\x97\
+\xad\x3a\x05\x17\xf0\xe6\x7d\xd4\xc7\xae\xcc\xd7\x75\x3c\xb7\xca\
+\x51\x98\xbb\x19\xea\x13\xde\xb9\x99\x17\x17\x5e\x88\x81\xe5\x62\
+\x95\x9d\x53\x3a\x7c\x78\xa8\x08\xe0\x3f\x6d\xf6\xd3\x20\x42\xd1\
+\xc6\xd5\xb0\x2c\x43\xf9\x78\x05\xde\xac\xd7\xc6\x5d\xf5\xdc\xd9\
+\xd3\xd4\xa5\xaf\xb2\xc2\xcc\x5e\x97\x01\x1a\xe5\xba\x40\x1b\x60\
+\x3b\xe6\x71\x2b\x01\x82\x6a\xec\x8d\x48\x3b\x5d\xc0\x03\x0e\x77\
+\xd2\x49\xaa\x58\xad\xa0\xb6\x15\x09\x5a\x4f\x73\x92\x47\xc4\xe1\
+\x78\x59\x8a\x62\xc6\x93\x1a\x2f\x81\xae\xec\x7f\x58\xa9\x12\xcc\
+\x1e\xd4\x21\xb8\x88\x2e\xde\x3b\xf9\x7d\x34\xd7\x4f\xae\x7a\xab\
+\x0d\x05\xf0\x5b\x90\x13\x1e\x1d\xa5\x0f\xd4\x2c\x83\x35\x68\x22\
+\x77\x43\xf6\xb2\x22\xbb\xd6\x70\xa8\xe5\x55\x08\x2e\x50\x3e\x59\
+\x91\xc9\x76\xe3\xa3\x18\x41\xf1\xb6\x3c\xcc\xdd\x2b\xcf\x00\x10\
+\x46\xa0\xf7\xeb\xe8\x7d\x6f\x8f\xd4\xa2\x27\x37\xc7\x4d\x28\x87\
+\x8e\x02\xab\x1a\x24\xe7\x6a\xee\x35\x61\x0d\x9a\x32\x67\x24\xcd\
+\xf0\xe5\xce\x2e\x2f\x57\x22\x0a\x49\x06\x59\x1b\xd7\x61\x39\xe0\
+\xb4\x7a\xeb\xcd\x04\x96\xb5\x5f\x83\x9a\xa3\x98\x7d\xb9\xfc\x84\
+\x3d\xea\xbe\x09\x39\x30\x51\xc3\x1a\x54\x66\x0c\x52\x32\xdc\x21\
+\xa4\x13\x98\x7b\x0d\x98\x7b\xcd\xb6\x92\xd9\x99\x70\xdb\x78\x9c\
+\x86\x85\x76\xd4\xe2\x7a\x59\xe2\x61\x2a\x67\xaa\xe0\x21\x6f\x4a\
+\x58\x28\x41\xee\xc6\x1c\x14\x53\x69\xeb\xd9\x69\x3d\x1a\xf4\x3e\
+\x1d\xcc\x52\xc0\x32\x6c\x09\xa9\xe8\x2f\xf8\xa8\x9e\xad\x75\xa5\
+\xd2\x6b\x84\x3a\x42\x49\xe2\xad\x98\xa5\xb4\x0d\x63\x44\x4e\x3c\
+\x50\x91\x5b\x9a\x43\x69\x79\x15\x61\x2d\x90\x89\xbd\x90\x89\xfc\
+\x62\xba\x85\x59\x2c\x51\xb7\x6e\x56\x28\xd4\x7a\x14\x64\x86\x54\
+\xd4\xc7\xdc\x33\x23\x47\xa6\x7f\x08\xe0\x2c\x80\x59\xac\x6e\x5b\
+\x60\x9b\xc7\xba\xbe\x13\x07\xc4\x32\x0c\xbd\xef\x2b\x22\x7b\x7d\
+\x76\x09\x0f\xa3\x98\xcb\x97\xd4\xad\x9e\x84\x1a\x4a\x5b\x3f\xce\
+\xbe\x68\xb7\xb5\x61\x40\xa4\x58\xaf\x70\x4b\x3e\x01\x10\xf7\x22\
+\x98\x03\x72\x3f\xc2\x62\xc5\x43\x7d\xb4\x8e\xf2\x3b\xe5\x8d\xb1\
+\xe6\x71\x82\xbd\xdc\x67\x34\xd8\x0e\x11\x89\xb6\xae\x00\xcb\x30\
+\xb0\xc5\x39\xd4\x72\x7d\x49\x02\x68\x3d\x7a\x5b\x41\xb2\xd8\xb3\
+\x12\x85\x24\xfd\x51\xbe\x09\xea\x0a\x66\x51\xe4\x6f\xd1\x11\x54\
+\xc3\xf9\x8b\xf7\x4d\xdd\x2d\x22\x71\x02\xc0\xa5\xb5\xe4\x56\x4b\
+\xe8\x86\x8d\x25\x7a\x0c\xc5\xdb\x8b\xed\x3b\x10\x04\x10\xd6\xa5\
+\x9c\xa5\x51\x6e\x2f\x0d\x85\x32\x7f\x68\x84\x0f\x35\xcf\x10\xcd\
+\x44\xd0\x8a\x1a\xb2\xd7\x67\xda\x6e\x50\x42\x53\xec\xd2\x51\xd4\
+\x29\xca\xef\x56\x10\xd6\x23\x49\x1f\x0c\x9a\xc9\x4d\xf6\x66\x3c\
+\xd4\xc7\xea\x72\x20\x75\x03\x80\xf2\x17\x7c\x04\xb5\x50\x82\x8a\
+\xc8\xdd\x0c\x7a\x8f\x16\x73\x6e\x00\xd5\x94\x66\x6f\xaf\x1a\xb4\
+\xad\x31\xd2\x7b\x35\x44\x4e\x08\xc1\xe5\x31\x05\xd5\x70\x59\x22\
+\x96\x59\x0a\x14\xb3\xd9\x71\xf0\x17\x7c\x30\x8b\xb5\xd1\x0f\xcc\
+\x54\xc0\xbd\x48\x72\x77\x5d\x34\xc5\x20\x28\xdc\x6e\x00\x02\xde\
+\xc5\xfb\xa6\xbe\x63\x8f\xb8\x2f\x01\x38\xb7\x96\x4a\x70\x31\xb0\
+\x36\x54\xc7\x52\x46\xe4\x9e\x4d\xd6\x94\xb3\xd4\xc7\x1c\xd4\xc7\
+\x9d\x2b\x2b\x0f\x42\x81\xc8\x8b\x12\x0f\xa7\xf7\xcb\x75\x3f\x8b\
+\x35\xe8\x22\x8c\x5b\x39\xa4\xa5\x62\x7c\x6f\x11\xe5\xe3\x65\xd8\
+\x23\x75\x44\x3e\x47\x64\x87\xb2\xec\xdf\x60\x5f\x4f\x70\x11\xf7\
+\x10\x79\x1b\xd0\x22\x37\x42\x7d\xd2\x81\xd1\xaf\xc7\x5e\xa9\x09\
+\xac\xa0\x1a\xb6\x79\x4d\xa2\x10\xa8\x79\x15\x7e\xec\x71\xc3\x6a\
+\x70\x59\x86\x5f\xef\xd1\x50\x77\x1d\x28\x1a\x85\xd6\xab\x2d\xb9\
+\x1b\x2c\xcb\x96\x0d\xf3\x9d\x05\x15\x45\xf1\x76\x1d\x54\x41\x70\
+\xfe\x07\x93\xdf\x58\x78\xa7\xf6\x0c\xe4\x64\xfa\xdc\x5a\x43\x60\
+\x6b\x28\x1c\xdb\xc8\x41\x99\x83\x56\x42\x46\x42\x00\xe5\x53\x55\
+\xd4\x2e\xda\xab\xce\x09\xa2\x96\x59\x3b\xbd\x6f\x11\xa8\x04\xe0\
+\x4c\x38\x98\x7b\x6d\x1e\x95\xd3\xd5\x36\x0a\x41\x56\x8c\x45\x50\
+\x8d\xa2\x7e\xa9\x0e\xaf\xe4\x77\xa4\x59\x1c\x94\x83\x04\x54\x54\
+\xa5\x92\x93\x6a\xa9\x30\xdd\x59\x0f\x91\x1b\xc9\x9b\xdd\x5a\xd9\
+\x2d\x52\x5b\xa8\x39\x55\xf6\x30\xe3\x30\xc6\x2f\x33\xa9\x43\x35\
+\x0a\x6b\x8f\x29\xf3\xd2\x65\xa4\x39\x84\x92\xae\x82\x8a\x65\x29\
+\x8a\x77\x18\x20\x8c\x78\x17\xee\x9d\xfc\xdb\xf9\x37\x2a\x4f\x00\
+\x78\x07\xf2\x2d\x5e\x1e\xd6\x39\x16\x42\x21\xf0\xe8\x86\x80\x35\
+\xa0\xb7\x95\xe0\xde\xac\xb7\xb6\x1b\x59\x5b\xbe\x7d\xe3\x97\x7c\
+\xcc\xbf\x59\x42\xf5\x6c\x4d\x96\xef\xd3\x2e\xca\x27\x9b\xe0\x8a\
+\x9c\x08\x95\xd3\xb5\x65\x8b\x82\x8d\x58\x92\xe7\x10\xc0\xdc\x6d\
+\x40\xef\xd3\xa5\xb6\xbe\xd1\x7a\x11\x92\x06\x80\x40\x7b\x65\x57\
+\x0d\xda\x2a\x37\xa2\x90\xb6\x5c\x33\x5a\xe1\x41\xa3\xfa\xd6\xb4\
+\x75\xcc\x3d\x0c\x3d\x77\x18\xe0\x01\x2f\x9d\xfd\xee\xf8\x5f\xcf\
+\xbd\x56\x79\x14\xf2\x45\x04\xe3\xeb\xc9\xab\xda\x00\xcb\x43\x7e\
+\x1f\x55\xe9\x5f\x00\xe8\x5d\x4f\x18\x6c\x1d\x66\x58\xcb\x44\xcb\
+\x72\x09\x7c\x23\x89\xad\x9d\xb7\x97\x1d\x30\xf5\xe6\x3c\x2c\xbc\
+\xc3\xa1\xe6\xd4\xcb\xea\x9a\x36\x5a\xed\xb5\xbd\x29\x8b\x36\x41\
+\x62\x0c\xe8\x52\x42\x13\xe7\x4d\x7e\xc9\x87\xd6\xa7\xb7\x55\x76\
+\xee\xac\x07\x73\x8f\x91\x78\x32\x09\xc6\xd8\x23\x8b\xed\x23\x6d\
+\x56\x73\x14\xd9\x83\x3a\x58\x86\xf2\xea\xb9\xfa\xd1\x91\x1f\x4e\
+\xfd\xc0\x9d\xf6\xdf\x80\xdc\x1c\x33\x15\x83\x6a\x43\x65\xa8\x52\
+\x39\x5d\xad\xe5\x6f\xca\xf5\x11\x4a\x7e\x65\xcd\xc0\xd2\xe5\xbc\
+\x5e\x02\x92\x4a\xb0\x2e\x70\x59\x7b\x9b\xfd\x32\x77\xc2\x5d\x71\
+\x75\x75\xe4\xf1\x84\x34\x5c\xaf\x71\x9f\x23\x74\xe4\x22\x34\xa2\
+\x90\x26\xcf\x46\x64\x3e\xd4\x00\x17\x33\x9a\x4d\x62\xa2\x10\x10\
+\x42\x92\x44\x9b\x07\x1c\xaa\xc5\xa0\x98\x4a\xf2\x70\x88\x48\x86\
+\x3c\x16\x57\x72\xad\xac\xba\x56\x54\x93\xc5\x6c\x5b\x65\xf2\xcd\
+\xf3\x3a\x72\x37\xe8\x08\xca\xc1\xc8\xa5\x07\xa7\xbf\x77\xe9\xc1\
+\x99\x1f\x84\x76\xf4\x7a\x0c\xaa\x99\x8d\x7a\xaa\xd6\xe4\x5d\x78\
+\xf3\xfe\x97\x8d\x7e\xfd\x33\x20\x6b\x9b\x03\x5c\x3c\xbc\xb0\x5c\
+\x15\x77\xc5\x1c\xcb\x8d\x20\x22\x0e\x12\x5f\x74\x35\xdf\x3d\x19\
+\x0b\x0f\x05\xbc\x39\xaf\xbd\x95\x43\xe4\xc6\x99\x46\x72\xad\x18\
+\x0a\x78\x4c\xdc\x06\xd5\xa0\x4d\x0e\xad\xe6\xd4\x26\x99\x29\xa4\
+\x87\x36\x76\xe9\xd0\x7b\xb4\x64\xb7\x56\xe4\x46\xcd\xc1\x58\xd1\
+\xcc\x07\xbb\x2d\x6d\x5e\x91\x5f\x24\x80\xb9\x4f\x45\x66\xbf\x86\
+\xc8\x8b\x2a\x93\x4f\xcd\x3f\x79\xe9\xe1\x99\x87\x21\xdf\x68\x71\
+\x31\xe6\xa9\x6c\x6c\x7c\x59\x6e\xd3\x63\x01\x80\x3d\x5a\xf7\x73\
+\x37\x64\xcb\x44\x21\x6b\xda\x46\x2c\x38\x92\xa5\x63\x8d\x44\xd4\
+\x9d\x72\xd7\x1c\xa2\xf4\x9e\xa6\x06\x49\x51\x29\xea\xe3\x4e\xc7\
+\x27\x89\xa5\xa6\xdc\xb9\x6c\x53\x9b\x87\x02\xcc\x92\x09\x79\x18\
+\x03\x8b\x07\x02\xcc\x64\xcd\x8a\x37\x56\x76\x36\x88\x5d\x1e\xca\
+\xb0\xac\x98\x72\xf4\x7c\x39\x39\xb1\x62\x28\x72\x5d\x37\xdd\x1a\
+\x09\x83\xde\xab\xa0\x70\x9b\x01\xbd\x4f\x89\x16\xde\xae\xbd\x70\
+\xf6\xdb\x63\x5f\x29\x1d\xab\x3d\x19\x27\xe8\x0d\xf2\xd3\xc1\x2a\
+\xc4\x7b\x6b\x06\x16\x00\x54\x4e\x57\x8f\xe6\x6f\xce\xdd\x45\x08\
+\xd9\xbb\x56\x62\x94\xc5\x1c\x4b\x43\x1a\xbc\x9a\x70\x48\x55\x9a\
+\x00\x50\xcd\xb2\x26\x3b\x4d\x09\xfc\x79\xbf\xe3\x2d\x0c\x7f\x21\
+\x48\x3c\x15\xb3\xa4\x94\x46\x12\xa0\x22\x09\x8f\xf2\x58\x54\x19\
+\x26\x1b\xba\xa9\x90\x43\xcd\xaa\x2d\x79\x25\x95\xa3\x66\xbc\x59\
+\xaa\x53\x95\x42\xd1\x25\xfb\x0f\x22\x43\xab\xa2\x2b\xd0\x8a\x2a\
+\xf4\x5e\x6d\x4b\x40\xd5\x20\x3b\x33\x43\x9a\x70\x26\xbd\xd3\xe7\
+\xee\x9e\xf8\xea\xd4\x4f\x4b\x0f\x44\x2e\x7f\x33\xa6\x12\x26\x21\
+\xdb\x34\x21\xba\xb0\x10\xa0\x35\x76\x45\x91\xcb\xff\x84\x59\xca\
+\x73\x6b\xe1\xb6\x9c\x49\xb7\xad\x47\x66\x0d\x9a\x70\xa6\xdd\x15\
+\x95\x03\x8a\xae\xa0\x78\x47\x01\x95\xd3\x55\x04\xe5\x00\x41\x2d\
+\x84\x19\x87\x0e\x6f\xce\xdb\xf8\xe0\xc2\xb2\xb4\x46\xd8\x46\x6b\
+\x34\x64\x2c\xde\xac\x97\xf4\x2c\xfd\xb2\x0c\x7d\x7a\x51\x4b\xc4\
+\x7f\x91\xcb\x25\x4f\xd5\x68\x39\x11\xb9\x74\x84\xc7\x62\x44\xd1\
+\x42\xfe\x52\x95\x2e\xd1\xb2\x6f\x7a\x1e\xc5\x08\xac\xfd\x2a\xcc\
+\x41\x15\x61\x35\x9c\xbb\x78\xdf\xd4\xfd\x33\x2f\x2e\xfc\x2c\x0e\
+\x7b\xa3\x31\x37\xe5\x74\x32\xec\xad\xe8\xb1\x00\xa0\x7a\xb6\x36\
+\x96\xbf\x31\x77\x1d\xa1\xe4\x7d\x6b\x49\x84\xd5\x7c\xcb\x68\x16\
+\x25\xd0\xf2\xaa\x6c\xc0\xf2\xe5\x9e\x24\x86\x9e\xf7\x14\xe4\x46\
+\xe1\x86\x7a\x53\xc8\xfc\xa5\x72\xaa\x82\xfa\x98\xd3\x95\x51\x75\
+\xbf\xdc\x4c\xf8\xd5\xbc\x9a\x78\x11\x66\xb2\x76\x0f\xe5\x73\xe8\
+\x3d\x1a\x78\xc0\x9b\xde\xcc\x8b\x64\x48\x4c\x5a\x49\x3c\x09\x7b\
+\xcc\xda\xda\xfc\xa9\xc9\x77\x01\xd6\x5e\x15\xf9\x5b\x74\xb0\x0c\
+\x71\x66\x5f\x2a\x3f\x71\xe6\x1b\x97\xbe\x62\x8f\xb8\xcf\xc5\x61\
+\xef\x3c\xa4\xb4\x78\xc3\x15\xdf\x9a\x81\x05\x00\xd6\x3e\xeb\x0d\
+\xc5\x50\x3e\x8f\x35\x4c\x36\x07\xb5\x10\xe6\xee\x96\x32\x5b\xa3\
+\x52\x2d\x59\x0e\x92\x09\x62\x42\x09\xcc\xdd\x06\x0a\x87\xf2\x49\
+\xd3\x96\x32\x02\x77\x46\x26\xd3\xce\x94\x8b\xc8\x5d\xff\xf9\x0a\
+\x2e\x10\x56\x43\x04\xd5\xa6\x42\x93\x32\x9a\x78\xd2\xc8\x89\x92\
+\x63\xa1\x2a\x69\x82\x21\x96\xbc\xb4\x56\x76\x54\xa5\x50\xf3\xaa\
+\xe4\xc8\x38\xe2\xf6\x54\x04\xca\xe4\xcb\x98\xfc\xb2\x9f\xdc\x1a\
+\xbd\xa8\xad\x69\x9d\x77\x37\x4c\xeb\x51\x50\x38\x64\x40\xdf\xc5\
+\x78\xe5\xa4\xfd\xf2\xa9\xaf\x5e\xfa\xeb\xd2\x5b\xd5\x27\x04\xc7\
+\x31\x00\x67\x20\xe5\xc4\xf5\x6e\x7b\xa9\x36\xa0\x2f\xe7\x4d\x87\
+\x7e\x6b\xf0\x4b\x31\xb7\xb5\x7a\xb2\x6d\xb7\x81\xdc\x4d\x8b\xd6\
+\x88\xc6\xe3\xef\x22\x12\x60\x19\xd6\x4e\x04\x72\x81\xf2\x89\xca\
+\xaa\x37\x15\x5f\xa9\xb2\x74\x67\xbc\x25\x9e\x4e\x31\x28\x8c\x5d\
+\x06\x88\x42\xe0\x97\x83\x64\x80\x81\xaa\x44\xae\xcc\x6e\x39\x7b\
+\x77\xa6\x39\x9e\x45\x35\x0a\x6b\xd0\x04\xf7\x38\x9c\x15\x8a\x11\
+\x96\x65\x5d\x7f\x37\xe1\x8a\x5e\xc1\xa4\xc8\x1d\xd4\xa0\xf5\x28\
+\xa8\x8f\x79\x67\x46\x1f\x9c\xbe\xaf\x7a\xa6\xfe\x3a\x80\x0b\x90\
+\x1d\x95\x85\x16\x0f\xb5\xa9\x44\xda\xb2\x8f\x5a\xef\xfb\x7a\xb2\
+\x99\x61\xeb\x28\xa1\x64\x4d\xca\x87\xcc\x70\x06\x99\xe1\x2b\xbf\
+\x88\x8b\xbb\x11\xca\xa7\xaa\xc9\xa2\xb2\x0d\x51\x08\x01\x6f\xaf\
+\x22\x49\xfb\x25\xa4\x2a\x91\x23\x5f\x02\xb0\xc7\x9a\x7b\xab\xf4\
+\x3e\xad\x4d\xce\xc2\x03\xde\x26\x77\xb6\x06\x4d\x50\x8d\x82\xfb\
+\x1c\xee\xac\xd7\x5e\x4c\x10\x19\xba\xf5\x1e\x6d\x4b\xf4\xea\x44\
+\x21\xc8\x0c\xcb\x57\xf7\x86\xb5\x70\x6e\xf2\xe9\xf9\x07\xa7\x7e\
+\x56\x7a\x66\x51\x1e\xb5\xa9\x1e\xea\x8a\xa1\x30\x4e\xc8\x83\xdc\
+\xc1\xdc\x34\x65\x64\x4d\x5a\xad\xa0\x1c\x20\x72\x39\xb4\xc2\x65\
+\x2a\x21\x2e\xe0\x4c\xb8\x28\x9f\xac\x6c\x58\x16\x9c\xe4\x4e\xa5\
+\x66\x05\xa9\x15\x54\x18\x03\x06\xa8\x4a\x93\xcf\x17\xbc\x99\x07\
+\x8a\x50\x24\xbf\xcb\x7d\x2e\xfb\x80\xa4\xd9\x38\x8e\x3c\xde\x12\
+\x2e\x65\xa5\x27\xa7\x82\xe4\xfe\x2d\xaa\x51\xb0\x8c\x02\xbd\x57\
+\x97\xf2\xe2\x2d\x00\x95\xb1\x9b\xa1\x78\xab\x01\x96\x21\xee\xdc\
+\xcb\xe5\x27\xce\x7c\x6b\xec\xab\xd5\x73\xce\x4f\xe3\x3c\xea\x5c\
+\x4b\x72\xbe\xa5\x6b\x04\x57\xba\x34\x6c\xff\x27\xf7\xfd\x84\x28\
+\xe4\x23\x6b\xaf\x4c\x28\x8c\x01\x1d\x6a\x41\xb2\xcd\x3c\x90\x6c\
+\xf9\x92\x27\xbf\x03\x56\x1f\x6f\x72\x53\x99\x21\x2b\xc9\x77\xc2\
+\x5a\xd8\xa6\xe0\xd4\x7b\x35\x30\x8b\xa1\x3e\x56\x4f\xba\x2b\x8b\
+\x43\x59\x50\x0e\x92\xb7\x47\x68\x05\x75\xe9\x1b\xbd\xb6\xd0\x58\
+\x96\x22\x77\x83\x0e\x35\x4b\x79\xe5\x4c\xfd\xe8\xd8\x23\x33\x47\
+\xec\x11\xf7\x68\xec\xa5\x26\xd0\xdc\x00\x23\xb0\x0d\xf6\x09\xae\
+\x44\x95\x47\x91\xc7\xbf\x10\xd3\x0f\x6b\x2a\x7b\x78\x18\x87\xa7\
+\x71\x67\x53\x4f\x86\x87\x1c\x0a\x53\x12\xd0\xa8\x6e\xd4\xa4\x12\
+\x16\x02\xb0\x0c\x93\xa3\x60\x71\x5e\x17\xd6\x42\x04\x1a\x4d\xd8\
+\xfe\xd6\x76\xde\x56\x11\x9a\x4b\xa9\x19\x82\xcc\x01\x0d\xc6\x2e\
+\x06\x77\xd6\xbf\x34\xfa\xc0\xdc\x91\xf9\x37\x2a\x2f\xc6\xde\xe9\
+\x52\x5c\xe9\x79\x5b\x19\xf6\x56\x1d\x0a\x5b\xe8\x87\xf1\xfc\x4d\
+\xb9\x5b\x08\x25\x77\x6c\xd5\x01\x46\xf1\xe4\x8b\x57\xf2\x11\x56\
+\x02\xf0\x80\x83\x6a\x4a\x72\xe3\xa3\xf8\xb5\x23\x80\x6c\x5d\x30\
+\x8b\xb5\xf1\x65\xa1\x1d\x26\xcf\x30\x21\x80\x56\xd0\xc0\x7d\x9e\
+\x28\x32\x23\x47\xb2\xee\xdc\x6f\xe9\x41\x12\xe9\xe1\xb6\x72\x7f\
+\x02\xa1\xf2\xd5\x22\x85\x43\x3a\x28\x43\x75\xf2\x99\xd2\x03\xe7\
+\xee\x9e\xf8\x86\x33\xee\xfd\x1c\xc0\x71\x48\x1d\x7a\x63\x41\xc7\
+\xb6\xdb\x9e\x7b\xa5\x2b\x47\xf6\xfc\xa3\x81\x7d\x5a\x8f\x76\x0c\
+\x5d\x7e\x23\xfc\xb2\x39\x5b\x25\x0e\x4d\x62\xe9\x45\xd7\xfb\x0d\
+\x30\x4b\x41\x58\x0f\xe1\x4e\x7b\xcd\x9b\xb1\xaf\xfd\x75\x6f\x41\
+\x25\x48\x3c\x14\xa1\x72\xf7\xa8\x10\x02\xee\xf4\xe5\xe9\x0d\xad\
+\x47\xdb\x94\xd1\xfb\xcb\xdd\x11\xad\x47\x41\xee\xa0\x06\xc2\x88\
+\x5f\x7e\xd7\x7e\xf5\xe2\xbd\x93\xf7\x86\xf5\xe8\x74\x5c\xed\x35\
+\xf6\x53\x05\xdb\x11\x50\xab\xf2\x58\x00\x50\xbb\x68\xd7\x72\x37\
+\x64\x41\x14\xf2\x6b\x9b\xea\xa9\x62\x0a\xa1\x71\xb1\x15\x9d\x36\
+\x85\x7e\xb1\xec\x59\x31\x14\x30\x83\x21\xb0\x9b\x7c\x13\x84\x68\
+\xf3\x5a\x54\xa5\xb2\xf7\x17\x7b\x2d\xaa\xc9\xa4\x5c\xcd\xa8\x49\
+\x35\xd8\x00\xae\x9c\xfc\xd5\x97\x1d\x7e\xd8\x94\xbc\x24\x43\x51\
+\xb8\x45\x47\x66\xbf\x86\xfa\x25\xf7\xf8\x85\x1f\x4c\x7e\x63\xf2\
+\xe9\xf9\x23\x3c\x10\x47\x21\xd5\x07\x5d\x6d\xc3\x6c\xa6\xc7\x02\
+\x00\xf4\xdc\x51\xcc\x64\xaf\xcf\xbc\x4e\x28\xb9\x79\xb3\x0e\xac\
+\x95\x57\xd2\xfb\x75\xa8\x59\x26\x47\xaa\xa6\x9c\x84\x11\x6f\xbc\
+\x94\x32\xb4\xc3\x36\x3e\x4c\xaa\x31\x5b\xde\x6f\x33\xef\x27\xd4\
+\xc6\xe2\xa4\x5c\x70\x01\x1e\x08\x10\x8a\x2d\xdb\xa3\x40\x55\x99\
+\x47\x99\x7b\x18\xbc\xb9\x60\x62\xe2\xc9\xb9\x1f\xcd\xbe\x52\x7e\
+\x3e\xf6\x50\xa3\x71\x1e\xd5\xf5\x36\xcc\x66\x25\xef\x89\x95\x8e\
+\x2d\xd4\xad\x7d\xe6\x17\x14\x43\xb9\x7f\xb3\x0e\xac\x75\x2b\x8c\
+\xd2\xc2\xd4\x1b\x03\x46\x9b\xe0\xce\x9b\xf7\x61\xf4\xeb\x08\xaa\
+\x61\x22\x87\xf6\x66\x3d\x98\x7b\x9b\x9d\x00\x45\xa3\xc9\x7b\x65\
+\x17\x93\x9d\xb2\x61\x4c\xb6\xec\xb1\x36\xf7\xa8\xc8\x0c\xab\x80\
+\x10\xce\xe4\x33\xf3\x8f\x8d\xfd\x78\xe6\x61\x21\x12\x39\xcb\x0c\
+\xa4\x9c\x25\xc4\x0e\xdb\x1c\xbf\xea\x6a\xaf\x7a\xa6\x76\x3a\x7f\
+\x53\xee\x97\x08\x25\x37\x76\x0e\x3d\xb2\x92\x13\x5c\x48\x10\xb4\
+\xdc\xdf\xb0\xde\xd2\x82\xd1\x95\x04\x5c\x0d\x61\x5e\xab\xe0\x4e\
+\xb1\x14\xb0\x56\xc1\x1d\x17\x10\x01\x87\x62\x31\x10\x22\x55\xaa\
+\x0d\x1d\x3b\xcb\xb0\x6d\xb1\x26\x48\x2b\x2a\x28\xde\x6e\x40\xef\
+\x53\xc2\xca\x49\xfb\xe5\x73\x77\x8f\x7f\x6d\xfe\x8d\xea\xe3\x90\
+\xd2\xe0\xb3\x90\x6d\x98\x06\x1f\xb5\xe3\x36\xeb\xae\x45\x99\xc7\
+\x23\x8f\xff\x39\xb3\x94\x4f\xa0\x03\xd4\x60\x50\x95\x6a\xd3\x04\
+\x3c\x8c\x40\x2d\x6a\xc9\x98\x93\xa2\x35\x49\xce\xb0\x16\xb6\x8d\
+\x3f\xa9\x39\x15\x61\xad\x09\x16\x7f\x21\x90\xfa\xf4\x56\x2a\xa1\
+\x1e\x81\x8f\xd5\x41\x18\x49\x92\x74\x42\xd0\xb6\x37\x61\x4b\x9e\
+\x64\x83\x20\x77\x83\x0e\xad\xa8\xa0\x3e\xe1\x9d\xbd\xf4\xd0\xcc\
+\x7d\x95\x53\xf6\x6b\x68\xb6\x61\x5a\x2b\xbd\x1d\xbb\xaa\x79\x4d\
+\x8f\x6e\xf5\x6c\x6d\x2a\x7f\x63\x6e\x88\x50\xb2\xa1\x57\xea\x7a\
+\xb3\x9e\x54\x1b\xb4\x4e\x58\x71\x39\xb1\x23\xa2\x58\x70\xc7\x48\
+\xb2\x1b\x41\x84\x42\x32\xdf\x2d\xd2\xde\x24\x29\x07\x92\x5e\xa4\
+\x4c\xda\x9b\x82\x3b\xc1\xd1\x6c\x82\x13\x39\x93\xb8\x55\x4a\x04\
+\xd9\x86\xd1\x90\x3f\x64\x40\x84\x7c\x7e\xfc\xd1\xd9\x7b\x2e\xfc\
+\x60\xf2\xdb\xde\x5c\xf0\x32\x80\x77\xe3\x5c\x6a\x21\x26\x39\x77\
+\xfc\xcb\x77\xd6\xea\x79\xc8\xee\x8f\x0c\xec\xd1\x7b\xb5\xd3\x00\
+\x32\xeb\xf9\xc2\xb0\x1e\x25\x5b\x81\x89\x42\xc0\x32\x0c\xdc\x8b\
+\xda\xe6\xf8\xb4\xa2\x0a\x2d\xd6\x44\x25\x4a\x05\x5d\x8e\x49\xb5\
+\x1e\x71\x7d\xc2\x49\xc6\xaa\xf4\x5e\x2d\x21\x3a\x23\x37\x82\x5f\
+\x0e\xe4\xcf\xe2\x35\x94\x5a\x51\xdd\x9a\xe4\x9c\x00\xc6\x00\x43\
+\xf6\x80\x06\x10\x78\xf3\xaf\x57\x9e\x1d\x7d\x68\xe6\xa1\xc8\x49\
+\xe8\x83\xe9\xb8\xd2\x0b\x70\x15\xbd\x81\x67\xcd\x8f\xaf\x7d\xd1\
+\xae\xe7\x6e\xc8\x06\x44\x21\xeb\xda\xa5\x15\x94\x9b\x63\x52\xc6\
+\x2e\x1d\x5a\x5e\x85\x9a\x55\x25\x49\x19\x27\xdf\x91\xc7\xa5\x4e\
+\xdc\x50\xda\xbc\x12\x51\x48\xbb\xc7\x11\x68\x02\x2f\x16\xee\xc9\
+\xb0\x4a\xa1\x66\x59\xb2\xe5\xa5\xdb\x03\x9f\x97\x33\x35\xaf\xa0\
+\x70\x8b\x0e\x6b\x50\x45\xf5\x9c\xf3\xe6\x99\x6f\x8c\xfd\xcd\xec\
+\x2b\xe5\x47\x44\x28\x8e\x01\x38\x1d\x73\x52\x1d\xd5\x9a\xef\x54\
+\x8f\xd5\x28\xd9\xd5\xdd\x1f\x1d\x78\x9b\x90\xb5\xd3\x0f\xee\xb4\
+\x9b\xbc\x10\xd2\xdc\x63\x34\x13\x69\x11\x7b\x20\xbf\x39\x2c\x6a\
+\x0d\x9a\x6d\xdb\x86\x49\xbc\xd9\xa5\xa1\xe7\x6a\xf5\x7e\x5b\x2d\
+\x61\x69\xa3\x0f\x34\x82\xec\x01\x0d\xc6\x6e\x06\x77\xc6\xbf\x34\
+\xf6\xc8\xec\x7d\xa5\xa3\xd5\x97\x21\xdb\x30\x63\xd8\xa6\x6d\x98\
+\xad\x4a\xde\x13\xf3\xcb\x41\xc8\x3d\xfe\xa7\x8a\xa1\x3c\xb8\x9e\
+\x5c\xa3\x95\x04\x4d\x80\x45\x00\xa3\x5f\x97\xfb\xd5\x5b\xb6\xdd\
+\xe9\xbd\x1a\x22\x4f\x56\x88\x42\x00\xce\xb4\x0b\x63\x97\x01\xa5\
+\x45\x9c\x07\xc8\x21\x8c\x2d\x7f\x4a\x15\x02\x73\x2f\x43\x66\x58\
+\x43\x68\x87\xa5\xc9\xa7\xe7\x9f\xbe\xf4\xe3\x64\x1a\x66\x24\xa6\
+\x0f\xea\x3b\x91\x3e\xd8\x14\x8f\xd5\xb8\x97\xfb\x3f\xb9\xef\xc7\
+\x44\x21\xbf\xbe\xa6\x1c\xab\x45\x75\x40\x14\x02\x6b\xc8\x6a\xdb\
+\x53\xeb\xcd\x79\x49\xd2\x4e\x19\x81\xb5\xcf\x42\xe4\x47\xf1\xf4\
+\xcf\xa2\x23\x17\xcd\x1b\x6a\xed\x33\xb7\xb4\x71\x6c\xec\x62\xc8\
+\x1c\xd0\x40\x19\x82\xd2\xb1\xea\x0b\xa3\x0f\xce\xfc\x28\xa8\x84\
+\x27\x63\x3e\x6a\x47\xb4\x61\xb6\xdc\x63\x35\xe8\x87\xb0\x1e\xfe\
+\x3b\x35\xa7\xbe\x81\x35\xbc\xcc\x5a\xb1\x14\x10\x8a\x84\xe0\x0c\
+\x2b\x41\xdb\xa8\xba\x56\xd4\x92\xf5\xd5\x3c\xde\xfa\xa7\x98\x0a\
+\x8c\xdd\x86\x54\x89\x86\xcd\xb6\x8e\x0c\x99\x44\xaa\x44\xb7\x08\
+\x54\x6a\x96\x22\x7b\xbd\x06\x35\xaf\xa0\x76\xd1\x79\xe7\xe2\x7d\
+\x53\xf7\x3a\x13\xde\xdb\x68\x97\xb3\xec\x78\xfa\xa0\xeb\xc9\x7b\
+\xab\xd5\xce\xdb\xf3\xb9\x1b\xb3\xfd\x84\x92\x5f\x5a\xb5\x8b\x0e\
+\xac\x13\x38\x00\x00\x05\x02\x49\x44\x41\x54\x24\x04\x22\x42\x52\
+\xcd\x71\x5f\x2e\xcc\x6f\x00\x83\x50\xd2\x26\xc8\x23\x0a\x01\x33\
+\x95\x24\x21\xa7\x0a\x91\xab\x19\x55\x0a\x35\x2f\x17\xaf\x6d\xc5\
+\xe2\x57\xaa\x12\x64\x0f\xca\xa9\xe2\xd0\x8e\xc6\x2f\x3d\x34\xf3\
+\xbd\x91\xfb\xa7\xbf\x1f\xd6\xa2\xd7\x63\xfa\x60\x0c\x4d\x8d\x14\
+\xc7\x35\x66\x1b\xbd\x23\x64\xe0\x57\x76\xf5\x1a\xfd\xfa\xdb\x20\
+\xd8\xb3\xda\x3f\x12\x91\x5c\x75\xd4\x68\xaf\xb0\x0c\x83\xb1\x4b\
+\x6f\xa1\x24\x9a\x8a\x05\xc5\x54\xae\xb8\x26\x72\xb3\xaf\x98\xb9\
+\x57\x45\xf6\x80\x0a\xee\xf3\xda\xcc\x4b\xe5\x27\xc7\x1e\x99\x7d\
+\x44\x44\xe2\x6c\x4b\x1e\xb5\x23\xdb\x30\xdb\xc6\x63\x01\x80\x3d\
+\x5a\x77\xe3\x29\xea\x4f\xae\xfa\xde\x50\x02\x42\xd1\xd6\x96\x69\
+\xa5\x12\x44\x24\x12\x9a\x41\xd1\xe8\xba\x46\xf7\xbb\x61\x2d\x6d\
+\x98\xa8\x7c\xd2\x7e\xe5\xec\xb7\xc6\xbf\x52\x7a\xab\xfa\x04\x04\
+\xde\x86\x9c\x86\x99\xc1\x0e\x6e\xc3\x6c\x27\x8f\x05\x00\xc8\xdf\
+\x94\xd3\x0b\xb7\xe6\xdf\x24\x94\x1c\x5a\xcb\xdf\xb5\x12\xa0\xf2\
+\xc6\x49\x6d\xb9\xbf\xe0\x27\x6d\x98\xc5\x43\x0f\x5b\xf2\xf4\x19\
+\x14\xd9\xeb\x54\xe8\xfd\x0c\xce\x84\x77\x7e\xf4\x81\xe9\x7b\x2a\
+\xa7\xeb\xaf\xc7\x79\x54\x63\x1a\xc6\x4b\x01\xd5\x61\x60\x01\x20\
+\x83\x9f\xd8\xfb\x11\x66\x29\x4f\xaf\xe5\x33\x05\x17\x70\xa6\xdc\
+\x95\x97\x92\xed\xdd\xba\x37\x37\x10\x46\x90\xd9\x1f\x4f\xc3\xd8\
+\xe1\xfc\xe4\x33\xf3\x0f\x4d\x3d\x5b\x7a\x3a\xe6\xa3\xb6\xc5\x34\
+\xcc\xd5\x0e\xac\x06\xfd\x70\x0f\x51\xc8\xa7\xd7\xf2\x47\x82\x0b\
+\x78\x73\xfe\x92\x3d\x59\x2c\xa3\xc8\x51\xf8\xad\xa8\xf6\x48\x93\
+\x3e\x20\x0a\xfc\xf9\xd7\x2b\xcf\x5e\xb8\x67\xf2\x87\x2d\x7c\xd4\
+\x14\xae\xc2\x36\xcc\x76\x05\x16\xd9\xfb\x6b\x7b\x0e\xa9\x59\xf6\
+\x16\x80\x35\xc7\x2e\xee\xf3\x64\x67\x83\xa2\x2b\x4b\xde\x32\xbf\
+\x99\x79\x54\x66\x58\x85\x9a\x53\x44\xe5\xb4\xfd\xe6\xe8\x83\x33\
+\xf7\x2f\x43\x1f\x6c\x9b\x69\x98\x6b\x01\x58\x00\x40\x87\xee\x1a\
+\xfc\x4b\xca\xe8\x7f\xd8\x71\x55\x8c\xd1\x9c\x86\x71\xa6\xbc\x8b\
+\xe3\x8f\xcd\x1d\x89\xdb\x30\xe7\xb1\x8d\xa7\x61\xae\x15\x60\x91\
+\xfe\x0f\xf6\xe6\xad\x41\xeb\x2c\x48\x87\xdf\x76\xd1\xc5\x2b\x90\
+\x19\xd6\x60\x0d\xaa\x8d\xa5\x64\x0f\x4c\xfd\xac\xf4\xb4\x88\x44\
+\x23\x8f\x9a\xc5\x35\xd2\x86\xd9\xce\xc0\x02\x00\xb2\xef\x37\x06\
+\x3f\xab\xe8\xf4\x9b\xdb\xfd\xe4\xdb\xda\x30\x47\xab\xcf\x5f\xbc\
+\x7f\xea\xfe\xc8\xe1\xa7\xd1\x6c\xc3\x34\xf2\x28\x9e\x42\x65\xeb\
+\x81\x05\xbd\x47\x53\x07\x3e\xbc\xeb\xa7\x84\x92\x7f\xb8\x1d\x4f\
+\x9a\x65\x29\x72\xb2\x0d\x23\x6a\x17\x9c\x77\x46\x8e\x4c\xdf\x57\
+\x1f\x73\x8f\xc5\x61\x6f\x1c\xcd\x36\x4c\x9a\x47\x6d\x27\x60\xc5\
+\xf4\xc3\x87\x98\xa5\x3c\xbf\x9d\x4e\x96\x6a\x52\xc5\x19\x4f\xc3\
+\x8c\x4f\x3c\x35\xf7\xd0\xec\x4b\xe5\x9f\xa1\x5d\xce\xb2\xa3\xa6\
+\x61\xae\x35\x60\x01\x00\xdd\xff\xc9\x7d\xdf\x21\x0a\xf9\xcc\x96\
+\x9f\x24\x05\xac\x21\x15\xd6\x3e\x15\xdc\x17\xb5\x99\x17\x17\x1e\
+\xbf\xf4\xe3\x99\x47\x20\x15\x9c\x3b\x7a\x1a\xe6\x5a\x04\x16\xd9\
+\xf3\xd1\x81\xfd\x5a\x51\x3b\x0a\xa0\xb0\xa5\x79\xd4\xb0\x0a\xc5\
+\xa0\x7c\xee\x8d\xca\x4f\x47\x8f\x4c\x1f\x09\xeb\xd1\xd9\x18\x54\
+\x93\xb8\xc6\xe4\x2c\x57\x03\xb0\x24\xfd\xb0\x8e\x25\x6e\x1d\xcb\
+\xa3\x0e\x4a\x39\x4b\xf5\x6c\xfd\xe8\xa5\x87\x66\x8e\xd8\xa3\xcb\
+\xe6\x51\x69\x1b\x66\x07\x02\x0b\xb1\xfa\xe1\x4d\x10\xec\xdf\x94\
+\x3c\x4a\x8d\x97\x92\xed\x51\xe1\x2f\x04\x53\x63\x8f\xce\xfe\x70\
+\xee\xb5\xca\x0b\x69\x1e\x75\x95\x01\x2b\xa6\x1f\x7e\x5f\xd1\xe9\
+\xf7\xbb\xfa\x25\xb1\x9c\xc5\xda\xaf\x42\x70\x51\x9f\xf9\xf9\xc2\
+\x13\x13\x4f\xce\x3d\x16\xb9\x09\x7d\x90\xe6\x51\x57\x19\xb0\x1a\
+\xf4\xc3\x73\x84\x92\x5f\xec\xc6\xe7\x6b\x45\x05\xd9\x83\x1a\x14\
+\x83\x44\xe5\xe3\xf6\xcb\x23\x47\xa6\xee\xf7\x17\xc2\x13\x31\xa0\
+\x1a\x6f\x5f\x4f\xf3\xa8\xcd\x4c\x45\x36\xe3\x4b\xbc\x92\x2f\x87\
+\x2f\x4c\xe5\xe9\x4e\x7e\xa7\x62\x10\x64\xaf\xd3\xa0\xf7\x33\xd4\
+\xc7\xbd\x33\x63\x8f\xcc\x1c\x29\xbf\x6b\xbf\xda\x12\xf6\x52\x39\
+\xcb\xd5\xec\xb1\x12\xfa\xe1\xae\x7d\x7f\x4b\x18\xf9\xa3\x0d\x1f\
+\x34\x23\xb0\xf6\xa9\xc8\x0c\xa9\x08\xaa\xe1\xdc\xd4\x73\xa5\x47\
+\x27\x9f\x9a\x7f\x12\xa9\x9c\xe5\x9a\x04\x16\xe9\xfb\x40\x6f\x31\
+\x33\x64\xbe\x04\x42\x6e\x5a\xef\x87\x98\x7b\xe4\x78\x15\x08\xbc\
+\xb9\x57\xcb\x4f\x8f\x3d\x32\xfb\x70\xbc\x94\xac\xb5\x0d\x13\xa6\
+\x61\xef\xda\x01\x16\x00\xd0\xe2\x7b\x0a\x7b\xf3\x37\xe6\x7e\x0e\
+\xac\xad\x4a\x6c\xbc\x63\x4f\xcd\x52\x51\x3e\x69\xbf\x36\xf6\xc8\
+\xcc\x83\xf5\x31\xaf\x41\x1f\xa4\x72\x96\x6b\x1c\x58\x00\xc0\x72\
+\x37\x66\x87\x7b\x6e\x2f\x7c\x1d\x84\x7c\xec\x8a\x48\xd4\x08\x72\
+\x07\x65\x1e\xe5\x4e\xfb\x23\xe3\x8f\xcf\xfe\x68\xfe\xcd\xea\x8b\
+\xb8\x86\xa6\x8a\x53\x60\xad\xfe\x3b\x19\x80\x9e\xdd\x1f\xee\xfb\
+\xfd\xec\x81\xcc\x17\xa3\x40\x0c\x70\x4f\xb4\xfd\x06\xcb\x50\x18\
+\x03\x0c\xe6\x1e\x15\x61\x3d\x2a\xcd\xbc\x50\x7a\x6c\xfc\xf1\xb9\
+\x27\xd0\x54\x71\xa6\x72\x96\x14\x58\x97\x05\x57\x0e\xc0\x60\xff\
+\x07\x0b\xbf\x5a\xbc\x23\xf7\xdb\x6a\x96\xdd\xc6\xb2\x4a\xaf\x9a\
+\x55\xd4\xc8\x89\x4a\x7e\x25\x9c\xad\x9c\xb4\xdf\x9c\x78\x72\xee\
+\x59\x1e\x8a\x11\x2c\x95\x05\xa7\x79\x54\x0a\xac\x65\xbf\x9b\x00\
+\x30\x20\x7b\x89\xbd\xf1\xbf\x1c\x80\xc6\xfb\x80\x1d\x48\x0e\x6a\
+\x2e\xfe\x57\x45\x2a\x67\x49\x81\xb5\x86\x63\x50\x62\x0f\xa6\xc5\
+\xff\x1a\x9a\xf9\x20\x4e\xc8\xfd\x16\x0f\x95\x02\x2a\x05\xd6\xba\
+\x8e\x85\xb4\xfc\x77\xab\x67\x4a\x01\x95\x5a\x6a\xa9\xa5\x96\x5a\
+\x6a\xa9\xa5\x96\x5a\x6a\xa9\xa5\x96\x5a\x6a\xa9\xa5\x96\x5a\x6a\
+\xa9\xa5\x96\x5a\x6a\xa9\xa5\x96\x5a\x6a\xa9\xa5\x96\x5a\x6a\xa9\
+\xa5\x96\x5a\x6a\xa9\x6d\x67\xfb\xff\xf0\x77\x79\x83\xc8\xf0\xe6\
+\x42\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x00\xc0\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\
+\x00\x00\x00\x87\x49\x44\x41\x54\x28\xcf\x63\x60\x40\x00\x56\x86\
+\x44\x86\xd3\x40\x98\x08\x64\x61\x05\x89\x0c\x87\x19\xcc\x80\xf0\
+\x30\x90\x85\x15\x9c\x06\x4a\x82\x80\x19\x90\x85\x15\xfc\xc7\xc2\
+\xa2\xa2\x82\x03\x18\x0a\x0e\x60\xea\xfe\x8f\x83\x07\x06\xaf\x19\
+\x24\x50\x7c\x21\xc9\xf0\x02\xdd\x0a\x5f\x94\x70\x08\x64\xd8\x81\
+\xaa\x20\x88\xe1\x1a\x83\x00\x3c\x24\x05\x18\x6e\x31\x78\xa0\x3b\
+\x73\x0a\xc3\x55\xa0\x32\x31\x06\x51\x86\x00\x20\xab\x0b\x9b\x37\
+\xc3\x18\x76\x03\x9d\xf6\x1f\x68\xb8\x37\x03\x4e\xf0\x1f\x57\x20\
+\x11\xa5\xe0\x00\x58\x1a\x04\x91\x02\x09\x00\x4d\x9c\x33\x3e\xf2\
+\xa2\x78\xe8\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x0f\xd3\
+\x00\
+\x00\x4b\xec\x78\x9c\xdd\x5c\xdb\x72\xdb\xd8\xb1\x7d\xf7\x57\x20\
+\xf4\xcb\xb8\x8e\x00\xee\xfb\x85\x92\x9c\xaa\x64\x2a\x53\x79\x4a\
+\x55\x32\x53\xe7\xf1\x14\x04\x42\x12\x62\x8a\x54\x91\x94\x25\xcf\
+\xd7\x67\xf5\xc6\x9d\x84\x48\x48\xa2\xec\x33\xa1\xca\x16\xd9\xfb\
+\x8a\xee\xd5\xdd\xab\x37\x40\x5d\xfc\xf9\xe9\x6e\x11\x7d\xcd\xd7\
+\x9b\x62\xb5\xbc\x9c\xf0\x84\x4d\xa2\x7c\x99\xad\xe6\xc5\xf2\xe6\
+\x72\xf2\xdb\xaf\x7f\x8b\xdd\x24\xda\x6c\xd3\xe5\x3c\x5d\xac\x96\
+\xf9\xe5\x64\xb9\x9a\xfc\xf9\xf3\x87\x8b\x3f\xc5\x71\xf4\xd7\x75\
+\x9e\x6e\xf3\x79\xf4\x58\x6c\x6f\xa3\xbf\x2f\xbf\x6c\xb2\xf4\x3e\
+\x8f\x7e\xba\xdd\x6e\xef\x67\xd3\xe9\xe3\xe3\x63\x52\x54\xc2\x64\
+\xb5\xbe\x99\x7e\x8a\xe2\xf8\xf3\x87\x0f\x17\x9b\xaf\x37\x1f\xa2\
+\x28\xc2\xba\xcb\xcd\x6c\x9e\x5d\x4e\xaa\x01\xf7\x0f\xeb\x45\xe8\
+\x38\xcf\xa6\xf9\x22\xbf\xcb\x97\xdb\xcd\x94\x27\x7c\x3a\x69\xbb\
+\x67\x6d\xf7\x8c\x56\x2f\xbe\xe6\xd9\xea\xee\x6e\xb5\xdc\x84\x91\
+\xcb\xcd\xc7\x4e\xe7\xf5\xfc\xba\xe9\x4d\xbb\x79\x94\xa1\x13\xf7\
+\xde\x4f\x99\x98\x0a\x11\xa3\x47\xbc\xf9\xb6\xdc\xa6\x4f\x71\x7f\
+\x28\xf6\x38\x34\x54\x30\xc6\xa6\x68\x6b\x7b\x8e\xeb\x35\x7b\x5a\
+\x40\x15\xcf\x6e\x26\xb4\x76\x57\x87\xfa\xef\xf1\xaf\x19\x50\x0b\
+\x92\xcd\xea\x61\x9d\xe5\xd7\x18\x99\x27\xcb\x7c\x3b\xfd\xf9\xd7\
+\x9f\x9b\xc6\x98\x25\xf3\xed\xbc\x33\x4d\xad\xfd\xde\xba\x3d\x93\
+\x2c\xd3\xbb\x7c\x73\x9f\x66\xf9\x66\x5a\xcb\xc3\xf8\x1e\x1e\x48\
+\xf0\x58\xcc\xb7\xb7\x97\x13\x21\xc2\xa7\xdb\xbc\xb8\xb9\xdd\x36\
+\x1f\x8b\xf9\xe5\x04\x97\x5b\x7d\xa8\xe6\x99\x35\x73\xb0\x44\xd9\
+\x68\x2d\x84\x76\x32\xf4\xa8\xf7\x3b\x9b\xaf\x32\xda\xc0\xe5\xe4\
+\x61\xb9\x58\x65\x5f\x12\x52\xd9\x67\xf4\xb8\xb8\xcb\xb7\xe9\x3c\
+\xdd\xa6\xd4\xbb\x9c\xbe\x96\x68\x17\x7a\xa0\x0f\x4c\x37\xfb\xe7\
+\xcf\x7f\x2b\x3f\xe1\x73\x96\xcd\xfe\x77\xb5\xfe\x52\x7d\xc4\x8b\
+\x3a\xa4\x57\xab\x07\xec\x73\xf2\xb9\x11\x5f\xcc\xb3\x19\xd4\x77\
+\x97\x6e\x3f\x17\x77\xe9\x4d\x4e\x76\xfa\x1f\xa8\xeb\x62\xda\x36\
+\xf4\x3a\x6f\xbf\xdd\xe7\xed\xa4\xe5\xb4\xeb\xbc\xb4\xc3\x20\x74\
+\xe7\xd9\x5d\x41\x83\xa6\xff\xda\x16\x8b\xc5\xdf\x69\x91\x49\x34\
+\xdd\x99\xb4\xd8\x2e\xf2\x56\x78\x31\xad\x76\x5f\x5d\xdb\xb4\x73\
+\x71\x17\xd3\xfa\xda\xc3\xa7\x46\x79\xa4\xb9\xf9\xd7\x22\x7f\x2c\
+\xe7\xb8\xc7\x32\xd9\x6a\xb1\x5a\x5f\x4e\x3e\x5e\x87\xd7\xa4\x6c\
+\xb8\x5a\xad\xe7\xf9\xba\x6e\x32\xe1\xd5\x6b\x5a\xc1\xfe\xd8\x30\
+\x6c\x5d\x89\x57\x57\xff\xce\xb3\xed\x76\xb5\xc8\xd7\xe9\x92\x2e\
+\x92\xb3\xaa\xe5\x66\x0d\x18\x0c\xc9\x1f\x8a\x79\x3e\xd4\xd0\x80\
+\x81\xb6\xd7\x2c\x34\xd8\xba\xb9\x4d\xe7\xab\x47\x60\x6a\xb7\xf1\
+\xb1\x58\xa2\x21\xae\x10\xe8\x9d\x7f\xa6\x43\x0d\x4a\x2b\x9a\x29\
+\x00\x9c\x46\x4d\xba\xbe\xea\xcd\xed\xea\x91\x2e\xe4\x72\x72\x9d\
+\x2e\x36\xf9\xee\x6c\xbf\xaf\x56\x77\x74\x05\x89\x15\xf8\x91\xbb\
+\xcd\xd9\x13\x1a\xf9\x9e\x94\xd4\xc7\x13\x63\x19\xdc\xf9\x99\xfd\
+\x3d\x0d\x5c\x78\xd5\x34\xa4\x93\xaa\xe9\x2e\x7d\x2a\xee\x8a\xdf\
+\xf3\xf9\x40\x97\xec\x61\xbd\x46\x90\x8c\x17\xe9\xb7\x7c\x5d\xb9\
+\x60\x09\xaa\x8b\x79\x7e\xbd\x69\x95\x40\x9f\x54\xed\x38\x88\x35\
+\x79\xba\xfe\x65\x9d\xce\x0b\x0c\xae\x61\x49\xdd\xfa\x2d\xc2\x59\
+\xd7\x38\xce\xc5\x66\xbb\xba\x6f\xdd\x60\x75\x7d\xbd\xc9\xb7\xed\
+\x96\x82\x5e\xb7\xdf\x16\xb0\x3d\x75\x8c\x03\xdc\x66\x1f\xaf\xf3\
+\xdc\x5e\xf1\xf3\x20\xaa\xac\x3f\xe3\x9d\x21\x21\x70\xa0\x51\x38\
+\xc7\x3a\x3e\xf2\xdc\x62\x89\xd0\xd6\x1b\xed\xc5\xe1\x55\xf3\xab\
+\xb9\xba\x52\xa3\x56\x15\x63\x56\xd5\x6c\xcc\xaa\x99\x4b\xad\xd5\
+\xa3\x56\x55\x63\x56\xb5\x8a\x31\xaf\x1b\x00\x3e\xb3\xea\x15\xf3\
+\x52\x5f\x8d\x5a\xd5\x1c\x5f\x95\x1f\x31\x67\x96\x5f\x5d\x5d\x8f\
+\x5a\xcc\x35\x8b\x5d\x4c\xfb\xb0\xaa\xa4\xad\xef\x23\x4d\xdc\x23\
+\xde\x20\x93\xd7\x33\x35\x31\x8e\xc2\xe8\xe5\xa4\xdf\x55\xce\x9b\
+\x15\xdb\x54\x73\xff\x7f\xe4\x5d\xd1\x2c\xe2\x9c\xfe\x1b\xec\xf1\
+\xad\xea\x81\xe4\x8c\x5f\x6c\xb0\xcf\xef\x94\xd3\x0e\x4c\x53\xed\
+\x20\x5e\xad\x8b\x9b\x82\xd2\x23\xf5\xb3\x89\x2c\x5f\xfd\x31\x50\
+\x46\xe7\xda\x4c\x0b\xf0\xf1\x1e\xa8\x10\x69\x9e\x31\x59\xa3\x6b\
+\xc5\x8f\x40\xe4\x98\x13\xb6\xbe\xfc\x2c\x3e\x3a\x8b\xf9\xb7\xf9\
+\xde\x80\x2f\x8f\x58\x55\x1c\x01\xe6\x31\xdf\x1b\xf0\xe5\x31\xab\
+\xbe\xd1\xf7\x06\x7c\x79\x8c\x86\xf5\xdb\x9c\xb0\xf5\xe5\x23\x1e\
+\x38\x8c\xc2\x27\x7e\x39\x31\xc8\x7d\xc6\xb5\xf1\xee\x1b\x64\x52\
+\x24\xdc\x70\xe3\x6d\x23\x7d\x12\x97\x13\xc5\x12\x2f\x1d\x17\xa6\
+\xed\x2b\x86\xfa\x0e\x60\x5b\xdb\x76\x50\xe0\xbf\xb3\xdb\x75\x0e\
+\xbe\xfe\x71\xc0\x07\xea\x7e\x37\x95\xf0\xb7\x65\xb1\x05\xf3\x7e\
+\xd8\xe4\xeb\x7f\x11\x7b\xfd\xc7\xf2\xb7\x26\x91\xb7\xbd\x7e\x05\
+\x1b\xd9\x10\xa5\x03\x7d\x4c\xb7\xeb\xe2\xe9\x27\x30\x51\x07\xd8\
+\x39\x7b\xc6\xe8\x27\xd1\xc6\x58\x98\xe5\x0c\xcc\xd9\x60\x3f\xda\
+\x9c\xc5\x2a\xb1\x1a\x6f\xa5\xfb\xf4\x72\x7f\xf5\x4e\xe9\x63\xfe\
+\x8a\x3e\xf6\xa0\x81\x1f\x6f\x8b\x6d\x7e\x12\x6f\xc5\x52\x87\xbd\
+\x75\x60\x29\x68\xc8\x2b\x5c\x86\x34\xa7\x85\x14\xf8\x94\x67\x40\
+\x95\xef\x81\x4a\xe8\x84\x31\x21\x1c\xef\x81\x4a\xb2\xc4\x59\xad\
+\xd4\x0e\xa8\x4c\xc2\xc1\xc8\x1c\x3f\x0c\x2a\x39\x06\x54\xc1\x50\
+\x27\x04\x95\x56\x5c\x78\x51\x83\x8a\x59\xa4\x78\x8f\x77\x9c\x59\
+\xed\xd5\x59\xcc\x13\xef\x25\xe7\xe6\x35\x98\xd2\xce\x1d\xcd\x01\
+\xe8\x73\x24\x54\xcd\x0d\x85\xc8\x93\xa0\x0a\x8b\x1d\x89\x50\x73\
+\x76\x35\xf7\xfe\x5d\x23\x94\x50\x04\x91\x3e\x96\xfa\x20\x12\xe4\
+\xc8\x3d\x00\xf1\x23\xe1\x88\x8d\x41\x4e\x30\xc7\x09\x91\x63\x19\
+\x66\xac\x91\xe3\x98\x85\xef\x51\x34\x12\x5e\x31\x88\x63\x60\xde\
+\x39\x0b\x40\xbd\x02\x39\x5c\x30\x7b\x14\x3a\xd4\xe9\x30\x76\x4e\
+\x17\x8f\x68\xad\xc3\xd0\x19\x0a\x48\x27\x06\x0e\x7c\x11\x29\x96\
+\xed\xc4\x21\x9e\x68\xcd\x5c\x27\x3a\x05\x08\xed\xf7\x25\x18\xb9\
+\x84\x49\x0b\xab\x1d\x44\x93\xb1\x63\xd0\x54\x9a\xe8\xa4\x81\x08\
+\x3f\xba\x82\x93\xd0\x5c\x23\x3b\xe3\x1d\xf3\xcc\x2b\x7d\x86\x68\
+\xeb\x2d\x82\x92\xe8\xa0\xe9\xba\x58\x6c\xf3\x75\xb3\xd7\xcb\x49\
+\x1c\x52\x00\xe7\x48\x87\xed\x75\x07\x31\x10\x29\x35\x90\xa9\x1a\
+\x79\x55\x93\x43\x4f\x8e\xda\xda\x86\xba\x16\xe7\x20\x02\x84\xf1\
+\x56\x85\xc1\xd0\x71\xb1\xc4\xa2\xf7\xab\x45\xba\x2d\x56\xcb\xb8\
+\xdc\x03\x2e\x79\xf3\xcf\x5f\xfe\xd2\x53\x6b\xd9\xa2\xc1\x9d\x5a\
+\x20\x5f\xe7\xbf\xa4\x0f\x9b\x4d\x91\x2e\xff\xb2\x78\x58\xf7\x61\
+\xd6\x6f\xc3\xb8\x7e\x02\x9c\xff\x9c\x7f\x2d\xc2\x9a\xc4\xca\x0c\
+\x88\x00\x7e\x74\x07\x4d\xe5\x7a\xf5\x09\x13\x14\x9d\x2e\x76\x51\
+\x14\x0e\x00\x34\x68\x4f\x07\xcb\x54\xfe\x0b\x96\x48\x2e\x5a\x19\
+\x0a\x72\xd9\x97\x5c\x0f\x8c\xbc\x1e\x18\x49\x17\xd2\x5f\x1b\x78\
+\x1a\x95\xd7\x4c\xd7\xc1\xde\x0e\x27\x24\x61\xcb\x2d\xaf\xe0\x24\
+\xc1\x96\x0c\x91\x25\x9d\x68\xe1\x84\x31\x67\x1c\x9e\x20\x0c\x67\
+\xaf\x89\x4e\x61\xab\x47\x02\x06\xfa\x1c\xe6\x4a\x57\x8b\x34\xfb\
+\x72\x92\xd8\x84\xa5\x0e\x73\xa5\x81\xa5\x5e\x15\x9a\xfe\x5f\x81\
+\x6a\x54\xca\x7b\x17\x50\xe9\x1d\x50\xc9\x84\xa4\xc2\xbf\x09\x53\
+\x1c\x81\xe6\x78\xc6\x43\xa7\x23\x6c\x29\x4b\xe7\x2c\x33\xa7\xc9\
+\x79\x58\xed\x58\xc9\x9c\xe6\x59\x3e\x82\x2e\x81\x59\x8e\x5b\xef\
+\x08\x3d\xcb\x74\x76\x95\xb1\x77\xa5\x67\x9c\xea\x29\xe6\x54\xbf\
+\x84\x14\x89\xe7\xd2\x38\xb5\x43\xd4\x6c\xc2\xbd\x10\xb6\x4d\x1e\
+\x25\x59\x23\x6e\xc4\xf8\x61\xb6\xaf\xc7\x65\xd9\x00\x8b\x13\x66\
+\x59\xd4\xfd\xc6\xd6\x35\xa4\x52\x48\xf6\x4c\x00\xb8\x5c\x19\x64\
+\x5c\xa2\xfb\xc6\x7a\x23\xc4\x51\x04\x93\xaa\x24\x95\x40\x0a\x5a\
+\xe9\xa9\x8a\x83\xdf\x2a\x6f\x65\xbf\xda\x96\x92\xfa\x4a\xbe\xa3\
+\xaa\xbd\xbe\x43\xaa\x72\xe3\x7c\x1d\x86\x78\xbb\xa6\xb6\xf4\x16\
+\xb9\x3d\xff\x09\xaa\x70\x42\x81\x2f\x91\x7a\x84\x3e\xc2\x3b\x84\
+\xc2\x8f\xee\x1e\x26\x94\xbc\x43\xa1\x48\xa7\xea\x71\x9f\x77\x80\
+\x2e\x3b\xcd\x5a\xc0\xb7\xbc\x83\x79\xd8\xa2\xc3\xd5\x5f\xc3\x3b\
+\x0c\x18\xd4\x6b\x78\x07\xc6\xf5\x23\x4c\x9f\x77\x08\x85\x97\x56\
+\xee\x39\xde\x31\x3a\x85\x92\xb1\x8e\xe5\x35\x21\x5e\x9c\xd7\x5e\
+\x9b\x42\x85\x3c\x7c\x4c\x77\xaa\x14\x7a\xc0\x99\x04\x50\xe6\x98\
+\xe8\x57\x86\x5c\x26\xd6\xf9\x2e\x97\x08\xce\x04\xc7\x13\xcc\x77\
+\x20\x12\x9c\x69\xaf\xef\x60\xad\xe8\x7e\x84\x33\xc5\xdc\x27\x5a\
+\x12\xf5\x82\x37\x59\x25\x2d\x77\xea\x59\x8f\x7a\x15\xcf\xb6\xdd\
+\xf3\xab\x17\xf0\x6c\xbb\x73\xa6\xd5\xc7\xbb\x93\x70\x08\x6f\x5f\
+\x08\xf7\xe6\x26\xd7\x6a\xb1\xc8\x33\xe0\x22\x5d\x3c\xa6\xdf\x36\
+\x2f\x3e\x33\xdc\xb7\x9f\x34\xe6\x04\x76\x79\xd5\x91\x62\x17\xac\
+\xa7\x3b\x65\x3d\x46\x94\xde\xa0\xca\xde\x49\xd9\xa0\x2a\xfd\x29\
+\x55\x39\xfe\x20\x6d\x87\x6e\x9c\xec\x70\xf1\x1d\x75\xd9\x3b\x3b\
+\x1a\xd2\xe5\x69\xcf\x02\xc6\x1f\x2d\x75\x75\xf9\xca\x93\xb5\x77\
+\x54\x5b\xff\x90\x64\x50\x6f\xf2\xb4\x18\x1c\x79\x86\xd2\x53\xdb\
+\x09\xcf\x95\x1a\x5d\x0e\xd7\x8a\x6f\xd1\x65\xaf\x96\xdb\x2f\x09\
+\xa1\xca\x1f\x74\x7e\xf0\xd2\x42\x78\x6c\xd9\xdb\x16\xcc\x3f\x54\
+\xab\xa7\xcc\x37\xe3\x0b\xe8\xef\xa8\xd4\x77\x70\xfb\x5e\xd5\x36\
+\xe8\xf6\x27\x4d\x3d\xa3\x8b\xba\xf7\x2a\x74\xdf\x51\x97\x3d\x26\
+\x3a\xa4\xca\x53\xdc\xd4\x38\x50\xf5\xbd\x57\xc1\xfb\x43\x55\x76\
+\x82\xa4\x73\x8c\xdb\xbf\x57\x6d\xf3\x43\xdd\xd6\xfd\x97\xba\xed\
+\x0f\xc8\x2b\x9d\x67\xd2\xfe\x4b\xf3\xca\x3b\x28\x75\xd7\xb1\xf7\
+\x94\xfa\x5d\x28\x90\x11\x5c\x39\x43\xfa\xc5\x05\x0b\xb8\xfb\x1f\
+\x3d\x5d\x1f\x65\xe9\xfe\xa4\x7e\xaf\x98\x95\x82\x88\x79\x45\xd3\
+\x15\xb7\xc8\x08\xa1\x00\x17\xc2\x33\x49\x4c\xdd\x7a\xa1\x85\xfc\
+\x1e\x4c\xfd\xfb\x17\x8b\x08\x73\xdf\xb1\x58\x54\x7f\x94\x62\xf1\
+\xd8\x79\x85\x65\xa7\xf4\x6e\xa5\xe1\xc2\xc8\xa9\xb5\x7b\x1b\x85\
+\x08\x09\x14\xc2\xbf\x95\xf5\x5a\x0b\x9d\xc7\xea\x4c\x01\xad\x82\
+\xf3\x5d\xe5\xfd\x41\x4e\x2d\xc2\x63\xe0\x07\x35\xea\x4e\xa9\x51\
+\x67\xbd\x55\x5a\xd6\x09\xdd\x71\x6d\x1d\xe2\x27\xb0\x68\x41\x68\
+\x8c\xb7\x22\xbc\xb7\x1c\x89\xda\xfa\xf7\x3d\x51\xbb\x98\xd2\x83\
+\xf3\xe1\xdd\x7d\xba\xbd\x2d\xbb\x56\xe7\xda\xd7\xc5\x62\x31\x7b\
+\x58\x2f\x7e\xfa\xb8\xaf\x8f\x4f\xe7\xd4\xda\x9e\xa7\x97\x1f\xd7\
+\x0f\x8b\x7c\x96\x7f\xcd\x97\xab\xf9\xfc\x7c\xb3\x5d\xaf\xbe\xe4\
+\xb3\x8f\x29\x28\x9f\xca\xab\x8f\xe5\x77\x1c\x66\xd8\x1b\x22\x9b\
+\x76\x9c\xd7\x72\x5a\x02\xf6\x9b\xad\x57\x0f\xcb\x79\x57\xf8\xef\
+\x55\xb1\xec\x4b\xef\x8a\x6d\xbe\x5e\x14\xf8\x35\x53\xb5\xac\xdd\
+\x48\x25\x98\xa7\x9b\xdb\xf2\xb8\xbd\x39\x81\x0f\x99\x10\xd0\xe0\
+\x2d\xdb\xa6\xaf\xdd\x44\x32\x21\x18\x5b\x58\xc4\x27\x82\x03\x0b\
+\xc6\x47\x59\xa4\x40\x95\x3c\xa0\x1f\x82\x84\xe1\x5a\x20\xfa\x47\
+\x3e\x71\x9e\x1b\xbc\x23\xa1\xe6\xde\xf2\x88\xa8\x3a\x3d\x4f\x48\
+\xc7\xa3\x11\x7a\x32\x85\x18\x13\xd1\xdd\x19\x66\x38\x0f\x8c\x4d\
+\x39\xc6\x65\x57\xe4\x41\xed\xb1\x8b\x68\x11\x31\xac\xe9\xa5\x77\
+\x42\x62\xc9\x70\x22\x88\xad\x70\x11\x85\xe9\xad\x63\x8a\x7a\x73\
+\x2b\xbd\x8e\xe2\xbd\x09\x22\x38\x21\xf6\x8b\x66\x1a\xc8\x35\x57\
+\x2a\x8a\x7d\x62\xa4\x82\xc6\x4d\x90\x71\x04\x34\x8c\xec\xee\x31\
+\x0e\x8f\x85\x48\x6b\x02\xe4\xb8\x33\xca\xb6\x93\x93\xa8\xdc\x70\
+\x4f\x54\xad\x47\xfb\x8d\x7b\x1b\x8e\xab\x1d\x73\x17\x11\x94\x8d\
+\xe2\xdc\xb7\x03\x78\xb4\x37\x07\x8f\x7e\xaf\xa1\xb7\x07\xb8\xf6\
+\x09\x4d\x69\x3d\xbd\x5c\x80\xd5\x6c\xb9\x5a\xd6\xf8\x79\x06\x8f\
+\xfa\xd3\x2e\xbe\x9c\xc6\xa5\x5b\x7f\x6a\x7c\x91\x81\x39\xf3\xc2\
+\xf9\x11\x40\x33\x48\xd2\x5d\xa0\xa9\x84\x71\xcb\x80\x90\x33\x8e\
+\xac\x0b\xd6\x4e\xa8\x90\x09\x3d\xad\xad\x3c\xec\x45\x1a\x4d\xa4\
+\xb0\x28\xbc\x02\x96\x50\x66\x40\xa5\x74\x38\xec\x39\x83\xe6\x3a\
+\x12\x25\x9c\x14\x25\x80\x40\xd3\xb5\x61\x35\x7e\x84\x44\xb4\xf4\
+\x64\x64\x21\x11\x92\xe9\x68\x59\xa2\x14\x95\x2e\x40\x6a\x67\x38\
+\x92\x1e\xe8\x9a\x36\x84\x1f\x89\x0a\x80\x06\xfa\x04\xb4\xc3\x1b\
+\x2e\x82\x8c\x23\x84\x00\x09\xdd\x4d\xc6\xf5\x1e\xc3\x1d\x00\xe6\
+\x30\x65\x33\x37\xdd\x0b\xa8\xb6\x2b\x76\x84\x9d\x1d\xc7\xdd\x2d\
+\xc7\xe5\x9e\x3d\xae\x4e\x18\x89\xea\x4f\x76\x7a\x0f\xcd\xf0\x3c\
+\x7e\x0e\x04\x2c\x31\x3e\x60\x75\xd0\x56\xa1\x49\x9c\xdf\xa5\xeb\
+\x2f\xf9\xba\x6c\xfa\x5a\x6c\x8a\xab\x62\x41\xb3\x84\xb7\x8b\xfc\
+\x7c\x5e\x6c\xee\x17\xe9\xb7\x59\xb1\xa4\x85\xcf\x57\x5f\xf3\xf5\
+\xf5\x62\xf5\x58\xb7\xef\xc6\x1f\xd5\x3c\x95\x52\xc5\x1f\x00\x15\
+\xc5\xdc\x19\xd5\xc7\x4e\x8b\x10\x7c\x1c\x92\x2c\x97\x21\xf8\x20\
+\x20\x49\x2d\x11\x7b\x0c\x4a\x34\x11\x42\x8f\x51\x46\x78\x49\xb1\
+\x47\xc1\xe3\x14\x0f\x70\x51\x92\x3b\x56\x22\x87\x26\x0c\x46\x75\
+\x86\x41\xcf\xad\xc0\x19\x4d\xee\x4e\x56\xe0\x89\xf2\xce\x3b\x5b\
+\x01\x07\xa9\x46\x59\x19\xac\xab\x2c\x56\xaa\x3b\x9b\x28\xde\x19\
+\x6e\x28\xee\xc0\x4e\xd2\x53\x74\xc2\x36\x81\x8b\x10\x77\x90\xd4\
+\xb4\xf5\x01\x84\x08\x93\x22\xc4\x9d\x66\x7f\x71\xb5\x41\x55\xbe\
+\xa7\x19\x45\x08\x15\xd5\x1e\x7b\xb2\x6a\x9d\x00\x96\xde\x3e\xe3\
+\x6a\xa3\x22\xaa\xf6\xa9\x9b\xee\x3a\xda\x9b\x41\x8f\x0a\x36\x66\
+\x5c\x94\x01\xbb\xdf\x8b\x32\xd8\x58\x08\x6a\xdf\x23\x8b\x9d\x18\
+\x84\xed\x23\x42\x55\x6c\x82\xd3\x5b\xa8\xec\x8c\xd3\xed\x7b\x66\
+\x84\xa3\xd8\x84\x70\x41\x89\xba\x8a\x4d\xc0\x1c\xa3\xc4\x42\x7e\
+\x89\x60\x61\xc8\xfe\x5c\xa2\xaf\xe8\x4a\x04\xc2\x63\x65\x3c\x34\
+\x5b\x63\x9d\xa8\x30\x86\xd4\x29\xb4\x2c\x83\x13\x1c\xdb\xd5\x9d\
+\x75\x88\x15\xbd\xf1\x9a\x82\x13\x00\x05\xa0\x13\xc8\x04\x53\x12\
+\x20\x73\x89\xd7\x56\x04\x64\x2b\xc6\x94\x0d\xa1\xa9\xdd\x63\x5c\
+\x6f\xb1\x8a\x53\xe5\x94\x65\x4c\x2a\xb7\xd9\x17\x56\x2b\x2d\x4a\
+\x60\x75\xb6\x1a\x57\x7b\x55\x51\xb3\xd5\xb8\xb9\xb0\xfd\x29\x4c\
+\x8b\x33\xd2\xed\x33\x38\x13\x25\xce\xaa\xef\xae\xbe\x21\x1e\xf1\
+\x37\x42\xe1\xbc\xbc\x39\x5d\xa2\xbc\x7d\xfe\xf4\xd3\x79\xbe\x4c\
+\xd1\x1c\x5f\xa5\xd9\x97\x9b\x00\xd6\x59\x9a\x65\x0f\x77\x0f\x74\
+\x7e\xb7\x83\x1f\xd4\x52\x35\xdf\xdc\x0e\x90\x5c\xd0\x3b\xc5\xea\
+\x83\x16\x6d\xa9\x70\x45\x2c\x73\x89\x40\x31\x80\x10\x11\x4b\x3a\
+\x28\x50\xa6\x2d\x18\xa8\xa8\x97\xd4\xcc\x9b\x03\xd2\xa7\x70\x0e\
+\x8a\xb4\xc3\x9a\xaf\x6a\xac\xe9\x4b\xa8\x09\x3d\x34\x29\x9a\x47\
+\x71\xd7\x4f\xfb\xb2\xe6\x21\x19\x93\x78\xb0\x03\x53\x13\xe6\xfa\
+\x3b\xde\x89\x13\x0e\xa1\x94\x8f\x48\x25\xfb\x67\x27\x6f\x49\x25\
+\x6f\x36\xdd\x21\x13\x9d\x77\x08\x94\x67\x28\x13\x99\xed\x58\x8d\
+\xae\xd1\xb4\x8f\xc2\x07\xaf\x87\x3f\x31\x83\x02\xc4\x90\xd7\x6b\
+\x4d\xe5\x6f\xe5\xaa\x06\xac\x8e\xa2\x32\x4f\xc0\xe8\x84\x67\x74\
+\x3a\xc6\x91\xeb\xe1\x84\x02\x01\x39\xbc\x5a\x11\x47\x14\x67\x96\
+\x38\x03\x35\x87\x98\x4c\x3e\xa2\x6d\xf5\xb1\xee\xc8\xca\x87\x06\
+\x30\xb5\x8a\xca\x99\x9d\x6b\x5a\x45\xd4\xed\x2b\xa2\x72\x52\xac\
+\xcc\xa2\x76\xc9\x6a\x62\x17\xed\xed\x42\x8c\x63\x96\xe7\x07\x4c\
+\xfb\x26\x96\xf0\xae\xa6\xdd\xb3\xa3\xeb\xd9\x91\xce\x6b\xf0\x92\
+\xe6\x0c\x2e\x66\xad\xe2\xa1\x84\x69\xec\x28\x6c\x6d\x48\xa8\xbb\
+\x54\x97\xf6\xa5\x6d\x68\x18\xef\xca\xfa\xa6\x2c\x75\xdc\xb7\x67\
+\x2d\x6b\x07\xb5\x66\x95\xb6\xb6\xab\x6d\x2c\xc9\x75\xb4\x3b\x88\
+\x64\xd5\x42\x32\x98\xb7\xda\x47\xbd\x8c\x8b\x76\xb6\x46\x03\x5e\
+\x41\xfc\x8c\xf3\x2f\xa8\x54\x9d\x73\xa9\xd3\x7b\x39\x3e\xbc\x94\
+\xd9\xcd\xf1\x57\x0f\xdb\xed\x5e\x8a\x0f\x59\xfd\xc5\x29\x3e\x5d\
+\xaf\x81\x0b\xc2\xcd\x8e\x9d\x05\x73\xa6\x6b\x67\x0d\xad\x50\x08\
+\x3d\x33\x09\x83\xa6\x0c\x0a\xbe\xa0\x7b\x67\xad\x23\x8e\x1f\x72\
+\x97\xa4\xc7\x4a\x50\xed\x29\x28\x91\xea\x56\xae\xc2\x03\x3a\x0c\
+\x9c\x9d\x70\x41\x07\x37\x74\x26\x43\x42\x03\xc6\x8d\x91\xa0\xa0\
+\x92\xee\x41\x11\xe9\x43\xa2\x05\x09\xa7\x6e\x9a\x3b\x01\x56\xca\
+\x13\xd4\xe9\x42\xf2\x8e\x08\x65\xa7\x40\x75\xc6\xca\xd4\x89\x3c\
+\x2d\xe9\xfb\x74\x35\x93\x74\xf0\x59\x25\x08\x29\x02\x2b\x71\x64\
+\x81\xc4\x7a\x64\x72\xdf\x11\x55\x95\x27\x78\x46\x99\x7d\xb1\x01\
+\xc3\x0c\x95\x01\x55\xfa\x05\x81\x44\x06\x11\x21\xff\x0a\x84\x70\
+\xea\x62\xad\x36\x5a\x22\x28\x49\x9a\x86\x0b\xb7\x23\x54\xa8\x43\
+\x03\xbd\x94\x28\x41\xbc\x21\xa8\x13\x22\x11\xeb\x83\x08\x34\xc1\
+\xbb\x33\x01\xc6\x8a\xf2\x12\xda\x29\x09\x0a\xf4\xc4\x40\x2f\xc3\
+\xba\xa8\x56\x95\xc7\xb5\x04\x98\x43\x1f\xd2\x4b\xc2\x1f\x6a\x20\
+\xb0\xca\x8e\x0c\x5a\xc2\xac\x9c\x6a\x91\x0a\x87\xcd\x9f\xac\x58\
+\xcd\x73\xfa\x4a\xf7\xe6\x72\x92\x65\x9b\x2c\x2b\xff\x1b\x11\x97\
+\x78\xf5\xcd\x93\xf3\x03\x58\xe6\x2f\x0c\x4f\xfb\x69\x9e\x1e\xf7\
+\xfc\xb4\x77\x1c\xd2\x9c\x27\x0e\x65\xf2\xfe\xed\x27\xc3\x8d\x31\
+\xdc\x77\x6e\x3f\xc1\x51\x2d\x28\xbc\x6f\xe6\x2d\x6b\x1a\x60\x0b\
+\x38\x40\x14\xe0\xf4\x74\x1c\xaa\x5e\x0f\x87\x47\x81\xe7\x15\xb1\
+\x3e\x2e\x74\x20\x94\x5e\x80\xcd\xf9\x33\xca\xc7\xc2\xca\x50\xa8\
+\x00\x07\x5a\x50\x29\xc4\x99\xe2\x43\x12\x2a\x3a\x89\xf7\x87\x1b\
+\xaf\x64\x14\x46\x07\xff\x14\x3a\x64\x29\x00\x02\xaa\x83\x0a\xd4\
+\x4d\x34\x62\x4c\x5e\xe0\xe1\xfb\x40\xca\x1e\xd2\xbf\x3c\xb9\xfe\
+\x43\x2c\x97\x52\x3c\xab\xff\x78\xd7\x00\xa4\x26\xe5\x24\xe2\xa2\
+\x04\x58\x85\x50\xc1\xbb\xb8\x84\xd3\xf6\x2d\xc0\x05\xb4\x6b\xe0\
+\x54\x74\xd8\xa0\x51\x86\x85\x02\x49\xd2\xad\x9a\xf0\xbc\x19\x2c\
+\xe6\xc9\x08\x3c\xb1\x82\x49\x9a\x10\x21\x05\x95\x9c\xa1\xa8\x61\
+\x51\x70\x92\xca\x25\xe2\x8a\xdc\x17\x8c\x31\x01\x0b\x65\x02\x79\
+\x5f\x78\x12\x0b\x60\x30\x2a\xd0\x6f\x45\xe7\x45\x64\x1d\x14\x68\
+\x4c\x8c\x2c\xd1\x4a\xe7\xe0\xfb\x95\x5a\xcd\xa6\x7b\x41\x1b\x11\
+\x49\x70\x81\xe0\xaf\xc6\x15\x66\x6f\x8d\xda\xef\x50\xae\x0d\x71\
+\x74\xab\xf4\x68\x8e\x4e\xca\xd4\xed\xb3\x4e\x83\x9e\x1d\xce\x56\
+\x7a\xf7\x95\xc3\x41\xa2\xb4\x06\xa5\x3c\xd5\x58\xf0\x56\x81\x8a\
+\xbd\x8f\x2b\x09\x5b\x1a\x70\x45\x42\x20\x47\x5d\xc6\xe8\xe8\x8f\
+\x0b\x15\xd2\x3b\x72\x0f\xfd\xd5\x83\xd2\xbd\xc9\xc8\xe8\x4b\x27\
+\x52\x82\x28\x0a\x22\x02\xf1\x3b\xca\x31\xce\x79\xa9\x1b\x19\xc5\
+\x69\x90\x07\x43\xf9\x24\x20\x1e\x1e\xef\x08\xb7\xf8\x25\x9b\x1b\
+\xff\xc3\x41\xb6\x8a\xae\x17\xf4\x57\x8e\x3e\x7f\xf8\x0f\x80\xef\
+\x2e\x66\
+\x00\x00\x2a\x9c\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
+\x6e\x6f\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\
+\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\
+\x73\x74\x72\x61\x74\x6f\x72\x20\x32\x33\x2e\x30\x2e\x32\x2c\x20\
+\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\
+\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\
+\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\
+\x20\x2d\x2d\x3e\x0a\x0a\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x64\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\
+\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\
+\x6e\x74\x73\x2f\x31\x2e\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\
+\x6e\x73\x3a\x63\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x63\x72\
+\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\x6e\x73\x2e\x6f\x72\
+\x67\x2f\x6e\x73\x23\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
+\x72\x64\x66\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\
+\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x30\x32\x2f\x32\
+\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\x74\x61\x78\x2d\x6e\x73\x23\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x76\x67\x3d\x22\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\
+\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\
+\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x6f\x64\x69\x70\
+\x6f\x64\x69\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x73\x6f\x64\x69\
+\x70\x6f\x64\x69\x2e\x73\x6f\x75\x72\x63\x65\x66\x6f\x72\x67\x65\
+\x2e\x6e\x65\x74\x2f\x44\x54\x44\x2f\x73\x6f\x64\x69\x70\x6f\x64\
+\x69\x2d\x30\x2e\x64\x74\x64\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x69\x6e\x6b\x73\x63\x61\x70\x65\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\
+\x6f\x72\x67\x2f\x6e\x61\x6d\x65\x73\x70\x61\x63\x65\x73\x2f\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\x20\x76\x65\x72\x73\
+\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x0a\x20\x20\x20\x69\x64\x3d\
+\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x0a\x20\x20\x20\x78\x3d\x22\
+\x30\x70\x78\x22\x0a\x20\x20\x20\x79\x3d\x22\x30\x70\x78\x22\x0a\
+\x20\x20\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\
+\x31\x37\x36\x20\x31\x37\x36\x22\x0a\x20\x20\x20\x78\x6d\x6c\x3a\
+\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\
+\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x64\x6f\x63\
+\x6e\x61\x6d\x65\x3d\x22\x63\x61\x73\x68\x73\x68\x75\x66\x66\x6c\
+\x65\x5f\x6f\x6e\x5f\x65\x72\x72\x6f\x72\x2e\x73\x76\x67\x22\x0a\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x76\x65\x72\x73\
+\x69\x6f\x6e\x3d\x22\x30\x2e\x39\x32\x2e\x34\x20\x28\x35\x64\x61\
+\x36\x38\x39\x63\x33\x31\x33\x2c\x20\x32\x30\x31\x39\x2d\x30\x31\
+\x2d\x31\x34\x29\x22\x0a\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\
+\x31\x37\x36\x22\x0a\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\
+\x31\x37\x36\x22\x3e\x3c\x6d\x65\x74\x61\x64\x61\x74\x61\x0a\x20\
+\x20\x20\x69\x64\x3d\x22\x6d\x65\x74\x61\x64\x61\x74\x61\x34\x30\
+\x31\x34\x22\x3e\x3c\x72\x64\x66\x3a\x52\x44\x46\x3e\x3c\x63\x63\
+\x3a\x57\x6f\x72\x6b\x0a\x20\x20\x20\x20\x20\x20\x20\x72\x64\x66\
+\x3a\x61\x62\x6f\x75\x74\x3d\x22\x22\x3e\x3c\x64\x63\x3a\x66\x6f\
+\x72\x6d\x61\x74\x3e\x69\x6d\x61\x67\x65\x2f\x73\x76\x67\x2b\x78\
+\x6d\x6c\x3c\x2f\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x3c\x64\
+\x63\x3a\x74\x79\x70\x65\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x72\x64\x66\x3a\x72\x65\x73\x6f\x75\x72\x63\x65\x3d\x22\x68\x74\
+\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\
+\x2f\x64\x63\x6d\x69\x74\x79\x70\x65\x2f\x53\x74\x69\x6c\x6c\x49\
+\x6d\x61\x67\x65\x22\x20\x2f\x3e\x3c\x64\x63\x3a\x74\x69\x74\x6c\
+\x65\x20\x2f\x3e\x3c\x2f\x63\x63\x3a\x57\x6f\x72\x6b\x3e\x3c\x2f\
+\x72\x64\x66\x3a\x52\x44\x46\x3e\x3c\x2f\x6d\x65\x74\x61\x64\x61\
+\x74\x61\x3e\x3c\x64\x65\x66\x73\x0a\x20\x20\x20\x69\x64\x3d\x22\
+\x64\x65\x66\x73\x34\x30\x31\x32\x22\x20\x2f\x3e\x3c\x73\x6f\x64\
+\x69\x70\x6f\x64\x69\x3a\x6e\x61\x6d\x65\x64\x76\x69\x65\x77\x0a\
+\x20\x20\x20\x70\x61\x67\x65\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x66\
+\x66\x66\x66\x66\x66\x22\x0a\x20\x20\x20\x62\x6f\x72\x64\x65\x72\
+\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x36\x36\x36\x36\x36\x36\x22\x0a\
+\x20\x20\x20\x62\x6f\x72\x64\x65\x72\x6f\x70\x61\x63\x69\x74\x79\
+\x3d\x22\x31\x22\x0a\x20\x20\x20\x6f\x62\x6a\x65\x63\x74\x74\x6f\
+\x6c\x65\x72\x61\x6e\x63\x65\x3d\x22\x31\x30\x22\x0a\x20\x20\x20\
+\x67\x72\x69\x64\x74\x6f\x6c\x65\x72\x61\x6e\x63\x65\x3d\x22\x31\
+\x30\x22\x0a\x20\x20\x20\x67\x75\x69\x64\x65\x74\x6f\x6c\x65\x72\
+\x61\x6e\x63\x65\x3d\x22\x31\x30\x22\x0a\x20\x20\x20\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3a\x70\x61\x67\x65\x6f\x70\x61\x63\x69\x74\
+\x79\x3d\x22\x30\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\
+\x65\x3a\x70\x61\x67\x65\x73\x68\x61\x64\x6f\x77\x3d\x22\x32\x22\
+\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\
+\x64\x6f\x77\x2d\x77\x69\x64\x74\x68\x3d\x22\x31\x32\x39\x39\x22\
+\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\
+\x64\x6f\x77\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x38\x31\x35\x22\
+\x0a\x20\x20\x20\x69\x64\x3d\x22\x6e\x61\x6d\x65\x64\x76\x69\x65\
+\x77\x34\x30\x31\x30\x22\x0a\x20\x20\x20\x73\x68\x6f\x77\x67\x72\
+\x69\x64\x3d\x22\x66\x61\x6c\x73\x65\x22\x0a\x20\x20\x20\x69\x6e\
+\x6b\x73\x63\x61\x70\x65\x3a\x7a\x6f\x6f\x6d\x3d\x22\x33\x2e\x30\
+\x31\x31\x38\x31\x36\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x3a\x63\x78\x3d\x22\x34\x33\x2e\x33\x37\x31\x37\x36\x35\
+\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x79\
+\x3d\x22\x31\x34\x32\x2e\x32\x33\x34\x36\x35\x22\x0a\x20\x20\x20\
+\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\
+\x78\x3d\x22\x30\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\
+\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x79\x3d\x22\x30\x22\x0a\x20\
+\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\
+\x77\x2d\x6d\x61\x78\x69\x6d\x69\x7a\x65\x64\x3d\x22\x30\x22\x0a\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x75\x72\x72\
+\x65\x6e\x74\x2d\x6c\x61\x79\x65\x72\x3d\x22\x67\x34\x30\x30\x37\
+\x22\x20\x2f\x3e\x0a\x3c\x73\x74\x79\x6c\x65\x0a\x20\x20\x20\x74\
+\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x63\x73\x73\x22\x0a\x20\
+\x20\x20\x69\x64\x3d\x22\x73\x74\x79\x6c\x65\x33\x39\x37\x39\x22\
+\x3e\x0a\x09\x2e\x73\x74\x30\x7b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\
+\x65\x3a\x65\x76\x65\x6e\x6f\x64\x64\x3b\x63\x6c\x69\x70\x2d\x72\
+\x75\x6c\x65\x3a\x65\x76\x65\x6e\x6f\x64\x64\x3b\x66\x69\x6c\x6c\
+\x3a\x23\x45\x31\x45\x31\x45\x31\x3b\x7d\x0a\x09\x2e\x73\x74\x31\
+\x7b\x66\x69\x6c\x6c\x3a\x23\x46\x46\x36\x36\x30\x30\x3b\x7d\x0a\
+\x09\x2e\x73\x74\x32\x7b\x66\x69\x6c\x6c\x3a\x23\x34\x43\x34\x43\
+\x34\x43\x3b\x7d\x0a\x09\x2e\x73\x74\x33\x7b\x66\x69\x6c\x6c\x3a\
+\x23\x46\x46\x46\x46\x46\x46\x3b\x7d\x0a\x3c\x2f\x73\x74\x79\x6c\
+\x65\x3e\x0a\x3c\x67\x0a\x20\x20\x20\x69\x64\x3d\x22\x67\x34\x30\
+\x30\x37\x22\x0a\x20\x20\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\
+\x3d\x22\x74\x72\x61\x6e\x73\x6c\x61\x74\x65\x28\x30\x2c\x2d\x34\
+\x35\x2e\x36\x33\x30\x30\x30\x35\x29\x22\x3e\x0a\x09\x0a\x09\x3c\
+\x70\x61\x74\x68\x0a\x20\x20\x20\x63\x6c\x61\x73\x73\x3d\x22\x73\
+\x74\x31\x22\x0a\x20\x20\x20\x64\x3d\x22\x6d\x20\x32\x37\x2e\x31\
+\x33\x33\x36\x36\x32\x2c\x31\x32\x32\x2e\x30\x32\x35\x39\x39\x20\
+\x63\x20\x2d\x32\x2e\x37\x33\x2c\x2d\x33\x2e\x37\x32\x20\x2d\x35\
+\x2e\x37\x35\x2c\x2d\x38\x2e\x36\x20\x2d\x39\x2e\x30\x36\x2c\x2d\
+\x31\x34\x2e\x37\x39\x20\x2d\x31\x2e\x38\x39\x2c\x2d\x33\x2e\x32\
+\x37\x20\x2d\x32\x2e\x30\x38\x2c\x2d\x34\x2e\x37\x39\x20\x31\x2e\
+\x30\x37\x2c\x2d\x36\x2e\x31\x33\x20\x6c\x20\x35\x36\x2e\x38\x33\
+\x2c\x2d\x32\x33\x2e\x35\x30\x39\x39\x39\x38\x20\x63\x20\x31\x2e\
+\x36\x2c\x2d\x30\x2e\x37\x20\x33\x2e\x37\x2c\x2d\x30\x2e\x37\x31\
+\x20\x35\x2e\x30\x36\x2c\x31\x2e\x37\x35\x20\x37\x2e\x36\x34\x2c\
+\x31\x31\x2e\x32\x39\x20\x31\x33\x2e\x32\x2c\x31\x39\x2e\x32\x33\
+\x20\x32\x31\x2e\x30\x39\x39\x39\x39\x38\x2c\x32\x37\x2e\x37\x39\
+\x39\x39\x39\x38\x20\x31\x32\x2e\x31\x35\x2c\x31\x32\x2e\x35\x38\
+\x20\x32\x35\x2e\x35\x33\x2c\x32\x36\x2e\x32\x32\x20\x34\x38\x2e\
+\x37\x33\x2c\x33\x36\x2e\x31\x32\x20\x37\x2e\x33\x32\x2c\x32\x2e\
+\x37\x20\x31\x34\x2e\x34\x38\x2c\x34\x2e\x39\x33\x20\x32\x32\x2e\
+\x39\x32\x2c\x36\x2e\x33\x36\x20\x30\x2e\x33\x32\x2c\x30\x2e\x30\
+\x35\x20\x31\x2e\x38\x38\x2c\x30\x2e\x38\x20\x31\x2e\x37\x37\x2c\
+\x32\x2e\x31\x34\x20\x6c\x20\x2d\x30\x2e\x32\x33\x2c\x31\x33\x2e\
+\x32\x36\x20\x2d\x33\x39\x2e\x34\x31\x2c\x32\x32\x2e\x36\x33\x30\
+\x30\x31\x20\x63\x20\x2d\x32\x2c\x31\x2e\x37\x36\x20\x2d\x33\x2e\
+\x39\x31\x2c\x33\x2e\x32\x38\x20\x2d\x38\x2e\x34\x2c\x31\x2e\x38\
+\x34\x20\x6c\x20\x2d\x31\x31\x37\x2e\x31\x39\x39\x39\x39\x39\x2c\
+\x2d\x32\x34\x2e\x33\x39\x30\x30\x31\x20\x2d\x30\x2e\x30\x32\x2c\
+\x2d\x37\x2e\x38\x36\x20\x2d\x39\x2e\x32\x38\x39\x39\x39\x39\x36\
+\x2c\x2d\x32\x2e\x34\x20\x63\x20\x2d\x30\x2e\x37\x32\x30\x30\x30\
+\x30\x30\x32\x2c\x2d\x30\x2e\x31\x38\x20\x2d\x30\x2e\x37\x33\x30\
+\x30\x30\x30\x30\x32\x2c\x2d\x31\x2e\x31\x33\x20\x2d\x30\x2e\x31\
+\x34\x30\x30\x30\x30\x30\x32\x2c\x2d\x31\x2e\x35\x33\x20\x6c\x20\
+\x39\x2e\x37\x35\x30\x30\x30\x30\x36\x32\x2c\x2d\x37\x2e\x39\x34\
+\x20\x63\x20\x2d\x30\x2e\x30\x34\x2c\x2d\x31\x2e\x35\x33\x20\x30\
+\x2e\x34\x2c\x2d\x32\x2e\x35\x20\x31\x2e\x31\x36\x2c\x2d\x33\x2e\
+\x34\x36\x20\x2d\x34\x2e\x32\x38\x30\x30\x30\x30\x36\x2c\x2d\x31\
+\x2e\x35\x20\x2d\x35\x2e\x39\x37\x30\x30\x30\x30\x36\x2c\x2d\x33\
+\x2e\x33\x39\x20\x2d\x33\x2e\x32\x32\x30\x30\x30\x30\x36\x2c\x2d\
+\x35\x2e\x39\x37\x20\x6c\x20\x31\x37\x2e\x32\x31\x30\x30\x30\x30\
+\x36\x2c\x2d\x31\x32\x2e\x37\x35\x20\x7a\x22\x0a\x20\x20\x20\x69\
+\x64\x3d\x22\x70\x61\x74\x68\x33\x39\x38\x33\x22\x0a\x20\x20\x20\
+\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6e\x6e\x65\x63\x74\
+\x6f\x72\x2d\x63\x75\x72\x76\x61\x74\x75\x72\x65\x3d\x22\x30\x22\
+\x0a\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\x6c\x6c\x3a\
+\x23\x66\x66\x36\x36\x30\x30\x22\x20\x2f\x3e\x0a\x09\x0a\x09\x3c\
+\x70\x61\x74\x68\x0a\x20\x20\x20\x63\x6c\x61\x73\x73\x3d\x22\x73\
+\x74\x33\x22\x0a\x20\x20\x20\x64\x3d\x22\x6d\x20\x31\x37\x32\x2e\
+\x34\x35\x33\x36\x36\x2c\x31\x35\x31\x2e\x34\x35\x35\x39\x39\x20\
+\x2d\x34\x32\x2e\x39\x32\x2c\x32\x34\x2e\x32\x35\x20\x63\x20\x2d\
+\x31\x39\x2e\x37\x36\x2c\x2d\x34\x2e\x30\x36\x20\x2d\x33\x36\x2e\
+\x35\x30\x39\x39\x39\x38\x2c\x2d\x31\x30\x2e\x30\x36\x20\x2d\x35\
+\x30\x2e\x35\x36\x39\x39\x39\x38\x2c\x2d\x31\x37\x2e\x30\x38\x20\
+\x33\x2e\x36\x37\x2c\x30\x2e\x38\x36\x20\x37\x2e\x36\x33\x2c\x31\
+\x2e\x33\x33\x20\x31\x31\x2e\x37\x36\x2c\x31\x2e\x33\x33\x20\x31\
+\x38\x2e\x39\x36\x39\x39\x39\x38\x2c\x30\x20\x33\x34\x2e\x33\x34\
+\x39\x39\x39\x38\x2c\x2d\x39\x2e\x39\x34\x20\x33\x34\x2e\x33\x34\
+\x39\x39\x39\x38\x2c\x2d\x32\x32\x2e\x31\x39\x20\x30\x2c\x2d\x32\
+\x2e\x38\x36\x20\x2d\x30\x2e\x38\x34\x2c\x2d\x35\x2e\x36\x20\x2d\
+\x32\x2e\x33\x37\x2c\x2d\x38\x2e\x31\x31\x20\x31\x34\x2e\x37\x37\
+\x2c\x31\x31\x2e\x32\x32\x20\x33\x31\x2e\x37\x33\x2c\x31\x39\x2e\
+\x37\x36\x20\x34\x39\x2e\x37\x35\x2c\x32\x31\x2e\x38\x20\x7a\x20\
+\x6d\x20\x2d\x38\x32\x2e\x30\x34\x39\x39\x39\x38\x2c\x2d\x33\x34\
+\x2e\x33\x33\x20\x63\x20\x31\x37\x2e\x34\x31\x39\x39\x39\x38\x2c\
+\x30\x20\x33\x31\x2e\x35\x33\x39\x39\x39\x38\x2c\x38\x2e\x39\x39\
+\x20\x33\x31\x2e\x35\x33\x39\x39\x39\x38\x2c\x32\x30\x2e\x30\x39\
+\x20\x30\x2c\x31\x31\x2e\x31\x20\x2d\x31\x34\x2e\x31\x32\x2c\x32\
+\x30\x2e\x30\x39\x20\x2d\x33\x31\x2e\x35\x33\x39\x39\x39\x38\x2c\
+\x32\x30\x2e\x30\x39\x20\x2d\x31\x37\x2e\x34\x32\x2c\x30\x20\x2d\
+\x33\x31\x2e\x35\x34\x2c\x2d\x38\x2e\x39\x39\x20\x2d\x33\x31\x2e\
+\x35\x34\x2c\x2d\x32\x30\x2e\x30\x39\x20\x30\x2c\x2d\x31\x31\x2e\
+\x31\x20\x31\x34\x2e\x31\x32\x2c\x2d\x32\x30\x2e\x30\x39\x20\x33\
+\x31\x2e\x35\x34\x2c\x2d\x32\x30\x2e\x30\x39\x20\x7a\x20\x6d\x20\
+\x32\x30\x2e\x36\x31\x39\x39\x39\x38\x2c\x32\x2e\x37\x35\x20\x63\
+\x20\x2d\x35\x2e\x36\x39\x2c\x2d\x32\x2e\x37\x20\x2d\x31\x32\x2e\
+\x37\x30\x39\x39\x39\x38\x2c\x2d\x34\x2e\x32\x39\x20\x2d\x32\x30\
+\x2e\x33\x30\x39\x39\x39\x38\x2c\x2d\x34\x2e\x32\x39\x20\x2d\x31\
+\x38\x2e\x39\x37\x2c\x30\x20\x2d\x33\x34\x2e\x33\x35\x2c\x39\x2e\
+\x39\x34\x20\x2d\x33\x34\x2e\x33\x35\x2c\x32\x32\x2e\x31\x39\x20\
+\x30\x2c\x33\x2e\x34\x34\x20\x31\x2e\x32\x31\x2c\x36\x2e\x36\x39\
+\x20\x33\x2e\x33\x37\x2c\x39\x2e\x35\x39\x20\x2d\x32\x30\x2e\x36\
+\x37\x2c\x2d\x31\x34\x2e\x31\x36\x20\x2d\x33\x33\x2e\x30\x31\x2c\
+\x2d\x33\x30\x2e\x32\x20\x2d\x33\x38\x2e\x38\x33\x2c\x2d\x34\x32\
+\x2e\x37\x38\x20\x6c\x20\x35\x37\x2e\x32\x2c\x2d\x32\x34\x2e\x37\
+\x37\x39\x39\x39\x38\x20\x63\x20\x37\x2e\x33\x35\x2c\x31\x32\x2e\
+\x32\x32\x20\x31\x38\x2e\x37\x36\x2c\x32\x37\x2e\x30\x34\x39\x39\
+\x39\x38\x20\x33\x32\x2e\x39\x31\x39\x39\x39\x38\x2c\x34\x30\x2e\
+\x30\x36\x39\x39\x39\x38\x20\x7a\x20\x6d\x20\x2d\x32\x33\x2e\x36\
+\x32\x39\x39\x39\x38\x2c\x2d\x30\x2e\x35\x35\x20\x2d\x31\x2e\x34\
+\x35\x2c\x34\x2e\x34\x20\x2d\x34\x2e\x35\x33\x2c\x2d\x30\x2e\x33\
+\x32\x20\x2d\x31\x2e\x30\x33\x2c\x32\x2e\x37\x31\x20\x63\x20\x32\
+\x2e\x37\x35\x2c\x30\x2e\x32\x35\x20\x33\x2e\x39\x36\x2c\x2d\x30\
+\x2e\x30\x36\x20\x33\x2e\x33\x2c\x32\x2e\x30\x36\x20\x6c\x20\x2d\
+\x34\x2e\x32\x37\x2c\x31\x33\x2e\x38\x35\x20\x63\x20\x2d\x30\x2e\
+\x34\x36\x2c\x31\x2e\x34\x38\x20\x2d\x30\x2e\x38\x33\x2c\x31\x2e\
+\x32\x31\x20\x2d\x32\x2e\x37\x38\x2c\x30\x2e\x39\x33\x20\x6c\x20\
+\x2d\x32\x2e\x32\x38\x2c\x2d\x30\x2e\x33\x32\x20\x2d\x31\x2e\x32\
+\x39\x2c\x33\x2e\x38\x38\x20\x34\x2e\x37\x37\x2c\x30\x2e\x38\x20\
+\x2d\x31\x2e\x34\x31\x2c\x34\x2e\x39\x31\x20\x36\x2e\x32\x38\x2c\
+\x31\x2e\x30\x38\x20\x31\x2e\x34\x34\x2c\x2d\x35\x20\x35\x2e\x31\
+\x32\x2c\x30\x2e\x37\x20\x2d\x31\x2e\x32\x38\x2c\x35\x2e\x30\x38\
+\x20\x36\x2e\x31\x32\x2c\x30\x2e\x38\x20\x31\x2e\x32\x32\x2c\x2d\
+\x35\x2e\x31\x37\x20\x63\x20\x31\x2e\x37\x31\x2c\x30\x2e\x31\x32\
+\x20\x31\x2e\x36\x37\x2c\x30\x2e\x30\x32\x20\x32\x2e\x38\x36\x2c\
+\x2d\x30\x2e\x31\x34\x20\x32\x2e\x30\x36\x39\x39\x39\x38\x2c\x2d\
+\x30\x2e\x32\x36\x20\x33\x2e\x37\x38\x39\x39\x39\x38\x2c\x2d\x30\
+\x2e\x38\x35\x20\x35\x2e\x31\x34\x39\x39\x39\x38\x2c\x2d\x31\x2e\
+\x37\x35\x20\x31\x2e\x33\x35\x2c\x2d\x30\x2e\x39\x20\x32\x2e\x33\
+\x2c\x2d\x32\x2e\x34\x34\x20\x32\x2e\x36\x37\x2c\x2d\x33\x2e\x37\
+\x31\x20\x30\x2e\x33\x31\x2c\x2d\x31\x2e\x30\x36\x20\x30\x2e\x31\
+\x35\x2c\x2d\x32\x2e\x34\x39\x20\x2d\x30\x2e\x32\x39\x2c\x2d\x33\
+\x2e\x34\x35\x20\x2d\x30\x2e\x34\x34\x2c\x2d\x30\x2e\x39\x37\x20\
+\x2d\x31\x2e\x31\x38\x2c\x2d\x31\x2e\x37\x38\x20\x2d\x32\x2e\x32\
+\x32\x2c\x2d\x32\x2e\x34\x34\x20\x2d\x30\x2e\x37\x32\x2c\x2d\x30\
+\x2e\x34\x36\x20\x2d\x31\x2e\x38\x2c\x2d\x30\x2e\x39\x36\x20\x2d\
+\x33\x2e\x32\x35\x2c\x2d\x31\x2e\x34\x38\x20\x32\x2e\x35\x32\x2c\
+\x2d\x30\x2e\x32\x31\x20\x34\x2e\x30\x32\x2c\x2d\x30\x2e\x39\x36\
+\x20\x35\x2e\x36\x2c\x2d\x32\x2e\x34\x36\x20\x31\x2e\x36\x31\x2c\
+\x2d\x31\x2e\x35\x33\x20\x31\x2e\x39\x33\x2c\x2d\x33\x2e\x35\x34\
+\x20\x30\x2e\x38\x39\x2c\x2d\x35\x2e\x33\x31\x20\x2d\x31\x2e\x32\
+\x38\x2c\x2d\x32\x2e\x31\x36\x20\x2d\x33\x2e\x39\x31\x2c\x2d\x33\
+\x2e\x31\x37\x20\x2d\x36\x2e\x36\x35\x2c\x2d\x33\x2e\x37\x39\x20\
+\x6c\x20\x31\x2e\x30\x33\x2c\x2d\x34\x2e\x35\x39\x20\x2d\x34\x2e\
+\x30\x36\x39\x39\x39\x38\x2c\x2d\x30\x2e\x34\x20\x2d\x31\x2e\x33\
+\x31\x2c\x34\x2e\x35\x35\x20\x2d\x34\x2e\x37\x31\x2c\x2d\x30\x2e\
+\x34\x38\x20\x31\x2e\x32\x33\x2c\x2d\x34\x2e\x33\x39\x20\x7a\x20\
+\x6d\x20\x31\x2e\x30\x34\x2c\x31\x33\x2e\x39\x38\x20\x31\x2e\x38\
+\x31\x2c\x2d\x36\x2e\x32\x32\x20\x33\x2e\x36\x38\x2c\x30\x2e\x34\
+\x32\x20\x63\x20\x32\x2e\x31\x31\x2c\x30\x2e\x32\x34\x20\x33\x2e\
+\x35\x33\x2c\x30\x2e\x36\x34\x20\x34\x2e\x32\x38\x2c\x30\x2e\x39\
+\x35\x20\x33\x2e\x31\x39\x39\x39\x39\x38\x2c\x31\x2e\x33\x20\x32\
+\x2e\x31\x33\x39\x39\x39\x38\x2c\x35\x2e\x33\x31\x20\x2d\x31\x2e\
+\x39\x32\x2c\x35\x2e\x36\x39\x20\x2d\x30\x2e\x39\x36\x2c\x30\x2e\
+\x30\x39\x20\x2d\x32\x2e\x33\x39\x2c\x2d\x30\x2e\x30\x31\x20\x2d\
+\x34\x2e\x32\x36\x2c\x2d\x30\x2e\x32\x39\x20\x7a\x20\x6d\x20\x2d\
+\x31\x2c\x33\x2e\x34\x36\x20\x34\x2e\x32\x34\x2c\x30\x2e\x36\x35\
+\x20\x63\x20\x31\x2e\x38\x36\x2c\x30\x2e\x32\x38\x20\x33\x2e\x32\
+\x31\x2c\x30\x2e\x36\x32\x20\x34\x2e\x30\x34\x2c\x31\x2e\x30\x31\
+\x20\x30\x2e\x38\x33\x2c\x30\x2e\x33\x39\x20\x31\x2e\x34\x31\x2c\
+\x30\x2e\x38\x36\x20\x31\x2e\x37\x31\x2c\x31\x2e\x34\x32\x20\x30\
+\x2e\x33\x32\x2c\x30\x2e\x35\x36\x20\x30\x2e\x33\x37\x2c\x31\x2e\
+\x32\x20\x30\x2e\x31\x36\x2c\x31\x2e\x39\x31\x20\x2d\x30\x2e\x32\
+\x34\x2c\x30\x2e\x38\x33\x20\x2d\x30\x2e\x37\x36\x2c\x32\x2e\x33\
+\x37\x20\x2d\x31\x2e\x35\x38\x2c\x32\x2e\x38\x37\x20\x2d\x30\x2e\
+\x38\x31\x2c\x30\x2e\x35\x20\x2d\x31\x2e\x37\x2c\x30\x2e\x37\x37\
+\x20\x2d\x32\x2e\x36\x37\x2c\x30\x2e\x38\x32\x20\x2d\x30\x2e\x39\
+\x37\x2c\x30\x2e\x30\x35\x20\x2d\x32\x2e\x31\x35\x2c\x2d\x30\x2e\
+\x30\x37\x20\x2d\x33\x2e\x35\x33\x2c\x2d\x30\x2e\x32\x39\x20\x2d\
+\x30\x2e\x34\x35\x2c\x2d\x30\x2e\x30\x37\x20\x2d\x34\x2e\x35\x33\
+\x2c\x2d\x30\x2e\x36\x36\x20\x2d\x34\x2e\x35\x34\x2c\x2d\x30\x2e\
+\x37\x34\x20\x7a\x20\x6d\x20\x2d\x38\x2e\x39\x38\x2c\x32\x37\x2e\
+\x38\x38\x20\x63\x20\x36\x2e\x34\x39\x2c\x31\x2e\x33\x36\x20\x31\
+\x30\x2e\x33\x2c\x32\x2e\x31\x20\x31\x33\x2e\x38\x36\x2c\x32\x2e\
+\x35\x39\x20\x39\x2e\x38\x33\x39\x39\x39\x38\x2c\x33\x2e\x31\x36\
+\x20\x31\x38\x2e\x34\x33\x39\x39\x39\x38\x2c\x35\x2e\x37\x38\x20\
+\x32\x38\x2e\x32\x33\x39\x39\x39\x38\x2c\x38\x2e\x31\x36\x20\x2d\
+\x31\x33\x2e\x39\x37\x2c\x2d\x32\x2e\x30\x31\x20\x2d\x32\x37\x2e\
+\x37\x37\x39\x39\x39\x38\x2c\x2d\x36\x2e\x32\x34\x20\x2d\x34\x32\
+\x2e\x30\x39\x39\x39\x39\x38\x2c\x2d\x31\x30\x2e\x37\x35\x20\x7a\
+\x20\x6d\x20\x36\x35\x2e\x34\x31\x39\x39\x39\x38\x2c\x34\x2e\x34\
+\x33\x20\x33\x30\x2e\x31\x39\x2c\x2d\x31\x37\x2e\x35\x32\x20\x63\
+\x20\x30\x2e\x33\x39\x2c\x2d\x30\x2e\x33\x32\x20\x30\x2e\x33\x38\
+\x2c\x2d\x30\x2e\x35\x39\x20\x2d\x30\x2e\x33\x33\x2c\x2d\x30\x2e\
+\x37\x20\x2d\x31\x34\x2e\x35\x2c\x2d\x32\x2e\x34\x35\x20\x2d\x32\
+\x39\x2e\x32\x36\x2c\x2d\x37\x2e\x33\x36\x20\x2d\x34\x34\x2e\x36\
+\x36\x2c\x2d\x31\x37\x2e\x39\x33\x20\x2d\x35\x2e\x39\x2c\x2d\x34\
+\x2e\x31\x37\x20\x2d\x32\x30\x2e\x30\x33\x2c\x2d\x31\x36\x2e\x33\
+\x35\x20\x2d\x32\x36\x2e\x38\x35\x2c\x2d\x32\x33\x2e\x37\x34\x20\
+\x2d\x37\x2e\x39\x33\x39\x39\x39\x38\x2c\x2d\x38\x2e\x36\x31\x20\
+\x2d\x31\x34\x2e\x36\x36\x39\x39\x39\x38\x2c\x2d\x31\x38\x2e\x33\
+\x32\x39\x39\x39\x38\x20\x2d\x32\x32\x2e\x33\x33\x39\x39\x39\x38\
+\x2c\x2d\x32\x39\x2e\x31\x33\x39\x39\x39\x38\x20\x2d\x30\x2e\x35\
+\x31\x2c\x2d\x30\x2e\x38\x36\x20\x2d\x30\x2e\x38\x38\x2c\x2d\x31\
+\x2e\x34\x20\x2d\x31\x2e\x33\x33\x2c\x2d\x31\x2e\x36\x31\x20\x2d\
+\x30\x2e\x34\x33\x2c\x2d\x30\x2e\x31\x39\x20\x2d\x30\x2e\x39\x39\
+\x2c\x2d\x30\x2e\x31\x20\x2d\x31\x2e\x38\x39\x2c\x30\x2e\x33\x20\
+\x6c\x20\x2d\x35\x35\x2e\x32\x35\x2c\x32\x32\x2e\x38\x33\x39\x39\
+\x39\x38\x20\x63\x20\x2d\x33\x2e\x34\x35\x2c\x31\x2e\x34\x36\x20\
+\x2d\x33\x2e\x33\x34\x2c\x32\x2e\x35\x32\x20\x2d\x31\x2e\x35\x34\
+\x2c\x35\x2e\x36\x34\x20\x38\x2e\x35\x35\x2c\x31\x38\x2e\x30\x31\
+\x20\x32\x33\x2e\x39\x35\x2c\x33\x33\x2e\x32\x39\x20\x33\x39\x2e\
+\x35\x37\x2c\x34\x33\x2e\x36\x37\x20\x32\x2e\x31\x38\x2c\x34\x2e\
+\x33\x36\x20\x35\x2e\x34\x38\x2c\x38\x2e\x36\x32\x20\x31\x33\x2e\
+\x31\x38\x2c\x31\x31\x2e\x38\x37\x20\x2d\x31\x37\x2e\x33\x31\x2c\
+\x2d\x36\x2e\x31\x39\x20\x2d\x33\x37\x2e\x37\x38\x2c\x2d\x31\x34\
+\x2e\x32\x39\x20\x2d\x36\x30\x2e\x38\x31\x2c\x2d\x32\x35\x2e\x31\
+\x32\x20\x6c\x20\x31\x32\x2e\x30\x33\x2c\x2d\x38\x2e\x38\x33\x20\
+\x2d\x31\x2e\x34\x38\x2c\x2d\x30\x2e\x39\x36\x20\x2d\x31\x31\x2e\
+\x39\x31\x2c\x38\x2e\x37\x38\x20\x63\x20\x2d\x31\x2e\x37\x34\x30\
+\x30\x30\x30\x36\x2c\x31\x2e\x37\x34\x20\x2d\x31\x2e\x31\x32\x30\
+\x30\x30\x30\x36\x2c\x32\x2e\x35\x31\x20\x30\x2e\x32\x2c\x33\x2e\
+\x31\x31\x20\x31\x33\x2e\x37\x31\x2c\x36\x2e\x38\x39\x20\x36\x38\
+\x2e\x32\x38\x2c\x32\x38\x2e\x38\x33\x20\x39\x34\x2e\x34\x31\x39\
+\x39\x39\x38\x2c\x33\x35\x2e\x35\x36\x20\x2d\x31\x38\x2e\x31\x34\
+\x39\x39\x39\x38\x2c\x2d\x33\x2e\x39\x36\x20\x2d\x37\x36\x2e\x31\
+\x35\x39\x39\x39\x38\x2c\x2d\x32\x33\x2e\x38\x31\x20\x2d\x39\x33\
+\x2e\x31\x39\x39\x39\x39\x38\x2c\x2d\x33\x31\x2e\x31\x36\x20\x2d\
+\x31\x2e\x30\x34\x2c\x31\x2e\x33\x33\x20\x2d\x30\x2e\x33\x37\x2c\
+\x32\x2e\x38\x34\x20\x31\x2e\x30\x35\x2c\x33\x2e\x34\x35\x20\x6c\
+\x20\x31\x2e\x33\x33\x2c\x30\x2e\x34\x32\x20\x63\x20\x35\x2e\x34\
+\x34\x2c\x31\x2e\x37\x31\x20\x34\x37\x2e\x39\x34\x2c\x31\x36\x2e\
+\x35\x33\x20\x35\x36\x2e\x32\x39\x2c\x31\x38\x2e\x34\x36\x20\x2d\
+\x39\x2e\x37\x31\x2c\x2d\x31\x2e\x34\x34\x20\x2d\x35\x34\x2e\x37\
+\x36\x2c\x2d\x31\x35\x2e\x32\x38\x20\x2d\x35\x39\x2e\x31\x38\x2c\
+\x2d\x31\x37\x2e\x30\x38\x20\x6c\x20\x30\x2e\x31\x36\x2c\x32\x2e\
+\x33\x35\x20\x36\x32\x2e\x31\x37\x2c\x31\x37\x2e\x36\x39\x20\x36\
+\x2e\x30\x31\x2c\x32\x2e\x32\x37\x20\x2d\x37\x30\x2e\x37\x36\x30\
+\x30\x30\x30\x36\x2c\x2d\x31\x37\x2e\x31\x38\x20\x63\x20\x2d\x33\
+\x2e\x30\x33\x2c\x2d\x30\x2e\x37\x38\x20\x2d\x35\x2c\x2d\x30\x2e\
+\x37\x34\x20\x2d\x32\x2e\x38\x35\x2c\x2d\x34\x2e\x30\x34\x20\x6c\
+\x20\x2d\x33\x2e\x37\x38\x2c\x32\x2e\x39\x38\x20\x63\x20\x2d\x30\
+\x2e\x33\x37\x2c\x30\x2e\x32\x34\x20\x2d\x30\x2e\x33\x36\x2c\x30\
+\x2e\x35\x39\x20\x30\x2e\x30\x39\x2c\x30\x2e\x36\x39\x20\x6c\x20\
+\x38\x31\x2e\x30\x37\x30\x30\x30\x30\x36\x2c\x32\x30\x2e\x30\x34\
+\x20\x33\x2e\x34\x31\x2c\x31\x2e\x35\x31\x20\x2d\x37\x35\x2e\x33\
+\x39\x2c\x2d\x31\x37\x2e\x35\x32\x20\x30\x2e\x30\x35\x2c\x31\x2e\
+\x36\x32\x20\x35\x38\x2e\x33\x38\x2c\x31\x33\x2e\x34\x31\x20\x36\
+\x2e\x30\x36\x2c\x32\x2e\x33\x35\x20\x2d\x36\x34\x2e\x34\x34\x2c\
+\x2d\x31\x33\x2e\x36\x38\x20\x2d\x30\x2e\x30\x33\x2c\x31\x2e\x37\
+\x38\x20\x31\x31\x36\x2e\x38\x30\x39\x39\x39\x38\x2c\x32\x34\x2e\
+\x31\x38\x30\x30\x31\x20\x63\x20\x31\x2e\x36\x35\x2c\x30\x2e\x33\
+\x35\x20\x33\x2e\x38\x39\x2c\x30\x2e\x33\x36\x20\x35\x2e\x34\x39\
+\x2c\x2d\x30\x2e\x39\x20\x6c\x20\x33\x39\x2e\x37\x2c\x2d\x32\x32\
+\x2e\x39\x39\x30\x30\x31\x20\x2d\x31\x32\x2e\x33\x35\x2c\x35\x2e\
+\x33\x20\x31\x32\x2e\x33\x37\x2c\x2d\x37\x2e\x32\x37\x20\x2d\x32\
+\x32\x2e\x32\x34\x2c\x39\x2e\x36\x38\x20\x32\x32\x2e\x31\x38\x2c\
+\x2d\x31\x31\x2e\x38\x35\x20\x2d\x31\x31\x2e\x35\x31\x2c\x34\x2e\
+\x35\x37\x20\x31\x31\x2e\x34\x35\x2c\x2d\x37\x2e\x30\x35\x20\x2d\
+\x31\x38\x2e\x38\x37\x2c\x38\x2e\x37\x32\x20\x31\x38\x2e\x39\x32\
+\x2c\x2d\x31\x31\x2e\x32\x37\x20\x7a\x22\x0a\x20\x20\x20\x69\x64\
+\x3d\x22\x70\x61\x74\x68\x34\x30\x30\x35\x22\x0a\x20\x20\x20\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6e\x6e\x65\x63\x74\x6f\
+\x72\x2d\x63\x75\x72\x76\x61\x74\x75\x72\x65\x3d\x22\x30\x22\x0a\
+\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\x6c\x6c\x3a\x23\
+\x66\x66\x66\x66\x66\x66\x22\x20\x2f\x3e\x0a\x3c\x70\x61\x74\x68\
+\x0a\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\x6c\x6c\x3a\
+\x6e\x6f\x6e\x65\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\
+\x79\x3a\x31\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\
+\x3a\x30\x2e\x33\x33\x32\x30\x32\x35\x35\x39\x3b\x6f\x70\x61\x63\
+\x69\x74\x79\x3a\x30\x2e\x39\x35\x3b\x73\x74\x72\x6f\x6b\x65\x3a\
+\x6e\x6f\x6e\x65\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3a\x6e\
+\x6f\x6e\x7a\x65\x72\x6f\x22\x0a\x20\x20\x20\x64\x3d\x22\x4d\x20\
+\x31\x31\x34\x2e\x33\x35\x38\x36\x37\x2c\x39\x32\x2e\x36\x32\x36\
+\x30\x33\x20\x43\x20\x31\x30\x34\x2e\x32\x31\x39\x32\x31\x2c\x39\
+\x31\x2e\x30\x34\x39\x36\x32\x36\x20\x39\x35\x2e\x37\x30\x34\x38\
+\x32\x35\x2c\x38\x36\x2e\x37\x30\x35\x39\x36\x34\x20\x38\x38\x2e\
+\x34\x31\x38\x33\x33\x35\x2c\x37\x39\x2e\x33\x39\x32\x34\x30\x36\
+\x20\x38\x32\x2e\x38\x37\x32\x35\x34\x35\x2c\x37\x33\x2e\x38\x32\
+\x36\x30\x31\x34\x20\x37\x38\x2e\x38\x39\x31\x32\x38\x38\x2c\x36\
+\x36\x2e\x39\x31\x34\x32\x33\x34\x20\x37\x36\x2e\x38\x39\x30\x32\
+\x30\x32\x2c\x35\x39\x2e\x33\x37\x38\x36\x34\x34\x20\x37\x35\x2e\
+\x38\x39\x30\x37\x37\x2c\x35\x35\x2e\x36\x31\x35\x30\x33\x34\x20\
+\x37\x35\x2e\x38\x35\x30\x32\x39\x36\x2c\x35\x35\x2e\x32\x30\x33\
+\x37\x37\x37\x20\x37\x35\x2e\x38\x33\x35\x31\x34\x38\x2c\x34\x38\
+\x2e\x36\x35\x38\x33\x36\x37\x20\x63\x20\x2d\x30\x2e\x30\x31\x34\
+\x31\x2c\x2d\x36\x2e\x30\x39\x32\x38\x30\x35\x20\x30\x2e\x30\x36\
+\x37\x30\x32\x2c\x2d\x37\x2e\x31\x33\x37\x32\x37\x32\x20\x30\x2e\
+\x37\x37\x33\x35\x39\x38\x2c\x2d\x39\x2e\x39\x36\x30\x37\x36\x38\
+\x20\x33\x2e\x32\x37\x34\x32\x34\x36\x2c\x2d\x31\x33\x2e\x30\x38\
+\x33\x38\x39\x38\x20\x31\x31\x2e\x35\x38\x32\x35\x36\x37\x2c\x2d\
+\x32\x33\x2e\x35\x37\x35\x32\x36\x39\x20\x32\x33\x2e\x34\x34\x39\
+\x36\x31\x34\x2c\x2d\x32\x39\x2e\x36\x31\x31\x31\x30\x37\x32\x20\
+\x34\x2e\x32\x32\x33\x36\x33\x2c\x2d\x32\x2e\x31\x34\x38\x32\x33\
+\x31\x32\x20\x37\x2e\x35\x31\x38\x32\x37\x2c\x2d\x33\x2e\x33\x33\
+\x33\x31\x36\x31\x36\x20\x31\x32\x2e\x30\x33\x38\x31\x36\x2c\x2d\
+\x34\x2e\x33\x32\x39\x35\x37\x30\x37\x20\x34\x2e\x33\x34\x33\x30\
+\x38\x2c\x2d\x30\x2e\x39\x35\x37\x34\x33\x30\x33\x20\x31\x33\x2e\
+\x37\x30\x32\x39\x37\x2c\x2d\x31\x2e\x30\x33\x33\x36\x31\x39\x20\
+\x31\x38\x2e\x31\x32\x34\x35\x31\x2c\x2d\x30\x2e\x31\x34\x37\x35\
+\x33\x31\x39\x20\x31\x33\x2e\x34\x38\x38\x34\x32\x2c\x32\x2e\x37\
+\x30\x33\x31\x31\x36\x37\x20\x32\x35\x2e\x30\x36\x32\x32\x32\x2c\
+\x31\x30\x2e\x38\x38\x30\x35\x34\x31\x38\x20\x33\x31\x2e\x35\x38\
+\x32\x32\x31\x2c\x32\x32\x2e\x33\x31\x34\x32\x38\x36\x38\x20\x39\
+\x2e\x35\x32\x34\x31\x38\x2c\x31\x36\x2e\x37\x30\x32\x30\x35\x33\
+\x20\x36\x2e\x39\x32\x30\x30\x35\x2c\x33\x37\x2e\x36\x36\x30\x30\
+\x34\x20\x2d\x36\x2e\x34\x32\x31\x37\x32\x2c\x35\x31\x2e\x36\x38\
+\x31\x37\x39\x36\x20\x2d\x31\x30\x2e\x36\x31\x33\x30\x33\x2c\x31\
+\x31\x2e\x31\x35\x33\x39\x33\x39\x20\x2d\x32\x35\x2e\x38\x38\x36\
+\x31\x33\x2c\x31\x36\x2e\x33\x37\x33\x38\x39\x32\x20\x2d\x34\x31\
+\x2e\x30\x32\x32\x38\x35\x2c\x31\x34\x2e\x30\x32\x30\x35\x35\x38\
+\x20\x7a\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x34\
+\x39\x37\x32\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x63\x6f\x6e\x6e\x65\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\x61\
+\x74\x75\x72\x65\x3d\x22\x30\x22\x0a\x20\x20\x20\x74\x72\x61\x6e\
+\x73\x66\x6f\x72\x6d\x3d\x22\x74\x72\x61\x6e\x73\x6c\x61\x74\x65\
+\x28\x30\x2c\x34\x35\x2e\x36\x33\x30\x30\x30\x35\x29\x22\x20\x2f\
+\x3e\x3c\x65\x6c\x6c\x69\x70\x73\x65\x0a\x20\x20\x20\x73\x74\x79\
+\x6c\x65\x3d\x22\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\
+\x6c\x6c\x3a\x23\x66\x66\x30\x30\x30\x30\x3b\x66\x69\x6c\x6c\x2d\
+\x6f\x70\x61\x63\x69\x74\x79\x3a\x30\x2e\x38\x36\x36\x36\x36\x36\
+\x36\x37\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3a\x6e\x6f\x6e\
+\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x23\x66\x66\x66\
+\x66\x66\x66\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\
+\x3a\x32\x2e\x34\x37\x32\x39\x32\x38\x35\x32\x3b\x73\x74\x72\x6f\
+\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\x72\x6f\x75\x6e\x64\
+\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\
+\x3a\x72\x6f\x75\x6e\x64\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\
+\x74\x65\x72\x6c\x69\x6d\x69\x74\x3a\x34\x3b\x73\x74\x72\x6f\x6b\
+\x65\x2d\x64\x61\x73\x68\x61\x72\x72\x61\x79\x3a\x6e\x6f\x6e\x65\
+\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\
+\x31\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x35\x35\
+\x31\x39\x22\x0a\x20\x20\x20\x63\x78\x3d\x22\x31\x32\x34\x2e\x31\
+\x37\x37\x35\x37\x22\x0a\x20\x20\x20\x63\x79\x3d\x22\x39\x34\x2e\
+\x36\x33\x30\x32\x31\x39\x22\x0a\x20\x20\x20\x72\x78\x3d\x22\x34\
+\x35\x2e\x30\x31\x33\x35\x33\x35\x22\x0a\x20\x20\x20\x72\x79\x3d\
+\x22\x34\x34\x2e\x30\x31\x37\x34\x36\x22\x20\x2f\x3e\x0a\x3c\x74\
+\x65\x78\x74\x0a\x20\x20\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\
+\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x0a\x20\x20\x20\x73\
+\x74\x79\x6c\x65\x3d\x22\x66\x6f\x6e\x74\x2d\x73\x74\x79\x6c\x65\
+\x3a\x6e\x6f\x72\x6d\x61\x6c\x3b\x66\x6f\x6e\x74\x2d\x77\x65\x69\
+\x67\x68\x74\x3a\x6e\x6f\x72\x6d\x61\x6c\x3b\x66\x6f\x6e\x74\x2d\
+\x73\x69\x7a\x65\x3a\x34\x30\x70\x78\x3b\x6c\x69\x6e\x65\x2d\x68\
+\x65\x69\x67\x68\x74\x3a\x31\x2e\x32\x35\x3b\x66\x6f\x6e\x74\x2d\
+\x66\x61\x6d\x69\x6c\x79\x3a\x27\x2e\x53\x46\x20\x43\x6f\x6d\x70\
+\x61\x63\x74\x20\x52\x6f\x75\x6e\x64\x65\x64\x27\x3b\x6c\x65\x74\
+\x74\x65\x72\x2d\x73\x70\x61\x63\x69\x6e\x67\x3a\x30\x70\x78\x3b\
+\x77\x6f\x72\x64\x2d\x73\x70\x61\x63\x69\x6e\x67\x3a\x30\x70\x78\
+\x3b\x66\x69\x6c\x6c\x3a\x23\x30\x30\x30\x30\x30\x30\x3b\x66\x69\
+\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x73\x74\x72\
+\x6f\x6b\x65\x3a\x6e\x6f\x6e\x65\x3b\x2d\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x2d\x66\x6f\x6e\x74\x2d\x73\x70\x65\x63\x69\x66\x69\x63\
+\x61\x74\x69\x6f\x6e\x3a\x27\x2e\x53\x46\x20\x43\x6f\x6d\x70\x61\
+\x63\x74\x20\x52\x6f\x75\x6e\x64\x65\x64\x27\x3b\x66\x6f\x6e\x74\
+\x2d\x73\x74\x72\x65\x74\x63\x68\x3a\x6e\x6f\x72\x6d\x61\x6c\x3b\
+\x66\x6f\x6e\x74\x2d\x76\x61\x72\x69\x61\x6e\x74\x3a\x6e\x6f\x72\
+\x6d\x61\x6c\x3b\x22\x0a\x20\x20\x20\x78\x3d\x22\x31\x31\x38\x2e\
+\x32\x30\x31\x31\x31\x22\x0a\x20\x20\x20\x79\x3d\x22\x38\x38\x2e\
+\x38\x31\x39\x37\x37\x31\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x74\
+\x65\x78\x74\x32\x34\x22\x3e\x3c\x74\x73\x70\x61\x6e\x0a\x20\x20\
+\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x72\x6f\x6c\x65\
+\x3d\x22\x6c\x69\x6e\x65\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\
+\x22\x74\x73\x70\x61\x6e\x32\x32\x22\x0a\x20\x20\x20\x20\x20\x78\
+\x3d\x22\x31\x31\x38\x2e\x32\x30\x31\x31\x31\x22\x0a\x20\x20\x20\
+\x20\x20\x79\x3d\x22\x31\x32\x34\x2e\x32\x31\x30\x34\x22\x20\x2f\
+\x3e\x3c\x2f\x74\x65\x78\x74\x3e\x0a\x3c\x74\x65\x78\x74\x0a\x20\
+\x20\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\
+\x73\x65\x72\x76\x65\x22\x0a\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\
+\x22\x66\x6f\x6e\x74\x2d\x73\x74\x79\x6c\x65\x3a\x6e\x6f\x72\x6d\
+\x61\x6c\x3b\x66\x6f\x6e\x74\x2d\x77\x65\x69\x67\x68\x74\x3a\x6e\
+\x6f\x72\x6d\x61\x6c\x3b\x66\x6f\x6e\x74\x2d\x73\x69\x7a\x65\x3a\
+\x34\x30\x70\x78\x3b\x6c\x69\x6e\x65\x2d\x68\x65\x69\x67\x68\x74\
+\x3a\x31\x2e\x32\x35\x3b\x66\x6f\x6e\x74\x2d\x66\x61\x6d\x69\x6c\
+\x79\x3a\x73\x61\x6e\x73\x2d\x73\x65\x72\x69\x66\x3b\x6c\x65\x74\
+\x74\x65\x72\x2d\x73\x70\x61\x63\x69\x6e\x67\x3a\x30\x70\x78\x3b\
+\x77\x6f\x72\x64\x2d\x73\x70\x61\x63\x69\x6e\x67\x3a\x30\x70\x78\
+\x3b\x66\x69\x6c\x6c\x3a\x23\x30\x30\x30\x30\x30\x30\x3b\x66\x69\
+\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x73\x74\x72\
+\x6f\x6b\x65\x3a\x6e\x6f\x6e\x65\x22\x0a\x20\x20\x20\x78\x3d\x22\
+\x31\x31\x36\x2e\x32\x30\x38\x39\x36\x22\x0a\x20\x20\x20\x79\x3d\
+\x22\x31\x30\x31\x2e\x37\x36\x38\x37\x37\x22\x0a\x20\x20\x20\x69\
+\x64\x3d\x22\x74\x65\x78\x74\x32\x38\x22\x3e\x3c\x74\x73\x70\x61\
+\x6e\x0a\x20\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\
+\x72\x6f\x6c\x65\x3d\x22\x6c\x69\x6e\x65\x22\x0a\x20\x20\x20\x20\
+\x20\x69\x64\x3d\x22\x74\x73\x70\x61\x6e\x32\x36\x22\x0a\x20\x20\
+\x20\x20\x20\x78\x3d\x22\x31\x31\x36\x2e\x32\x30\x38\x39\x36\x22\
+\x0a\x20\x20\x20\x20\x20\x79\x3d\x22\x31\x33\x37\x2e\x31\x35\x39\
+\x33\x39\x22\x20\x2f\x3e\x3c\x2f\x74\x65\x78\x74\x3e\x0a\x3c\x74\
+\x65\x78\x74\x0a\x20\x20\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\
+\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x0a\x20\x20\x20\x73\
+\x74\x79\x6c\x65\x3d\x22\x66\x6f\x6e\x74\x2d\x73\x74\x79\x6c\x65\
+\x3a\x6e\x6f\x72\x6d\x61\x6c\x3b\x66\x6f\x6e\x74\x2d\x77\x65\x69\
+\x67\x68\x74\x3a\x6e\x6f\x72\x6d\x61\x6c\x3b\x66\x6f\x6e\x74\x2d\
+\x73\x69\x7a\x65\x3a\x34\x30\x70\x78\x3b\x6c\x69\x6e\x65\x2d\x68\
+\x65\x69\x67\x68\x74\x3a\x31\x2e\x32\x35\x3b\x66\x6f\x6e\x74\x2d\
+\x66\x61\x6d\x69\x6c\x79\x3a\x73\x61\x6e\x73\x2d\x73\x65\x72\x69\
+\x66\x3b\x6c\x65\x74\x74\x65\x72\x2d\x73\x70\x61\x63\x69\x6e\x67\
+\x3a\x30\x70\x78\x3b\x77\x6f\x72\x64\x2d\x73\x70\x61\x63\x69\x6e\
+\x67\x3a\x30\x70\x78\x3b\x66\x69\x6c\x6c\x3a\x23\x66\x66\x66\x66\
+\x66\x66\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\
+\x31\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x6e\x6f\x6e\x65\x3b\x22\x0a\
+\x20\x20\x20\x78\x3d\x22\x31\x31\x32\x2e\x35\x35\x36\x36\x38\x22\
+\x0a\x20\x20\x20\x79\x3d\x22\x39\x36\x2e\x34\x35\x36\x33\x36\x22\
+\x0a\x20\x20\x20\x69\x64\x3d\x22\x74\x65\x78\x74\x33\x32\x22\x3e\
+\x3c\x74\x73\x70\x61\x6e\x0a\x20\x20\x20\x20\x20\x73\x6f\x64\x69\
+\x70\x6f\x64\x69\x3a\x72\x6f\x6c\x65\x3d\x22\x6c\x69\x6e\x65\x22\
+\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x74\x73\x70\x61\x6e\x33\
+\x30\x22\x0a\x20\x20\x20\x20\x20\x78\x3d\x22\x31\x31\x32\x2e\x35\
+\x35\x36\x36\x38\x22\x0a\x20\x20\x20\x20\x20\x79\x3d\x22\x31\x33\
+\x31\x2e\x38\x34\x36\x39\x38\x22\x20\x2f\x3e\x3c\x2f\x74\x65\x78\
+\x74\x3e\x0a\x3c\x74\x65\x78\x74\x0a\x20\x20\x20\x78\x6d\x6c\x3a\
+\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\
+\x0a\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x6f\x6e\x74\x2d\
+\x73\x74\x79\x6c\x65\x3a\x6e\x6f\x72\x6d\x61\x6c\x3b\x66\x6f\x6e\
+\x74\x2d\x77\x65\x69\x67\x68\x74\x3a\x6e\x6f\x72\x6d\x61\x6c\x3b\
+\x66\x6f\x6e\x74\x2d\x73\x69\x7a\x65\x3a\x34\x30\x70\x78\x3b\x6c\
+\x69\x6e\x65\x2d\x68\x65\x69\x67\x68\x74\x3a\x31\x2e\x32\x35\x3b\
+\x66\x6f\x6e\x74\x2d\x66\x61\x6d\x69\x6c\x79\x3a\x73\x61\x6e\x73\
+\x2d\x73\x65\x72\x69\x66\x3b\x6c\x65\x74\x74\x65\x72\x2d\x73\x70\
+\x61\x63\x69\x6e\x67\x3a\x30\x70\x78\x3b\x77\x6f\x72\x64\x2d\x73\
+\x70\x61\x63\x69\x6e\x67\x3a\x30\x70\x78\x3b\x66\x69\x6c\x6c\x3a\
+\x23\x30\x30\x30\x30\x30\x30\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\
+\x63\x69\x74\x79\x3a\x31\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x6e\x6f\
+\x6e\x65\x22\x0a\x20\x20\x20\x78\x3d\x22\x31\x32\x34\x2e\x31\x37\
+\x37\x35\x37\x22\x0a\x20\x20\x20\x79\x3d\x22\x31\x32\x30\x2e\x30\
+\x33\x30\x31\x37\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x74\x65\x78\
+\x74\x38\x34\x31\x22\x3e\x3c\x74\x73\x70\x61\x6e\x0a\x20\x20\x20\
+\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x72\x6f\x6c\x65\x3d\
+\x22\x6c\x69\x6e\x65\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\
+\x74\x73\x70\x61\x6e\x38\x33\x39\x22\x0a\x20\x20\x20\x20\x20\x78\
+\x3d\x22\x31\x32\x34\x2e\x31\x37\x37\x35\x37\x22\x0a\x20\x20\x20\
+\x20\x20\x79\x3d\x22\x31\x35\x35\x2e\x34\x32\x30\x38\x31\x22\x3e\
+\x3c\x2f\x74\x73\x70\x61\x6e\x3e\x3c\x2f\x74\x65\x78\x74\x3e\x0a\
+\x3c\x74\x65\x78\x74\x0a\x20\x20\x20\x78\x6d\x6c\x3a\x73\x70\x61\
+\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x0a\x20\x20\
+\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x6f\x6e\x74\x2d\x73\x74\x79\
+\x6c\x65\x3a\x6e\x6f\x72\x6d\x61\x6c\x3b\x66\x6f\x6e\x74\x2d\x77\
+\x65\x69\x67\x68\x74\x3a\x6e\x6f\x72\x6d\x61\x6c\x3b\x66\x6f\x6e\
+\x74\x2d\x73\x69\x7a\x65\x3a\x39\x36\x70\x78\x3b\x6c\x69\x6e\x65\
+\x2d\x68\x65\x69\x67\x68\x74\x3a\x31\x2e\x32\x35\x3b\x66\x6f\x6e\
+\x74\x2d\x66\x61\x6d\x69\x6c\x79\x3a\x73\x61\x6e\x73\x2d\x73\x65\
+\x72\x69\x66\x3b\x6c\x65\x74\x74\x65\x72\x2d\x73\x70\x61\x63\x69\
+\x6e\x67\x3a\x30\x70\x78\x3b\x77\x6f\x72\x64\x2d\x73\x70\x61\x63\
+\x69\x6e\x67\x3a\x30\x70\x78\x3b\x66\x69\x6c\x6c\x3a\x23\x30\x30\
+\x30\x30\x30\x30\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\
+\x79\x3a\x31\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x6e\x6f\x6e\x65\x3b\
+\x22\x0a\x20\x20\x20\x78\x3d\x22\x31\x30\x39\x2e\x39\x30\x30\x34\
+\x37\x22\x0a\x20\x20\x20\x79\x3d\x22\x31\x30\x31\x2e\x34\x33\x36\
+\x37\x34\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x74\x65\x78\x74\x38\
+\x34\x35\x22\x3e\x3c\x74\x73\x70\x61\x6e\x0a\x20\x20\x20\x20\x20\
+\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x72\x6f\x6c\x65\x3d\x22\x6c\
+\x69\x6e\x65\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x74\x73\
+\x70\x61\x6e\x38\x34\x33\x22\x0a\x20\x20\x20\x20\x20\x78\x3d\x22\
+\x31\x30\x39\x2e\x39\x30\x30\x34\x37\x22\x0a\x20\x20\x20\x20\x20\
+\x79\x3d\x22\x31\x34\x38\x2e\x36\x32\x34\x32\x34\x22\x20\x2f\x3e\
+\x3c\x2f\x74\x65\x78\x74\x3e\x0a\x3c\x74\x65\x78\x74\x0a\x20\x20\
+\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\
+\x65\x72\x76\x65\x22\x0a\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\
+\x66\x6f\x6e\x74\x2d\x73\x74\x79\x6c\x65\x3a\x6e\x6f\x72\x6d\x61\
+\x6c\x3b\x66\x6f\x6e\x74\x2d\x77\x65\x69\x67\x68\x74\x3a\x6e\x6f\
+\x72\x6d\x61\x6c\x3b\x66\x6f\x6e\x74\x2d\x73\x69\x7a\x65\x3a\x38\
+\x35\x2e\x33\x33\x33\x33\x33\x33\x33\x33\x70\x78\x3b\x6c\x69\x6e\
+\x65\x2d\x68\x65\x69\x67\x68\x74\x3a\x31\x2e\x32\x35\x3b\x66\x6f\
+\x6e\x74\x2d\x66\x61\x6d\x69\x6c\x79\x3a\x73\x61\x6e\x73\x2d\x73\
+\x65\x72\x69\x66\x3b\x6c\x65\x74\x74\x65\x72\x2d\x73\x70\x61\x63\
+\x69\x6e\x67\x3a\x30\x70\x78\x3b\x77\x6f\x72\x64\x2d\x73\x70\x61\
+\x63\x69\x6e\x67\x3a\x30\x70\x78\x3b\x66\x69\x6c\x6c\x3a\x23\x30\
+\x30\x30\x30\x30\x30\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\
+\x74\x79\x3a\x31\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x6e\x6f\x6e\x65\
+\x3b\x22\x0a\x20\x20\x20\x78\x3d\x22\x31\x31\x31\x2e\x30\x32\x33\
+\x36\x36\x22\x0a\x20\x20\x20\x79\x3d\x22\x31\x31\x39\x2e\x38\x37\
+\x35\x39\x39\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x74\x65\x78\x74\
+\x38\x34\x39\x22\x3e\x3c\x74\x73\x70\x61\x6e\x0a\x20\x20\x20\x20\
+\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x72\x6f\x6c\x65\x3d\x22\
+\x6c\x69\x6e\x65\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x74\
+\x73\x70\x61\x6e\x38\x34\x37\x22\x0a\x20\x20\x20\x20\x20\x78\x3d\
+\x22\x31\x31\x31\x2e\x30\x32\x33\x36\x36\x22\x0a\x20\x20\x20\x20\
+\x20\x79\x3d\x22\x31\x36\x37\x2e\x30\x36\x33\x34\x39\x22\x20\x2f\
+\x3e\x3c\x2f\x74\x65\x78\x74\x3e\x0a\x3c\x74\x65\x78\x74\x0a\x20\
+\x20\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\
+\x73\x65\x72\x76\x65\x22\x0a\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\
+\x22\x66\x6f\x6e\x74\x2d\x73\x74\x79\x6c\x65\x3a\x6e\x6f\x72\x6d\
+\x61\x6c\x3b\x66\x6f\x6e\x74\x2d\x77\x65\x69\x67\x68\x74\x3a\x6e\
+\x6f\x72\x6d\x61\x6c\x3b\x66\x6f\x6e\x74\x2d\x73\x69\x7a\x65\x3a\
+\x38\x35\x2e\x33\x33\x33\x33\x33\x35\x38\x38\x70\x78\x3b\x6c\x69\
+\x6e\x65\x2d\x68\x65\x69\x67\x68\x74\x3a\x31\x2e\x32\x35\x3b\x66\
+\x6f\x6e\x74\x2d\x66\x61\x6d\x69\x6c\x79\x3a\x73\x61\x6e\x73\x2d\
+\x73\x65\x72\x69\x66\x3b\x6c\x65\x74\x74\x65\x72\x2d\x73\x70\x61\
+\x63\x69\x6e\x67\x3a\x30\x70\x78\x3b\x77\x6f\x72\x64\x2d\x73\x70\
+\x61\x63\x69\x6e\x67\x3a\x30\x70\x78\x3b\x66\x69\x6c\x6c\x3a\x23\
+\x30\x30\x30\x30\x30\x30\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\
+\x69\x74\x79\x3a\x31\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x6e\x6f\x6e\
+\x65\x22\x0a\x20\x20\x20\x78\x3d\x22\x31\x32\x33\x2e\x35\x31\x33\
+\x35\x32\x22\x0a\x20\x20\x20\x79\x3d\x22\x31\x31\x38\x2e\x37\x30\
+\x32\x30\x37\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x74\x65\x78\x74\
+\x38\x35\x33\x22\x3e\x3c\x74\x73\x70\x61\x6e\x0a\x20\x20\x20\x20\
+\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x72\x6f\x6c\x65\x3d\x22\
+\x6c\x69\x6e\x65\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x74\
+\x73\x70\x61\x6e\x38\x35\x31\x22\x0a\x20\x20\x20\x20\x20\x78\x3d\
+\x22\x31\x32\x33\x2e\x35\x31\x33\x35\x32\x22\x0a\x20\x20\x20\x20\
+\x20\x79\x3d\x22\x31\x39\x34\x2e\x32\x30\x32\x30\x37\x22\x20\x2f\
+\x3e\x3c\x2f\x74\x65\x78\x74\x3e\x0a\x3c\x74\x65\x78\x74\x0a\x20\
+\x20\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\
+\x73\x65\x72\x76\x65\x22\x0a\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\
+\x22\x66\x6f\x6e\x74\x2d\x73\x74\x79\x6c\x65\x3a\x6e\x6f\x72\x6d\
+\x61\x6c\x3b\x66\x6f\x6e\x74\x2d\x77\x65\x69\x67\x68\x74\x3a\x6e\
+\x6f\x72\x6d\x61\x6c\x3b\x66\x6f\x6e\x74\x2d\x73\x69\x7a\x65\x3a\
+\x38\x35\x2e\x33\x33\x33\x33\x33\x35\x38\x38\x70\x78\x3b\x66\x6f\
+\x6e\x74\x2d\x66\x61\x6d\x69\x6c\x79\x3a\x73\x61\x6e\x73\x2d\x73\
+\x65\x72\x69\x66\x3b\x6c\x65\x74\x74\x65\x72\x2d\x73\x70\x61\x63\
+\x69\x6e\x67\x3a\x30\x70\x78\x3b\x77\x6f\x72\x64\x2d\x73\x70\x61\
+\x63\x69\x6e\x67\x3a\x30\x70\x78\x3b\x66\x69\x6c\x6c\x3a\x23\x30\
+\x30\x30\x30\x30\x30\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\
+\x74\x79\x3a\x31\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x6e\x6f\x6e\x65\
+\x22\x0a\x20\x20\x20\x78\x3d\x22\x31\x31\x35\x2e\x38\x37\x36\x39\
+\x33\x22\x0a\x20\x20\x20\x79\x3d\x22\x31\x33\x32\x2e\x33\x31\x35\
+\x31\x32\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x74\x65\x78\x74\x38\
+\x35\x37\x22\x3e\x3c\x74\x73\x70\x61\x6e\x0a\x20\x20\x20\x20\x20\
+\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x72\x6f\x6c\x65\x3d\x22\x6c\
+\x69\x6e\x65\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x74\x73\
+\x70\x61\x6e\x38\x35\x35\x22\x0a\x20\x20\x20\x20\x20\x78\x3d\x22\
+\x31\x31\x35\x2e\x38\x37\x36\x39\x33\x22\x0a\x20\x20\x20\x20\x20\
+\x79\x3d\x22\x32\x30\x37\x2e\x38\x31\x35\x31\x32\x22\x20\x2f\x3e\
+\x3c\x2f\x74\x65\x78\x74\x3e\x0a\x3c\x74\x65\x78\x74\x0a\x20\x20\
+\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\
+\x65\x72\x76\x65\x22\x0a\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\
+\x66\x6f\x6e\x74\x2d\x73\x74\x79\x6c\x65\x3a\x6e\x6f\x72\x6d\x61\
+\x6c\x3b\x66\x6f\x6e\x74\x2d\x77\x65\x69\x67\x68\x74\x3a\x6e\x6f\
+\x72\x6d\x61\x6c\x3b\x66\x6f\x6e\x74\x2d\x73\x69\x7a\x65\x3a\x38\
+\x35\x2e\x33\x33\x33\x33\x33\x35\x38\x38\x70\x78\x3b\x6c\x69\x6e\
+\x65\x2d\x68\x65\x69\x67\x68\x74\x3a\x31\x2e\x32\x35\x3b\x66\x6f\
+\x6e\x74\x2d\x66\x61\x6d\x69\x6c\x79\x3a\x73\x61\x6e\x73\x2d\x73\
+\x65\x72\x69\x66\x3b\x6c\x65\x74\x74\x65\x72\x2d\x73\x70\x61\x63\
+\x69\x6e\x67\x3a\x30\x70\x78\x3b\x77\x6f\x72\x64\x2d\x73\x70\x61\
+\x63\x69\x6e\x67\x3a\x30\x70\x78\x3b\x66\x69\x6c\x6c\x3a\x23\x30\
+\x30\x30\x30\x30\x30\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\
+\x74\x79\x3a\x31\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x6e\x6f\x6e\x65\
+\x22\x0a\x20\x20\x20\x78\x3d\x22\x31\x31\x34\x2e\x33\x35\x38\x36\
+\x37\x22\x0a\x20\x20\x20\x79\x3d\x22\x31\x33\x38\x2e\x32\x35\x36\
+\x30\x34\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x74\x65\x78\x74\x38\
+\x36\x31\x22\x3e\x3c\x74\x73\x70\x61\x6e\x0a\x20\x20\x20\x20\x20\
+\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x72\x6f\x6c\x65\x3d\x22\x6c\
+\x69\x6e\x65\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x74\x73\
+\x70\x61\x6e\x38\x35\x39\x22\x0a\x20\x20\x20\x20\x20\x78\x3d\x22\
+\x31\x31\x34\x2e\x33\x35\x38\x36\x37\x22\x0a\x20\x20\x20\x20\x20\
+\x79\x3d\x22\x32\x31\x33\x2e\x37\x35\x36\x30\x34\x22\x20\x2f\x3e\
+\x3c\x2f\x74\x65\x78\x74\x3e\x0a\x3c\x74\x65\x78\x74\x0a\x20\x20\
+\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\
+\x65\x72\x76\x65\x22\x0a\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\
+\x66\x6f\x6e\x74\x2d\x73\x74\x79\x6c\x65\x3a\x6e\x6f\x72\x6d\x61\
+\x6c\x3b\x66\x6f\x6e\x74\x2d\x77\x65\x69\x67\x68\x74\x3a\x6e\x6f\
+\x72\x6d\x61\x6c\x3b\x66\x6f\x6e\x74\x2d\x73\x69\x7a\x65\x3a\x38\
+\x35\x2e\x33\x33\x33\x33\x33\x35\x38\x38\x70\x78\x3b\x6c\x69\x6e\
+\x65\x2d\x68\x65\x69\x67\x68\x74\x3a\x31\x2e\x32\x35\x3b\x66\x6f\
+\x6e\x74\x2d\x66\x61\x6d\x69\x6c\x79\x3a\x73\x61\x6e\x73\x2d\x73\
+\x65\x72\x69\x66\x3b\x6c\x65\x74\x74\x65\x72\x2d\x73\x70\x61\x63\
+\x69\x6e\x67\x3a\x30\x70\x78\x3b\x77\x6f\x72\x64\x2d\x73\x70\x61\
+\x63\x69\x6e\x67\x3a\x30\x70\x78\x3b\x66\x69\x6c\x6c\x3a\x23\x30\
+\x30\x30\x30\x30\x30\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\
+\x74\x79\x3a\x31\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x6e\x6f\x6e\x65\
+\x22\x0a\x20\x20\x20\x78\x3d\x22\x31\x30\x39\x2e\x39\x30\x30\x34\
+\x37\x22\x0a\x20\x20\x20\x79\x3d\x22\x31\x31\x32\x2e\x30\x36\x31\
+\x35\x36\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x74\x65\x78\x74\x38\
+\x36\x35\x22\x3e\x3c\x74\x73\x70\x61\x6e\x0a\x20\x20\x20\x20\x20\
+\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x72\x6f\x6c\x65\x3d\x22\x6c\
+\x69\x6e\x65\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x74\x73\
+\x70\x61\x6e\x38\x36\x33\x22\x0a\x20\x20\x20\x20\x20\x78\x3d\x22\
+\x31\x30\x39\x2e\x39\x30\x30\x34\x37\x22\x0a\x20\x20\x20\x20\x20\
+\x79\x3d\x22\x31\x38\x37\x2e\x35\x36\x31\x35\x37\x22\x20\x2f\x3e\
+\x3c\x2f\x74\x65\x78\x74\x3e\x0a\x3c\x74\x65\x78\x74\x0a\x20\x20\
+\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\
+\x65\x72\x76\x65\x22\x0a\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\
+\x66\x6f\x6e\x74\x2d\x73\x74\x79\x6c\x65\x3a\x6e\x6f\x72\x6d\x61\
+\x6c\x3b\x66\x6f\x6e\x74\x2d\x77\x65\x69\x67\x68\x74\x3a\x6e\x6f\
+\x72\x6d\x61\x6c\x3b\x66\x6f\x6e\x74\x2d\x73\x69\x7a\x65\x3a\x38\
+\x35\x2e\x33\x33\x33\x33\x33\x35\x38\x38\x70\x78\x3b\x6c\x69\x6e\
+\x65\x2d\x68\x65\x69\x67\x68\x74\x3a\x31\x2e\x32\x35\x3b\x66\x6f\
+\x6e\x74\x2d\x66\x61\x6d\x69\x6c\x79\x3a\x73\x61\x6e\x73\x2d\x73\
+\x65\x72\x69\x66\x3b\x6c\x65\x74\x74\x65\x72\x2d\x73\x70\x61\x63\
+\x69\x6e\x67\x3a\x30\x70\x78\x3b\x77\x6f\x72\x64\x2d\x73\x70\x61\
+\x63\x69\x6e\x67\x3a\x30\x70\x78\x3b\x66\x69\x6c\x6c\x3a\x23\x66\
+\x66\x66\x66\x66\x66\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\
+\x74\x79\x3a\x31\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x6e\x6f\x6e\x65\
+\x22\x0a\x20\x20\x20\x78\x3d\x22\x31\x31\x30\x2e\x35\x36\x30\x33\
+\x38\x22\x0a\x20\x20\x20\x79\x3d\x22\x31\x32\x37\x2e\x31\x38\x34\
+\x39\x31\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x74\x65\x78\x74\x38\
+\x36\x39\x22\x3e\x3c\x74\x73\x70\x61\x6e\x0a\x20\x20\x20\x20\x20\
+\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x72\x6f\x6c\x65\x3d\x22\x6c\
+\x69\x6e\x65\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x74\x73\
+\x70\x61\x6e\x38\x36\x37\x22\x0a\x20\x20\x20\x20\x20\x78\x3d\x22\
+\x31\x31\x30\x2e\x35\x36\x30\x33\x38\x22\x0a\x20\x20\x20\x20\x20\
+\x79\x3d\x22\x31\x32\x37\x2e\x31\x38\x34\x39\x31\x22\x0a\x20\x20\
+\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x6f\x6e\x74\x2d\x73\
+\x74\x79\x6c\x65\x3a\x6e\x6f\x72\x6d\x61\x6c\x3b\x66\x6f\x6e\x74\
+\x2d\x76\x61\x72\x69\x61\x6e\x74\x3a\x6e\x6f\x72\x6d\x61\x6c\x3b\
+\x66\x6f\x6e\x74\x2d\x77\x65\x69\x67\x68\x74\x3a\x62\x6f\x6c\x64\
+\x3b\x66\x6f\x6e\x74\x2d\x73\x74\x72\x65\x74\x63\x68\x3a\x6e\x6f\
+\x72\x6d\x61\x6c\x3b\x66\x6f\x6e\x74\x2d\x73\x69\x7a\x65\x3a\x39\
+\x36\x70\x78\x3b\x66\x6f\x6e\x74\x2d\x66\x61\x6d\x69\x6c\x79\x3a\
+\x27\x2e\x53\x46\x20\x43\x6f\x6d\x70\x61\x63\x74\x20\x52\x6f\x75\
+\x6e\x64\x65\x64\x27\x3b\x2d\x69\x6e\x6b\x73\x63\x61\x70\x65\x2d\
+\x66\x6f\x6e\x74\x2d\x73\x70\x65\x63\x69\x66\x69\x63\x61\x74\x69\
+\x6f\x6e\x3a\x27\x2e\x53\x46\x20\x43\x6f\x6d\x70\x61\x63\x74\x20\
+\x52\x6f\x75\x6e\x64\x65\x64\x20\x42\x6f\x6c\x64\x27\x22\x3e\x21\
+\x3c\x2f\x74\x73\x70\x61\x6e\x3e\x3c\x2f\x74\x65\x78\x74\x3e\x0a\
+\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
+\x00\x00\x1e\x4a\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x6c\x00\x00\x00\x6c\x08\x03\x00\x00\x00\xb8\xb8\xa7\xff\
+\x00\x00\x01\x83\x69\x43\x43\x50\x49\x43\x43\x20\x70\x72\x6f\x66\
+\x69\x6c\x65\x00\x00\x78\x9c\x7d\x91\x3d\x48\xc3\x40\x1c\xc5\x5f\
+\x53\x4b\x8b\x54\x1d\xcc\x20\xe2\x90\xa1\x3a\xd9\x45\x45\x1d\x6b\
+\x15\x8a\x50\x21\xd4\x0a\xad\x3a\x98\x8f\x7e\x41\x93\x86\x24\xc5\
+\xc5\x51\x70\x2d\x38\xf8\xb1\x58\x75\x70\x71\xd6\xd5\xc1\x55\x10\
+\x04\x3f\x40\x5c\x5d\x9c\x14\x5d\xa4\xc4\xff\x25\x85\x16\x31\x1e\
+\x1c\xf7\xe3\xdd\xbd\xc7\xdd\x3b\x80\x6b\x56\x15\xcd\xea\x49\x00\
+\x9a\x6e\x9b\x99\x54\x52\xc8\xe5\x57\x85\xf0\x2b\x42\x88\x80\x47\
+\x3f\x66\x24\xc5\x32\xe6\x44\x31\x0d\xdf\xf1\x75\x8f\x00\x5b\xef\
+\xe2\x2c\xcb\xff\xdc\x9f\xa3\x4f\x2d\x58\x0a\x10\x10\x88\x13\x8a\
+\x61\xda\xc4\x1b\xc4\xd3\x9b\xb6\xc1\x78\x9f\x98\x57\xca\x92\x4a\
+\x7c\x4e\x3c\x6e\xd2\x05\x89\x1f\x99\x2e\x7b\xfc\xc6\xb8\xe4\x32\
+\xc7\x32\x79\x33\x9b\x99\x27\xe6\x89\x85\x52\x17\xcb\x5d\xac\x94\
+\x4d\x8d\x78\x8a\x38\xa6\x6a\x3a\xe5\x73\x39\x8f\x55\xc6\x5b\x8c\
+\xb5\x6a\x5d\x69\xdf\x93\xbd\x30\x5a\xd0\x57\x96\x99\x4e\x73\x04\
+\x29\x2c\x62\x09\x22\x04\xc8\xa8\xa3\x82\x2a\x6c\xc4\x69\xd5\x49\
+\xb1\x90\xa1\xfd\xa4\x8f\x7f\xd8\xf5\x8b\xe4\x92\xc9\x55\x81\x42\
+\x8e\x05\xd4\xa0\x41\x72\xfd\x60\x7f\xf0\xbb\x5b\xab\x38\x39\xe1\
+\x25\x45\x93\x40\xe8\xc5\x71\x3e\x46\x81\xf0\x2e\xd0\x6a\x38\xce\
+\xf7\xb1\xe3\xb4\x4e\x80\xe0\x33\x70\xa5\x77\xfc\xb5\x26\x30\xfb\
+\x49\x7a\xa3\xa3\xc5\x8e\x80\x81\x6d\xe0\xe2\xba\xa3\xc9\x7b\xc0\
+\xe5\x0e\x30\xf4\x64\x48\xa6\xe4\x4a\x41\x9a\x5c\xb1\x08\xbc\x9f\
+\xd1\x37\xe5\x81\xc1\x5b\xa0\x77\xcd\xeb\xad\xbd\x8f\xd3\x07\x20\
+\x4b\x5d\xa5\x6f\x80\x83\x43\x60\xac\x44\xd9\xeb\x3e\xef\x8e\x74\
+\xf7\xf6\xef\x99\x76\x7f\x3f\x99\xb6\x72\xb6\xa6\x56\x3e\x3a\x00\
+\x00\x0d\x7a\x69\x54\x58\x74\x58\x4d\x4c\x3a\x63\x6f\x6d\x2e\x61\
+\x64\x6f\x62\x65\x2e\x78\x6d\x70\x00\x00\x00\x00\x00\x3c\x3f\x78\
+\x70\x61\x63\x6b\x65\x74\x20\x62\x65\x67\x69\x6e\x3d\x22\xef\xbb\
+\xbf\x22\x20\x69\x64\x3d\x22\x57\x35\x4d\x30\x4d\x70\x43\x65\x68\
+\x69\x48\x7a\x72\x65\x53\x7a\x4e\x54\x63\x7a\x6b\x63\x39\x64\x22\
+\x3f\x3e\x0a\x3c\x78\x3a\x78\x6d\x70\x6d\x65\x74\x61\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x3d\x22\x61\x64\x6f\x62\x65\x3a\x6e\x73\x3a\
+\x6d\x65\x74\x61\x2f\x22\x20\x78\x3a\x78\x6d\x70\x74\x6b\x3d\x22\
+\x58\x4d\x50\x20\x43\x6f\x72\x65\x20\x34\x2e\x34\x2e\x30\x2d\x45\
+\x78\x69\x76\x32\x22\x3e\x0a\x20\x3c\x72\x64\x66\x3a\x52\x44\x46\
+\x20\x78\x6d\x6c\x6e\x73\x3a\x72\x64\x66\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\
+\x39\x39\x2f\x30\x32\x2f\x32\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\
+\x74\x61\x78\x2d\x6e\x73\x23\x22\x3e\x0a\x20\x20\x3c\x72\x64\x66\
+\x3a\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x20\x72\x64\x66\
+\x3a\x61\x62\x6f\x75\x74\x3d\x22\x22\x0a\x20\x20\x20\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6d\x70\x4d\x4d\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x6e\x73\x2e\x61\x64\x6f\x62\x65\x2e\x63\x6f\x6d\x2f\x78\
+\x61\x70\x2f\x31\x2e\x30\x2f\x6d\x6d\x2f\x22\x0a\x20\x20\x20\x20\
+\x78\x6d\x6c\x6e\x73\x3a\x73\x74\x45\x76\x74\x3d\x22\x68\x74\x74\
+\x70\x3a\x2f\x2f\x6e\x73\x2e\x61\x64\x6f\x62\x65\x2e\x63\x6f\x6d\
+\x2f\x78\x61\x70\x2f\x31\x2e\x30\x2f\x73\x54\x79\x70\x65\x2f\x52\
+\x65\x73\x6f\x75\x72\x63\x65\x45\x76\x65\x6e\x74\x23\x22\x0a\x20\
+\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x47\x49\x4d\x50\x3d\x22\x68\
+\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x67\x69\x6d\x70\x2e\x6f\
+\x72\x67\x2f\x78\x6d\x70\x2f\x22\x0a\x20\x20\x20\x20\x78\x6d\x6c\
+\x6e\x73\x3a\x64\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\
+\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\x6e\
+\x74\x73\x2f\x31\x2e\x31\x2f\x22\x0a\x20\x20\x20\x20\x78\x6d\x6c\
+\x6e\x73\x3a\x74\x69\x66\x66\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\
+\x6e\x73\x2e\x61\x64\x6f\x62\x65\x2e\x63\x6f\x6d\x2f\x74\x69\x66\
+\x66\x2f\x31\x2e\x30\x2f\x22\x0a\x20\x20\x20\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x78\x6d\x70\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x6e\x73\
+\x2e\x61\x64\x6f\x62\x65\x2e\x63\x6f\x6d\x2f\x78\x61\x70\x2f\x31\
+\x2e\x30\x2f\x22\x0a\x20\x20\x20\x78\x6d\x70\x4d\x4d\x3a\x44\x6f\
+\x63\x75\x6d\x65\x6e\x74\x49\x44\x3d\x22\x67\x69\x6d\x70\x3a\x64\
+\x6f\x63\x69\x64\x3a\x67\x69\x6d\x70\x3a\x66\x31\x39\x34\x32\x61\
+\x62\x62\x2d\x30\x36\x30\x66\x2d\x34\x33\x37\x37\x2d\x39\x63\x34\
+\x36\x2d\x62\x66\x31\x65\x31\x62\x64\x64\x66\x34\x33\x30\x22\x0a\
+\x20\x20\x20\x78\x6d\x70\x4d\x4d\x3a\x49\x6e\x73\x74\x61\x6e\x63\
+\x65\x49\x44\x3d\x22\x78\x6d\x70\x2e\x69\x69\x64\x3a\x62\x63\x66\
+\x33\x34\x31\x37\x36\x2d\x66\x66\x36\x36\x2d\x34\x35\x35\x34\x2d\
+\x38\x66\x38\x34\x2d\x34\x34\x66\x35\x31\x33\x35\x65\x30\x30\x61\
+\x32\x22\x0a\x20\x20\x20\x78\x6d\x70\x4d\x4d\x3a\x4f\x72\x69\x67\
+\x69\x6e\x61\x6c\x44\x6f\x63\x75\x6d\x65\x6e\x74\x49\x44\x3d\x22\
+\x78\x6d\x70\x2e\x64\x69\x64\x3a\x61\x30\x33\x65\x31\x37\x61\x37\
+\x2d\x61\x61\x32\x66\x2d\x34\x37\x32\x33\x2d\x38\x37\x63\x65\x2d\
+\x35\x30\x39\x37\x63\x31\x64\x39\x37\x66\x32\x34\x22\x0a\x20\x20\
+\x20\x47\x49\x4d\x50\x3a\x41\x50\x49\x3d\x22\x32\x2e\x30\x22\x0a\
+\x20\x20\x20\x47\x49\x4d\x50\x3a\x50\x6c\x61\x74\x66\x6f\x72\x6d\
+\x3d\x22\x4d\x61\x63\x20\x4f\x53\x22\x0a\x20\x20\x20\x47\x49\x4d\
+\x50\x3a\x54\x69\x6d\x65\x53\x74\x61\x6d\x70\x3d\x22\x31\x36\x38\
+\x33\x35\x37\x37\x30\x32\x35\x38\x36\x39\x32\x30\x39\x22\x0a\x20\
+\x20\x20\x47\x49\x4d\x50\x3a\x56\x65\x72\x73\x69\x6f\x6e\x3d\x22\
+\x32\x2e\x31\x30\x2e\x33\x34\x22\x0a\x20\x20\x20\x64\x63\x3a\x46\
+\x6f\x72\x6d\x61\x74\x3d\x22\x69\x6d\x61\x67\x65\x2f\x70\x6e\x67\
+\x22\x0a\x20\x20\x20\x74\x69\x66\x66\x3a\x4f\x72\x69\x65\x6e\x74\
+\x61\x74\x69\x6f\x6e\x3d\x22\x31\x22\x0a\x20\x20\x20\x78\x6d\x70\
+\x3a\x43\x72\x65\x61\x74\x6f\x72\x54\x6f\x6f\x6c\x3d\x22\x47\x49\
+\x4d\x50\x20\x32\x2e\x31\x30\x22\x0a\x20\x20\x20\x78\x6d\x70\x3a\
+\x4d\x65\x74\x61\x64\x61\x74\x61\x44\x61\x74\x65\x3d\x22\x32\x30\
+\x32\x33\x3a\x30\x35\x3a\x30\x38\x54\x31\x35\x3a\x31\x36\x3a\x34\
+\x37\x2d\x30\x35\x3a\x30\x30\x22\x0a\x20\x20\x20\x78\x6d\x70\x3a\
+\x4d\x6f\x64\x69\x66\x79\x44\x61\x74\x65\x3d\x22\x32\x30\x32\x33\
+\x3a\x30\x35\x3a\x30\x38\x54\x31\x35\x3a\x31\x36\x3a\x34\x37\x2d\
+\x30\x35\x3a\x30\x30\x22\x3e\x0a\x20\x20\x20\x3c\x78\x6d\x70\x4d\
+\x4d\x3a\x48\x69\x73\x74\x6f\x72\x79\x3e\x0a\x20\x20\x20\x20\x3c\
+\x72\x64\x66\x3a\x53\x65\x71\x3e\x0a\x20\x20\x20\x20\x20\x3c\x72\
+\x64\x66\x3a\x6c\x69\x0a\x20\x20\x20\x20\x20\x20\x73\x74\x45\x76\
+\x74\x3a\x61\x63\x74\x69\x6f\x6e\x3d\x22\x73\x61\x76\x65\x64\x22\
+\x0a\x20\x20\x20\x20\x20\x20\x73\x74\x45\x76\x74\x3a\x63\x68\x61\
+\x6e\x67\x65\x64\x3d\x22\x2f\x22\x0a\x20\x20\x20\x20\x20\x20\x73\
+\x74\x45\x76\x74\x3a\x69\x6e\x73\x74\x61\x6e\x63\x65\x49\x44\x3d\
+\x22\x78\x6d\x70\x2e\x69\x69\x64\x3a\x39\x62\x66\x65\x35\x32\x36\
+\x32\x2d\x33\x35\x39\x32\x2d\x34\x38\x64\x34\x2d\x39\x37\x32\x31\
+\x2d\x35\x66\x33\x37\x65\x63\x34\x32\x62\x37\x62\x65\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x73\x74\x45\x76\x74\x3a\x73\x6f\x66\x74\x77\
+\x61\x72\x65\x41\x67\x65\x6e\x74\x3d\x22\x47\x69\x6d\x70\x20\x32\
+\x2e\x31\x30\x20\x28\x4d\x61\x63\x20\x4f\x53\x29\x22\x0a\x20\x20\
+\x20\x20\x20\x20\x73\x74\x45\x76\x74\x3a\x77\x68\x65\x6e\x3d\x22\
+\x32\x30\x32\x33\x2d\x30\x35\x2d\x30\x38\x54\x31\x35\x3a\x31\x37\
+\x3a\x30\x35\x2d\x30\x35\x3a\x30\x30\x22\x2f\x3e\x0a\x20\x20\x20\
+\x20\x3c\x2f\x72\x64\x66\x3a\x53\x65\x71\x3e\x0a\x20\x20\x20\x3c\
+\x2f\x78\x6d\x70\x4d\x4d\x3a\x48\x69\x73\x74\x6f\x72\x79\x3e\x0a\
+\x20\x20\x3c\x2f\x72\x64\x66\x3a\x44\x65\x73\x63\x72\x69\x70\x74\
+\x69\x6f\x6e\x3e\x0a\x20\x3c\x2f\x72\x64\x66\x3a\x52\x44\x46\x3e\
+\x0a\x3c\x2f\x78\x3a\x78\x6d\x70\x6d\x65\x74\x61\x3e\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x3c\x3f\
+\x78\x70\x61\x63\x6b\x65\x74\x20\x65\x6e\x64\x3d\x22\x77\x22\x3f\
+\x3e\x56\x84\x15\x6a\x00\x00\x03\x00\x50\x4c\x54\x45\x4c\x69\x71\
+\x1c\x1c\x1c\x5f\x5f\x5f\x3d\x3d\x3d\xcd\xcd\xcd\x7c\x7c\x7c\x65\
+\x65\x65\x00\x00\x00\x01\x01\x01\x00\x00\x00\x4a\x4a\x4a\x00\x00\
+\x00\x1a\x1a\x1a\x11\x11\x11\x54\x54\x54\x00\x30\x27\x00\x2e\x25\
+\x00\x2c\x23\x00\x00\x00\x00\x38\x2d\x00\x25\x1e\x00\x3a\x2f\x00\
+\x33\x29\x00\x3c\x30\x00\x23\x1c\x00\x3e\x32\x00\x28\x20\x00\x40\
+\x34\x00\x42\x35\x00\x44\x37\xc2\xc2\x00\x00\x36\x2c\x00\x2a\x22\
+\x00\x20\x1a\xae\xae\x00\x00\x49\x3b\x00\x35\x2b\x00\x52\x42\x00\
+\x4b\x3d\x00\x47\x39\xab\xab\x00\x00\x1e\x18\x00\x4d\x3e\x00\x4f\
+\x40\x00\x46\x39\xa9\xa9\x00\xc4\xc4\x00\xc0\xc0\x00\x00\x15\x11\
+\xc7\xc7\x00\x00\x1c\x16\x00\x55\x45\x00\x12\x0f\x00\x58\x48\x00\
+\x17\x13\x72\x85\x82\x60\x83\x7c\x00\x5d\x4b\xbe\xbd\x00\x3f\x77\
+\x6c\x00\x1b\x16\xad\xad\x00\x6f\x85\x81\x6c\x85\x80\xca\xc9\x00\
+\xd3\xd3\x78\x00\x19\x14\x64\x84\x7e\x93\x93\x00\x5b\x83\x7c\xd6\
+\xd6\x82\x76\x84\x81\x00\x0e\x0b\x63\x7e\x79\x9c\x9b\x00\x9f\x9f\
+\x00\x68\x84\x7f\x56\x83\x7a\x54\x7e\x76\xa6\xa6\x00\x2a\x46\x41\
+\x6f\x80\x7d\x33\x67\x5e\x00\x00\x01\x2f\x63\x59\xd6\xd6\x7d\x49\
+\x68\x62\x5b\x7b\x75\x5c\x7f\x78\x62\x7a\x76\x6a\x80\x7c\x44\x71\
+\x68\x74\x81\x7f\x42\x6b\x63\xc8\xc8\x10\x84\x84\x00\x20\x46\x3f\
+\x96\x96\x00\x8a\x8a\x00\x87\x87\x00\x8d\x8d\x00\x2d\x51\x4a\x28\
+\x57\x4e\x4c\x80\x76\x28\x40\x3c\x54\x74\x6e\x25\x52\x49\x56\x78\
+\x72\x00\x61\x4f\x17\x37\x31\x1a\x3d\x37\xce\xcd\x00\xa2\xa2\x00\
+\x30\x56\x4f\x39\x6b\x62\x38\x62\x5a\x50\x83\x79\x44\x65\x5f\x1d\
+\x37\x32\x65\x81\x7c\xba\xba\x00\x21\x4c\x44\x81\x81\x00\x3e\x70\
+\x67\x37\x57\x51\x2a\x5c\x53\x29\x4c\x45\x3c\x66\x5e\x4d\x72\x6b\
+\x31\x4a\x45\x21\x3d\x38\x4c\x6d\x67\x50\x7b\x73\xe6\xe5\x00\x79\
+\x85\x83\x00\x00\x11\x1e\x42\x3b\x1e\x30\x2d\xd3\xd3\x7f\x5b\x76\
+\x71\xb2\xb2\x00\xd1\xd1\x46\x38\x71\x66\x40\x61\x5b\xd8\xd6\x00\
+\xc8\xc8\x19\xb6\xb6\x00\x7a\x83\x81\x6a\x7c\x78\x3d\x5c\x57\xea\
+\xe9\x05\x36\x5b\x57\x4d\x78\x70\x36\x50\x4b\xef\xef\x00\xb5\xb5\
+\x65\x30\x5c\x54\xfe\xfe\x00\x90\x90\x00\xcd\xcd\x7b\xcb\xcb\x17\
+\xc5\xc5\x17\x00\x0a\x08\xe0\xe0\x00\xc5\xc5\x1e\xc7\xc7\x75\xd2\
+\xd2\x00\x54\x58\x03\x23\x35\x32\x16\x30\x2b\xca\xca\x57\xf7\xf7\
+\x00\xd9\xd9\x85\xd3\xd3\x52\xc2\xc2\x5c\x28\x3a\x37\x7d\x84\x83\
+\xfc\xfc\x3f\xdc\xdc\x4d\x52\x6f\x69\xcc\xcc\x47\xdc\xdb\x00\x1d\
+\x29\x27\x75\x86\x83\x82\x83\x83\x7c\x7d\x7e\xc2\xc1\x70\x4a\x4c\
+\x01\xb0\xb0\x2e\x01\x0f\x21\xbb\xbb\x60\xf3\xf3\x43\xe4\xe3\x49\
+\xb5\xb5\x2a\xc0\xc0\x23\xeb\xea\x47\x15\x28\x24\xba\xba\x27\x88\
+\x88\x88\x0d\x0d\x0d\xab\xab\x32\x00\x23\x2d\xc3\xc3\x12\xc5\xc5\
+\x11\x02\x18\x28\xb8\xb8\x6a\x13\x13\x13\xbd\xbd\x6d\xa0\xa0\x3c\
+\x65\x74\x72\x5c\x6e\x6c\xa3\xa3\x38\x5b\x62\x07\xd5\xd5\x47\xa7\
+\xa7\x35\x98\x99\x01\x53\x67\x63\x49\x5e\x5b\x20\x21\x22\xa6\xa7\
+\x7f\x52\x52\x54\x76\x79\x78\x40\x55\x52\x5d\x5d\x5e\x2a\x2a\x2d\
+\x19\x19\x19\x47\x47\x49\xe2\xe2\x7e\x6f\x72\x7f\x66\x66\x68\x34\
+\x34\x35\x69\x6b\x1c\x3e\x3e\x3e\x6f\x6f\x6f\x3f\x41\x01\x93\x98\
+\x4d\x8d\x90\x61\x75\x81\x0a\x6a\x6d\x34\xdd\xdc\x18\x2b\x34\x4b\
+\x95\x95\x95\x2f\x4d\x17\x68\x72\x07\x3f\x57\x13\x11\x36\x1d\x97\
+\x99\x73\x20\x40\x19\x59\x6f\x10\x61\x89\x82\x4a\x63\x13\xb7\xba\
+\x46\xd1\xd0\x26\x79\x89\x52\x0d\x3d\x34\x63\x79\x58\x90\x1f\x38\
+\xe0\x00\x00\x00\x01\x74\x52\x4e\x53\x00\x40\xe6\xd8\x66\x00\x00\
+\x00\x01\x62\x4b\x47\x44\x00\x88\x05\x1d\x48\x00\x00\x00\x09\x70\
+\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\x00\x9a\x9c\x18\
+\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xe7\x05\x08\x14\x11\x05\xf2\
+\x5d\xfa\x36\x00\x00\x0b\xae\x49\x44\x41\x54\x68\xde\xcd\xd8\x7b\
+\x50\x53\x57\x1e\x07\x70\xba\x3b\xed\x1f\x3b\xeb\x02\x23\xf2\x0c\
+\xcf\x14\x84\x04\x41\x44\xac\x45\x6a\x29\x46\xe9\x12\x31\xca\x58\
+\x7c\xa0\x1b\x48\xa2\x82\x2e\x18\xd1\x2a\xc6\xfa\x00\x4b\x87\x6a\
+\x7c\x57\xab\x68\x01\xc7\x27\x50\x69\xab\xd0\xf5\xc1\x08\x3e\xd7\
+\xa1\x23\x52\xc9\x1a\x5c\xb6\xdd\x76\x67\x76\x6f\x2b\xdc\xec\x34\
+\x22\x9d\x09\x4b\xdc\xdf\xef\x9c\x7b\x6f\x42\x79\x88\x92\x30\xfd\
+\xfe\xa1\x24\x32\xf3\xf1\x77\xee\x39\xe7\xfe\xce\x71\x71\xf9\xb5\
+\xe7\xf6\x4f\x3f\xdd\x1e\x35\xab\xbd\xbc\xbc\xfd\xf6\xa8\x59\x9f\
+\x7e\x5a\xde\x7d\x7b\xb4\xac\x59\xb3\x66\x8d\x8a\xc6\x59\xb3\x76\
+\x94\x77\x5f\x74\xba\xd5\x5d\x8e\x12\xe6\x54\xf7\xa5\x51\xb1\xda\
+\xdb\xcb\x77\xec\x28\x77\xb2\xc6\x5b\x17\x3f\x87\x09\x59\x5e\x7e\
+\xd9\x99\x1a\xb1\x76\xec\x68\xff\x1c\xc2\x69\x2f\x3b\xd3\x7a\x87\
+\x5a\x07\x0e\x1c\x68\x3f\x55\x7e\xea\xd4\xbd\x8b\xdf\x38\xc7\xba\
+\xd8\x5d\xfe\x0e\xb5\x3e\xf8\xe0\x00\xd1\x4e\x39\x4d\x13\xac\x0f\
+\x30\xc9\xc9\x4b\x96\xa0\x76\xf9\xee\xcb\x3f\x3a\xcb\x2a\xa7\x56\
+\x72\x32\x62\x4b\xba\x2f\x43\x9c\xa0\x5d\x42\xeb\xad\xf2\x76\x9e\
+\x42\x6b\xde\xbc\xee\x7b\x97\xef\xdd\x73\xb8\x86\xd6\x5b\x76\xd6\
+\x12\x62\xa1\x06\x39\xfa\xcd\x8f\xce\xb0\x0e\x24\xff\x05\x93\xfc\
+\x1a\xa5\xe6\xcd\xfb\xa8\xfb\xee\xbd\xbb\x77\x8f\x7e\xf3\x6f\x87\
+\x5a\x6f\xa1\x95\x4c\xac\xd7\x30\xd4\x5a\xfc\x11\x68\x80\x39\x50\
+\xbb\xd4\x7d\x8a\x5a\xbc\x34\x7d\xfa\x74\x42\x2d\x06\xec\xa3\xee\
+\xa3\x18\x47\x69\xcd\xbd\x82\xc5\x53\xd3\x29\x45\xb0\xaf\x3b\x89\
+\xf6\xe3\x2b\x0e\xc1\xce\xc8\x6b\x88\xf5\x9a\x40\xbd\xf9\xe6\x9b\
+\x8b\x79\x6b\xd1\x22\xa2\x5d\x3d\xda\xfb\x8a\x43\xac\x37\xde\xa8\
+\xe1\x2d\x8e\xe2\xac\x3f\x42\x16\x11\xed\xea\x55\xd0\x7e\xe3\x08\
+\x2b\x3c\x5c\xd1\xb9\x84\x93\x08\x35\x7b\xf6\xec\xc5\x8b\x37\x6c\
+\xd8\xc0\x63\x5f\x77\x02\x56\x33\x72\x8d\x5a\x8f\xbf\x6c\x9b\x6e\
+\x4f\xcd\x9e\xbd\xc1\x66\x2d\x5a\xb4\xf3\x7e\xe7\xd5\x9a\x9a\x9a\
+\xab\xbd\xff\x74\x84\xf5\xbd\x77\x65\x1b\x95\xec\x2c\x01\xdb\xb9\
+\x93\x6a\x55\x23\xd3\x38\xeb\xa6\x87\xaf\x6f\x65\x9b\x8d\x9a\x31\
+\x83\xb7\x00\x5b\xb0\x60\x27\xd1\x00\x03\xed\x0f\x0e\xb0\x82\xdc\
+\xdd\x2b\xdb\x66\xf3\x14\x62\x53\xa7\x02\xb5\x70\xe1\x82\x05\x1c\
+\x06\x5a\x55\x55\x55\xcd\x0b\x6b\x36\xcb\xdd\xdd\xcd\xcd\x2d\xb7\
+\x8d\xa7\x66\x4c\x25\x59\xb8\xd0\x86\xe5\xdc\xbf\xd0\x59\x55\x75\
+\xee\x5c\xd5\x0b\x6a\x76\x16\x50\xae\xae\x9e\xb9\xe9\x33\x66\x0c\
+\x60\xad\x5a\xb5\x6a\x67\x4e\x4e\xce\x85\xb6\x0e\xc0\x5e\x50\x13\
+\xac\x20\x77\x42\x41\xac\xe9\xbf\xb0\x78\x2c\x07\x31\xd0\xce\x9d\
+\x3b\x7f\xbe\xb6\xf7\x1f\x0e\xb0\x5e\x0d\x0c\xb4\xa6\x53\x68\xea\
+\xcc\x99\x33\x79\x4c\xb0\x88\x76\x1e\xb5\xdf\x8d\xc0\xe2\xa8\xb1\
+\x10\xeb\x52\x8e\xa2\xda\x9c\x39\x73\x56\xd9\xb0\xed\x6d\x6d\x1d\
+\xe7\xcf\x37\x36\xee\x7a\x4e\xad\x9f\x15\x08\xd6\xb8\x71\x5e\x5e\
+\xd6\xa5\x33\xf9\xa4\xa6\xce\x99\x43\x35\xb0\xb6\x6d\xbb\xb0\x7d\
+\xfb\xf6\x74\xd0\x1a\x1b\x1b\xff\xd6\xfb\xaf\x11\x58\xa4\x2c\xa0\
+\xbc\x7c\x7c\x78\x2d\x95\xb3\xde\x87\x1c\x06\x6b\xdb\x76\xc4\xd2\
+\x1f\x76\x34\x36\xde\xb8\xf1\x3c\x5a\xdf\xe7\x45\x2d\x4a\xf9\xf9\
+\x89\x88\x96\x9a\xca\x61\xc4\x3a\x7c\x98\x62\xe9\xe9\xe9\xef\x3e\
+\x6c\x01\xac\xe1\xfc\xb0\xb5\x3e\x73\xfe\xc9\x13\xf4\x02\xc7\x11\
+\x4a\x84\xb1\x2e\x4d\x4d\xe5\x31\xc1\xa2\x75\x21\xf6\xb0\xe5\x46\
+\x43\x43\x43\x63\xef\x0f\xcf\x6f\x99\x19\x96\x65\x99\xae\x9f\x3d\
+\xc7\x79\x11\xcb\xdf\xdf\x3f\x52\x4c\xb4\x75\xeb\xd6\x11\x0c\xa9\
+\xfb\xbd\x1d\x3d\x3d\x3d\x1d\xbd\x80\xbd\xbb\xe7\x61\xcf\x8d\x86\
+\x2f\xbe\x18\x9e\xc6\xef\xbd\xc4\x72\x75\x7d\xf2\xb3\x85\xd5\x94\
+\x29\x19\x73\xa0\x17\x52\x91\xe3\xc7\x8b\xc5\x61\x4b\xd7\x91\xac\
+\x58\xb1\x02\xb0\x6d\x20\xed\xaa\xed\xe9\x7c\x8a\x14\x60\x7b\xbe\
+\xed\x01\xac\xa1\xc7\xf4\xc3\xf0\xf7\x79\x5f\x7e\x22\x7a\xba\x9a\
+\x81\x53\x33\x66\x2f\x51\x24\x48\x18\x49\x3e\x67\xad\x78\xff\xf0\
+\xd3\xa3\xb5\x40\xf5\xa6\x2f\x85\x10\x6b\xcf\x41\xd0\x1a\x6a\x5b\
+\x5b\x4c\xbf\x1d\xb6\xe5\x4b\x27\x07\x59\x5e\x9e\x5d\xac\x46\xc5\
+\x5a\xac\xfe\x00\x85\x85\x49\x24\x12\x69\x3e\x57\x58\x4e\x67\xcf\
+\xae\x5d\x3d\xbd\xdb\x33\x32\x32\x08\x86\xd6\xc1\x6f\xbf\x6d\xe9\
+\x69\x6d\x69\x79\x96\x26\x58\x1e\xa4\x30\x32\x11\x71\x1e\x8e\x35\
+\xb3\x2a\xb5\x92\xc9\x8b\x44\x09\x13\x9a\x4f\xea\xca\xe9\xa8\x05\
+\xeb\x69\x46\x46\x1f\x0c\x34\x53\x4b\x4b\x2b\xd4\xf6\x9f\x61\x58\
+\xc1\x1e\x76\x85\xc1\x3c\xf4\xf3\xf3\x59\xcf\xa8\x95\xa0\x89\x25\
+\x52\xa9\x34\x14\x83\x1a\x58\xb5\xbb\x7a\x2e\xf0\xd6\xd2\xad\x5b\
+\x89\x75\xf0\xbd\x23\x47\x4c\x80\x3d\x18\x4a\xb3\x59\x42\x61\xb8\
+\xc0\x7c\x7c\x60\x6a\x88\x8a\x18\xa5\x4e\xc7\x58\x25\xa1\x5c\x62\
+\xf3\x57\x1c\x26\xd6\xd3\x8c\x69\x60\x6d\x22\xd6\xd6\x3d\x6b\xd1\
+\x7a\x0f\xb5\xd6\x07\x0f\x86\xd0\x78\x2b\xc2\xdb\xae\x30\x5c\x60\
+\x7e\x22\xff\xc8\x48\x91\x99\xd5\x29\x95\x16\x71\x68\x2c\x9f\xb4\
+\x4e\xce\x9a\x36\x2d\x63\xd3\xa6\x4d\x68\x6d\x5d\xbb\xf6\xe0\xc7\
+\xef\x11\xac\x10\xb4\x3b\x77\x5a\x07\xd1\x38\xab\x39\x22\x98\x62\
+\x30\x15\xc9\x13\xc3\xf5\xe5\x0f\xd3\x50\xd4\xa5\x53\xab\x94\x85\
+\xd2\xd8\xd8\xb8\xb8\x38\xb0\xa4\x96\x7a\x98\x87\x9d\x68\x4d\x03\
+\x2b\x3f\x9f\x58\x6b\x3f\xfe\x98\x58\x47\x0a\x0b\x4d\x80\xd5\x0f\
+\xac\xf1\xd6\x24\xb0\xf8\x51\xa4\x4f\x0c\xac\x48\x98\x85\x62\x2b\
+\xa3\xd2\x94\x31\x62\xb4\x90\x13\xcb\xe2\xff\xb7\xab\x87\xb7\x08\
+\x46\x2c\xc0\xd6\x10\xac\xd0\x74\xa7\xbe\xbe\xfe\x81\xe9\xbb\x41\
+\xad\x04\x5a\x58\x90\x30\x8a\x5c\x61\x30\x0d\xc5\x5d\xaa\x32\x59\
+\x59\x57\x68\xdc\xeb\x90\xb8\x50\xd3\xfe\xe8\x80\xda\xde\x69\x42\
+\x61\xf9\x42\x61\x6b\xd6\x1c\x59\x06\xd6\xdc\xb9\xa8\x5d\xbb\xd3\
+\x4f\xe3\xad\xa4\x88\xe0\xfe\xa3\x48\x0a\x93\x48\x25\x56\x56\x96\
+\x95\xc2\x48\x5e\x27\x91\x68\xa2\x03\xa2\xae\xad\xa5\xd8\xee\xdd\
+\x88\x11\xeb\x18\x58\xcb\x96\x11\x2c\x3b\xdb\x54\x7f\xed\x5a\x3f\
+\x8d\xb7\xa6\x24\xf4\xc1\xf8\x51\x84\x27\x06\x0b\x39\x54\xcc\x64\
+\xa5\xa4\xc8\xb6\xd0\xca\x0a\x43\x02\xa2\x62\x58\x49\x1a\x58\xbb\
+\x77\x23\x96\x96\x86\xd8\xb1\x63\x6b\x10\x23\x85\x65\x67\x7f\x06\
+\xda\xad\x5b\xf5\xcc\xdf\x07\xb0\x26\x26\x4d\x82\x51\xf4\xb6\x3d\
+\x32\x6e\xde\xe3\x28\xc2\xea\x92\x16\xca\x52\xe4\x72\x53\xdc\x9f\
+\x21\x71\xa6\xf8\xa8\xc4\x28\x93\x34\x76\x3e\xd6\x05\x58\x1a\x62\
+\xbc\xb5\x6c\xcb\x96\xb9\x04\xfb\xcc\x04\x58\x1f\x4d\xb0\xa6\x10\
+\xcc\xa3\x0f\x26\x8c\x62\x68\x6c\x68\x89\x46\xae\x50\x98\x62\x11\
+\x8b\x65\xa3\x12\x57\x37\xcd\x85\x2f\xe7\xf3\x85\xa5\xcd\x9f\x7f\
+\x8c\xc3\x38\x0b\x30\xd4\xae\x5f\xbf\x26\x68\x9c\x35\x66\xf2\xc4\
+\x29\x09\x83\x62\x61\xb8\x75\xf8\xb3\x0a\x45\x38\x2b\x81\x71\x8c\
+\x93\x18\x13\x57\x9f\xbe\x66\x85\x2f\xa5\xf3\x05\x6b\x7e\xbf\xc2\
+\x3e\x3b\x7b\x96\x05\x4c\xd0\x6c\xd6\x60\x98\xbf\xbf\xc8\x2f\xaf\
+\x64\x6e\x61\x57\x97\x5a\x11\x1e\x22\x67\x4c\x18\xfd\xea\xd3\xa7\
+\xf5\xf0\xb7\xa5\x70\xee\xf2\xb4\x34\xde\xda\xbc\x66\x39\xb1\xb6\
+\x70\x85\x9d\x3d\xfb\xe1\x77\xec\xf5\xeb\x27\x4f\xde\x62\x5e\x02\
+\xeb\x0a\x67\xbd\x0d\x58\xd2\xc0\x98\xc8\x02\xaf\x50\x95\xcc\x98\
+\x22\x07\x4b\xbf\x7f\x7f\x41\x3c\xcc\x0d\xb0\xf6\xee\xdd\x5b\x57\
+\x57\xf7\xdf\x8a\x8a\x9e\x8e\xad\x74\x10\x37\x6f\x5e\xbe\xdc\x66\
+\x15\x81\x75\xf6\x43\xd0\x4e\x9e\x3c\xb9\xef\x96\x01\xb1\x94\xf0\
+\xf0\x09\xcf\xc6\x94\x1a\x99\x51\xae\x9d\x00\x56\x01\xb1\x60\x10\
+\x51\xa2\xd8\xad\x8e\xb5\xa4\x30\xb4\x96\x2f\x5b\x89\x58\x66\x76\
+\x51\x51\x11\xb1\xbe\x44\x6c\x5f\xc5\x75\xc4\x40\x9b\xa0\x50\x68\
+\x87\x35\x8c\x96\x32\xb0\x14\x64\x14\x4d\x4d\x60\x35\x31\x38\x8c\
+\xd9\x56\x51\xe4\x72\xb0\x36\x13\x6b\x25\xb5\x32\xc1\x2a\x5a\x0f\
+\x16\x16\xb6\x0f\x2c\xe6\x7b\xf2\xd0\xae\x18\x01\x93\x0f\x6b\x82\
+\xc8\x60\x08\x8d\x52\x9c\x20\xd2\xfa\xba\xba\x13\x4d\x38\x41\x24\
+\x61\x61\xf0\x4e\x5d\xc9\x61\x2b\x01\xdb\x98\x99\x99\x59\x82\xd6\
+\xfa\xf5\xbc\xd5\xc4\x59\xa0\x65\x69\xb5\xf2\x94\xc7\x63\x9e\x39\
+\xf5\x33\xb5\x05\xf1\xd1\x2c\x5d\x67\x2d\x75\x27\x8a\x2b\x0a\xe1\
+\x4b\xd0\xc4\xe2\x48\xff\x95\xbc\xb5\x71\x23\x60\x25\x25\x83\x58\
+\xa0\xc9\xe4\xf2\x14\x23\x68\xcf\x58\xd4\x16\x7d\x7c\x74\x3c\xbf\
+\xa8\xeb\x8a\x8b\x4f\x98\xf0\x5b\xc0\xc6\xfb\x8b\x44\x1b\xe9\x20\
+\xf6\xb5\x3e\x64\x8f\x1f\xef\x6b\x81\x56\x96\x92\x92\x92\xf5\xec\
+\xed\xaa\x20\x3a\x40\x5f\x48\xb7\xab\x23\x15\xc5\x87\x4a\x5b\xc3\
+\xc0\x92\x88\x09\xe6\xb7\x91\x2b\x2c\x93\x60\x79\x82\xb5\xaf\xaf\
+\x05\x9a\x26\xc5\x98\x25\x33\x0c\xbd\x11\x97\x68\xa3\x03\x62\x5a\
+\xa5\x74\x23\x96\xd6\x1f\x2a\x2d\xad\xc8\x94\x70\xa3\x28\xf2\xf3\
+\xf1\xd9\x68\xb3\xf2\xf2\x48\x61\x9c\xd5\xfc\x8b\x6d\xff\x8a\x2a\
+\x2b\x2b\xab\xcc\x30\xe4\x2b\xc6\x54\x10\x10\x15\x6d\x82\xf7\x19\
+\x14\x06\xaf\x98\xe2\xd2\xea\x52\x13\x94\x4c\x47\xd1\xcf\xc7\xcb\
+\x2b\x93\x1f\x44\xb4\x72\x2b\x07\xb3\x40\x53\x67\xc9\x64\x1a\xc3\
+\x10\x2f\xcf\x3c\x79\x40\x54\xe2\x03\xe1\xe5\x69\xbd\x55\x5d\xfd\
+\xc9\xf1\x3c\x31\x2d\x4c\x04\xd6\xd8\xb1\x25\xbc\x95\x47\xac\xa6\
+\xe3\xc7\x2b\x06\xb2\x5c\x5c\x1e\xa9\x65\x65\x65\x2a\xc3\xe0\x6d\
+\x01\x03\xfb\x7c\x93\x05\xda\x02\xda\x17\x48\x4d\x87\x3e\x29\x0d\
+\xb1\x88\xc4\x7c\x61\xe3\xc6\x06\x06\xe6\x71\x56\x2e\x67\xfd\x69\
+\x60\x0b\x34\x65\x99\x46\xa3\x06\x6d\xa0\x86\x67\xbc\xc8\xa2\x8f\
+\x4a\x8c\x61\x6d\x0d\x4f\xa8\xb8\xf5\x90\x5e\xc9\x9a\x45\xe3\xc9\
+\x13\xf3\x42\xcc\xd3\x33\xcf\xce\xfa\xea\xab\x41\x2d\xd0\x74\x1a\
+\x95\x4a\x69\x98\x34\x60\x2b\x67\x56\xc4\x24\x26\x1a\xf3\x84\x56\
+\x2e\x34\x54\x52\xc2\x2a\x95\x6a\xa6\x48\x84\x83\x88\x85\x8d\x7d\
+\x15\x7a\xf5\x5c\xc1\x6a\x02\xcb\xd0\x3c\x68\xe3\xf8\x48\xa7\x52\
+\xab\x75\x67\x26\x0d\xd0\xa4\x9a\xe5\x51\x89\x89\xf2\x6c\xa1\x49\
+\xc5\xad\x43\x9c\xc7\x28\xd5\x2a\xe6\x2c\xfe\x3b\x3e\x31\x28\xcc\
+\xd5\xcd\x2d\xd7\x66\x15\x18\xc6\x0c\xd1\x12\x3f\xd2\x41\xdf\xab\
+\x3b\x13\xd1\xaf\xfd\xee\xd2\xc2\x18\x1a\xb3\x85\xf6\x9b\x24\x2c\
+\x32\x8f\x51\x6b\x34\xac\x19\xfe\x43\x38\x88\x58\x98\x9b\xbb\x7b\
+\x25\x6f\xed\x37\xfc\x75\xc8\x66\xff\x91\x0e\xfa\x5e\x9d\x21\xa2\
+\xef\xc1\xa2\x92\x09\x89\x49\x8c\x67\x73\x85\x83\x05\x4a\xb8\x23\
+\xfa\x5b\x2d\xca\x32\x99\xd2\xe2\x89\xbf\x45\x0b\x73\xf7\xf5\xbd\
+\x49\x9f\xd7\xb3\x2c\xd0\xa0\xef\x55\xab\x0d\xc1\x76\x47\xa6\x4a\
+\x8b\x31\x3e\x26\xda\x68\xb1\x1d\x99\xf8\x8c\x8f\x14\x79\x99\x19\
+\x4d\x96\x8c\xed\xa2\x87\x2b\x28\x2c\xc8\xd7\xfb\xe6\x30\x2d\x32\
+\x92\x2a\x8d\xc6\x20\x1c\x06\xcd\x8c\x71\x7f\xbc\x5e\x66\xb1\xda\
+\x0e\x83\x9c\x04\xb3\x10\xa6\x86\x57\x60\x17\xa3\x31\x1a\x59\x8b\
+\xf9\x89\x2b\x29\xcc\xe3\xa6\xae\xa0\x69\x78\x16\x99\x93\x65\x32\
+\x19\x77\xcc\x85\x83\x99\x51\xc6\x32\x66\xfb\x63\x2e\x17\x7c\xcd\
+\xd1\xf5\xe5\xf9\x73\x17\xc3\xaa\xe1\x34\xcc\x5b\xd1\x01\xc3\xb4\
+\x70\xbd\x41\x2f\x6a\x1c\xf4\x00\xef\xcf\x85\x7c\x80\x1d\x11\xe6\
+\x46\x20\x3e\x2c\xfc\x4d\xde\x8a\xd2\x0f\xd3\x02\x4d\x95\x02\xfd\
+\xa1\xed\x6a\xc2\xd3\xfe\x6a\xc2\x2e\x7e\x84\xc2\x05\x16\xe8\x49\
+\x27\x47\x90\x60\x0d\xff\xd2\xe5\x4a\x19\xf4\x87\x0a\x76\xa0\x4b\
+\x17\x04\x69\xf0\x67\x4a\xd1\x49\xef\x4a\x2c\xf6\x79\x2d\x7c\x77\
+\x43\x1f\x15\xc2\xf6\xbf\x4e\xa2\x1e\x0d\x7e\x1a\x87\x65\x05\x7a\
+\x8e\xc4\xc2\x2e\x08\xfa\x28\x3d\xfb\xcb\x8b\x32\xea\xf1\x41\x89\
+\x96\x35\x22\x0b\x5a\x57\x2d\xf4\x36\x05\xca\xbe\x57\x80\xd4\xe3\
+\x43\x24\x9e\x1a\x89\x05\xda\x84\xf8\xe8\x80\x00\x95\xfd\xe5\x26\
+\x70\xc4\xe3\x13\x48\xa9\x91\x5b\xa0\xc1\x99\x28\x31\x51\x63\xbb\
+\xb6\x25\x1e\x82\x5c\x5e\x25\x12\xa1\xc8\x9c\x1f\x81\xe5\xe2\x62\
+\xd0\x43\xdb\xbb\x5a\xc6\x5f\x48\xbb\x72\x5e\x9f\xb8\x52\x6a\xc4\
+\x16\x68\x05\xd8\xcf\x1b\xe9\x55\x3b\xe5\xec\x41\xf2\x91\x50\x41\
+\xbe\x2f\xb0\xbe\xfa\x69\xd1\xd8\xcf\xa3\xc6\x71\xd4\x13\xe2\xc6\
+\x51\x8e\xb0\x5c\x5c\x1e\xc7\x40\xdf\x7b\x42\x7e\x13\xde\x38\xc8\
+\x11\xcf\x3e\xee\x84\x82\x7d\xde\x01\x16\x68\xab\x8b\x8b\x0f\x1d\
+\xd2\xde\xc4\xb6\x04\x3c\x04\xed\x12\x84\x92\xaf\x87\xf7\xef\x1d\
+\x62\x81\x76\x1a\x7a\xd1\x52\xc5\x4b\xd8\xdf\xf9\x52\x90\x0f\xfd\
+\xec\xe1\x38\x0b\xb4\xbd\xa5\xd5\xd5\xd5\x72\xbc\xd0\xe2\x3d\x5b\
+\xf0\xbb\x60\xc7\x59\xa0\xd5\x55\x43\x7f\x08\x3d\x17\x9c\x38\xfa\
+\xc5\xdb\x3b\xf8\x7b\x07\x5a\xa0\x9d\x28\xd5\x2b\x75\x06\x72\xc0\
+\xf1\xb6\x89\xe4\x43\x70\x84\x63\x2d\xd0\xb4\xd0\x1f\x2a\x51\x83\
+\x78\x0b\xc1\x4f\x0e\xb7\x48\x5f\xa2\x56\x41\x67\x4e\x39\x5b\x22\
+\x26\x39\xde\x22\xdd\xab\x06\xba\x20\x38\xe3\xf4\x49\x82\x33\x2c\
+\xa1\x0b\x6a\x4e\x4a\x98\x24\x24\x21\xc9\x39\x16\xed\x82\xb2\xf0\
+\x6c\x9a\x94\x94\x40\x92\x94\x34\xc5\x59\x16\x9e\xa8\xb2\x8c\xd0\
+\x73\x35\x4f\x9c\x32\x05\x40\xf8\x63\x62\xb3\xd3\x2c\x3c\x9b\x42\
+\xcb\x25\x07\x8d\x8b\x33\x2d\xd2\x73\x69\xb5\xda\xc7\xcd\x93\x91\
+\x9a\xec\x5c\x0b\x6f\x30\xb4\x8a\x09\x0a\xb6\x79\x32\xc4\xd9\x16\
+\x76\x78\x13\xc2\xc3\xc3\xd9\x31\x6f\xbf\xed\x7c\x8b\xdc\xaa\x85\
+\xe8\x43\x74\x63\xc6\x8c\x82\x85\x97\x93\x7a\xe8\x27\x75\xa3\x62\
+\x91\x7e\x72\x7f\x41\xc1\xe8\x58\xa0\x29\x0a\x0a\xe2\x47\xc9\x02\
+\x2d\x7c\xf4\x2c\xda\xbd\x8e\x96\x85\xdd\xeb\xe8\x59\x50\xdb\x19\
+\x97\x5f\x7d\xfe\x0f\x08\x9b\x4f\xe0\xd6\x9e\x12\xb6\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x2e\xa0\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
+\x6e\x6f\x22\x3f\x3e\x0a\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x64\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\
+\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\
+\x6e\x74\x73\x2f\x31\x2e\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\
+\x6e\x73\x3a\x63\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x63\x72\
+\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\x6e\x73\x2e\x6f\x72\
+\x67\x2f\x6e\x73\x23\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
+\x72\x64\x66\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\
+\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x30\x32\x2f\x32\
+\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\x74\x61\x78\x2d\x6e\x73\x23\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x76\x67\x3d\x22\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\
+\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\
+\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\
+\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\
+\x22\x0a\x20\x20\x20\x64\x61\x74\x61\x2d\x6e\x61\x6d\x65\x3d\x22\
+\x4c\x61\x79\x65\x72\x20\x31\x22\x0a\x20\x20\x20\x76\x69\x65\x77\
+\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\
+\x22\x0a\x20\x20\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x31\x22\x0a\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\x35\x31\x32\
+\x22\x0a\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\x32\
+\x22\x3e\x0a\x20\x20\x3c\x6d\x65\x74\x61\x64\x61\x74\x61\x0a\x20\
+\x20\x20\x20\x20\x69\x64\x3d\x22\x6d\x65\x74\x61\x64\x61\x74\x61\
+\x31\x31\x35\x22\x3e\x0a\x20\x20\x20\x20\x3c\x72\x64\x66\x3a\x52\
+\x44\x46\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x63\x63\x3a\x57\x6f\
+\x72\x6b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x64\x66\x3a\
+\x61\x62\x6f\x75\x74\x3d\x22\x22\x3e\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x20\x3c\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x69\x6d\x61\
+\x67\x65\x2f\x73\x76\x67\x2b\x78\x6d\x6c\x3c\x2f\x64\x63\x3a\x66\
+\x6f\x72\x6d\x61\x74\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\
+\x64\x63\x3a\x74\x79\x70\x65\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x72\x64\x66\x3a\x72\x65\x73\x6f\x75\x72\x63\x65\x3d\
+\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\x2e\x6f\x72\x67\
+\x2f\x64\x63\x2f\x64\x63\x6d\x69\x74\x79\x70\x65\x2f\x53\x74\x69\
+\x6c\x6c\x49\x6d\x61\x67\x65\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x3c\x64\x63\x3a\x74\x69\x74\x6c\x65\x3e\x34\x2d\
+\x62\x69\x74\x63\x6f\x69\x6e\x2d\x63\x61\x73\x68\x2d\x6c\x6f\x67\
+\x6f\x2d\x66\x6c\x61\x67\x3c\x2f\x64\x63\x3a\x74\x69\x74\x6c\x65\
+\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x2f\x63\x63\x3a\x57\x6f\x72\
+\x6b\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x72\x64\x66\x3a\x52\x44\x46\
+\x3e\x0a\x20\x20\x3c\x2f\x6d\x65\x74\x61\x64\x61\x74\x61\x3e\x0a\
+\x20\x20\x3c\x64\x65\x66\x73\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\
+\x22\x64\x65\x66\x73\x31\x30\x30\x22\x3e\x0a\x20\x20\x20\x20\x3c\
+\x73\x74\x79\x6c\x65\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\
+\x22\x73\x74\x79\x6c\x65\x39\x38\x22\x3e\x2e\x63\x6c\x73\x2d\x31\
+\x7b\x66\x69\x6c\x6c\x3a\x23\x30\x30\x35\x36\x43\x30\x3b\x7d\x2e\
+\x63\x6c\x73\x2d\x32\x7b\x66\x69\x6c\x6c\x3a\x23\x66\x66\x66\x3b\
+\x7d\x3c\x2f\x73\x74\x79\x6c\x65\x3e\x0a\x20\x20\x3c\x2f\x64\x65\
+\x66\x73\x3e\x0a\x20\x20\x3c\x74\x69\x74\x6c\x65\x0a\x20\x20\x20\
+\x20\x20\x69\x64\x3d\x22\x74\x69\x74\x6c\x65\x31\x30\x32\x22\x3e\
+\x34\x2d\x62\x69\x74\x63\x6f\x69\x6e\x2d\x63\x61\x73\x68\x2d\x6c\
+\x6f\x67\x6f\x2d\x66\x6c\x61\x67\x3c\x2f\x74\x69\x74\x6c\x65\x3e\
+\x0a\x20\x20\x3c\x67\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x67\
+\x33\x31\x32\x39\x22\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x64\
+\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\x69\x6e\x65\x3b\x66\x69\
+\x6c\x6c\x3a\x23\x30\x30\x35\x36\x63\x30\x3b\x73\x74\x72\x6f\x6b\
+\x65\x2d\x77\x69\x64\x74\x68\x3a\x30\x2e\x36\x37\x38\x32\x34\x32\
+\x39\x38\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x64\x3d\x22\x6d\x20\
+\x34\x33\x33\x2e\x39\x35\x33\x31\x32\x2c\x31\x31\x36\x2e\x38\x35\
+\x31\x35\x36\x20\x63\x20\x32\x37\x2e\x32\x33\x39\x38\x33\x2c\x33\
+\x39\x2e\x36\x31\x35\x31\x32\x20\x34\x33\x2e\x31\x38\x35\x35\x35\
+\x2c\x38\x37\x2e\x36\x31\x30\x34\x31\x20\x34\x33\x2e\x31\x38\x35\
+\x35\x35\x2c\x31\x33\x39\x2e\x33\x31\x34\x34\x36\x20\x30\x2c\x35\
+\x31\x2e\x35\x38\x30\x36\x33\x20\x2d\x31\x35\x2e\x38\x37\x31\x31\
+\x35\x2c\x39\x39\x2e\x34\x34\x32\x33\x31\x20\x2d\x34\x32\x2e\x39\
+\x39\x32\x31\x39\x2c\x31\x33\x38\x2e\x39\x38\x32\x34\x32\x20\x48\
+\x20\x35\x31\x32\x20\x56\x20\x31\x31\x36\x2e\x38\x35\x31\x35\x36\
+\x20\x5a\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x70\
+\x61\x74\x68\x31\x30\x34\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\
+\x70\x61\x74\x68\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\
+\x65\x3d\x22\x64\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\x69\x6e\
+\x65\x3b\x66\x69\x6c\x6c\x3a\x23\x30\x30\x35\x36\x63\x30\x3b\x73\
+\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x30\x2e\x36\x37\
+\x38\x32\x34\x32\x39\x38\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x64\
+\x3d\x22\x4d\x20\x30\x2c\x31\x31\x36\x2e\x38\x35\x31\x35\x36\x20\
+\x56\x20\x33\x39\x35\x2e\x31\x34\x38\x34\x34\x20\x48\x20\x37\x38\
+\x2e\x31\x30\x35\x34\x36\x39\x20\x43\x20\x35\x30\x2e\x39\x35\x33\
+\x39\x35\x31\x2c\x33\x35\x35\x2e\x35\x39\x34\x37\x35\x20\x33\x35\
+\x2e\x30\x36\x32\x35\x2c\x33\x30\x37\x2e\x37\x30\x38\x36\x33\x20\
+\x33\x35\x2e\x30\x36\x32\x35\x2c\x32\x35\x36\x2e\x30\x39\x39\x36\
+\x31\x20\x63\x20\x30\x2c\x2d\x35\x31\x2e\x36\x39\x35\x30\x37\x20\
+\x31\x35\x2e\x39\x34\x32\x39\x38\x32\x2c\x2d\x39\x39\x2e\x36\x35\
+\x36\x38\x36\x20\x34\x33\x2e\x31\x37\x35\x37\x38\x31\x2c\x2d\x31\
+\x33\x39\x2e\x32\x34\x38\x30\x35\x20\x7a\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x31\x30\x36\x22\x20\
+\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x63\x69\x72\x63\x6c\x65\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x63\x6c\x61\x73\x73\x3d\x22\x63\x6c\x73\
+\x2d\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x63\x78\x3d\x22\x32\
+\x35\x36\x2e\x30\x30\x31\x37\x31\x22\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x63\x79\x3d\x22\x32\x35\x36\x22\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x72\x3d\x22\x31\x39\x34\x2e\x38\x32\x32\x34\x32\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x63\x69\x72\x63\x6c\x65\
+\x31\x30\x38\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\
+\x65\x3d\x22\x64\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\x69\x6e\
+\x65\x3b\x66\x69\x6c\x6c\x3a\x23\x30\x30\x35\x36\x63\x30\x3b\x73\
+\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x30\x2e\x36\x35\
+\x36\x31\x37\x37\x37\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x70\
+\x61\x74\x68\x0a\x20\x20\x20\x20\x20\x20\x20\x63\x6c\x61\x73\x73\
+\x3d\x22\x63\x6c\x73\x2d\x32\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x64\x3d\x22\x6d\x20\x33\x36\x34\x2e\x32\x32\x32\x32\x38\x2c\x32\
+\x36\x35\x2e\x36\x32\x33\x38\x31\x20\x2d\x30\x2e\x31\x32\x38\x30\
+\x37\x2c\x2d\x30\x2e\x32\x33\x38\x32\x34\x20\x2d\x30\x2e\x30\x32\
+\x31\x39\x2c\x2d\x30\x2e\x30\x33\x39\x32\x20\x63\x20\x2d\x30\x2e\
+\x30\x37\x37\x36\x2c\x2d\x30\x2e\x32\x33\x39\x38\x20\x2d\x30\x2e\
+\x31\x33\x35\x37\x39\x2c\x2d\x30\x2e\x34\x39\x30\x34\x33\x20\x2d\
+\x30\x2e\x32\x32\x34\x32\x36\x2c\x2d\x30\x2e\x37\x34\x39\x36\x32\
+\x20\x6c\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\
+\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x35\
+\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\
+\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x35\x20\x2d\
+\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\
+\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x33\x20\x2d\x30\x2e\
+\x30\x32\x31\x38\x2c\x2d\x30\x2e\x30\x33\x39\x36\x20\x61\x20\x34\
+\x37\x2e\x30\x36\x35\x38\x37\x39\x2c\x34\x37\x2e\x30\x36\x35\x38\
+\x37\x39\x20\x30\x20\x30\x20\x30\x20\x2d\x31\x35\x2e\x33\x38\x37\
+\x39\x35\x2c\x2d\x32\x33\x2e\x30\x32\x35\x32\x20\x6c\x20\x2d\x30\
+\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x33\x20\x63\x20\x2d\
+\x30\x2e\x32\x31\x36\x35\x33\x2c\x2d\x30\x2e\x31\x36\x35\x33\x31\
+\x20\x2d\x30\x2e\x34\x34\x33\x38\x39\x2c\x2d\x30\x2e\x33\x34\x39\
+\x39\x37\x20\x2d\x30\x2e\x36\x36\x31\x32\x31\x2c\x2d\x30\x2e\x35\
+\x31\x34\x35\x31\x20\x6c\x20\x2d\x30\x2e\x32\x39\x39\x35\x36\x2c\
+\x2d\x30\x2e\x32\x32\x32\x37\x31\x20\x2d\x30\x2e\x32\x31\x36\x34\
+\x36\x2c\x2d\x30\x2e\x31\x36\x34\x35\x31\x20\x2d\x30\x2e\x30\x39\
+\x33\x32\x2c\x2d\x30\x2e\x30\x37\x37\x37\x20\x2d\x30\x2e\x32\x30\
+\x36\x33\x38\x2c\x2d\x30\x2e\x31\x34\x35\x30\x38\x20\x2d\x30\x2e\
+\x30\x39\x33\x34\x2c\x2d\x30\x2e\x30\x37\x37\x36\x20\x2d\x30\x2e\
+\x32\x30\x36\x34\x2c\x2d\x30\x2e\x31\x34\x35\x30\x34\x20\x2d\x30\
+\x2e\x30\x39\x33\x32\x2c\x2d\x30\x2e\x30\x37\x37\x38\x20\x2d\x30\
+\x2e\x32\x31\x36\x34\x38\x2c\x2d\x30\x2e\x31\x36\x34\x35\x33\x20\
+\x2d\x30\x2e\x31\x31\x33\x33\x32\x2c\x2d\x30\x2e\x30\x36\x37\x37\
+\x20\x2d\x30\x2e\x32\x31\x36\x35\x33\x2c\x2d\x30\x2e\x31\x36\x34\
+\x34\x38\x20\x2d\x30\x2e\x31\x31\x33\x33\x34\x2c\x2d\x30\x2e\x30\
+\x36\x37\x37\x20\x2d\x30\x2e\x32\x33\x32\x38\x31\x2c\x2d\x30\x2e\
+\x31\x35\x35\x32\x31\x20\x2d\x30\x2e\x31\x31\x33\x33\x33\x2c\x2d\
+\x30\x2e\x30\x36\x37\x37\x20\x2d\x30\x2e\x31\x33\x37\x33\x34\x2c\
+\x2d\x30\x2e\x32\x30\x37\x39\x38\x20\x2d\x30\x2e\x31\x32\x33\x33\
+\x31\x2c\x2d\x30\x2e\x30\x38\x36\x38\x20\x2d\x30\x2e\x32\x33\x32\
+\x38\x32\x2c\x2d\x30\x2e\x31\x35\x35\x31\x38\x20\x2d\x30\x2e\x31\
+\x32\x33\x32\x39\x2c\x2d\x30\x2e\x30\x38\x36\x36\x20\x2d\x30\x2e\
+\x32\x33\x36\x36\x34\x2c\x2d\x30\x2e\x31\x35\x35\x32\x33\x20\x2d\
+\x30\x2e\x31\x32\x33\x33\x32\x2c\x2d\x30\x2e\x30\x38\x36\x36\x20\
+\x2d\x30\x2e\x32\x33\x32\x37\x38\x2c\x2d\x30\x2e\x31\x35\x35\x32\
+\x35\x20\x2d\x30\x2e\x31\x32\x33\x33\x35\x2c\x2d\x30\x2e\x30\x38\
+\x36\x38\x20\x2d\x30\x2e\x32\x34\x37\x35\x34\x2c\x2d\x30\x2e\x31\
+\x37\x33\x38\x38\x20\x2d\x30\x2e\x31\x32\x33\x32\x38\x2c\x2d\x30\
+\x2e\x30\x38\x36\x38\x20\x2d\x30\x2e\x32\x36\x37\x2c\x2d\x30\x2e\
+\x31\x36\x33\x37\x32\x20\x2d\x30\x2e\x31\x32\x33\x33\x31\x2c\x2d\
+\x30\x2e\x30\x38\x36\x39\x20\x2d\x30\x2e\x32\x36\x36\x39\x32\x2c\
+\x2d\x30\x2e\x31\x36\x33\x37\x32\x20\x2d\x30\x2e\x31\x32\x33\x33\
+\x34\x2c\x2d\x30\x2e\x30\x38\x36\x38\x20\x2d\x30\x2e\x32\x36\x36\
+\x39\x34\x2c\x2d\x30\x2e\x31\x36\x33\x37\x36\x20\x2d\x30\x2e\x31\
+\x32\x33\x33\x31\x2c\x2d\x30\x2e\x30\x38\x36\x37\x20\x2d\x30\x2e\
+\x32\x36\x36\x39\x32\x2c\x2d\x30\x2e\x31\x36\x33\x37\x34\x20\x2d\
+\x30\x2e\x31\x34\x33\x37\x2c\x2d\x30\x2e\x30\x37\x37\x36\x20\x2d\
+\x30\x2e\x32\x36\x36\x38\x39\x2c\x2d\x30\x2e\x31\x36\x33\x37\x36\
+\x20\x2d\x30\x2e\x31\x34\x33\x36\x32\x2c\x2d\x30\x2e\x30\x37\x37\
+\x34\x20\x2d\x30\x2e\x32\x38\x37\x31\x35\x2c\x2d\x30\x2e\x31\x35\
+\x35\x31\x38\x20\x2d\x30\x2e\x31\x34\x33\x36\x33\x2c\x2d\x30\x2e\
+\x30\x37\x37\x35\x20\x2d\x30\x2e\x32\x39\x38\x2c\x2d\x30\x2e\x31\
+\x37\x32\x32\x38\x20\x2d\x30\x2e\x31\x34\x33\x36\x33\x2c\x2d\x30\
+\x2e\x30\x37\x37\x38\x20\x2d\x30\x2e\x32\x39\x38\x30\x31\x2c\x2d\
+\x30\x2e\x31\x37\x32\x32\x39\x20\x2d\x30\x2e\x31\x34\x33\x35\x35\
+\x2c\x2d\x30\x2e\x30\x37\x37\x35\x20\x2d\x30\x2e\x32\x39\x38\x30\
+\x35\x2c\x2d\x30\x2e\x31\x37\x32\x32\x38\x20\x2d\x30\x2e\x31\x35\
+\x35\x32\x2c\x2d\x30\x2e\x30\x39\x36\x32\x20\x2d\x30\x2e\x32\x39\
+\x37\x39\x36\x2c\x2d\x30\x2e\x31\x37\x32\x33\x35\x20\x2d\x30\x2e\
+\x31\x35\x35\x32\x31\x2c\x2d\x30\x2e\x30\x39\x36\x31\x20\x2d\x30\
+\x2e\x33\x31\x37\x34\x2c\x2d\x30\x2e\x31\x36\x32\x31\x39\x20\x2d\
+\x30\x2e\x31\x35\x35\x32\x32\x2c\x2d\x30\x2e\x30\x39\x36\x32\x20\
+\x2d\x30\x2e\x33\x31\x37\x34\x32\x2c\x2d\x30\x2e\x31\x36\x32\x31\
+\x39\x20\x2d\x30\x2e\x32\x31\x34\x39\x32\x2c\x2d\x30\x2e\x31\x31\
+\x34\x37\x32\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\
+\x30\x35\x20\x63\x20\x2d\x30\x2e\x31\x35\x35\x32\x32\x2c\x2d\x30\
+\x2e\x30\x39\x35\x39\x20\x2d\x30\x2e\x33\x31\x37\x34\x32\x2c\x2d\
+\x30\x2e\x31\x36\x32\x31\x38\x20\x2d\x30\x2e\x34\x37\x31\x38\x31\
+\x2c\x2d\x30\x2e\x32\x35\x38\x34\x34\x20\x61\x20\x36\x35\x2e\x36\
+\x39\x37\x34\x34\x35\x2c\x36\x35\x2e\x36\x39\x37\x34\x34\x35\x20\
+\x30\x20\x30\x20\x30\x20\x2d\x32\x31\x2e\x30\x33\x38\x30\x34\x2c\
+\x2d\x36\x2e\x36\x34\x37\x33\x39\x20\x35\x38\x2e\x38\x32\x32\x36\
+\x35\x31\x2c\x35\x38\x2e\x38\x32\x32\x36\x35\x31\x20\x30\x20\x30\
+\x20\x30\x20\x35\x2e\x36\x33\x36\x32\x36\x2c\x2d\x37\x2e\x30\x37\
+\x38\x38\x39\x20\x6c\x20\x30\x2e\x32\x37\x30\x30\x38\x2c\x2d\x30\
+\x2e\x34\x30\x31\x32\x20\x30\x2e\x30\x32\x30\x34\x2c\x2d\x30\x2e\
+\x30\x30\x39\x20\x30\x2e\x31\x32\x34\x39\x34\x2c\x2d\x30\x2e\x31\
+\x39\x35\x36\x31\x20\x30\x2e\x31\x36\x33\x37\x37\x2c\x2d\x30\x2e\
+\x32\x36\x36\x39\x31\x20\x30\x2e\x30\x38\x36\x38\x2c\x2d\x30\x2e\
+\x31\x32\x33\x33\x33\x20\x30\x2e\x31\x36\x33\x37\x38\x2c\x2d\x30\
+\x2e\x32\x36\x36\x39\x35\x20\x30\x2e\x30\x38\x37\x2c\x2d\x30\x2e\
+\x31\x32\x33\x33\x33\x20\x30\x2e\x31\x36\x33\x37\x34\x2c\x2d\x30\
+\x2e\x32\x36\x36\x39\x32\x20\x30\x2e\x30\x38\x36\x38\x2c\x2d\x30\
+\x2e\x31\x32\x33\x33\x34\x20\x30\x2e\x31\x36\x33\x37\x35\x2c\x2d\
+\x30\x2e\x32\x36\x36\x39\x20\x30\x2e\x30\x38\x36\x38\x2c\x2d\x30\
+\x2e\x31\x32\x33\x33\x36\x20\x30\x2e\x31\x36\x33\x37\x2c\x2d\x30\
+\x2e\x32\x36\x36\x39\x35\x20\x30\x2e\x30\x38\x36\x35\x2c\x2d\x30\
+\x2e\x31\x32\x33\x33\x33\x20\x30\x2e\x31\x34\x33\x35\x39\x2c\x2d\
+\x30\x2e\x32\x35\x36\x37\x39\x20\x30\x2e\x30\x38\x36\x37\x2c\x2d\
+\x30\x2e\x31\x32\x33\x33\x32\x20\x30\x2e\x31\x34\x33\x36\x31\x2c\
+\x2d\x30\x2e\x32\x35\x36\x38\x39\x20\x30\x2e\x30\x36\x37\x37\x2c\
+\x2d\x30\x2e\x31\x31\x33\x33\x33\x20\x30\x2e\x31\x34\x33\x36\x33\
+\x2c\x2d\x30\x2e\x32\x35\x36\x38\x35\x20\x30\x2e\x30\x36\x37\x38\
+\x2c\x2d\x30\x2e\x31\x31\x33\x33\x33\x20\x30\x2e\x31\x34\x33\x36\
+\x35\x2c\x2d\x30\x2e\x32\x35\x36\x38\x36\x20\x30\x2e\x30\x36\x37\
+\x33\x2c\x2d\x30\x2e\x31\x31\x33\x33\x33\x20\x30\x2e\x31\x32\x33\
+\x33\x2c\x2d\x30\x2e\x32\x34\x35\x39\x39\x20\x30\x2e\x30\x36\x37\
+\x33\x2c\x2d\x30\x2e\x31\x31\x33\x33\x34\x20\x30\x2e\x31\x32\x33\
+\x32\x36\x2c\x2d\x30\x2e\x32\x34\x35\x39\x36\x20\x30\x2e\x30\x36\
+\x37\x37\x2c\x2d\x30\x2e\x31\x31\x33\x33\x33\x20\x30\x2e\x31\x32\
+\x33\x33\x31\x2c\x2d\x30\x2e\x32\x34\x36\x20\x30\x2e\x30\x36\x37\
+\x33\x2c\x2d\x30\x2e\x31\x31\x33\x33\x34\x20\x30\x2e\x31\x33\x33\
+\x34\x32\x2c\x2d\x30\x2e\x32\x32\x35\x38\x32\x20\x30\x2e\x30\x36\
+\x37\x37\x2c\x2d\x30\x2e\x31\x31\x33\x33\x34\x20\x30\x2e\x31\x33\
+\x34\x32\x33\x2c\x2d\x30\x2e\x32\x32\x35\x38\x33\x20\x30\x2e\x30\
+\x36\x37\x35\x2c\x2d\x30\x2e\x31\x31\x33\x33\x34\x20\x30\x2e\x31\
+\x31\x34\x38\x33\x2c\x2d\x30\x2e\x32\x31\x35\x20\x30\x2e\x30\x36\
+\x37\x36\x2c\x2d\x30\x2e\x31\x31\x33\x33\x33\x20\x30\x2e\x31\x31\
+\x34\x38\x34\x2c\x2d\x30\x2e\x32\x31\x34\x39\x33\x20\x30\x2e\x30\
+\x34\x37\x35\x2c\x2d\x30\x2e\x31\x30\x32\x34\x38\x20\x30\x2e\x31\
+\x31\x34\x36\x2c\x2d\x30\x2e\x32\x31\x34\x39\x39\x20\x30\x2e\x30\
+\x34\x37\x39\x2c\x2d\x30\x2e\x31\x30\x32\x35\x39\x20\x30\x2e\x31\
+\x31\x34\x38\x34\x2c\x2d\x30\x2e\x32\x31\x34\x39\x36\x20\x30\x2e\
+\x30\x34\x37\x35\x2c\x2d\x30\x2e\x31\x30\x32\x35\x38\x20\x30\x2e\
+\x31\x31\x34\x37\x31\x2c\x2d\x30\x2e\x32\x31\x34\x39\x38\x20\x30\
+\x2e\x30\x34\x37\x38\x2c\x2d\x30\x2e\x31\x30\x32\x35\x38\x20\x30\
+\x2e\x30\x39\x34\x37\x2c\x2d\x30\x2e\x32\x30\x34\x38\x36\x20\x30\
+\x2e\x30\x34\x37\x33\x2c\x2d\x30\x2e\x31\x30\x32\x36\x39\x20\x30\
+\x2e\x30\x39\x34\x35\x2c\x2d\x30\x2e\x32\x30\x34\x38\x37\x20\x30\
+\x2e\x30\x34\x37\x37\x2c\x2d\x30\x2e\x31\x30\x32\x34\x38\x20\x30\
+\x2e\x30\x39\x34\x37\x2c\x2d\x30\x2e\x32\x30\x34\x38\x33\x20\x30\
+\x2e\x30\x34\x37\x36\x2c\x2d\x30\x2e\x31\x30\x32\x34\x38\x20\x30\
+\x2e\x31\x30\x33\x38\x34\x2c\x2d\x30\x2e\x32\x33\x32\x38\x36\x20\
+\x30\x2e\x31\x34\x32\x30\x32\x2c\x2d\x30\x2e\x33\x31\x30\x34\x31\
+\x20\x63\x20\x30\x2e\x31\x30\x33\x38\x34\x2c\x2d\x30\x2e\x32\x33\
+\x32\x37\x37\x20\x30\x2e\x31\x38\x37\x38\x33\x2c\x2d\x30\x2e\x34\
+\x35\x39\x34\x32\x20\x30\x2e\x32\x39\x31\x37\x38\x2c\x2d\x30\x2e\
+\x36\x39\x34\x35\x20\x6c\x20\x30\x2e\x30\x32\x30\x34\x2c\x2d\x30\
+\x2e\x30\x30\x39\x20\x61\x20\x34\x31\x2e\x38\x30\x32\x31\x30\x33\
+\x2c\x34\x31\x2e\x38\x30\x32\x31\x30\x33\x20\x30\x20\x30\x20\x30\
+\x20\x32\x2e\x31\x32\x33\x39\x35\x2c\x2d\x32\x34\x2e\x35\x34\x32\
+\x35\x36\x20\x6c\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\
+\x32\x30\x33\x20\x2d\x30\x2e\x30\x32\x31\x36\x2c\x2d\x30\x2e\x30\
+\x33\x39\x36\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\
+\x30\x33\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\
+\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x33\
+\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\
+\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\
+\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x35\x20\x63\x20\
+\x2d\x30\x2e\x30\x34\x37\x37\x2c\x2d\x30\x2e\x32\x33\x32\x38\x20\
+\x2d\x30\x2e\x30\x39\x34\x39\x2c\x2d\x30\x2e\x34\x36\x30\x39\x33\
+\x20\x2d\x30\x2e\x31\x36\x31\x33\x36\x2c\x2d\x30\x2e\x36\x38\x31\
+\x33\x33\x20\x76\x20\x2d\x30\x2e\x30\x35\x30\x34\x20\x6c\x20\x2d\
+\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\
+\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\
+\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x35\x20\x30\x2e\x30\x30\
+\x39\x2c\x30\x2e\x30\x32\x30\x35\x20\x2d\x30\x2e\x30\x39\x36\x33\
+\x2c\x2d\x30\x2e\x31\x37\x38\x34\x35\x20\x63\x20\x2d\x30\x2e\x30\
+\x37\x2c\x2d\x30\x2e\x33\x32\x30\x34\x37\x20\x2d\x30\x2e\x31\x34\
+\x30\x33\x38\x2c\x2d\x30\x2e\x36\x34\x31\x20\x2d\x30\x2e\x32\x34\
+\x31\x33\x2c\x2d\x30\x2e\x39\x37\x30\x38\x35\x20\x2d\x30\x2e\x30\
+\x37\x2c\x2d\x30\x2e\x33\x32\x30\x34\x38\x20\x2d\x30\x2e\x31\x37\
+\x30\x37\x37\x2c\x2d\x30\x2e\x36\x35\x30\x32\x39\x20\x2d\x30\x2e\
+\x32\x36\x30\x37\x34\x2c\x2d\x30\x2e\x39\x36\x30\x36\x38\x20\x6c\
+\x20\x2d\x30\x2e\x31\x31\x37\x30\x38\x2c\x2d\x30\x2e\x32\x31\x38\
+\x30\x39\x20\x2d\x30\x2e\x30\x32\x31\x38\x2c\x2d\x30\x2e\x30\x33\
+\x39\x34\x20\x63\x20\x2d\x30\x2e\x30\x36\x37\x38\x2c\x2d\x30\x2e\
+\x32\x31\x39\x35\x38\x20\x2d\x30\x2e\x31\x33\x34\x32\x35\x2c\x2d\
+\x30\x2e\x34\x34\x20\x2d\x30\x2e\x32\x30\x31\x37\x36\x2c\x2d\x30\
+\x2e\x36\x35\x39\x36\x33\x20\x6c\x20\x2d\x30\x2e\x30\x30\x39\x2c\
+\x2d\x30\x2e\x30\x32\x30\x32\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\
+\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\
+\x2e\x30\x32\x30\x33\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\
+\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\
+\x32\x30\x33\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\
+\x30\x35\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\
+\x33\x20\x41\x20\x34\x31\x2e\x38\x31\x32\x31\x39\x33\x2c\x34\x31\
+\x2e\x38\x31\x32\x31\x39\x33\x20\x30\x20\x30\x20\x30\x20\x33\x31\
+\x35\x2e\x31\x38\x36\x36\x2c\x31\x36\x32\x2e\x32\x33\x30\x35\x38\
+\x20\x6c\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\
+\x35\x20\x63\x20\x2d\x30\x2e\x31\x38\x36\x32\x35\x2c\x2d\x30\x2e\
+\x31\x35\x35\x31\x39\x20\x2d\x30\x2e\x33\x39\x32\x37\x31\x2c\x2d\
+\x30\x2e\x33\x30\x31\x31\x32\x20\x2d\x30\x2e\x35\x37\x38\x39\x34\
+\x2c\x2d\x30\x2e\x34\x35\x36\x32\x38\x20\x6c\x20\x2d\x30\x2e\x32\
+\x35\x37\x36\x36\x2c\x2d\x30\x2e\x31\x39\x34\x30\x33\x20\x2d\x30\
+\x2e\x32\x30\x36\x34\x32\x2c\x2d\x30\x2e\x31\x34\x35\x30\x37\x20\
+\x2d\x30\x2e\x30\x39\x33\x32\x2c\x2d\x30\x2e\x30\x37\x37\x35\x20\
+\x2d\x30\x2e\x31\x37\x35\x33\x39\x2c\x2d\x30\x2e\x31\x33\x35\x36\
+\x36\x20\x2d\x30\x2e\x30\x39\x33\x31\x2c\x2d\x30\x2e\x30\x37\x37\
+\x38\x20\x2d\x30\x2e\x31\x37\x35\x33\x39\x2c\x2d\x30\x2e\x31\x33\
+\x35\x38\x31\x20\x2d\x30\x2e\x30\x39\x33\x32\x2c\x2d\x30\x2e\x30\
+\x37\x37\x37\x20\x2d\x30\x2e\x31\x39\x35\x35\x33\x2c\x2d\x30\x2e\
+\x31\x32\x34\x39\x37\x20\x2d\x30\x2e\x30\x39\x33\x31\x2c\x2d\x30\
+\x2e\x30\x37\x37\x38\x20\x2d\x30\x2e\x32\x30\x36\x34\x33\x2c\x2d\
+\x30\x2e\x31\x34\x35\x30\x33\x20\x2d\x30\x2e\x30\x39\x33\x31\x2c\
+\x2d\x30\x2e\x30\x37\x37\x38\x20\x2d\x30\x2e\x32\x30\x36\x34\x31\
+\x2c\x2d\x30\x2e\x31\x34\x35\x30\x37\x20\x2d\x30\x2e\x30\x39\x33\
+\x2c\x2d\x30\x2e\x30\x37\x37\x36\x20\x2d\x30\x2e\x32\x30\x36\x34\
+\x32\x2c\x2d\x30\x2e\x31\x34\x35\x30\x36\x20\x2d\x30\x2e\x31\x31\
+\x33\x33\x32\x2c\x2d\x30\x2e\x30\x36\x37\x36\x20\x2d\x30\x2e\x32\
+\x30\x36\x33\x39\x2c\x2d\x30\x2e\x31\x34\x35\x30\x38\x20\x2d\x30\
+\x2e\x31\x31\x33\x33\x33\x2c\x2d\x30\x2e\x30\x36\x37\x37\x20\x2d\
+\x30\x2e\x32\x30\x36\x34\x36\x2c\x2d\x30\x2e\x31\x34\x35\x31\x36\
+\x20\x2d\x30\x2e\x31\x31\x33\x33\x33\x2c\x2d\x30\x2e\x30\x36\x37\
+\x35\x20\x2d\x30\x2e\x32\x32\x35\x38\x31\x2c\x2d\x30\x2e\x31\x33\
+\x34\x32\x38\x20\x2d\x30\x2e\x31\x31\x33\x33\x33\x2c\x2d\x30\x2e\
+\x30\x36\x37\x38\x20\x2d\x30\x2e\x32\x32\x35\x38\x36\x2c\x2d\x30\
+\x2e\x31\x33\x34\x33\x33\x20\x2d\x30\x2e\x31\x31\x33\x33\x32\x2c\
+\x2d\x30\x2e\x30\x36\x37\x35\x20\x2d\x30\x2e\x32\x32\x35\x38\x38\
+\x2c\x2d\x30\x2e\x31\x33\x34\x32\x38\x20\x2d\x30\x2e\x31\x31\x33\
+\x33\x33\x2c\x2d\x30\x2e\x30\x36\x37\x37\x20\x2d\x30\x2e\x32\x32\
+\x35\x38\x33\x2c\x2d\x30\x2e\x31\x33\x34\x33\x32\x20\x2d\x30\x2e\
+\x31\x31\x33\x33\x33\x2c\x2d\x30\x2e\x30\x36\x37\x36\x20\x2d\x30\
+\x2e\x32\x33\x36\x36\x38\x2c\x2d\x30\x2e\x31\x35\x35\x31\x39\x20\
+\x2d\x30\x2e\x31\x31\x33\x33\x34\x2c\x2d\x30\x2e\x30\x36\x37\x37\
+\x20\x2d\x30\x2e\x32\x33\x36\x36\x39\x2c\x2d\x30\x2e\x31\x35\x35\
+\x31\x38\x20\x2d\x30\x2e\x31\x31\x33\x33\x34\x2c\x2d\x30\x2e\x30\
+\x36\x37\x35\x20\x2d\x30\x2e\x32\x35\x36\x38\x35\x2c\x2d\x30\x2e\
+\x31\x34\x33\x36\x37\x20\x2d\x30\x2e\x31\x31\x33\x33\x33\x2c\x2d\
+\x30\x2e\x30\x36\x37\x37\x20\x2d\x30\x2e\x32\x35\x36\x30\x38\x2c\
+\x2d\x30\x2e\x31\x34\x33\x36\x32\x20\x2d\x30\x2e\x31\x32\x33\x33\
+\x34\x2c\x2d\x30\x2e\x30\x38\x36\x39\x20\x2d\x30\x2e\x32\x35\x36\
+\x38\x31\x2c\x2d\x30\x2e\x31\x34\x33\x35\x38\x20\x2d\x30\x2e\x31\
+\x32\x33\x33\x33\x2c\x2d\x30\x2e\x30\x38\x36\x37\x20\x2d\x30\x2e\
+\x32\x35\x36\x30\x39\x2c\x2d\x30\x2e\x31\x34\x33\x36\x20\x2d\x30\
+\x2e\x31\x32\x33\x33\x33\x2c\x2d\x30\x2e\x30\x38\x36\x37\x20\x2d\
+\x30\x2e\x32\x36\x36\x39\x34\x2c\x2d\x30\x2e\x31\x36\x33\x37\x33\
+\x20\x2d\x30\x2e\x31\x34\x33\x36\x2c\x2d\x30\x2e\x30\x37\x37\x35\
+\x20\x2d\x30\x2e\x32\x36\x36\x39\x36\x2c\x2d\x30\x2e\x31\x36\x33\
+\x37\x32\x20\x2d\x30\x2e\x31\x34\x33\x36\x32\x2c\x2d\x30\x2e\x30\
+\x37\x37\x36\x20\x2d\x30\x2e\x32\x38\x37\x31\x31\x2c\x2d\x30\x2e\
+\x31\x35\x35\x32\x31\x20\x2d\x30\x2e\x31\x34\x33\x36\x36\x2c\x2d\
+\x30\x2e\x30\x37\x37\x36\x20\x2d\x30\x2e\x32\x38\x37\x31\x33\x2c\
+\x2d\x30\x2e\x31\x35\x35\x31\x37\x20\x2d\x30\x2e\x32\x30\x34\x38\
+\x35\x2c\x2d\x30\x2e\x30\x39\x34\x36\x20\x2d\x30\x2e\x30\x30\x39\
+\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x34\x33\x30\x37\
+\x2c\x2d\x30\x2e\x32\x33\x32\x38\x20\x63\x20\x2d\x31\x32\x2e\x35\
+\x38\x32\x35\x2c\x2d\x36\x2e\x35\x33\x39\x35\x36\x20\x2d\x32\x38\
+\x2e\x35\x36\x37\x37\x39\x2c\x2d\x38\x2e\x35\x30\x38\x33\x34\x20\
+\x2d\x34\x34\x2e\x36\x35\x30\x39\x33\x2c\x2d\x34\x2e\x33\x38\x32\
+\x32\x20\x6c\x20\x2d\x34\x2e\x31\x38\x33\x35\x36\x2c\x31\x2e\x30\
+\x37\x34\x30\x31\x20\x2d\x31\x30\x2e\x35\x38\x31\x38\x36\x2c\x2d\
+\x34\x31\x2e\x32\x30\x36\x39\x20\x2d\x32\x34\x2e\x35\x32\x32\x33\
+\x31\x2c\x36\x2e\x32\x38\x35\x37\x39\x20\x31\x30\x2e\x35\x34\x36\
+\x39\x34\x2c\x34\x31\x2e\x30\x34\x33\x39\x20\x2d\x31\x39\x2e\x36\
+\x32\x32\x36\x2c\x35\x2e\x30\x35\x38\x31\x34\x20\x2d\x31\x30\x2e\
+\x35\x35\x33\x39\x31\x2c\x2d\x34\x30\x2e\x39\x31\x32\x37\x38\x20\
+\x2d\x32\x34\x2e\x35\x32\x32\x33\x36\x2c\x36\x2e\x32\x38\x35\x38\
+\x31\x20\x31\x30\x2e\x35\x34\x36\x39\x34\x2c\x34\x31\x2e\x30\x34\
+\x33\x39\x37\x20\x2d\x35\x30\x2e\x35\x37\x31\x31\x37\x2c\x31\x33\
+\x2e\x30\x31\x33\x31\x33\x20\x36\x2e\x37\x32\x38\x39\x2c\x32\x36\
+\x2e\x31\x35\x32\x30\x32\x20\x32\x30\x2e\x33\x37\x36\x38\x34\x2c\
+\x2d\x35\x2e\x32\x33\x33\x35\x20\x61\x20\x31\x32\x2e\x36\x31\x30\
+\x33\x39\x36\x2c\x31\x32\x2e\x36\x31\x30\x33\x39\x36\x20\x30\x20\
+\x30\x20\x31\x20\x31\x35\x2e\x33\x36\x35\x33\x32\x2c\x39\x2e\x30\
+\x38\x37\x39\x39\x20\x76\x20\x30\x20\x6c\x20\x32\x38\x2e\x32\x38\
+\x33\x37\x33\x2c\x31\x31\x30\x2e\x30\x35\x33\x34\x35\x20\x61\x20\
+\x38\x2e\x34\x32\x35\x32\x39\x38\x2c\x38\x2e\x34\x32\x35\x32\x39\
+\x38\x20\x30\x20\x30\x20\x31\x20\x2d\x36\x2e\x30\x35\x32\x39\x39\
+\x2c\x31\x30\x2e\x32\x34\x38\x32\x33\x20\x6c\x20\x2d\x31\x37\x2e\
+\x38\x35\x34\x37\x39\x2c\x34\x2e\x35\x39\x33\x32\x34\x20\x31\x2e\
+\x30\x34\x39\x32\x32\x2c\x33\x31\x2e\x31\x30\x33\x30\x37\x20\x35\
+\x30\x2e\x35\x31\x31\x34\x2c\x2d\x31\x32\x2e\x39\x38\x30\x35\x34\
+\x20\x31\x30\x2e\x36\x38\x32\x37\x35\x2c\x34\x30\x2e\x39\x36\x39\
+\x34\x31\x20\x32\x34\x2e\x35\x30\x39\x39\x35\x2c\x2d\x36\x2e\x33\
+\x30\x36\x37\x35\x20\x2d\x31\x30\x2e\x35\x35\x33\x39\x32\x2c\x2d\
+\x34\x31\x2e\x30\x36\x34\x31\x35\x20\x31\x39\x2e\x36\x31\x36\x33\
+\x34\x2c\x2d\x35\x2e\x30\x32\x39\x33\x37\x20\x31\x30\x2e\x35\x35\
+\x37\x38\x31\x2c\x34\x31\x2e\x30\x36\x33\x33\x33\x20\x32\x34\x2e\
+\x35\x30\x39\x39\x36\x2c\x2d\x36\x2e\x33\x30\x36\x37\x33\x20\x2d\
+\x31\x30\x2e\x35\x39\x33\x35\x33\x2c\x2d\x34\x31\x2e\x32\x32\x33\
+\x39\x36\x20\x63\x20\x34\x2e\x31\x35\x33\x33\x31\x2c\x2d\x31\x2e\
+\x30\x38\x36\x34\x37\x20\x37\x2e\x37\x32\x36\x31\x36\x2c\x2d\x32\
+\x2e\x30\x30\x38\x33\x37\x20\x31\x30\x2e\x31\x39\x37\x37\x36\x2c\
+\x2d\x32\x2e\x36\x34\x37\x38\x32\x20\x31\x38\x2e\x31\x32\x34\x38\
+\x33\x2c\x2d\x34\x2e\x36\x36\x31\x35\x38\x20\x33\x32\x2e\x37\x38\
+\x31\x36\x32\x2c\x2d\x31\x35\x2e\x32\x38\x37\x37\x31\x20\x34\x31\
+\x2e\x36\x35\x30\x38\x31\x2c\x2d\x32\x38\x2e\x35\x33\x38\x33\x20\
+\x6c\x20\x30\x2e\x32\x39\x39\x35\x31\x2c\x2d\x30\x2e\x34\x34\x32\
+\x33\x34\x20\x30\x2e\x30\x32\x30\x35\x2c\x2d\x30\x2e\x30\x30\x39\
+\x20\x30\x2e\x31\x34\x35\x30\x36\x2c\x2d\x30\x2e\x32\x30\x36\x34\
+\x32\x20\x30\x2e\x31\x39\x32\x34\x38\x2c\x2d\x30\x2e\x33\x31\x30\
+\x34\x33\x20\x30\x2e\x30\x39\x36\x32\x2c\x2d\x30\x2e\x31\x35\x35\
+\x32\x20\x30\x2e\x31\x39\x32\x34\x32\x2c\x2d\x30\x2e\x33\x31\x30\
+\x33\x39\x20\x30\x2e\x30\x39\x35\x39\x2c\x2d\x30\x2e\x31\x35\x35\
+\x32\x31\x20\x30\x2e\x31\x37\x32\x33\x2c\x2d\x30\x2e\x32\x39\x37\
+\x39\x37\x20\x30\x2e\x30\x39\x36\x2c\x2d\x30\x2e\x31\x35\x35\x32\
+\x34\x20\x30\x2e\x31\x37\x32\x33\x33\x2c\x2d\x30\x2e\x32\x39\x38\
+\x30\x31\x20\x30\x2e\x30\x37\x37\x35\x2c\x2d\x30\x2e\x31\x34\x33\
+\x35\x39\x20\x30\x2e\x31\x37\x32\x33\x31\x2c\x2d\x30\x2e\x32\x39\
+\x37\x39\x38\x20\x30\x2e\x30\x37\x37\x37\x2c\x2d\x30\x2e\x31\x34\
+\x33\x36\x35\x20\x30\x2e\x31\x37\x32\x32\x37\x2c\x2d\x30\x2e\x32\
+\x39\x38\x20\x30\x2e\x30\x37\x37\x35\x2c\x2d\x30\x2e\x31\x34\x33\
+\x36\x20\x30\x2e\x31\x35\x35\x32\x34\x2c\x2d\x30\x2e\x32\x38\x37\
+\x31\x35\x20\x30\x2e\x30\x37\x37\x36\x2c\x2d\x30\x2e\x31\x34\x33\
+\x36\x20\x30\x2e\x31\x35\x35\x32\x2c\x2d\x30\x2e\x32\x38\x37\x30\
+\x39\x20\x30\x2e\x30\x37\x37\x34\x2c\x2d\x30\x2e\x31\x34\x33\x36\
+\x37\x20\x30\x2e\x31\x36\x33\x37\x37\x2c\x2d\x30\x2e\x32\x36\x36\
+\x39\x35\x20\x30\x2e\x30\x37\x37\x39\x2c\x2d\x30\x2e\x31\x34\x33\
+\x36\x20\x30\x2e\x31\x36\x33\x37\x36\x2c\x2d\x30\x2e\x32\x36\x36\
+\x39\x38\x20\x30\x2e\x30\x37\x37\x37\x2c\x2d\x30\x2e\x31\x34\x33\
+\x35\x39\x20\x30\x2e\x31\x34\x33\x36\x34\x2c\x2d\x30\x2e\x32\x35\
+\x36\x39\x32\x20\x30\x2e\x30\x37\x37\x37\x2c\x2d\x30\x2e\x31\x34\
+\x33\x36\x33\x20\x30\x2e\x31\x34\x33\x36\x32\x2c\x2d\x30\x2e\x32\
+\x35\x36\x30\x35\x20\x30\x2e\x30\x37\x37\x36\x2c\x2d\x30\x2e\x31\
+\x34\x33\x36\x33\x20\x30\x2e\x31\x34\x33\x36\x33\x2c\x2d\x30\x2e\
+\x32\x35\x36\x31\x31\x20\x30\x2e\x30\x35\x36\x38\x2c\x2d\x30\x2e\
+\x31\x33\x32\x37\x37\x20\x30\x2e\x31\x34\x33\x36\x35\x2c\x2d\x30\
+\x2e\x32\x35\x36\x30\x36\x20\x30\x2e\x30\x35\x36\x38\x2c\x2d\x30\
+\x2e\x31\x33\x32\x37\x37\x20\x30\x2e\x31\x32\x33\x32\x37\x2c\x2d\
+\x30\x2e\x32\x34\x35\x39\x37\x20\x30\x2e\x30\x36\x37\x35\x2c\x2d\
+\x30\x2e\x31\x31\x33\x33\x32\x20\x30\x2e\x31\x32\x33\x33\x39\x2c\
+\x2d\x30\x2e\x32\x34\x35\x39\x38\x20\x30\x2e\x30\x36\x37\x33\x2c\
+\x2d\x30\x2e\x31\x31\x33\x33\x32\x20\x30\x2e\x31\x32\x33\x33\x2c\
+\x2d\x30\x2e\x32\x34\x36\x30\x37\x20\x30\x2e\x30\x36\x37\x35\x2c\
+\x2d\x30\x2e\x31\x31\x33\x32\x31\x20\x30\x2e\x31\x32\x33\x33\x32\
+\x2c\x2d\x30\x2e\x32\x34\x35\x39\x39\x20\x30\x2e\x30\x36\x37\x33\
+\x2c\x2d\x30\x2e\x31\x31\x33\x33\x33\x20\x30\x2e\x31\x32\x33\x33\
+\x36\x2c\x2d\x30\x2e\x32\x34\x35\x39\x38\x20\x30\x2e\x30\x36\x37\
+\x37\x2c\x2d\x30\x2e\x31\x31\x33\x33\x32\x20\x30\x2e\x31\x32\x33\
+\x33\x32\x2c\x2d\x30\x2e\x32\x34\x36\x30\x32\x20\x30\x2e\x30\x36\
+\x37\x37\x2c\x2d\x30\x2e\x31\x31\x33\x33\x32\x20\x30\x2e\x31\x30\
+\x33\x38\x35\x2c\x2d\x30\x2e\x32\x33\x32\x38\x35\x20\x30\x2e\x30\
+\x36\x37\x37\x2c\x2d\x30\x2e\x31\x31\x33\x33\x33\x20\x30\x2e\x31\
+\x30\x34\x30\x36\x2c\x2d\x30\x2e\x32\x33\x32\x38\x32\x20\x30\x2e\
+\x30\x34\x37\x37\x2c\x2d\x30\x2e\x31\x30\x32\x34\x38\x20\x30\x2e\
+\x31\x31\x33\x33\x32\x2c\x2d\x30\x2e\x32\x36\x35\x33\x39\x20\x30\
+\x2e\x31\x35\x35\x32\x33\x2c\x2d\x30\x2e\x33\x33\x37\x35\x33\x20\
+\x63\x20\x30\x2e\x31\x31\x33\x33\x33\x2c\x2d\x30\x2e\x32\x36\x35\
+\x34\x20\x30\x2e\x32\x33\x32\x37\x38\x2c\x2d\x30\x2e\x35\x31\x31\
+\x34\x33\x20\x30\x2e\x33\x32\x39\x37\x39\x2c\x2d\x30\x2e\x37\x36\
+\x36\x37\x20\x6c\x20\x30\x2e\x30\x30\x38\x2c\x2d\x30\x2e\x30\x33\
+\x30\x31\x20\x61\x20\x34\x37\x2e\x31\x31\x37\x30\x39\x37\x2c\x34\
+\x37\x2e\x31\x31\x37\x30\x39\x37\x20\x30\x20\x30\x20\x30\x20\x32\
+\x2e\x33\x39\x36\x33\x37\x2c\x2d\x32\x37\x2e\x36\x30\x35\x35\x38\
+\x20\x6c\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\
+\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x32\
+\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\
+\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\
+\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x33\x20\x2d\x30\
+\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\
+\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x33\x20\x2d\x30\x2e\x30\
+\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x32\x20\x63\x20\x2d\x30\x2e\
+\x30\x35\x38\x33\x2c\x2d\x30\x2e\x32\x35\x30\x36\x36\x20\x2d\x30\
+\x2e\x31\x31\x35\x37\x36\x2c\x2d\x30\x2e\x35\x30\x30\x35\x35\x20\
+\x2d\x30\x2e\x31\x37\x33\x38\x34\x2c\x2d\x30\x2e\x37\x35\x31\x31\
+\x36\x20\x76\x20\x2d\x30\x2e\x30\x35\x30\x35\x20\x6c\x20\x2d\x30\
+\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x35\x20\x2d\x30\x2e\
+\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\
+\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x35\x20\x2d\x30\x2e\x30\x30\
+\x39\x2c\x2d\x30\x2e\x30\x32\x30\x32\x20\x2d\x30\x2e\x30\x30\x39\
+\x2c\x2d\x30\x2e\x30\x32\x30\x35\x20\x2d\x30\x2e\x30\x30\x39\x2c\
+\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\
+\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\
+\x2e\x30\x32\x30\x35\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\
+\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\
+\x32\x30\x35\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\
+\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\
+\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\
+\x20\x2d\x30\x2e\x30\x34\x33\x2c\x2d\x30\x2e\x30\x37\x37\x36\x20\
+\x63\x20\x2d\x30\x2e\x30\x39\x31\x36\x2c\x2d\x30\x2e\x33\x36\x30\
+\x30\x38\x20\x2d\x30\x2e\x31\x36\x32\x39\x39\x2c\x2d\x30\x2e\x37\
+\x33\x31\x30\x33\x20\x2d\x30\x2e\x32\x37\x34\x37\x34\x2c\x2d\x31\
+\x2e\x30\x38\x31\x30\x31\x20\x2d\x30\x2e\x30\x33\x37\x32\x2c\x2d\
+\x30\x2e\x32\x30\x38\x37\x35\x20\x2d\x30\x2e\x30\x38\x39\x32\x2c\
+\x2d\x30\x2e\x35\x39\x30\x35\x38\x20\x2d\x30\x2e\x31\x31\x31\x35\
+\x39\x2c\x2d\x31\x2e\x30\x30\x39\x36\x20\x7a\x20\x6d\x20\x2d\x31\
+\x34\x34\x2e\x30\x37\x37\x35\x2c\x2d\x37\x33\x2e\x36\x32\x32\x31\
+\x37\x20\x63\x20\x34\x2e\x31\x38\x33\x35\x38\x2c\x2d\x31\x2e\x30\
+\x37\x34\x30\x31\x20\x32\x31\x2e\x34\x38\x31\x31\x38\x2c\x2d\x35\
+\x2e\x34\x31\x38\x32\x32\x20\x32\x37\x2e\x31\x38\x34\x39\x34\x2c\
+\x2d\x36\x2e\x39\x30\x31\x31\x36\x20\x39\x2e\x30\x36\x37\x38\x35\
+\x2c\x2d\x32\x2e\x33\x32\x31\x31\x32\x20\x31\x38\x2e\x30\x30\x33\
+\x37\x37\x2c\x2d\x31\x2e\x34\x32\x30\x31\x36\x20\x32\x34\x2e\x39\
+\x38\x30\x32\x33\x2c\x31\x2e\x39\x34\x20\x6c\x20\x30\x2e\x32\x33\
+\x32\x38\x2c\x30\x2e\x31\x30\x33\x39\x35\x20\x76\x20\x30\x20\x6c\
+\x20\x30\x2e\x31\x30\x32\x34\x38\x2c\x30\x2e\x30\x34\x37\x36\x20\
+\x30\x2e\x31\x34\x33\x36\x32\x2c\x30\x2e\x30\x37\x37\x38\x20\x30\
+\x2e\x30\x37\x31\x32\x2c\x30\x2e\x30\x33\x38\x31\x20\x30\x2e\x31\
+\x34\x33\x35\x38\x2c\x30\x2e\x30\x37\x37\x35\x20\x30\x2e\x30\x37\
+\x31\x34\x2c\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x34\x33\x36\
+\x36\x2c\x30\x2e\x30\x37\x37\x35\x20\x30\x2e\x30\x37\x31\x35\x2c\
+\x30\x2e\x30\x33\x37\x38\x20\x30\x2e\x31\x34\x33\x36\x2c\x30\x2e\
+\x30\x37\x37\x35\x20\x30\x2e\x30\x37\x31\x35\x2c\x30\x2e\x30\x33\
+\x37\x39\x20\x30\x2e\x31\x34\x33\x35\x39\x2c\x30\x2e\x30\x37\x37\
+\x36\x20\x30\x2e\x30\x37\x31\x36\x2c\x30\x2e\x30\x33\x37\x39\x20\
+\x30\x2e\x31\x34\x33\x36\x31\x2c\x30\x2e\x30\x37\x37\x35\x20\x30\
+\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\
+\x34\x33\x36\x32\x2c\x30\x2e\x30\x37\x37\x34\x20\x30\x2e\x30\x37\
+\x31\x34\x2c\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x34\x33\x35\
+\x37\x2c\x30\x2e\x30\x37\x37\x35\x20\x30\x2e\x30\x37\x31\x36\x2c\
+\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x34\x33\x36\x2c\x30\x2e\
+\x30\x37\x37\x38\x20\x30\x2e\x30\x37\x31\x35\x2c\x30\x2e\x30\x33\
+\x38\x31\x20\x30\x2e\x31\x32\x33\x32\x36\x2c\x30\x2e\x30\x38\x36\
+\x37\x20\x30\x2e\x30\x37\x31\x32\x2c\x30\x2e\x30\x33\x38\x31\x20\
+\x30\x2e\x31\x32\x33\x33\x32\x2c\x30\x2e\x30\x38\x36\x36\x20\x30\
+\x2e\x30\x37\x31\x35\x2c\x30\x2e\x30\x33\x38\x31\x20\x30\x2e\x31\
+\x32\x33\x33\x31\x2c\x30\x2e\x30\x38\x36\x36\x20\x30\x2e\x30\x37\
+\x31\x34\x2c\x30\x2e\x30\x33\x38\x31\x20\x30\x2e\x31\x31\x33\x33\
+\x34\x2c\x30\x2e\x30\x36\x37\x37\x20\x30\x2e\x30\x37\x31\x33\x2c\
+\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x31\x33\x33\x33\x2c\x30\
+\x2e\x30\x36\x37\x35\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\
+\x33\x37\x39\x20\x30\x2e\x31\x31\x33\x33\x33\x2c\x30\x2e\x30\x36\
+\x37\x35\x20\x30\x2e\x30\x37\x31\x33\x2c\x30\x2e\x30\x33\x38\x20\
+\x30\x2e\x31\x31\x33\x33\x34\x2c\x30\x2e\x30\x36\x37\x35\x20\x30\
+\x2e\x30\x37\x31\x33\x2c\x30\x2e\x30\x33\x38\x20\x30\x2e\x31\x31\
+\x33\x33\x33\x2c\x30\x2e\x30\x36\x37\x36\x20\x30\x2e\x30\x35\x31\
+\x39\x2c\x30\x2e\x30\x34\x38\x38\x20\x30\x2e\x31\x31\x33\x33\x34\
+\x2c\x30\x2e\x30\x36\x37\x36\x20\x30\x2e\x30\x34\x31\x2c\x30\x2e\
+\x30\x32\x38\x36\x20\x30\x2e\x31\x31\x33\x33\x33\x2c\x30\x2e\x30\
+\x36\x37\x37\x20\x30\x2e\x30\x34\x31\x32\x2c\x30\x2e\x30\x32\x38\
+\x37\x20\x30\x2e\x31\x31\x33\x33\x33\x2c\x30\x2e\x30\x36\x37\x34\
+\x20\x30\x2e\x30\x34\x31\x33\x2c\x30\x2e\x30\x32\x38\x34\x20\x30\
+\x2e\x31\x31\x33\x33\x34\x2c\x30\x2e\x30\x36\x37\x37\x20\x30\x2e\
+\x30\x34\x31\x2c\x30\x2e\x30\x32\x38\x36\x20\x30\x2e\x30\x39\x33\
+\x31\x2c\x30\x2e\x30\x37\x37\x35\x20\x30\x2e\x30\x34\x31\x2c\x30\
+\x2e\x30\x32\x38\x34\x20\x30\x2e\x31\x31\x33\x33\x34\x2c\x30\x2e\
+\x30\x36\x37\x34\x20\x30\x2e\x31\x35\x35\x31\x36\x2c\x30\x2e\x30\
+\x39\x36\x32\x20\x63\x20\x30\x2e\x31\x31\x33\x33\x34\x2c\x30\x2e\
+\x30\x36\x37\x37\x20\x30\x2e\x32\x31\x36\x34\x39\x2c\x30\x2e\x31\
+\x36\x35\x33\x20\x30\x2e\x33\x32\x39\x38\x34\x2c\x30\x2e\x32\x33\
+\x32\x38\x32\x20\x76\x20\x30\x20\x61\x20\x32\x31\x2e\x31\x34\x37\
+\x34\x33\x39\x2c\x32\x31\x2e\x31\x34\x37\x34\x33\x39\x20\x30\x20\
+\x30\x20\x31\x20\x37\x2e\x34\x39\x34\x38\x31\x2c\x31\x30\x2e\x37\
+\x33\x37\x30\x34\x20\x76\x20\x30\x20\x6c\x20\x30\x2e\x30\x33\x31\
+\x37\x2c\x30\x2e\x30\x35\x39\x38\x20\x63\x20\x30\x2e\x30\x33\x33\
+\x36\x2c\x30\x2e\x31\x31\x30\x32\x35\x20\x30\x2e\x30\x37\x37\x36\
+\x2c\x30\x2e\x32\x33\x39\x37\x36\x20\x30\x2e\x31\x31\x30\x39\x2c\
+\x30\x2e\x33\x34\x39\x39\x37\x20\x6c\x20\x30\x2e\x30\x30\x39\x2c\
+\x30\x2e\x30\x32\x30\x34\x20\x30\x2e\x30\x36\x34\x35\x2c\x30\x2e\
+\x31\x31\x38\x37\x20\x63\x20\x30\x2e\x30\x34\x35\x38\x2c\x30\x2e\
+\x31\x38\x30\x30\x39\x20\x30\x2e\x31\x30\x30\x39\x31\x2c\x30\x2e\
+\x33\x32\x39\x38\x35\x20\x30\x2e\x31\x34\x36\x36\x38\x2c\x30\x2e\
+\x35\x30\x39\x38\x36\x20\x61\x20\x33\x2e\x30\x36\x37\x36\x32\x34\
+\x37\x2c\x33\x2e\x30\x36\x37\x36\x32\x34\x37\x20\x30\x20\x30\x20\
+\x31\x20\x30\x2e\x30\x39\x37\x37\x2c\x30\x2e\x35\x36\x31\x39\x31\
+\x20\x6c\x20\x30\x2e\x30\x36\x34\x33\x2c\x30\x2e\x31\x31\x38\x36\
+\x39\x20\x30\x2e\x30\x30\x39\x2c\x30\x2e\x30\x32\x30\x35\x20\x61\
+\x20\x31\x2e\x37\x30\x37\x32\x35\x33\x34\x2c\x31\x2e\x37\x30\x37\
+\x32\x35\x33\x37\x20\x30\x20\x30\x20\x30\x20\x30\x2e\x30\x39\x31\
+\x36\x2c\x30\x2e\x33\x36\x30\x30\x34\x20\x6c\x20\x30\x2e\x30\x33\
+\x31\x38\x2c\x30\x2e\x30\x36\x20\x76\x20\x30\x20\x61\x20\x32\x31\
+\x2e\x32\x31\x37\x32\x38\x33\x2c\x32\x31\x2e\x32\x31\x37\x32\x38\
+\x33\x20\x30\x20\x30\x20\x31\x20\x2d\x31\x2e\x33\x39\x36\x38\x37\
+\x2c\x31\x33\x2e\x30\x31\x32\x33\x34\x20\x76\x20\x30\x20\x6c\x20\
+\x2d\x30\x2e\x31\x36\x30\x36\x36\x2c\x30\x2e\x33\x36\x37\x38\x36\
+\x20\x2d\x30\x2e\x30\x38\x35\x33\x2c\x30\x2e\x31\x37\x33\x38\x38\
+\x20\x2d\x30\x2e\x30\x36\x37\x34\x2c\x30\x2e\x31\x31\x33\x33\x34\
+\x20\x2d\x30\x2e\x30\x31\x38\x36\x2c\x30\x2e\x30\x36\x31\x31\x20\
+\x2d\x30\x2e\x30\x34\x37\x33\x2c\x30\x2e\x31\x30\x32\x35\x38\x20\
+\x2d\x30\x2e\x30\x31\x38\x36\x2c\x30\x2e\x30\x36\x31\x34\x20\x2d\
+\x30\x2e\x30\x36\x37\x36\x2c\x30\x2e\x31\x31\x33\x33\x32\x20\x2d\
+\x30\x2e\x30\x31\x38\x36\x2c\x30\x2e\x30\x36\x31\x20\x2d\x30\x2e\
+\x30\x36\x37\x35\x2c\x30\x2e\x31\x31\x33\x33\x32\x20\x2d\x30\x2e\
+\x30\x31\x38\x36\x2c\x30\x2e\x30\x36\x31\x33\x20\x2d\x30\x2e\x30\
+\x36\x37\x35\x2c\x30\x2e\x31\x31\x33\x33\x34\x20\x2d\x30\x2e\x30\
+\x31\x38\x35\x2c\x30\x2e\x30\x36\x31\x32\x20\x2d\x30\x2e\x30\x36\
+\x37\x37\x2c\x30\x2e\x31\x31\x33\x33\x33\x20\x2d\x30\x2e\x30\x31\
+\x38\x36\x2c\x30\x2e\x30\x36\x31\x33\x20\x2d\x30\x2e\x30\x36\x37\
+\x33\x2c\x30\x2e\x31\x31\x33\x33\x33\x20\x2d\x30\x2e\x30\x31\x38\
+\x35\x2c\x30\x2e\x30\x36\x31\x33\x20\x2d\x30\x2e\x30\x36\x37\x37\
+\x2c\x30\x2e\x31\x31\x33\x33\x34\x20\x2d\x30\x2e\x30\x33\x37\x39\
+\x2c\x30\x2e\x30\x37\x31\x37\x20\x2d\x30\x2e\x30\x36\x37\x35\x2c\
+\x30\x2e\x31\x31\x33\x33\x34\x20\x2d\x30\x2e\x30\x33\x37\x39\x2c\
+\x30\x2e\x30\x37\x31\x37\x20\x2d\x30\x2e\x30\x36\x37\x37\x2c\x30\
+\x2e\x31\x31\x33\x33\x34\x20\x2d\x30\x2e\x30\x33\x37\x39\x2c\x30\
+\x2e\x30\x37\x31\x34\x20\x2d\x30\x2e\x30\x36\x37\x37\x2c\x30\x2e\
+\x31\x31\x33\x33\x34\x20\x2d\x30\x2e\x30\x33\x37\x38\x2c\x30\x2e\
+\x30\x37\x31\x33\x20\x2d\x30\x2e\x30\x38\x36\x38\x2c\x30\x2e\x31\
+\x32\x33\x33\x31\x20\x2d\x30\x2e\x30\x33\x38\x31\x2c\x30\x2e\x30\
+\x37\x31\x34\x20\x2d\x30\x2e\x30\x38\x36\x36\x2c\x30\x2e\x31\x32\
+\x33\x33\x33\x20\x2d\x30\x2e\x30\x33\x38\x31\x2c\x30\x2e\x30\x37\
+\x31\x34\x20\x2d\x30\x2e\x30\x38\x36\x38\x2c\x30\x2e\x31\x32\x33\
+\x32\x37\x20\x2d\x30\x2e\x30\x33\x37\x38\x2c\x30\x2e\x30\x37\x31\
+\x35\x20\x2d\x30\x2e\x30\x38\x37\x31\x2c\x30\x2e\x31\x32\x33\x33\
+\x33\x20\x2d\x30\x2e\x30\x33\x38\x31\x2c\x30\x2e\x30\x37\x31\x36\
+\x20\x2d\x30\x2e\x30\x38\x36\x38\x2c\x30\x2e\x31\x32\x33\x33\x33\
+\x20\x2d\x30\x2e\x30\x33\x37\x39\x2c\x30\x2e\x30\x37\x31\x34\x20\
+\x2d\x30\x2e\x30\x38\x36\x36\x2c\x30\x2e\x31\x32\x33\x32\x35\x20\
+\x2d\x30\x2e\x30\x33\x38\x33\x2c\x30\x2e\x30\x37\x31\x37\x20\x2d\
+\x30\x2e\x30\x38\x36\x36\x2c\x30\x2e\x31\x32\x33\x33\x20\x2d\x30\
+\x2e\x30\x33\x37\x38\x2c\x30\x2e\x30\x37\x31\x34\x20\x2d\x30\x2e\
+\x30\x38\x36\x37\x2c\x30\x2e\x31\x32\x33\x32\x39\x20\x2d\x30\x2e\
+\x30\x33\x37\x39\x2c\x30\x2e\x30\x37\x31\x36\x20\x2d\x30\x2e\x31\
+\x30\x37\x31\x36\x2c\x30\x2e\x31\x33\x34\x32\x37\x20\x2d\x30\x2e\
+\x30\x33\x38\x31\x2c\x30\x2e\x30\x37\x31\x39\x20\x2d\x30\x2e\x31\
+\x30\x36\x39\x34\x2c\x30\x2e\x31\x33\x34\x32\x38\x20\x2d\x30\x2e\
+\x30\x33\x38\x2c\x30\x2e\x30\x37\x31\x37\x20\x2d\x30\x2e\x31\x30\
+\x36\x39\x34\x2c\x30\x2e\x31\x33\x34\x32\x33\x20\x2d\x30\x2e\x30\
+\x33\x37\x39\x2c\x30\x2e\x30\x37\x31\x37\x20\x2d\x30\x2e\x31\x30\
+\x37\x31\x36\x2c\x30\x2e\x31\x33\x34\x33\x20\x2d\x30\x2e\x30\x37\
+\x37\x34\x2c\x30\x2e\x30\x39\x33\x32\x20\x76\x20\x30\x20\x6c\x20\
+\x2d\x30\x2e\x31\x34\x35\x30\x37\x2c\x30\x2e\x32\x30\x36\x34\x20\
+\x63\x20\x2d\x34\x2e\x35\x30\x39\x34\x37\x2c\x36\x2e\x33\x31\x38\
+\x34\x32\x20\x2d\x31\x31\x2e\x38\x39\x39\x35\x34\x2c\x31\x31\x2e\
+\x34\x32\x33\x31\x32\x20\x2d\x32\x30\x2e\x39\x36\x37\x34\x2c\x31\
+\x33\x2e\x37\x34\x34\x32\x31\x20\x2d\x35\x2e\x37\x31\x34\x36\x35\
+\x2c\x31\x2e\x34\x36\x33\x35\x33\x20\x2d\x32\x32\x2e\x39\x37\x30\
+\x33\x35\x2c\x35\x2e\x39\x38\x37\x37\x36\x20\x2d\x32\x37\x2e\x31\
+\x34\x39\x39\x37\x2c\x37\x2e\x30\x36\x31\x38\x20\x7a\x20\x6d\x20\
+\x39\x35\x2e\x38\x34\x38\x33\x33\x2c\x38\x34\x2e\x33\x37\x31\x36\
+\x39\x20\x30\x2e\x30\x36\x34\x35\x2c\x30\x2e\x31\x31\x38\x37\x36\
+\x20\x30\x2e\x30\x30\x39\x2c\x30\x2e\x30\x32\x30\x32\x20\x63\x20\
+\x30\x2e\x30\x32\x34\x34\x2c\x30\x2e\x31\x34\x30\x34\x34\x20\x30\
+\x2e\x30\x35\x38\x32\x2c\x30\x2e\x32\x35\x30\x36\x37\x20\x30\x2e\
+\x30\x38\x32\x2c\x30\x2e\x33\x38\x38\x30\x35\x20\x76\x20\x30\x20\
+\x6c\x20\x30\x2e\x30\x30\x39\x2c\x30\x2e\x30\x32\x30\x32\x20\x76\
+\x20\x30\x20\x6c\x20\x30\x2e\x30\x30\x39\x2c\x30\x2e\x30\x32\x30\
+\x34\x20\x30\x2e\x30\x30\x39\x2c\x30\x2e\x30\x32\x30\x33\x20\x30\
+\x2e\x30\x30\x39\x2c\x30\x2e\x30\x32\x30\x34\x20\x76\x20\x30\x20\
+\x61\x20\x32\x31\x2e\x37\x39\x36\x31\x39\x36\x2c\x32\x31\x2e\x37\
+\x39\x36\x31\x39\x36\x20\x30\x20\x30\x20\x31\x20\x2d\x31\x2e\x39\
+\x37\x31\x38\x33\x2c\x31\x34\x2e\x32\x31\x39\x38\x39\x20\x76\x20\
+\x30\x20\x6c\x20\x2d\x30\x2e\x32\x31\x39\x36\x33\x2c\x30\x2e\x33\
+\x39\x39\x36\x35\x20\x2d\x30\x2e\x31\x30\x35\x35\x32\x2c\x30\x2e\
+\x31\x38\x34\x36\x38\x20\x2d\x30\x2e\x30\x37\x37\x36\x2c\x30\x2e\
+\x31\x34\x33\x36\x33\x20\x2d\x30\x2e\x30\x33\x38\x2c\x30\x2e\x30\
+\x37\x31\x37\x20\x2d\x30\x2e\x30\x36\x37\x35\x2c\x30\x2e\x31\x31\
+\x33\x33\x33\x20\x2d\x30\x2e\x30\x33\x37\x38\x2c\x30\x2e\x30\x37\
+\x31\x33\x20\x2d\x30\x2e\x30\x36\x37\x37\x2c\x30\x2e\x31\x31\x33\
+\x33\x34\x20\x2d\x30\x2e\x30\x33\x37\x39\x2c\x30\x2e\x30\x37\x31\
+\x36\x20\x2d\x30\x2e\x30\x38\x36\x38\x2c\x30\x2e\x31\x32\x33\x32\
+\x34\x20\x2d\x30\x2e\x30\x33\x38\x2c\x30\x2e\x30\x37\x31\x33\x20\
+\x2d\x30\x2e\x30\x38\x36\x38\x2c\x30\x2e\x31\x32\x33\x33\x33\x20\
+\x2d\x30\x2e\x30\x33\x38\x2c\x30\x2e\x30\x37\x31\x34\x20\x2d\x30\
+\x2e\x30\x38\x36\x38\x2c\x30\x2e\x31\x32\x33\x33\x33\x20\x2d\x30\
+\x2e\x30\x33\x38\x2c\x30\x2e\x30\x37\x31\x34\x20\x2d\x30\x2e\x30\
+\x38\x36\x38\x2c\x30\x2e\x31\x32\x33\x33\x31\x20\x2d\x30\x2e\x30\
+\x33\x37\x38\x2c\x30\x2e\x30\x37\x31\x33\x20\x2d\x30\x2e\x30\x38\
+\x36\x35\x2c\x30\x2e\x31\x32\x33\x33\x32\x20\x2d\x30\x2e\x30\x33\
+\x37\x38\x2c\x30\x2e\x30\x37\x31\x34\x20\x2d\x30\x2e\x30\x38\x36\
+\x37\x2c\x30\x2e\x31\x32\x33\x32\x39\x20\x2d\x30\x2e\x30\x33\x37\
+\x39\x2c\x30\x2e\x30\x37\x31\x34\x20\x2d\x30\x2e\x30\x38\x36\x36\
+\x2c\x30\x2e\x31\x32\x33\x33\x20\x2d\x30\x2e\x30\x33\x37\x39\x2c\
+\x30\x2e\x30\x37\x31\x36\x20\x2d\x30\x2e\x30\x38\x37\x31\x2c\x30\
+\x2e\x31\x32\x33\x33\x20\x2d\x30\x2e\x30\x33\x38\x2c\x30\x2e\x30\
+\x37\x31\x35\x20\x2d\x30\x2e\x30\x38\x36\x37\x2c\x30\x2e\x31\x32\
+\x33\x32\x35\x20\x2d\x30\x2e\x30\x33\x38\x31\x2c\x30\x2e\x30\x37\
+\x31\x37\x20\x2d\x30\x2e\x31\x30\x37\x30\x35\x2c\x30\x2e\x31\x33\
+\x34\x33\x35\x20\x2d\x30\x2e\x30\x33\x37\x38\x2c\x30\x2e\x30\x37\
+\x31\x34\x20\x2d\x30\x2e\x31\x30\x37\x31\x36\x2c\x30\x2e\x31\x33\
+\x34\x32\x31\x20\x2d\x30\x2e\x30\x33\x38\x2c\x30\x2e\x30\x37\x31\
+\x34\x20\x2d\x30\x2e\x30\x39\x36\x32\x2c\x30\x2e\x31\x35\x35\x31\
+\x37\x20\x2d\x30\x2e\x30\x33\x38\x2c\x30\x2e\x30\x37\x31\x35\x20\
+\x2d\x30\x2e\x30\x39\x36\x32\x2c\x30\x2e\x31\x35\x35\x32\x31\x20\
+\x2d\x30\x2e\x30\x33\x37\x39\x2c\x30\x2e\x30\x37\x31\x36\x20\x2d\
+\x30\x2e\x30\x39\x36\x32\x2c\x30\x2e\x31\x35\x35\x31\x37\x20\x2d\
+\x30\x2e\x30\x35\x38\x33\x2c\x30\x2e\x30\x38\x32\x34\x20\x2d\x30\
+\x2e\x30\x39\x36\x32\x2c\x30\x2e\x31\x35\x35\x32\x20\x2d\x30\x2e\
+\x30\x35\x38\x34\x2c\x30\x2e\x30\x38\x32\x34\x20\x2d\x30\x2e\x31\
+\x31\x36\x33\x35\x2c\x30\x2e\x31\x36\x34\x35\x34\x20\x2d\x30\x2e\
+\x30\x35\x38\x33\x2c\x30\x2e\x30\x38\x32\x32\x20\x2d\x30\x2e\x31\
+\x31\x36\x33\x36\x2c\x30\x2e\x31\x36\x34\x35\x31\x20\x2d\x30\x2e\
+\x30\x35\x38\x33\x2c\x30\x2e\x30\x38\x32\x31\x20\x2d\x30\x2e\x31\
+\x31\x36\x33\x39\x2c\x30\x2e\x31\x36\x34\x35\x20\x2d\x30\x2e\x30\
+\x35\x38\x32\x2c\x30\x2e\x30\x38\x32\x34\x20\x2d\x30\x2e\x31\x31\
+\x37\x30\x36\x2c\x30\x2e\x31\x36\x34\x35\x36\x20\x2d\x30\x2e\x30\
+\x35\x38\x32\x2c\x30\x2e\x30\x38\x32\x34\x20\x2d\x30\x2e\x31\x31\
+\x36\x33\x2c\x30\x2e\x31\x36\x34\x34\x37\x20\x2d\x30\x2e\x30\x39\
+\x37\x37\x2c\x30\x2e\x31\x30\x33\x37\x34\x20\x76\x20\x30\x20\x6c\
+\x20\x2d\x30\x2e\x31\x38\x34\x37\x32\x2c\x30\x2e\x32\x32\x37\x33\
+\x36\x20\x63\x20\x2d\x35\x2e\x34\x37\x36\x33\x39\x2c\x36\x2e\x39\
+\x39\x33\x35\x37\x20\x2d\x31\x34\x2e\x33\x30\x39\x38\x37\x2c\x31\
+\x32\x2e\x37\x34\x36\x31\x39\x20\x2d\x32\x35\x2e\x30\x33\x38\x34\
+\x31\x2c\x31\x35\x2e\x35\x30\x30\x33\x34\x20\x2d\x36\x2e\x37\x36\
+\x36\x31\x31\x2c\x31\x2e\x37\x34\x36\x38\x31\x20\x2d\x32\x37\x2e\
+\x32\x30\x39\x37\x2c\x37\x2e\x30\x39\x33\x36\x33\x20\x2d\x33\x32\
+\x2e\x31\x38\x34\x30\x38\x2c\x38\x2e\x33\x36\x33\x32\x32\x20\x6c\
+\x20\x2d\x31\x33\x2e\x39\x32\x30\x33\x2c\x2d\x35\x34\x2e\x31\x35\
+\x37\x32\x20\x63\x20\x34\x2e\x39\x36\x36\x36\x2c\x2d\x31\x2e\x32\
+\x38\x39\x37\x32\x20\x32\x35\x2e\x34\x36\x34\x35\x33\x2c\x2d\x36\
+\x2e\x34\x33\x36\x33\x36\x20\x33\x32\x2e\x32\x32\x39\x38\x35\x2c\
+\x2d\x38\x2e\x31\x38\x33\x31\x36\x20\x31\x30\x2e\x37\x32\x39\x33\
+\x36\x2c\x2d\x32\x2e\x37\x35\x34\x31\x20\x32\x31\x2e\x32\x36\x33\
+\x31\x2c\x2d\x31\x2e\x39\x37\x32\x36\x38\x20\x32\x39\x2e\x34\x30\
+\x34\x33\x36\x2c\x31\x2e\x35\x30\x33\x39\x34\x20\x6c\x20\x30\x2e\
+\x32\x36\x35\x34\x32\x2c\x30\x2e\x31\x31\x33\x33\x33\x20\x76\x20\
+\x30\x20\x6c\x20\x30\x2e\x31\x33\x32\x37\x31\x2c\x30\x2e\x30\x35\
+\x36\x37\x20\x30\x2e\x31\x39\x34\x2c\x30\x2e\x30\x37\x37\x33\x20\
+\x30\x2e\x30\x39\x31\x37\x2c\x30\x2e\x30\x32\x37\x33\x20\x30\x2e\
+\x31\x37\x33\x38\x34\x2c\x30\x2e\x30\x38\x35\x32\x20\x30\x2e\x30\
+\x39\x31\x33\x2c\x30\x2e\x30\x32\x37\x20\x30\x2e\x31\x37\x33\x37\
+\x38\x2c\x30\x2e\x30\x38\x35\x33\x20\x30\x2e\x30\x39\x31\x38\x2c\
+\x30\x2e\x30\x32\x37\x31\x20\x30\x2e\x31\x37\x33\x38\x33\x2c\x30\
+\x2e\x30\x38\x35\x33\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\
+\x33\x38\x31\x20\x30\x2e\x31\x37\x33\x39\x2c\x30\x2e\x30\x38\x35\
+\x33\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\x33\x37\x38\x20\
+\x30\x2e\x31\x37\x33\x38\x34\x2c\x30\x2e\x30\x38\x35\x33\x20\x30\
+\x2e\x30\x37\x31\x33\x2c\x30\x2e\x30\x33\x37\x38\x20\x30\x2e\x31\
+\x37\x33\x38\x38\x2c\x30\x2e\x30\x38\x35\x33\x20\x30\x2e\x30\x37\
+\x31\x34\x2c\x30\x2e\x30\x33\x38\x20\x30\x2e\x31\x34\x33\x35\x39\
+\x2c\x30\x2e\x30\x37\x37\x38\x20\x30\x2e\x30\x37\x31\x32\x2c\x30\
+\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x34\x33\x36\x32\x2c\x30\x2e\
+\x30\x37\x37\x37\x20\x30\x2e\x30\x37\x31\x32\x2c\x30\x2e\x30\x33\
+\x37\x39\x20\x30\x2e\x31\x34\x33\x36\x34\x2c\x30\x2e\x30\x37\x37\
+\x34\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\x33\x38\x31\x20\
+\x30\x2e\x31\x34\x33\x36\x31\x2c\x30\x2e\x30\x37\x37\x36\x20\x30\
+\x2e\x30\x37\x31\x33\x2c\x30\x2e\x30\x33\x38\x33\x20\x30\x2e\x31\
+\x34\x33\x36\x37\x2c\x30\x2e\x30\x37\x37\x36\x20\x30\x2e\x30\x37\
+\x31\x34\x2c\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x34\x33\x36\
+\x2c\x30\x2e\x30\x37\x37\x35\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\
+\x2e\x30\x33\x37\x36\x20\x30\x2e\x31\x34\x33\x36\x35\x2c\x30\x2e\
+\x30\x37\x37\x36\x20\x30\x2e\x30\x37\x31\x33\x2c\x30\x2e\x30\x33\
+\x38\x33\x20\x30\x2e\x31\x34\x33\x36\x36\x2c\x30\x2e\x30\x37\x37\
+\x36\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\x33\x38\x33\x20\
+\x30\x2e\x31\x34\x33\x36\x39\x2c\x30\x2e\x30\x37\x37\x35\x20\x30\
+\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\x33\x38\x31\x20\x30\x2e\x31\
+\x32\x33\x33\x33\x2c\x30\x2e\x30\x38\x36\x39\x20\x30\x2e\x30\x37\
+\x31\x34\x2c\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x32\x33\x33\
+\x32\x2c\x30\x2e\x30\x38\x36\x36\x20\x30\x2e\x30\x37\x31\x34\x2c\
+\x30\x2e\x30\x33\x38\x31\x20\x30\x2e\x31\x32\x33\x32\x38\x2c\x30\
+\x2e\x30\x38\x36\x36\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\
+\x33\x37\x39\x20\x30\x2e\x31\x32\x33\x32\x38\x2c\x30\x2e\x30\x38\
+\x36\x36\x20\x30\x2e\x30\x37\x31\x36\x2c\x30\x2e\x30\x33\x38\x20\
+\x30\x2e\x31\x32\x33\x33\x2c\x30\x2e\x30\x38\x36\x38\x20\x30\x2e\
+\x30\x37\x31\x34\x2c\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x31\
+\x33\x33\x34\x2c\x30\x2e\x30\x36\x37\x35\x20\x30\x2e\x30\x37\x31\
+\x34\x2c\x30\x2e\x30\x33\x38\x20\x30\x2e\x31\x32\x33\x33\x2c\x30\
+\x2e\x30\x38\x36\x38\x20\x30\x2e\x31\x36\x34\x35\x36\x2c\x30\x2e\
+\x31\x31\x36\x34\x20\x63\x20\x30\x2e\x31\x32\x33\x33\x32\x2c\x30\
+\x2e\x30\x38\x36\x36\x20\x30\x2e\x32\x36\x36\x39\x32\x2c\x30\x2e\
+\x31\x36\x33\x37\x36\x20\x30\x2e\x33\x38\x37\x39\x38\x2c\x30\x2e\
+\x32\x35\x30\x37\x20\x76\x20\x30\x20\x61\x20\x32\x31\x2e\x38\x36\
+\x32\x31\x36\x32\x2c\x32\x31\x2e\x38\x36\x32\x31\x36\x20\x30\x20\
+\x30\x20\x31\x20\x38\x2e\x35\x37\x37\x34\x31\x2c\x31\x31\x2e\x35\
+\x31\x31\x35\x31\x20\x76\x20\x30\x20\x6c\x20\x30\x2e\x30\x34\x32\
+\x37\x2c\x30\x2e\x30\x37\x37\x36\x20\x63\x20\x30\x2e\x30\x34\x34\
+\x32\x2c\x30\x2e\x31\x32\x39\x36\x34\x20\x30\x2e\x30\x37\x37\x36\
+\x2c\x30\x2e\x32\x33\x39\x38\x31\x20\x30\x2e\x31\x32\x31\x39\x33\
+\x2c\x30\x2e\x33\x36\x39\x34\x33\x20\x6c\x20\x30\x2e\x30\x30\x39\
+\x2c\x30\x2e\x30\x32\x30\x35\x20\x30\x2e\x30\x36\x34\x35\x2c\x30\
+\x2e\x31\x31\x38\x37\x33\x20\x63\x20\x30\x2e\x30\x34\x35\x39\x2c\
+\x30\x2e\x31\x38\x30\x30\x36\x20\x30\x2e\x30\x39\x31\x38\x2c\x30\
+\x2e\x33\x36\x30\x30\x38\x20\x30\x2e\x31\x34\x38\x32\x34\x2c\x30\
+\x2e\x35\x36\x30\x32\x37\x20\x30\x2e\x31\x30\x30\x30\x37\x2c\x30\
+\x2e\x30\x34\x34\x33\x20\x30\x2e\x31\x31\x36\x33\x37\x2c\x30\x2e\
+\x32\x36\x35\x34\x33\x20\x30\x2e\x30\x38\x34\x36\x2c\x30\x2e\x35\
+\x33\x38\x35\x38\x20\x7a\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\
+\x64\x3d\x22\x70\x61\x74\x68\x31\x31\x30\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x64\x69\x73\x70\x6c\x61\
+\x79\x3a\x69\x6e\x6c\x69\x6e\x65\x3b\x66\x69\x6c\x6c\x3a\x23\x66\
+\x66\x66\x66\x66\x66\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\
+\x74\x68\x3a\x30\x2e\x37\x37\x36\x30\x32\x34\x34\x22\x20\x2f\x3e\
+\x0a\x20\x20\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\
+\x00\x00\x04\xc3\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x50\x00\x00\x00\x50\x08\x03\x00\x00\x00\xb9\xcf\x02\x9f\
+\x00\x00\x01\xa7\x50\x4c\x54\x45\x00\x00\x00\xff\xff\xff\xff\xff\
+\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xf8\xf8\xf8\xf8\xf8\
+\xf8\xf8\xf8\xf8\xf8\xf8\xfa\xfa\xfa\xfa\xfa\xfa\xfa\xfa\xfa\xf8\
+\xf8\xf8\xf8\xf8\xf8\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xfa\xfa\
+\xfa\xf8\xf8\xf8\xf8\xf8\xf8\xf8\xf8\xf8\xf9\xf9\xf9\xf9\xf9\xf9\
+\xfa\xfa\xfa\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\
+\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\
+\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\
+\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\
+\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\
+\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\x00\xcc\x33\x06\xcd\x38\
+\x07\xcd\x38\x0c\xce\x3c\x0d\xce\x3d\x14\xd0\x43\x15\xd0\x43\x16\
+\xd0\x45\x23\xd2\x4f\x24\xd3\x50\x25\xd3\x51\x33\x37\x45\x34\xd5\
+\x5c\x35\xd6\x5d\x36\x3a\x48\x37\x3b\x49\x39\xd6\x60\x3a\xd6\x61\
+\x3c\x3f\x4d\x3c\x40\x4d\x3c\xd7\x62\x3d\xd7\x63\x3f\x42\x50\x4c\
+\x4f\x5c\x4d\x50\x5c\x50\x53\x5f\x56\x59\x65\x57\x5a\x65\x5b\x5e\
+\x69\x5b\x5f\x6a\x60\x63\x6e\x61\x64\x6f\x72\xe1\x8e\x73\xe1\x8f\
+\x75\x78\x81\x79\x7b\x85\x7e\x81\x89\x7f\x82\x8a\x89\x8b\x93\x8a\
+\x8c\x94\x8b\x8d\x95\x8c\x8e\x95\x99\xe8\xad\x9a\xe8\xae\x9b\xe8\
+\xae\x9c\x9e\xa5\xa4\xa5\xab\xb3\xb5\xb9\xb5\xb7\xbc\xb5\xed\xc3\
+\xb6\xb8\xbc\xb7\xb8\xbd\xb7\xed\xc4\xb9\xed\xc6\xbb\xee\xc8\xbc\
+\xee\xc9\xbd\xee\xca\xbf\xc0\xc4\xc0\xc1\xc5\xc1\xc2\xc6\xc5\xc6\
+\xca\xc6\xc7\xca\xc7\xc8\xcb\xca\xcb\xcf\xce\xcf\xd2\xd1\xd2\xd5\
+\xd3\xf2\xdb\xd4\xf2\xdb\xd5\xd5\xd8\xd5\xd6\xd9\xd5\xf2\xdc\xd7\
+\xd8\xda\xd8\xd9\xdb\xd9\xda\xdc\xd9\xf3\xdf\xda\xf3\xe0\xe2\xe2\
+\xe4\xea\xeb\xec\xeb\xeb\xec\xee\xee\xef\xf2\xf2\xf2\xf4\xf4\xf5\
+\xf6\xf8\xf7\xf7\xf9\xf7\xf8\xf8\xf8\xf8\xf9\xf8\xf9\xf9\xf9\x88\
+\xb5\x74\x7f\x00\x00\x00\x36\x74\x52\x4e\x53\x00\x01\x02\x03\x04\
+\x11\x23\x24\x25\x27\x34\x35\x36\x4b\x4e\x52\x53\x55\x5e\x6e\x6f\
+\x70\x77\x78\x8d\x9f\xa1\xa2\xa3\xaa\xab\xac\xaf\xc5\xc6\xcc\xcd\
+\xce\xd2\xd3\xd4\xe3\xe4\xed\xee\xef\xf0\xf6\xf7\xfa\xfb\xfc\xfd\
+\xfe\x4e\x62\xca\xe0\x00\x00\x02\x95\x49\x44\x41\x54\x58\xc3\xed\
+\x99\xfd\x5f\x12\x31\x1c\xc7\xe7\x43\x91\x69\x49\x51\x9a\x99\x56\
+\x40\xda\x03\x65\x41\xdc\x95\x89\x36\x41\x2d\x13\x7b\xa0\xc4\x34\
+\x0b\x7a\xa6\xa4\xe8\x39\xad\x7c\xca\xa2\x83\xfd\xd1\xb1\x43\xe4\
+\xb6\x6e\x70\xdb\xed\xb7\xee\xfd\xdb\x76\xdc\xfb\x75\xc0\xf6\xdd\
+\xf6\x39\x00\xaa\xec\xf4\xf4\xf4\x05\x42\x88\x8b\x50\xa0\xaf\xc7\
+\xe3\x02\x26\x34\xb6\x7b\x91\x30\xde\xf6\x46\xda\xd7\xea\x43\xb6\
+\xf0\xb5\x11\xba\x86\x8e\x20\xb2\x49\xb0\xa3\xa1\xea\x6b\xea\x42\
+\x12\xe8\x6a\xda\x7e\xbe\xc3\x48\x0a\xdd\x95\x67\xec\x44\x92\xe8\
+\x2c\xfb\x76\x07\x65\x09\x43\xad\xfa\x78\xf1\x21\x69\xf8\xf1\xe8\
+\x71\x23\x89\xb8\x4b\xc2\xe3\x32\x85\x5e\x00\x5c\x48\x2a\x2e\xe0\
+\xa1\x7a\x0a\xb9\xf9\xe9\x18\x2c\xf1\x6c\xab\xe3\x3e\x64\x11\x9b\
+\x9e\xcf\x15\xa8\xdb\x3d\xe0\x28\xd9\xb1\x9a\xa8\x7c\xbc\xbe\x10\
+\x93\xf8\x41\xde\xdf\x0b\xfa\x89\xf6\xc7\x29\xc8\x27\x84\xd7\xde\
+\x13\x82\x7e\x70\xce\xd8\x5c\xa9\xfa\xac\x0a\xe1\xd4\xaa\xd1\x70\
+\x16\x10\xf5\xef\x2e\xe4\x17\xc2\x7b\xc4\xd8\x06\xc6\x56\x0e\x8a\
+\x08\xe1\x3b\xa3\x83\x10\xce\x89\x09\xe7\x98\xc2\xb8\x98\x30\xce\
+\x14\x8e\x89\x09\xc7\x98\x42\x28\x26\x84\x8e\xb0\x4a\xc6\xc8\x86\
+\x04\xa1\x29\x8e\xd0\x11\xd6\x16\xce\x1a\xf9\xe4\xcc\x65\x47\xf8\
+\x3f\x0a\x6f\x2d\x64\x96\x37\xf3\xf9\xcd\xe5\xcc\x82\x04\xe1\xf5\
+\x47\x2b\x8c\x99\x2a\x24\x8c\x3d\xf8\xc9\x9c\xfa\x22\xc2\x9b\x5f\
+\x6a\xd4\x92\xfa\xc5\xe1\xe9\x2c\xc5\x93\xdf\xc8\xaa\x90\x8b\x62\
+\x36\x39\x11\x51\xd5\xc8\x44\x32\x5b\x94\x20\xd4\x1e\x5f\x55\xb6\
+\x19\x49\x6b\x76\x85\xdf\xa3\x0a\x41\x74\xdd\x9e\xf0\xc5\xa0\x42\
+\x31\xf4\xc6\x8e\x30\xab\x2a\xff\xa0\xbe\x16\x17\xae\x0f\x29\x26\
+\x0c\x2e\x89\x0a\xb5\xa8\x62\x4a\x54\xb3\xb6\x59\xfa\x6c\xe8\xfb\
+\x85\x3b\xd2\x0a\x83\x14\xf7\x4c\xb9\xad\x8f\xbf\x61\x96\x70\xb8\
+\xc8\x2b\xd4\xcb\xca\xa2\xc2\x64\x91\x57\xf8\x1c\xb7\x93\x6c\x61\
+\x92\x57\xf8\x0d\xb7\x27\xd9\xc2\x1b\xb4\x30\x56\x47\xa8\x17\xad\
+\x08\x5b\x18\xe1\x3d\xf8\xe4\x71\xfb\x12\x5b\xa8\xf2\x1e\xcd\xb8\
+\x85\x6f\x65\x7c\x65\xe3\xf1\xb6\x90\xb0\xf7\xa7\x4c\x62\x21\xcf\
+\x01\xfc\xa5\x95\x61\x43\x46\x04\x1f\x6a\x46\x04\x0f\xad\x0c\x6c\
+\x3a\xc4\xb8\x63\x77\xea\x99\xc4\x2c\x71\x66\xcc\xa2\x2f\xc6\xa9\
+\xda\xc5\xc1\x25\xad\x7c\x8d\xfe\xd1\x85\x80\x3f\x7a\x5d\x33\x2f\
+\xb0\x5f\xf1\xb5\x33\x42\x61\x9a\xe9\x12\xf0\x4a\xbf\x74\xb0\x14\
+\xf7\xf9\x05\x16\xa9\xcb\xb4\xef\x4a\x79\x91\x3a\xd1\x8c\x03\x62\
+\x81\x40\x72\x69\x94\xfa\xfd\xd6\xf4\xee\x81\x16\xe1\xc8\x54\x4b\
+\x8f\x18\x16\xfa\x54\x79\xa1\xbf\xb8\x77\x2b\xd4\x3d\x22\xb6\x15\
+\x99\x19\xc7\x5b\x91\xf1\x99\xca\x56\x24\xbc\x5f\x6e\xec\x7c\xc1\
+\x2d\x35\x18\x47\xa7\x5b\x88\xac\xbd\xcd\x6f\x4f\x17\x3a\xd4\x4c\
+\xbf\x5c\xd8\x67\xe3\xe5\xc2\x40\xf7\x0e\xb3\x17\x16\xbb\x0e\xf4\
+\x9e\x0c\x84\x39\x5d\xe1\xf3\xa7\x8e\xed\x31\x48\xfe\x02\xdb\xbf\
+\x3b\xd0\xf4\x47\x3e\xf9\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x06\xe6\
+\x00\
+\x00\x1a\x81\x78\x9c\xdd\x58\x59\x73\xe3\x36\x12\x7e\x9f\x5f\xc1\
+\x92\x5f\xc6\xb5\x22\x08\x80\x38\xe5\x23\x95\x4d\x32\xa9\x6c\x4d\
+\x25\x5b\x73\xd4\x3e\xd3\x24\x24\x33\xa6\x48\x2d\x48\xf9\xc8\xaf\
+\xdf\x06\x28\x8a\xa4\x45\x8f\xe5\x19\x27\x55\x1b\xfb\x81\x44\xb3\
+\xd1\x17\x3e\xf4\xa1\xf3\xef\xee\xd7\x45\x70\x6b\x6c\x9d\x57\xe5\
+\xc5\x8c\x20\x3c\x0b\x4c\x99\x56\x59\x5e\xae\x2e\x66\x9f\x3f\xbd\
+\x0b\xd5\x2c\xa8\x9b\xa4\xcc\x92\xa2\x2a\xcd\xc5\xac\xac\x66\xdf\
+\x5d\xbe\x39\xaf\x6f\x57\x6f\x82\x20\x80\xcd\x65\xbd\xc8\xd2\x8b\
+\xd9\x75\xd3\x6c\x16\x51\xb4\xd9\xda\x02\x55\x76\x15\x65\x69\x64\
+\x0a\xb3\x36\x65\x53\x47\x04\x91\x68\xd6\xb3\xa7\x3d\x7b\x6a\x4d\
+\xd2\xe4\xb7\x26\xad\xd6\xeb\xaa\xac\xfd\xce\xb2\x3e\x19\x30\xdb\
+\x6c\xb9\xe7\xbe\xbb\xbb\x43\x77\xb1\x67\x22\x5a\xeb\x08\xd3\x88\
+\xd2\x10\x38\xc2\xfa\xa1\x6c\x92\xfb\x70\xbc\x15\x6c\x9c\xda\x4a\
+\x31\xc6\x11\x7c\xeb\x39\x8f\xe3\x5a\xdc\x17\x79\x79\xf3\xa4\x31\
+\xfe\xab\xe7\x1e\x45\xd3\x11\xf2\xec\x62\x06\xa2\xa4\xe2\xcc\xaf\
+\xaf\x4d\xbe\xba\x6e\x2e\x66\x94\x0b\xbf\xbe\xcb\xb3\xe6\xba\x5d\
+\x5e\xc2\xfa\x3c\x33\xcb\xda\xd1\xdb\x9d\x6e\x05\x5b\xdb\x6f\xf0\
+\x15\xf4\x98\xc4\xfe\x6c\x93\x2c\x87\xe8\xb6\x7c\x2d\xe7\xf8\x8b\
+\xe4\x52\xee\xf6\xc0\xae\xba\xa9\x36\x1d\xef\xce\x22\xa0\x00\x8f\
+\x9e\xf5\xe4\x6a\xb9\xac\x0d\x18\x86\x07\xb4\xba\x79\x28\x4c\xcb\
+\x1d\xa6\x55\x51\xd9\xc5\x09\xf6\x7f\x67\x9e\x54\x6d\x92\x34\x6f\
+\x1e\x16\x18\xc5\x24\x96\x94\xf3\xb3\x59\x10\x3d\xab\x55\x91\x09\
+\xad\xe4\xcb\x5a\x97\xfe\x6f\xac\x95\xec\x95\x9d\x47\x63\xef\x5f\
+\x18\x2c\x4e\xc4\x93\xc1\x9a\xb0\xc5\x2c\x75\x42\xf5\x23\x5b\xce\
+\x9e\x89\x64\xe7\x3e\xe8\xd2\x4f\x07\x69\x42\x5b\x22\x04\xc6\xe9\
+\x11\xda\xc8\xa4\x36\xf9\x8a\x51\x52\xec\xf8\x28\xdd\x5d\xe7\x8d\
+\xf9\xea\x18\x29\xf1\x92\x18\x4d\xe8\xc2\xc7\x47\x48\xa9\xd7\x8b\
+\x90\xa4\x7f\x55\x84\x24\xfb\xeb\x22\x24\xc5\xd7\x45\xe8\x81\x82\
+\x44\x89\x30\x65\x6c\x90\x69\xee\x1d\x55\x20\xc1\x25\xc7\x7c\x4f\
+\x7d\x20\x40\xc5\x48\xa9\x58\xa8\xb8\xe7\x75\x54\x8e\x30\x21\x52\
+\xf6\xd4\xd5\x4e\xcf\xe7\x32\x6f\x20\x7f\x6f\x6b\x63\x3f\x82\x57\
+\xe6\xb7\xf2\x73\x6d\x66\x4f\x9f\x8f\x8a\x89\xec\x45\xbb\x94\xbd\
+\xb8\xb6\x06\x4a\xcc\xc9\x44\xf2\xdc\x7b\xec\x88\x49\xf1\xd8\x37\
+\x7b\x31\x93\x88\x2b\x2d\x48\xcc\xf6\x32\x97\x0f\x90\xc8\x31\x62\
+\x04\x77\xd9\xde\x53\xef\xbd\x13\x0a\x3c\xc6\x6a\x4f\x4d\x27\x79\
+\xd3\x49\xde\xe3\x1d\x1e\x1b\x0b\x0e\xeb\x63\x1c\xf6\x09\xf0\x79\
+\x87\x39\xd2\x42\x49\x3e\x72\x97\x10\x14\x83\x07\x5c\x8d\xdd\x65\
+\x08\x73\xa1\xf8\xc8\xdb\x43\xd6\x74\x8a\xb5\x73\xf6\x93\x4d\xca\
+\x7a\x59\xd9\xf5\xc5\x6c\x9d\x34\x36\xbf\x7f\x1b\x32\x04\x95\x99\
+\xc6\x84\xcf\x31\xe2\x9a\xc7\x0c\xc7\xf0\x46\x35\x57\x8c\xd1\x39\
+\x45\x58\x2b\x1d\x2b\x31\x0f\xa9\x64\x48\x28\xa5\xe8\x3c\x24\x0a\
+\xc9\x98\x6a\xaa\x4e\x5f\x21\x9c\x94\x1c\x17\x4e\xd5\xdf\xce\x2f\
+\xdc\x0d\x2a\x10\x03\x67\x94\x1c\xdf\x8d\x18\x31\x0e\xf7\x40\x8f\
+\xee\x06\x38\x47\xa4\x1a\x82\xcd\xdd\x0d\x85\x34\x60\x9a\x2a\xf6\
+\x0a\x77\x83\xc6\xc7\xf9\x06\x39\xae\xf5\xed\x3c\x72\xdd\x89\x7f\
+\x5b\x9b\x26\xc9\x92\x26\xe9\x1b\x97\x8e\x02\xcd\x8b\xee\x9a\x17\
+\x68\xd6\x16\x1f\x7e\x7c\xb7\xcf\x5a\x69\xba\xf8\x4f\x65\x6f\xfa\
+\x94\xe3\x18\x92\xab\x6a\x0b\x99\x68\x9f\x47\x5d\x4b\x94\x2e\x1c\
+\x0e\x92\xe6\x32\x5f\x27\x2b\xe3\x3a\xb3\x7f\x40\x57\x06\xfa\xf7\
+\x1f\x46\xcc\xcd\xc3\xc6\xf4\x42\x5b\xb1\xd6\xd4\xd5\xd6\xa6\x66\
+\xb2\x59\xcd\xd2\x75\xee\x36\x45\x1f\x9b\xbc\x28\x7e\x71\x4a\x06\
+\xd9\xb5\x15\xea\xbb\xd5\xca\x5e\x0e\x04\x3b\x07\xbe\x5f\xed\xb3\
+\xe0\xc8\x84\xbc\x29\xcc\xe5\xfb\x64\x53\x05\x3f\x24\x45\xb2\x86\
+\x1e\xda\x9a\xdc\x5b\xdc\x7e\x1a\x8a\x89\x0e\xe5\x78\xce\x03\x95\
+\x4e\x72\xeb\xc6\xc8\x3a\xd8\x5e\xe4\xa9\x29\xeb\xe7\xbd\x9e\xea\
+\xb9\x77\x7b\xeb\xe8\xe7\x7f\xbf\x8f\x00\x67\xd1\x81\xef\xad\xc9\
+\x53\xd6\x7b\x8b\xb6\x57\xbf\x9b\x74\x14\x04\x7f\xd4\xff\x4c\x56\
+\x8f\x02\xe3\xa8\x45\x7e\x69\x41\xbd\xcd\xce\xa3\xdd\x72\x92\x67\
+\x6d\xe0\xe6\x4d\xb1\xb4\xb4\x91\x6c\x6f\xd8\x81\x15\xfe\xd0\xaa\
+\x12\x32\xc7\xd5\xf6\xa5\x07\xf7\xaf\xe4\x66\x7b\x15\x7c\x6c\x0c\
+\x60\xdf\xbe\xf4\xd4\x0e\x75\x7a\x5e\x07\xf5\x21\xf4\xdf\x3f\x3e\
+\xb2\x01\xfa\x5f\x74\x5a\x63\x24\x6c\x8c\x05\x30\xd7\xcf\x22\xe1\
+\xce\x5c\xa1\x8e\xe8\x05\xa7\x69\xf4\xc1\x6c\x6c\x95\x6d\xd3\x06\
+\x26\x98\xd9\x63\x88\x7d\x8b\xe0\x1f\xf3\xba\x8d\xc9\x94\x60\x6b\
+\xfe\xbb\xcd\x61\xc7\x57\x49\xfe\xb5\x6a\x20\x20\xaf\x6b\xac\xb1\
+\xf9\xad\x8f\xbb\x3b\xb2\xfa\x75\xed\xfd\x78\x9d\x58\xf3\x7d\x91\
+\xdf\x1c\xda\xfc\x6d\x72\xfd\xea\x87\x2a\x1b\xca\xf5\xb8\xdb\xe1\
+\xac\xeb\xdf\x06\x49\xf8\x3c\xea\xb2\xb4\x5f\xad\xda\x5d\x4d\x5f\
+\x77\xfd\x6b\x91\x34\xe6\x2d\xc1\x31\x82\x41\x97\x88\x79\xfb\x26\
+\xb5\xec\xea\xa9\xaf\x25\xc9\x83\xb1\xa4\xcb\xf3\xab\xce\x83\xe6\
+\xa0\x84\x2b\xc4\x63\x01\x65\x9a\xce\x31\xfc\xbb\x15\x63\x4a\x8a\
+\x39\x55\x58\x20\x29\xa0\xb2\x43\xc1\x86\x36\x90\x51\xad\x4f\x47\
+\xe5\x6a\x25\x89\xc4\x7d\x77\x9d\xe6\x36\x2d\x86\x97\xc7\xf5\x63\
+\x84\x70\x2a\xe8\xa0\x87\xf5\x6d\x87\x40\x50\x36\xa9\x1e\xf6\xb6\
+\xd3\x6d\xd6\x94\xc1\x14\x11\x2c\x99\x00\xc7\x9d\xc1\x7e\x05\x15\
+\x2d\x9e\x87\x31\xd7\x50\xbd\x39\x27\x60\x31\x46\x18\x0b\xa9\xc4\
+\xe9\x40\x94\xb3\x79\x93\x34\xd7\x52\xe8\x89\xd9\x76\x3c\x4c\x67\
+\x79\xbd\x81\x10\x2e\xf2\xd2\x15\xdb\xb3\xea\xd6\xd8\x65\x51\xdd\
+\x2d\x6e\xf3\x3a\xbf\x2a\xcc\x99\x7f\xe6\x85\x6b\xdb\x3b\x52\x3f\
+\x7a\xb3\xb3\x25\x14\xad\x05\x94\xb3\xb7\x27\x87\xfd\xee\xa9\xff\
+\x3a\x98\x30\xfc\xd2\x6e\x0b\xb3\x28\xab\xf2\x0f\x63\x2b\x18\x0b\
+\x6c\x75\xe3\x97\x66\xf7\x1e\xfa\x1f\x25\x40\x36\xa7\x12\x53\x09\
+\x73\xfd\x8e\xee\xe4\xa7\xc9\x66\x01\x37\xb9\x19\xd2\x7e\xaf\xf2\
+\x72\x01\x17\xce\xd8\x8e\xea\x17\x45\x0e\x8f\x05\xeb\x68\x59\x52\
+\x03\xfa\x2d\x38\x3a\xd4\xe5\xa8\xed\xfc\xb1\xc0\x1d\xad\x37\x77\
+\x9d\xd8\x1b\x63\xdb\x0d\xed\x7b\x58\x37\x89\x6d\x46\x94\x75\x9e\
+\x8d\xd6\xa6\x6c\xd7\xc3\xab\xb0\x1a\x1f\xcd\x4a\x72\xc1\x46\xa9\
+\xf3\x11\xa0\x9e\x82\xd4\xd3\xa0\x7a\x1a\x56\x53\xc0\x22\x48\x69\
+\x49\xb9\xf4\xb8\xf2\x0b\x8f\xfe\x98\x83\x64\x8c\x19\x34\xb1\x30\
+\x23\x11\x26\x58\x1c\x9f\x8e\x44\xed\x81\x05\xcd\xf8\xe8\xc3\x6b\
+\x41\xab\x87\xd3\xe1\x34\x71\x3c\x9c\x4e\xd4\x4f\x10\x05\xfc\xf7\
+\x45\x14\x60\xc6\x1d\xc3\xf4\xd1\x48\x3c\x3a\x1a\xd7\x10\x07\x61\
+\x4c\x61\x2a\x21\xb1\x9e\xbb\x16\x5f\x71\x8c\xe3\x20\x0d\x42\x18\
+\x6f\x85\x88\x21\x8d\x60\x48\x80\x18\x4b\x19\x84\x1a\xda\x7a\x46\
+\x25\xa4\x9b\xd8\x35\xf7\x3c\x08\xdd\xec\xa4\x04\x99\x4b\x44\xa5\
+\xe6\x24\x0e\x08\x22\x4a\x49\x32\x8f\xe1\x89\x63\x1d\x40\x52\xc6\
+\x8a\x90\x39\x47\x12\x6b\x1d\x07\x12\x31\x21\xa4\x9c\xc3\x88\x21\
+\x25\x65\x01\x87\x31\x89\x71\x50\x8d\x08\x23\x02\xd3\x00\x92\x16\
+\x87\xb9\x1a\x20\x07\x4d\x04\x9c\x08\x03\x99\x6e\xc8\x80\xa1\x7c\
+\x1e\x02\xee\x59\xac\xb4\x53\xec\xf4\x08\x0d\xc0\x74\x8a\x18\x68\
+\x0e\x5b\x55\x30\x5a\xb5\xba\x38\x0d\xc2\x56\x1b\x77\x98\x75\xea\
+\xc0\x1e\xf0\x86\x12\xe9\x9c\x02\x2c\x4b\xe5\xd6\x8c\x50\xa6\x1c\
+\x05\x4a\x08\x71\xbb\x30\x12\x14\x70\xef\x49\x80\x7b\xa2\x83\x3f\
+\xfe\x14\x40\xf7\xb9\x52\x30\xcc\x98\x66\xfa\x0b\x18\xa7\xe4\x5b\
+\x52\x26\x81\x19\x94\xb9\x9f\x36\xd8\xdf\x02\xe0\x7f\x6e\x52\x7c\
+\xfd\xf3\xe5\xee\x74\x01\xa4\xed\xf9\x7a\xff\x8e\x3d\xcb\xc9\xfa\
+\x49\xe3\xd3\x83\x04\x26\x14\xdc\x56\xff\xfb\xef\xff\xe5\xf9\x3e\
+\x91\xaf\xe8\xb3\xe5\x4a\x72\x4d\x20\x83\xed\xea\x95\xe4\x0a\x6b\
+\xea\xf2\x02\xf7\xf9\x40\xc3\x2b\x43\x70\x8b\x29\xa4\xa5\xd3\x51\
+\x0f\xba\xea\x5a\xcf\x55\xdb\x74\xc2\xe3\xdc\xcd\xf0\x97\x6f\xfe\
+\x07\x30\x8d\x7e\x73\
+\x00\x00\x04\x4d\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\
+\x00\x00\x04\x14\x49\x44\x41\x54\x78\xda\xed\x9b\x7b\x48\x53\x51\
+\x1c\xc7\x2f\x04\xd1\x1f\xbd\x24\x22\x8c\x20\x83\x10\x85\x02\xc1\
+\x7f\x7a\x10\xfa\x47\xff\x44\x59\xa1\x11\xd8\x3f\x3d\xd8\x5d\x41\
+\xf4\xf8\xa3\x17\x64\x98\xbd\x88\x42\x2c\x4b\x4d\x0d\xed\x01\xab\
+\xa5\x32\x6d\xe4\xa3\x69\x9b\xb3\x69\xa4\x6d\x96\xb2\x59\x6e\xae\
+\xa0\x07\x45\x59\x69\x98\xf8\x47\xbf\xce\x6f\x73\xd3\xcd\xe1\xae\
+\x77\xde\x7b\xcf\xe4\xfc\xe0\x0b\x63\x83\x7b\xce\xf7\x7b\xce\xfd\
+\x9d\x0f\x07\xe5\x38\x56\xac\x58\xb1\x62\xa5\x7c\x41\x8b\x2a\x15\
+\xcc\xaa\x6d\xd0\xac\xce\x1e\xa7\x3c\x30\xf1\x46\xbf\x02\x7e\xe3\
+\x8f\x80\x99\x4f\x01\xe3\x81\xb8\xe8\x33\x6b\xdc\xb3\x90\x98\xd8\
+\x4d\x4c\x95\x13\xd9\xc8\x67\x88\x58\xde\x80\xf2\xc0\xc8\x27\xd1\
+\x6d\x1c\x4d\x4f\x87\xe1\x49\xc3\x50\xbb\x31\x60\x1a\xcd\xdb\x24\
+\x37\x1f\x20\xfe\x1a\x3d\x01\x34\xa6\x6d\x91\xd7\x3c\x91\x21\x73\
+\x80\x9e\x00\x8a\xb8\x54\xb8\xb7\xac\x97\xec\x04\x79\xcc\xd7\xa7\
+\x0f\x42\xc9\x9c\x0f\x74\x05\x50\xc4\x01\xdc\x9a\xf5\x05\x1e\x25\
+\x75\x49\x16\x44\xdd\xf6\xcf\x70\x67\x89\xcd\x33\x16\x11\x3d\x01\
+\x54\x26\xe7\xf8\x26\xe5\xd7\xdd\x58\x20\xdf\x93\x49\x6f\x01\x68\
+\xcc\x14\x67\xb8\x21\x1d\xa0\x26\x15\xe0\xe1\x6a\x80\xdb\xf3\x20\
+\x78\x0c\x7a\x02\xd0\x6d\x38\x31\x21\x80\x50\x42\x13\x18\x4c\x38\
+\x09\x79\x56\xe9\x5c\x8a\x02\x68\xe6\x77\xc2\x63\xb2\x52\xc5\xb3\
+\x85\x4d\x3e\x52\x95\x2d\x22\xbb\x23\x83\xb2\x00\x70\xcb\xe2\x56\
+\xd7\xae\x92\x2e\x08\x34\x8e\x41\x8f\xbe\x22\xf4\x05\x10\xd0\xb0\
+\xd2\xbc\x3d\xe0\x4e\xac\x67\xbb\x8a\x36\xac\x89\x07\xd0\xad\x0d\
+\xd9\x47\xe8\x09\xc0\xb0\x63\xaf\xa0\xa6\x86\x26\x30\x98\x70\x12\
+\xf8\x2c\xba\x4e\x01\x5c\x29\xb9\x38\x80\xbc\xff\xb8\x3b\xe8\x3b\
+\x06\xb1\xcb\xeb\xd6\x49\x17\x04\x1a\xc7\xa0\xa3\x83\x03\x96\x8e\
+\x72\x40\x5a\x04\x1c\x90\x31\x13\x39\x60\x69\x78\x31\x0e\x60\x1c\
+\xc0\x38\x80\x71\x00\xe3\x00\xc6\x01\x8c\x03\x18\x07\x30\x0e\x60\
+\x1c\xc0\x38\x40\x31\x0e\xb0\x39\xdc\x71\x56\x87\x3b\xc5\xd6\xe3\
+\x3a\x62\x73\xb8\xb2\xc7\xe4\x34\xfa\x65\xef\xcd\xc3\xef\x9c\x16\
+\x6d\xd3\xc7\xa6\x2b\xd0\xdf\x78\x0a\x7e\x1b\x8e\x45\x27\x07\xd8\
+\xde\xb9\x93\xbc\x86\x3c\xe6\x20\x52\x39\x5e\x3c\x81\xbe\x67\x45\
+\xf0\xad\xf6\x38\x8c\x3c\xd9\x45\x2f\x07\x90\xc9\xee\x21\x72\x4f\
+\x87\xe9\xc9\xe4\xaa\xcf\x85\xa1\xb2\x35\xf0\xaf\x2e\x93\x1e\x0e\
+\xb0\xd9\x9d\xd7\xa4\x36\x3e\x5e\x76\xcb\x63\xf8\x7d\x6e\x3e\x0c\
+\x17\xc6\x0b\x0b\x42\x6a\x0e\xb0\x74\xda\x07\xe4\x0c\x00\xd5\x7d\
+\x79\x1f\xb8\x0e\x25\x7b\xd4\x7f\x71\xa5\xb2\x1c\x50\xa0\xad\xf9\
+\x6a\xee\x78\x33\x24\x87\xf1\xf6\xae\xb7\xa0\xad\xa8\x84\x96\x33\
+\xfb\xc1\x7e\x60\xa3\x5f\x83\x97\x62\x94\xe3\x80\xbc\xfb\x55\x80\
+\x7a\x50\x6b\x04\x73\x47\x97\x64\xc6\xf5\xa6\x36\xb8\xa1\xa9\xf6\
+\x8c\x65\xb9\x99\x15\x10\xc0\xbb\x83\xeb\x95\xe3\x00\x5f\x00\x3e\
+\x95\x56\xd5\x42\x45\x83\x19\x0c\xad\x56\x68\x79\x25\x2e\x90\xd6\
+\xd7\x76\x30\xbe\xec\x04\x5d\xd3\x73\x28\xaf\xae\x87\xe0\x31\x5a\
+\x0b\x4e\x07\x04\x80\xfa\x95\xb3\x58\x19\x0e\x28\xd4\xea\x27\x4c\
+\x30\x94\xd0\x48\x38\x15\x09\x7c\x56\x57\xa9\x0a\x7e\x9c\x8c\x09\
+\xd0\x9f\xfc\x44\x65\x38\x00\x57\xb9\x84\xac\xba\x90\x89\x47\xaa\
+\x7c\x8d\x0e\xea\x5a\x5e\xc2\x57\x4d\x26\xfc\xc9\xe2\x02\xf4\xf7\
+\xfa\x72\x65\x38\xc0\xb7\x6d\x71\x62\x52\x05\x81\xc6\x1f\x3d\x6d\
+\xf6\xf4\x02\x1c\x2b\x54\x00\x43\xb9\xb1\x0a\x71\x40\xd0\xfb\x8b\
+\x3b\x42\x6f\x6c\x83\x7b\x7a\x83\xe8\x40\xf0\xb5\x2a\xd3\x35\x90\
+\x1e\x60\xf1\xf4\x82\xe0\x31\xa6\x14\x80\xd4\x1c\xd0\x46\x1a\x96\
+\x90\xc6\x86\x46\xc2\x49\xe8\xb3\x7a\x0a\xf6\xfb\x39\xc0\xa7\x8f\
+\xc7\x12\x94\xe1\x00\x5c\x65\xb1\xdd\x5e\xcc\x71\x88\xc7\x6d\xa8\
+\x53\xa0\xef\x70\xb2\xf2\x1c\x20\x55\x10\xc1\x1c\x10\x51\x00\xd1\
+\xc0\x01\x6d\x61\x38\xc0\x52\x7e\x55\x78\x00\x33\x91\x03\x3a\x2b\
+\x2e\x4c\xe0\x80\x9f\xe7\x97\x4d\x9d\x03\x4c\x7c\x77\x54\x72\xc0\
+\xa7\xaa\x43\xe2\x8f\xc1\xb1\x3f\x97\x6d\x87\x66\xd5\x8a\xa8\xe4\
+\x80\xef\xe5\x9b\xc4\x07\x60\xe2\x35\x60\x56\x6f\x9e\xc6\x6b\x2f\
+\xf9\x39\x60\x6a\x01\xf0\x7d\x44\x5a\xa2\xad\xd0\xa1\x5e\x30\xed\
+\xf7\x7e\x56\xbb\xf3\xbd\xdc\x1c\xf0\x59\x7f\x5c\x35\x5c\x18\xaf\
+\x1e\x2e\x4e\x3c\xea\xd3\x48\x59\xb2\xca\xfb\xff\x01\xea\x04\x59\
+\x6f\x73\xf1\x1e\xd0\xea\xe8\xed\x94\x83\x03\xac\x0e\xe7\x2f\xbc\
+\x7e\xe3\x68\x2c\x9c\x98\x54\x41\x78\x8c\xe3\xd5\x9b\xdb\xbd\x90\
+\xa3\xbd\xbc\x37\xc3\xae\xa3\x64\xc2\xd5\x62\x03\xf1\xbe\x56\xbd\
+\x26\xa2\xb3\x44\xa9\xdc\x4c\x28\x34\x12\x5e\xee\x38\x8e\x15\x2b\
+\x56\xac\x58\xb1\xa2\xa6\xfe\x03\xf4\x3c\xfe\x6e\x81\x47\x45\x38\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x09\x41\
+\x00\
+\x00\x22\xb1\x78\x9c\xdd\x59\x59\x73\xdb\x38\x12\x7e\x9f\x5f\x81\
+\x52\x5e\xe2\x5a\x0a\xc2\x49\x00\x8a\xed\xa9\xd9\x4c\x65\x6a\xb6\
+\xb2\x47\x4d\x26\xbb\xcf\x34\x45\xcb\x9c\x48\xa2\x97\xa2\xaf\xfc\
+\xfa\xfd\x1a\xb4\x4c\xd2\x92\x62\x2b\xc7\xd4\x56\xec\x2a\x93\x00\
+\x1b\x7d\x7e\xdd\x68\xc0\xc7\x3f\xde\x2e\x17\xec\xba\xa8\xd7\x65\
+\xb5\x3a\x19\x49\x2e\x46\xac\x58\xe5\xd5\xac\x5c\xcd\x4f\x46\xef\
+\x7f\x7f\x33\xf6\x23\xb6\x6e\xb2\xd5\x2c\x5b\x54\xab\xe2\x64\xb4\
+\xaa\x46\x3f\x9e\xfe\x70\xbc\xbe\x9e\xff\xc0\x18\xc3\xe2\xd5\x7a\
+\x3a\xcb\x4f\x46\x17\x4d\x73\x39\x9d\x4c\x2e\xaf\xea\x05\xaf\xea\
+\xf9\x64\x96\x4f\x8a\x45\xb1\x2c\x56\xcd\x7a\x22\xb9\x9c\x8c\x3a\
+\xf2\xbc\x23\xcf\xeb\x22\x6b\xca\xeb\x22\xaf\x96\xcb\x6a\xb5\x8e\
+\x2b\x57\xeb\x17\x3d\xe2\x7a\x76\xfe\x40\x7d\x73\x73\xc3\x6f\x74\
+\x24\x92\x21\x84\x89\x50\x13\xa5\xc6\xa0\x18\xaf\xef\x56\x4d\x76\
+\x3b\x1e\x2e\x85\x8e\xbb\x96\x2a\x21\xc4\x04\xdf\x3a\xca\xe7\x51\
+\x4d\x6f\x17\xe5\xea\xc3\x5e\x65\xe2\xd7\x48\x7d\x53\xce\x9a\x8b\
+\x93\x91\xb2\x69\x1c\x5e\x14\xe5\xfc\xa2\xe9\xc6\xe5\xec\x64\x04\
+\xc6\xce\x5b\x13\xc7\x03\xe7\x9f\x62\xe6\x78\x56\x9c\xaf\xe9\x4b\
+\x4b\x4b\x23\x10\xa7\xf1\x1b\xbe\x42\x4e\x91\xd5\xbf\xd4\xd9\xac\
+\x84\x77\x5b\xba\x96\x72\xf8\xc5\x59\xe7\xee\xd7\x60\xd5\xba\xa9\
+\x2e\x37\xb4\x0c\x11\xbd\x5b\x20\x98\x34\x39\xce\xab\x45\x55\x4f\
+\x5f\x88\xf8\xf3\x2a\x4e\x55\x97\x59\x5e\x36\x77\x53\xc1\xb5\xd4\
+\x4e\x59\xfb\x6a\xd4\xad\xad\xce\xcf\xd7\x05\xec\x11\xbd\xb9\x68\
+\x13\x56\x42\x66\x18\xb1\xc9\xf3\xa5\x9e\xc7\x9f\xa1\x54\xb9\x43\
+\x98\xdc\x29\xcc\xcb\x07\x61\xc7\x93\xa1\xf5\x07\x3a\xcb\xca\x74\
+\xaf\xb3\x36\xf2\x40\x13\x9e\xf0\xc3\x4e\xbf\x06\x51\x3c\xb6\xf0\
+\xd5\x7e\x27\x75\xd2\xdc\x53\x8e\xd8\x29\x2d\x55\x67\x6a\xaf\xb4\
+\x2f\xf6\x92\x37\x4f\x7b\xc9\xa7\x07\x7b\xe9\xe6\xa2\x6c\x8a\xcf\
+\xf1\x91\xf7\x07\xfb\x68\x87\x2c\xf1\x15\x3d\xe4\xd4\xd3\x1e\x72\
+\xe6\xcf\xf3\x90\xdb\x15\x8d\x3f\xcd\x43\xb1\x2a\x4e\x2f\xea\x02\
+\x55\xfc\xc5\x8e\xfa\xb4\xdf\x93\x5e\xcb\xee\xf3\xfc\x7e\xf2\xfd\
+\xaa\x6c\x50\xae\xaf\xd6\x45\xfd\x0e\x9a\x15\xff\x5c\xbd\x5f\x17\
+\x0f\x54\xb7\x12\x96\x59\x2e\xa4\x74\x4e\x3f\xcc\xde\xd1\xac\xe0\
+\xde\xeb\xd4\x77\xb3\xb7\x0a\xb3\x29\x4f\xad\xb3\xc2\x76\xb4\x34\
+\xeb\xb8\x50\xc6\xf4\x0a\xd9\x31\x49\xcf\x16\x07\xd8\x16\xcb\x49\
+\xdf\xb6\x21\x07\xd8\x16\x0e\xb4\x2d\xbf\x8d\xb6\x79\x28\x2c\x3a\
+\xcc\xe7\x77\xd8\x57\x04\x37\x52\x6c\x76\x13\xfa\x39\xdf\x49\x7b\
+\xbe\x93\xb6\x3e\x19\x39\x6e\x7d\x48\xa5\x36\x5f\x64\xb0\x37\x9f\
+\x34\x58\xc9\x03\x0d\xde\x50\xfd\x5e\x67\xab\xf5\x79\x55\x2f\x4f\
+\x46\xcb\xac\xa9\xcb\xdb\x97\x63\xc3\xb1\x3b\x2b\x2d\x6d\x22\xb8\
+\x0d\x56\x1b\xa1\xf1\xa6\x82\xf5\xc6\xa8\x44\x71\x11\x7c\xd0\x3e\
+\x4d\xc6\xca\x19\x9e\x7a\xef\x55\x32\x96\x9e\x3b\xad\x82\xf2\x47\
+\x43\x97\x1a\x2e\x6c\xea\xed\xc0\xa3\x52\x72\x0d\x27\x59\x3f\xf4\
+\xe8\x63\xd2\xf3\x9d\xa4\x70\xa8\xe5\x21\xf5\xce\x76\xee\x3c\x38\
+\x37\x62\x19\xf9\x54\x6e\x28\xfd\x19\xb9\xe1\x79\x40\x52\xa9\x5e\
+\xa4\x28\x37\xe0\x2f\xe9\x3c\x85\x7f\x90\x1b\x9a\x1b\x8b\x9c\x09\
+\x83\xdc\x50\x29\x37\xf0\xbb\x77\x4f\xd9\xf6\x3c\xa5\x88\x25\xbc\
+\x8a\xb0\xe8\x9e\x07\x49\xbc\x45\xc2\x3a\x9b\xa6\x7e\xa0\x6a\x48\
+\x11\xef\x20\xf4\xc0\x2a\x2b\xb9\x82\xbb\xcd\xa7\x1c\xa6\x7c\x2f\
+\xc9\x3f\xe1\x77\xe5\x42\x78\xca\xb4\x1d\xdc\x69\xd5\x13\x85\x18\
+\x34\x9d\x06\x07\x34\x0f\xdb\x4d\x99\x7c\xba\xea\x43\x98\xdb\x21\
+\xec\x89\xde\xc1\xcc\xe8\x77\x9f\xb0\x83\xca\xfe\x37\x0a\xec\xf3\
+\x50\xb5\x1d\x20\x6d\x75\xfa\xb5\xc2\xff\xff\x67\x9a\x3f\xd0\xb4\
+\xe3\x09\x1d\x29\xe2\xdb\xb2\x68\xb2\x59\xd6\x64\xdd\x69\x63\x33\
+\x83\x13\xc7\x06\xd3\xc7\x38\x61\x4d\x7f\xfb\xf9\xcd\x03\xe8\xf2\
+\x7c\xfa\x9f\xaa\xfe\xd0\x81\x89\x08\xb2\xb3\xea\x0a\x18\x7b\xc8\
+\x03\x3a\xc7\xe4\x53\x2a\xdc\x59\x73\x5a\x2e\xb3\x79\x41\xc7\xa9\
+\xbf\xe0\x28\x05\xf9\x0f\x1f\x06\xc4\xcd\xdd\x65\xd1\x31\x6d\xd9\
+\xd6\xc5\xba\xba\xaa\xf3\x62\xe7\x09\x73\x96\x2f\x4b\x5a\x34\x79\
+\xd7\x94\x8b\xc5\xaf\x24\xa4\x97\x1c\x2d\xd3\x78\xc4\xac\xea\xd3\
+\x1e\x63\x32\xe0\xa7\xf9\x03\x86\x07\x2a\x94\xcd\xa2\x38\x7d\x9b\
+\x5d\x56\xec\x75\xb6\xc8\x96\x38\xf8\xd6\x45\x19\x35\x6e\x3f\xf5\
+\xd9\x4c\xb6\xf9\x44\xca\x2d\x91\xc4\xb9\x35\x63\xa0\x1d\x96\x2f\
+\xca\xbc\x58\xad\x9f\xb6\x7a\xd7\x41\xf9\x7e\xed\x7a\xf2\xcb\xbf\
+\xde\x4e\x50\xc5\x27\x5b\xb6\xb7\x2a\xef\xd2\x3e\x6a\x74\x75\xf6\
+\x47\x91\x0f\x9c\x10\x43\xfd\xd7\x6c\xfe\xc8\x31\x34\xbb\x28\x4f\
+\x6b\x88\xaf\x67\xc7\x93\xfb\xe1\x4e\x9a\x65\x81\x7d\x7f\x17\x49\
+\x3b\x37\xe0\x1d\x15\xdb\xd2\x22\x06\xad\x5a\x61\xab\x3f\xbb\x3a\
+\x34\x70\x7f\xcb\x3e\x5c\x9d\xb1\x77\x4d\x01\xec\xd7\x87\x46\x6d\
+\x5b\x66\xa4\x25\xa8\xf7\xa1\xff\xf6\x71\xc8\x7a\xe8\x3f\x28\x5a\
+\x43\x24\x5c\x16\x35\xc0\xbc\x7e\x12\x09\x37\xc5\x19\xdf\x4c\x46\
+\xc6\x79\x3e\xf9\xad\xb8\xac\xab\xd9\x55\xde\x94\xd5\x6a\xf4\x18\
+\x62\x5f\xc2\xf8\xe7\x72\xdd\xfa\x64\x17\xe3\xba\xf8\xef\x55\x89\
+\x15\x9f\xc5\xf9\x1f\x55\x03\x87\x7c\x5d\x65\x8b\xba\xbc\x8e\x7e\
+\xa7\x90\xad\xbf\xae\xbe\xef\x2e\xb2\xba\xf8\x69\x51\x7e\xd8\xd6\
+\xf9\xcb\xf8\xc6\xd1\xeb\x6a\xd6\xe7\x1b\x71\x77\x8f\xb3\xcd\xee\
+\xdb\x2b\xc2\xc7\x93\x4d\x95\x8e\xa3\x79\x57\xbd\x17\xd9\x5d\x51\
+\x6f\xb6\xf9\xa6\xeb\x9c\xe3\xeb\x22\x6b\x8a\x97\x52\x68\x1e\x42\
+\x90\x69\xd2\xbe\xa1\x53\x38\xda\xd4\xf9\x79\x7f\x9b\x99\x3b\xe9\
+\xba\xee\xa4\xd9\xea\xc2\x3d\xc7\xa6\x8a\x4e\x5b\x25\x02\xbf\x34\
+\x32\xc6\xbb\x34\x41\xab\x95\x72\x97\xa2\x39\x47\xcf\x8d\x1d\xd1\
+\xa8\x10\x8e\xba\xee\x28\x2f\xeb\x7c\xd1\x4b\x9e\xfb\x3e\x64\xd8\
+\xef\xcc\xca\xf5\x25\x4c\x99\x96\x2b\xda\xc4\x5e\x55\xd7\x45\x7d\
+\xbe\xa8\x6e\xa6\xd7\xe5\xba\x3c\x5b\x14\xaf\xe2\xb3\x5c\x50\x83\
+\xb2\x99\xea\xae\xac\xcc\xab\x73\x6c\x06\x53\x6c\x13\x2f\x5f\x6c\
+\x1f\x29\x8f\xe2\xd7\xde\x19\x3a\x0e\xeb\xab\x45\x31\x5d\x55\xab\
+\x8f\x45\x5d\xa1\x01\xaa\xab\x0f\x71\x58\xdc\xbf\x8f\xe3\x95\x1e\
+\x78\x5b\xe5\x84\x72\xd6\x6e\xe6\x89\x7f\x9e\x5d\x4e\x91\x21\x4d\
+\x7f\xee\x8f\xaa\x5c\x4d\x01\xe4\xa2\xde\xcc\xc6\xc1\xa2\xc4\x63\
+\x6a\x36\x73\xb3\x6c\x0d\x54\xd5\x30\xb4\x2f\x8b\x66\xdb\x8e\x6d\
+\x2a\x36\x73\x9d\xba\xcb\xac\xfe\x50\xd4\xed\x82\xf6\x7d\xbc\x6e\
+\xb2\xba\x19\xcc\x2c\xcb\xd9\x60\x5c\xac\xda\xf1\xa3\x4b\xb4\xcb\
+\xac\xb9\x70\x69\xe8\xb7\x85\xdb\x71\x56\x5c\x0a\x67\x52\x00\x86\
+\xe2\x1c\x47\x68\x0d\x74\x32\xd6\x36\xe0\x30\x60\xad\x44\xa0\x05\
+\x17\x22\x75\x3e\x3d\xea\xb1\xda\x7d\x62\xbd\x3f\x61\xa5\x1c\x07\
+\x0e\x35\x10\x1d\x4f\xa2\x52\x5a\x95\xaa\x7e\x2a\xcc\x87\x3a\xcf\
+\xd1\x61\x99\x41\xe9\x7c\x04\xa8\xaf\x07\xa9\x0e\x46\xdb\xa7\xf7\
+\xe7\xc3\x08\x0a\xe8\x37\x4e\x7c\xbf\x48\xea\x61\x29\xa4\x7e\xf0\
+\x61\x1b\x4d\x92\xfb\xe0\x94\x75\x11\x4c\x71\x10\x2b\x85\xb6\x00\
+\x84\x10\x06\x67\xf6\x94\xa7\xd2\xa4\x46\xeb\xa3\x01\xab\x7d\x68\
+\xda\x8f\xa7\x7d\x88\x02\x66\x48\xd9\x6f\x81\x98\xae\x08\xa5\x46\
+\x18\x13\x4c\xf8\x04\x88\x94\xfc\x92\x5a\x24\xb9\x08\x86\x6e\xaf\
+\xcc\xf7\x80\x20\x3a\x78\xb0\xb1\x56\x06\xc1\xd7\x21\xa1\xcb\x07\
+\x6f\x91\x38\x2c\x67\x63\xcb\x45\x9a\x6a\x54\x19\x81\x6d\x45\x08\
+\xe7\xd8\x38\xf0\x80\x68\x3b\x54\x23\x4d\xd7\x19\x96\x8d\xe9\x1e\
+\xc6\xa7\x32\x71\x9c\x0e\xda\x52\x33\xc9\xa5\xf7\x4e\x26\x1a\x4f\
+\xa1\x03\xc3\x5e\x27\xbc\x94\x89\xe5\x4e\x84\xa0\x99\xe3\x26\x4d\
+\x9d\x4b\x52\x6e\x9c\x53\x86\x59\xae\x82\xb1\x10\xcd\xa5\x91\xa9\
+\x50\x0c\x35\xcd\x0a\x49\xe0\x44\xb3\x86\x4c\x35\xe0\x49\x57\x25\
+\x56\x60\x0a\xb0\x32\xda\x07\x12\x4c\x72\xd2\x00\x08\x93\x20\x03\
+\xc9\xe3\x56\x94\x4a\xc6\xad\x2c\xab\xd8\xb8\x95\x66\x09\xdd\x24\
+\x0e\xfa\xc0\x1a\x25\x1d\x19\x05\xd4\x3b\x4f\x63\x23\x95\xf1\x34\
+\x83\x9d\x59\xd2\x2a\xc0\x48\x21\x43\xe2\x14\x32\x44\x06\xf6\x71\
+\x4f\xde\x61\xa7\x1e\x76\x25\x5b\x45\x71\x57\x2a\x3a\x1b\x24\x7c\
+\x7e\x9f\x8b\xce\x7a\x11\x14\x59\x62\xa3\x05\x01\xaf\x86\x43\xae\
+\x82\x23\x8f\xf6\x09\x56\xa3\x6f\x9b\x48\x96\xd2\x08\x6e\x6d\x13\
+\x29\x02\xe9\xb9\x49\xb3\xb3\x03\x50\xfa\x68\xab\x14\xa7\x1e\xf8\
+\x52\xe1\x7b\x48\xa4\xaf\x57\x26\x8f\x27\xf3\x4d\xeb\x39\x6f\x9b\
+\xce\x79\xbf\xdb\xbc\x8f\xf4\xbe\x56\x8b\x2e\xdc\x1e\x97\xb7\xed\
+\xb6\xf4\x01\x89\xa9\x55\xd8\x14\x36\xbb\xc2\x66\x64\x14\xba\x4a\
+\xe1\x85\x4f\x8c\x85\xe2\x41\xb9\x87\x06\x23\xb6\x02\x18\x3f\xdc\
+\x51\xf4\x4b\xfa\x13\xba\xd1\x6d\xd0\x1e\xdd\x3a\x68\x83\x77\x77\
+\x5f\x87\xb9\xbf\x33\x6c\x51\x2a\x49\xa1\x12\x7b\xdd\xbe\x5b\xc9\
+\x2c\xb2\x36\x31\xa8\x5a\x0c\x7f\x7c\xa2\x3d\xd7\xcc\x00\x51\x89\
+\xd6\xa0\xd3\x29\xd7\xe8\x87\x39\xaa\x8f\xa1\x37\xe4\x18\x5b\xa0\
+\xd2\x78\x54\x21\x89\xd2\x26\x78\x48\xd0\x21\x33\x05\x9b\x15\x2a\
+\x94\x8c\x4f\x54\xb2\x44\x30\xc5\x53\xca\x7b\x30\xa1\x17\xf8\x04\
+\xf3\xa8\x04\xf4\x19\x63\x1b\xeb\x05\x95\x13\xc7\xde\x32\x15\x22\
+\x4b\x05\xc5\x48\x5a\x62\xb8\x61\xca\x61\x0e\x0f\x50\xb4\x0f\xd3\
+\x3e\x14\x3d\x6c\x24\x92\x0c\xf5\xd6\xe2\x45\x33\xa5\x21\x94\x38\
+\x28\xd8\x47\x35\x11\x5c\x25\xbd\xa2\x32\xe6\x54\xe4\x34\xd5\x5a\
+\x12\x6a\x23\x19\x76\x6e\x50\x59\x58\x80\x98\x81\x5a\x72\xba\x8b\
+\x4f\xa1\xb5\x8e\x4f\xd2\x55\x30\x62\x8a\x25\x81\x41\x16\x95\x51\
+\x03\xeb\x35\x59\x41\x4b\x73\x46\xfc\x51\x65\x1d\x83\xd7\x12\x09\
+\x08\x32\xd4\x7d\x95\x90\x0a\x8c\xc4\x58\x16\x12\x54\x7a\xfc\xc5\
+\x47\xcf\xae\x61\x27\x39\x0d\x9a\x90\x20\x09\xc5\x3d\x23\xaf\xd3\
+\x93\xdc\x25\xe2\x08\x72\x64\xfb\x42\xf3\x1f\xbb\xeb\xbc\xc3\x10\
+\xe2\x9f\x83\x10\x37\x44\x48\x80\xe9\x89\xb6\x50\xcf\xf9\x44\x06\
+\xf8\x29\x27\x97\x05\x8a\x9f\x64\x50\x8c\xfe\x0f\x01\xa5\xc6\xf7\
+\x31\x0d\xe4\x59\x94\x5f\xfa\xe4\xe9\x7f\x19\xf4\xc5\x51\x02\xc0\
+\xfd\x80\x58\x48\x34\x41\x2b\x06\x00\x9b\x1d\x3d\xe0\x17\x46\x91\
+\xa7\xc0\x13\x6c\x1c\x3c\x85\x59\x46\x61\x26\x48\x44\x7c\xc5\x7d\
+\x46\xb7\xeb\x4c\x42\x7a\x8c\x09\x74\x92\x98\x51\xaf\x6e\x49\x39\
+\xcf\x48\x5b\x0a\x8a\x8c\x70\x94\x89\x67\xff\x66\xa9\xc7\x32\x12\
+\x13\xdd\x48\xe1\x18\x13\x50\x2c\xbd\x10\xcf\xd7\xcc\x45\x0c\x00\
+\x41\x8c\x32\xd4\x43\x03\x47\x98\xd3\x29\x44\x53\x9c\x2d\x37\xf7\
+\xd0\x26\x30\x13\x20\xc8\x50\x4d\xf2\xf1\x94\x04\x6d\xd2\x14\x98\
+\x8b\x8e\x89\x91\x24\xfb\x22\x1c\xc6\xa4\x62\xf4\x18\x19\xf8\xf1\
+\xe1\xc2\x12\xa5\xe7\x98\xae\x0f\x4f\x7f\xf8\x1f\x1a\x3f\x68\x5d\
+\
+\x00\x00\x02\xc3\
+\x00\
+\x00\x0a\x40\x78\x9c\xa5\x56\x4d\x6f\xda\x40\x10\xbd\xe7\x57\x4c\
+\x37\x97\x56\x8a\xb1\xd7\xf8\x93\x02\x91\x5a\x29\xbd\x10\xa9\x52\
+\x9a\x4b\x6e\x04\x6f\x6c\x0b\xc7\x4b\x8d\x03\xa4\xbf\xbe\x33\xb3\
+\xeb\x84\x56\x29\xaa\x36\x86\x79\xe0\xdd\x9d\xe7\x37\xcf\x3b\x96\
+\xa7\x97\x87\xc7\x06\x76\xaa\xdb\xd6\xba\x9d\x09\x39\x0a\x04\xa8\
+\x76\xa5\x8b\xba\x2d\x67\xe2\xf6\xc7\x95\x97\x89\xcb\xf9\xd9\x74\
+\xbb\x2b\x61\x5f\x17\x7d\x85\x6b\x92\xcd\x41\x40\xa5\xea\xb2\xea\
+\x87\xb3\x5d\xad\xf6\x5f\xf4\x61\x26\x02\x08\x40\x26\xf8\x15\xc7\
+\xa4\x52\x00\x5e\xa6\xdd\xce\x44\xd5\xf7\x9b\x89\xef\xef\xf7\xfb\
+\xd1\x7e\x3c\xd2\x5d\xe9\x87\x41\x10\xf8\x48\x6f\x97\x4c\x0e\x4d\
+\xdd\xae\xdf\x5a\x28\xf3\x3c\xf7\x79\x56\xc0\xb6\x7f\x6e\xd4\x4c\
+\xdc\x2f\x57\xeb\xb2\xd3\x4f\x6d\x31\x81\xf3\x80\x8f\xcf\x62\x7e\
+\x06\x78\x4c\x3f\x78\x1e\x7c\x53\xad\xea\x96\xbd\xee\x26\x70\xb3\
+\x56\xfd\xaa\x82\x28\x1b\x85\xf0\x31\x4a\xc7\x61\xfa\x09\x3c\x38\
+\xba\xca\xbd\xae\xd4\x63\xbd\xb4\xb5\x8f\x56\xfa\xd1\xdf\x9a\x1c\
+\xcf\xb3\x94\x7d\xdd\x37\x6a\x7e\xdb\xf2\x6f\x01\xe1\xd4\x37\x23\
+\x66\xb6\x50\xdb\xd5\xfc\x6b\xa7\x96\x3d\xce\xed\xeb\xbe\xb2\xd7\
+\x1c\x4d\x7d\x9e\x1a\x56\x3d\x6c\xe7\x34\x82\x3f\x66\xa4\x84\xba\
+\x98\x89\xef\xcb\x52\x79\x92\x2a\xeb\xf4\x1a\x4b\x6b\x75\xab\x86\
+\x33\x6f\x70\x5e\xc0\x43\xdd\x34\xc3\x24\xfd\xf7\xba\x27\x32\x42\
+\xed\x54\xab\x8b\xc2\xd6\x7e\x44\xfb\xb3\xf3\xb0\x20\x35\x24\x9e\
+\x5f\xf1\xf1\x47\x2e\x92\xfd\x52\x9d\x3e\xca\xe5\xfc\xcd\x12\x2b\
+\x40\x86\xeb\xe4\x22\x80\x45\x60\x20\x81\x45\x62\x20\x80\x3b\xb8\
+\x8e\x2f\x62\x58\x48\x03\x12\x16\xb1\x81\x18\xee\x04\x5f\xfc\xa6\
+\x5a\x6e\x94\xc0\x6a\x89\xeb\x6f\x7a\xdd\x3c\x97\xba\x3d\x5a\x07\
+\x1b\x5d\xb7\x3d\xee\x91\x10\x42\x88\x38\x18\x99\xc0\xac\xfe\x97\
+\xc4\xe0\x42\xb2\x28\x8b\x2c\xd5\x62\x42\x3a\x51\x9d\x91\x67\xd0\
+\xe8\x35\x28\xdf\x2d\x56\x92\x52\x03\xa4\x57\xfe\x8f\x60\xc9\x7e\
+\x4a\x36\x54\x26\x16\xcd\x08\x1b\x2b\x8d\xb3\xd2\x22\xca\x96\xb1\
+\xc5\xf7\xba\x2b\x43\x16\x69\xc0\x08\x3f\x21\xf8\x54\xe1\x29\xf6\
+\x3a\x45\x0e\x63\x8e\x0c\x39\x33\x27\xae\x14\xf3\xcd\x07\xef\x47\
+\x8a\xe0\xc4\x32\xc6\xd4\x98\x23\x23\x35\x4e\x1c\x39\x19\x92\x5a\
+\xa0\x92\x0c\x44\x24\x8d\x61\xec\x44\x9b\x20\x5d\x82\x44\x31\x47\
+\x0e\x29\x47\xea\xc4\x95\x01\x09\xa1\x20\xc6\xc4\xb1\xcc\x6c\xb0\
+\xdb\x7a\x9e\x71\xb8\xde\x3e\x56\xc2\x1c\xae\x55\xb1\xbf\xa8\xc4\
+\x62\x42\xba\xdc\x6a\x4b\x89\x23\xb3\x40\xc6\x3b\xf2\xb0\x31\xf8\
+\x14\xb1\x18\x92\xa2\xd0\x91\x89\x1a\x44\x92\x1e\x8c\xc0\x36\x0e\
+\xe9\xa3\x70\xdb\x51\x92\xfb\x17\x77\xa7\xc5\x84\x14\x3a\x56\x2a\
+\xf9\x21\x26\x23\x78\x25\x0d\x5d\x77\x3a\xb9\x65\xf3\x07\x3a\x79\
+\xfa\x99\x78\x82\x8b\x6d\xa7\x7c\x83\x63\xbe\x11\x8e\xba\x22\x4e\
+\x36\x72\xe2\x01\xc3\x17\xe3\x78\x16\x47\x02\x37\xf6\xf8\xe8\x56\
+\x44\xe6\x0d\x68\xf8\x46\xcc\xeb\xee\x40\x30\x6c\xc2\xb1\xc5\xd7\
+\xb6\x75\x55\x6b\x1f\x71\xd9\x4b\xa7\xe4\x43\xc7\x01\x77\xcf\xdb\
+\x2d\x3c\xf5\x4b\xfb\xca\x42\x7f\xa6\xf4\xd2\x36\xff\x0d\x92\xe8\
+\xa9\xeb\
+\x00\x00\x16\xb3\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
+\x6e\x6f\x22\x3f\x3e\x0a\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x64\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\
+\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\
+\x6e\x74\x73\x2f\x31\x2e\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\
+\x6e\x73\x3a\x63\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x63\x72\
+\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\x6e\x73\x2e\x6f\x72\
+\x67\x2f\x6e\x73\x23\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
+\x72\x64\x66\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\
+\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x30\x32\x2f\x32\
+\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\x74\x61\x78\x2d\x6e\x73\x23\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x76\x67\x3d\x22\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\
+\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\
+\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x0a\
+\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x6f\x64\x69\x70\x6f\x64\
+\x69\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x73\x6f\x64\x69\x70\x6f\
+\x64\x69\x2e\x73\x6f\x75\x72\x63\x65\x66\x6f\x72\x67\x65\x2e\x6e\
+\x65\x74\x2f\x44\x54\x44\x2f\x73\x6f\x64\x69\x70\x6f\x64\x69\x2d\
+\x30\x2e\x64\x74\x64\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
+\x69\x6e\x6b\x73\x63\x61\x70\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\
+\x2f\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\
+\x67\x2f\x6e\x61\x6d\x65\x73\x70\x61\x63\x65\x73\x2f\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x22\x0a\x20\x20\x20\x77\x69\x64\x74\x68\x3d\
+\x22\x35\x31\x32\x70\x74\x22\x0a\x20\x20\x20\x68\x65\x69\x67\x68\
+\x74\x3d\x22\x35\x31\x32\x70\x74\x22\x0a\x20\x20\x20\x76\x69\x65\
+\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x0a\x20\x20\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\
+\x2e\x31\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x73\x76\x67\x33\x32\
+\x39\x30\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\
+\x64\x6f\x63\x6e\x61\x6d\x65\x3d\x22\x73\x65\x61\x6c\x2e\x73\x76\
+\x67\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x76\
+\x65\x72\x73\x69\x6f\x6e\x3d\x22\x30\x2e\x39\x32\x2e\x34\x20\x28\
+\x35\x64\x61\x36\x38\x39\x63\x33\x31\x33\x2c\x20\x32\x30\x31\x39\
+\x2d\x30\x31\x2d\x31\x34\x29\x22\x3e\x0a\x20\x20\x3c\x6d\x65\x74\
+\x61\x64\x61\x74\x61\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6d\
+\x65\x74\x61\x64\x61\x74\x61\x33\x32\x39\x36\x22\x3e\x0a\x20\x20\
+\x20\x20\x3c\x72\x64\x66\x3a\x52\x44\x46\x3e\x0a\x20\x20\x20\x20\
+\x20\x20\x3c\x63\x63\x3a\x57\x6f\x72\x6b\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x72\x64\x66\x3a\x61\x62\x6f\x75\x74\x3d\x22\x22\
+\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x64\x63\x3a\x66\x6f\
+\x72\x6d\x61\x74\x3e\x69\x6d\x61\x67\x65\x2f\x73\x76\x67\x2b\x78\
+\x6d\x6c\x3c\x2f\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x20\x3c\x64\x63\x3a\x74\x79\x70\x65\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x64\x66\x3a\x72\
+\x65\x73\x6f\x75\x72\x63\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\
+\x70\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x64\x63\x6d\x69\
+\x74\x79\x70\x65\x2f\x53\x74\x69\x6c\x6c\x49\x6d\x61\x67\x65\x22\
+\x20\x2f\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x2f\x63\x63\x3a\x57\
+\x6f\x72\x6b\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x72\x64\x66\x3a\x52\
+\x44\x46\x3e\x0a\x20\x20\x3c\x2f\x6d\x65\x74\x61\x64\x61\x74\x61\
+\x3e\x0a\x20\x20\x3c\x64\x65\x66\x73\x0a\x20\x20\x20\x20\x20\x69\
+\x64\x3d\x22\x64\x65\x66\x73\x33\x32\x39\x34\x22\x3e\x0a\x20\x20\
+\x20\x20\x3c\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\
+\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\
+\x65\x3a\x63\x6f\x6c\x6c\x65\x63\x74\x3d\x22\x61\x6c\x77\x61\x79\
+\x73\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x69\
+\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x33\x38\x35\x33\
+\x22\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x73\x74\x6f\x70\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\
+\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x65\x32\x34\x38\x34\
+\x38\x3b\x73\x74\x6f\x70\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6f\x66\x66\x73\x65\
+\x74\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\
+\x64\x3d\x22\x73\x74\x6f\x70\x33\x38\x34\x39\x22\x20\x2f\x3e\x0a\
+\x20\x20\x20\x20\x20\x20\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\
+\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x62\x66\x32\x63\x32\x63\x3b\x73\
+\x74\x6f\x70\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\
+\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\
+\x73\x74\x6f\x70\x33\x38\x35\x31\x22\x20\x2f\x3e\x0a\x20\x20\x20\
+\x20\x3c\x2f\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\
+\x74\x3e\x0a\x20\x20\x20\x20\x3c\x6c\x69\x6e\x65\x61\x72\x47\x72\
+\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x6e\
+\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6c\x6c\x65\x63\x74\x3d\x22\
+\x61\x6c\x77\x61\x79\x73\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\
+\x6c\x69\x6e\x6b\x3a\x68\x72\x65\x66\x3d\x22\x23\x6c\x69\x6e\x65\
+\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x33\x38\x35\x33\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x69\x6e\x65\x61\
+\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x38\x34\x30\x22\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\
+\x74\x73\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\
+\x73\x65\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x31\x3d\x22\x31\
+\x34\x35\x2e\x39\x33\x31\x35\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x79\x31\x3d\x22\x32\x38\x31\x2e\x35\x38\x34\x36\x39\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x78\x32\x3d\x22\x33\x36\x32\x2e\x34\x30\
+\x34\x36\x39\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x79\x32\x3d\x22\
+\x34\x30\x30\x2e\x35\x38\x32\x38\x32\x22\x20\x2f\x3e\x0a\x20\x20\
+\x20\x20\x3c\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\
+\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\
+\x65\x3a\x63\x6f\x6c\x6c\x65\x63\x74\x3d\x22\x61\x6c\x77\x61\x79\
+\x73\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x6c\x69\x6e\x6b\x3a\
+\x68\x72\x65\x66\x3d\x22\x23\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\
+\x64\x69\x65\x6e\x74\x33\x38\x35\x33\x22\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x69\x64\x3d\x22\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\
+\x69\x65\x6e\x74\x38\x35\x35\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x78\x31\x3d\x22\x31\x38\x32\x2e\x31\x33\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x79\x31\x3d\x22\x34\x35\x2e\x39\x35\x30\x30\x30\x31\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x32\x3d\x22\x33\x37\x33\
+\x2e\x38\x37\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x79\x32\x3d\x22\
+\x33\x32\x32\x2e\x32\x32\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x67\
+\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\x3d\x22\x75\x73\
+\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\x22\x20\x2f\x3e\
+\x0a\x20\x20\x3c\x2f\x64\x65\x66\x73\x3e\x0a\x20\x20\x3c\x73\x6f\
+\x64\x69\x70\x6f\x64\x69\x3a\x6e\x61\x6d\x65\x64\x76\x69\x65\x77\
+\x0a\x20\x20\x20\x20\x20\x70\x61\x67\x65\x63\x6f\x6c\x6f\x72\x3d\
+\x22\x23\x66\x66\x66\x66\x66\x66\x22\x0a\x20\x20\x20\x20\x20\x62\
+\x6f\x72\x64\x65\x72\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x36\x36\x36\
+\x36\x36\x36\x22\x0a\x20\x20\x20\x20\x20\x62\x6f\x72\x64\x65\x72\
+\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x31\x22\x0a\x20\x20\x20\x20\
+\x20\x6f\x62\x6a\x65\x63\x74\x74\x6f\x6c\x65\x72\x61\x6e\x63\x65\
+\x3d\x22\x31\x30\x22\x0a\x20\x20\x20\x20\x20\x67\x72\x69\x64\x74\
+\x6f\x6c\x65\x72\x61\x6e\x63\x65\x3d\x22\x31\x30\x22\x0a\x20\x20\
+\x20\x20\x20\x67\x75\x69\x64\x65\x74\x6f\x6c\x65\x72\x61\x6e\x63\
+\x65\x3d\x22\x31\x30\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\
+\x63\x61\x70\x65\x3a\x70\x61\x67\x65\x6f\x70\x61\x63\x69\x74\x79\
+\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x3a\x70\x61\x67\x65\x73\x68\x61\x64\x6f\x77\x3d\x22\x32\
+\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\
+\x77\x69\x6e\x64\x6f\x77\x2d\x77\x69\x64\x74\x68\x3d\x22\x32\x34\
+\x30\x30\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\
+\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x68\x65\x69\x67\x68\x74\x3d\
+\x22\x31\x32\x38\x34\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\
+\x6e\x61\x6d\x65\x64\x76\x69\x65\x77\x33\x32\x39\x32\x22\x0a\x20\
+\x20\x20\x20\x20\x73\x68\x6f\x77\x67\x72\x69\x64\x3d\x22\x66\x61\
+\x6c\x73\x65\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x3a\x7a\x6f\x6f\x6d\x3d\x22\x30\x2e\x39\x37\x37\x37\x39\
+\x36\x31\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\
+\x65\x3a\x63\x78\x3d\x22\x35\x38\x38\x2e\x37\x38\x32\x37\x37\x22\
+\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\
+\x79\x3d\x22\x32\x38\x38\x2e\x32\x34\x30\x31\x37\x22\x0a\x20\x20\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\
+\x6f\x77\x2d\x78\x3d\x22\x32\x33\x39\x31\x22\x0a\x20\x20\x20\x20\
+\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\
+\x2d\x79\x3d\x22\x2d\x39\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x6d\x61\x78\
+\x69\x6d\x69\x7a\x65\x64\x3d\x22\x31\x22\x0a\x20\x20\x20\x20\x20\
+\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x75\x72\x72\x65\x6e\x74\
+\x2d\x6c\x61\x79\x65\x72\x3d\x22\x73\x76\x67\x33\x32\x39\x30\x22\
+\x20\x2f\x3e\x0a\x20\x20\x3c\x67\x0a\x20\x20\x20\x20\x20\x69\x64\
+\x3d\x22\x67\x38\x34\x37\x22\x0a\x20\x20\x20\x20\x20\x73\x74\x79\
+\x6c\x65\x3d\x22\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\
+\x3a\x31\x3b\x66\x69\x6c\x6c\x3a\x75\x72\x6c\x28\x23\x6c\x69\x6e\
+\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x38\x35\x35\x29\x22\
+\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x64\x3d\x22\x6d\x20\x33\x30\x34\x2e\x34\x34\x2c\x31\
+\x2e\x38\x34\x20\x63\x20\x36\x2e\x30\x31\x2c\x38\x2e\x35\x33\x20\
+\x31\x32\x2e\x30\x36\x2c\x31\x37\x2e\x30\x34\x20\x31\x38\x2e\x32\
+\x36\x2c\x32\x35\x2e\x34\x35\x20\x38\x2e\x34\x31\x2c\x2d\x35\x2e\
+\x38\x35\x20\x31\x36\x2e\x38\x34\x2c\x2d\x31\x31\x2e\x36\x37\x20\
+\x32\x35\x2e\x33\x37\x2c\x2d\x31\x37\x2e\x33\x36\x20\x33\x2e\x39\
+\x35\x2c\x39\x2e\x35\x37\x20\x37\x2e\x32\x36\x2c\x31\x39\x2e\x33\
+\x38\x20\x31\x31\x2e\x31\x31\x2c\x32\x38\x2e\x39\x39\x20\x39\x2e\
+\x36\x32\x2c\x2d\x33\x2e\x33\x34\x20\x31\x39\x2e\x32\x33\x2c\x2d\
+\x36\x2e\x37\x20\x32\x38\x2e\x38\x34\x2c\x2d\x31\x30\x2e\x30\x39\
+\x20\x31\x2e\x33\x33\x2c\x31\x30\x2e\x32\x32\x20\x32\x2e\x32\x36\
+\x2c\x32\x30\x2e\x34\x39\x20\x33\x2e\x33\x39\x2c\x33\x30\x2e\x37\
+\x34\x20\x31\x30\x2e\x32\x31\x2c\x2d\x30\x2e\x37\x20\x32\x30\x2e\
+\x34\x34\x2c\x2d\x31\x2e\x33\x32\x20\x33\x30\x2e\x36\x38\x2c\x2d\
+\x31\x2e\x36\x35\x20\x2d\x31\x2e\x35\x35\x2c\x39\x2e\x39\x39\x20\
+\x2d\x33\x2e\x31\x34\x2c\x31\x39\x2e\x39\x37\x20\x2d\x34\x2e\x39\
+\x34\x2c\x32\x39\x2e\x39\x31\x20\x31\x30\x2e\x30\x32\x2c\x32\x2e\
+\x31\x20\x32\x30\x2e\x30\x37\x2c\x34\x2e\x30\x37\x20\x33\x30\x2e\
+\x30\x37\x2c\x36\x2e\x33\x20\x2d\x34\x2e\x32\x2c\x39\x2e\x34\x34\
+\x20\x2d\x38\x2e\x36\x33\x2c\x31\x38\x2e\x37\x38\x20\x2d\x31\x32\
+\x2e\x34\x38\x2c\x32\x38\x2e\x33\x37\x20\x39\x2e\x33\x38\x2c\x33\
+\x2e\x39\x31\x20\x31\x38\x2e\x34\x32\x2c\x38\x2e\x35\x38\x20\x32\
+\x37\x2e\x35\x35\x2c\x31\x33\x2e\x30\x35\x20\x2d\x36\x2e\x34\x35\
+\x2c\x38\x2e\x31\x20\x2d\x31\x33\x2e\x31\x36\x2c\x31\x35\x2e\x39\
+\x38\x20\x2d\x31\x39\x2e\x35\x2c\x32\x34\x2e\x31\x36\x20\x37\x2e\
+\x37\x39\x2c\x36\x2e\x36\x37\x20\x31\x35\x2e\x34\x2c\x31\x33\x2e\
+\x35\x35\x20\x32\x33\x2e\x33\x35\x2c\x32\x30\x2e\x30\x34\x20\x2d\
+\x38\x2e\x35\x39\x2c\x35\x2e\x38\x31\x20\x2d\x31\x37\x2e\x30\x31\
+\x2c\x31\x31\x2e\x38\x35\x20\x2d\x32\x35\x2e\x32\x38\x2c\x31\x38\
+\x2e\x30\x39\x20\x35\x2e\x37\x38\x2c\x38\x2e\x35\x32\x20\x31\x31\
+\x2e\x34\x34\x2c\x31\x37\x2e\x31\x32\x20\x31\x37\x2e\x30\x38\x2c\
+\x32\x35\x2e\x37\x33\x20\x2d\x39\x2e\x37\x2c\x33\x2e\x33\x20\x2d\
+\x31\x39\x2e\x31\x33\x2c\x37\x2e\x33\x36\x20\x2d\x32\x38\x2e\x38\
+\x33\x2c\x31\x30\x2e\x36\x34\x20\x33\x2e\x34\x38\x2c\x39\x2e\x38\
+\x20\x36\x2e\x36\x38\x2c\x31\x39\x2e\x36\x39\x20\x31\x30\x2c\x32\
+\x39\x2e\x35\x34\x20\x2d\x31\x30\x2e\x32\x35\x2c\x30\x2e\x37\x34\
+\x20\x2d\x32\x30\x2e\x34\x39\x2c\x31\x2e\x35\x31\x20\x2d\x33\x30\
+\x2e\x36\x39\x2c\x32\x2e\x36\x33\x20\x30\x2e\x35\x38\x2c\x31\x30\
+\x2e\x32\x37\x20\x31\x2e\x32\x34\x2c\x32\x30\x2e\x35\x34\x20\x31\
+\x2e\x36\x38\x2c\x33\x30\x2e\x38\x32\x20\x2d\x31\x30\x2c\x2d\x31\
+\x2e\x35\x33\x20\x2d\x31\x39\x2e\x39\x39\x2c\x2d\x33\x2e\x31\x36\
+\x20\x2d\x32\x39\x2e\x39\x33\x2c\x2d\x35\x2e\x30\x36\x20\x2d\x32\
+\x2e\x31\x2c\x31\x30\x2e\x30\x32\x20\x2d\x34\x2e\x30\x37\x2c\x32\
+\x30\x2e\x30\x38\x20\x2d\x36\x2e\x33\x2c\x33\x30\x2e\x30\x38\x20\
+\x2d\x39\x2e\x33\x2c\x2d\x34\x20\x2d\x31\x38\x2e\x35\x32\x2c\x2d\
+\x38\x2e\x32\x20\x2d\x32\x37\x2e\x37\x31\x2c\x2d\x31\x32\x2e\x34\
+\x36\x20\x2d\x34\x2e\x36\x36\x2c\x39\x2e\x31\x39\x20\x2d\x39\x2e\
+\x31\x38\x2c\x31\x38\x2e\x34\x36\x20\x2d\x31\x33\x2e\x39\x34\x2c\
+\x32\x37\x2e\x36\x20\x2d\x37\x2e\x38\x36\x2c\x2d\x36\x2e\x36\x31\
+\x20\x2d\x31\x35\x2e\x36\x39\x2c\x2d\x31\x33\x2e\x32\x35\x20\x2d\
+\x32\x33\x2e\x38\x35\x2c\x2d\x31\x39\x2e\x34\x38\x20\x2d\x36\x2e\
+\x36\x33\x2c\x37\x2e\x38\x33\x20\x2d\x31\x33\x2e\x33\x39\x2c\x31\
+\x35\x2e\x35\x34\x20\x2d\x32\x30\x2e\x30\x31\x2c\x32\x33\x2e\x33\
+\x37\x20\x2d\x35\x2e\x37\x36\x2c\x2d\x38\x2e\x34\x38\x20\x2d\x31\
+\x31\x2e\x38\x33\x2c\x2d\x31\x36\x2e\x37\x33\x20\x2d\x31\x37\x2e\
+\x37\x38\x2c\x2d\x32\x35\x2e\x30\x37\x20\x2d\x38\x2e\x37\x33\x2c\
+\x35\x2e\x35\x39\x20\x2d\x31\x37\x2e\x33\x35\x2c\x31\x31\x2e\x33\
+\x34\x20\x2d\x32\x36\x2e\x31\x32\x2c\x31\x36\x2e\x38\x37\x20\x2d\
+\x33\x2e\x32\x36\x2c\x2d\x39\x2e\x35\x39\x20\x2d\x36\x2e\x39\x33\
+\x2c\x2d\x31\x39\x2e\x30\x35\x20\x2d\x31\x30\x2e\x36\x31\x2c\x2d\
+\x32\x38\x2e\x34\x39\x20\x2d\x39\x2e\x37\x31\x2c\x32\x2e\x39\x33\
+\x20\x2d\x31\x39\x2e\x32\x32\x2c\x36\x2e\x34\x39\x20\x2d\x32\x38\
+\x2e\x38\x37\x2c\x39\x2e\x36\x33\x20\x2d\x31\x2e\x33\x32\x2c\x2d\
+\x31\x30\x2e\x30\x39\x20\x2d\x32\x2e\x33\x32\x2c\x2d\x32\x30\x2e\
+\x32\x31\x20\x2d\x33\x2e\x31\x37\x2c\x2d\x33\x30\x2e\x33\x34\x20\
+\x2d\x31\x30\x2e\x33\x36\x2c\x30\x2e\x30\x39\x20\x2d\x32\x30\x2e\
+\x36\x36\x2c\x31\x2e\x31\x33\x20\x2d\x33\x30\x2e\x39\x36\x2c\x32\
+\x2e\x30\x38\x20\x31\x2e\x35\x33\x2c\x2d\x31\x30\x2e\x32\x35\x20\
+\x33\x2e\x32\x33\x2c\x2d\x32\x30\x2e\x34\x38\x20\x35\x2e\x31\x35\
+\x2c\x2d\x33\x30\x2e\x36\x36\x20\x2d\x31\x30\x2e\x31\x2c\x2d\x31\
+\x2e\x39\x36\x20\x2d\x32\x30\x2e\x31\x38\x2c\x2d\x34\x2e\x30\x39\
+\x20\x2d\x33\x30\x2e\x33\x35\x2c\x2d\x35\x2e\x36\x37\x20\x34\x2e\
+\x31\x2c\x2d\x39\x2e\x35\x34\x20\x38\x2e\x36\x36\x2c\x2d\x31\x38\
+\x2e\x38\x37\x20\x31\x32\x2e\x35\x39\x2c\x2d\x32\x38\x2e\x34\x37\
+\x20\x2d\x39\x2e\x30\x34\x2c\x2d\x34\x2e\x36\x38\x20\x2d\x31\x38\
+\x2e\x33\x31\x2c\x2d\x38\x2e\x38\x39\x20\x2d\x32\x37\x2e\x35\x2c\
+\x2d\x31\x33\x2e\x32\x35\x20\x36\x2e\x33\x36\x2c\x2d\x38\x2e\x32\
+\x34\x20\x31\x33\x2e\x32\x2c\x2d\x31\x36\x2e\x31\x31\x20\x31\x39\
+\x2e\x35\x31\x2c\x2d\x32\x34\x2e\x33\x38\x20\x2d\x38\x2e\x30\x37\
+\x2c\x2d\x36\x2e\x34\x20\x2d\x31\x35\x2e\x37\x32\x2c\x2d\x31\x33\
+\x2e\x33\x20\x2d\x32\x33\x2e\x33\x39\x2c\x2d\x32\x30\x2e\x31\x36\
+\x20\x38\x2e\x34\x33\x2c\x2d\x35\x2e\x37\x38\x20\x31\x36\x2e\x37\
+\x33\x2c\x2d\x31\x31\x2e\x37\x34\x20\x32\x35\x2e\x31\x34\x2c\x2d\
+\x31\x37\x2e\x35\x36\x20\x2d\x35\x2e\x35\x39\x2c\x2d\x38\x2e\x36\
+\x35\x20\x2d\x31\x31\x2e\x32\x39\x2c\x2d\x31\x37\x2e\x32\x33\x20\
+\x2d\x31\x36\x2e\x39\x36\x2c\x2d\x32\x35\x2e\x38\x32\x20\x39\x2e\
+\x34\x32\x2c\x2d\x33\x2e\x37\x31\x20\x31\x38\x2e\x39\x33\x2c\x2d\
+\x37\x2e\x31\x37\x20\x32\x38\x2e\x33\x2c\x2d\x31\x31\x20\x2d\x32\
+\x2e\x39\x37\x2c\x2d\x39\x2e\x36\x39\x20\x2d\x36\x2e\x33\x34\x2c\
+\x2d\x31\x39\x2e\x32\x35\x20\x2d\x39\x2e\x34\x36\x2c\x2d\x32\x38\
+\x2e\x38\x39\x20\x31\x30\x2e\x30\x35\x2c\x2d\x31\x2e\x33\x31\x20\
+\x32\x30\x2e\x31\x34\x2c\x2d\x32\x2e\x32\x39\x20\x33\x30\x2e\x32\
+\x33\x2c\x2d\x33\x2e\x32\x33\x20\x2d\x30\x2e\x30\x38\x2c\x2d\x31\
+\x30\x2e\x33\x32\x20\x2d\x30\x2e\x36\x36\x2c\x2d\x32\x30\x2e\x36\
+\x35\x20\x2d\x31\x2e\x39\x38\x2c\x2d\x33\x30\x2e\x38\x39\x20\x31\
+\x30\x2e\x32\x32\x2c\x31\x2e\x35\x33\x20\x32\x30\x2e\x34\x33\x2c\
+\x33\x2e\x31\x37\x20\x33\x30\x2e\x35\x37\x2c\x35\x2e\x31\x38\x20\
+\x31\x2e\x39\x2c\x2d\x31\x30\x2e\x31\x20\x33\x2e\x39\x38\x2c\x2d\
+\x32\x30\x2e\x31\x37\x20\x36\x2e\x31\x39\x2c\x2d\x33\x30\x2e\x32\
+\x32\x20\x39\x2e\x32\x37\x2c\x34\x2e\x32\x31\x20\x31\x38\x2e\x35\
+\x35\x2c\x38\x2e\x34\x31\x20\x32\x37\x2e\x39\x36\x2c\x31\x32\x2e\
+\x33\x32\x20\x34\x2e\x35\x38\x2c\x2d\x39\x2e\x30\x36\x20\x39\x2e\
+\x31\x33\x2c\x2d\x31\x38\x2e\x31\x32\x20\x31\x33\x2e\x35\x35\x2c\
+\x2d\x32\x37\x2e\x32\x36\x20\x38\x2e\x30\x31\x2c\x36\x2e\x33\x36\
+\x20\x31\x35\x2e\x39\x34\x2c\x31\x32\x2e\x38\x33\x20\x32\x33\x2e\
+\x38\x31\x2c\x31\x39\x2e\x33\x36\x20\x37\x2c\x2d\x37\x2e\x36\x31\
+\x20\x31\x33\x2e\x37\x32\x2c\x2d\x31\x35\x2e\x34\x36\x20\x32\x30\
+\x2e\x32\x33\x2c\x2d\x32\x33\x2e\x34\x39\x20\x6d\x20\x2d\x32\x30\
+\x2c\x34\x38\x2e\x37\x32\x20\x63\x20\x2d\x32\x38\x2e\x33\x34\x2c\
+\x32\x2e\x36\x38\x20\x2d\x35\x35\x2e\x37\x34\x2c\x31\x35\x2e\x38\
+\x34\x20\x2d\x37\x35\x2e\x32\x38\x2c\x33\x36\x2e\x36\x20\x2d\x32\
+\x34\x2e\x32\x36\x2c\x32\x34\x2e\x32\x38\x20\x2d\x33\x37\x2e\x32\
+\x38\x2c\x35\x39\x2e\x35\x37\x20\x2d\x33\x33\x2e\x39\x31\x2c\x39\
+\x33\x2e\x38\x31\x20\x32\x2e\x33\x39\x2c\x34\x34\x2e\x36\x37\x20\
+\x33\x32\x2e\x36\x39\x2c\x38\x35\x2e\x39\x35\x20\x37\x33\x2e\x39\
+\x31\x2c\x31\x30\x32\x2e\x38\x38\x20\x34\x36\x2e\x30\x31\x2c\x32\
+\x30\x2e\x35\x34\x20\x31\x30\x34\x2e\x31\x31\x2c\x37\x2e\x33\x38\
+\x20\x31\x33\x37\x2e\x34\x31\x2c\x2d\x33\x30\x2e\x32\x35\x20\x31\
+\x34\x2e\x33\x35\x2c\x2d\x31\x36\x2e\x30\x32\x20\x32\x34\x2e\x36\
+\x35\x2c\x2d\x33\x35\x2e\x36\x39\x20\x32\x39\x2e\x31\x37\x2c\x2d\
+\x35\x36\x2e\x37\x34\x20\x38\x2e\x31\x34\x2c\x2d\x33\x38\x2e\x38\
+\x31\x20\x2d\x33\x2e\x37\x32\x2c\x2d\x38\x31\x2e\x35\x37\x20\x2d\
+\x33\x31\x2e\x39\x32\x2c\x2d\x31\x30\x39\x2e\x36\x38\x20\x43\x20\
+\x33\x35\x38\x2e\x37\x33\x2c\x36\x30\x2e\x35\x33\x20\x33\x32\x30\
+\x2e\x38\x36\x2c\x34\x36\x2e\x35\x31\x20\x32\x38\x34\x2e\x34\x34\
+\x2c\x35\x30\x2e\x35\x36\x20\x5a\x22\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x33\x32\x38\x33\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x6f\x70\x61\
+\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x3a\x75\x72\x6c\x28\
+\x23\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x38\
+\x35\x35\x29\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\
+\x3a\x31\x2e\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3a\x63\x6f\x6e\x6e\x65\x63\x74\x6f\x72\x2d\
+\x63\x75\x72\x76\x61\x74\x75\x72\x65\x3d\x22\x30\x22\x20\x2f\x3e\
+\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x64\x3d\x22\x6d\x20\x32\x39\x32\x2e\x34\x31\x2c\x37\x38\
+\x2e\x34\x32\x20\x63\x20\x33\x34\x2e\x34\x34\x2c\x2d\x31\x2e\x38\
+\x34\x20\x36\x38\x2e\x39\x32\x2c\x31\x37\x2e\x35\x20\x38\x35\x2e\
+\x34\x31\x2c\x34\x37\x2e\x37\x37\x20\x31\x39\x2e\x31\x32\x2c\x33\
+\x33\x2e\x31\x33\x20\x31\x34\x2e\x36\x39\x2c\x37\x38\x2e\x31\x37\
+\x20\x2d\x31\x31\x2e\x31\x39\x2c\x31\x30\x36\x2e\x34\x37\x20\x2d\
+\x32\x32\x2e\x37\x35\x2c\x32\x37\x2e\x35\x39\x20\x2d\x36\x32\x2e\
+\x36\x34\x2c\x33\x38\x2e\x37\x35\x20\x2d\x39\x36\x2e\x36\x31\x2c\
+\x32\x38\x2e\x32\x36\x20\x2d\x33\x35\x2e\x31\x38\x2c\x2d\x39\x2e\
+\x38\x34\x20\x2d\x36\x32\x2e\x36\x33\x2c\x2d\x34\x32\x2e\x35\x33\
+\x20\x2d\x36\x36\x2e\x30\x36\x2c\x2d\x37\x38\x2e\x39\x35\x20\x2d\
+\x34\x2e\x39\x34\x2c\x2d\x33\x35\x2e\x32\x31\x20\x31\x33\x2e\x38\
+\x31\x2c\x2d\x37\x31\x2e\x38\x20\x34\x34\x2e\x30\x37\x2c\x2d\x38\
+\x39\x2e\x39\x34\x20\x31\x33\x2e\x32\x2c\x2d\x38\x2e\x35\x33\x20\
+\x32\x38\x2e\x38\x35\x2c\x2d\x31\x32\x2e\x34\x39\x20\x34\x34\x2e\
+\x33\x38\x2c\x2d\x31\x33\x2e\x36\x31\x20\x7a\x22\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x33\x32\x38\x35\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\
+\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x3a\x75\
+\x72\x6c\x28\x23\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\
+\x6e\x74\x38\x35\x35\x29\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\
+\x69\x74\x79\x3a\x31\x2e\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6e\x6e\x65\x63\x74\
+\x6f\x72\x2d\x63\x75\x72\x76\x61\x74\x75\x72\x65\x3d\x22\x30\x22\
+\x20\x2f\x3e\x0a\x20\x20\x3c\x2f\x67\x3e\x0a\x20\x20\x3c\x70\x61\
+\x74\x68\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x63\x6f\x6e\x6e\x65\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\x61\
+\x74\x75\x72\x65\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x73\x74\
+\x79\x6c\x65\x3d\x22\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\
+\x69\x6c\x6c\x3a\x75\x72\x6c\x28\x23\x6c\x69\x6e\x65\x61\x72\x47\
+\x72\x61\x64\x69\x65\x6e\x74\x38\x34\x30\x29\x3b\x66\x69\x6c\x6c\
+\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x22\x0a\x20\x20\x20\x20\
+\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x33\x32\x38\x37\x22\x0a\x20\
+\x20\x20\x20\x20\x64\x3d\x22\x6d\x20\x34\x34\x2e\x38\x38\x2c\x34\
+\x30\x36\x2e\x37\x39\x20\x63\x20\x33\x37\x2e\x33\x39\x2c\x2d\x34\
+\x33\x2e\x35\x35\x20\x37\x35\x2e\x30\x39\x2c\x2d\x38\x36\x2e\x38\
+\x34\x20\x31\x31\x32\x2e\x39\x34\x2c\x2d\x31\x32\x39\x2e\x39\x39\
+\x20\x2d\x31\x2e\x33\x37\x2c\x38\x2e\x31\x31\x20\x2d\x32\x2e\x37\
+\x33\x2c\x31\x36\x2e\x32\x32\x20\x2d\x33\x2e\x39\x36\x2c\x32\x34\
+\x2e\x33\x35\x20\x31\x31\x2e\x36\x36\x2c\x2d\x30\x2e\x33\x33\x20\
+\x32\x33\x2e\x32\x37\x2c\x2d\x31\x2e\x33\x37\x20\x33\x34\x2e\x39\
+\x2c\x2d\x32\x2e\x32\x32\x20\x30\x2e\x38\x34\x2c\x31\x31\x2e\x37\
+\x31\x20\x32\x2e\x32\x32\x2c\x32\x33\x2e\x33\x37\x20\x33\x2e\x33\
+\x31\x2c\x33\x35\x2e\x30\x35\x20\x31\x31\x2e\x31\x35\x2c\x2d\x33\
+\x2e\x37\x35\x20\x32\x32\x2e\x31\x33\x2c\x2d\x38\x2e\x30\x37\x20\
+\x33\x33\x2e\x34\x36\x2c\x2d\x31\x31\x2e\x32\x38\x20\x33\x2e\x37\
+\x39\x2c\x31\x30\x2e\x39\x20\x38\x2e\x30\x37\x2c\x32\x31\x2e\x36\
+\x31\x20\x31\x31\x2e\x39\x37\x2c\x33\x32\x2e\x34\x37\x20\x39\x2e\
+\x38\x34\x2c\x2d\x36\x2e\x33\x36\x20\x31\x39\x2e\x35\x36\x2c\x2d\
+\x31\x32\x2e\x39\x31\x20\x32\x39\x2e\x34\x31\x2c\x2d\x31\x39\x2e\
+\x32\x37\x20\x36\x2e\x38\x34\x2c\x39\x2e\x34\x35\x20\x31\x33\x2e\
+\x35\x33\x2c\x31\x39\x20\x32\x30\x2e\x36\x32\x2c\x32\x38\x2e\x32\
+\x38\x20\x37\x2e\x34\x39\x2c\x2d\x38\x2e\x37\x39\x20\x31\x35\x2e\
+\x31\x32\x2c\x2d\x31\x37\x2e\x34\x36\x20\x32\x32\x2e\x36\x39\x2c\
+\x2d\x32\x36\x2e\x31\x37\x20\x39\x2e\x32\x33\x2c\x37\x2e\x33\x33\
+\x20\x31\x38\x2e\x31\x31\x2c\x31\x35\x2e\x31\x20\x32\x37\x2e\x35\
+\x2c\x32\x32\x2e\x32\x34\x20\x34\x2e\x30\x36\x2c\x34\x39\x2e\x33\
+\x20\x39\x2e\x33\x34\x2c\x39\x38\x2e\x34\x39\x20\x31\x33\x2e\x33\
+\x39\x2c\x31\x34\x37\x2e\x38\x20\x2d\x32\x30\x2c\x2d\x31\x30\x2e\
+\x37\x35\x20\x2d\x34\x30\x2e\x32\x31\x2c\x2d\x32\x31\x2e\x31\x32\
+\x20\x2d\x36\x30\x2e\x30\x37\x2c\x2d\x33\x32\x2e\x31\x32\x20\x2d\
+\x33\x2e\x38\x2c\x2d\x31\x2e\x38\x39\x20\x2d\x38\x2e\x33\x39\x2c\
+\x2d\x35\x2e\x32\x32\x20\x2d\x31\x32\x2e\x36\x39\x2c\x2d\x32\x2e\
+\x36\x20\x2d\x32\x31\x2e\x37\x37\x2c\x31\x31\x2e\x35\x35\x20\x2d\
+\x34\x33\x2e\x33\x34\x2c\x32\x33\x2e\x35\x31\x20\x2d\x36\x35\x2e\
+\x33\x32\x2c\x33\x34\x2e\x36\x37\x20\x34\x2e\x33\x2c\x2d\x34\x35\
+\x2e\x37\x39\x20\x38\x2e\x38\x33\x2c\x2d\x39\x31\x2e\x35\x37\x20\
+\x31\x32\x2e\x36\x35\x2c\x2d\x31\x33\x37\x2e\x34\x20\x2d\x32\x33\
+\x2e\x33\x38\x2c\x33\x38\x2e\x37\x31\x20\x2d\x34\x35\x2e\x37\x37\
+\x2c\x37\x38\x2e\x30\x32\x20\x2d\x36\x38\x2e\x37\x38\x2c\x31\x31\
+\x36\x2e\x39\x35\x20\x2d\x31\x31\x2e\x34\x39\x2c\x2d\x32\x33\x2e\
+\x35\x36\x20\x2d\x32\x32\x2e\x39\x39\x2c\x2d\x34\x37\x2e\x31\x32\
+\x20\x2d\x33\x34\x2e\x39\x31\x2c\x2d\x37\x30\x2e\x34\x36\x20\x2d\
+\x32\x35\x2e\x37\x35\x2c\x2d\x33\x2e\x30\x34\x20\x2d\x35\x31\x2e\
+\x35\x2c\x2d\x36\x2e\x32\x37\x20\x2d\x37\x37\x2e\x31\x31\x2c\x2d\
+\x31\x30\x2e\x33\x20\x7a\x22\x20\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\
+\x3e\x0a\
+\x00\x00\x2e\xaf\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
+\x6e\x6f\x22\x3f\x3e\x0a\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x64\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\
+\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\
+\x6e\x74\x73\x2f\x31\x2e\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\
+\x6e\x73\x3a\x63\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x63\x72\
+\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\x6e\x73\x2e\x6f\x72\
+\x67\x2f\x6e\x73\x23\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
+\x72\x64\x66\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\
+\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x30\x32\x2f\x32\
+\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\x74\x61\x78\x2d\x6e\x73\x23\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x76\x67\x3d\x22\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\
+\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\
+\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\
+\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\
+\x22\x0a\x20\x20\x20\x64\x61\x74\x61\x2d\x6e\x61\x6d\x65\x3d\x22\
+\x4c\x61\x79\x65\x72\x20\x31\x22\x0a\x20\x20\x20\x76\x69\x65\x77\
+\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\
+\x22\x0a\x20\x20\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x31\x22\x0a\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\x35\x31\x32\
+\x22\x0a\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\x32\
+\x22\x3e\x0a\x20\x20\x3c\x6d\x65\x74\x61\x64\x61\x74\x61\x0a\x20\
+\x20\x20\x20\x20\x69\x64\x3d\x22\x6d\x65\x74\x61\x64\x61\x74\x61\
+\x31\x31\x35\x22\x3e\x0a\x20\x20\x20\x20\x3c\x72\x64\x66\x3a\x52\
+\x44\x46\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x63\x63\x3a\x57\x6f\
+\x72\x6b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x64\x66\x3a\
+\x61\x62\x6f\x75\x74\x3d\x22\x22\x3e\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x20\x3c\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x69\x6d\x61\
+\x67\x65\x2f\x73\x76\x67\x2b\x78\x6d\x6c\x3c\x2f\x64\x63\x3a\x66\
+\x6f\x72\x6d\x61\x74\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\
+\x64\x63\x3a\x74\x79\x70\x65\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x72\x64\x66\x3a\x72\x65\x73\x6f\x75\x72\x63\x65\x3d\
+\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\x2e\x6f\x72\x67\
+\x2f\x64\x63\x2f\x64\x63\x6d\x69\x74\x79\x70\x65\x2f\x53\x74\x69\
+\x6c\x6c\x49\x6d\x61\x67\x65\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x3c\x64\x63\x3a\x74\x69\x74\x6c\x65\x3e\x34\x2d\
+\x62\x69\x74\x63\x6f\x69\x6e\x2d\x63\x61\x73\x68\x2d\x6c\x6f\x67\
+\x6f\x2d\x66\x6c\x61\x67\x3c\x2f\x64\x63\x3a\x74\x69\x74\x6c\x65\
+\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x2f\x63\x63\x3a\x57\x6f\x72\
+\x6b\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x72\x64\x66\x3a\x52\x44\x46\
+\x3e\x0a\x20\x20\x3c\x2f\x6d\x65\x74\x61\x64\x61\x74\x61\x3e\x0a\
+\x20\x20\x3c\x64\x65\x66\x73\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\
+\x22\x64\x65\x66\x73\x31\x30\x30\x22\x3e\x0a\x20\x20\x20\x20\x3c\
+\x73\x74\x79\x6c\x65\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\
+\x22\x73\x74\x79\x6c\x65\x39\x38\x22\x3e\x2e\x63\x6c\x73\x2d\x31\
+\x7b\x66\x69\x6c\x6c\x3a\x23\x30\x30\x35\x36\x43\x30\x3b\x7d\x2e\
+\x63\x6c\x73\x2d\x32\x7b\x66\x69\x6c\x6c\x3a\x23\x66\x66\x66\x3b\
+\x7d\x3c\x2f\x73\x74\x79\x6c\x65\x3e\x0a\x20\x20\x3c\x2f\x64\x65\
+\x66\x73\x3e\x0a\x20\x20\x3c\x74\x69\x74\x6c\x65\x0a\x20\x20\x20\
+\x20\x20\x69\x64\x3d\x22\x74\x69\x74\x6c\x65\x31\x30\x32\x22\x3e\
+\x34\x2d\x62\x69\x74\x63\x6f\x69\x6e\x2d\x63\x61\x73\x68\x2d\x6c\
+\x6f\x67\x6f\x2d\x66\x6c\x61\x67\x3c\x2f\x74\x69\x74\x6c\x65\x3e\
+\x0a\x20\x20\x3c\x67\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x67\
+\x32\x35\x35\x34\x22\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x64\
+\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\x69\x6e\x65\x3b\x66\x69\
+\x6c\x6c\x3a\x23\x63\x30\x63\x30\x63\x30\x3b\x73\x74\x72\x6f\x6b\
+\x65\x2d\x77\x69\x64\x74\x68\x3a\x30\x2e\x36\x37\x38\x32\x34\x32\
+\x39\x38\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x64\x3d\x22\x6d\x20\
+\x34\x33\x33\x2e\x39\x35\x33\x31\x32\x2c\x31\x31\x36\x2e\x38\x35\
+\x31\x35\x36\x20\x63\x20\x32\x37\x2e\x32\x33\x39\x38\x33\x2c\x33\
+\x39\x2e\x36\x31\x35\x31\x32\x20\x34\x33\x2e\x31\x38\x35\x35\x35\
+\x2c\x38\x37\x2e\x36\x31\x30\x34\x31\x20\x34\x33\x2e\x31\x38\x35\
+\x35\x35\x2c\x31\x33\x39\x2e\x33\x31\x34\x34\x36\x20\x30\x2c\x35\
+\x31\x2e\x35\x38\x30\x36\x33\x20\x2d\x31\x35\x2e\x38\x37\x31\x31\
+\x35\x2c\x39\x39\x2e\x34\x34\x32\x33\x31\x20\x2d\x34\x32\x2e\x39\
+\x39\x32\x31\x39\x2c\x31\x33\x38\x2e\x39\x38\x32\x34\x32\x20\x48\
+\x20\x35\x31\x32\x20\x56\x20\x31\x31\x36\x2e\x38\x35\x31\x35\x36\
+\x20\x5a\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x70\
+\x61\x74\x68\x31\x30\x34\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\
+\x70\x61\x74\x68\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\
+\x65\x3d\x22\x64\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\x69\x6e\
+\x65\x3b\x66\x69\x6c\x6c\x3a\x23\x63\x30\x63\x30\x63\x30\x3b\x73\
+\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x30\x2e\x36\x37\
+\x38\x32\x34\x32\x39\x38\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x64\
+\x3d\x22\x4d\x20\x30\x2c\x31\x31\x36\x2e\x38\x35\x31\x35\x36\x20\
+\x56\x20\x33\x39\x35\x2e\x31\x34\x38\x34\x34\x20\x48\x20\x37\x38\
+\x2e\x31\x30\x35\x34\x36\x39\x20\x43\x20\x35\x30\x2e\x39\x35\x33\
+\x39\x35\x31\x2c\x33\x35\x35\x2e\x35\x39\x34\x37\x35\x20\x33\x35\
+\x2e\x30\x36\x32\x35\x2c\x33\x30\x37\x2e\x37\x30\x38\x36\x33\x20\
+\x33\x35\x2e\x30\x36\x32\x35\x2c\x32\x35\x36\x2e\x30\x39\x39\x36\
+\x31\x20\x63\x20\x30\x2c\x2d\x35\x31\x2e\x36\x39\x35\x30\x37\x20\
+\x31\x35\x2e\x39\x34\x32\x39\x38\x32\x2c\x2d\x39\x39\x2e\x36\x35\
+\x36\x38\x36\x20\x34\x33\x2e\x31\x37\x35\x37\x38\x31\x2c\x2d\x31\
+\x33\x39\x2e\x32\x34\x38\x30\x35\x20\x7a\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x31\x30\x36\x22\x20\
+\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x63\x69\x72\x63\x6c\x65\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x63\x6c\x61\x73\x73\x3d\x22\x63\x6c\x73\
+\x2d\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x63\x78\x3d\x22\x32\
+\x35\x36\x2e\x30\x30\x31\x37\x31\x22\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x63\x79\x3d\x22\x32\x35\x36\x22\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x72\x3d\x22\x31\x39\x34\x2e\x38\x32\x32\x34\x32\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x63\x69\x72\x63\x6c\x65\
+\x31\x30\x38\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\
+\x65\x3d\x22\x64\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\x69\x6e\
+\x65\x3b\x66\x69\x6c\x6c\x3a\x23\x63\x30\x63\x30\x63\x30\x3b\x73\
+\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x30\x2e\x36\x35\
+\x36\x31\x37\x37\x37\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x70\
+\x61\x74\x68\x0a\x20\x20\x20\x20\x20\x20\x20\x63\x6c\x61\x73\x73\
+\x3d\x22\x63\x6c\x73\x2d\x32\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x64\x3d\x22\x6d\x20\x33\x36\x34\x2e\x32\x32\x32\x32\x38\x2c\x32\
+\x36\x35\x2e\x36\x32\x33\x38\x31\x20\x2d\x30\x2e\x31\x32\x38\x30\
+\x37\x2c\x2d\x30\x2e\x32\x33\x38\x32\x34\x20\x2d\x30\x2e\x30\x32\
+\x31\x39\x2c\x2d\x30\x2e\x30\x33\x39\x32\x20\x63\x20\x2d\x30\x2e\
+\x30\x37\x37\x36\x2c\x2d\x30\x2e\x32\x33\x39\x38\x20\x2d\x30\x2e\
+\x31\x33\x35\x37\x39\x2c\x2d\x30\x2e\x34\x39\x30\x34\x33\x20\x2d\
+\x30\x2e\x32\x32\x34\x32\x36\x2c\x2d\x30\x2e\x37\x34\x39\x36\x32\
+\x20\x6c\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\
+\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x35\
+\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\
+\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x35\x20\x2d\
+\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\
+\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x33\x20\x2d\x30\x2e\
+\x30\x32\x31\x38\x2c\x2d\x30\x2e\x30\x33\x39\x36\x20\x61\x20\x34\
+\x37\x2e\x30\x36\x35\x38\x37\x39\x2c\x34\x37\x2e\x30\x36\x35\x38\
+\x37\x39\x20\x30\x20\x30\x20\x30\x20\x2d\x31\x35\x2e\x33\x38\x37\
+\x39\x35\x2c\x2d\x32\x33\x2e\x30\x32\x35\x32\x20\x6c\x20\x2d\x30\
+\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x33\x20\x63\x20\x2d\
+\x30\x2e\x32\x31\x36\x35\x33\x2c\x2d\x30\x2e\x31\x36\x35\x33\x31\
+\x20\x2d\x30\x2e\x34\x34\x33\x38\x39\x2c\x2d\x30\x2e\x33\x34\x39\
+\x39\x37\x20\x2d\x30\x2e\x36\x36\x31\x32\x31\x2c\x2d\x30\x2e\x35\
+\x31\x34\x35\x31\x20\x6c\x20\x2d\x30\x2e\x32\x39\x39\x35\x36\x2c\
+\x2d\x30\x2e\x32\x32\x32\x37\x31\x20\x2d\x30\x2e\x32\x31\x36\x34\
+\x36\x2c\x2d\x30\x2e\x31\x36\x34\x35\x31\x20\x2d\x30\x2e\x30\x39\
+\x33\x32\x2c\x2d\x30\x2e\x30\x37\x37\x37\x20\x2d\x30\x2e\x32\x30\
+\x36\x33\x38\x2c\x2d\x30\x2e\x31\x34\x35\x30\x38\x20\x2d\x30\x2e\
+\x30\x39\x33\x34\x2c\x2d\x30\x2e\x30\x37\x37\x36\x20\x2d\x30\x2e\
+\x32\x30\x36\x34\x2c\x2d\x30\x2e\x31\x34\x35\x30\x34\x20\x2d\x30\
+\x2e\x30\x39\x33\x32\x2c\x2d\x30\x2e\x30\x37\x37\x38\x20\x2d\x30\
+\x2e\x32\x31\x36\x34\x38\x2c\x2d\x30\x2e\x31\x36\x34\x35\x33\x20\
+\x2d\x30\x2e\x31\x31\x33\x33\x32\x2c\x2d\x30\x2e\x30\x36\x37\x37\
+\x20\x2d\x30\x2e\x32\x31\x36\x35\x33\x2c\x2d\x30\x2e\x31\x36\x34\
+\x34\x38\x20\x2d\x30\x2e\x31\x31\x33\x33\x34\x2c\x2d\x30\x2e\x30\
+\x36\x37\x37\x20\x2d\x30\x2e\x32\x33\x32\x38\x31\x2c\x2d\x30\x2e\
+\x31\x35\x35\x32\x31\x20\x2d\x30\x2e\x31\x31\x33\x33\x33\x2c\x2d\
+\x30\x2e\x30\x36\x37\x37\x20\x2d\x30\x2e\x31\x33\x37\x33\x34\x2c\
+\x2d\x30\x2e\x32\x30\x37\x39\x38\x20\x2d\x30\x2e\x31\x32\x33\x33\
+\x31\x2c\x2d\x30\x2e\x30\x38\x36\x38\x20\x2d\x30\x2e\x32\x33\x32\
+\x38\x32\x2c\x2d\x30\x2e\x31\x35\x35\x31\x38\x20\x2d\x30\x2e\x31\
+\x32\x33\x32\x39\x2c\x2d\x30\x2e\x30\x38\x36\x36\x20\x2d\x30\x2e\
+\x32\x33\x36\x36\x34\x2c\x2d\x30\x2e\x31\x35\x35\x32\x33\x20\x2d\
+\x30\x2e\x31\x32\x33\x33\x32\x2c\x2d\x30\x2e\x30\x38\x36\x36\x20\
+\x2d\x30\x2e\x32\x33\x32\x37\x38\x2c\x2d\x30\x2e\x31\x35\x35\x32\
+\x35\x20\x2d\x30\x2e\x31\x32\x33\x33\x35\x2c\x2d\x30\x2e\x30\x38\
+\x36\x38\x20\x2d\x30\x2e\x32\x34\x37\x35\x34\x2c\x2d\x30\x2e\x31\
+\x37\x33\x38\x38\x20\x2d\x30\x2e\x31\x32\x33\x32\x38\x2c\x2d\x30\
+\x2e\x30\x38\x36\x38\x20\x2d\x30\x2e\x32\x36\x37\x2c\x2d\x30\x2e\
+\x31\x36\x33\x37\x32\x20\x2d\x30\x2e\x31\x32\x33\x33\x31\x2c\x2d\
+\x30\x2e\x30\x38\x36\x39\x20\x2d\x30\x2e\x32\x36\x36\x39\x32\x2c\
+\x2d\x30\x2e\x31\x36\x33\x37\x32\x20\x2d\x30\x2e\x31\x32\x33\x33\
+\x34\x2c\x2d\x30\x2e\x30\x38\x36\x38\x20\x2d\x30\x2e\x32\x36\x36\
+\x39\x34\x2c\x2d\x30\x2e\x31\x36\x33\x37\x36\x20\x2d\x30\x2e\x31\
+\x32\x33\x33\x31\x2c\x2d\x30\x2e\x30\x38\x36\x37\x20\x2d\x30\x2e\
+\x32\x36\x36\x39\x32\x2c\x2d\x30\x2e\x31\x36\x33\x37\x34\x20\x2d\
+\x30\x2e\x31\x34\x33\x37\x2c\x2d\x30\x2e\x30\x37\x37\x36\x20\x2d\
+\x30\x2e\x32\x36\x36\x38\x39\x2c\x2d\x30\x2e\x31\x36\x33\x37\x36\
+\x20\x2d\x30\x2e\x31\x34\x33\x36\x32\x2c\x2d\x30\x2e\x30\x37\x37\
+\x34\x20\x2d\x30\x2e\x32\x38\x37\x31\x35\x2c\x2d\x30\x2e\x31\x35\
+\x35\x31\x38\x20\x2d\x30\x2e\x31\x34\x33\x36\x33\x2c\x2d\x30\x2e\
+\x30\x37\x37\x35\x20\x2d\x30\x2e\x32\x39\x38\x2c\x2d\x30\x2e\x31\
+\x37\x32\x32\x38\x20\x2d\x30\x2e\x31\x34\x33\x36\x33\x2c\x2d\x30\
+\x2e\x30\x37\x37\x38\x20\x2d\x30\x2e\x32\x39\x38\x30\x31\x2c\x2d\
+\x30\x2e\x31\x37\x32\x32\x39\x20\x2d\x30\x2e\x31\x34\x33\x35\x35\
+\x2c\x2d\x30\x2e\x30\x37\x37\x35\x20\x2d\x30\x2e\x32\x39\x38\x30\
+\x35\x2c\x2d\x30\x2e\x31\x37\x32\x32\x38\x20\x2d\x30\x2e\x31\x35\
+\x35\x32\x2c\x2d\x30\x2e\x30\x39\x36\x32\x20\x2d\x30\x2e\x32\x39\
+\x37\x39\x36\x2c\x2d\x30\x2e\x31\x37\x32\x33\x35\x20\x2d\x30\x2e\
+\x31\x35\x35\x32\x31\x2c\x2d\x30\x2e\x30\x39\x36\x31\x20\x2d\x30\
+\x2e\x33\x31\x37\x34\x2c\x2d\x30\x2e\x31\x36\x32\x31\x39\x20\x2d\
+\x30\x2e\x31\x35\x35\x32\x32\x2c\x2d\x30\x2e\x30\x39\x36\x32\x20\
+\x2d\x30\x2e\x33\x31\x37\x34\x32\x2c\x2d\x30\x2e\x31\x36\x32\x31\
+\x39\x20\x2d\x30\x2e\x32\x31\x34\x39\x32\x2c\x2d\x30\x2e\x31\x31\
+\x34\x37\x32\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\
+\x30\x35\x20\x63\x20\x2d\x30\x2e\x31\x35\x35\x32\x32\x2c\x2d\x30\
+\x2e\x30\x39\x35\x39\x20\x2d\x30\x2e\x33\x31\x37\x34\x32\x2c\x2d\
+\x30\x2e\x31\x36\x32\x31\x38\x20\x2d\x30\x2e\x34\x37\x31\x38\x31\
+\x2c\x2d\x30\x2e\x32\x35\x38\x34\x34\x20\x61\x20\x36\x35\x2e\x36\
+\x39\x37\x34\x34\x35\x2c\x36\x35\x2e\x36\x39\x37\x34\x34\x35\x20\
+\x30\x20\x30\x20\x30\x20\x2d\x32\x31\x2e\x30\x33\x38\x30\x34\x2c\
+\x2d\x36\x2e\x36\x34\x37\x33\x39\x20\x35\x38\x2e\x38\x32\x32\x36\
+\x35\x31\x2c\x35\x38\x2e\x38\x32\x32\x36\x35\x31\x20\x30\x20\x30\
+\x20\x30\x20\x35\x2e\x36\x33\x36\x32\x36\x2c\x2d\x37\x2e\x30\x37\
+\x38\x38\x39\x20\x6c\x20\x30\x2e\x32\x37\x30\x30\x38\x2c\x2d\x30\
+\x2e\x34\x30\x31\x32\x20\x30\x2e\x30\x32\x30\x34\x2c\x2d\x30\x2e\
+\x30\x30\x39\x20\x30\x2e\x31\x32\x34\x39\x34\x2c\x2d\x30\x2e\x31\
+\x39\x35\x36\x31\x20\x30\x2e\x31\x36\x33\x37\x37\x2c\x2d\x30\x2e\
+\x32\x36\x36\x39\x31\x20\x30\x2e\x30\x38\x36\x38\x2c\x2d\x30\x2e\
+\x31\x32\x33\x33\x33\x20\x30\x2e\x31\x36\x33\x37\x38\x2c\x2d\x30\
+\x2e\x32\x36\x36\x39\x35\x20\x30\x2e\x30\x38\x37\x2c\x2d\x30\x2e\
+\x31\x32\x33\x33\x33\x20\x30\x2e\x31\x36\x33\x37\x34\x2c\x2d\x30\
+\x2e\x32\x36\x36\x39\x32\x20\x30\x2e\x30\x38\x36\x38\x2c\x2d\x30\
+\x2e\x31\x32\x33\x33\x34\x20\x30\x2e\x31\x36\x33\x37\x35\x2c\x2d\
+\x30\x2e\x32\x36\x36\x39\x20\x30\x2e\x30\x38\x36\x38\x2c\x2d\x30\
+\x2e\x31\x32\x33\x33\x36\x20\x30\x2e\x31\x36\x33\x37\x2c\x2d\x30\
+\x2e\x32\x36\x36\x39\x35\x20\x30\x2e\x30\x38\x36\x35\x2c\x2d\x30\
+\x2e\x31\x32\x33\x33\x33\x20\x30\x2e\x31\x34\x33\x35\x39\x2c\x2d\
+\x30\x2e\x32\x35\x36\x37\x39\x20\x30\x2e\x30\x38\x36\x37\x2c\x2d\
+\x30\x2e\x31\x32\x33\x33\x32\x20\x30\x2e\x31\x34\x33\x36\x31\x2c\
+\x2d\x30\x2e\x32\x35\x36\x38\x39\x20\x30\x2e\x30\x36\x37\x37\x2c\
+\x2d\x30\x2e\x31\x31\x33\x33\x33\x20\x30\x2e\x31\x34\x33\x36\x33\
+\x2c\x2d\x30\x2e\x32\x35\x36\x38\x35\x20\x30\x2e\x30\x36\x37\x38\
+\x2c\x2d\x30\x2e\x31\x31\x33\x33\x33\x20\x30\x2e\x31\x34\x33\x36\
+\x35\x2c\x2d\x30\x2e\x32\x35\x36\x38\x36\x20\x30\x2e\x30\x36\x37\
+\x33\x2c\x2d\x30\x2e\x31\x31\x33\x33\x33\x20\x30\x2e\x31\x32\x33\
+\x33\x2c\x2d\x30\x2e\x32\x34\x35\x39\x39\x20\x30\x2e\x30\x36\x37\
+\x33\x2c\x2d\x30\x2e\x31\x31\x33\x33\x34\x20\x30\x2e\x31\x32\x33\
+\x32\x36\x2c\x2d\x30\x2e\x32\x34\x35\x39\x36\x20\x30\x2e\x30\x36\
+\x37\x37\x2c\x2d\x30\x2e\x31\x31\x33\x33\x33\x20\x30\x2e\x31\x32\
+\x33\x33\x31\x2c\x2d\x30\x2e\x32\x34\x36\x20\x30\x2e\x30\x36\x37\
+\x33\x2c\x2d\x30\x2e\x31\x31\x33\x33\x34\x20\x30\x2e\x31\x33\x33\
+\x34\x32\x2c\x2d\x30\x2e\x32\x32\x35\x38\x32\x20\x30\x2e\x30\x36\
+\x37\x37\x2c\x2d\x30\x2e\x31\x31\x33\x33\x34\x20\x30\x2e\x31\x33\
+\x34\x32\x33\x2c\x2d\x30\x2e\x32\x32\x35\x38\x33\x20\x30\x2e\x30\
+\x36\x37\x35\x2c\x2d\x30\x2e\x31\x31\x33\x33\x34\x20\x30\x2e\x31\
+\x31\x34\x38\x33\x2c\x2d\x30\x2e\x32\x31\x35\x20\x30\x2e\x30\x36\
+\x37\x36\x2c\x2d\x30\x2e\x31\x31\x33\x33\x33\x20\x30\x2e\x31\x31\
+\x34\x38\x34\x2c\x2d\x30\x2e\x32\x31\x34\x39\x33\x20\x30\x2e\x30\
+\x34\x37\x35\x2c\x2d\x30\x2e\x31\x30\x32\x34\x38\x20\x30\x2e\x31\
+\x31\x34\x36\x2c\x2d\x30\x2e\x32\x31\x34\x39\x39\x20\x30\x2e\x30\
+\x34\x37\x39\x2c\x2d\x30\x2e\x31\x30\x32\x35\x39\x20\x30\x2e\x31\
+\x31\x34\x38\x34\x2c\x2d\x30\x2e\x32\x31\x34\x39\x36\x20\x30\x2e\
+\x30\x34\x37\x35\x2c\x2d\x30\x2e\x31\x30\x32\x35\x38\x20\x30\x2e\
+\x31\x31\x34\x37\x31\x2c\x2d\x30\x2e\x32\x31\x34\x39\x38\x20\x30\
+\x2e\x30\x34\x37\x38\x2c\x2d\x30\x2e\x31\x30\x32\x35\x38\x20\x30\
+\x2e\x30\x39\x34\x37\x2c\x2d\x30\x2e\x32\x30\x34\x38\x36\x20\x30\
+\x2e\x30\x34\x37\x33\x2c\x2d\x30\x2e\x31\x30\x32\x36\x39\x20\x30\
+\x2e\x30\x39\x34\x35\x2c\x2d\x30\x2e\x32\x30\x34\x38\x37\x20\x30\
+\x2e\x30\x34\x37\x37\x2c\x2d\x30\x2e\x31\x30\x32\x34\x38\x20\x30\
+\x2e\x30\x39\x34\x37\x2c\x2d\x30\x2e\x32\x30\x34\x38\x33\x20\x30\
+\x2e\x30\x34\x37\x36\x2c\x2d\x30\x2e\x31\x30\x32\x34\x38\x20\x30\
+\x2e\x31\x30\x33\x38\x34\x2c\x2d\x30\x2e\x32\x33\x32\x38\x36\x20\
+\x30\x2e\x31\x34\x32\x30\x32\x2c\x2d\x30\x2e\x33\x31\x30\x34\x31\
+\x20\x63\x20\x30\x2e\x31\x30\x33\x38\x34\x2c\x2d\x30\x2e\x32\x33\
+\x32\x37\x37\x20\x30\x2e\x31\x38\x37\x38\x33\x2c\x2d\x30\x2e\x34\
+\x35\x39\x34\x32\x20\x30\x2e\x32\x39\x31\x37\x38\x2c\x2d\x30\x2e\
+\x36\x39\x34\x35\x20\x6c\x20\x30\x2e\x30\x32\x30\x34\x2c\x2d\x30\
+\x2e\x30\x30\x39\x20\x61\x20\x34\x31\x2e\x38\x30\x32\x31\x30\x33\
+\x2c\x34\x31\x2e\x38\x30\x32\x31\x30\x33\x20\x30\x20\x30\x20\x30\
+\x20\x32\x2e\x31\x32\x33\x39\x35\x2c\x2d\x32\x34\x2e\x35\x34\x32\
+\x35\x36\x20\x6c\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\
+\x32\x30\x33\x20\x2d\x30\x2e\x30\x32\x31\x36\x2c\x2d\x30\x2e\x30\
+\x33\x39\x36\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\
+\x30\x33\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\
+\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x33\
+\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\
+\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\
+\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x35\x20\x63\x20\
+\x2d\x30\x2e\x30\x34\x37\x37\x2c\x2d\x30\x2e\x32\x33\x32\x38\x20\
+\x2d\x30\x2e\x30\x39\x34\x39\x2c\x2d\x30\x2e\x34\x36\x30\x39\x33\
+\x20\x2d\x30\x2e\x31\x36\x31\x33\x36\x2c\x2d\x30\x2e\x36\x38\x31\
+\x33\x33\x20\x76\x20\x2d\x30\x2e\x30\x35\x30\x34\x20\x6c\x20\x2d\
+\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\
+\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\
+\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x35\x20\x30\x2e\x30\x30\
+\x39\x2c\x30\x2e\x30\x32\x30\x35\x20\x2d\x30\x2e\x30\x39\x36\x33\
+\x2c\x2d\x30\x2e\x31\x37\x38\x34\x35\x20\x63\x20\x2d\x30\x2e\x30\
+\x37\x2c\x2d\x30\x2e\x33\x32\x30\x34\x37\x20\x2d\x30\x2e\x31\x34\
+\x30\x33\x38\x2c\x2d\x30\x2e\x36\x34\x31\x20\x2d\x30\x2e\x32\x34\
+\x31\x33\x2c\x2d\x30\x2e\x39\x37\x30\x38\x35\x20\x2d\x30\x2e\x30\
+\x37\x2c\x2d\x30\x2e\x33\x32\x30\x34\x38\x20\x2d\x30\x2e\x31\x37\
+\x30\x37\x37\x2c\x2d\x30\x2e\x36\x35\x30\x32\x39\x20\x2d\x30\x2e\
+\x32\x36\x30\x37\x34\x2c\x2d\x30\x2e\x39\x36\x30\x36\x38\x20\x6c\
+\x20\x2d\x30\x2e\x31\x31\x37\x30\x38\x2c\x2d\x30\x2e\x32\x31\x38\
+\x30\x39\x20\x2d\x30\x2e\x30\x32\x31\x38\x2c\x2d\x30\x2e\x30\x33\
+\x39\x34\x20\x63\x20\x2d\x30\x2e\x30\x36\x37\x38\x2c\x2d\x30\x2e\
+\x32\x31\x39\x35\x38\x20\x2d\x30\x2e\x31\x33\x34\x32\x35\x2c\x2d\
+\x30\x2e\x34\x34\x20\x2d\x30\x2e\x32\x30\x31\x37\x36\x2c\x2d\x30\
+\x2e\x36\x35\x39\x36\x33\x20\x6c\x20\x2d\x30\x2e\x30\x30\x39\x2c\
+\x2d\x30\x2e\x30\x32\x30\x32\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\
+\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\
+\x2e\x30\x32\x30\x33\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\
+\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\
+\x32\x30\x33\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\
+\x30\x35\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\
+\x33\x20\x41\x20\x34\x31\x2e\x38\x31\x32\x31\x39\x33\x2c\x34\x31\
+\x2e\x38\x31\x32\x31\x39\x33\x20\x30\x20\x30\x20\x30\x20\x33\x31\
+\x35\x2e\x31\x38\x36\x36\x2c\x31\x36\x32\x2e\x32\x33\x30\x35\x38\
+\x20\x6c\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\
+\x35\x20\x63\x20\x2d\x30\x2e\x31\x38\x36\x32\x35\x2c\x2d\x30\x2e\
+\x31\x35\x35\x31\x39\x20\x2d\x30\x2e\x33\x39\x32\x37\x31\x2c\x2d\
+\x30\x2e\x33\x30\x31\x31\x32\x20\x2d\x30\x2e\x35\x37\x38\x39\x34\
+\x2c\x2d\x30\x2e\x34\x35\x36\x32\x38\x20\x6c\x20\x2d\x30\x2e\x32\
+\x35\x37\x36\x36\x2c\x2d\x30\x2e\x31\x39\x34\x30\x33\x20\x2d\x30\
+\x2e\x32\x30\x36\x34\x32\x2c\x2d\x30\x2e\x31\x34\x35\x30\x37\x20\
+\x2d\x30\x2e\x30\x39\x33\x32\x2c\x2d\x30\x2e\x30\x37\x37\x35\x20\
+\x2d\x30\x2e\x31\x37\x35\x33\x39\x2c\x2d\x30\x2e\x31\x33\x35\x36\
+\x36\x20\x2d\x30\x2e\x30\x39\x33\x31\x2c\x2d\x30\x2e\x30\x37\x37\
+\x38\x20\x2d\x30\x2e\x31\x37\x35\x33\x39\x2c\x2d\x30\x2e\x31\x33\
+\x35\x38\x31\x20\x2d\x30\x2e\x30\x39\x33\x32\x2c\x2d\x30\x2e\x30\
+\x37\x37\x37\x20\x2d\x30\x2e\x31\x39\x35\x35\x33\x2c\x2d\x30\x2e\
+\x31\x32\x34\x39\x37\x20\x2d\x30\x2e\x30\x39\x33\x31\x2c\x2d\x30\
+\x2e\x30\x37\x37\x38\x20\x2d\x30\x2e\x32\x30\x36\x34\x33\x2c\x2d\
+\x30\x2e\x31\x34\x35\x30\x33\x20\x2d\x30\x2e\x30\x39\x33\x31\x2c\
+\x2d\x30\x2e\x30\x37\x37\x38\x20\x2d\x30\x2e\x32\x30\x36\x34\x31\
+\x2c\x2d\x30\x2e\x31\x34\x35\x30\x37\x20\x2d\x30\x2e\x30\x39\x33\
+\x2c\x2d\x30\x2e\x30\x37\x37\x36\x20\x2d\x30\x2e\x32\x30\x36\x34\
+\x32\x2c\x2d\x30\x2e\x31\x34\x35\x30\x36\x20\x2d\x30\x2e\x31\x31\
+\x33\x33\x32\x2c\x2d\x30\x2e\x30\x36\x37\x36\x20\x2d\x30\x2e\x32\
+\x30\x36\x33\x39\x2c\x2d\x30\x2e\x31\x34\x35\x30\x38\x20\x2d\x30\
+\x2e\x31\x31\x33\x33\x33\x2c\x2d\x30\x2e\x30\x36\x37\x37\x20\x2d\
+\x30\x2e\x32\x30\x36\x34\x36\x2c\x2d\x30\x2e\x31\x34\x35\x31\x36\
+\x20\x2d\x30\x2e\x31\x31\x33\x33\x33\x2c\x2d\x30\x2e\x30\x36\x37\
+\x35\x20\x2d\x30\x2e\x32\x32\x35\x38\x31\x2c\x2d\x30\x2e\x31\x33\
+\x34\x32\x38\x20\x2d\x30\x2e\x31\x31\x33\x33\x33\x2c\x2d\x30\x2e\
+\x30\x36\x37\x38\x20\x2d\x30\x2e\x32\x32\x35\x38\x36\x2c\x2d\x30\
+\x2e\x31\x33\x34\x33\x33\x20\x2d\x30\x2e\x31\x31\x33\x33\x32\x2c\
+\x2d\x30\x2e\x30\x36\x37\x35\x20\x2d\x30\x2e\x32\x32\x35\x38\x38\
+\x2c\x2d\x30\x2e\x31\x33\x34\x32\x38\x20\x2d\x30\x2e\x31\x31\x33\
+\x33\x33\x2c\x2d\x30\x2e\x30\x36\x37\x37\x20\x2d\x30\x2e\x32\x32\
+\x35\x38\x33\x2c\x2d\x30\x2e\x31\x33\x34\x33\x32\x20\x2d\x30\x2e\
+\x31\x31\x33\x33\x33\x2c\x2d\x30\x2e\x30\x36\x37\x36\x20\x2d\x30\
+\x2e\x32\x33\x36\x36\x38\x2c\x2d\x30\x2e\x31\x35\x35\x31\x39\x20\
+\x2d\x30\x2e\x31\x31\x33\x33\x34\x2c\x2d\x30\x2e\x30\x36\x37\x37\
+\x20\x2d\x30\x2e\x32\x33\x36\x36\x39\x2c\x2d\x30\x2e\x31\x35\x35\
+\x31\x38\x20\x2d\x30\x2e\x31\x31\x33\x33\x34\x2c\x2d\x30\x2e\x30\
+\x36\x37\x35\x20\x2d\x30\x2e\x32\x35\x36\x38\x35\x2c\x2d\x30\x2e\
+\x31\x34\x33\x36\x37\x20\x2d\x30\x2e\x31\x31\x33\x33\x33\x2c\x2d\
+\x30\x2e\x30\x36\x37\x37\x20\x2d\x30\x2e\x32\x35\x36\x30\x38\x2c\
+\x2d\x30\x2e\x31\x34\x33\x36\x32\x20\x2d\x30\x2e\x31\x32\x33\x33\
+\x34\x2c\x2d\x30\x2e\x30\x38\x36\x39\x20\x2d\x30\x2e\x32\x35\x36\
+\x38\x31\x2c\x2d\x30\x2e\x31\x34\x33\x35\x38\x20\x2d\x30\x2e\x31\
+\x32\x33\x33\x33\x2c\x2d\x30\x2e\x30\x38\x36\x37\x20\x2d\x30\x2e\
+\x32\x35\x36\x30\x39\x2c\x2d\x30\x2e\x31\x34\x33\x36\x20\x2d\x30\
+\x2e\x31\x32\x33\x33\x33\x2c\x2d\x30\x2e\x30\x38\x36\x37\x20\x2d\
+\x30\x2e\x32\x36\x36\x39\x34\x2c\x2d\x30\x2e\x31\x36\x33\x37\x33\
+\x20\x2d\x30\x2e\x31\x34\x33\x36\x2c\x2d\x30\x2e\x30\x37\x37\x35\
+\x20\x2d\x30\x2e\x32\x36\x36\x39\x36\x2c\x2d\x30\x2e\x31\x36\x33\
+\x37\x32\x20\x2d\x30\x2e\x31\x34\x33\x36\x32\x2c\x2d\x30\x2e\x30\
+\x37\x37\x36\x20\x2d\x30\x2e\x32\x38\x37\x31\x31\x2c\x2d\x30\x2e\
+\x31\x35\x35\x32\x31\x20\x2d\x30\x2e\x31\x34\x33\x36\x36\x2c\x2d\
+\x30\x2e\x30\x37\x37\x36\x20\x2d\x30\x2e\x32\x38\x37\x31\x33\x2c\
+\x2d\x30\x2e\x31\x35\x35\x31\x37\x20\x2d\x30\x2e\x32\x30\x34\x38\
+\x35\x2c\x2d\x30\x2e\x30\x39\x34\x36\x20\x2d\x30\x2e\x30\x30\x39\
+\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x34\x33\x30\x37\
+\x2c\x2d\x30\x2e\x32\x33\x32\x38\x20\x63\x20\x2d\x31\x32\x2e\x35\
+\x38\x32\x35\x2c\x2d\x36\x2e\x35\x33\x39\x35\x36\x20\x2d\x32\x38\
+\x2e\x35\x36\x37\x37\x39\x2c\x2d\x38\x2e\x35\x30\x38\x33\x34\x20\
+\x2d\x34\x34\x2e\x36\x35\x30\x39\x33\x2c\x2d\x34\x2e\x33\x38\x32\
+\x32\x20\x6c\x20\x2d\x34\x2e\x31\x38\x33\x35\x36\x2c\x31\x2e\x30\
+\x37\x34\x30\x31\x20\x2d\x31\x30\x2e\x35\x38\x31\x38\x36\x2c\x2d\
+\x34\x31\x2e\x32\x30\x36\x39\x20\x2d\x32\x34\x2e\x35\x32\x32\x33\
+\x31\x2c\x36\x2e\x32\x38\x35\x37\x39\x20\x31\x30\x2e\x35\x34\x36\
+\x39\x34\x2c\x34\x31\x2e\x30\x34\x33\x39\x20\x2d\x31\x39\x2e\x36\
+\x32\x32\x36\x2c\x35\x2e\x30\x35\x38\x31\x34\x20\x2d\x31\x30\x2e\
+\x35\x35\x33\x39\x31\x2c\x2d\x34\x30\x2e\x39\x31\x32\x37\x38\x20\
+\x2d\x32\x34\x2e\x35\x32\x32\x33\x36\x2c\x36\x2e\x32\x38\x35\x38\
+\x31\x20\x31\x30\x2e\x35\x34\x36\x39\x34\x2c\x34\x31\x2e\x30\x34\
+\x33\x39\x37\x20\x2d\x35\x30\x2e\x35\x37\x31\x31\x37\x2c\x31\x33\
+\x2e\x30\x31\x33\x31\x33\x20\x36\x2e\x37\x32\x38\x39\x2c\x32\x36\
+\x2e\x31\x35\x32\x30\x32\x20\x32\x30\x2e\x33\x37\x36\x38\x34\x2c\
+\x2d\x35\x2e\x32\x33\x33\x35\x20\x61\x20\x31\x32\x2e\x36\x31\x30\
+\x33\x39\x36\x2c\x31\x32\x2e\x36\x31\x30\x33\x39\x36\x20\x30\x20\
+\x30\x20\x31\x20\x31\x35\x2e\x33\x36\x35\x33\x32\x2c\x39\x2e\x30\
+\x38\x37\x39\x39\x20\x76\x20\x30\x20\x6c\x20\x32\x38\x2e\x32\x38\
+\x33\x37\x33\x2c\x31\x31\x30\x2e\x30\x35\x33\x34\x35\x20\x61\x20\
+\x38\x2e\x34\x32\x35\x32\x39\x38\x2c\x38\x2e\x34\x32\x35\x32\x39\
+\x38\x20\x30\x20\x30\x20\x31\x20\x2d\x36\x2e\x30\x35\x32\x39\x39\
+\x2c\x31\x30\x2e\x32\x34\x38\x32\x33\x20\x6c\x20\x2d\x31\x37\x2e\
+\x38\x35\x34\x37\x39\x2c\x34\x2e\x35\x39\x33\x32\x34\x20\x31\x2e\
+\x30\x34\x39\x32\x32\x2c\x33\x31\x2e\x31\x30\x33\x30\x37\x20\x35\
+\x30\x2e\x35\x31\x31\x34\x2c\x2d\x31\x32\x2e\x39\x38\x30\x35\x34\
+\x20\x31\x30\x2e\x36\x38\x32\x37\x35\x2c\x34\x30\x2e\x39\x36\x39\
+\x34\x31\x20\x32\x34\x2e\x35\x30\x39\x39\x35\x2c\x2d\x36\x2e\x33\
+\x30\x36\x37\x35\x20\x2d\x31\x30\x2e\x35\x35\x33\x39\x32\x2c\x2d\
+\x34\x31\x2e\x30\x36\x34\x31\x35\x20\x31\x39\x2e\x36\x31\x36\x33\
+\x34\x2c\x2d\x35\x2e\x30\x32\x39\x33\x37\x20\x31\x30\x2e\x35\x35\
+\x37\x38\x31\x2c\x34\x31\x2e\x30\x36\x33\x33\x33\x20\x32\x34\x2e\
+\x35\x30\x39\x39\x36\x2c\x2d\x36\x2e\x33\x30\x36\x37\x33\x20\x2d\
+\x31\x30\x2e\x35\x39\x33\x35\x33\x2c\x2d\x34\x31\x2e\x32\x32\x33\
+\x39\x36\x20\x63\x20\x34\x2e\x31\x35\x33\x33\x31\x2c\x2d\x31\x2e\
+\x30\x38\x36\x34\x37\x20\x37\x2e\x37\x32\x36\x31\x36\x2c\x2d\x32\
+\x2e\x30\x30\x38\x33\x37\x20\x31\x30\x2e\x31\x39\x37\x37\x36\x2c\
+\x2d\x32\x2e\x36\x34\x37\x38\x32\x20\x31\x38\x2e\x31\x32\x34\x38\
+\x33\x2c\x2d\x34\x2e\x36\x36\x31\x35\x38\x20\x33\x32\x2e\x37\x38\
+\x31\x36\x32\x2c\x2d\x31\x35\x2e\x32\x38\x37\x37\x31\x20\x34\x31\
+\x2e\x36\x35\x30\x38\x31\x2c\x2d\x32\x38\x2e\x35\x33\x38\x33\x20\
+\x6c\x20\x30\x2e\x32\x39\x39\x35\x31\x2c\x2d\x30\x2e\x34\x34\x32\
+\x33\x34\x20\x30\x2e\x30\x32\x30\x35\x2c\x2d\x30\x2e\x30\x30\x39\
+\x20\x30\x2e\x31\x34\x35\x30\x36\x2c\x2d\x30\x2e\x32\x30\x36\x34\
+\x32\x20\x30\x2e\x31\x39\x32\x34\x38\x2c\x2d\x30\x2e\x33\x31\x30\
+\x34\x33\x20\x30\x2e\x30\x39\x36\x32\x2c\x2d\x30\x2e\x31\x35\x35\
+\x32\x20\x30\x2e\x31\x39\x32\x34\x32\x2c\x2d\x30\x2e\x33\x31\x30\
+\x33\x39\x20\x30\x2e\x30\x39\x35\x39\x2c\x2d\x30\x2e\x31\x35\x35\
+\x32\x31\x20\x30\x2e\x31\x37\x32\x33\x2c\x2d\x30\x2e\x32\x39\x37\
+\x39\x37\x20\x30\x2e\x30\x39\x36\x2c\x2d\x30\x2e\x31\x35\x35\x32\
+\x34\x20\x30\x2e\x31\x37\x32\x33\x33\x2c\x2d\x30\x2e\x32\x39\x38\
+\x30\x31\x20\x30\x2e\x30\x37\x37\x35\x2c\x2d\x30\x2e\x31\x34\x33\
+\x35\x39\x20\x30\x2e\x31\x37\x32\x33\x31\x2c\x2d\x30\x2e\x32\x39\
+\x37\x39\x38\x20\x30\x2e\x30\x37\x37\x37\x2c\x2d\x30\x2e\x31\x34\
+\x33\x36\x35\x20\x30\x2e\x31\x37\x32\x32\x37\x2c\x2d\x30\x2e\x32\
+\x39\x38\x20\x30\x2e\x30\x37\x37\x35\x2c\x2d\x30\x2e\x31\x34\x33\
+\x36\x20\x30\x2e\x31\x35\x35\x32\x34\x2c\x2d\x30\x2e\x32\x38\x37\
+\x31\x35\x20\x30\x2e\x30\x37\x37\x36\x2c\x2d\x30\x2e\x31\x34\x33\
+\x36\x20\x30\x2e\x31\x35\x35\x32\x2c\x2d\x30\x2e\x32\x38\x37\x30\
+\x39\x20\x30\x2e\x30\x37\x37\x34\x2c\x2d\x30\x2e\x31\x34\x33\x36\
+\x37\x20\x30\x2e\x31\x36\x33\x37\x37\x2c\x2d\x30\x2e\x32\x36\x36\
+\x39\x35\x20\x30\x2e\x30\x37\x37\x39\x2c\x2d\x30\x2e\x31\x34\x33\
+\x36\x20\x30\x2e\x31\x36\x33\x37\x36\x2c\x2d\x30\x2e\x32\x36\x36\
+\x39\x38\x20\x30\x2e\x30\x37\x37\x37\x2c\x2d\x30\x2e\x31\x34\x33\
+\x35\x39\x20\x30\x2e\x31\x34\x33\x36\x34\x2c\x2d\x30\x2e\x32\x35\
+\x36\x39\x32\x20\x30\x2e\x30\x37\x37\x37\x2c\x2d\x30\x2e\x31\x34\
+\x33\x36\x33\x20\x30\x2e\x31\x34\x33\x36\x32\x2c\x2d\x30\x2e\x32\
+\x35\x36\x30\x35\x20\x30\x2e\x30\x37\x37\x36\x2c\x2d\x30\x2e\x31\
+\x34\x33\x36\x33\x20\x30\x2e\x31\x34\x33\x36\x33\x2c\x2d\x30\x2e\
+\x32\x35\x36\x31\x31\x20\x30\x2e\x30\x35\x36\x38\x2c\x2d\x30\x2e\
+\x31\x33\x32\x37\x37\x20\x30\x2e\x31\x34\x33\x36\x35\x2c\x2d\x30\
+\x2e\x32\x35\x36\x30\x36\x20\x30\x2e\x30\x35\x36\x38\x2c\x2d\x30\
+\x2e\x31\x33\x32\x37\x37\x20\x30\x2e\x31\x32\x33\x32\x37\x2c\x2d\
+\x30\x2e\x32\x34\x35\x39\x37\x20\x30\x2e\x30\x36\x37\x35\x2c\x2d\
+\x30\x2e\x31\x31\x33\x33\x32\x20\x30\x2e\x31\x32\x33\x33\x39\x2c\
+\x2d\x30\x2e\x32\x34\x35\x39\x38\x20\x30\x2e\x30\x36\x37\x33\x2c\
+\x2d\x30\x2e\x31\x31\x33\x33\x32\x20\x30\x2e\x31\x32\x33\x33\x2c\
+\x2d\x30\x2e\x32\x34\x36\x30\x37\x20\x30\x2e\x30\x36\x37\x35\x2c\
+\x2d\x30\x2e\x31\x31\x33\x32\x31\x20\x30\x2e\x31\x32\x33\x33\x32\
+\x2c\x2d\x30\x2e\x32\x34\x35\x39\x39\x20\x30\x2e\x30\x36\x37\x33\
+\x2c\x2d\x30\x2e\x31\x31\x33\x33\x33\x20\x30\x2e\x31\x32\x33\x33\
+\x36\x2c\x2d\x30\x2e\x32\x34\x35\x39\x38\x20\x30\x2e\x30\x36\x37\
+\x37\x2c\x2d\x30\x2e\x31\x31\x33\x33\x32\x20\x30\x2e\x31\x32\x33\
+\x33\x32\x2c\x2d\x30\x2e\x32\x34\x36\x30\x32\x20\x30\x2e\x30\x36\
+\x37\x37\x2c\x2d\x30\x2e\x31\x31\x33\x33\x32\x20\x30\x2e\x31\x30\
+\x33\x38\x35\x2c\x2d\x30\x2e\x32\x33\x32\x38\x35\x20\x30\x2e\x30\
+\x36\x37\x37\x2c\x2d\x30\x2e\x31\x31\x33\x33\x33\x20\x30\x2e\x31\
+\x30\x34\x30\x36\x2c\x2d\x30\x2e\x32\x33\x32\x38\x32\x20\x30\x2e\
+\x30\x34\x37\x37\x2c\x2d\x30\x2e\x31\x30\x32\x34\x38\x20\x30\x2e\
+\x31\x31\x33\x33\x32\x2c\x2d\x30\x2e\x32\x36\x35\x33\x39\x20\x30\
+\x2e\x31\x35\x35\x32\x33\x2c\x2d\x30\x2e\x33\x33\x37\x35\x33\x20\
+\x63\x20\x30\x2e\x31\x31\x33\x33\x33\x2c\x2d\x30\x2e\x32\x36\x35\
+\x34\x20\x30\x2e\x32\x33\x32\x37\x38\x2c\x2d\x30\x2e\x35\x31\x31\
+\x34\x33\x20\x30\x2e\x33\x32\x39\x37\x39\x2c\x2d\x30\x2e\x37\x36\
+\x36\x37\x20\x6c\x20\x30\x2e\x30\x30\x38\x2c\x2d\x30\x2e\x30\x33\
+\x30\x31\x20\x61\x20\x34\x37\x2e\x31\x31\x37\x30\x39\x37\x2c\x34\
+\x37\x2e\x31\x31\x37\x30\x39\x37\x20\x30\x20\x30\x20\x30\x20\x32\
+\x2e\x33\x39\x36\x33\x37\x2c\x2d\x32\x37\x2e\x36\x30\x35\x35\x38\
+\x20\x6c\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\
+\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x32\
+\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\
+\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\
+\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x33\x20\x2d\x30\
+\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\
+\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x33\x20\x2d\x30\x2e\x30\
+\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x32\x20\x63\x20\x2d\x30\x2e\
+\x30\x35\x38\x33\x2c\x2d\x30\x2e\x32\x35\x30\x36\x36\x20\x2d\x30\
+\x2e\x31\x31\x35\x37\x36\x2c\x2d\x30\x2e\x35\x30\x30\x35\x35\x20\
+\x2d\x30\x2e\x31\x37\x33\x38\x34\x2c\x2d\x30\x2e\x37\x35\x31\x31\
+\x36\x20\x76\x20\x2d\x30\x2e\x30\x35\x30\x35\x20\x6c\x20\x2d\x30\
+\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x35\x20\x2d\x30\x2e\
+\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\
+\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x35\x20\x2d\x30\x2e\x30\x30\
+\x39\x2c\x2d\x30\x2e\x30\x32\x30\x32\x20\x2d\x30\x2e\x30\x30\x39\
+\x2c\x2d\x30\x2e\x30\x32\x30\x35\x20\x2d\x30\x2e\x30\x30\x39\x2c\
+\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\
+\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\
+\x2e\x30\x32\x30\x35\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\
+\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\
+\x32\x30\x35\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\
+\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\
+\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\
+\x20\x2d\x30\x2e\x30\x34\x33\x2c\x2d\x30\x2e\x30\x37\x37\x36\x20\
+\x63\x20\x2d\x30\x2e\x30\x39\x31\x36\x2c\x2d\x30\x2e\x33\x36\x30\
+\x30\x38\x20\x2d\x30\x2e\x31\x36\x32\x39\x39\x2c\x2d\x30\x2e\x37\
+\x33\x31\x30\x33\x20\x2d\x30\x2e\x32\x37\x34\x37\x34\x2c\x2d\x31\
+\x2e\x30\x38\x31\x30\x31\x20\x2d\x30\x2e\x30\x33\x37\x32\x2c\x2d\
+\x30\x2e\x32\x30\x38\x37\x35\x20\x2d\x30\x2e\x30\x38\x39\x32\x2c\
+\x2d\x30\x2e\x35\x39\x30\x35\x38\x20\x2d\x30\x2e\x31\x31\x31\x35\
+\x39\x2c\x2d\x31\x2e\x30\x30\x39\x36\x20\x7a\x20\x6d\x20\x2d\x31\
+\x34\x34\x2e\x30\x37\x37\x35\x2c\x2d\x37\x33\x2e\x36\x32\x32\x31\
+\x37\x20\x63\x20\x34\x2e\x31\x38\x33\x35\x38\x2c\x2d\x31\x2e\x30\
+\x37\x34\x30\x31\x20\x32\x31\x2e\x34\x38\x31\x31\x38\x2c\x2d\x35\
+\x2e\x34\x31\x38\x32\x32\x20\x32\x37\x2e\x31\x38\x34\x39\x34\x2c\
+\x2d\x36\x2e\x39\x30\x31\x31\x36\x20\x39\x2e\x30\x36\x37\x38\x35\
+\x2c\x2d\x32\x2e\x33\x32\x31\x31\x32\x20\x31\x38\x2e\x30\x30\x33\
+\x37\x37\x2c\x2d\x31\x2e\x34\x32\x30\x31\x36\x20\x32\x34\x2e\x39\
+\x38\x30\x32\x33\x2c\x31\x2e\x39\x34\x20\x6c\x20\x30\x2e\x32\x33\
+\x32\x38\x2c\x30\x2e\x31\x30\x33\x39\x35\x20\x76\x20\x30\x20\x6c\
+\x20\x30\x2e\x31\x30\x32\x34\x38\x2c\x30\x2e\x30\x34\x37\x36\x20\
+\x30\x2e\x31\x34\x33\x36\x32\x2c\x30\x2e\x30\x37\x37\x38\x20\x30\
+\x2e\x30\x37\x31\x32\x2c\x30\x2e\x30\x33\x38\x31\x20\x30\x2e\x31\
+\x34\x33\x35\x38\x2c\x30\x2e\x30\x37\x37\x35\x20\x30\x2e\x30\x37\
+\x31\x34\x2c\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x34\x33\x36\
+\x36\x2c\x30\x2e\x30\x37\x37\x35\x20\x30\x2e\x30\x37\x31\x35\x2c\
+\x30\x2e\x30\x33\x37\x38\x20\x30\x2e\x31\x34\x33\x36\x2c\x30\x2e\
+\x30\x37\x37\x35\x20\x30\x2e\x30\x37\x31\x35\x2c\x30\x2e\x30\x33\
+\x37\x39\x20\x30\x2e\x31\x34\x33\x35\x39\x2c\x30\x2e\x30\x37\x37\
+\x36\x20\x30\x2e\x30\x37\x31\x36\x2c\x30\x2e\x30\x33\x37\x39\x20\
+\x30\x2e\x31\x34\x33\x36\x31\x2c\x30\x2e\x30\x37\x37\x35\x20\x30\
+\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\
+\x34\x33\x36\x32\x2c\x30\x2e\x30\x37\x37\x34\x20\x30\x2e\x30\x37\
+\x31\x34\x2c\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x34\x33\x35\
+\x37\x2c\x30\x2e\x30\x37\x37\x35\x20\x30\x2e\x30\x37\x31\x36\x2c\
+\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x34\x33\x36\x2c\x30\x2e\
+\x30\x37\x37\x38\x20\x30\x2e\x30\x37\x31\x35\x2c\x30\x2e\x30\x33\
+\x38\x31\x20\x30\x2e\x31\x32\x33\x32\x36\x2c\x30\x2e\x30\x38\x36\
+\x37\x20\x30\x2e\x30\x37\x31\x32\x2c\x30\x2e\x30\x33\x38\x31\x20\
+\x30\x2e\x31\x32\x33\x33\x32\x2c\x30\x2e\x30\x38\x36\x36\x20\x30\
+\x2e\x30\x37\x31\x35\x2c\x30\x2e\x30\x33\x38\x31\x20\x30\x2e\x31\
+\x32\x33\x33\x31\x2c\x30\x2e\x30\x38\x36\x36\x20\x30\x2e\x30\x37\
+\x31\x34\x2c\x30\x2e\x30\x33\x38\x31\x20\x30\x2e\x31\x31\x33\x33\
+\x34\x2c\x30\x2e\x30\x36\x37\x37\x20\x30\x2e\x30\x37\x31\x33\x2c\
+\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x31\x33\x33\x33\x2c\x30\
+\x2e\x30\x36\x37\x35\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\
+\x33\x37\x39\x20\x30\x2e\x31\x31\x33\x33\x33\x2c\x30\x2e\x30\x36\
+\x37\x35\x20\x30\x2e\x30\x37\x31\x33\x2c\x30\x2e\x30\x33\x38\x20\
+\x30\x2e\x31\x31\x33\x33\x34\x2c\x30\x2e\x30\x36\x37\x35\x20\x30\
+\x2e\x30\x37\x31\x33\x2c\x30\x2e\x30\x33\x38\x20\x30\x2e\x31\x31\
+\x33\x33\x33\x2c\x30\x2e\x30\x36\x37\x36\x20\x30\x2e\x30\x35\x31\
+\x39\x2c\x30\x2e\x30\x34\x38\x38\x20\x30\x2e\x31\x31\x33\x33\x34\
+\x2c\x30\x2e\x30\x36\x37\x36\x20\x30\x2e\x30\x34\x31\x2c\x30\x2e\
+\x30\x32\x38\x36\x20\x30\x2e\x31\x31\x33\x33\x33\x2c\x30\x2e\x30\
+\x36\x37\x37\x20\x30\x2e\x30\x34\x31\x32\x2c\x30\x2e\x30\x32\x38\
+\x37\x20\x30\x2e\x31\x31\x33\x33\x33\x2c\x30\x2e\x30\x36\x37\x34\
+\x20\x30\x2e\x30\x34\x31\x33\x2c\x30\x2e\x30\x32\x38\x34\x20\x30\
+\x2e\x31\x31\x33\x33\x34\x2c\x30\x2e\x30\x36\x37\x37\x20\x30\x2e\
+\x30\x34\x31\x2c\x30\x2e\x30\x32\x38\x36\x20\x30\x2e\x30\x39\x33\
+\x31\x2c\x30\x2e\x30\x37\x37\x35\x20\x30\x2e\x30\x34\x31\x2c\x30\
+\x2e\x30\x32\x38\x34\x20\x30\x2e\x31\x31\x33\x33\x34\x2c\x30\x2e\
+\x30\x36\x37\x34\x20\x30\x2e\x31\x35\x35\x31\x36\x2c\x30\x2e\x30\
+\x39\x36\x32\x20\x63\x20\x30\x2e\x31\x31\x33\x33\x34\x2c\x30\x2e\
+\x30\x36\x37\x37\x20\x30\x2e\x32\x31\x36\x34\x39\x2c\x30\x2e\x31\
+\x36\x35\x33\x20\x30\x2e\x33\x32\x39\x38\x34\x2c\x30\x2e\x32\x33\
+\x32\x38\x32\x20\x76\x20\x30\x20\x61\x20\x32\x31\x2e\x31\x34\x37\
+\x34\x33\x39\x2c\x32\x31\x2e\x31\x34\x37\x34\x33\x39\x20\x30\x20\
+\x30\x20\x31\x20\x37\x2e\x34\x39\x34\x38\x31\x2c\x31\x30\x2e\x37\
+\x33\x37\x30\x34\x20\x76\x20\x30\x20\x6c\x20\x30\x2e\x30\x33\x31\
+\x37\x2c\x30\x2e\x30\x35\x39\x38\x20\x63\x20\x30\x2e\x30\x33\x33\
+\x36\x2c\x30\x2e\x31\x31\x30\x32\x35\x20\x30\x2e\x30\x37\x37\x36\
+\x2c\x30\x2e\x32\x33\x39\x37\x36\x20\x30\x2e\x31\x31\x30\x39\x2c\
+\x30\x2e\x33\x34\x39\x39\x37\x20\x6c\x20\x30\x2e\x30\x30\x39\x2c\
+\x30\x2e\x30\x32\x30\x34\x20\x30\x2e\x30\x36\x34\x35\x2c\x30\x2e\
+\x31\x31\x38\x37\x20\x63\x20\x30\x2e\x30\x34\x35\x38\x2c\x30\x2e\
+\x31\x38\x30\x30\x39\x20\x30\x2e\x31\x30\x30\x39\x31\x2c\x30\x2e\
+\x33\x32\x39\x38\x35\x20\x30\x2e\x31\x34\x36\x36\x38\x2c\x30\x2e\
+\x35\x30\x39\x38\x36\x20\x61\x20\x33\x2e\x30\x36\x37\x36\x32\x34\
+\x37\x2c\x33\x2e\x30\x36\x37\x36\x32\x34\x37\x20\x30\x20\x30\x20\
+\x31\x20\x30\x2e\x30\x39\x37\x37\x2c\x30\x2e\x35\x36\x31\x39\x31\
+\x20\x6c\x20\x30\x2e\x30\x36\x34\x33\x2c\x30\x2e\x31\x31\x38\x36\
+\x39\x20\x30\x2e\x30\x30\x39\x2c\x30\x2e\x30\x32\x30\x35\x20\x61\
+\x20\x31\x2e\x37\x30\x37\x32\x35\x33\x34\x2c\x31\x2e\x37\x30\x37\
+\x32\x35\x33\x37\x20\x30\x20\x30\x20\x30\x20\x30\x2e\x30\x39\x31\
+\x36\x2c\x30\x2e\x33\x36\x30\x30\x34\x20\x6c\x20\x30\x2e\x30\x33\
+\x31\x38\x2c\x30\x2e\x30\x36\x20\x76\x20\x30\x20\x61\x20\x32\x31\
+\x2e\x32\x31\x37\x32\x38\x33\x2c\x32\x31\x2e\x32\x31\x37\x32\x38\
+\x33\x20\x30\x20\x30\x20\x31\x20\x2d\x31\x2e\x33\x39\x36\x38\x37\
+\x2c\x31\x33\x2e\x30\x31\x32\x33\x34\x20\x76\x20\x30\x20\x6c\x20\
+\x2d\x30\x2e\x31\x36\x30\x36\x36\x2c\x30\x2e\x33\x36\x37\x38\x36\
+\x20\x2d\x30\x2e\x30\x38\x35\x33\x2c\x30\x2e\x31\x37\x33\x38\x38\
+\x20\x2d\x30\x2e\x30\x36\x37\x34\x2c\x30\x2e\x31\x31\x33\x33\x34\
+\x20\x2d\x30\x2e\x30\x31\x38\x36\x2c\x30\x2e\x30\x36\x31\x31\x20\
+\x2d\x30\x2e\x30\x34\x37\x33\x2c\x30\x2e\x31\x30\x32\x35\x38\x20\
+\x2d\x30\x2e\x30\x31\x38\x36\x2c\x30\x2e\x30\x36\x31\x34\x20\x2d\
+\x30\x2e\x30\x36\x37\x36\x2c\x30\x2e\x31\x31\x33\x33\x32\x20\x2d\
+\x30\x2e\x30\x31\x38\x36\x2c\x30\x2e\x30\x36\x31\x20\x2d\x30\x2e\
+\x30\x36\x37\x35\x2c\x30\x2e\x31\x31\x33\x33\x32\x20\x2d\x30\x2e\
+\x30\x31\x38\x36\x2c\x30\x2e\x30\x36\x31\x33\x20\x2d\x30\x2e\x30\
+\x36\x37\x35\x2c\x30\x2e\x31\x31\x33\x33\x34\x20\x2d\x30\x2e\x30\
+\x31\x38\x35\x2c\x30\x2e\x30\x36\x31\x32\x20\x2d\x30\x2e\x30\x36\
+\x37\x37\x2c\x30\x2e\x31\x31\x33\x33\x33\x20\x2d\x30\x2e\x30\x31\
+\x38\x36\x2c\x30\x2e\x30\x36\x31\x33\x20\x2d\x30\x2e\x30\x36\x37\
+\x33\x2c\x30\x2e\x31\x31\x33\x33\x33\x20\x2d\x30\x2e\x30\x31\x38\
+\x35\x2c\x30\x2e\x30\x36\x31\x33\x20\x2d\x30\x2e\x30\x36\x37\x37\
+\x2c\x30\x2e\x31\x31\x33\x33\x34\x20\x2d\x30\x2e\x30\x33\x37\x39\
+\x2c\x30\x2e\x30\x37\x31\x37\x20\x2d\x30\x2e\x30\x36\x37\x35\x2c\
+\x30\x2e\x31\x31\x33\x33\x34\x20\x2d\x30\x2e\x30\x33\x37\x39\x2c\
+\x30\x2e\x30\x37\x31\x37\x20\x2d\x30\x2e\x30\x36\x37\x37\x2c\x30\
+\x2e\x31\x31\x33\x33\x34\x20\x2d\x30\x2e\x30\x33\x37\x39\x2c\x30\
+\x2e\x30\x37\x31\x34\x20\x2d\x30\x2e\x30\x36\x37\x37\x2c\x30\x2e\
+\x31\x31\x33\x33\x34\x20\x2d\x30\x2e\x30\x33\x37\x38\x2c\x30\x2e\
+\x30\x37\x31\x33\x20\x2d\x30\x2e\x30\x38\x36\x38\x2c\x30\x2e\x31\
+\x32\x33\x33\x31\x20\x2d\x30\x2e\x30\x33\x38\x31\x2c\x30\x2e\x30\
+\x37\x31\x34\x20\x2d\x30\x2e\x30\x38\x36\x36\x2c\x30\x2e\x31\x32\
+\x33\x33\x33\x20\x2d\x30\x2e\x30\x33\x38\x31\x2c\x30\x2e\x30\x37\
+\x31\x34\x20\x2d\x30\x2e\x30\x38\x36\x38\x2c\x30\x2e\x31\x32\x33\
+\x32\x37\x20\x2d\x30\x2e\x30\x33\x37\x38\x2c\x30\x2e\x30\x37\x31\
+\x35\x20\x2d\x30\x2e\x30\x38\x37\x31\x2c\x30\x2e\x31\x32\x33\x33\
+\x33\x20\x2d\x30\x2e\x30\x33\x38\x31\x2c\x30\x2e\x30\x37\x31\x36\
+\x20\x2d\x30\x2e\x30\x38\x36\x38\x2c\x30\x2e\x31\x32\x33\x33\x33\
+\x20\x2d\x30\x2e\x30\x33\x37\x39\x2c\x30\x2e\x30\x37\x31\x34\x20\
+\x2d\x30\x2e\x30\x38\x36\x36\x2c\x30\x2e\x31\x32\x33\x32\x35\x20\
+\x2d\x30\x2e\x30\x33\x38\x33\x2c\x30\x2e\x30\x37\x31\x37\x20\x2d\
+\x30\x2e\x30\x38\x36\x36\x2c\x30\x2e\x31\x32\x33\x33\x20\x2d\x30\
+\x2e\x30\x33\x37\x38\x2c\x30\x2e\x30\x37\x31\x34\x20\x2d\x30\x2e\
+\x30\x38\x36\x37\x2c\x30\x2e\x31\x32\x33\x32\x39\x20\x2d\x30\x2e\
+\x30\x33\x37\x39\x2c\x30\x2e\x30\x37\x31\x36\x20\x2d\x30\x2e\x31\
+\x30\x37\x31\x36\x2c\x30\x2e\x31\x33\x34\x32\x37\x20\x2d\x30\x2e\
+\x30\x33\x38\x31\x2c\x30\x2e\x30\x37\x31\x39\x20\x2d\x30\x2e\x31\
+\x30\x36\x39\x34\x2c\x30\x2e\x31\x33\x34\x32\x38\x20\x2d\x30\x2e\
+\x30\x33\x38\x2c\x30\x2e\x30\x37\x31\x37\x20\x2d\x30\x2e\x31\x30\
+\x36\x39\x34\x2c\x30\x2e\x31\x33\x34\x32\x33\x20\x2d\x30\x2e\x30\
+\x33\x37\x39\x2c\x30\x2e\x30\x37\x31\x37\x20\x2d\x30\x2e\x31\x30\
+\x37\x31\x36\x2c\x30\x2e\x31\x33\x34\x33\x20\x2d\x30\x2e\x30\x37\
+\x37\x34\x2c\x30\x2e\x30\x39\x33\x32\x20\x76\x20\x30\x20\x6c\x20\
+\x2d\x30\x2e\x31\x34\x35\x30\x37\x2c\x30\x2e\x32\x30\x36\x34\x20\
+\x63\x20\x2d\x34\x2e\x35\x30\x39\x34\x37\x2c\x36\x2e\x33\x31\x38\
+\x34\x32\x20\x2d\x31\x31\x2e\x38\x39\x39\x35\x34\x2c\x31\x31\x2e\
+\x34\x32\x33\x31\x32\x20\x2d\x32\x30\x2e\x39\x36\x37\x34\x2c\x31\
+\x33\x2e\x37\x34\x34\x32\x31\x20\x2d\x35\x2e\x37\x31\x34\x36\x35\
+\x2c\x31\x2e\x34\x36\x33\x35\x33\x20\x2d\x32\x32\x2e\x39\x37\x30\
+\x33\x35\x2c\x35\x2e\x39\x38\x37\x37\x36\x20\x2d\x32\x37\x2e\x31\
+\x34\x39\x39\x37\x2c\x37\x2e\x30\x36\x31\x38\x20\x7a\x20\x6d\x20\
+\x39\x35\x2e\x38\x34\x38\x33\x33\x2c\x38\x34\x2e\x33\x37\x31\x36\
+\x39\x20\x30\x2e\x30\x36\x34\x35\x2c\x30\x2e\x31\x31\x38\x37\x36\
+\x20\x30\x2e\x30\x30\x39\x2c\x30\x2e\x30\x32\x30\x32\x20\x63\x20\
+\x30\x2e\x30\x32\x34\x34\x2c\x30\x2e\x31\x34\x30\x34\x34\x20\x30\
+\x2e\x30\x35\x38\x32\x2c\x30\x2e\x32\x35\x30\x36\x37\x20\x30\x2e\
+\x30\x38\x32\x2c\x30\x2e\x33\x38\x38\x30\x35\x20\x76\x20\x30\x20\
+\x6c\x20\x30\x2e\x30\x30\x39\x2c\x30\x2e\x30\x32\x30\x32\x20\x76\
+\x20\x30\x20\x6c\x20\x30\x2e\x30\x30\x39\x2c\x30\x2e\x30\x32\x30\
+\x34\x20\x30\x2e\x30\x30\x39\x2c\x30\x2e\x30\x32\x30\x33\x20\x30\
+\x2e\x30\x30\x39\x2c\x30\x2e\x30\x32\x30\x34\x20\x76\x20\x30\x20\
+\x61\x20\x32\x31\x2e\x37\x39\x36\x31\x39\x36\x2c\x32\x31\x2e\x37\
+\x39\x36\x31\x39\x36\x20\x30\x20\x30\x20\x31\x20\x2d\x31\x2e\x39\
+\x37\x31\x38\x33\x2c\x31\x34\x2e\x32\x31\x39\x38\x39\x20\x76\x20\
+\x30\x20\x6c\x20\x2d\x30\x2e\x32\x31\x39\x36\x33\x2c\x30\x2e\x33\
+\x39\x39\x36\x35\x20\x2d\x30\x2e\x31\x30\x35\x35\x32\x2c\x30\x2e\
+\x31\x38\x34\x36\x38\x20\x2d\x30\x2e\x30\x37\x37\x36\x2c\x30\x2e\
+\x31\x34\x33\x36\x33\x20\x2d\x30\x2e\x30\x33\x38\x2c\x30\x2e\x30\
+\x37\x31\x37\x20\x2d\x30\x2e\x30\x36\x37\x35\x2c\x30\x2e\x31\x31\
+\x33\x33\x33\x20\x2d\x30\x2e\x30\x33\x37\x38\x2c\x30\x2e\x30\x37\
+\x31\x33\x20\x2d\x30\x2e\x30\x36\x37\x37\x2c\x30\x2e\x31\x31\x33\
+\x33\x34\x20\x2d\x30\x2e\x30\x33\x37\x39\x2c\x30\x2e\x30\x37\x31\
+\x36\x20\x2d\x30\x2e\x30\x38\x36\x38\x2c\x30\x2e\x31\x32\x33\x32\
+\x34\x20\x2d\x30\x2e\x30\x33\x38\x2c\x30\x2e\x30\x37\x31\x33\x20\
+\x2d\x30\x2e\x30\x38\x36\x38\x2c\x30\x2e\x31\x32\x33\x33\x33\x20\
+\x2d\x30\x2e\x30\x33\x38\x2c\x30\x2e\x30\x37\x31\x34\x20\x2d\x30\
+\x2e\x30\x38\x36\x38\x2c\x30\x2e\x31\x32\x33\x33\x33\x20\x2d\x30\
+\x2e\x30\x33\x38\x2c\x30\x2e\x30\x37\x31\x34\x20\x2d\x30\x2e\x30\
+\x38\x36\x38\x2c\x30\x2e\x31\x32\x33\x33\x31\x20\x2d\x30\x2e\x30\
+\x33\x37\x38\x2c\x30\x2e\x30\x37\x31\x33\x20\x2d\x30\x2e\x30\x38\
+\x36\x35\x2c\x30\x2e\x31\x32\x33\x33\x32\x20\x2d\x30\x2e\x30\x33\
+\x37\x38\x2c\x30\x2e\x30\x37\x31\x34\x20\x2d\x30\x2e\x30\x38\x36\
+\x37\x2c\x30\x2e\x31\x32\x33\x32\x39\x20\x2d\x30\x2e\x30\x33\x37\
+\x39\x2c\x30\x2e\x30\x37\x31\x34\x20\x2d\x30\x2e\x30\x38\x36\x36\
+\x2c\x30\x2e\x31\x32\x33\x33\x20\x2d\x30\x2e\x30\x33\x37\x39\x2c\
+\x30\x2e\x30\x37\x31\x36\x20\x2d\x30\x2e\x30\x38\x37\x31\x2c\x30\
+\x2e\x31\x32\x33\x33\x20\x2d\x30\x2e\x30\x33\x38\x2c\x30\x2e\x30\
+\x37\x31\x35\x20\x2d\x30\x2e\x30\x38\x36\x37\x2c\x30\x2e\x31\x32\
+\x33\x32\x35\x20\x2d\x30\x2e\x30\x33\x38\x31\x2c\x30\x2e\x30\x37\
+\x31\x37\x20\x2d\x30\x2e\x31\x30\x37\x30\x35\x2c\x30\x2e\x31\x33\
+\x34\x33\x35\x20\x2d\x30\x2e\x30\x33\x37\x38\x2c\x30\x2e\x30\x37\
+\x31\x34\x20\x2d\x30\x2e\x31\x30\x37\x31\x36\x2c\x30\x2e\x31\x33\
+\x34\x32\x31\x20\x2d\x30\x2e\x30\x33\x38\x2c\x30\x2e\x30\x37\x31\
+\x34\x20\x2d\x30\x2e\x30\x39\x36\x32\x2c\x30\x2e\x31\x35\x35\x31\
+\x37\x20\x2d\x30\x2e\x30\x33\x38\x2c\x30\x2e\x30\x37\x31\x35\x20\
+\x2d\x30\x2e\x30\x39\x36\x32\x2c\x30\x2e\x31\x35\x35\x32\x31\x20\
+\x2d\x30\x2e\x30\x33\x37\x39\x2c\x30\x2e\x30\x37\x31\x36\x20\x2d\
+\x30\x2e\x30\x39\x36\x32\x2c\x30\x2e\x31\x35\x35\x31\x37\x20\x2d\
+\x30\x2e\x30\x35\x38\x33\x2c\x30\x2e\x30\x38\x32\x34\x20\x2d\x30\
+\x2e\x30\x39\x36\x32\x2c\x30\x2e\x31\x35\x35\x32\x20\x2d\x30\x2e\
+\x30\x35\x38\x34\x2c\x30\x2e\x30\x38\x32\x34\x20\x2d\x30\x2e\x31\
+\x31\x36\x33\x35\x2c\x30\x2e\x31\x36\x34\x35\x34\x20\x2d\x30\x2e\
+\x30\x35\x38\x33\x2c\x30\x2e\x30\x38\x32\x32\x20\x2d\x30\x2e\x31\
+\x31\x36\x33\x36\x2c\x30\x2e\x31\x36\x34\x35\x31\x20\x2d\x30\x2e\
+\x30\x35\x38\x33\x2c\x30\x2e\x30\x38\x32\x31\x20\x2d\x30\x2e\x31\
+\x31\x36\x33\x39\x2c\x30\x2e\x31\x36\x34\x35\x20\x2d\x30\x2e\x30\
+\x35\x38\x32\x2c\x30\x2e\x30\x38\x32\x34\x20\x2d\x30\x2e\x31\x31\
+\x37\x30\x36\x2c\x30\x2e\x31\x36\x34\x35\x36\x20\x2d\x30\x2e\x30\
+\x35\x38\x32\x2c\x30\x2e\x30\x38\x32\x34\x20\x2d\x30\x2e\x31\x31\
+\x36\x33\x2c\x30\x2e\x31\x36\x34\x34\x37\x20\x2d\x30\x2e\x30\x39\
+\x37\x37\x2c\x30\x2e\x31\x30\x33\x37\x34\x20\x76\x20\x30\x20\x6c\
+\x20\x2d\x30\x2e\x31\x38\x34\x37\x32\x2c\x30\x2e\x32\x32\x37\x33\
+\x36\x20\x63\x20\x2d\x35\x2e\x34\x37\x36\x33\x39\x2c\x36\x2e\x39\
+\x39\x33\x35\x37\x20\x2d\x31\x34\x2e\x33\x30\x39\x38\x37\x2c\x31\
+\x32\x2e\x37\x34\x36\x31\x39\x20\x2d\x32\x35\x2e\x30\x33\x38\x34\
+\x31\x2c\x31\x35\x2e\x35\x30\x30\x33\x34\x20\x2d\x36\x2e\x37\x36\
+\x36\x31\x31\x2c\x31\x2e\x37\x34\x36\x38\x31\x20\x2d\x32\x37\x2e\
+\x32\x30\x39\x37\x2c\x37\x2e\x30\x39\x33\x36\x33\x20\x2d\x33\x32\
+\x2e\x31\x38\x34\x30\x38\x2c\x38\x2e\x33\x36\x33\x32\x32\x20\x6c\
+\x20\x2d\x31\x33\x2e\x39\x32\x30\x33\x2c\x2d\x35\x34\x2e\x31\x35\
+\x37\x32\x20\x63\x20\x34\x2e\x39\x36\x36\x36\x2c\x2d\x31\x2e\x32\
+\x38\x39\x37\x32\x20\x32\x35\x2e\x34\x36\x34\x35\x33\x2c\x2d\x36\
+\x2e\x34\x33\x36\x33\x36\x20\x33\x32\x2e\x32\x32\x39\x38\x35\x2c\
+\x2d\x38\x2e\x31\x38\x33\x31\x36\x20\x31\x30\x2e\x37\x32\x39\x33\
+\x36\x2c\x2d\x32\x2e\x37\x35\x34\x31\x20\x32\x31\x2e\x32\x36\x33\
+\x31\x2c\x2d\x31\x2e\x39\x37\x32\x36\x38\x20\x32\x39\x2e\x34\x30\
+\x34\x33\x36\x2c\x31\x2e\x35\x30\x33\x39\x34\x20\x6c\x20\x30\x2e\
+\x32\x36\x35\x34\x32\x2c\x30\x2e\x31\x31\x33\x33\x33\x20\x76\x20\
+\x30\x20\x6c\x20\x30\x2e\x31\x33\x32\x37\x31\x2c\x30\x2e\x30\x35\
+\x36\x37\x20\x30\x2e\x31\x39\x34\x2c\x30\x2e\x30\x37\x37\x33\x20\
+\x30\x2e\x30\x39\x31\x37\x2c\x30\x2e\x30\x32\x37\x33\x20\x30\x2e\
+\x31\x37\x33\x38\x34\x2c\x30\x2e\x30\x38\x35\x32\x20\x30\x2e\x30\
+\x39\x31\x33\x2c\x30\x2e\x30\x32\x37\x20\x30\x2e\x31\x37\x33\x37\
+\x38\x2c\x30\x2e\x30\x38\x35\x33\x20\x30\x2e\x30\x39\x31\x38\x2c\
+\x30\x2e\x30\x32\x37\x31\x20\x30\x2e\x31\x37\x33\x38\x33\x2c\x30\
+\x2e\x30\x38\x35\x33\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\
+\x33\x38\x31\x20\x30\x2e\x31\x37\x33\x39\x2c\x30\x2e\x30\x38\x35\
+\x33\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\x33\x37\x38\x20\
+\x30\x2e\x31\x37\x33\x38\x34\x2c\x30\x2e\x30\x38\x35\x33\x20\x30\
+\x2e\x30\x37\x31\x33\x2c\x30\x2e\x30\x33\x37\x38\x20\x30\x2e\x31\
+\x37\x33\x38\x38\x2c\x30\x2e\x30\x38\x35\x33\x20\x30\x2e\x30\x37\
+\x31\x34\x2c\x30\x2e\x30\x33\x38\x20\x30\x2e\x31\x34\x33\x35\x39\
+\x2c\x30\x2e\x30\x37\x37\x38\x20\x30\x2e\x30\x37\x31\x32\x2c\x30\
+\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x34\x33\x36\x32\x2c\x30\x2e\
+\x30\x37\x37\x37\x20\x30\x2e\x30\x37\x31\x32\x2c\x30\x2e\x30\x33\
+\x37\x39\x20\x30\x2e\x31\x34\x33\x36\x34\x2c\x30\x2e\x30\x37\x37\
+\x34\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\x33\x38\x31\x20\
+\x30\x2e\x31\x34\x33\x36\x31\x2c\x30\x2e\x30\x37\x37\x36\x20\x30\
+\x2e\x30\x37\x31\x33\x2c\x30\x2e\x30\x33\x38\x33\x20\x30\x2e\x31\
+\x34\x33\x36\x37\x2c\x30\x2e\x30\x37\x37\x36\x20\x30\x2e\x30\x37\
+\x31\x34\x2c\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x34\x33\x36\
+\x2c\x30\x2e\x30\x37\x37\x35\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\
+\x2e\x30\x33\x37\x36\x20\x30\x2e\x31\x34\x33\x36\x35\x2c\x30\x2e\
+\x30\x37\x37\x36\x20\x30\x2e\x30\x37\x31\x33\x2c\x30\x2e\x30\x33\
+\x38\x33\x20\x30\x2e\x31\x34\x33\x36\x36\x2c\x30\x2e\x30\x37\x37\
+\x36\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\x33\x38\x33\x20\
+\x30\x2e\x31\x34\x33\x36\x39\x2c\x30\x2e\x30\x37\x37\x35\x20\x30\
+\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\x33\x38\x31\x20\x30\x2e\x31\
+\x32\x33\x33\x33\x2c\x30\x2e\x30\x38\x36\x39\x20\x30\x2e\x30\x37\
+\x31\x34\x2c\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x32\x33\x33\
+\x32\x2c\x30\x2e\x30\x38\x36\x36\x20\x30\x2e\x30\x37\x31\x34\x2c\
+\x30\x2e\x30\x33\x38\x31\x20\x30\x2e\x31\x32\x33\x32\x38\x2c\x30\
+\x2e\x30\x38\x36\x36\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\
+\x33\x37\x39\x20\x30\x2e\x31\x32\x33\x32\x38\x2c\x30\x2e\x30\x38\
+\x36\x36\x20\x30\x2e\x30\x37\x31\x36\x2c\x30\x2e\x30\x33\x38\x20\
+\x30\x2e\x31\x32\x33\x33\x2c\x30\x2e\x30\x38\x36\x38\x20\x30\x2e\
+\x30\x37\x31\x34\x2c\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x31\
+\x33\x33\x34\x2c\x30\x2e\x30\x36\x37\x35\x20\x30\x2e\x30\x37\x31\
+\x34\x2c\x30\x2e\x30\x33\x38\x20\x30\x2e\x31\x32\x33\x33\x2c\x30\
+\x2e\x30\x38\x36\x38\x20\x30\x2e\x31\x36\x34\x35\x36\x2c\x30\x2e\
+\x31\x31\x36\x34\x20\x63\x20\x30\x2e\x31\x32\x33\x33\x32\x2c\x30\
+\x2e\x30\x38\x36\x36\x20\x30\x2e\x32\x36\x36\x39\x32\x2c\x30\x2e\
+\x31\x36\x33\x37\x36\x20\x30\x2e\x33\x38\x37\x39\x38\x2c\x30\x2e\
+\x32\x35\x30\x37\x20\x76\x20\x30\x20\x61\x20\x32\x31\x2e\x38\x36\
+\x32\x31\x36\x32\x2c\x32\x31\x2e\x38\x36\x32\x31\x36\x20\x30\x20\
+\x30\x20\x31\x20\x38\x2e\x35\x37\x37\x34\x31\x2c\x31\x31\x2e\x35\
+\x31\x31\x35\x31\x20\x76\x20\x30\x20\x6c\x20\x30\x2e\x30\x34\x32\
+\x37\x2c\x30\x2e\x30\x37\x37\x36\x20\x63\x20\x30\x2e\x30\x34\x34\
+\x32\x2c\x30\x2e\x31\x32\x39\x36\x34\x20\x30\x2e\x30\x37\x37\x36\
+\x2c\x30\x2e\x32\x33\x39\x38\x31\x20\x30\x2e\x31\x32\x31\x39\x33\
+\x2c\x30\x2e\x33\x36\x39\x34\x33\x20\x6c\x20\x30\x2e\x30\x30\x39\
+\x2c\x30\x2e\x30\x32\x30\x35\x20\x30\x2e\x30\x36\x34\x35\x2c\x30\
+\x2e\x31\x31\x38\x37\x33\x20\x63\x20\x30\x2e\x30\x34\x35\x39\x2c\
+\x30\x2e\x31\x38\x30\x30\x36\x20\x30\x2e\x30\x39\x31\x38\x2c\x30\
+\x2e\x33\x36\x30\x30\x38\x20\x30\x2e\x31\x34\x38\x32\x34\x2c\x30\
+\x2e\x35\x36\x30\x32\x37\x20\x30\x2e\x31\x30\x30\x30\x37\x2c\x30\
+\x2e\x30\x34\x34\x33\x20\x30\x2e\x31\x31\x36\x33\x37\x2c\x30\x2e\
+\x32\x36\x35\x34\x33\x20\x30\x2e\x30\x38\x34\x36\x2c\x30\x2e\x35\
+\x33\x38\x35\x38\x20\x7a\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\
+\x64\x3d\x22\x70\x61\x74\x68\x31\x31\x30\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x64\x69\x73\x70\x6c\x61\
+\x79\x3a\x69\x6e\x6c\x69\x6e\x65\x3b\x66\x69\x6c\x6c\x3a\x23\x32\
+\x66\x32\x66\x32\x66\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\
+\x74\x68\x3a\x30\x2e\x37\x37\x36\x30\x32\x34\x34\x3b\x66\x69\x6c\
+\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x22\x20\x2f\x3e\x0a\
+\x20\x20\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\
+\x00\x00\x09\x60\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
+\x6e\x6f\x22\x3f\x3e\x0a\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x64\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\
+\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\
+\x6e\x74\x73\x2f\x31\x2e\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\
+\x6e\x73\x3a\x63\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x63\x72\
+\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\x6e\x73\x2e\x6f\x72\
+\x67\x2f\x6e\x73\x23\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
+\x72\x64\x66\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\
+\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x30\x32\x2f\x32\
+\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\x74\x61\x78\x2d\x6e\x73\x23\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x76\x67\x3d\x22\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\
+\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\
+\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x6f\x64\x69\x70\
+\x6f\x64\x69\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x73\x6f\x64\x69\
+\x70\x6f\x64\x69\x2e\x73\x6f\x75\x72\x63\x65\x66\x6f\x72\x67\x65\
+\x2e\x6e\x65\x74\x2f\x44\x54\x44\x2f\x73\x6f\x64\x69\x70\x6f\x64\
+\x69\x2d\x30\x2e\x64\x74\x64\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x69\x6e\x6b\x73\x63\x61\x70\x65\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\
+\x6f\x72\x67\x2f\x6e\x61\x6d\x65\x73\x70\x61\x63\x65\x73\x2f\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x32\x37\x30\x22\x0a\x20\x20\x20\x68\x65\x69\x67\x68\
+\x74\x3d\x22\x32\x37\x30\x22\x0a\x20\x20\x20\x76\x65\x72\x73\x69\
+\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\
+\x73\x76\x67\x33\x37\x32\x35\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\
+\x70\x6f\x64\x69\x3a\x64\x6f\x63\x6e\x61\x6d\x65\x3d\x22\x71\x72\
+\x5f\x66\x69\x6e\x64\x65\x72\x2e\x73\x76\x67\x22\x0a\x20\x20\x20\
+\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x76\x65\x72\x73\x69\x6f\x6e\
+\x3d\x22\x30\x2e\x39\x32\x2e\x34\x20\x28\x35\x64\x61\x36\x38\x39\
+\x63\x33\x31\x33\x2c\x20\x32\x30\x31\x39\x2d\x30\x31\x2d\x31\x34\
+\x29\x22\x3e\x0a\x20\x20\x3c\x6d\x65\x74\x61\x64\x61\x74\x61\x0a\
+\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6d\x65\x74\x61\x64\x61\x74\
+\x61\x33\x37\x33\x31\x22\x3e\x0a\x20\x20\x20\x20\x3c\x72\x64\x66\
+\x3a\x52\x44\x46\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x63\x63\x3a\
+\x57\x6f\x72\x6b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x64\
+\x66\x3a\x61\x62\x6f\x75\x74\x3d\x22\x22\x3e\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x3c\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x69\
+\x6d\x61\x67\x65\x2f\x73\x76\x67\x2b\x78\x6d\x6c\x3c\x2f\x64\x63\
+\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x20\x3c\x64\x63\x3a\x74\x79\x70\x65\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x72\x64\x66\x3a\x72\x65\x73\x6f\x75\x72\x63\
+\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\x2e\x6f\
+\x72\x67\x2f\x64\x63\x2f\x64\x63\x6d\x69\x74\x79\x70\x65\x2f\x53\
+\x74\x69\x6c\x6c\x49\x6d\x61\x67\x65\x22\x20\x2f\x3e\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x20\x3c\x64\x63\x3a\x74\x69\x74\x6c\x65\x3e\
+\x3c\x2f\x64\x63\x3a\x74\x69\x74\x6c\x65\x3e\x0a\x20\x20\x20\x20\
+\x20\x20\x3c\x2f\x63\x63\x3a\x57\x6f\x72\x6b\x3e\x0a\x20\x20\x20\
+\x20\x3c\x2f\x72\x64\x66\x3a\x52\x44\x46\x3e\x0a\x20\x20\x3c\x2f\
+\x6d\x65\x74\x61\x64\x61\x74\x61\x3e\x0a\x20\x20\x3c\x64\x65\x66\
+\x73\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x64\x65\x66\x73\x33\
+\x37\x32\x39\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x73\x6f\x64\x69\x70\
+\x6f\x64\x69\x3a\x6e\x61\x6d\x65\x64\x76\x69\x65\x77\x0a\x20\x20\
+\x20\x20\x20\x70\x61\x67\x65\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x66\
+\x66\x66\x66\x66\x66\x22\x0a\x20\x20\x20\x20\x20\x62\x6f\x72\x64\
+\x65\x72\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x36\x36\x36\x36\x36\x36\
+\x22\x0a\x20\x20\x20\x20\x20\x62\x6f\x72\x64\x65\x72\x6f\x70\x61\
+\x63\x69\x74\x79\x3d\x22\x31\x22\x0a\x20\x20\x20\x20\x20\x6f\x62\
+\x6a\x65\x63\x74\x74\x6f\x6c\x65\x72\x61\x6e\x63\x65\x3d\x22\x31\
+\x30\x22\x0a\x20\x20\x20\x20\x20\x67\x72\x69\x64\x74\x6f\x6c\x65\
+\x72\x61\x6e\x63\x65\x3d\x22\x31\x30\x22\x0a\x20\x20\x20\x20\x20\
+\x67\x75\x69\x64\x65\x74\x6f\x6c\x65\x72\x61\x6e\x63\x65\x3d\x22\
+\x31\x30\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\
+\x65\x3a\x70\x61\x67\x65\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x30\
+\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\
+\x70\x61\x67\x65\x73\x68\x61\x64\x6f\x77\x3d\x22\x32\x22\x0a\x20\
+\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\
+\x64\x6f\x77\x2d\x77\x69\x64\x74\x68\x3d\x22\x33\x38\x34\x30\x22\
+\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\
+\x69\x6e\x64\x6f\x77\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x30\
+\x39\x33\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6e\x61\x6d\
+\x65\x64\x76\x69\x65\x77\x33\x37\x32\x37\x22\x0a\x20\x20\x20\x20\
+\x20\x73\x68\x6f\x77\x67\x72\x69\x64\x3d\x22\x66\x61\x6c\x73\x65\
+\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\
+\x7a\x6f\x6f\x6d\x3d\x22\x34\x2e\x35\x33\x38\x38\x36\x31\x22\x0a\
+\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x78\
+\x3d\x22\x31\x31\x39\x2e\x32\x33\x36\x37\x37\x22\x0a\x20\x20\x20\
+\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x79\x3d\x22\x31\
+\x34\x37\x2e\x36\x33\x35\x32\x38\x22\x0a\x20\x20\x20\x20\x20\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x78\
+\x3d\x22\x32\x33\x39\x31\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x79\x3d\x22\
+\x2d\x39\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\
+\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x6d\x61\x78\x69\x6d\x69\x7a\
+\x65\x64\x3d\x22\x31\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\
+\x63\x61\x70\x65\x3a\x63\x75\x72\x72\x65\x6e\x74\x2d\x6c\x61\x79\
+\x65\x72\x3d\x22\x73\x76\x67\x33\x37\x32\x35\x22\x20\x2f\x3e\x0a\
+\x20\x20\x3c\x72\x65\x63\x74\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\
+\x22\x72\x65\x63\x74\x31\x36\x39\x22\x0a\x20\x20\x20\x20\x20\x77\
+\x69\x64\x74\x68\x3d\x22\x32\x37\x30\x22\x0a\x20\x20\x20\x20\x20\
+\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x37\x30\x22\x0a\x20\x20\x20\
+\x20\x20\x78\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x79\x3d\x22\
+\x30\x22\x0a\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\
+\x69\x6c\x6c\x3a\x23\x66\x66\x66\x66\x66\x65\x3b\x66\x69\x6c\x6c\
+\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x73\x74\x72\x6f\x6b\
+\x65\x2d\x77\x69\x64\x74\x68\x3a\x30\x2e\x39\x39\x30\x37\x30\x30\
+\x31\x33\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x70\x61\x74\x68\x0a\x20\
+\x20\x20\x20\x20\x64\x3d\x22\x4d\x20\x31\x30\x2c\x32\x32\x39\x2e\
+\x38\x32\x37\x35\x39\x20\x56\x20\x31\x39\x39\x2e\x36\x35\x35\x31\
+\x37\x20\x48\x20\x37\x30\x2e\x33\x34\x34\x38\x33\x20\x56\x20\x32\
+\x36\x30\x20\x48\x20\x31\x30\x20\x5a\x20\x6d\x20\x35\x31\x2e\x37\
+\x32\x34\x31\x34\x2c\x30\x20\x56\x20\x32\x30\x38\x2e\x32\x37\x35\
+\x38\x36\x20\x48\x20\x31\x38\x2e\x36\x32\x30\x36\x39\x20\x76\x20\
+\x34\x33\x2e\x31\x30\x33\x34\x35\x20\x68\x20\x34\x33\x2e\x31\x30\
+\x33\x34\x35\x20\x7a\x20\x6d\x20\x2d\x33\x34\x2e\x34\x38\x32\x37\
+\x36\x2c\x30\x20\x76\x20\x2d\x31\x32\x2e\x39\x33\x31\x30\x34\x20\
+\x68\x20\x32\x35\x2e\x38\x36\x32\x30\x37\x20\x76\x20\x32\x35\x2e\
+\x38\x36\x32\x30\x37\x20\x48\x20\x32\x37\x2e\x32\x34\x31\x33\x38\
+\x20\x5a\x20\x4d\x20\x31\x30\x2c\x34\x30\x2e\x31\x37\x32\x34\x31\
+\x32\x20\x56\x20\x31\x30\x20\x48\x20\x37\x30\x2e\x33\x34\x34\x38\
+\x33\x20\x56\x20\x37\x30\x2e\x33\x34\x34\x38\x32\x39\x20\x48\x20\
+\x31\x30\x20\x5a\x20\x6d\x20\x35\x31\x2e\x37\x32\x34\x31\x34\x2c\
+\x30\x20\x56\x20\x31\x38\x2e\x36\x32\x30\x36\x39\x20\x48\x20\x31\
+\x38\x2e\x36\x32\x30\x36\x39\x20\x76\x20\x34\x33\x2e\x31\x30\x33\
+\x34\x34\x36\x20\x68\x20\x34\x33\x2e\x31\x30\x33\x34\x35\x20\x7a\
+\x20\x6d\x20\x2d\x33\x34\x2e\x34\x38\x32\x37\x36\x2c\x30\x20\x56\
+\x20\x32\x37\x2e\x32\x34\x31\x33\x37\x37\x20\x68\x20\x32\x35\x2e\
+\x38\x36\x32\x30\x37\x20\x76\x20\x32\x35\x2e\x38\x36\x32\x30\x37\
+\x20\x48\x20\x32\x37\x2e\x32\x34\x31\x33\x38\x20\x5a\x20\x6d\x20\
+\x31\x37\x32\x2e\x34\x31\x33\x37\x39\x2c\x30\x20\x56\x20\x31\x30\
+\x20\x48\x20\x32\x36\x30\x20\x76\x20\x36\x30\x2e\x33\x34\x34\x38\
+\x32\x39\x20\x68\x20\x2d\x36\x30\x2e\x33\x34\x34\x38\x33\x20\x7a\
+\x20\x6d\x20\x35\x31\x2e\x37\x32\x34\x31\x34\x2c\x30\x20\x56\x20\
+\x31\x38\x2e\x36\x32\x30\x36\x39\x20\x68\x20\x2d\x34\x33\x2e\x31\
+\x30\x33\x34\x35\x20\x76\x20\x34\x33\x2e\x31\x30\x33\x34\x34\x36\
+\x20\x68\x20\x34\x33\x2e\x31\x30\x33\x34\x35\x20\x7a\x20\x6d\x20\
+\x2d\x33\x34\x2e\x34\x38\x32\x37\x36\x2c\x30\x20\x56\x20\x32\x37\
+\x2e\x32\x34\x31\x33\x37\x37\x20\x68\x20\x32\x35\x2e\x38\x36\x32\
+\x30\x37\x20\x76\x20\x32\x35\x2e\x38\x36\x32\x30\x37\x20\x68\x20\
+\x2d\x32\x35\x2e\x38\x36\x32\x30\x37\x20\x7a\x22\x0a\x20\x20\x20\
+\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x33\x37\x32\x33\x22\x0a\
+\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\
+\x6e\x6e\x65\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\x61\x74\x75\x72\
+\x65\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x73\x6f\x64\x69\x70\
+\x6f\x64\x69\x3a\x6e\x6f\x64\x65\x74\x79\x70\x65\x73\x3d\x22\x63\
+\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\
+\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\
+\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\
+\x63\x63\x63\x63\x63\x22\x0a\x20\x20\x20\x20\x20\x73\x74\x79\x6c\
+\x65\x3d\x22\x66\x69\x6c\x6c\x3a\x23\x30\x30\x30\x30\x30\x30\x3b\
+\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x73\
+\x74\x72\x6f\x6b\x65\x3a\x6e\x6f\x6e\x65\x3b\x73\x74\x72\x6f\x6b\
+\x65\x2d\x77\x69\x64\x74\x68\x3a\x31\x2e\x30\x37\x37\x35\x38\x36\
+\x31\x37\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\
+\x79\x3a\x31\x22\x20\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\
+\x00\x00\x07\x4d\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x50\x00\x00\x00\x50\x08\x03\x00\x00\x00\xb9\xcf\x02\x9f\
+\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\
+\x01\x00\x9a\x9c\x18\x00\x00\x02\x82\x50\x4c\x54\x45\x00\x00\x00\
+\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\
+\x00\x00\x00\xcc\x33\x01\x01\x01\x02\x02\x02\x03\x03\x03\x04\x04\
+\x04\x05\x05\x05\x06\x06\x06\x06\xcd\x38\x07\x07\x07\x07\xcd\x38\
+\x08\x08\x08\x09\x09\x09\x0a\x0a\x0a\x0b\x0b\x0b\x0c\x0c\x0c\x0c\
+\xce\x3c\x0d\x0d\x0d\x0d\xce\x3d\x0e\x0e\x0e\x0f\x0f\x0f\x10\x10\
+\x10\x11\x11\x11\x12\x12\x12\x13\x13\x13\x14\x14\x14\x14\xd0\x43\
+\x15\x15\x15\x15\xd0\x43\x16\x16\x16\x16\xd0\x45\x17\x17\x17\x18\
+\x18\x18\x1a\x1a\x1a\x1b\x1b\x1b\x1c\x1c\x1c\x1f\x1f\x1f\x20\x20\
+\x20\x21\x21\x21\x23\xd2\x4f\x24\x24\x24\x24\xd3\x50\x25\x25\x25\
+\x25\xd3\x51\x26\x26\x26\x28\x28\x28\x2e\x2e\x2e\x2f\x2f\x2f\x31\
+\x31\x31\x33\x33\x33\x34\xd5\x5c\x35\xd6\x5d\x36\x36\x36\x39\x39\
+\x39\x39\xd6\x60\x3a\x3a\x3a\x3a\xd6\x61\x3b\x3b\x3b\x3c\x3c\x3c\
+\x3c\xd7\x62\x3d\x3d\x3d\x3d\xd7\x63\x3e\x3e\x3e\x3f\x3f\x3f\x41\
+\x41\x41\x44\x44\x44\x45\x45\x45\x46\x46\x46\x4a\x4a\x4a\x4c\x4c\
+\x4c\x4d\x4d\x4d\x4e\x4e\x4e\x4f\x4f\x4f\x52\x52\x52\x53\x53\x53\
+\x54\x54\x54\x56\x56\x56\x57\x57\x57\x59\x59\x59\x5a\x5a\x5a\x5b\
+\x5b\x5b\x5c\x5c\x5c\x5d\x5d\x5d\x5e\x5e\x5e\x61\x61\x61\x62\x62\
+\x62\x63\x63\x63\x65\x65\x65\x66\x66\x66\x67\x67\x67\x68\x68\x68\
+\x69\x69\x69\x6a\x6a\x6a\x6b\x6b\x6b\x6d\x6d\x6d\x6f\x6f\x6f\x71\
+\x71\x71\x72\x72\x72\x72\xe1\x8e\x73\x73\x73\x73\xe1\x8f\x74\x74\
+\x74\x75\x75\x75\x78\x78\x78\x7a\x7a\x7a\x7e\x7e\x7e\x80\x80\x80\
+\x81\x81\x81\x84\x84\x84\x88\x88\x88\x89\x89\x89\x8a\x8a\x8a\x8b\
+\x8b\x8b\x90\x90\x90\x91\x91\x91\x92\x92\x92\x94\x94\x94\x95\x95\
+\x95\x96\x96\x96\x97\x97\x97\x98\x98\x98\x99\xe8\xad\x9a\x9a\x9a\
+\x9a\xe8\xae\x9b\x9b\x9b\x9b\xe8\xae\x9e\x9e\x9e\xa0\xa0\xa0\xa1\
+\xa1\xa1\xa2\xa2\xa2\xa4\xa4\xa4\xa6\xa6\xa6\xa7\xa7\xa7\xa8\xa8\
+\xa8\xa9\xa9\xa9\xac\xac\xac\xad\xad\xad\xaf\xaf\xaf\xb0\xb0\xb0\
+\xb2\xb2\xb2\xb3\xb3\xb3\xb5\xed\xc3\xb6\xb6\xb6\xb7\xb7\xb7\xb7\
+\xed\xc4\xb8\xb8\xb8\xb9\xb9\xb9\xb9\xed\xc6\xba\xba\xba\xbb\xbb\
+\xbb\xbb\xee\xc8\xbc\xbc\xbc\xbc\xee\xc9\xbd\xbd\xbd\xbd\xee\xca\
+\xbe\xbe\xbe\xc0\xc0\xc0\xc3\xc3\xc3\xc4\xc4\xc4\xc5\xc5\xc5\xcb\
+\xcb\xcb\xcd\xcd\xcd\xce\xce\xce\xcf\xcf\xcf\xd2\xd2\xd2\xd3\xd3\
+\xd3\xd3\xf2\xdb\xd4\xf2\xdb\xd5\xd5\xd5\xd5\xf2\xdc\xd6\xd6\xd6\
+\xd7\xd7\xd7\xd8\xd8\xd8\xd9\xd9\xd9\xd9\xf3\xdf\xda\xf3\xe0\xdb\
+\xdb\xdb\xdc\xdc\xdc\xde\xde\xde\xdf\xdf\xdf\xe0\xe0\xe0\xe1\xe1\
+\xe1\xe2\xe2\xe2\xe3\xe3\xe3\xe4\xe4\xe4\xe5\xe5\xe5\xe6\xe6\xe6\
+\xe7\xe7\xe7\xe8\xe8\xe8\xea\xea\xea\xec\xec\xec\xed\xed\xed\xee\
+\xee\xee\xef\xef\xef\xf0\xf0\xf0\xf1\xf1\xf1\xf2\xf2\xf2\xf3\xf3\
+\xf3\xf5\xf5\xf5\xf6\xf6\xf6\xf8\xf8\xf8\xf9\xf9\xf9\xfa\xfa\xfa\
+\xfb\xfb\xfb\xfc\xfc\xfc\xfd\xfd\xfd\xfe\xfe\xfe\xff\xff\xff\x86\
+\x47\xc9\x91\x00\x00\x00\x06\x74\x52\x4e\x53\x00\x11\x33\x77\x99\
+\xbb\x7c\x36\xcb\x6e\x00\x00\x00\x01\x62\x4b\x47\x44\x06\x61\x66\
+\xb8\x7d\x00\x00\x04\x52\x49\x44\x41\x54\x58\xc3\xed\xd8\xd9\x7b\
+\x13\x55\x18\x06\xf0\x8a\xcd\x9b\x33\x4b\x12\x6b\xc4\x82\x36\xd5\
+\x42\x14\xc5\x22\x6e\x20\x45\x40\x51\xc4\xba\x00\x2a\x6e\x88\xfb\
+\x82\x58\x05\x44\xdc\x51\x0b\x2a\x42\xa9\x0b\x8a\x0a\x2a\x14\x50\
+\x50\x2b\x52\xb1\x82\xa0\xa9\x22\x50\x8a\x20\x32\xeb\xfb\xff\x78\
+\x31\x49\xda\x4c\x66\x26\x5b\x2f\xf3\xde\xe6\xc9\xef\xf9\xe6\xcc\
+\x99\x73\xbe\x73\x6a\x6a\x8a\x49\x6d\x28\x14\x0a\x85\x6a\x86\x2b\
+\xcc\x66\x98\xb9\xe1\x20\xcf\x24\x49\x5a\x16\x8f\x1e\xa7\x65\x55\
+\x6c\x3a\x80\xad\xf3\xf4\x82\x44\xc3\x22\x9d\xba\x4d\x92\xac\xad\
+\xc8\xb3\xc9\x9e\x85\x80\xaa\x02\x8f\xf5\x92\xb6\x5d\xbe\x48\x92\
+\x1a\xf9\xc1\x2c\x40\x16\x80\x90\x80\x9b\xd7\x93\x5a\xd9\x22\x49\
+\xda\x9d\x8d\x90\x90\x8d\x84\x91\x6b\x0d\xbb\xdc\x71\x24\x35\xc6\
+\x20\xcb\x18\x12\x59\x41\xa2\xa7\x7c\xf0\x34\x87\x96\xe7\x44\x91\
+\xb6\x56\x04\x0a\x37\x28\x2b\xdb\xaa\x60\x15\xac\x82\x55\xb0\x0a\
+\x56\xc1\x2a\x58\x88\x0b\x02\x4b\x26\x9d\xbe\xcb\x1b\xdc\x51\x72\
+\xab\x38\x22\xd3\x14\xfe\xbb\x2e\x1f\x94\xc4\xd2\x7f\x32\xad\xe2\
+\x19\x25\x54\x67\xeb\xe4\xf3\x17\xe4\x7b\x00\xd0\xf8\xb0\x99\x69\
+\x15\x0b\x6b\xb5\x99\xa6\xf0\xc0\x33\x40\xc4\xd3\x13\x2a\xf0\x68\
+\x2f\x69\x17\xf1\xe4\xd9\xe2\x3e\xb9\x55\x40\xf2\xe4\x00\x40\xc8\
+\xc0\xec\x8f\x48\xad\x50\x99\xe9\xd1\x36\x3e\x6b\x0a\xd0\xb2\xad\
+\xe2\xd8\x0f\x0b\x75\xf2\x24\x4d\x9b\x7d\xaf\x8c\x87\x22\xa3\x60\
+\x64\x05\x97\xbe\xf4\x27\x69\xfa\x8a\x24\x2d\xf6\xcf\x4d\x40\x85\
+\x2c\x15\x01\xca\x00\xea\xef\x3c\x4c\xcb\x4f\x24\x99\x9a\x8b\xc8\
+\xd4\x4e\xf6\xcc\x69\x04\x02\x9f\x59\x00\xe7\xdf\x7d\x80\x6b\xae\
+\x05\x6e\x3b\x12\x00\xbe\x8a\xc4\x2e\x52\x27\x53\xaf\xd5\x23\xe2\
+\x5b\xa6\x1c\x41\xc3\xca\x3e\x52\x27\x77\xc6\xb1\x26\x00\x7c\x0b\
+\xc0\x53\xc7\x48\x5a\x26\xd7\x36\xf9\x0e\xa4\x18\xb7\x9e\xb6\x45\
+\x5a\x03\x4f\x43\x42\x47\x20\x28\x54\xe0\xde\xaf\x49\x4d\x23\x3f\
+\xbe\x03\x50\x45\xfe\x24\x9c\xf7\xa9\xf3\xfb\xa6\xf9\x80\x2a\x0a\
+\x81\x00\x20\x35\x6f\xa0\x65\x92\xe6\xdf\xf7\x40\xca\x3d\x05\x08\
+\x3c\x7e\x98\xa4\x69\x16\x71\x04\x1c\x04\xe5\x08\x2e\x7a\xff\x08\
+\x69\x68\x1c\x78\x72\x1c\x32\x47\x01\x09\x68\x5e\x64\x52\x33\xc8\
+\x43\x74\x27\x10\x04\x24\x60\xec\xc2\x43\xd4\x0c\xb2\xbf\x73\x3c\
+\x54\x19\x50\x14\x4c\xda\x70\x82\xd4\x75\xf6\xd1\x2b\x81\xa0\x33\
+\xcf\xe6\xa4\x0c\xd2\x32\xf9\xd5\xd5\x12\x10\x9b\xd4\x4d\xc3\x22\
+\xcd\xbd\xad\x64\x51\xa2\x0b\x84\x50\x80\xd6\x0e\x67\xfc\xbf\x7d\
+\xf0\x91\xef\x49\x4d\x27\xdf\xb9\x01\xe9\xff\x77\xb5\xcd\x48\x46\
+\xa3\xc9\x19\x6d\x5d\x3e\xa2\x1b\x74\x9e\xbd\xe1\x8d\xec\x41\xd9\
+\x24\x5f\x1c\x89\xb4\xf7\xee\x95\xe1\x6c\x26\xae\xf6\x14\xbd\xc1\
+\x08\xd4\x15\xbf\x93\x86\x41\xf6\x2e\x01\x62\x12\x49\xf2\xe7\x96\
+\x70\x4e\x5a\xf6\x7b\x88\x9e\xa0\xb3\x56\x2d\x3f\x45\x6e\x5a\x06\
+\x28\xc2\xa9\x6f\xe3\xa8\xb0\x2b\x63\xb6\x17\x0d\xe2\x9c\xd6\xbe\
+\x7e\xcc\x9a\x0c\x76\x4f\x8f\x39\x5e\x57\x34\x9c\x97\xe8\x97\x79\
+\xa2\x07\x28\x2b\x68\x58\xfe\x1b\x8d\x83\xe7\x41\x06\x6d\xfe\xf8\
+\x1c\x49\xee\x1f\x13\xf6\xc8\xa8\x3d\x85\x41\x09\xa3\xd7\x59\x24\
+\xf5\x54\x5c\xa8\x60\xfa\xdd\xb0\x25\xec\x99\x16\x77\x89\xb9\xa0\
+\x90\x81\x1b\x3b\x9c\x65\x3e\x17\x5c\x1d\xf6\x49\x7b\x10\x18\x01\
+\x16\xec\x4d\xdf\x59\xb8\xc0\x09\x7e\xe0\x04\x5f\x50\x00\xa3\x1f\
+\x3a\x99\xd9\x2a\x5d\xe0\x96\xb0\x6f\xb6\x78\x83\x8a\x84\x2b\x56\
+\x1e\xa3\x3d\xb8\xa0\xe4\x80\x6d\xfe\x60\x9b\x27\x28\xd0\xbc\xc3\
+\xf5\x91\xe6\x80\x33\xfd\xc1\x9b\xf2\xc0\xb7\x81\xf8\xbc\xad\xa4\
+\x1e\x00\x26\xfd\xc1\x64\x7e\x85\x4a\xe3\x0f\xce\xc6\xe8\x0f\x9e\
+\xe5\x0f\x46\xf3\xc0\x5d\x97\x0b\xdc\xb5\xdb\x1a\x3e\x90\xdc\x76\
+\x1f\x30\xfb\xbd\x6c\x97\x51\xd1\x23\x3b\x77\x53\xf6\x89\xf9\x12\
+\xe2\x6f\xda\xe5\xbc\x94\x99\x1e\xcb\x03\x4d\x9d\x47\x97\x5d\x85\
+\xb3\x5f\xf8\x85\x34\x2a\x9b\x36\x35\x83\x17\x7c\x27\x37\x5f\x82\
+\xfa\x5b\x76\x53\xb7\x2a\x99\xd8\x43\x1a\x30\xc3\xe2\xe6\xeb\xeb\
+\x30\x75\xe7\x29\xd2\x2e\xfb\xd3\xcb\xa9\xd2\x24\xbb\x9f\x05\x26\
+\xaf\xb0\xa9\x59\xc6\x1f\x0e\x68\x6a\x24\xd9\x5e\xec\xe2\xe0\x2e\
+\xd3\xa2\xb9\xb4\x4e\x60\xc9\x7f\x96\xe9\x54\x48\x0e\x04\x2d\x5f\
+\x53\x82\x7a\x45\x47\xd4\x69\xbf\x7e\x1d\xf0\xc4\x37\xc7\xe3\x22\
+\x02\x7e\xfe\x80\xb3\x43\xed\xf3\x5e\x60\x7f\x0a\x6e\x67\xb3\x53\
+\xe6\xbb\xe9\xa8\xbb\x2c\x06\x81\x6b\x64\xb4\xfe\xea\xbf\x05\x7c\
+\x51\xb0\xe3\x4e\xbf\x1f\x9d\xbd\xb7\x37\x01\xc0\xc5\xf7\xa7\xa8\
+\x3b\x9f\xe5\xc6\x73\xdd\xde\x85\xdb\x8b\x39\xbc\x64\xc6\x92\x07\
+\x5f\xae\x4b\xac\xfa\x8b\xd9\x4d\x80\x7b\xa6\xb8\xc6\x6f\x5f\xb1\
+\x87\xa1\xb4\x69\x93\x76\xe6\x5e\x3c\xbd\x11\x4c\x1c\xb2\xd1\xb7\
+\x97\x72\xb8\x4a\x1f\x35\x8c\xc1\x23\x44\xa6\x15\x59\x3c\x2d\x19\
+\x8d\x26\xa7\x2d\xee\x2a\xf5\x5e\x7f\x84\xfb\x0f\x45\x36\x4b\x85\
+\xaa\xac\xcd\x9f\x02\x1e\xde\xff\x58\x5f\x4a\xd5\xff\xf9\xe1\x0e\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x07\x0a\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
+\x6e\x6f\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x43\x72\x65\x61\x74\
+\x65\x64\x20\x77\x69\x74\x68\x20\x49\x6e\x6b\x73\x63\x61\x70\x65\
+\x20\x28\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x2e\x6f\x72\x67\x2f\x29\x20\x2d\x2d\x3e\x0a\
+\x3c\x73\x76\x67\x20\x69\x64\x3d\x22\x73\x76\x67\x32\x22\x20\x78\
+\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\
+\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\
+\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x30\x30\x22\x20\x77\
+\x69\x64\x74\x68\x3d\x22\x32\x30\x30\x22\x20\x76\x65\x72\x73\x69\
+\x6f\x6e\x3d\x22\x31\x2e\x30\x22\x3e\x0a\x20\x3c\x70\x61\x74\x68\
+\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x32\x33\x38\x32\x22\x20\x64\
+\x3d\x22\x6d\x31\x36\x35\x2e\x33\x33\x20\x31\x31\x33\x2e\x34\x34\
+\x61\x31\x30\x33\x2e\x36\x31\x20\x31\x30\x33\x2e\x36\x31\x20\x30\
+\x20\x31\x20\x31\x20\x2d\x32\x30\x37\x2e\x32\x32\x20\x30\x20\x31\
+\x30\x33\x2e\x36\x31\x20\x31\x30\x33\x2e\x36\x31\x20\x30\x20\x31\
+\x20\x31\x20\x32\x30\x37\x2e\x32\x32\x20\x30\x7a\x22\x20\x74\x72\
+\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\x28\
+\x2e\x39\x33\x37\x33\x39\x20\x30\x20\x30\x20\x2e\x39\x33\x37\x33\
+\x39\x20\x34\x32\x2e\x31\x34\x33\x20\x2d\x36\x2e\x33\x33\x39\x32\
+\x29\x22\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\
+\x22\x30\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x66\x66\x66\x22\x2f\
+\x3e\x0a\x20\x3c\x67\x20\x69\x64\x3d\x22\x6c\x61\x79\x65\x72\x31\
+\x22\x3e\x0a\x20\x20\x3c\x70\x61\x74\x68\x20\x69\x64\x3d\x22\x70\
+\x61\x74\x68\x32\x34\x31\x33\x22\x20\x64\x3d\x22\x6d\x31\x30\x30\
+\x20\x30\x63\x2d\x35\x35\x2e\x32\x20\x30\x2d\x31\x30\x30\x20\x34\
+\x34\x2e\x38\x2d\x31\x30\x30\x20\x31\x30\x30\x2d\x35\x2e\x30\x34\
+\x39\x35\x65\x2d\x31\x35\x20\x35\x35\x2e\x32\x20\x34\x34\x2e\x38\
+\x20\x31\x30\x30\x20\x31\x30\x30\x20\x31\x30\x30\x73\x31\x30\x30\
+\x2d\x34\x34\x2e\x38\x20\x31\x30\x30\x2d\x31\x30\x30\x2d\x34\x34\
+\x2e\x38\x2d\x31\x30\x30\x2d\x31\x30\x30\x2d\x31\x30\x30\x7a\x6d\
+\x30\x20\x31\x32\x2e\x38\x31\x32\x63\x34\x38\x2e\x31\x33\x20\x30\
+\x20\x38\x37\x2e\x31\x39\x20\x33\x39\x2e\x30\x35\x38\x20\x38\x37\
+\x2e\x31\x39\x20\x38\x37\x2e\x31\x38\x38\x73\x2d\x33\x39\x2e\x30\
+\x36\x20\x38\x37\x2e\x31\x39\x2d\x38\x37\x2e\x31\x39\x20\x38\x37\
+\x2e\x31\x39\x2d\x38\x37\x2e\x31\x38\x38\x2d\x33\x39\x2e\x30\x36\
+\x2d\x38\x37\x2e\x31\x38\x38\x2d\x38\x37\x2e\x31\x39\x20\x33\x39\
+\x2e\x30\x35\x38\x2d\x38\x37\x2e\x31\x38\x38\x20\x38\x37\x2e\x31\
+\x38\x38\x2d\x38\x37\x2e\x31\x38\x38\x7a\x6d\x31\x2e\x34\x37\x20\
+\x32\x31\x2e\x32\x35\x63\x2d\x35\x2e\x34\x35\x20\x30\x2e\x30\x33\
+\x2d\x31\x30\x2e\x36\x35\x33\x20\x30\x2e\x37\x33\x37\x2d\x31\x35\
+\x2e\x32\x38\x32\x20\x32\x2e\x30\x36\x33\x2d\x34\x2e\x36\x39\x39\
+\x20\x31\x2e\x33\x34\x36\x2d\x39\x2e\x31\x32\x36\x20\x33\x2e\x34\
+\x38\x34\x2d\x31\x32\x2e\x38\x37\x36\x20\x36\x2e\x32\x31\x39\x2d\
+\x33\x2e\x32\x33\x38\x20\x32\x2e\x33\x36\x32\x2d\x36\x2e\x33\x33\
+\x33\x20\x35\x2e\x33\x39\x31\x2d\x38\x2e\x36\x38\x37\x20\x38\x2e\
+\x35\x33\x31\x2d\x34\x2e\x31\x35\x39\x20\x35\x2e\x35\x34\x39\x2d\
+\x36\x2e\x34\x36\x31\x20\x31\x31\x2e\x36\x35\x31\x2d\x37\x2e\x30\
+\x36\x33\x20\x31\x38\x2e\x36\x38\x37\x2d\x30\x2e\x30\x34\x20\x30\
+\x2e\x34\x36\x38\x2d\x30\x2e\x30\x37\x20\x30\x2e\x38\x36\x38\x2d\
+\x30\x2e\x30\x36\x32\x20\x30\x2e\x38\x37\x36\x20\x30\x2e\x30\x31\
+\x36\x20\x30\x2e\x30\x31\x36\x20\x32\x31\x2e\x37\x30\x32\x20\x32\
+\x2e\x36\x38\x37\x20\x32\x31\x2e\x38\x31\x32\x20\x32\x2e\x36\x38\
+\x37\x20\x30\x2e\x30\x35\x33\x20\x30\x20\x30\x2e\x31\x31\x33\x2d\
+\x30\x2e\x32\x33\x34\x20\x30\x2e\x32\x38\x32\x2d\x30\x2e\x39\x33\
+\x37\x20\x31\x2e\x39\x34\x31\x2d\x38\x2e\x30\x38\x35\x20\x35\x2e\
+\x34\x38\x36\x2d\x31\x33\x2e\x35\x32\x31\x20\x31\x30\x2e\x39\x36\
+\x38\x2d\x31\x36\x2e\x38\x31\x33\x20\x34\x2e\x33\x32\x2d\x32\x2e\
+\x35\x39\x34\x20\x39\x2e\x38\x30\x38\x2d\x33\x2e\x36\x31\x32\x20\
+\x31\x35\x2e\x37\x37\x38\x2d\x32\x2e\x39\x36\x39\x20\x32\x2e\x37\
+\x34\x20\x30\x2e\x32\x39\x35\x20\x35\x2e\x32\x31\x20\x30\x2e\x39\
+\x36\x20\x37\x2e\x33\x38\x20\x32\x20\x32\x2e\x37\x31\x20\x31\x2e\
+\x33\x30\x31\x20\x35\x2e\x31\x38\x20\x33\x2e\x33\x36\x31\x20\x36\
+\x2e\x39\x34\x20\x35\x2e\x38\x31\x33\x20\x31\x2e\x35\x34\x20\x32\
+\x2e\x31\x35\x36\x20\x32\x2e\x34\x36\x20\x34\x2e\x35\x38\x34\x20\
+\x32\x2e\x37\x35\x20\x37\x2e\x33\x31\x32\x20\x30\x2e\x30\x38\x20\
+\x30\x2e\x37\x35\x39\x20\x30\x2e\x30\x35\x20\x32\x2e\x34\x38\x2d\
+\x30\x2e\x30\x33\x20\x33\x2e\x32\x31\x39\x2d\x30\x2e\x32\x33\x20\
+\x31\x2e\x38\x32\x36\x2d\x30\x2e\x37\x20\x33\x2e\x33\x37\x38\x2d\
+\x31\x2e\x35\x20\x34\x2e\x39\x36\x39\x2d\x30\x2e\x38\x31\x20\x31\
+\x2e\x35\x39\x37\x2d\x31\x2e\x34\x38\x20\x32\x2e\x35\x31\x34\x2d\
+\x32\x2e\x37\x36\x20\x33\x2e\x38\x31\x32\x2d\x32\x2e\x30\x33\x20\
+\x32\x2e\x30\x37\x37\x2d\x35\x2e\x31\x38\x20\x34\x2e\x38\x32\x39\
+\x2d\x31\x30\x2e\x37\x38\x20\x39\x2e\x34\x30\x37\x2d\x33\x2e\x36\
+\x20\x32\x2e\x39\x34\x34\x2d\x36\x2e\x30\x34\x20\x35\x2e\x31\x35\
+\x36\x2d\x38\x2e\x31\x32\x20\x37\x2e\x33\x34\x33\x2d\x34\x2e\x39\
+\x34\x33\x20\x35\x2e\x31\x37\x39\x2d\x37\x2e\x31\x39\x31\x20\x39\
+\x2e\x30\x36\x39\x2d\x38\x2e\x35\x36\x34\x20\x31\x34\x2e\x37\x31\
+\x39\x2d\x30\x2e\x39\x30\x35\x20\x33\x2e\x37\x32\x2d\x31\x2e\x32\
+\x35\x36\x20\x37\x2e\x35\x35\x2d\x31\x2e\x31\x35\x36\x20\x31\x33\
+\x2e\x31\x39\x20\x30\x2e\x30\x32\x35\x20\x31\x2e\x34\x20\x30\x2e\
+\x30\x36\x32\x20\x32\x2e\x37\x33\x20\x30\x2e\x30\x36\x32\x20\x32\
+\x2e\x39\x37\x76\x30\x2e\x34\x33\x68\x32\x31\x2e\x35\x39\x38\x6c\
+\x30\x2e\x30\x33\x2d\x32\x2e\x34\x63\x30\x2e\x30\x33\x2d\x33\x2e\
+\x32\x37\x20\x30\x2e\x32\x31\x2d\x35\x2e\x33\x37\x20\x30\x2e\x35\
+\x36\x2d\x37\x2e\x34\x31\x20\x30\x2e\x35\x37\x2d\x33\x2e\x32\x37\
+\x20\x31\x2e\x34\x33\x2d\x35\x20\x33\x2e\x39\x34\x2d\x37\x2e\x38\
+\x31\x20\x31\x2e\x36\x2d\x31\x2e\x38\x20\x33\x2e\x37\x2d\x33\x2e\
+\x37\x36\x20\x36\x2e\x39\x33\x2d\x36\x2e\x34\x37\x20\x34\x2e\x37\
+\x37\x2d\x33\x2e\x39\x39\x31\x20\x38\x2e\x31\x31\x2d\x36\x2e\x39\
+\x39\x20\x31\x31\x2e\x32\x36\x2d\x31\x30\x2e\x31\x32\x35\x20\x34\
+\x2e\x39\x31\x2d\x34\x2e\x39\x30\x37\x20\x37\x2e\x34\x36\x2d\x38\
+\x2e\x32\x36\x20\x39\x2e\x32\x38\x2d\x31\x32\x2e\x31\x38\x37\x20\
+\x31\x2e\x34\x33\x2d\x33\x2e\x30\x39\x32\x20\x32\x2e\x32\x32\x2d\
+\x36\x2e\x31\x36\x36\x20\x32\x2e\x34\x36\x2d\x39\x2e\x35\x33\x32\
+\x20\x30\x2e\x30\x36\x2d\x30\x2e\x38\x31\x36\x20\x30\x2e\x30\x37\
+\x2d\x33\x2e\x30\x33\x20\x30\x2d\x33\x2e\x39\x36\x38\x2d\x30\x2e\
+\x34\x35\x2d\x37\x2e\x30\x34\x33\x2d\x33\x2e\x31\x2d\x31\x33\x2e\
+\x32\x35\x33\x2d\x38\x2e\x31\x35\x2d\x31\x39\x2e\x30\x33\x32\x2d\
+\x30\x2e\x38\x2d\x30\x2e\x39\x30\x39\x2d\x32\x2e\x37\x38\x2d\x32\
+\x2e\x38\x38\x37\x2d\x33\x2e\x37\x32\x2d\x33\x2e\x37\x31\x38\x2d\
+\x34\x2e\x39\x36\x2d\x34\x2e\x33\x39\x34\x2d\x31\x30\x2e\x36\x39\
+\x2d\x37\x2e\x33\x35\x33\x2d\x31\x37\x2e\x35\x36\x2d\x39\x2e\x30\
+\x39\x34\x2d\x34\x2e\x31\x39\x2d\x31\x2e\x30\x36\x32\x2d\x38\x2e\
+\x32\x33\x2d\x31\x2e\x36\x2d\x31\x33\x2e\x33\x35\x2d\x31\x2e\x37\
+\x35\x2d\x30\x2e\x37\x38\x2d\x30\x2e\x30\x32\x33\x2d\x31\x2e\x35\
+\x39\x2d\x30\x2e\x30\x33\x36\x2d\x32\x2e\x33\x37\x2d\x30\x2e\x30\
+\x33\x32\x7a\x6d\x2d\x31\x30\x2e\x39\x30\x38\x20\x31\x30\x33\x2e\
+\x36\x76\x32\x32\x68\x32\x31\x2e\x39\x39\x38\x76\x2d\x32\x32\x68\
+\x2d\x32\x31\x2e\x39\x39\x38\x7a\x22\x2f\x3e\x0a\x20\x3c\x2f\x67\
+\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\
+\x00\x00\x06\x11\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x50\x00\x00\x00\x50\x08\x06\x00\x00\x00\x8e\x11\xf2\xad\
+\x00\x00\x00\x06\x62\x4b\x47\x44\x00\x00\x00\x00\x00\x00\xf9\x43\
+\xbb\x7f\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x2e\x23\x00\x00\
+\x2e\x23\x01\x78\xa5\x3f\x76\x00\x00\x05\xb1\x49\x44\x41\x54\x78\
+\xda\xed\x9c\x6b\x68\x1c\x55\x14\xc7\x7f\x4d\xb4\xd5\x58\x6b\x8d\
+\xb4\x28\xda\xb0\xa2\x52\xc4\x17\x18\x5a\xad\xd5\xb2\x16\x45\x50\
+\xa3\xa5\x05\x51\x54\x4c\x91\x90\x7e\xa8\x05\x0d\x88\xa2\x86\x80\
+\x4a\x15\xf2\x41\xad\x0f\x1a\x7c\xa4\x8a\x01\x95\x6a\xdb\x80\x88\
+\xa8\x0b\x22\x6a\x0d\x62\xb0\x15\x35\x3e\x16\xd1\x6c\x69\xd5\x46\
+\x53\x93\x26\x6d\xb3\xc7\x0f\xf7\x2e\x0d\xc9\xcc\xce\x9d\x9d\x99\
+\xcc\xdc\xec\x1c\x38\xdf\x96\x7b\xb9\xbf\x3d\xe7\x9e\xfb\x9a\x3f\
+\xa4\x66\xad\x9d\x04\x2c\x05\x6e\x03\x1e\x07\xde\x02\x3e\x05\xfa\
+\x81\xef\x81\x3d\xc0\x17\xc0\x2e\x60\x0b\xb0\x01\xb8\x12\x38\xad\
+\xda\xc1\x9d\x0e\xac\x01\x5e\xd6\xa0\x46\x81\x09\x40\xca\x78\x11\
+\x18\x07\x0a\xc0\x0e\x60\x23\x70\x1e\x30\xa7\x9a\xc0\x9d\x0c\xac\
+\x03\xb6\x03\x07\x35\x14\xa9\xc0\x4b\x30\xbf\x04\xda\x80\xb3\xab\
+\x01\xde\x52\xe0\x19\xe0\x40\x00\x70\x4e\x7e\x18\xd8\x09\xdc\x08\
+\xd4\xce\x56\x78\x37\x00\x1f\x18\xa4\xa9\x04\x88\xc8\x9f\x80\xfb\
+\x80\x79\xb3\x09\xdc\x1c\x9d\xb2\xdf\x84\x1c\x75\x6e\x7e\x10\x68\
+\x07\x4e\x99\x2d\x00\xd7\xe8\x8a\x3a\x13\xf0\x4a\x7e\x08\x78\x18\
+\x98\x6b\x3b\xbc\xe5\xc0\x67\x33\x0c\xaf\xe4\x7f\x02\x2d\x36\x57\
+\xe8\x33\x80\xd7\x63\x82\x57\xf2\x7e\xe0\x6a\x5b\xe7\xbd\x8d\xc0\
+\x48\x05\x83\x1e\x07\xfe\x02\x7e\x06\xf6\x02\x3f\x00\xfb\x74\x5b\
+\x7e\xff\x8c\x22\xf0\x1a\xb0\xc0\x36\x80\xe7\x03\x9f\xfb\x18\x70\
+\x11\xf8\x07\xe8\x05\x36\x01\x59\xbd\xe4\xc9\xe8\x85\xf2\x72\xe0\
+\x2e\xe0\x15\x20\xef\x13\xe4\x10\x70\xbb\x6d\x00\x37\xe9\x48\x32\
+\x85\xf7\x09\x70\x27\x50\xef\xd1\xee\x3c\xe0\x1a\x0d\x72\xd4\x47\
+\xfb\x6f\xdb\x14\x85\x8b\x80\x0f\x0d\xa3\x64\x02\x78\x13\xb8\xa4\
+\x82\x6d\xe0\x23\x3a\x6a\x4d\x20\x16\x80\x55\xb6\x00\x5c\xa5\x77\
+\x1a\x26\x91\xb1\x0b\xb8\x30\xc0\x96\xf0\x49\xe0\x88\x41\x5f\xc7\
+\x80\x47\x81\x1a\x1b\x8a\xc7\xfd\xc0\x51\x83\x41\x0d\x02\x37\x05\
+\xec\x6f\x89\xde\xdd\x14\x0d\xfe\xac\xf7\x80\xf9\x49\x07\x78\xa2\
+\x9e\x9f\x4c\xb6\x6b\xdb\x80\xba\x10\xfa\x6c\xd1\x7b\x61\xaf\xfe\
+\xf6\x02\xe7\x26\x1d\xe0\x02\xc3\xf9\x6f\x14\x68\x0e\xf1\x80\xe2\
+\x47\x03\x80\x07\x80\x65\x49\x07\xb8\x58\x1f\x2f\x79\x0d\x66\x3f\
+\x70\x45\x48\x7d\x2e\xd4\x55\xdc\xab\xcf\x61\x60\x75\xd2\x01\x9e\
+\xa3\x0f\x0d\xbc\x06\xf3\x47\x80\xe2\x31\xd5\xea\x74\x31\xf2\xea\
+\xf3\x3f\x7d\xdc\x95\x68\x5b\xa2\xb7\x4f\x5e\x83\xf9\x5d\xa7\x5e\
+\x58\x00\x77\x18\x02\x6c\x4a\x01\xa6\x00\x53\x80\x29\xc0\x80\x56\
+\x5b\xc6\x33\x3e\x00\x5e\xe4\xd1\x96\xa9\x9f\x8a\xba\x0f\xb1\x06\
+\xe0\x83\xc0\x53\x2e\xfe\x82\x5e\xa2\x98\x2c\x29\xb6\x96\x69\xc7\
+\x8f\x77\x02\x03\x98\x5d\x3c\x3d\x0f\xdc\xeb\xe2\xeb\xf5\xc9\x4f\
+\xe4\xf6\xab\x5e\x28\xbb\xb9\xe9\x09\x49\xd8\x6e\xd2\xef\x11\x7d\
+\x4a\xe4\xe4\xff\xea\x13\xa1\xc8\x2d\x1f\xe3\x09\x73\x94\x7e\x18\
+\xb8\x3b\x05\x98\x02\x4c\x01\xa6\x00\x53\x80\x29\xc0\x14\x60\x0a\
+\xf0\xf8\xa5\x51\xdc\x5e\xb4\x15\xe0\x08\xf0\x06\xf0\x74\x8c\xfe\
+\x2c\xf0\x9b\xad\x00\xf7\xa3\x9e\x55\xd4\xc6\xe8\x8b\x80\x8f\x6d\
+\x06\xb8\x22\xe6\x7d\x7b\x7d\x0a\x30\x05\x98\x02\xb4\x1a\x60\x36\
+\x9b\xfd\xaa\xad\xad\x4d\x7a\x7b\x7b\x65\x78\x78\x58\xa6\x5a\x5f\
+\x5f\x9f\x74\x76\x76\x4a\x53\x53\xd3\x78\x43\x43\x43\x4b\x0a\x10\
+\x10\x91\x46\x11\xe9\x99\x98\x98\x38\x24\xfe\xad\x4f\x44\xee\x10\
+\x91\xf9\x55\x07\xb0\x04\x4e\x44\x86\x25\xb8\x45\x06\x32\x91\x00\
+\x45\xa4\x55\x44\x0a\x12\xbe\x6d\x15\x91\xb3\x66\x2d\x40\xdf\x51\
+\x97\xcf\x8b\xe4\x72\xca\xf3\xf9\x58\xa2\x31\x31\x00\x35\xbc\x81\
+\xb2\x43\xcf\xe5\x44\x9a\x9b\x45\x32\x19\x11\x70\xf6\x4c\x46\xfd\
+\x26\x97\xf3\x02\xd9\x12\x06\xc4\x44\x00\xf4\x84\x97\xcb\x89\x64\
+\xb3\xee\xd0\xdc\x3c\x9b\xf5\x02\x19\x18\x62\x52\x00\x76\x39\xa6\
+\x6d\x3e\x2f\xd2\xd1\x51\x3e\xe2\xbc\x3c\x93\x51\x6d\x38\xa7\x78\
+\x9f\x88\x5c\x60\x35\x40\xd7\x82\x51\x69\xd4\xf9\x8f\xc6\x40\x85\
+\x25\x56\x80\xae\xa9\x1b\x36\x3c\x6f\x88\x15\xa7\x72\xdc\x00\xa7\
+\xa7\x6e\x3e\xaf\x8a\x40\xd8\xf0\x4a\xde\xdc\xec\x94\xce\x15\xa7\
+\x72\x6c\x00\x5d\xa3\xaf\xbb\x3b\xd8\x9c\x67\x32\x27\x76\x77\x87\
+\x16\x85\x71\x02\x9c\x1e\x7d\x51\xa5\xae\x59\x2a\x57\x14\x85\x71\
+\x02\xfc\x7a\x5a\x0c\x74\x74\x44\x0f\xaf\xe4\x1d\x1d\x4e\x51\x78\
+\xb9\x15\x00\x1d\xd3\x77\xa6\xa2\xaf\x7c\x14\xfa\x4e\xe3\xb8\x00\
+\x4e\x5f\xba\x44\x3d\xf7\x99\xcd\x85\xbe\x97\x34\x71\x01\x9c\x3e\
+\xff\xcd\x64\xfa\xba\xa7\xb1\xef\x79\x30\x2e\x80\xf1\xce\x7f\x21\
+\xce\x83\xc9\x00\x18\xf5\xda\xcf\xdf\x9a\x30\x05\x98\x54\x80\xd7\
+\xa6\x00\x2b\x07\x78\x14\xa5\x83\xb5\x0e\xef\x0f\xa9\xd3\x39\x10\
+\xf7\xb7\xd0\x43\xa8\x57\xf4\xeb\x09\x20\xcf\x54\x8d\x55\x78\x2a\
+\xc8\x51\x20\xc7\x71\xc1\xb0\x9a\x74\x1d\x58\x99\x8f\x01\xbb\x51\
+\x5f\x90\x5f\x8a\xa1\xd6\x55\x35\xee\x44\xbc\x22\xf2\x28\xea\x23\
+\xe8\xcd\xc0\x55\x18\xe8\x5d\x55\xdb\x5e\xd8\xcf\x1b\xc2\x3c\xf0\
+\x22\x70\x1d\xee\x5f\xb1\xd7\x0e\x0e\x0e\xbe\x33\x36\x36\x36\x66\
+\xfb\x69\x4c\x54\x22\x62\x45\x94\xba\xc6\x36\x60\x2d\x4a\x99\x03\
+\x94\xfe\xd5\x72\xe0\x89\x95\x2b\x57\x0e\x0c\x0c\x38\xdc\x23\x59\
+\x76\x1e\x78\xab\x1e\x64\x81\x68\xa4\xec\x8a\x28\x05\xb6\x77\x81\
+\x07\x50\x9f\x67\xfd\x82\x52\xde\x90\xae\xae\xae\xe9\x6f\x5c\x2c\
+\x3b\x91\x06\x25\x2d\xb7\x1a\x78\x0e\x25\xd1\x14\x95\x26\xe0\xe8\
+\xd4\x68\x6f\x6c\x6c\x14\xc7\x28\xb4\xe8\x4e\x64\xb2\xcd\x45\x69\
+\x1f\x6c\x06\xbe\xc5\x4c\xc3\x25\xb0\xb7\xb6\xb6\x4a\xa1\x50\x10\
+\x5b\x6f\xe5\x1c\x27\x78\xd4\xe7\xab\x0f\xa1\x14\x77\x0f\x13\xb1\
+\x6a\x9b\x63\x2a\x5b\x72\x2f\x5c\xce\x6a\x50\xda\x2c\x1b\x80\xf7\
+\x51\x42\x88\x91\x00\x74\x4d\x65\x0b\x5e\x26\x98\xda\x62\xd4\x8b\
+\xcf\xed\xc0\xdf\x51\x44\xa4\x27\xc4\x84\xbe\x8d\xf1\x6b\x0b\x81\
+\x5b\x80\x57\x75\xe5\x2e\x86\x0d\xb1\xa7\xa7\xc7\x39\x9d\x13\xfa\
+\x3a\xab\x52\xab\xd3\x0b\xe5\x2d\x93\x97\x25\x21\x2d\x7b\x86\xda\
+\xdb\xdb\xfb\x47\x46\x46\x86\x6c\x78\x1f\x18\x46\xe5\x5e\x86\x52\
+\x5e\xdb\x83\x99\x50\x99\x1b\xb8\x7d\x28\x99\xd1\xb5\x40\xbd\x2d\
+\x2f\x54\xc3\xb2\x13\x80\x8b\x27\x55\xee\x31\x43\x70\xc7\xf4\xd6\
+\xef\x25\xe0\x7a\x1c\xe4\x8e\x03\x82\x4c\x3c\xb8\xa9\x36\x47\x57\
+\xee\x8d\xc0\x47\x28\x75\x8d\xa2\x43\xb4\x1d\x03\xbe\x43\x09\x4d\
+\xac\xc0\x50\x6c\x5b\xc3\x6c\x13\x91\x5e\x17\xa0\x7d\x22\xd2\x29\
+\x22\x37\xdb\x04\xcd\x0d\xe4\x99\xc0\x3d\x7a\x1b\x37\xc4\x71\xbd\
+\xfc\xdd\xc0\x63\xc0\x65\x3a\x72\x13\x67\xff\x03\x01\x35\x32\xcd\
+\x0f\x3d\x89\xb2\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x10\xb2\
+\x00\
+\x00\x63\x6c\x78\x9c\xed\x5d\xe9\x6f\x23\x37\x96\xff\x9e\xbf\xa2\
+\xa0\x7c\x49\x63\xc5\x12\xef\xc3\xb1\x7b\x90\x03\x49\x16\xc8\x60\
+\x30\x39\x76\x81\xfd\x32\x60\x91\x2c\x5b\x1b\x59\xf2\x48\xea\x76\
+\x77\x06\xf3\xbf\xef\x7b\xac\x43\x25\xab\xe4\xa8\xbb\x8d\x75\x6c\
+\xd8\x42\x4b\x55\xe4\x7b\x3c\xde\xc5\x1f\x5f\xa1\xd8\xe7\x7f\x79\
+\x77\xbd\x28\xde\xa6\xf5\x66\xbe\x5a\x5e\x4c\x58\x49\x27\x45\x5a\
+\x86\x55\x9c\x2f\x2f\x2f\x26\xbf\xfe\xf2\x1d\xb1\x93\x62\xb3\xf5\
+\xcb\xe8\x17\xab\x65\xba\x98\x2c\x57\x93\xbf\xbc\xfe\xec\x7c\xf3\
+\xf6\xf2\xb3\xa2\x28\x80\x79\xb9\x39\x8b\xe1\x62\x72\xb5\xdd\xde\
+\x9c\xcd\x66\x37\x6f\xd6\x8b\x72\xb5\xbe\x9c\xc5\x30\x4b\x8b\x74\
+\x9d\x96\xdb\xcd\x8c\x95\x6c\x36\xd9\x91\x87\x1d\x79\x58\x27\xbf\
+\x9d\xbf\x4d\x61\x75\x7d\xbd\x5a\x6e\x32\xe7\x72\xf3\xf9\x80\x78\
+\x1d\xeb\x9e\xfa\xf6\xf6\xb6\xbc\x15\x99\x88\x39\xe7\x66\x94\xcf\
+\x38\x27\x40\x41\x36\xef\x97\x5b\xff\x8e\xec\xb3\xc2\x18\xc7\x58\
+\x39\xa5\x74\x06\x75\x3b\xca\xd3\xa8\xce\x36\x20\x95\x1b\xf8\xd7\
+\x93\x77\x05\xe5\x66\xf5\x66\x1d\x52\x0d\x7c\xa9\x5c\xa6\xed\xec\
+\xdb\x5f\xbe\xed\x2b\x09\x2d\xe3\x36\x0e\x9a\x99\x2f\x7f\xdb\x04\
+\x7f\x93\xf6\x7a\xed\x0a\x1b\x09\xf8\xeb\xb4\xb9\xf1\x21\x6d\x66\
+\x5d\x79\xe6\x9f\xc7\x8b\x49\x2d\x59\xc5\x75\x4c\xc4\x06\xa9\x88\
+\xd4\x56\x13\x27\xbd\x20\x9c\x2a\x4d\xeb\x54\x3b\xe7\x4d\x26\x8e\
+\x7e\xeb\x09\xb6\x74\x31\xf9\xd1\xbf\x4f\xeb\x82\xe5\xe2\xb7\xf3\
+\x74\xfb\xf5\xea\xdd\xc5\x84\x16\xb4\xe0\x4a\xe3\xbf\xa6\x62\x67\
+\x03\x0d\x65\x37\x81\xb3\xb8\x0a\x4d\x3b\x5b\x5f\xfd\x23\xac\x96\
+\x40\xb9\x4d\xeb\x7f\x54\xb7\x65\x27\x9f\x6e\x94\x67\x7d\x23\xb4\
+\x74\xbc\x94\xc5\x17\x2a\x7a\x6d\x5d\x10\x4c\x4c\x0b\x4e\x99\x23\
+\x94\x11\x26\x5f\x4d\x5e\x03\xdb\xf9\x75\xda\x7a\x1c\x26\x36\xd1\
+\xcc\xae\x2b\xe1\x42\x64\x12\x20\x02\xf5\x9e\xfd\xf4\xed\x77\xcd\
+\x1d\xdc\x87\x70\xf6\xdf\xab\xf5\x6f\xed\x2d\xfc\x21\x81\xaf\x56\
+\x6f\xb6\x17\x93\xc9\xeb\xbe\xf8\x3c\x86\x33\x50\xc8\xb5\xdf\xbe\
+\x9e\x5f\xfb\xcb\x84\xba\xfc\x0f\x50\xc0\xf9\x6c\x57\xb1\x47\xbc\
+\x7d\x7f\x93\x76\x8d\x36\xcd\xae\x53\xa3\xd9\x51\xf3\x8e\xe1\x7a\
+\x8e\x4c\xb3\x9f\xb7\xf3\xc5\xe2\x3f\xb1\x93\x49\x31\xeb\xc7\x39\
+\x6b\x07\xda\x4e\x63\x36\x98\xc7\xf9\xac\x9b\x67\xbe\xeb\x05\x8d\
+\x52\x8e\xa8\xa0\xa6\x8d\x1b\x68\x31\xac\x16\xab\xf5\xc5\xe4\xf3\
+\x3a\xff\x4d\x9a\x8a\x6a\xb5\x8e\x69\xdd\x55\xe9\xfc\xb7\x57\xb5\
+\x02\xe3\x81\xb1\x81\x2e\xdb\xe2\x55\xf5\xbf\x29\x6c\xb7\xab\x45\
+\x5a\xfb\x25\xce\x87\xd1\xb6\xe6\x72\x3d\x8f\xa3\xe5\x6f\xe6\x31\
+\x8d\x55\xf4\xba\xc6\xe1\xf5\x1d\x8d\xd6\x6e\xae\x7c\x5c\xdd\x5e\
+\x4c\xf8\xdd\xca\xdb\xf9\x12\x2a\xc8\x2d\x74\x7d\x85\x4d\x1b\x71\
+\x84\xe2\x2a\xcd\x2f\xaf\x40\xb1\x46\xf5\x14\x60\x25\xbd\x9c\xb8\
+\xe8\x26\xb8\xb9\x5a\xdd\xe2\x54\xc0\x41\xfc\x62\x93\xee\x36\xf7\
+\xfb\x6a\x75\x8d\x96\x6d\xa5\x30\xea\x6e\x65\x78\x87\x63\x10\x25\
+\x15\xd2\x1c\x0c\x35\xa0\x14\xb9\x3d\x32\x3e\xe4\x94\xc7\xa6\x07\
+\x9c\xfc\x40\x2e\x6d\xdd\xb5\x7f\x37\xbf\x9e\xff\x9e\xe2\x88\xe8\
+\xc2\x9b\xf5\x1a\xe2\x26\x59\xa0\xdb\x9e\xe8\xf1\x8d\xe1\x9d\xc7\
+\x54\x6f\x76\x72\xc2\x3b\xe6\x54\xe7\x49\x9b\xed\xfb\x45\x6f\xe2\
+\x58\x9f\x0b\x98\xb5\x93\xd7\x65\xb2\x36\xe9\xc4\x25\xa1\x82\x3b\
+\x22\x55\x65\x88\x57\x42\x90\xe0\xb4\x4e\x94\x05\x15\xbc\xf8\x57\
+\x0d\x76\x7e\xf6\xb9\xb0\xf8\xf9\xf2\xdf\x65\x15\xa5\xd3\xaa\x4e\
+\x44\x09\xcf\x88\xe4\x34\x11\xc7\x2a\x49\x5c\xa8\xb8\x14\x91\x4a\
+\xf8\xed\x78\x84\x00\x86\x44\x83\x4d\x95\xb4\x44\x45\xc9\x89\x74\
+\xcc\x13\x1f\xad\x21\xca\x32\xcf\x12\x35\xca\xd5\xb1\x65\x80\x02\
+\xf8\x00\x8f\x77\x3a\xb9\x18\x39\x49\x4e\x1b\x22\x2b\x4f\x09\x8c\
+\x94\x93\x8a\x46\x9f\x92\xa4\x49\xf6\x03\x0b\x21\x00\x43\xcd\x19\
+\x44\x1c\x26\x48\x4d\x53\x80\x4e\x7c\x4d\x3c\xa7\x12\xbe\xa2\xb4\
+\x56\x78\x47\xa5\x6c\x19\x6a\x87\x1f\xec\x44\x57\x2a\x79\x10\x6c\
+\xf0\x30\x1d\xa9\x7c\x20\xae\x0e\x89\x88\xba\xf6\x9e\xd2\x64\xab\
+\x58\x77\x3c\x1c\x3f\xd8\x4f\xac\x19\x0b\x92\x11\x6a\x9c\x27\x32\
+\x29\x46\xbc\x08\x35\x49\x21\x06\x57\x2b\xca\x9d\x60\x2d\x0f\xe5\
+\xf8\xc1\x7e\x6c\x8c\xd1\xb8\x40\xaa\x80\x52\xe6\xb2\x22\x55\x82\
+\x7e\x92\xa5\x5c\x6b\x05\x7d\x99\xae\x9f\x54\xd5\x34\xf7\xe3\x99\
+\x8d\x15\xa3\x40\xe9\xa9\x26\x32\x08\x10\x40\x55\x59\x60\x74\xbe\
+\x0a\x11\xe4\xaf\xf4\xbf\x5a\x3f\x3c\xa3\xa5\x96\x5f\xce\x37\xab\
+\x05\xac\xaa\xab\xe5\x59\x73\x95\xbe\xcc\x4d\x42\xe8\xfa\xe2\xf3\
+\xaa\xae\x95\x0a\x4c\x92\x8a\x45\x68\xcd\x30\x4a\x5c\x02\xc1\xb2\
+\x8a\xf9\xe0\x95\xad\x23\x53\xaf\x50\x55\xaa\x96\x89\x39\x43\x1c\
+\x57\x20\x91\x90\x2a\xe2\xaa\xc4\x88\x66\xb5\x63\xa0\x60\x4b\x99\
+\xc9\x23\x25\xbb\xae\xa9\xc2\xe1\x0a\x1f\x69\xf0\x89\x98\x90\x80\
+\x51\x04\x30\x24\x6e\x02\x09\x8a\x86\x1a\xac\x88\x51\x9d\xda\x29\
+\xc2\x12\x8e\x3d\x99\x28\x44\x0a\x81\xc4\x28\x6b\x30\x6f\x60\x00\
+\x2d\x29\x10\xab\xe6\xc1\x73\xe7\x41\xc6\x2d\x03\x84\x39\x64\x08\
+\x95\xaa\x55\x84\x26\xeb\x58\xc1\xd0\x74\x45\x2c\x18\x09\x01\x81\
+\x53\x1b\x9c\x13\x42\xd1\x96\xa1\x12\xf8\x41\x53\xb5\x75\x45\x25\
+\xa5\xd0\xbe\x04\xa3\x60\x60\xaa\x56\x45\x98\x76\x5d\x19\x25\xb9\
+\x82\x9e\x5c\xc3\x73\xb9\xf6\xef\xbf\xfc\xf7\xf9\x2c\xfb\x46\xb7\
+\x04\xf9\x38\xf7\x8b\xef\xf1\x07\xfc\x72\xe8\x41\xa7\x88\x73\xd2\
+\x31\x60\x9c\x21\x4a\xc9\x92\x89\x5d\x19\x04\x09\x69\x79\xa9\x4c\
+\x5f\x04\x2e\xaf\x4a\xd9\xdf\x5e\xb6\xdd\xfe\x02\x81\x78\x83\x0b\
+\x17\xac\x92\x7e\xbb\x9e\xbf\xfb\x82\x08\x55\x5a\x35\x2d\x54\x49\
+\xed\xb4\x20\xd0\x08\x2c\xb2\x84\x99\xd2\x31\xfc\xb5\x4a\xa9\x52\
+\xb8\x69\xc1\x98\x62\xbc\xd4\xe6\xd5\x41\x9b\xbf\x2e\xe7\x5b\x40\
+\x3f\x6f\x36\x69\xfd\x33\xe2\x8d\xbf\x2d\x7f\x85\xd8\xd9\x2f\x61\
+\x9b\xed\xea\x66\xb7\x24\xae\xea\x7a\x93\xb6\xbb\x78\x95\xc3\x2e\
+\x50\x90\xc1\x1a\x35\xa8\x6a\x02\xcc\xea\x86\x39\x3a\x5c\x16\xc7\
+\xdb\x64\xa7\xb5\x99\xab\x0e\xd6\x9c\xfd\xde\x78\xdf\x1b\xac\xb9\
+\x7b\x8a\x6b\x4b\x41\xcd\x00\x5f\x3e\xeb\x9b\x04\x3d\x5f\x4c\x72\
+\x7f\x64\xbe\x84\x9a\x9b\xd6\x7b\x48\x43\x08\xb8\xef\xa7\xef\xbf\
+\xfe\xb2\xef\xab\x5b\x92\x76\x43\xee\x96\xb1\xbe\x60\x6f\x6c\xef\
+\x86\x37\x7d\x8c\x5f\xf8\x2a\x2d\x2e\x26\xdf\x60\xb7\xc5\xd7\x0b\
+\x58\x14\x96\x69\xb3\x99\x0c\x6d\xab\xe9\x9e\x1b\xce\x76\x1a\xa9\
+\x53\xe6\xf8\x6b\x36\x80\xdd\xec\xdf\xfa\xc5\x9b\xb4\x41\xd4\xc5\
+\x9d\x2b\x68\xa9\xac\x81\x6f\xc6\x64\x81\x28\xef\x83\x4a\xf3\x87\
+\xc1\xbf\x81\x70\x11\xe5\x74\x56\x37\x28\x06\x74\xf4\x66\x01\x92\
+\xa8\xab\x9f\x33\x4a\x02\x39\xdf\x5c\xcd\xc3\x1d\xad\xec\x0d\x99\
+\x1b\xe6\x86\xd6\x70\x64\x3e\x47\x5a\xfe\x6a\x71\x73\xe5\x87\xcd\
+\x2f\xef\xeb\xbc\x17\x4a\x9e\x12\x61\xfd\xec\xc6\x2f\xe1\xea\xfe\
+\x91\x5b\x73\xc2\xc8\xc7\xf8\xdc\xd8\xa0\x1e\x45\x53\xd9\xca\x9b\
+\x5a\xf6\x07\x72\xdc\x39\x51\x63\x87\x4f\xd5\x79\xd4\x73\x72\x1e\
+\x2e\x9e\xaa\xf3\x38\xf6\x71\xce\xe3\xc4\x8b\xf3\x3c\x9e\xf3\xb8\
+\x67\xe5\x3c\xa7\xc4\xef\x3f\xa7\xf3\xa8\x8f\x74\x1e\xf3\xe2\x3c\
+\x8f\xe6\x3c\x7d\x06\xeb\x59\x38\x8f\x38\x25\x7e\xff\x39\x9d\xe7\
+\x14\xc0\x79\xc8\x07\x1b\xdc\x17\xe7\x79\x3c\xe7\x31\xcf\xca\x79\
+\x4e\x89\xdf\x7f\x46\xe7\xb1\xf4\x14\xc0\x39\xc6\xa7\x5e\x9c\xe7\
+\xd1\x9c\x47\x3e\xab\x84\x81\x78\xaa\x09\x03\x4b\x3f\x2e\x61\x60\
+\xe9\x4b\xc2\xe0\x11\x9d\xe7\x59\x25\x0c\xe4\x53\x4d\x18\x58\xf6\
+\x71\x09\x03\xcb\x5e\x12\x06\x8f\xe8\x3c\xcf\x2a\x61\x20\x9f\x6a\
+\xc2\xc0\xb2\x8f\x4b\x18\x58\xf6\x92\x30\x78\x3c\xe7\x51\xcf\x2a\
+\x61\xa0\x9e\x6a\xc2\xc0\x9e\xf4\x84\x6a\x84\x8f\xbf\x24\x0c\x1e\
+\xd1\x79\x9e\x55\xc2\x40\x3d\xd9\x84\xc1\x49\x4f\xa8\xc6\xf8\x5e\
+\x12\x06\x8f\xe7\x3c\xfa\x59\x25\x0c\xd4\x93\x4d\x18\x9c\xf4\x84\
+\x6a\x8c\xef\x25\x61\xf0\x88\xce\xf3\xac\x12\x06\xfa\xc9\x26\x0c\
+\x4e\x7a\x42\x35\xc6\xf7\x92\x30\x78\x44\xe7\x79\x56\x09\x03\xfd\
+\x64\x13\x06\x27\x3d\xa1\x1a\xe3\x7b\x49\x18\x3c\x9e\xf3\x98\x67\
+\x95\x30\x30\x4f\x36\x61\x70\xd2\x13\xaa\x11\x3e\xf9\x92\x30\x78\
+\x44\xe7\x79\x56\x09\x03\xf3\x64\x13\x06\x27\x3d\xa1\x1a\xe3\x7b\
+\x49\x18\x3c\x9e\xf3\xd8\x67\x95\x30\x30\x4f\x36\x61\x70\xd2\x13\
+\xaa\x31\xbe\x97\x84\xc1\x23\x3a\xcf\xb3\x4a\x18\xd8\x27\x9b\x30\
+\x38\xe9\x09\xd5\x18\xdf\xb3\x49\x18\x9c\xcf\xf0\x0d\xe1\x7c\xb5\
+\x9d\x6f\xbb\x77\x83\x71\xca\xf9\x96\x39\xc0\x48\xdf\xf8\xcd\x55\
+\xf1\x55\x8c\xeb\xe2\xbb\xf9\xd2\x2f\x8a\xef\xd7\xe9\xfd\xf9\x2c\
+\xd7\x67\xc6\x1b\xbf\xbd\xda\xf1\xa5\x24\x99\x70\x9e\x93\xe4\xf1\
+\xdd\x4c\x1b\x13\x71\x4a\x39\x52\x2b\xa7\x59\xd2\x26\xd0\xba\x53\
+\xf8\xe0\x7c\x82\xaf\x7d\xf8\xad\x2d\x0d\x0b\xbf\x01\x71\x9e\xf2\
+\x3a\x72\xd7\x0e\xc8\xa7\x30\xbc\x14\x53\x5b\x5c\x15\x8a\x15\xbe\
+\xe0\x7c\xca\x79\x2b\x4e\xce\x4a\xa9\xa7\xcc\x95\x46\x14\x3f\x16\
+\x4c\x23\x21\xe7\xb6\xe4\xa6\xf8\x6a\x40\x08\xa4\x56\x94\x66\xca\
+\xa5\x2d\x7e\x28\x98\xe0\xa5\x51\x7b\x04\xac\x60\x8c\x81\xe2\x3a\
+\xe6\x1f\x0b\x07\xf4\x6a\xca\x0d\xb6\xbc\xdf\x54\x3b\x9a\xff\x69\
+\x47\xb8\x7b\xb1\x7b\xb5\x5c\xa6\xb0\x85\xc0\x14\xde\xac\xdf\xfa\
+\xed\x9b\x75\xda\x05\x93\x36\x70\xc5\xf9\xe6\x66\xe1\xdf\x9f\xcd\
+\x97\x10\x44\xda\x37\x77\xbb\x57\xae\x1b\xcd\x35\x2f\xf2\xee\xde\
+\x0e\x7c\xd5\xbd\xfc\x7d\x47\x15\x32\xf0\x5a\x69\x4b\x94\x4d\x35\
+\x91\x91\x52\x62\x8d\x67\x70\xab\xb9\xa8\xa5\x56\x32\xd0\x43\x55\
+\xfc\x9c\x5f\xd9\x2f\x50\x23\x05\xdf\xd7\xc9\x29\xaf\x7b\x0f\x75\
+\x32\x94\x0f\x33\xa5\x92\x53\x4e\xc1\xe8\x65\x11\x0a\x3a\x05\x1f\
+\x50\x60\xfc\xd4\xc0\x95\x44\x67\x60\x70\x01\x84\x59\x83\x48\x40\
+\x80\x42\x16\xf0\x4d\x2d\x5e\x83\x5a\x08\x12\x11\xda\x2a\x52\xca\
+\xd2\xb0\xb6\xf5\x8e\x5e\x65\x7a\x93\xe9\xdd\x90\xfe\xaa\x20\x4d\
+\xb3\x4d\x87\xd0\x30\xd4\xf1\x69\x6e\x16\xae\x64\xd3\xf7\xef\x0f\
+\xa7\xaf\xfc\x37\xae\x2f\xb5\xd3\xd7\x6a\xf1\xfe\x72\xb5\xdc\xa9\
+\xac\xaa\x5d\x45\x95\x11\xc4\x30\x8d\x2a\x63\x91\xb8\x2a\x32\xa2\
+\x25\x75\x32\x19\x4a\x6b\x6a\xef\x57\x19\xbb\xe3\x46\x27\xbc\x70\
+\xdf\x72\xdc\xac\x60\xb1\x04\x16\xc6\xf0\xe8\x0e\xb0\x65\x09\xce\
+\xc2\x4a\x6b\x9b\x4b\x99\x5f\x32\x16\xbc\x70\x12\x25\x07\x17\x27\
+\x88\xa1\x7d\x89\x7f\x54\x0c\xae\x17\xc3\xe5\x4e\x00\xbe\x62\x92\
+\x86\x14\x49\x65\xa2\x20\xb2\xa2\x15\xb8\xbd\x06\xc3\x15\xb4\xd2\
+\x8a\x31\xe7\x2b\x75\x28\x80\xbf\xff\xb4\x3f\x96\xb1\xfe\x84\x78\
+\xd5\x1f\x28\x02\x2a\x1d\xae\xcb\x3e\x3a\xeb\x83\x90\xc4\x2a\xab\
+\x20\x66\x39\x4d\x5c\x74\x92\xd4\x5c\xf9\x24\x92\x76\x4c\xc7\x3e\
+\xb8\xee\x75\xab\xfb\xe2\x56\xde\xa7\x1c\x56\x30\x04\x12\x62\xb7\
+\x89\x79\xbf\x77\xd7\x41\x10\xbb\xeb\xa2\xc7\x29\x83\xb2\x35\x9e\
+\x3f\xb1\xbb\xdd\xee\x5e\x11\x5f\xaf\xb6\x7e\x9b\xbe\x70\x74\xca\
+\xb8\xc5\x7f\xbb\x97\xbf\x77\x52\x6a\xce\x4c\x80\xbf\xdd\xea\x70\
+\x20\x1c\xaa\x2b\xaa\xc1\x64\x1c\x95\xa0\x11\x59\x6b\x52\xc5\xa0\
+\x48\xb4\x4c\xe9\xe8\xa3\x57\x49\x8f\x0b\x47\xdd\x15\xce\x29\x07\
+\x33\x0c\x85\x23\xc5\x50\x38\x83\xbb\x4e\x38\x86\x1e\x0a\x67\x50\
+\x86\xc2\xb1\xe3\xb3\x6e\x0e\x7e\x38\x3e\xeb\xba\xb2\xce\xa4\xa4\
+\x49\xaa\xb8\x05\x3d\x82\x45\x5a\x0d\x1e\x64\x94\x8d\x5c\x2a\xef\
+\x78\x70\xe3\xb3\x96\x07\x26\x71\xc2\xd1\x12\xc3\x59\xab\x3d\xd8\
+\xa9\x0e\x51\xa9\x92\x87\xb3\x1e\x94\x7d\x84\x0d\x34\x47\x5a\xdc\
+\x63\x03\x4a\x6a\x70\x11\x4b\x0c\xb5\xa2\x09\x4b\xbe\x72\x86\x54\
+\x4a\x07\xe1\x69\x74\x8c\x9b\x71\x69\x88\x03\x1b\x38\xe1\xd0\x8c\
+\xa1\x34\xf4\x9e\x0d\xe8\x43\x1b\x10\x23\x36\x20\xf6\x6d\x80\xd1\
+\x4f\x11\x4e\x73\x76\xc7\x3d\xa6\x12\x14\xa3\xae\x72\xb0\x2a\x6a\
+\x09\xab\x62\xcd\x61\x99\xd5\x89\x58\x27\x61\xa5\xd5\x36\x49\x69\
+\xc7\x85\xc3\x0f\x4c\xe5\x84\xd3\x41\x86\xc2\x31\x7b\xc2\x31\x87\
+\xc2\x61\x23\xc2\xf9\x34\x69\x34\xa7\x92\xdc\x63\x2a\xd1\x81\xa5\
+\xf0\x0a\xf0\x1f\x06\x40\x3c\x0a\x03\x02\xb7\x25\x94\x07\xe9\x2a\
+\xc1\x8c\x1e\x24\x3d\xf7\xa4\xc1\x3e\xd5\x54\xdc\x9e\x34\xdc\x81\
+\x34\x46\xa2\x85\x79\x38\xcb\x38\x9f\x5d\x8e\x61\x30\x1b\x2a\x56\
+\x43\xf4\x64\x16\x8f\x07\xa9\x43\x45\x9c\x11\x8a\x78\x88\x03\xc2\
+\xb2\xe0\x8d\xe8\xa2\xe7\x10\x0e\xaf\x71\x78\xfb\x2b\xf9\x29\xa7\
+\xc0\x0c\xc1\x97\x66\x53\x40\x34\x6f\x01\xb4\x52\x00\xc4\xb0\x62\
+\xb3\x1e\xe7\xe6\xeb\xab\xf1\x1a\x02\x37\xff\x55\x64\x40\xbb\x57\
+\x63\xc5\x54\x33\x00\xc6\x07\x35\x4d\x3f\x0f\x81\x74\x07\x47\xd8\
+\x08\x97\xff\x1e\xe0\x20\x9b\x51\x28\x60\x8e\x20\xe6\x5a\xa4\x4a\
+\xd0\x5a\x12\xcd\x38\x34\x09\xeb\x12\xf1\x89\x81\xd9\x51\x66\x25\
+\x60\x0f\x9a\xe2\x71\xc4\xfc\xeb\x4d\x31\xb2\x8d\x39\xe1\x14\x9d\
+\x9d\xd6\xfe\x0a\xe2\x2d\xa9\x83\x9d\xc3\xfe\xc6\x63\x08\xa4\x7f\
+\x44\x00\x26\x00\x89\x29\xd0\x46\xde\xec\x30\x85\xb5\xf9\xbb\xdb\
+\x04\x03\x05\xc2\x5c\xcd\x81\x5c\xa8\xa9\xb6\xa5\x90\x60\x0b\xd6\
+\x96\x2c\xb7\x00\x5d\x98\xd2\xaa\x02\x02\x17\x10\x4d\x8d\x2e\xa5\
+\x81\xe6\x60\x03\x44\x4d\xb1\xc8\x76\x20\xa0\x4f\x59\x88\x12\x2e\
+\x5d\xf1\x0d\x50\x72\xe0\x85\x21\x95\x16\xc0\x3c\x03\x0c\xc8\xa6\
+\xb0\x6f\x65\x5c\xe1\x0f\x18\x13\x2f\x9d\xc8\x3b\x2f\x00\xd7\xd3\
+\xfc\xbd\x1b\x0c\x60\x48\x22\x4a\x18\xec\x5b\xb8\x0f\x88\xcb\x95\
+\x42\x60\x2e\x60\xbb\x8e\x60\x12\x0b\x34\x5e\x67\xe4\x6e\x19\x0c\
+\x01\xb1\xbb\xc0\x3b\xaa\x8b\x7f\x16\xb9\x34\x73\x64\x16\x9d\xb9\
+\x75\x43\xc6\x75\x26\x73\x6d\xc3\xb9\x35\x86\xad\xe5\x1d\x81\x43\
+\x7a\xd5\xec\x20\xda\x76\x85\xcb\x24\x2d\x3d\x6b\x6e\x1a\x72\x66\
+\x32\xb9\xde\x6d\x3e\x98\x9a\xd2\xcc\x94\x3b\xc9\xfb\x0b\xa9\xdb\
+\x71\x81\xe8\x1d\x8e\x2b\x7f\x77\xb3\x6d\xfa\xcf\xae\x02\x9b\xc0\
+\xbc\xe5\x80\x11\xe2\x9e\x1f\x86\x86\x3f\xc6\xc1\xcf\x43\xed\x34\
+\xf6\x0f\x5f\x1a\x33\x76\x79\x6c\x7b\x58\xf9\xaa\x86\xf8\xa3\x48\
+\xd2\x16\xd0\x18\x85\x3d\xbb\x97\x4c\x11\x21\x63\xe2\xb5\xa9\x95\
+\x08\x23\x3b\xf5\xaf\xd6\xeb\x6c\xeb\x77\x82\xd3\x09\x67\x3e\x0d\
+\xcd\xdc\x71\x14\x4a\x63\xd0\xdf\x14\x4e\xa3\xae\x99\xce\xa6\x45\
+\x2d\x9a\x96\x05\x1b\x43\x3f\xf8\xa1\xd0\x16\x28\x94\x41\x45\xd8\
+\x02\x36\x21\xcc\xb6\x94\x92\xe1\x46\xbe\xf5\x09\xae\x91\xcb\xd0\
+\xc6\x8e\x61\x07\xa3\xd0\x8c\x15\x0a\xdb\x80\x89\xd9\x42\x83\x89\
+\x4f\x49\x73\x0d\xaa\x31\x68\xe8\x0f\xb7\x3d\x6f\xc3\xd5\xa8\xfc\
+\xef\xdb\xee\x89\xda\x87\x18\x2d\x04\x2e\x58\x22\x72\xbc\x71\x51\
+\x55\x44\x58\x59\xc3\x2a\x11\x74\x8a\x23\xbb\x9d\x3e\xde\xdc\x09\
+\x35\x27\x1c\xa3\x75\x67\xab\x07\x52\xe3\x0e\xfc\x17\x3d\x2a\x0b\
+\xad\x95\x20\x66\x2f\xda\x2b\xf0\x49\x03\xb1\xc5\x96\x10\x8c\xf0\
+\x88\x3c\xdd\xd5\x80\x0a\xb5\x6b\xaf\x4f\x90\x50\x73\x46\xe1\xb8\
+\x84\xdc\x11\x0b\xf5\x55\x45\x99\x0a\x10\xe1\x2b\x6e\xf0\xe0\x2e\
+\x07\xc0\x08\x76\xc3\x91\x02\x92\xd6\x10\xe0\x93\x18\xd9\x0d\xff\
+\x88\x6b\x27\x46\x63\x71\x47\x3e\x27\x9c\x1a\x36\xb4\x51\x0b\xa1\
+\x4e\xee\x4c\x50\x63\x44\x80\x5b\x85\x6b\x1f\x66\x17\x24\x58\x14\
+\x5c\xbb\x26\x63\x81\x11\x52\xb4\x35\x39\x4f\x24\x7b\x1b\x7e\x38\
+\x33\x6b\x4f\x33\x1b\x13\xa2\x12\xc7\xdc\x5c\x68\x40\x20\x55\x4d\
+\x62\x8d\xdb\x0f\xea\x28\xec\xa8\x61\x89\x13\xa2\xa6\x86\xc2\xee\
+\x8d\xa6\x11\x1b\xeb\x85\x78\x27\x05\xf4\x01\xfb\xdb\x43\x21\xc2\
+\xea\xa0\x4a\xe5\xa6\xf9\xbb\xcf\xd7\x32\x10\xd9\xb4\xcd\xfb\x7c\
+\x75\x40\xc1\x1e\x5c\x88\xcd\x86\x77\x5c\x88\x66\x2c\x27\x51\xa7\
+\xda\x73\x0e\x80\x20\xc6\x1a\x51\x01\x62\x30\xc3\x34\xb1\x9c\x25\
+\xa9\x8c\x72\x20\xc6\x7b\x24\xc8\xfe\x68\x4c\x07\xc3\xd0\xac\x4f\
+\x55\xec\x85\x8c\x8f\xcb\x32\x0c\x9c\xbd\x0f\x91\x3b\x07\x07\x8b\
+\xe5\x66\x6a\x6c\x2e\x15\xbb\xeb\xbd\x07\x17\xed\x28\xf8\xe0\x28\
+\xbb\x7b\x73\x08\x0f\x38\x6a\xab\x20\xf2\xb4\x63\xda\x8b\x3f\x10\
+\xc2\x99\xec\xae\x25\xce\xe7\x9e\x71\x9b\x13\xc6\x7d\x04\xc0\x6b\
+\xc0\x92\xa6\x76\x04\x77\x60\x44\x5a\x5f\x03\xde\x54\x9c\x44\xcf\
+\x19\x35\xaa\xf2\x3a\x1c\xcb\xc8\xa5\xe2\xdb\xd5\xed\xf2\x93\x41\
+\xe1\x35\x80\x6f\x8e\x27\xfa\x61\x66\x7a\x3f\xb5\x4d\x38\xa0\x20\
+\x40\x23\x00\x40\xb4\x6b\xc0\x0d\xc8\x87\x18\x4c\x4f\xff\x50\x70\
+\x80\x2b\x63\xe8\x30\x83\x43\xd2\xa2\x43\xce\x01\xbf\x00\x18\xd4\
+\x1a\x60\xbf\x73\xa5\x12\xd8\x8e\x96\x88\x19\x81\x80\x30\xa4\x9b\
+\x82\x93\x0a\x4c\xae\x83\x0d\xa9\x0c\xbb\x30\x03\x98\x01\x22\x41\
+\x84\x98\x01\xa2\x12\xa5\x35\x53\x0e\xc5\x80\xa2\x70\x4d\xb1\xe0\
+\xc7\x12\x56\x0d\xc1\xf2\xef\x15\x72\xf5\x20\x51\xe2\x34\xe0\xbb\
+\x1f\x13\xf0\x0e\x20\x62\x46\x88\x08\x10\x59\x93\xa6\x85\x5e\x11\
+\x1d\xb6\xe0\x30\x63\xc3\x0c\xc1\x32\x25\x66\x6f\x39\x92\x02\x74\
+\xa6\xd8\x66\x46\x88\x0d\x40\x6c\xd0\x57\x03\x0f\x1b\x08\x86\xe0\
+\x10\x48\x91\x00\xd0\x61\x06\x87\x2d\x36\xcc\xd0\xb0\x41\x86\x19\
+\x18\xe2\x65\xfe\x36\x45\x06\x85\x5d\xde\x58\x65\x1c\x27\xf2\xb7\
+\xd4\xd3\xa3\x58\x90\x37\xbd\x00\x18\x84\xe0\x46\x4b\x67\x1b\xc8\
+\x99\xe1\x20\x69\xf1\x20\xf9\x7f\x07\x84\x5a\x1d\x5b\x6e\x6b\x6d\
+\x60\x91\x00\xf8\x01\xb8\x10\x40\x9c\xab\x89\x0b\xce\x12\x95\xa4\
+\xad\x25\xb3\x1a\xcc\xf6\x18\x20\x44\x4b\xff\x34\x48\xc8\x34\xda\
+\x53\xf7\x70\x05\xed\xc9\x35\xf6\xe4\x1a\x7b\x32\x8d\x3d\xc1\xa2\
+\x2a\x9a\x87\x34\xed\x83\x02\x30\x50\x8b\x02\xc4\x9d\x09\xb8\x82\
+\x45\x68\x08\x66\x0a\x4d\x91\xe6\x99\x4f\xc6\x81\xb0\x86\x10\xc9\
+\xd1\x60\xaf\xf0\x56\x99\x6c\xc4\x19\x1f\xb6\xa0\x90\x64\x84\xd8\
+\x5c\x67\x1a\xb0\xfe\x87\x7b\x1e\x70\x0f\x40\xd4\xee\x1e\x80\x58\
+\x01\x4a\x77\xd4\x93\xc4\x71\x8f\xcb\x69\xc4\x98\x01\x68\x1d\xb0\
+\xbb\xac\xa3\x4c\x29\x55\xc7\x96\x9e\x11\x95\x9c\x1e\x80\xfb\x45\
+\x83\x3b\x7c\xca\x82\x1b\x3e\xd8\x70\x72\xc0\xdf\x10\x4b\x20\x26\
+\x43\x98\xe0\x0a\x1f\x97\x75\x37\x42\x82\x0b\x4e\x1d\xc0\x71\xd0\
+\x90\xe2\x18\x62\xda\x2a\x54\xac\x60\xdd\xdd\xa7\x2d\xd0\xe6\x28\
+\xca\xa1\x21\x4a\x57\x53\x02\x90\x59\x12\xe9\x04\x2c\xcf\x06\x44\
+\x56\x5b\x69\xa5\x54\x32\xd5\xd5\xf1\x07\x27\x39\x4c\xdf\x41\x8b\
+\xa7\x9c\x17\xbb\x67\xbe\xb0\x73\x67\xba\x7b\x7a\x68\xd1\xd5\x41\
+\x16\xe8\xe9\x50\x0a\x5b\x60\x80\x85\xbc\xd9\x88\xe6\x70\xd0\x3c\
+\x8d\x22\x0a\x83\x97\xc6\xb0\x47\x18\x84\x4f\x0c\xb4\x10\xd4\x33\
+\x1d\x5c\x3d\x9c\xf9\x59\x8a\x9f\x71\x91\x1e\x4b\x86\x54\x0e\xa6\
+\xc8\x15\x25\xd1\x49\x8a\x99\xbc\x48\x6c\xad\x05\x51\x36\x80\x1d\
+\x00\x6a\x64\x2a\xdd\x2f\xd2\x3b\xd8\xf1\x03\x36\x28\xe3\x22\x1d\
+\xc3\x8f\x0d\x7c\x24\xdd\x13\xbe\x51\x00\xd9\x06\x8c\x87\x83\x90\
+\xf7\x6c\x66\x2c\x1b\x83\x90\x55\x15\x43\x9d\x98\x80\x20\xa3\x14\
+\xc8\xb2\xc6\x9c\x92\x76\x44\x98\x1a\x1f\x08\x78\xef\x58\x7d\xbf\
+\x2c\x3f\x1c\x45\x5a\xf5\x07\x28\xf2\x03\xf4\x31\x08\x08\x12\xbc\
+\x1e\x36\x3a\x00\xbf\x0e\x62\x00\xc4\x0a\x08\xc5\x7d\x44\xe0\x03\
+\xc2\x51\x58\xc6\x8f\xc0\xc9\xf6\x3c\xfb\x3d\x38\x89\xd3\x7c\x88\
+\xf1\x37\xb1\xa9\xe8\x62\x13\x80\x46\xab\xfb\x3b\x0b\x18\xa3\x68\
+\x47\xcc\x00\x5a\x62\x2c\xcb\x77\x07\xc3\xc7\xe1\x70\x7e\x04\x56\
+\xee\x8d\x3f\xc3\xca\x73\xfc\xcf\x07\x5e\x7f\xf6\x7f\xf7\x5f\x21\
+\xbb\
+\x00\x00\x09\x46\
+\x00\
+\x00\x22\xb1\x78\x9c\xdd\x59\x59\x73\xdb\x46\x12\x7e\xf7\xaf\x98\
+\xa2\x5e\xac\x5a\x70\x38\xf7\x41\x1d\xa9\xac\xb3\x49\xed\x96\xf7\
+\xa8\x38\xde\x7d\x86\x40\x90\x42\x04\x02\x0a\x00\x5d\xfe\xf5\xdb\
+\x3d\x20\x09\x40\x24\x4d\xd1\x96\x53\xbb\x91\xaa\x04\xcc\xa0\xa7\
+\xcf\xaf\x7b\x7a\x46\xe7\xdf\x3d\x2e\x73\x72\x9f\x56\x75\x56\x16\
+\x17\x23\x4e\xd9\x88\xa4\x45\x52\xce\xb2\x62\x71\x31\xfa\xf8\xcb\
+\x8f\x63\x37\x22\x75\x13\x17\xb3\x38\x2f\x8b\xf4\x62\x54\x94\xa3\
+\xef\x2e\xdf\x9c\xd7\xf7\x8b\x37\x84\x10\x58\x5c\xd4\xd3\x59\x72\
+\x31\xba\x6e\x9a\xdb\xe9\x64\x72\x7b\x57\xe5\xb4\xac\x16\x93\x59\
+\x32\x49\xf3\x74\x99\x16\x4d\x3d\xe1\x94\x4f\x46\x1d\x79\xd2\x91\
+\x27\x55\x1a\x37\xd9\x7d\x9a\x94\xcb\x65\x59\xd4\x61\x65\x51\x9f\
+\xf4\x88\xab\xd9\x7c\x43\xfd\xf0\xf0\x40\x1f\x64\x20\xe2\xde\xfb\
+\x09\x13\x13\x21\xc6\x40\x31\xae\x9f\x8a\x26\x7e\x1c\x0f\x97\x82\
+\x8e\xbb\x96\x0a\xc6\xd8\x04\xbe\x75\x94\x2f\xa3\x9a\x3e\xe6\x59\
+\x71\xb3\x57\x99\xf0\x35\x50\x3f\x64\xb3\xe6\xfa\x62\x24\xb4\x09\
+\xc3\xeb\x34\x5b\x5c\x37\xdd\x38\x9b\x5d\x8c\x80\xb1\x75\x5a\x85\
+\xf1\xc0\xf9\x97\x30\x73\x3e\x4b\xe7\x35\x7e\x69\x69\x71\x04\xc4\
+\x26\x7c\x83\xaf\x20\x27\x8d\xab\x9f\xaa\x78\x96\x81\x77\x5b\xba\
+\x96\x72\xf8\xc5\x6a\x6b\x57\x6b\x60\x55\xdd\x94\xb7\x6b\x5a\x02\
+\x11\x7d\xca\x21\x98\x38\x39\x4e\xca\xbc\xac\xa6\x27\x2c\xfc\x9c\
+\x85\xa9\xf2\x36\x4e\xb2\xe6\x69\xca\xa8\xe4\xd2\x0a\xad\xcf\x46\
+\xdd\xda\x72\x3e\xaf\x53\xb0\x87\xf5\xe6\x82\x4d\xb0\x12\x64\xfa\
+\x11\x99\xbc\x5c\xea\x3c\xfc\x0c\xa5\xf2\x1d\xc2\xf8\x4e\x61\x8e\
+\x6f\x84\x9d\x4f\x86\xd6\x1f\xe9\x2c\xcd\xcd\x5e\x67\xad\xe5\x01\
+\x8d\x3f\xe0\x87\x1d\x16\xa6\x73\x1f\x0b\xff\xcc\xc2\xb3\xfd\x4e\
+\xea\xa4\xd9\x43\x8e\xd8\x21\x2d\x36\x86\xb1\x64\xaf\xb4\xaf\xf6\
+\x92\x53\x87\xbd\xe4\xcc\xd1\x5e\x7a\xb8\xce\x9a\xf4\x4b\x7c\xe4\
+\xdc\xd1\x3e\xda\x21\x8b\xbd\xa2\x87\xac\x38\xec\x21\xab\x7e\x3f\
+\x0f\xd9\x5d\xd1\xf8\xdd\x3c\x14\xaa\xe2\xf4\xba\x4a\xa1\x8a\x9f\
+\xec\xa8\x4f\xfb\x3d\xe9\x24\xef\x3e\x2f\x56\x93\x1f\x8b\xac\x81\
+\x72\x7d\x57\xa7\xd5\x07\xd0\x2c\xfd\x67\xf1\xb1\x4e\x37\x54\x8f\
+\x1c\x2c\xd3\x94\x71\x6e\xad\xdc\xcc\x3e\xe1\x2c\xa3\xce\x49\xe3\
+\xba\xd9\x47\x01\xb3\x86\x1a\x6d\x35\xd3\x1d\x2d\xce\x5a\xca\x84\
+\x52\xbd\x42\x76\x8e\xd2\xe3\xfc\x08\xdb\x42\x39\xe9\xdb\x36\xe4\
+\x00\xb6\xf9\x23\x6d\x4b\x1e\x83\x6d\x0e\x14\x66\x1d\xe6\x93\x27\
+\xd8\x57\x18\x55\x9c\xad\x77\x13\xfc\x99\xef\xa4\x9d\xef\xa4\xad\
+\x2e\x46\x96\x6a\xe7\x0d\x97\xea\xab\x0c\x76\xea\xb3\x06\x0b\x7e\
+\xa4\xc1\x6b\xaa\x5f\xaa\xb8\xa8\xe7\x65\xb5\xbc\x18\x2d\xe3\xa6\
+\xca\x1e\xdf\x8e\x15\x85\xdd\x59\x48\xae\x23\x46\xb5\xd7\x52\x31\
+\x09\x6f\xc2\x6b\xa7\x94\x88\x04\x65\xde\x79\xe9\x4c\x34\x16\x56\
+\x51\xe3\x9c\x13\xd1\x98\x3b\x6a\xa5\xf0\xc2\x9d\x0e\x5d\xaa\x28\
+\xd3\xc6\xe9\x81\x47\x39\xa7\x12\x9c\xa4\xdd\xd0\xa3\xcf\x49\xe7\
+\x3b\x49\xc1\xa1\x9a\x7a\xe3\xac\xee\xdc\x79\x74\x6e\x84\x32\xf2\
+\xb9\xdc\x10\xf2\x0b\x72\xc3\x51\x0f\x49\x25\x7a\x91\xc2\xdc\x00\
+\x7f\x71\xeb\x30\xfc\x83\xdc\x90\x54\x69\xc8\x19\x3f\xc8\x0d\x61\
+\xa8\x02\xbf\x3b\x7b\xc8\xb6\x97\x29\x85\x2c\xc1\xab\x10\x16\xd9\
+\xf3\x20\x8a\xd7\x90\xb0\x56\x1b\xe3\x06\xaa\x7a\x03\xf1\xf6\x4c\
+\x0e\xac\xd2\x9c\x0a\x70\xb7\xfa\x9c\xc3\x84\xeb\x25\xf9\x67\xfc\
+\x2e\xac\xf7\x87\x4c\xdb\xc1\x1d\x57\x1d\x28\xc4\x40\xd3\x69\xf0\
+\xe2\xe6\x61\x57\x53\xc6\x0f\x57\x7d\x10\x66\x77\x08\x3b\xd0\x3b\
+\xa8\x19\xfe\xee\x13\x76\x54\xd9\xff\x46\x81\x7d\x19\xaa\xb6\x03\
+\xa4\x04\x13\xaf\x15\xfe\xff\x3d\xd3\xd4\x91\xa6\x9d\x4f\xf0\x48\
+\x11\xde\x96\x69\x13\xcf\xe2\x26\xee\x4e\x1b\xeb\x19\x38\x71\xac\
+\x31\x7d\x0e\x27\xac\xe9\xcf\x3f\xfc\xb8\x01\x5d\x92\x4c\xff\x53\
+\x56\x37\x1d\x98\x90\x20\xbe\x2a\xef\x00\x63\x9b\x3c\xc0\x73\x4c\
+\x32\xc5\xc2\x1d\x37\x97\xd9\x32\x5e\xa4\x78\x9c\xfa\x13\x1c\xa5\
+\x40\xfe\xe6\xc3\x80\xb8\x79\xba\x4d\x3b\xa6\x2d\xdb\x2a\xad\xcb\
+\xbb\x2a\x49\x77\x9e\x30\x67\xc9\x32\xc3\x45\x93\x0f\x4d\x96\xe7\
+\x7f\x45\x21\xbd\xe4\x68\x99\x86\x23\x66\x59\x5d\xf6\x18\xa3\x01\
+\xdf\x2f\x36\x18\x1e\xa8\x90\x35\x79\x7a\xf9\x3e\xbe\x2d\xc9\xbb\
+\x38\x8f\x97\x70\xf0\xad\xd2\x2c\x68\xdc\x7e\xea\xb3\x99\x6c\xf3\
+\x09\x94\x5b\x22\x91\x73\x6b\xc6\x40\x3b\x58\x9e\x67\x49\x5a\xd4\
+\x87\xad\xde\x75\x50\x5e\xad\xad\x27\x3f\xfd\xeb\xfd\x04\xaa\xf8\
+\x64\xcb\xf6\x56\xe5\x5d\xda\x07\x8d\xee\xae\x7e\x4d\x93\x81\x13\
+\x42\xa8\xff\x1c\x2f\x9e\x39\x06\x67\xf3\xec\xb2\x02\xf1\xd5\xec\
+\x7c\xb2\x1a\xee\xa4\x59\xa6\xb0\xef\xef\x22\x69\xe7\x06\xbc\x83\
+\x62\x5b\x5a\x84\xa0\x95\x05\x6c\xf5\x57\x77\xc7\x06\xee\x6f\xf1\
+\xcd\xdd\x15\xf9\xd0\xa4\x80\xfd\xea\xd8\xa8\x6d\xcb\x0c\xb4\x08\
+\xf5\x3e\xf4\xdf\x3f\x0f\x59\x0f\xfd\x47\x45\x6b\x88\x84\xdb\xb4\
+\x02\x30\xd7\x07\x91\xf0\x90\x5e\xd1\xf5\x64\x60\x9c\x24\x93\x9f\
+\xd3\xdb\xaa\x9c\xdd\x25\x4d\x56\x16\xa3\xe7\x10\xfb\x1a\xc6\x3f\
+\x64\x75\xeb\x93\x5d\x8c\xab\xf4\xb7\xbb\x0c\x56\x7c\x11\xe7\x7f\
+\x94\x0d\x38\xe4\x75\x95\x4d\xab\xec\x3e\xf8\x1d\x43\x56\xbf\xae\
+\xbe\x1f\xae\xe3\x2a\xfd\x3e\xcf\x6e\xb6\x75\xfe\x3a\xbe\x61\xf4\
+\xae\x9c\xf5\xf9\x06\xdc\xad\x70\xb6\xde\x7d\x7b\x45\xf8\x7c\xb2\
+\xae\xd2\x61\xb4\xe8\xaa\x77\x1e\x3f\xa5\xd5\x7a\x9b\x6f\xba\xce\
+\x39\xbc\xe6\x71\x93\xbe\xe5\x4c\x52\xef\x3d\x37\x51\xfb\x06\x9d\
+\xc2\xe9\xba\xce\x2f\xfa\xdb\xcc\xc2\x72\xdb\x75\x27\xcd\x56\x17\
+\xee\xa8\x96\x06\x3a\x6d\x11\x31\xf8\xc5\x91\x52\xce\x9a\x08\x5a\
+\x2d\x43\xad\x81\xe6\x1c\x7a\x6e\xd8\x11\x95\xf0\xfe\xb4\xeb\x8e\
+\x92\xac\x4a\xf2\x5e\xf2\xac\xfa\x90\x61\xbf\x33\xcb\xea\x5b\x30\
+\x65\x9a\x15\xb8\x89\x9d\x95\xf7\x69\x35\xcf\xcb\x87\xe9\x7d\x56\
+\x67\x57\x79\x7a\x16\x9e\x59\x8e\x0d\xca\x7a\xaa\xbb\xb2\x52\x67\
+\x73\xd8\x0c\xa6\xb0\x4d\xbc\x3d\xd9\x3e\x52\x9e\x86\xaf\xbd\x33\
+\x74\x18\x56\x77\x79\x3a\x2d\xca\xe2\x53\x5a\x95\xd0\x00\x55\xe5\
+\x4d\x18\xa6\xab\xf7\x71\xb8\xd2\x03\xde\x5a\x58\x26\xac\xd6\xeb\
+\x79\xe4\x9f\xc4\xb7\x53\xc8\x90\xa6\x3f\xf7\x6b\x99\x15\x53\x00\
+\x72\x5a\xad\x67\xc3\x20\xcf\xe0\x31\x55\xeb\xb9\x59\x5c\x03\xaa\
+\x2a\x30\xb4\x2f\x0b\x67\xdb\x8e\x6d\xca\xd6\x73\x9d\xba\xcb\xb8\
+\xba\x49\xab\x76\x41\xfb\x3e\xae\x9b\xb8\x6a\x06\x33\xcb\x6c\x36\
+\x18\xa7\x45\x3b\x7e\x76\x89\x76\x1b\x37\xd7\xd6\xf8\x7e\x5b\xb8\
+\x1d\x67\x41\x39\xb3\xca\x00\x60\x30\xce\x61\x04\xad\x81\x8c\xc6\
+\x52\x7b\x38\x0c\x68\xcd\x21\xd0\x8c\x32\x66\xac\x33\xa7\x3d\x56\
+\xbb\x4f\xac\xab\x13\x96\xa1\x70\xe0\x10\x03\xd1\xe1\x24\xca\xb9\
+\x16\x46\xf4\x53\x61\x31\xd4\x79\x01\x1d\x96\x1a\x94\xce\x67\x80\
+\x7a\x3d\x48\x75\x30\xda\x3e\xbd\xbf\x1c\x46\x27\xee\x2f\xe0\x00\
+\xf6\xc7\x45\x52\x0f\x4b\xde\xb8\xc1\x87\x6d\x34\x71\xea\xbc\x15\
+\xda\x06\x30\x85\x41\xa8\x14\x52\x03\x20\x18\x53\x70\x66\x37\xd4\
+\x70\x65\x94\x94\xa7\x03\x56\xfb\xd0\xb4\x1f\x4f\xfb\x10\x05\x98\
+\x41\x65\xbf\x05\x62\xba\x22\x64\x14\x53\xca\x2b\xff\x19\x10\x09\
+\xfe\x35\xb5\x88\x53\xe6\x15\xde\x5e\xa9\x3f\x02\x82\xf0\xe0\x41\
+\xc6\x52\x28\x08\xbe\xf4\x11\x5e\x3e\x38\xcd\x98\x24\x09\x19\x6b\
+\xca\x8c\x91\x50\x65\x18\x6c\x2b\x8c\x59\x4b\xc6\x9e\x7a\x88\xb6\
+\x85\x6a\x24\xf1\x3a\x43\x93\x31\xde\xc3\x38\xc3\x23\x4b\xf1\xa0\
+\xcd\x25\xe1\x94\x3b\x67\x79\x24\xe1\xc9\xa4\x27\xb0\xd7\x31\xc7\
+\x79\xa4\xa9\x65\xde\x4b\x62\xa9\x32\xc6\xda\xc8\x50\x65\xad\x50\
+\x44\x53\xe1\x95\x06\xd1\x94\x2b\x6e\x98\x20\x50\xd3\x34\xe3\x08\
+\x4e\x68\xd6\x20\x53\x15\xf0\xc4\xab\x12\xcd\x60\x0a\x60\xa5\xa4\
+\xf3\x28\x18\xe5\x18\x0f\x10\x46\x41\x0a\x24\x8f\x5b\x51\x22\x1a\
+\xb7\xb2\xb4\x20\xe3\x56\x9a\x46\x74\xa3\x38\xd0\x07\xac\x11\xdc\
+\xa2\x51\x80\x7a\xeb\x70\xac\xb8\x50\x0e\x67\x60\x67\xe6\xb8\x0a\
+\x60\x24\x20\x43\xc2\x14\x64\x08\xf7\xe4\xd3\x9e\xbc\x83\x9d\x7a\
+\xd8\x95\x6c\x15\xc5\x5d\xa9\x68\xb5\xe7\xe0\xf3\x55\x2e\x5a\xed\
+\x98\x17\x68\x89\x0e\x16\x78\x78\x55\x14\xe4\x0a\x70\xe4\xe9\x3e\
+\xc1\x62\xf4\x6d\x13\x49\x63\x1a\x81\x5b\xdb\x44\x0a\x40\x7a\x69\
+\xd2\xec\xec\x00\x84\x3c\xdd\x2a\xc5\xc6\x01\xbe\xc2\xff\x68\xfe\
+\xef\x13\xe9\xf5\xca\xe4\xf9\x64\xb1\x6e\x3d\x17\x6d\xd3\xb9\xe8\
+\x77\x9b\xab\x48\xef\x6b\xb5\xf0\xc2\xed\x79\x79\xdb\x6e\x4b\x37\
+\x48\x34\x5a\xc0\xa6\xb0\xde\x15\xd6\x23\x25\xa0\xab\x64\x8e\xb9\
+\x48\x69\x50\xdc\x0b\xbb\x69\x30\x42\x2b\x00\xe3\xcd\x1d\x45\xbf\
+\xa4\x1f\xd0\x0d\x6f\x83\xf6\xe8\xd6\x41\x1b\x78\x77\xf7\x75\x30\
+\xf7\x77\x02\x5b\x94\x88\x0c\xa8\x44\xde\xb5\xef\x9a\x13\x0d\x59\
+\x1b\x29\xa8\x5a\x04\xfe\xb8\x48\x3a\x2a\x89\x02\x44\x45\x52\x02\
+\x9d\x34\x54\x42\x3f\x4c\xa1\xfa\x28\x7c\x83\x1c\x23\x39\x54\x1a\
+\x07\x55\x88\x43\x69\x63\xd4\x47\xd0\x21\x13\x01\x36\x0b\xa8\x50\
+\x3c\x3c\xa1\x92\x45\x8c\x08\x6a\x30\xef\x81\x09\xbe\x80\x4f\x60\
+\x1e\x2a\x01\x7e\x86\xb1\x0e\xf5\x02\xcb\x89\x25\xef\x89\xf0\x81\
+\xa5\x00\xc5\x50\x5a\xa4\xa8\x22\xc2\xc2\x1c\x3c\x80\xa2\x7d\xa8\
+\xf6\x21\xf0\xa1\x03\x11\x27\x50\x6f\x35\xbc\x48\x22\x24\x08\x45\
+\x0e\x02\xec\xc3\x9a\x08\x5c\x39\xbe\x42\x65\x4c\xb0\xc8\x49\xac\
+\xb5\x28\x54\x07\x32\xd8\xb9\x81\x4a\x83\x05\x10\x33\xa0\xe6\x14\
+\xef\xe2\x0d\x68\x2d\xc3\x13\x75\x65\x04\x99\xc2\x12\x4f\x40\x16\
+\x96\x51\x05\xd6\x4b\xb4\x02\x97\x26\x04\xf9\x43\x95\xb5\x04\xbc\
+\x16\x71\x80\x20\x81\xba\x2f\x22\x54\x81\xa0\x18\x4d\x7c\x04\x95\
+\x1e\xfe\xc2\x47\x47\xee\xc1\x4e\x74\x1a\x68\x82\x82\x38\x28\xee\
+\x08\x7a\x1d\x9f\xe8\x2e\x16\x46\x20\x87\xb7\x2f\x38\xff\xa9\xbb\
+\xce\x3b\x0e\x21\xea\x25\x08\xb1\x43\x84\x78\x30\x3d\x92\x1a\xd4\
+\xb3\x2e\xe2\x1e\xfc\x94\xa0\xcb\x3c\xc6\x8f\x13\x50\x0c\xff\x0f\
+\x01\x4a\x8d\x57\x31\xf5\xe8\x59\x28\xbf\xf8\xc9\xe1\xff\x32\xf0\
+\x8b\xc5\x04\x00\xf7\x03\xc4\x7c\x24\x11\x5a\x21\x00\xb0\xd9\xe1\
+\x03\xfc\x42\x30\xf2\x18\x78\x84\x8d\x05\x4f\xc1\x2c\xc1\x30\x23\
+\x24\x02\xbe\xc2\x3e\x23\xdb\x75\x2a\x42\x3d\xc6\x08\x3a\x8e\xcc\
+\xb0\x57\xd7\xa8\x9c\x23\xa8\x2d\x06\x85\x07\x38\xf2\xc8\x91\x7f\
+\x13\xe3\x60\x19\x8a\x09\x6e\xc4\x70\x8c\x11\x28\x1a\x5f\x90\xe7\
+\x3b\x62\x03\x06\x00\x41\x04\x33\xd4\x81\x06\x16\x31\x27\x0d\x88\
+\xc6\x38\x6b\xaa\x56\xd0\x46\x30\x23\x20\xd0\x50\x89\xf2\xe1\xc9\
+\x11\xda\xa8\x29\x60\x2e\x38\x26\x44\x12\xed\x0b\x70\x18\xa3\x8a\
+\xc1\x63\x68\xe0\xa7\xcd\x85\x25\x94\x9e\x73\xbc\x3e\xbc\x7c\xf3\
+\x5f\x6d\x79\x68\xb2\
+\x00\x00\x0b\xb5\
+\x00\
+\x00\x2f\x44\x78\x9c\xcd\x5a\xdb\x72\xe2\x48\x12\x7d\xf7\x57\x68\
+\x99\x97\x76\x04\x92\xab\xb2\xee\xd8\xee\x89\x98\xd9\xd8\x8e\x7d\
+\xda\x88\xdd\x99\x0f\x10\x20\xdb\x6c\x63\x70\x08\xdc\xee\x9e\xaf\
+\x9f\x93\x25\x09\x49\x80\x81\xb6\xe9\x9d\x6d\x3f\x34\x4a\x55\x29\
+\x4b\x99\xa7\x4e\x9e\x2c\xb8\xf9\xf9\xeb\xe3\x3c\xf9\x52\x94\xab\
+\xd9\x72\x71\x3b\x90\x99\x18\x24\xc5\x62\xb2\x9c\xce\x16\xf7\xb7\
+\x83\xdf\x7f\xfb\x47\xea\x07\xc9\x6a\x9d\x2f\xa6\xf9\x7c\xb9\x28\
+\x6e\x07\x8b\xe5\xe0\xe7\x8f\x17\x37\x7f\x4b\xd3\xe4\xd7\xb2\xc8\
+\xd7\xc5\x34\x79\x99\xad\x1f\x92\x7f\x2e\x3e\xaf\x26\xf9\x53\x91\
+\x7c\x78\x58\xaf\x9f\x46\x57\x57\x2f\x2f\x2f\xd9\xac\x36\x66\xcb\
+\xf2\xfe\xea\x32\x49\xd3\x8f\x17\x17\x37\xab\x2f\xf7\x17\x49\x92\
+\xc0\xef\x62\x35\xc2\xc5\xed\xa0\x33\xe3\x45\xc5\xb1\x24\x84\xb8\
+\xc2\xbd\xc1\x66\xe4\x69\xa3\x46\x5f\xe7\xf0\xb9\x6f\xac\x0c\x21\
+\x5c\xc5\xbb\x71\x74\xef\x8d\xd9\xf0\x32\x9b\xae\x1f\x6e\x07\x44\
+\xf1\xea\xa1\x98\xdd\x3f\xac\x37\x97\xb3\xe9\xed\x00\x7e\x68\xf0\
+\x11\x57\x37\xd3\xe2\x6e\xc5\xd6\xca\xce\x57\x3a\xde\xc0\x2d\x3c\
+\xbf\xc8\xcb\x4f\x65\x3e\x9d\x15\x8b\x75\x35\xa8\x1a\xd6\xbf\x43\
+\x5a\xca\x7a\x0e\x66\xad\xd6\xcb\xa7\x66\x6c\xed\x0c\x16\x8c\x51\
+\x83\xd6\xbc\x5a\x7f\x9b\x17\xd5\x9d\x74\xb2\x9c\x2f\xcb\xd1\x4f\
+\x77\x45\xe1\xc6\xf2\x3a\x9a\x96\x4f\xf9\x64\xb6\xfe\x36\x92\x9d\
+\x29\xcb\xbb\xbb\x55\x81\xb7\x40\x4e\xaf\x8e\x3b\x0b\x87\x9d\x15\
+\xe3\xa9\x1e\xeb\x13\x9c\x65\x64\x5c\xb0\x26\xd0\x29\x5e\x49\x1e\
+\xf6\x3a\xf1\xb9\x73\xe6\x14\xaf\x46\x7c\x87\xd7\x23\x81\x1d\x8b\
+\xa0\xcc\xf8\x14\xaf\x4e\x0b\x11\x8c\x53\x27\x45\xd8\x1c\x49\xe7\
+\xa4\x18\x8f\xef\x8e\x7b\x95\x1b\x67\x37\x57\x7d\x58\x1d\x44\xe1\
+\x57\x79\x3b\xb0\x99\x23\xeb\x69\xf3\xd0\x6f\xb0\x29\xca\xa4\x95\
+\x36\xb8\x8d\xf5\x2b\xdd\x0e\xb4\xc8\x82\xf2\x92\x6c\x3b\x96\xf6\
+\x8d\xdd\x83\x6d\xe3\xda\x49\x71\xc7\x8d\x1e\xca\xe2\xee\x76\xf0\
+\xd3\x9e\x3d\xd0\x8c\xbb\xaf\x8d\xbf\x2f\x66\x6b\xec\xf5\xe7\x55\
+\x51\xfe\x07\x21\x28\xfe\xb5\xf8\x7d\x55\xec\x8c\xfa\xad\xcc\x17\
+\xab\xbb\x65\xf9\x78\x3b\x78\xcc\xd7\xe5\xec\xeb\x07\x91\x69\x0f\
+\xd8\x79\x37\x14\xfc\x97\x19\x6b\x1d\xd2\x32\x4c\x45\x66\xb1\x1e\
+\x63\x87\xa9\xce\x9c\xc1\x47\xe5\x2f\xdb\xf8\x9d\xba\x5f\x83\xd7\
+\xe6\xd8\x7e\xc5\x18\x77\x30\xc1\x2f\x0f\xb3\x75\x71\x96\xdd\x0a\
+\x57\x87\x77\xeb\x1e\x57\x88\x50\xd0\x78\x0d\x65\xcf\x0b\x29\x09\
+\xa0\x08\xa0\x2a\xf4\x40\x45\x26\x13\x82\xc8\xcb\x1e\xa8\x94\xc8\
+\xbc\x33\x5a\x6f\x81\xca\x66\x92\x5c\x77\xec\x5e\x50\xa9\x53\x40\
+\x15\x13\x75\x46\x50\x19\x2d\x29\x50\x03\x2a\xe1\x3c\x22\x8f\x4f\
+\x52\x38\x13\xf4\x30\x95\x59\x08\x4a\x4a\xfb\x16\x4c\x19\xef\x8f\
+\xd6\x00\x8c\x39\x42\x55\x53\xcb\x14\x79\x16\x54\xc1\xd9\x11\x86\
+\x9a\x8a\xf1\x34\x84\x1f\xca\x50\xa4\x19\x22\x7d\x2c\xf5\x41\x44\
+\xbc\x91\x7b\x00\x92\x47\xe8\x48\x9c\x82\x9c\x98\x8e\x33\x22\xc7\
+\x09\x3c\xb1\x41\x8e\x17\x0e\x7b\x8f\xd9\x88\x82\x16\x30\xa7\xc0\
+\xbc\xf7\x0e\x80\x7a\x03\x72\x24\x09\x77\x14\x3a\x3c\xe8\x30\x76\
+\xce\xc7\x47\xec\xeb\x30\x74\xf6\x11\xd2\x99\x81\x83\xbd\x88\x12\
+\x2b\xb6\x78\x48\x66\xc6\x08\xdf\x61\xa7\x08\xa1\xdd\xb1\x0c\x23\
+\x9f\x09\xe5\x90\xb5\x83\x68\xb2\xee\x14\x34\x55\x29\x3a\x2b\x11\
+\xe1\xcf\xd4\x70\x22\x23\x0d\xaa\x33\x3e\x89\x20\x82\x36\x43\xb0\
+\x6d\x70\x20\x25\xea\xa0\xe9\x6e\x36\x5f\x17\xe5\x66\xad\xb7\x83\
+\x34\x96\x00\x29\x51\x0e\xdb\xf7\x8e\x66\x20\x52\x19\x20\x53\x6f\
+\xec\xb5\x1c\x46\x9c\x3c\xdf\x6b\x6f\x34\xca\x58\x42\x08\x30\xc6\
+\xdb\x10\xc6\x44\xa7\xb3\x05\x9c\x3e\x2d\xe7\xf9\x1a\xf2\x3a\xad\
+\xd6\x80\x57\x5e\xfd\xfb\xd3\x2f\xbd\xb0\x56\x77\x0c\xb4\x53\x0b\
+\xe4\xbb\xe2\x53\xfe\xbc\x5a\xcd\xf2\xc5\x2f\xf3\xe7\xb2\x0f\xb3\
+\xfe\x3d\xcc\xeb\x17\xc0\xe9\xdf\x8b\x2f\xb3\xe8\x93\x55\x99\x85\
+\x10\xc0\x9f\xe9\xa0\xa9\xf2\x57\x5f\x71\xa0\xf3\xf9\x36\x8a\x26\
+\x88\x91\x34\x90\x3d\x1d\x2c\x4f\x10\x20\x12\x99\x92\xd4\xda\x4a\
+\x94\xac\xbe\xe5\x6e\xcf\xcc\xbb\x3d\x33\xf9\x45\xfa\xbe\x81\xa7\
+\x93\xea\x9a\xed\x6e\xb0\xf7\xc3\x09\x45\xd8\x49\x27\x6b\x38\x29\
+\xa8\x25\xcb\x62\xc9\x64\x86\x3c\x59\x3b\x44\x57\xa4\xc8\x4a\xf1\
+\x16\x76\x8a\x4b\x3d\x42\x18\x18\x73\x58\x2b\x8d\xe7\xf9\xe4\xf3\
+\x59\xb8\x09\xae\x0e\x6b\xa5\x3d\xae\xde\x44\x4d\xff\x57\xa0\x3a\
+\xa9\xe4\xfd\x10\x50\x99\x2d\x50\xa9\x8c\xad\x14\xde\x85\x29\x09\
+\xa2\x39\x5e\xf1\x30\xe8\x88\x5a\x9a\xe4\x53\x31\xb1\xe7\xa9\x79\
+\xf0\x76\xac\x65\xce\x8b\x49\x71\x82\x5c\x82\xb2\x3c\xcd\xdf\x11\
+\x79\x36\x31\x93\xf1\x44\xfc\x50\x79\x26\xb9\x9f\x12\x5e\xf7\x5b\
+\x48\xca\x82\x54\xd6\xeb\x2d\xa1\xe6\x32\x19\x88\x5c\x5b\x3c\x2a\
+\xb1\xc6\xda\x48\xc8\xc3\x6a\xdf\x9c\x56\x65\x23\x2c\xce\x58\x65\
+\xd1\xf7\x5b\xd7\xf4\x90\x5a\xa3\xd8\x0b\x02\x70\xa5\xb6\xa8\xb8\
+\x2c\xf7\xad\x0b\x96\xe8\x28\x82\x39\x54\x8a\x5b\x20\x8d\xa8\xf4\
+\x42\x25\xa1\x6f\x75\x70\xaa\xdf\x6d\x2b\xc5\x63\x95\xdc\x0a\xd5\
+\xce\xd8\x7d\xa1\xf2\xa7\xed\x75\x24\xe2\xfd\x91\x5a\xf3\x47\xd4\
+\xf6\xe2\x03\x42\xe1\x49\x43\x2f\x71\x78\xc8\x1c\xd1\x1d\xa4\xf1\
+\x67\xba\x87\x09\x95\xee\xd0\x68\xd2\xb9\x7b\xdc\xd5\x1d\x90\xcb\
+\xde\x88\x16\xf0\xad\xee\x10\x01\xb9\xe8\x68\xf5\xb7\xe8\x0e\x0b\
+\x05\xf5\x16\xdd\x81\x79\x7d\x86\xe9\xeb\x0e\xd2\xf8\x67\xb4\x7f\
+\x4d\x77\x9c\x5c\x42\x39\x59\xc7\xea\x1a\xd1\x77\xd7\xb5\xb7\x96\
+\x50\x52\x87\x8f\xe9\xce\x55\x42\x0f\x6c\x26\x02\xca\xbc\xa0\x7e\
+\x67\x28\x55\xe6\x7c\xe8\x6a\x89\xb8\x99\xb0\xf1\x48\x84\x0e\x44\
+\xe2\x66\xda\x19\xbb\xb7\x57\xf4\x7f\xc5\x66\x4a\x65\xc8\x8c\x62\
+\xe9\x85\xdd\xe4\xb4\x72\xd2\xeb\x57\x77\xd4\x9b\x74\xb6\xeb\x9e\
+\x5f\x7d\x87\xce\x76\x5b\x67\x5a\x7d\xbc\x7b\x85\x0d\x11\xdc\x5e\
+\xb8\xdf\x5c\xf1\xc9\x78\xfc\x74\x7f\xd1\xc6\x3b\xff\x56\x94\xcd\
+\xd6\xbb\x79\xca\xd7\x0f\xcd\xd3\x71\xf3\x31\x51\x99\xf1\xc8\x81\
+\x1a\x3a\xf0\x21\xb4\x44\xa0\x64\x92\x80\x05\x83\x73\x42\x72\xfb\
+\xec\x22\xe7\x24\x01\xc4\xe8\x22\x25\xa3\x1e\x49\x69\x95\x4a\x98\
+\x2c\xc9\x6b\xa5\x86\x22\x81\x51\xa0\xbd\xb3\xf8\x08\xbe\xc0\x13\
+\x35\xf7\x4a\x86\x14\x26\xb5\x16\x10\x17\xb8\x55\xca\x64\x9e\x88\
+\xa1\x04\xa1\x05\x17\xa4\xf5\xf0\xc8\xec\x8f\x32\x47\xf0\x04\x07\
+\xf0\xa3\x83\x61\xfd\xc2\x27\xcc\x3e\x49\x77\x9f\x00\xe5\x8c\x76\
+\x08\x0c\xce\x13\x85\x25\x9b\xa4\xc8\x68\x90\xde\x2a\x19\x4d\x52\
+\x3b\x8d\x89\x9d\x35\xfe\x9a\x10\xde\x4b\x18\x92\x43\x28\x3a\x4f\
+\xce\x6a\x09\x93\x11\x42\x28\xcb\x26\x2c\xd7\x92\x6e\x4d\xc0\x88\
+\x77\x4a\x79\x17\xd7\x9b\x6e\x2d\x38\xad\x57\x6c\x13\x3e\x0a\x05\
+\xdd\x2a\x2e\x57\xf5\xf2\xea\x05\xbb\x8e\xe9\x8f\xbe\x7e\x2c\x26\
+\x6b\xd9\x2d\x3f\xf5\x1e\x47\x3a\xe7\xa3\xe7\x72\xfe\x61\xfb\xec\
+\xd6\x38\x7b\x79\xcd\x77\x5b\x6e\xa9\x2e\xcb\xe7\x79\x31\x2a\xbe\
+\x14\x8b\xe5\x74\x0a\x46\x28\x97\x9f\x8b\xd1\x4f\x39\xa0\xad\x8b\
+\xfa\x32\x8d\x1c\x3f\x12\x59\x88\xff\xb4\x6d\xec\xec\x62\x92\x3f\
+\x8d\xca\xe5\xf3\x62\xda\x35\xfe\x77\x39\x5b\xf4\xad\x8f\x33\xa0\
+\x6c\x3e\xc3\x7f\x23\xdd\xd8\xda\x85\xd4\x86\x69\xbe\x7a\xa8\xa8\
+\x67\xd4\x92\xdc\x2e\xe6\x74\x0c\x8e\x70\x43\x1f\x23\x2d\x24\x25\
+\xe0\x0a\xe4\x89\x4f\x8d\x05\x07\x37\x53\x20\x76\x4b\x11\x58\xc0\
+\xa7\x75\xc4\x3d\xb8\xb5\xe8\x99\xbb\x16\xec\x04\x12\xaa\x42\x13\
+\xe6\x04\xe3\xb5\x6e\xd0\xa4\x14\x9c\x30\x98\x40\xa5\x41\x3a\x56\
+\x17\x5e\x41\xae\x46\x7c\x6d\x3d\x20\xd5\xc8\xbd\xb4\xdc\x9e\x65\
+\x46\xdb\x60\x81\x1c\x9f\xf1\xf1\xb2\xf1\x36\xda\x0c\x1a\x5c\xa0\
+\xa9\xb3\xca\x74\xb3\x48\x7c\x92\x10\x63\x72\xf3\xe4\xb8\x6f\xe2\
+\x6a\x55\xdf\xd6\x59\x6f\xba\xb5\xe0\xb4\x5e\xb1\x4c\x78\xaa\x04\
+\x9b\x76\x26\xec\x79\xc6\x2e\x9a\x6c\x10\x6a\x1b\x4d\xed\x51\xb4\
+\x72\x31\xf7\x3e\x62\x66\xb4\x58\x2e\x1a\x70\xbc\x02\x36\x75\xd9\
+\x07\x0f\x00\x1d\xff\xa9\x73\x83\x27\xee\x55\x11\xc8\x87\xef\x44\
+\x11\xaa\x8b\x03\x96\x0d\x98\xcb\x28\x6f\x48\xd4\xcc\x25\xb1\xdb\
+\x54\x3c\xf9\x73\x3e\xa6\x20\x64\x16\x92\x98\x5c\xdc\xb1\x48\x58\
+\x88\xd4\xa5\xb5\x94\x5a\x46\x84\x41\x06\x7a\x51\xb1\x18\x3f\x92\
+\x29\x45\x79\x2b\x62\xe0\x1b\x03\xb2\xce\x54\x16\xa1\x96\xe9\xe0\
+\x03\x58\xa1\x02\x9a\xc6\x08\x47\x3e\x02\x42\x3b\xb8\xda\x8c\x8e\
+\xb6\xfe\x03\x3c\x13\x17\x48\x43\x05\xcd\x5e\x9c\xd4\x21\x32\x97\
+\xd5\x46\x41\x98\x31\xca\x95\x0f\xd8\x10\x69\x77\x89\x69\xbd\x46\
+\x5d\x7d\xe6\x47\x52\xc4\x47\xbd\xcc\x9e\xad\x71\x54\xa1\xac\xbb\
+\xd6\xb4\x59\x6c\x52\x2f\xd5\xb4\xe3\x93\xdd\x47\xec\x63\x2c\xdd\
+\xe9\x73\x8f\x33\x96\x38\x9d\xb1\x3a\x88\xac\x11\x47\xd7\x8f\x79\
+\xf9\xb9\x28\xab\x5b\x5f\x66\xab\xd9\x78\x36\xe7\xa7\xc4\x8f\xf3\
+\xe2\x7a\x3a\x5b\x3d\xa1\xba\x8d\x66\x0b\x76\x7c\xbd\xfc\x52\x94\
+\x77\xf3\xe5\x4b\x73\xff\x30\x01\x69\xc3\xe1\x0e\x08\x0f\xff\x8b\
+\x04\x14\x04\x22\x6f\x1a\x02\x12\x44\x15\x24\xf8\x14\x50\x33\x59\
+\xf0\xf7\x12\xc1\x74\x2d\x00\xad\x0f\x21\x46\x1a\xb7\x1d\x42\x6d\
+\x6b\x50\x48\xd4\x24\x51\x81\x02\x85\x41\xc9\xcd\x68\x17\x6d\xfd\
+\x27\xb0\x0d\x0c\x14\x94\x50\x8c\x00\x25\xd1\xbe\x07\x46\x05\xca\
+\x61\xb0\xbc\x24\x70\x83\x35\x21\x12\xd0\x66\x95\x69\xbd\xc8\x1a\
+\x20\xf1\x91\xf1\xeb\xb7\x7a\x9d\x3d\x5b\xe3\x67\x5e\xc1\xa0\xb3\
+\xd6\xb4\x5e\xac\x4e\x36\x4b\x4d\x37\x6f\xb6\xf3\x88\xb0\x0f\x14\
+\xdd\x43\x80\x1d\xe2\xb1\x27\x32\x8e\x75\xaf\x30\x8e\xa4\xff\x45\
+\xb9\x3a\x1b\xd8\x38\x22\x5b\xbd\x15\x45\x0d\x42\x9d\xe3\xe9\x4d\
+\x6f\x65\xb3\xe0\x84\xb1\x6d\x3b\x56\xf2\x19\x54\xc6\xa7\x75\xd4\
+\x39\x03\x2e\xbf\xed\xb3\x7e\x8d\x0d\xab\x09\x10\x68\xbd\x3e\x8f\
+\x54\x46\xa8\x21\x9d\x2e\x76\xbd\xa7\xf5\x0e\x10\x67\xa2\x39\x3b\
+\x32\xce\x41\xa5\x80\x35\x3d\x4f\x85\xca\x19\xa6\x8a\x0f\x94\xb4\
+\xe5\xef\x4b\xb6\x33\x6e\xbc\x77\xaf\x67\x9c\xaa\x8c\x57\x5f\x40\
+\xbc\x7d\xff\xcb\x77\xa6\xe4\xba\x52\xc6\x15\xda\xda\xc3\xef\xcb\
+\xeb\x62\x91\xe3\x76\x3a\x46\x07\x75\x1f\x41\x33\xca\x27\x93\xe7\
+\xc7\x67\x6e\x0c\x0e\x90\x46\x88\x78\x84\x84\x80\x6c\x21\xe7\xb4\
+\xb4\x61\x23\x5c\x09\x42\xd0\xb1\x4c\x95\x12\x7b\x4f\xf0\xd1\x9b\
+\xf4\x52\xa3\x56\x27\x29\xd5\x1c\xd3\x33\x4a\x50\xb7\x70\x4c\x0b\
+\x3c\x20\xf2\xb0\xc1\x06\x33\xae\xbe\x6c\x87\xd6\x42\x13\x1e\xa0\
+\x8d\x2b\x07\xde\x37\x03\x40\x0e\x49\x67\x3c\x5f\x56\x4f\xc6\x12\
+\x44\xd2\x7a\x6e\x9e\xee\x93\xed\xd5\xf0\x94\xfe\x96\xe6\x17\xb7\
+\xdd\x6f\xb2\x76\xb5\xc4\x75\xcb\xf9\xbb\x87\xeb\xef\xe1\xfc\x77\
+\xe7\xfc\x8d\xb9\xe5\x2f\xa2\x2a\xcd\x7f\x24\xb7\xde\xf7\x53\x5b\
+\xe9\xd7\xd7\x33\x5b\x05\xbb\x9f\xde\xc6\x76\x38\xc7\xae\x9f\xe3\
+\xfe\xa4\x36\xd1\x52\xc5\x44\xd7\xeb\xe8\xe6\xb9\xb7\xb4\xd7\xd2\
+\xec\xdf\x9a\xe6\x77\x95\xf6\xbf\x2a\xcd\x06\x41\x61\x7a\x43\x96\
+\x65\xb0\x41\x91\xe2\xd0\x23\x54\x06\xfa\xba\xaa\x86\x8a\x7f\x73\
+\x80\x76\x8e\xdb\x40\x69\x88\xa4\xe6\x2f\x69\xb8\x85\xf3\x10\x6d\
+\x78\x82\x76\xfc\xd3\x8b\x68\x24\xe8\x69\x61\x20\x44\x15\x1f\x24\
+\xb2\xee\x43\x3f\xea\x05\xf1\x30\x23\x3d\x59\x6e\x61\x8d\x97\xdc\
+\x81\xb4\xa6\x76\x22\x17\x63\xca\x2c\x5a\x11\x8b\x5e\xb5\xc2\x9b\
+\xc7\xd6\x05\xfc\x18\x27\x04\x57\xb1\xf8\x07\x1f\xf5\x40\x6b\x69\
+\xb4\x9d\xe3\x7e\xdd\x51\x53\xc7\x21\x0c\x40\xe9\xac\xee\x48\x11\
+\xca\x0a\xbf\x0d\x86\x58\x83\x66\x1d\x1f\x31\x5b\x92\xdf\x32\x6a\
+\x03\x8d\xc9\x58\x55\x08\x49\xb0\x1e\x0b\x0a\x82\x84\x67\x87\x30\
+\x79\xc8\x65\x3f\xe4\x19\xe8\x48\x42\xa3\x7f\xad\x57\x82\x25\xef\
+\x24\x5e\x09\x1d\x14\x5a\x25\x5e\x20\xc2\xa0\x82\x8a\x36\x1d\x88\
+\x6c\xc7\xc6\x87\x8f\x12\x98\xdc\x56\x10\x9c\x24\xf8\xb3\xa7\xcb\
+\x4a\xe6\xf0\x93\x1b\x61\xef\x7d\xee\xcd\xa9\x8d\xf0\xf8\x79\xbd\
+\xde\x11\x16\x51\x4b\x7c\xb7\xb0\xc8\xcb\x12\x00\x66\x80\x1f\xea\
+\x61\x34\x62\xe9\x10\x6d\xee\x5f\xbd\x72\x02\xbc\x23\xd1\xff\xa1\
+\x3d\xf0\x51\x71\x46\x54\x66\x9c\x64\x48\x43\xd6\x11\xe4\x54\x6c\
+\x4b\x94\x15\x86\xa0\x5f\x8d\x14\x5a\xee\xb3\x70\xbc\x59\xe1\xc7\
+\xc3\x62\xce\x83\xe0\xef\xb0\x98\x21\x54\x65\x68\x60\x84\xe6\x43\
+\x19\x9e\xf1\xc7\x41\xb9\xb0\xef\xa4\x5e\x75\x4e\xea\xf9\x44\x85\
+\xdb\xe0\x3d\x72\x01\xa8\x34\xaf\xd3\x8c\xac\xbf\x0a\xbf\x7e\x3d\
+\xe3\xfe\x7b\xd9\x66\xb7\xf4\xf3\xf9\xf3\xe5\xa1\x0a\x00\xdc\xa3\
+\x65\x17\x96\xcf\xa5\x0c\x3a\xaf\xd8\x12\x29\xfe\xce\x36\xfe\xfc\
+\xc8\x06\x19\x38\x19\xd8\x74\x68\xbf\x15\xf3\xaa\x30\x68\xde\x2c\
+\xf3\x84\x43\x9b\xc9\xa1\x57\x0e\x2c\xb1\x6b\x38\x25\x15\x22\xf6\
+\x1a\x60\x19\x8a\x3f\x55\x01\x28\xf8\x10\x22\xea\x6f\xac\x9c\xb3\
+\x84\x96\x4c\x90\x39\x98\xa5\xf4\xd5\x34\x29\xec\x48\xa2\xf8\xfb\
+\x29\x81\x5d\x0e\x4e\xba\xdc\xad\x06\x4a\xd1\x81\x34\xc5\xdf\x31\
+\x68\x77\x20\x4d\x90\x8a\x3f\x3c\x4d\x0a\xa1\xb1\xa0\x80\xa1\x74\
+\xc8\x04\x49\x62\xba\x93\xa4\x63\x71\x74\x59\xcd\xe2\x7c\x70\x67\
+\x15\x53\x14\x2a\x3b\x76\x98\x89\xe7\x2d\x16\xeb\xdf\x18\xe2\x0f\
+\xe3\xe2\x0e\xb0\xbd\xdf\x3f\xed\xc5\xbe\x09\x92\x37\x64\x2f\xa6\
+\x9c\x55\x92\xd6\x30\xef\x93\xb6\x24\x5c\xd8\x8d\x29\x86\x1e\x80\
+\xbe\xad\x90\x2f\x77\x5b\xa4\xe6\xd7\x3b\x1d\xd6\xd2\x99\xc6\xeb\
+\x5a\x1f\xf4\x69\xfd\xd0\x7b\x69\xeb\x07\x74\x49\xfb\x24\xb9\xd3\
+\xe6\x24\x49\x7e\x73\x75\xff\xf1\xe2\x86\x7f\x7c\xfe\xf1\xe2\x4f\
+\x20\x84\x6f\x9a\
+\x00\x00\x07\x5c\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x50\x00\x00\x00\x50\x08\x03\x00\x00\x00\xb9\xcf\x02\x9f\
+\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\
+\x01\x00\x9a\x9c\x18\x00\x00\x02\x88\x50\x4c\x54\x45\x00\x00\x00\
+\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\
+\x00\x00\x01\x01\x01\x02\x02\x02\x03\x03\x03\x04\x04\x04\x05\x05\
+\x05\x06\x06\x06\x07\x07\x07\x08\x08\x08\x09\x09\x09\x0a\x0a\x0a\
+\x0b\x0b\x0b\x0c\x0c\x0c\x0d\x0d\x0d\x0e\x0e\x0e\x0f\x0f\x0f\x10\
+\x10\x10\x11\x11\x11\x12\x12\x12\x13\x13\x13\x14\x14\x14\x15\x15\
+\x15\x16\x16\x16\x17\x17\x17\x18\x18\x18\x1a\x1a\x1a\x1b\x1b\x1b\
+\x1c\x1c\x1c\x1f\x1f\x1f\x20\x20\x20\x21\x21\x21\x24\x24\x24\x25\
+\x25\x25\x26\x26\x26\x28\x28\x28\x2e\x2e\x2e\x2f\x2f\x2f\x31\x31\
+\x31\x33\x33\x33\x36\x36\x36\x39\x39\x39\x3a\x3a\x3a\x3b\x3b\x3b\
+\x3c\x3c\x3c\x3d\x3d\x3d\x3e\x3e\x3e\x3f\x3f\x3f\x41\x41\x41\x44\
+\x44\x44\x45\x45\x45\x46\x46\x46\x4a\x4a\x4a\x4c\x4c\x4c\x4d\x4d\
+\x4d\x4e\x4e\x4e\x4f\x4f\x4f\x52\x52\x52\x53\x53\x53\x54\x54\x54\
+\x56\x56\x56\x57\x57\x57\x59\x59\x59\x5a\x5a\x5a\x5b\x5b\x5b\x5c\
+\x5c\x5c\x5d\x5d\x5d\x5e\x5e\x5e\x61\x61\x61\x62\x62\x62\x63\x63\
+\x63\x65\x65\x65\x66\x66\x66\x67\x67\x67\x68\x68\x68\x69\x69\x69\
+\x6a\x6a\x6a\x6b\x6b\x6b\x6d\x6d\x6d\x6f\x6f\x6f\x71\x71\x71\x72\
+\x72\x72\x73\x73\x73\x74\x74\x74\x75\x75\x75\x78\x78\x78\x7a\x7a\
+\x7a\x7e\x7e\x7e\x80\x80\x80\x81\x81\x81\x84\x84\x84\x88\x88\x88\
+\x89\x89\x89\x8a\x8a\x8a\x8b\x8b\x8b\x90\x90\x90\x91\x91\x91\x92\
+\x92\x92\x94\x94\x94\x95\x95\x95\x96\x96\x96\x97\x97\x97\x98\x98\
+\x98\x9a\x9a\x9a\x9b\x9b\x9b\x9e\x9e\x9e\xa0\xa0\xa0\xa1\xa1\xa1\
+\xa2\xa2\xa2\xa4\xa4\xa4\xa6\xa6\xa6\xa7\xa7\xa7\xa8\xa8\xa8\xa9\
+\xa9\xa9\xac\xac\xac\xad\xad\xad\xaf\xaf\xaf\xb0\xb0\xb0\xb2\xb2\
+\xb2\xb3\xb3\xb3\xb6\xb6\xb6\xb7\xb7\xb7\xb8\xb8\xb8\xb9\xb9\xb9\
+\xba\xba\xba\xbb\xbb\xbb\xbc\xbc\xbc\xbd\xbd\xbd\xbe\xbe\xbe\xc0\
+\xc0\xc0\xc3\xc3\xc3\xc4\xc4\xc4\xc5\xc5\xc5\xcb\xcb\xcb\xcd\xcd\
+\xcd\xce\xce\xce\xcf\xcf\xcf\xd2\xd2\xd2\xd3\xd3\xd3\xd5\xd5\xd5\
+\xd6\xd6\xd6\xd7\xd7\xd7\xd8\xd8\xd8\xd9\xd9\xd9\xdb\xdb\xdb\xdc\
+\xdc\xdc\xde\xde\xde\xdf\xdf\xdf\xe0\xe0\xe0\xe1\xe1\xe1\xe2\xe2\
+\xe2\xe3\xe3\xe3\xe4\xe4\xe4\xe5\xe5\xe5\xe6\xe6\xe6\xe7\xe7\xe7\
+\xe8\xe8\xe8\xea\xea\xea\xec\xec\xec\xed\xed\xed\xee\xee\xee\xef\
+\xef\xef\xf0\xf0\xf0\xf1\xf1\xf1\xf2\xf2\xf2\xf3\xf3\xf3\xf5\xf5\
+\xf5\xf6\xf6\xf6\xf8\xf8\xf8\xf9\xf9\xf9\xfa\xbb\xbb\xfa\xbc\xbc\
+\xfa\xbd\xbd\xfa\xd3\xd3\xfa\xd4\xd4\xfa\xd5\xd5\xfa\xd9\xd9\xfa\
+\xda\xda\xfa\xfa\xfa\xfb\x99\x99\xfb\x9a\x9a\xfb\x9b\x9b\xfb\xb5\
+\xb5\xfb\xb7\xb7\xfb\xb9\xb9\xfb\xfb\xfb\xfc\x72\x72\xfc\x73\x73\
+\xfc\x96\x96\xfc\xfc\xfc\xfd\xe7\xe7\xfd\xfd\xfd\xfe\x16\x16\xfe\
+\x23\x23\xfe\x24\x24\xfe\x25\x25\xfe\x34\x34\xfe\x35\x35\xfe\x39\
+\x39\xfe\x3a\x3a\xfe\x3c\x3c\xfe\x3d\x3d\xfe\xfe\xfe\xff\x00\x00\
+\xff\x06\x06\xff\x07\x07\xff\x0c\x0c\xff\x0d\x0d\xff\x14\x14\xff\
+\x15\x15\xff\xff\xff\xe0\xea\x10\x58\x00\x00\x00\x06\x74\x52\x4e\
+\x53\x00\x11\x33\x77\x99\xbb\x7c\x36\xcb\x6e\x00\x00\x00\x01\x62\
+\x4b\x47\x44\x06\x61\x66\xb8\x7d\x00\x00\x04\x5b\x49\x44\x41\x54\
+\x58\xc3\xed\xd8\xe9\x7b\x13\x55\x18\x05\xf0\x8a\xed\xb9\xb3\x24\
+\x35\x52\xb4\xa9\x45\x51\xac\x1b\x88\xa8\x88\x75\x61\x51\xdc\x10\
+\xf7\x05\x17\x40\xc4\x1d\x57\x84\x52\x17\x5c\x40\x01\x05\xb5\x52\
+\xac\x82\xa6\x8a\x40\x29\x82\xc8\x50\x44\x98\x22\x3a\xd4\x71\x42\
+\xa5\x80\x93\x28\x72\xfe\x1d\x3f\x4c\x96\x66\x32\x33\x99\x2e\x1f\
+\x73\xbe\xe5\x49\xe6\xf7\xbc\xf7\xce\xcd\xdd\x2a\x2a\xc2\xa4\xb2\
+\xaa\xaa\xaa\xaa\x2a\xd4\x4f\xc3\x84\xb9\x0c\x33\x37\x1c\xe4\xe9\
+\x24\x49\xcb\xe2\xd6\xed\xb4\xac\x21\x9b\x0e\x60\xeb\xdc\x3d\x33\
+\x5e\x3b\x5b\xa7\x6e\x93\x24\x2b\x87\xe4\xd9\x64\xeb\x2c\x40\x55\
+\x81\xfb\xda\x48\xdb\x1e\xbc\x48\x92\x1a\xf9\xc6\x24\x40\x16\x80\
+\x90\x80\x6b\x96\x92\xda\xa0\x45\x92\xb4\x9b\xeb\x20\x21\x17\x09\
+\x23\x17\x1b\xf6\x60\xfb\x91\xd4\x18\x85\x2c\xa3\x5f\x64\x05\xf1\
+\xd6\xc1\x83\xbb\xd9\xbf\x3c\x27\x8a\xb4\x72\x48\xa0\x70\x83\xb2\
+\xb2\xaa\x0c\x96\xc1\x32\x58\x06\xcb\x60\x19\x2c\x83\xa5\xb8\x20\
+\x70\xc0\xa4\xb3\xef\xf2\x06\x57\x0f\x78\xab\x38\x22\xbb\x29\xfc\
+\x71\x49\x31\x28\x89\xb9\x3f\x64\xb7\x8a\xa7\x0d\xa0\x3a\x5b\x27\
+\x1f\x3f\xa7\xd8\x03\x80\xba\xbb\xcd\xec\x56\xb1\xb4\x56\x99\xdd\
+\x14\x6e\x78\x04\x88\x78\x7a\x42\x05\xee\x6d\x23\xed\x10\x2d\xcf\
+\x15\xf7\xce\x75\x02\x92\x27\x07\x00\x42\x06\x26\xbf\x45\x6a\xa5\
+\xca\xcc\xf4\xb6\xf1\x5e\x7d\x80\x96\xed\x4b\x8c\x7e\xb3\xd4\x4e\
+\x9e\xa4\x69\xb3\xfd\x99\xb1\x50\x64\x94\x8c\xac\xe0\x82\xa7\xbe\
+\x25\x4d\x5f\x91\xa4\xc5\x8e\xa9\x71\xa8\x90\xa5\x10\xa0\x0c\xa0\
+\x66\xfa\x66\x5a\x7e\x22\xc9\xc4\x54\x44\x26\x34\xb3\x75\x4a\x1d\
+\x10\xd8\x66\x01\x9c\x7d\xf3\x06\x2e\xba\x1c\xb8\x7e\x4b\x00\xf8\
+\x2c\xe2\x6b\x49\x9d\x4c\x3c\x57\x83\x88\x6f\x99\x72\x04\xb5\x0b\
+\xdb\x49\x9d\x5c\x13\xc3\xa2\x00\xf0\x25\x00\x0f\x6d\x23\x69\x99\
+\x5c\x5c\xef\xdb\x91\x62\xcc\x52\xda\x16\x69\x75\x3e\x0c\x09\x4d\
+\x81\xa0\x50\x81\x5b\x3f\x24\x35\x8d\x7c\xfb\x46\x40\x75\xb5\x5c\
+\xa8\xc0\xb4\x77\x9d\xef\x97\xcf\x00\x54\x51\x0a\x04\x00\xa9\x61\
+\x19\x2d\x93\x34\xbf\xbf\x05\x52\xe1\x29\x40\xe0\xfe\xcd\x24\x4d\
+\x33\xc4\x11\x30\x0f\xca\x11\x9c\xfb\xfa\x16\xd2\xd0\xd8\xf9\xe0\
+\x18\x64\x8f\x02\x12\xd0\x30\xdb\xa4\x66\x90\x9b\xe8\x4e\x20\x08\
+\x48\xc0\xe8\x59\x9b\xa8\x19\x64\x47\xf3\x58\xa8\x32\xa0\x28\x18\
+\xb7\x6c\x07\xa9\xeb\x6c\xa7\x57\x02\x41\x67\x9c\x4d\x49\x18\xa4\
+\x65\xf2\x83\x4b\x25\x20\x3a\xae\x85\x86\x45\x9a\xeb\x1b\xc9\x50\
+\xa2\x0b\x84\x50\x80\xc6\x26\xa7\xff\x3f\xbe\xf3\x9e\x4f\x49\x4d\
+\x27\x5f\xbd\x0a\x99\xe7\xbb\x7a\x8e\x27\xd3\xe9\xe4\xf1\x9e\x2e\
+\x1f\xd1\x0d\x3a\x6d\xaf\x7d\x21\x77\x50\x36\xc9\x27\x47\x22\xe3\
+\xfd\xfa\x57\x2a\x97\xde\x83\x9e\xa2\x37\x18\x81\xba\xe0\x6b\xd2\
+\x30\xc8\xb6\x39\x40\x54\x22\x49\xfe\xd2\x97\x2a\x48\xdf\x01\x0f\
+\xd1\x13\x74\xe6\xaa\xf9\xbb\xc8\xe5\xf3\x00\x45\x38\xf5\x1d\x3a\
+\x99\x72\xe5\xd4\xde\xd0\x20\xce\x6c\x6c\xef\xc0\xa4\xf1\x60\xcb\
+\xc4\xa8\xe3\x75\xa5\x53\x45\x49\xff\x5e\x24\x7a\x80\xb2\x82\xda\
+\xf9\x5f\xd1\xd8\x78\x16\x64\xd0\xe6\xe7\x8f\x91\xe4\x81\x53\x29\
+\x8f\x9c\xdc\x57\x1a\x94\x30\x6a\x89\x45\x52\x4f\xc4\x84\x0a\x66\
+\xde\x0d\xfb\x52\x9e\xe9\x73\x97\x58\x08\x0a\x19\xb8\xba\xc9\x99\
+\xe6\x0b\xc1\x83\x29\x9f\x74\x07\x81\x11\x60\xe6\xfa\xcc\x9d\x85\
+\x0b\x3c\xe2\x07\x1e\xf1\x05\x05\x30\xea\xae\x9d\xd9\xa5\xd2\x05\
+\xfe\x99\xf2\xcd\x1e\x6f\x50\x91\x70\xf1\xc2\x6d\xb4\xf3\x13\x4a\
+\x01\xf8\x87\x3f\xd8\xe3\x09\x0a\x34\xac\x66\x61\x0a\xc0\x13\xfe\
+\xe0\xdf\x45\xe0\xcb\x40\x6c\xda\x4a\x52\x0f\x00\x93\xfe\x60\xb2\
+\xb8\x42\xa5\xee\x33\x67\x61\xf4\x07\xff\xf1\x07\xd3\x45\xe0\xda\
+\x8b\x04\x6e\x5a\x67\x0d\x1f\x48\xae\xba\x0d\x98\xfc\x5a\x6e\x97\
+\x31\xa4\x26\x3b\x77\x53\xf6\x8e\x19\x12\x62\x2f\xda\xbe\x15\x06\
+\xbc\x94\x13\x1e\xd3\x03\x4d\x9d\x5b\xe7\x5d\x82\x33\x9e\xf8\x82\
+\x34\xbc\xc0\x9e\xd0\xc3\xa6\x22\x7f\xc1\xb7\x73\xc5\xf9\xa8\xb9\
+\x76\x1d\x75\xab\x18\xdc\x13\x7a\x60\xe7\x49\x1a\x16\x57\x5c\x59\
+\x8d\x09\x6b\x76\x91\xf6\xa0\xff\x7a\x05\x55\x9a\x64\xcb\xa3\xc0\
+\xf8\x05\x36\x35\xcb\xf8\xc6\x01\x4d\x8d\x24\xbb\xfd\xc0\x6e\x6f\
+\x30\x57\xa6\x45\x73\x6e\xb5\xc0\x9c\x9f\x2c\xd3\xa9\x90\xec\x0c\
+\x9a\xbe\x8e\xd2\x17\xcc\x90\x96\x4e\xfb\xf9\x2b\x80\x07\x3e\xda\
+\x1e\x13\x11\xf0\xfd\x3b\x9c\x15\x6a\xbf\xf7\x04\xfb\x73\x10\x98\
+\xbf\x6d\xd6\x3f\x99\x88\xea\x0b\xa3\x10\xb8\x4c\x46\xe3\x97\xfe\
+\x4b\xc0\x6f\xc1\x5e\xfe\xfd\xe8\x6c\xbb\xa1\x1e\x00\xce\xbb\x3d\
+\x41\xdd\xf9\x5b\x1e\xfa\xd7\xed\xfd\xb7\x97\x25\xc1\x7c\x5f\x72\
+\xe3\xd3\xd5\xf1\x57\xbe\x63\x6e\x11\xe0\xbe\xa3\xae\xfe\xdb\x1f\
+\xc6\xeb\x67\xda\xa4\x9d\xbd\x17\xcf\x2c\x04\xbd\x79\xae\xb7\x9b\
+\x61\xbd\xdc\x30\xd2\x8d\xfc\x11\x22\xf3\x74\xd7\xe1\x63\xc9\x74\
+\x3a\x79\xec\xb0\xdf\x56\xc4\x37\x23\xdc\x0f\xd0\x3b\x61\xbd\xac\
+\x50\xe9\xfa\xec\xed\xfd\x0f\x70\x5c\x07\x31\xcb\x67\x04\xb3\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x0a\x06\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
+\x6e\x6f\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\
+\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\
+\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x39\x2e\x30\x2e\x30\x2c\x20\
+\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\
+\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\
+\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\
+\x20\x2d\x2d\x3e\x0a\x0a\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x64\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\
+\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\
+\x6e\x74\x73\x2f\x31\x2e\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\
+\x6e\x73\x3a\x63\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x63\x72\
+\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\x6e\x73\x2e\x6f\x72\
+\x67\x2f\x6e\x73\x23\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
+\x72\x64\x66\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\
+\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x30\x32\x2f\x32\
+\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\x74\x61\x78\x2d\x6e\x73\x23\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x76\x67\x3d\x22\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\
+\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\
+\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x6f\x64\x69\x70\
+\x6f\x64\x69\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x73\x6f\x64\x69\
+\x70\x6f\x64\x69\x2e\x73\x6f\x75\x72\x63\x65\x66\x6f\x72\x67\x65\
+\x2e\x6e\x65\x74\x2f\x44\x54\x44\x2f\x73\x6f\x64\x69\x70\x6f\x64\
+\x69\x2d\x30\x2e\x64\x74\x64\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x69\x6e\x6b\x73\x63\x61\x70\x65\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\
+\x6f\x72\x67\x2f\x6e\x61\x6d\x65\x73\x70\x61\x63\x65\x73\x2f\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\x20\x76\x65\x72\x73\
+\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x0a\x20\x20\x20\x69\x64\x3d\
+\x22\x43\x61\x70\x61\x5f\x31\x22\x0a\x20\x20\x20\x78\x3d\x22\x30\
+\x70\x78\x22\x0a\x20\x20\x20\x79\x3d\x22\x30\x70\x78\x22\x0a\x20\
+\x20\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x35\
+\x31\x31\x2e\x39\x39\x39\x39\x39\x20\x35\x31\x31\x2e\x39\x39\x39\
+\x39\x39\x22\x0a\x20\x20\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\
+\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x0a\x20\x20\x20\x73\
+\x6f\x64\x69\x70\x6f\x64\x69\x3a\x64\x6f\x63\x6e\x61\x6d\x65\x3d\
+\x22\x70\x61\x70\x65\x72\x2d\x70\x6c\x61\x6e\x65\x2e\x73\x76\x67\
+\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x76\x65\
+\x72\x73\x69\x6f\x6e\x3d\x22\x30\x2e\x39\x32\x2e\x34\x20\x28\x35\
+\x64\x61\x36\x38\x39\x63\x33\x31\x33\x2c\x20\x32\x30\x31\x39\x2d\
+\x30\x31\x2d\x31\x34\x29\x22\x0a\x20\x20\x20\x77\x69\x64\x74\x68\
+\x3d\x22\x35\x31\x32\x22\x0a\x20\x20\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x22\x3e\x3c\x6d\x65\x74\x61\x64\x61\x74\x61\
+\x0a\x20\x20\x20\x69\x64\x3d\x22\x6d\x65\x74\x61\x64\x61\x74\x61\
+\x39\x37\x34\x22\x3e\x3c\x72\x64\x66\x3a\x52\x44\x46\x3e\x3c\x63\
+\x63\x3a\x57\x6f\x72\x6b\x0a\x20\x20\x20\x20\x20\x20\x20\x72\x64\
+\x66\x3a\x61\x62\x6f\x75\x74\x3d\x22\x22\x3e\x3c\x64\x63\x3a\x66\
+\x6f\x72\x6d\x61\x74\x3e\x69\x6d\x61\x67\x65\x2f\x73\x76\x67\x2b\
+\x78\x6d\x6c\x3c\x2f\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x3c\
+\x64\x63\x3a\x74\x79\x70\x65\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x72\x64\x66\x3a\x72\x65\x73\x6f\x75\x72\x63\x65\x3d\x22\x68\
+\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\
+\x63\x2f\x64\x63\x6d\x69\x74\x79\x70\x65\x2f\x53\x74\x69\x6c\x6c\
+\x49\x6d\x61\x67\x65\x22\x20\x2f\x3e\x3c\x64\x63\x3a\x74\x69\x74\
+\x6c\x65\x3e\x3c\x2f\x64\x63\x3a\x74\x69\x74\x6c\x65\x3e\x3c\x2f\
+\x63\x63\x3a\x57\x6f\x72\x6b\x3e\x3c\x2f\x72\x64\x66\x3a\x52\x44\
+\x46\x3e\x3c\x2f\x6d\x65\x74\x61\x64\x61\x74\x61\x3e\x3c\x64\x65\
+\x66\x73\x0a\x20\x20\x20\x69\x64\x3d\x22\x64\x65\x66\x73\x39\x37\
+\x32\x22\x20\x2f\x3e\x3c\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x6e\
+\x61\x6d\x65\x64\x76\x69\x65\x77\x0a\x20\x20\x20\x70\x61\x67\x65\
+\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x66\x66\x66\x66\x66\x66\x22\x0a\
+\x20\x20\x20\x62\x6f\x72\x64\x65\x72\x63\x6f\x6c\x6f\x72\x3d\x22\
+\x23\x36\x36\x36\x36\x36\x36\x22\x0a\x20\x20\x20\x62\x6f\x72\x64\
+\x65\x72\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x31\x22\x0a\x20\x20\
+\x20\x6f\x62\x6a\x65\x63\x74\x74\x6f\x6c\x65\x72\x61\x6e\x63\x65\
+\x3d\x22\x31\x30\x22\x0a\x20\x20\x20\x67\x72\x69\x64\x74\x6f\x6c\
+\x65\x72\x61\x6e\x63\x65\x3d\x22\x31\x30\x22\x0a\x20\x20\x20\x67\
+\x75\x69\x64\x65\x74\x6f\x6c\x65\x72\x61\x6e\x63\x65\x3d\x22\x31\
+\x30\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x70\
+\x61\x67\x65\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x30\x22\x0a\x20\
+\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x70\x61\x67\x65\x73\
+\x68\x61\x64\x6f\x77\x3d\x22\x32\x22\x0a\x20\x20\x20\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x77\x69\x64\
+\x74\x68\x3d\x22\x31\x32\x33\x30\x22\x0a\x20\x20\x20\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x68\x65\x69\
+\x67\x68\x74\x3d\x22\x37\x37\x37\x22\x0a\x20\x20\x20\x69\x64\x3d\
+\x22\x6e\x61\x6d\x65\x64\x76\x69\x65\x77\x39\x37\x30\x22\x0a\x20\
+\x20\x20\x73\x68\x6f\x77\x67\x72\x69\x64\x3d\x22\x66\x61\x6c\x73\
+\x65\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x7a\
+\x6f\x6f\x6d\x3d\x22\x31\x2e\x32\x34\x32\x31\x34\x32\x32\x22\x0a\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x78\x3d\x22\
+\x32\x34\x35\x2e\x31\x34\x31\x30\x31\x22\x0a\x20\x20\x20\x69\x6e\
+\x6b\x73\x63\x61\x70\x65\x3a\x63\x79\x3d\x22\x33\x30\x36\x2e\x39\
+\x38\x34\x37\x33\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\
+\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x78\x3d\x22\x30\x22\x0a\x20\
+\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\
+\x77\x2d\x79\x3d\x22\x30\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\
+\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x6d\x61\x78\x69\x6d\
+\x69\x7a\x65\x64\x3d\x22\x30\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\
+\x63\x61\x70\x65\x3a\x63\x75\x72\x72\x65\x6e\x74\x2d\x6c\x61\x79\
+\x65\x72\x3d\x22\x67\x39\x33\x37\x22\x20\x2f\x3e\x0a\x3c\x67\x0a\
+\x20\x20\x20\x69\x64\x3d\x22\x67\x39\x33\x37\x22\x0a\x20\x20\x20\
+\x73\x74\x79\x6c\x65\x3d\x22\x64\x69\x73\x70\x6c\x61\x79\x3a\x69\
+\x6e\x6c\x69\x6e\x65\x22\x0a\x20\x20\x20\x74\x72\x61\x6e\x73\x66\
+\x6f\x72\x6d\x3d\x22\x74\x72\x61\x6e\x73\x6c\x61\x74\x65\x28\x30\
+\x2c\x32\x31\x2e\x37\x31\x37\x39\x38\x37\x29\x22\x3e\x0a\x09\x3c\
+\x70\x61\x74\x68\x0a\x20\x20\x20\x64\x3d\x22\x4d\x20\x30\x2e\x30\
+\x34\x35\x30\x36\x34\x38\x33\x2c\x32\x33\x34\x2e\x33\x35\x30\x30\
+\x33\x20\x43\x20\x30\x2e\x36\x37\x31\x36\x34\x33\x33\x39\x2c\x32\
+\x34\x36\x2e\x35\x39\x35\x20\x37\x2e\x36\x36\x38\x34\x33\x37\x33\
+\x2c\x32\x35\x36\x2e\x39\x30\x30\x31\x37\x20\x31\x37\x2e\x37\x39\
+\x38\x31\x32\x34\x2c\x32\x36\x30\x2e\x34\x31\x36\x30\x35\x20\x6c\
+\x20\x31\x38\x37\x2e\x35\x35\x35\x38\x34\x36\x2c\x36\x35\x2e\x38\
+\x33\x31\x38\x37\x20\x36\x2e\x38\x39\x32\x33\x37\x2c\x31\x35\x30\
+\x2e\x30\x39\x31\x38\x20\x63\x20\x30\x2e\x33\x31\x33\x32\x38\x2c\
+\x35\x2e\x39\x34\x30\x36\x33\x20\x33\x2e\x37\x35\x39\x34\x37\x2c\
+\x31\x31\x2e\x31\x35\x33\x38\x33\x20\x38\x2e\x36\x36\x37\x36\x37\
+\x2c\x31\x33\x2e\x30\x39\x33\x36\x33\x20\x31\x2e\x33\x35\x37\x35\
+\x38\x2c\x30\x2e\x36\x30\x36\x31\x39\x20\x32\x2e\x38\x31\x39\x36\
+\x2c\x30\x2e\x38\x34\x38\x36\x36\x20\x34\x2e\x31\x37\x37\x31\x39\
+\x2c\x30\x2e\x38\x34\x38\x36\x36\x20\x33\x2e\x36\x35\x35\x30\x34\
+\x2c\x30\x20\x37\x2e\x31\x30\x31\x32\x32\x2c\x2d\x31\x2e\x36\x39\
+\x37\x33\x32\x20\x39\x2e\x36\x30\x37\x35\x33\x2c\x2d\x34\x2e\x39\
+\x37\x30\x37\x33\x20\x6c\x20\x36\x36\x2e\x33\x31\x32\x39\x2c\x2d\
+\x38\x35\x2e\x32\x32\x39\x38\x34\x20\x39\x33\x2e\x39\x38\x36\x37\
+\x39\x2c\x37\x35\x2e\x35\x33\x30\x38\x35\x20\x63\x20\x34\x2e\x31\
+\x37\x37\x31\x39\x2c\x33\x2e\x33\x39\x34\x36\x35\x20\x39\x2e\x30\
+\x38\x35\x33\x39\x2c\x35\x2e\x32\x31\x33\x32\x31\x20\x31\x34\x2e\
+\x32\x30\x32\x34\x34\x2c\x35\x2e\x32\x31\x33\x32\x31\x20\x31\x31\
+\x2e\x38\x30\x30\x35\x37\x2c\x30\x20\x32\x32\x2e\x30\x33\x34\x36\
+\x38\x2c\x2d\x39\x2e\x36\x39\x38\x39\x39\x20\x32\x34\x2e\x35\x34\
+\x31\x2c\x2d\x32\x33\x2e\x32\x37\x37\x35\x37\x20\x4c\x20\x35\x31\
+\x31\x2e\x37\x35\x30\x38\x39\x2c\x2d\x34\x2e\x30\x30\x32\x35\x33\
+\x35\x32\x20\x63\x20\x30\x2e\x39\x33\x39\x38\x37\x2c\x2d\x35\x2e\
+\x33\x33\x34\x34\x34\x32\x31\x20\x2d\x30\x2e\x38\x33\x35\x34\x34\
+\x2c\x2d\x31\x30\x2e\x39\x31\x31\x33\x35\x38\x38\x20\x2d\x34\x2e\
+\x33\x38\x36\x30\x35\x2c\x2d\x31\x34\x2e\x33\x30\x36\x30\x30\x33\
+\x38\x20\x2d\x33\x2e\x36\x35\x35\x30\x34\x2c\x2d\x33\x2e\x35\x31\
+\x35\x38\x38\x32\x20\x2d\x38\x2e\x35\x36\x33\x32\x34\x2c\x2d\x34\
+\x2e\x33\x36\x34\x35\x34\x33\x20\x2d\x31\x32\x2e\x39\x34\x39\x32\
+\x39\x2c\x2d\x32\x2e\x33\x30\x33\x35\x30\x39\x20\x4c\x20\x31\x35\
+\x2e\x30\x38\x32\x39\x35\x2c\x32\x30\x35\x2e\x38\x35\x39\x32\x36\
+\x20\x63\x20\x2d\x39\x2e\x37\x31\x31\x39\x36\x37\x34\x2c\x35\x2e\
+\x30\x39\x31\x39\x37\x20\x2d\x31\x35\x2e\x36\x36\x34\x34\x36\x33\
+\x37\x34\x2c\x31\x36\x2e\x32\x34\x35\x38\x20\x2d\x31\x35\x2e\x30\
+\x33\x37\x38\x38\x35\x31\x37\x2c\x32\x38\x2e\x34\x39\x30\x37\x37\
+\x20\x7a\x20\x4d\x20\x32\x33\x36\x2e\x30\x35\x36\x33\x32\x2c\x34\
+\x33\x39\x2e\x31\x31\x39\x38\x36\x20\x32\x33\x31\x2e\x37\x37\x34\
+\x37\x2c\x33\x34\x34\x2e\x34\x33\x33\x35\x32\x20\x32\x37\x39\x2e\
+\x38\x31\x32\x33\x39\x2c\x33\x38\x32\x2e\x39\x38\x36\x39\x38\x20\
+\x5a\x20\x4d\x20\x34\x30\x38\x2e\x37\x38\x33\x31\x35\x2c\x34\x35\
+\x30\x2e\x36\x33\x37\x34\x31\x20\x32\x33\x37\x2e\x37\x32\x37\x32\
+\x2c\x33\x31\x33\x2e\x31\x35\x34\x32\x39\x20\x34\x37\x37\x2e\x36\
+\x30\x32\x33\x36\x2c\x34\x33\x2e\x37\x36\x34\x39\x36\x35\x20\x5a\
+\x20\x4d\x20\x34\x35\x31\x2e\x32\x38\x36\x30\x36\x2c\x33\x31\x2e\
+\x38\x38\x33\x37\x30\x38\x20\x32\x31\x34\x2e\x31\x32\x36\x30\x37\
+\x2c\x32\x39\x38\x2e\x32\x34\x32\x31\x20\x32\x36\x2e\x37\x37\x39\
+\x30\x38\x33\x2c\x32\x33\x32\x2e\x35\x33\x31\x34\x37\x20\x5a\x22\
+\x0a\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x39\x33\x35\x22\
+\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6e\
+\x6e\x65\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\x61\x74\x75\x72\x65\
+\x3d\x22\x30\x22\x0a\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\
+\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x31\x2e\x31\x32\
+\x35\x32\x30\x31\x34\x36\x22\x20\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\
+\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x3c\
+\x2f\x73\x76\x67\x3e\
+\x00\x00\x04\xc3\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x50\x00\x00\x00\x50\x08\x03\x00\x00\x00\xb9\xcf\x02\x9f\
+\x00\x00\x01\xa7\x50\x4c\x54\x45\x00\x00\x00\xff\xff\xff\xff\xff\
+\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xf8\xf8\xf8\xf8\xf8\
+\xf8\xf8\xf8\xf8\xf8\xf8\xfa\xfa\xfa\xfa\xfa\xfa\xfa\xfa\xfa\xf8\
+\xf8\xf8\xf8\xf8\xf8\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xfa\xfa\
+\xfa\xf8\xf8\xf8\xf8\xf8\xf8\xf8\xf8\xf8\xf9\xf9\xf9\xf9\xf9\xf9\
+\xfa\xfa\xfa\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\
+\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\
+\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\
+\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\
+\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\
+\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\xf9\x33\x37\x45\x36\x3a\x48\
+\x37\x3b\x49\x3c\x3f\x4d\x3c\x40\x4d\x3f\x42\x50\x4c\x4f\x5c\x4d\
+\x50\x5c\x50\x53\x5f\x56\x59\x65\x57\x5a\x65\x5b\x5e\x69\x5b\x5f\
+\x6a\x60\x63\x6e\x61\x64\x6f\x75\x78\x81\x79\x7b\x85\x7e\x81\x89\
+\x7f\x82\x8a\x89\x8b\x93\x8a\x8c\x94\x8b\x8d\x95\x8c\x8e\x95\x9c\
+\x9e\xa5\xa4\xa5\xab\xb3\xb5\xb9\xb5\xb7\xbc\xb6\xb8\xbc\xb7\xb8\
+\xbd\xbf\xc0\xc4\xc0\xc1\xc5\xc1\xc2\xc6\xc5\xc6\xca\xc6\xc7\xca\
+\xc7\xc8\xcb\xca\xcb\xcf\xce\xcf\xd2\xd1\xd2\xd5\xd5\xd5\xd8\xd5\
+\xd6\xd9\xd7\xd8\xda\xd8\xd9\xdb\xd9\xda\xdc\xe2\xe2\xe4\xea\xeb\
+\xec\xeb\xeb\xec\xee\xee\xef\xf2\xf2\xf2\xf4\xf4\xf5\xf8\xf8\xf8\
+\xf9\xf6\xf6\xf9\xf7\xf7\xf9\xf8\xf8\xf9\xf9\xf9\xfa\xbb\xbb\xfa\
+\xbc\xbc\xfa\xbd\xbd\xfa\xd3\xd3\xfa\xd4\xd4\xfa\xd5\xd5\xfa\xd9\
+\xd9\xfa\xda\xda\xfb\x99\x99\xfb\x9a\x9a\xfb\x9b\x9b\xfb\xb5\xb5\
+\xfb\xb7\xb7\xfb\xb9\xb9\xfc\x72\x72\xfc\x73\x73\xfe\x16\x16\xfe\
+\x23\x23\xfe\x24\x24\xfe\x25\x25\xfe\x34\x34\xfe\x35\x35\xfe\x39\
+\x39\xfe\x3a\x3a\xfe\x3c\x3c\xfe\x3d\x3d\xff\x00\x00\xff\x06\x06\
+\xff\x07\x07\xff\x0c\x0c\xff\x0d\x0d\xff\x14\x14\xff\x15\x15\xca\
+\x8f\xa2\x1a\x00\x00\x00\x36\x74\x52\x4e\x53\x00\x01\x02\x03\x04\
+\x11\x23\x24\x25\x27\x34\x35\x36\x4b\x4e\x52\x53\x55\x5e\x6e\x6f\
+\x70\x77\x78\x8d\x9f\xa1\xa2\xa3\xaa\xab\xac\xaf\xc5\xc6\xcc\xcd\
+\xce\xd2\xd3\xd4\xe3\xe4\xed\xee\xef\xf0\xf6\xf7\xfa\xfb\xfc\xfd\
+\xfe\x4e\x62\xca\xe0\x00\x00\x02\x95\x49\x44\x41\x54\x58\xc3\xed\
+\x99\xfd\x5f\x12\x31\x1c\xc7\xe7\x43\x91\x69\x49\x51\x9a\x99\x56\
+\x40\xda\x03\x65\x41\x0c\x4b\xec\x81\x32\xcd\x9e\x89\x9e\x2d\x2d\
+\x0b\x3a\x26\x65\x0a\x3d\x08\x3e\xa0\x76\x57\xe6\x1f\x1d\x3b\x44\
+\x6e\xeb\x06\xb7\xdd\x7e\xeb\xde\xbf\x6d\xc7\xbd\x5f\x07\x6c\xdf\
+\x6d\x9f\x03\xa0\xca\x4e\x4f\x4f\x5f\x20\x84\xb8\x08\x05\xfa\x7a\
+\x3c\x2e\x60\x42\x63\xbb\x17\x09\xe3\x6d\x6f\xa4\x7d\xad\x3e\x64\
+\x0b\x5f\x1b\xa1\x6b\xe8\x08\x22\x9b\x04\x3b\x1a\xaa\xbe\xa6\x2e\
+\x24\x81\xae\xa6\xed\xe7\x3b\x8c\xa4\xd0\x5d\x79\xc6\x4e\x24\x89\
+\xce\xb2\x6f\x77\x50\x96\x30\xd4\xaa\x8f\x17\x1f\x92\x86\x1f\x8f\
+\x1e\x37\x92\x88\xbb\x24\x3c\x2e\x53\xe8\x05\xc0\x85\xa4\xe2\x02\
+\x1e\xaa\x27\x95\x18\x1b\x8e\xc0\x12\x0f\xb6\x3a\x6e\x41\x16\x91\
+\xe1\xb1\x44\x8a\xba\xdd\x03\x8e\x92\x1d\x53\xb1\xca\xc7\xeb\x0b\
+\x31\xb1\x37\xe4\xfd\xbd\xa0\x9f\x68\x3f\x1f\x82\x7c\x42\x78\xe9\
+\x29\x21\xe8\x07\xe7\x8c\xcd\xc9\xaa\xcf\xaa\x10\x0e\x4d\x19\x0d\
+\x67\x01\x51\xff\x6e\x40\x7e\x21\xbc\x49\x8c\x6d\x60\x6c\x25\xa0\
+\x88\x10\x3e\x31\x3a\x08\xe1\xa8\x98\x70\x94\x29\x8c\x8a\x09\xa3\
+\x4c\xe1\xa0\x98\x70\x90\x29\x84\x62\x42\xe8\x08\xab\xc4\x8d\xbc\
+\x95\x20\x34\xc5\x11\x3a\xc2\xda\xc2\x11\x23\x2f\x9c\xb9\xec\x08\
+\xff\x47\xe1\xd5\xf1\xf8\xc4\x74\x32\x39\x3d\x11\x1f\x97\x20\xbc\
+\x7c\x77\x92\x31\x53\x85\x84\x91\xdb\xef\x98\x53\x5f\x44\x78\xe5\
+\x55\x8d\x5a\x52\xbf\x38\xdc\x1f\xa1\xb8\xf7\x01\x59\x15\x72\x91\
+\xce\xe4\xd7\x0a\x9a\x56\x58\xcb\x67\xd2\x12\x84\xca\xd7\x65\x75\
+\x9b\xa5\x9c\x62\x57\xf8\xa5\xa8\x12\x14\xe7\xed\x09\xbf\x6d\xa8\
+\x14\x9b\x9f\xec\x08\x33\x9a\xfa\x0f\xda\x0f\x71\xe1\xfc\xa6\x6a\
+\xc2\xc6\xac\xa8\x50\x29\xaa\xa6\x14\x15\x6b\x9b\xa5\x97\x86\xbe\
+\xf7\xb8\x23\xa7\x32\xc8\x72\xcf\x94\x6b\xfa\xf8\x5b\x64\x09\x17\
+\xd3\xbc\x42\xbd\xac\xcc\xa8\x4c\x66\x78\x85\x0f\x71\x3b\xcf\x16\
+\xe6\x79\x85\xaf\x71\x7b\x9d\x2d\xfc\x49\x0b\x23\x75\x84\x7a\xd1\
+\x2a\xb0\x85\x05\xde\x83\x4f\x12\xb7\x7f\xb1\x85\x1a\xef\xd1\x8c\
+\x5b\xf8\x58\xc6\x57\x36\x1e\x6f\x53\x31\x7b\x7f\xca\x3a\x16\xf2\
+\x1c\xc0\x1f\x59\x19\x36\x64\x44\xf0\xac\x66\x44\x70\xc7\xca\xc0\
+\xa6\x43\x8c\xeb\x76\xa7\x9e\x49\xcc\x12\x65\xc6\x2c\xfa\x62\x9c\
+\xad\x5d\x1c\x5c\xd2\xca\xd7\xca\x47\x5d\x08\xf8\xa3\xd7\x39\xf3\
+\x02\xfb\x19\x5f\x3b\x23\x14\xa6\x99\x2e\x01\xdf\xf5\x4b\x07\x4b\
+\x71\x9f\x5f\x60\x91\xfa\x4d\xfb\xfe\x94\x17\xa9\x13\xcd\x38\x20\
+\x16\x08\x24\x67\x57\xa8\xdf\x6f\x4e\xef\x1e\x68\x11\x8e\x4c\x95\
+\xdc\x92\x61\xa1\xcf\x96\x17\xfa\x8b\x7b\xb7\x42\xdd\x23\x62\x5b\
+\x91\x85\x55\xbc\x15\x59\x5d\xa8\x6c\x45\xc2\xfb\xe5\xc6\xce\x17\
+\xdc\x52\x83\x71\x74\xba\x85\xc8\xda\xdb\xfc\xf6\x74\xa1\x43\xcd\
+\xf4\xcb\x85\x7d\x36\x5e\x2e\x0c\x74\xef\x30\x7b\x61\xb1\xeb\x40\
+\xef\xc9\x40\x98\xd3\x15\x3e\x7f\xea\xd8\x1e\x83\xe4\x2f\x21\xf3\
+\xd2\x0a\x71\x34\x57\xe0\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x03\xc2\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\
+\x00\x00\x01\x71\x50\x4c\x54\x45\x00\x00\x00\x00\x80\xff\x9f\xdf\
+\xff\x18\x92\xf3\x93\xcc\xf9\x12\x61\xc2\x91\xcb\xf9\x11\x64\xc2\
+\x14\x66\xc2\x1f\x94\xf5\x92\xca\xfb\x8f\xcb\xfb\x91\xc9\xfa\x20\
+\x96\xf3\x13\x64\xc1\x15\x65\xc1\x14\x64\xc1\x19\x74\xd1\x8f\xc9\
+\xf9\x8e\xca\xf9\x20\x95\xf3\x8d\xc9\xf8\x90\xca\xf9\x15\x65\xbf\
+\x14\x64\xbf\x15\x66\xc0\x18\x74\xd2\x90\xca\xf8\x16\x70\xcd\x21\
+\x95\xf3\x14\x68\xc3\x8f\xca\xf9\x90\xca\xf9\x1c\x89\xe6\x1e\x90\
+\xeb\x21\x96\xf3\x88\xc6\xf9\x14\x66\xc1\x15\x65\xc1\x14\x65\xc0\
+\x15\x65\xc0\x2c\x78\xcb\x8f\xc9\xf9\x4a\xa9\xf5\x15\x65\xc0\x16\
+\x65\xc0\x16\x66\xc0\x17\x66\xc1\x17\x67\xc1\x18\x67\xc1\x19\x68\
+\xc2\x1a\x69\xc2\x1b\x6a\xc3\x1c\x6b\xc3\x1d\x6b\xc4\x1e\x6c\xc3\
+\x1f\x6d\xc4\x20\x6e\xc5\x21\x6e\xc5\x21\x6f\xc6\x21\x96\xf3\x23\
+\x71\xc6\x26\x74\xc8\x27\x74\xc8\x28\x74\xc8\x2a\x76\xca\x2b\x77\
+\xca\x2f\x7b\xcc\x32\x7d\xcd\x34\x7f\xce\x34\x9f\xf4\x35\x7f\xcf\
+\x38\x82\xd0\x39\x82\xd0\x3e\x87\xd3\x42\x8a\xd5\x46\x8d\xd6\x4c\
+\x92\xd9\x4c\x93\xda\x4f\x95\xdb\x53\x98\xdd\x54\x98\xdd\x56\x9a\
+\xdf\x58\x9c\xe0\x5e\xa1\xe2\x62\xa4\xe3\x63\xa5\xe4\x66\xa7\xe5\
+\x66\xa7\xe6\x69\xaa\xe6\x6b\xac\xe8\x6c\xac\xe8\x6f\xaf\xe9\x70\
+\xaf\xea\x72\xb1\xeb\x75\xb3\xec\x77\xb6\xed\x79\xb7\xee\x79\xb7\
+\xef\x7a\xb8\xee\x7a\xb8\xef\x7c\xba\xf0\x7d\xba\xf0\x7f\xbc\xf1\
+\x81\xbd\xf2\x81\xbe\xf3\x83\xbf\xf2\x83\xc0\xf3\x84\xc0\xf3\x85\
+\xc1\xf4\x85\xc1\xf5\x86\xc2\xf5\x88\xc3\xf5\x89\xc4\xf5\x8a\xc5\
+\xf6\x8b\xc6\xf7\x8c\xc7\xf7\x8c\xc8\xf8\x8d\xc8\xf7\x8e\xc8\xf8\
+\x8f\xc9\xf8\x8f\xc9\xf9\x90\xca\xf9\xa8\x1a\xb5\x41\x00\x00\x00\
+\x2c\x74\x52\x4e\x53\x00\x04\x08\x15\x28\x2a\x2c\x2e\x32\x32\x3f\
+\x40\x5f\x68\x6b\x6f\x73\x7b\x80\x81\x90\x9b\x9f\xac\xb0\xb6\xbd\
+\xbf\xc1\xc1\xd1\xd2\xd8\xd9\xdc\xe1\xe1\xe2\xea\xee\xf3\xf5\xf6\
+\xfb\x31\x15\xec\xff\x00\x00\x01\xd4\x49\x44\x41\x54\x58\xc3\xed\
+\x96\x67\x5b\xc2\x30\x10\x80\xa3\xd6\xbd\xeb\xde\xb8\xd7\x89\x7b\
+\xa3\xe2\x40\xdc\xe2\xde\xe2\xde\x13\x07\x72\xbf\xde\xb6\x29\xd2\
+\x12\xc5\x26\xfd\xca\x7d\x4a\xf2\xf0\xa6\x7d\x49\xee\xae\x84\xc4\
+\x23\x1e\xc2\x91\x59\x64\x0b\xcf\xa8\xc0\x02\x7b\x38\xa2\x64\x0f\
+\x47\x87\x1d\x3c\x78\x81\x28\xdb\x78\xfa\xd3\x5a\x48\xd0\x80\xbe\
+\xfc\xd9\xdc\x9b\x98\x01\xc5\x71\x77\xfc\x19\x45\x0c\x74\x3c\xb4\
+\x3c\x70\x8d\x02\x67\xa0\xe3\xf8\xe2\xe9\xf2\x0b\x9c\x41\x18\xc7\
+\xab\x31\xd8\xd3\x06\xb2\x10\x8e\xfb\xbd\xb0\x4e\x47\x92\x08\x8e\
+\x3e\x80\x25\x3a\x72\x88\xe0\x81\x79\x00\xef\x17\x72\x19\x18\x70\
+\xbc\x99\x00\x98\x0c\x20\x8f\x81\x11\xc7\xa3\x7e\x80\xd1\x07\xe4\
+\x30\x30\xe1\xb8\xd1\x01\xd0\x77\x19\x9e\xc9\xbc\xf8\xfb\x02\x00\
+\x74\x1e\xff\xcc\x25\x3e\x1c\xef\xa7\x14\x1e\x76\x7e\xe6\x0e\x3e\
+\x1c\xfd\x43\x2a\xef\x8b\x2c\xc8\x5c\x38\x6e\x3b\x55\x7e\xd1\xb0\
+\x22\xf1\xe0\xc1\x25\x15\x07\x6f\x10\xad\x18\x30\x38\x3e\x4e\x6b\
+\xbc\x3b\x80\x16\x0c\x58\x1c\x4f\x47\x34\x7e\xf8\x0e\xad\x18\x64\
+\xb5\x45\xf3\x3b\xdd\x1a\xdf\x7b\x6e\x5c\x8c\x61\x90\x52\x63\xc2\
+\x43\x2b\x1a\x0e\xce\x43\xd3\x72\xac\x33\x48\x2c\x36\xfc\xf0\xc5\
+\x43\x79\xd8\x32\xbf\x56\xec\x5b\x14\xd1\x50\x6a\x07\x8d\x55\x33\
+\xff\xdf\x2d\x0a\x6b\x28\xb5\x83\xc6\x42\xd4\xff\xf2\x6f\x1e\x50\
+\x0d\x9f\x8e\xc3\xcc\x27\xf2\x18\xe8\x1a\x6a\xed\xa0\xe1\x7e\x45\
+\x3e\x03\xaa\xd1\x1a\xe6\x07\x6f\x91\xd7\x40\x8b\x32\x9d\xef\x39\
+\x61\xae\x96\xb5\x5a\x94\xa7\x6f\x70\xc0\xf0\x16\xab\x69\x1a\xe5\
+\x37\x19\xde\x72\x35\x6d\x51\xf9\x15\x96\xb7\xdc\x0f\x4a\x15\xbe\
+\xa9\xfd\x43\xd4\x80\x90\x5c\x65\x83\x4a\xd7\x6c\x83\xa8\x01\x49\
+\x55\x36\xa8\x75\x15\x9a\x72\x83\xaf\xa3\x35\x43\xa3\xab\x2a\x21\
+\x3a\xc5\x39\x7a\x72\x09\x94\xd7\x27\x31\x29\xce\xd1\x93\x73\xa0\
+\x2e\x9d\x4d\x71\x8e\x9e\x9c\x5c\x9d\xcd\xa6\x38\x87\x01\x21\xf9\
+\xbf\xa4\xb8\xe0\x97\x5d\x44\x43\xfc\xdb\x94\x6a\x38\x88\x9d\x50\
+\x34\x64\x5b\x1b\x28\x1a\x12\x89\x47\x3c\xfe\x8e\x6f\x46\x71\x89\
+\x15\x08\x89\x8c\x09\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x04\xd8\
+\x00\
+\x00\x10\x39\x78\x9c\xd5\x57\x5b\x6f\xdb\x36\x14\x7e\x5e\x7e\x05\
+\xa7\xbc\xb4\x80\x44\xf1\x7e\x71\xec\x14\x6d\x92\x16\x03\xd6\xb5\
+\x40\x93\x0d\x7b\x54\x2c\xc9\x16\x22\x4b\x86\x24\xc7\x49\x7f\xfd\
+\x0e\x29\xc5\x8d\x1b\xe7\x82\x1a\x1d\x36\xc1\x86\x29\xf2\xf0\xd3\
+\xf9\xbe\x73\x11\x3d\x7e\x73\xb3\x28\xd1\x75\xd6\xb4\x45\x5d\x4d\
+\x02\x8a\x49\x80\xb2\x6a\x5a\xa7\x45\x35\x9b\x04\x17\xe7\xef\x23\
+\x13\xa0\xb6\x4b\xaa\x34\x29\xeb\x2a\x9b\x04\x55\x1d\xbc\x39\x3e\
+\x18\xff\x7a\xfa\xe9\xe4\xfc\xef\xcf\x67\xa8\xbd\x9e\xa1\xcf\x17\
+\xef\x7e\xff\xed\x04\x05\x51\x1c\xff\xc5\x4f\xe2\xf8\xf4\xfc\x14\
+\x7d\xf9\xf3\x03\xa2\x98\xc6\xf1\xd9\x1f\x01\x0a\xe6\x5d\xb7\x1c\
+\xc5\xf1\x7a\xbd\xc6\x6b\x8e\xeb\x66\x16\x7f\x68\x92\xe5\xbc\x98\
+\xb6\x31\x18\xc6\xce\x10\x36\xc5\x00\x46\x29\x4e\xbb\x34\x70\x8f\
+\x88\x22\xe4\xf6\xb5\xb0\x71\x5a\x2f\x16\x75\xd5\xe2\x75\x71\x55\
+\x2c\xb2\xb4\x48\x3c\x86\xbb\x8b\xdf\x17\x65\x36\x3a\x69\x6e\xc1\
+\xc9\xf2\xa4\xcc\x92\xe6\xed\xb4\x03\x2e\x6f\x97\xcb\xf2\x16\x3b\
+\xef\xa2\x08\xc0\xdc\x60\x5d\xa4\xdd\x7c\x12\x48\xca\x02\x34\xcf\
+\x8a\xd9\xbc\x1b\x6e\xae\x8b\x6c\xfd\xae\xbe\x99\x04\x04\x11\x44\
+\x99\x71\xdf\x00\x81\x30\x55\x3b\xd9\xe1\x3a\x23\x84\x38\x57\x07\
+\x93\xd1\x4d\x59\x54\x57\xbb\x0c\xa9\xb5\x36\xf6\xab\x8e\x4f\x9a\
+\xe5\xed\xf1\x01\x82\x6b\x0c\x53\xe0\x28\x48\x90\x16\x59\xd5\xa1\
+\x22\x9d\x04\xdb\x53\xdc\x72\x12\xf4\xc6\x60\xde\x76\xf5\x12\x82\
+\x70\x5b\x82\xfe\x6e\x1c\x4d\xeb\xb2\x6e\x46\x87\xb9\xbf\x8e\xfc\
+\x54\xbd\x4c\xa6\x45\x77\x3b\xa2\x01\xaa\xf3\xbc\xcd\x80\x1b\x09\
+\xe2\x67\x21\x2e\x79\x4a\x8d\x7e\x1c\x02\x4b\xce\xa9\xb2\xdc\xbe\
+\x00\x8b\x99\x5c\x10\xf2\x28\x16\xbd\x83\x18\xc7\xdb\x64\x77\x8a\
+\x32\x3c\x6c\xa7\x36\x44\x3c\xaf\x8d\x48\x73\x45\x2e\xf7\xd2\x86\
+\x10\x43\xfe\x0d\x3e\x46\x9b\xe7\xf9\x68\x9b\xe5\xdc\xee\xc5\x27\
+\xb3\x79\x9e\xf1\x9f\xcf\x87\x88\x17\xc4\x27\x07\x67\x52\xba\x17\
+\x1f\x23\x32\x26\xd4\x13\xb9\xcb\xa4\xb5\xc6\x4a\xfe\xf3\x63\xed\
+\xee\x92\x72\x53\xd0\x53\xe8\x25\x8a\x60\xad\x04\x87\xd8\xa2\xe9\
+\x2d\x20\x10\x81\x19\xb8\xab\x02\xd4\xc0\x22\xc7\x54\x1b\xa9\x03\
+\x94\x6f\x9b\xe6\xdb\xa6\x4e\xdd\x6d\x6c\x6e\x38\x98\xf5\x97\x6f\
+\x2d\xa3\x79\x93\xe5\x93\xe0\x70\x47\x10\xd0\x6c\xb8\xbb\xa8\x8a\
+\x0e\x5a\xd9\xaa\xcd\x9a\x2f\x40\x2e\xfb\x54\x5d\xb4\xd9\xb7\xe5\
+\xf3\x26\xa9\xda\xbc\x6e\x16\x93\x60\x91\x74\x4d\x71\xf3\x8a\x60\
+\x70\x4e\x08\xab\x59\x18\x81\x73\x46\x5b\xa9\xb9\x0e\x61\xda\x5a\
+\x21\x08\xa7\x30\xb4\x30\xad\x84\xb2\x61\x64\x04\x96\x56\x31\x18\
+\x72\x81\xa1\x57\x68\x29\x5f\x6f\x04\xdb\x21\x0d\x15\xb2\x17\x85\
+\x59\xaf\x06\x83\x66\xf7\x08\xd5\x88\xec\xc5\x42\x29\xa2\x09\xa5\
+\xda\xb1\x90\x8a\x10\x01\xac\xc0\x75\xd7\xd0\x98\x92\x8e\x85\xa1\
+\x06\xa4\xb7\x26\x8c\xb8\xc5\xb0\x4e\x0c\xb0\xd0\xd8\x1a\x41\x14\
+\x7f\xed\xf3\xf8\x97\x27\xf2\xe6\xbd\xbf\x9e\x4e\xe3\x7d\xf6\x63\
+\xf6\x2c\x84\x79\x77\x26\xe4\x53\x65\x20\xe9\xde\x10\x5a\xec\x09\
+\xd1\xbb\x30\x8e\xb7\x23\xfc\x78\x8a\x08\x83\x39\x04\x8c\xa9\xa1\
+\x7a\x18\x83\xe0\x28\xb6\xab\x7a\xee\x99\xe6\xdb\xa6\x8f\xa4\x94\
+\x78\x49\xfd\xb8\x97\xcc\x3e\x99\x67\xb5\xb0\x42\x32\xea\x32\x8f\
+\x41\x35\x0b\x49\x39\xa4\x1b\x85\xaa\x91\xd4\xba\xc4\x53\x9a\x4a\
+\xa5\xc0\x80\x1a\xac\x28\xb3\x96\x87\x94\x41\xbc\x2d\xd1\xf4\xc9\
+\xf2\x91\x90\x9e\x4a\x5a\x29\xee\x3a\x8b\x85\xf2\xb3\xbb\xa4\xb9\
+\x67\x99\x6f\x59\x3e\xa2\x8c\x7c\x91\x32\x7c\xbf\x9a\xd4\x9a\x33\
+\x03\x1f\xdf\x59\x88\x82\xf2\x64\x0c\xf4\xd0\x50\xa6\x5c\xfb\xf2\
+\xd4\xd0\x6e\xa4\x14\x32\x8c\x94\xc0\xd0\x98\x99\xd6\xa1\xb0\xd8\
+\x1d\xa7\x84\x1a\xa4\x19\xc7\x77\xe7\xa9\xf1\x6c\xd3\xdd\x97\x49\
+\x37\x47\x40\xed\x23\x62\x02\x2b\xc1\x40\x88\x90\xb3\x7e\x64\xe1\
+\x38\xea\x67\xa8\x08\x25\xc0\xc2\x2f\x47\x92\xfa\x01\xb3\xa1\xd5\
+\xd8\x2f\x2a\x38\xfc\x29\xec\x24\xa4\x21\xa7\x58\x7a\xb3\x12\x45\
+\x90\x55\xe0\x0f\x23\x28\x92\x0c\x53\x07\xc4\x43\xa1\xfb\x91\x41\
+\x5f\x7b\x49\xdd\xf3\x21\x90\x3a\xa2\xc1\x5d\x8d\xe4\x45\x59\x8e\
+\x56\x4d\xf9\xea\xf0\xa1\xde\xaf\x8f\xdc\xea\xb7\x72\x81\xea\x69\
+\xea\xab\x6c\x54\xc1\x49\xfb\xde\x3b\xeb\x1b\xab\x2d\x06\x7e\xf8\
+\x1d\x05\xc7\xf4\x3b\x06\xb6\x37\x73\x73\x46\x59\x90\x5a\x40\x47\
+\x80\x76\x2d\xb4\xdb\xda\x9b\x51\x62\xb0\xc7\x80\x27\x68\x2d\x99\
+\x0c\x21\x8f\xa0\xa2\xb4\xa4\x0f\xa8\xe9\x0d\xb5\xcd\xab\xd3\x5d\
+\x47\x4f\x11\x8d\xc4\x03\xaa\xfe\xb6\x59\x95\x9e\xed\xd7\xac\xa9\
+\xef\x93\x1f\xc6\x91\x3f\xb1\x8f\xe8\xf2\xe6\x68\x91\x34\x57\x59\
+\xd3\x2f\x5e\x17\x6d\x71\x59\x94\x0e\xc7\x0f\xcb\xec\x28\x2d\xda\
+\x65\x99\xdc\x8e\x8a\xca\x25\xeb\x51\x0d\x7f\x68\xf2\xb2\x5e\x6f\
+\xd6\xb3\x2a\x81\x9f\xe8\x32\x99\x5e\xcd\x9a\x7a\x55\xa5\xa3\x64\
+\x3a\x5d\x2d\x56\x65\xd2\xed\x52\x7a\xe1\xf2\x67\x50\x1a\x5e\x0b\
+\x5e\x24\x89\x98\x86\x14\x60\x12\x7b\xbe\x14\xdd\xe5\x81\x0a\x23\
+\xa1\x7c\x34\x14\xe8\x27\x7b\x21\x43\x3a\x24\x20\x9a\x22\x12\x42\
+\xd6\xd0\x01\xd0\xd5\xb8\x07\xb6\x90\x53\x66\x88\x8e\x43\x75\xdb\
+\x8c\xf5\x86\x7e\xa3\xd8\x58\x42\xca\x0d\x73\x00\x2b\x51\x64\x48\
+\x6f\x0c\x60\xd1\xf0\x38\x74\x82\x18\x81\x36\xe8\xb2\x35\x14\xbc\
+\x5f\x57\xbb\x59\xec\x98\xbb\x17\x63\x38\x38\xb0\x1f\x89\x30\xf9\
+\x7f\x45\xf8\xe3\x1e\xdd\xe0\xce\x0c\x22\x44\x28\x66\x5e\xff\xef\
+\xaa\xe4\x47\x14\x94\xff\x79\x05\xc7\x31\xb4\xda\xb1\xfb\xeb\x7b\
+\x7c\xf0\x0f\x75\x7f\xc5\x95\
+\x00\x00\x02\x98\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0e\xc4\x00\x00\x0e\xc4\
+\x01\x95\x2b\x0e\x1b\x00\x00\x02\x4a\x49\x44\x41\x54\x48\x89\xed\
+\x95\x3f\x8b\x13\x51\x14\xc5\x7f\x27\x24\x31\x48\x08\x4b\xb0\x90\
+\x45\x21\xb1\xb2\x5c\xfc\x04\x83\xa5\xd5\x22\xb6\x8a\xc8\x5a\xa4\
+\xb0\x58\xfd\x1e\xa2\xdd\x16\xa2\x8b\x28\x6c\xb1\x85\x88\xf8\xa7\
+\x91\x61\xcb\x6d\xad\x65\x53\x58\x2c\xc1\x42\x82\xac\xcb\x24\xcc\
+\xb5\x98\x37\x79\x6f\x26\x33\x53\x5a\xf9\xaa\x99\xfb\xee\x3d\xf7\
+\x9e\xf3\xee\xbb\x4f\xd4\xac\x69\xd4\xbd\x65\xd8\x73\xd0\xe5\xcc\
+\x62\x80\x00\x43\x08\x73\x36\xa1\x99\x61\xbb\xe3\x78\xf1\xbe\x0a\
+\x47\x0d\x09\xbe\x1b\x5c\xcb\x1d\xac\xc9\x19\x7e\x8c\xe2\xe4\x6a\
+\xd5\x46\xbb\x3e\x86\x4d\x07\x78\x06\xec\x83\x9d\x95\x52\xf4\x0c\
+\xee\x0b\xfa\x86\x5d\xa9\x03\x69\x4a\x90\xaf\x97\xa3\x38\x79\x54\
+\xb5\x71\x12\x75\x12\x43\x8f\x9b\x82\xdb\x00\xd3\xa8\x83\xc1\x00\
+\xd4\xce\x35\x06\xb0\x4c\x98\xf4\x24\xea\x0c\x33\xdd\xfd\x5e\xb6\
+\x4f\x9a\xfd\x89\x69\xd4\x1d\x7a\xbb\x2d\x85\xe6\xa3\x38\xc9\x19\
+\xe8\x06\xf0\x16\x6c\xe0\x81\xe8\x65\x60\xf6\x00\x74\x27\x83\x29\
+\x9e\x82\xb0\x41\x20\xdb\x37\x6f\xd7\x6f\xe0\x2e\x70\x9c\x4b\xb4\
+\x25\xb8\x9e\x3b\x7b\x06\x20\xd4\x07\xfa\xbe\x87\xcc\xf9\x10\x74\
+\x12\x18\x6c\x86\x76\xa1\x2d\xe0\xb8\xe5\x80\x0e\x0d\x76\x81\xaf\
+\x3e\xcc\x7e\x82\xed\x19\x76\xea\x02\x53\x83\xcf\x42\x1f\x85\xd2\
+\x4c\x2c\xcd\x80\x3d\xd0\x2c\x2b\x4b\x18\x3a\x12\x3c\x31\x38\x00\
+\x68\x01\x8c\xe3\x64\x3e\x8e\x93\x67\x60\x9f\x02\x16\x07\xe3\x78\
+\x31\x11\x7a\xe1\x58\xce\x05\x13\xe0\x21\xf0\xcb\x15\xb6\x3f\x8e\
+\x17\x13\x83\x37\x81\x72\x5f\x46\xf1\xe2\xe9\x38\x4e\xe6\xab\x43\
+\xae\x59\xe7\x0e\xe4\x8f\x93\x26\x05\x12\xa1\x04\x58\x66\x57\x4d\
+\xe7\xde\xd7\x2a\xef\x4a\x29\x81\x57\x30\xb4\x38\x46\x18\x21\x4c\
+\xa9\x9f\xd6\x5a\x20\x5b\xad\xe2\xaf\x07\xb7\x95\xc5\x0a\xfb\xaa\
+\x04\x2a\xa6\x6a\x64\x60\xa5\xaf\x70\xee\xe0\x5a\xd8\xf7\x53\x38\
+\x48\x72\xef\x86\x04\xa1\x38\xb6\x62\x92\x5f\x2e\x95\x84\x50\x0d\
+\x6c\x91\x43\x41\xa2\xe2\x60\xf3\x0c\xbc\xd5\x56\x92\x15\xeb\xb7\
+\x92\x94\x35\x09\xd6\xf3\x87\xd0\xbe\x04\x6b\xf0\x2d\xf7\xd1\x7f\
+\x89\x2a\xd6\x3f\x96\xa8\x90\xa0\xf4\x3c\x76\x5d\xf0\x05\x67\x6d\
+\x65\xfe\x02\x68\xb9\xfb\xd0\x73\x45\xe4\xbe\x6b\x7c\xd6\x66\x51\
+\x70\x83\xef\x9d\x44\x9d\x8b\xc0\xb6\xb3\x6d\x08\xbd\x32\x2c\x15\
+\xba\xe4\xbc\x76\xa6\x51\x77\x68\xd8\xed\xf5\x32\x2b\x12\x18\x76\
+\x2a\x48\x41\x2d\xd0\x06\xb0\xe3\x43\x04\x70\x53\xab\x3f\x01\x0c\
+\x81\x9d\xa0\xf2\x14\x37\xde\x6b\x18\xe8\x1d\xd8\x6b\x60\x1b\x68\
+\x17\xcf\x24\x1c\x10\xc2\x3f\x3c\xab\x17\x70\x69\xe8\x83\xe0\x30\
+\x44\xfc\x0b\xde\x97\xfc\xa7\x0b\xac\xb3\x86\x00\x00\x00\x00\x49\
+\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x2a\x12\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
+\x6e\x6f\x22\x3f\x3e\x0a\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x64\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\
+\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\
+\x6e\x74\x73\x2f\x31\x2e\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\
+\x6e\x73\x3a\x63\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x63\x72\
+\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\x6e\x73\x2e\x6f\x72\
+\x67\x2f\x6e\x73\x23\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
+\x72\x64\x66\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\
+\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x30\x32\x2f\x32\
+\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\x74\x61\x78\x2d\x6e\x73\x23\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x76\x67\x3d\x22\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\
+\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\
+\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x6f\x64\x69\x70\
+\x6f\x64\x69\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x73\x6f\x64\x69\
+\x70\x6f\x64\x69\x2e\x73\x6f\x75\x72\x63\x65\x66\x6f\x72\x67\x65\
+\x2e\x6e\x65\x74\x2f\x44\x54\x44\x2f\x73\x6f\x64\x69\x70\x6f\x64\
+\x69\x2d\x30\x2e\x64\x74\x64\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x69\x6e\x6b\x73\x63\x61\x70\x65\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\
+\x6f\x72\x67\x2f\x6e\x61\x6d\x65\x73\x70\x61\x63\x65\x73\x2f\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\
+\x61\x35\x64\x63\x34\x32\x37\x30\x2d\x30\x36\x61\x32\x2d\x34\x65\
+\x66\x35\x2d\x39\x64\x36\x38\x2d\x39\x36\x63\x63\x61\x36\x35\x63\
+\x30\x35\x37\x63\x22\x0a\x20\x20\x20\x64\x61\x74\x61\x2d\x6e\x61\
+\x6d\x65\x3d\x22\x4c\x61\x79\x65\x72\x20\x31\x22\x0a\x20\x20\x20\
+\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x32\x35\x36\
+\x20\x32\x35\x36\x22\x0a\x20\x20\x20\x76\x65\x72\x73\x69\x6f\x6e\
+\x3d\x22\x31\x2e\x31\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\
+\x64\x69\x3a\x64\x6f\x63\x6e\x61\x6d\x65\x3d\x22\x74\x61\x62\x5f\
+\x63\x6f\x6e\x76\x65\x72\x74\x65\x72\x2e\x73\x76\x67\x22\x0a\x20\
+\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x76\x65\x72\x73\x69\
+\x6f\x6e\x3d\x22\x30\x2e\x39\x32\x2e\x34\x20\x28\x35\x64\x61\x36\
+\x38\x39\x63\x33\x31\x33\x2c\x20\x32\x30\x31\x39\x2d\x30\x31\x2d\
+\x31\x34\x29\x22\x3e\x0a\x20\x20\x3c\x6d\x65\x74\x61\x64\x61\x74\
+\x61\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6d\x65\x74\x61\x64\
+\x61\x74\x61\x34\x37\x22\x3e\x0a\x20\x20\x20\x20\x3c\x72\x64\x66\
+\x3a\x52\x44\x46\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x63\x63\x3a\
+\x57\x6f\x72\x6b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x64\
+\x66\x3a\x61\x62\x6f\x75\x74\x3d\x22\x22\x3e\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x3c\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x69\
+\x6d\x61\x67\x65\x2f\x73\x76\x67\x2b\x78\x6d\x6c\x3c\x2f\x64\x63\
+\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x20\x3c\x64\x63\x3a\x74\x79\x70\x65\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x72\x64\x66\x3a\x72\x65\x73\x6f\x75\x72\x63\
+\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\x2e\x6f\
+\x72\x67\x2f\x64\x63\x2f\x64\x63\x6d\x69\x74\x79\x70\x65\x2f\x53\
+\x74\x69\x6c\x6c\x49\x6d\x61\x67\x65\x22\x20\x2f\x3e\x0a\x20\x20\
+\x20\x20\x20\x20\x3c\x2f\x63\x63\x3a\x57\x6f\x72\x6b\x3e\x0a\x20\
+\x20\x20\x20\x3c\x2f\x72\x64\x66\x3a\x52\x44\x46\x3e\x0a\x20\x20\
+\x3c\x2f\x6d\x65\x74\x61\x64\x61\x74\x61\x3e\x0a\x20\x20\x3c\x73\
+\x6f\x64\x69\x70\x6f\x64\x69\x3a\x6e\x61\x6d\x65\x64\x76\x69\x65\
+\x77\x0a\x20\x20\x20\x20\x20\x70\x61\x67\x65\x63\x6f\x6c\x6f\x72\
+\x3d\x22\x23\x66\x66\x66\x66\x66\x66\x22\x0a\x20\x20\x20\x20\x20\
+\x62\x6f\x72\x64\x65\x72\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x36\x36\
+\x36\x36\x36\x36\x22\x0a\x20\x20\x20\x20\x20\x62\x6f\x72\x64\x65\
+\x72\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x31\x22\x0a\x20\x20\x20\
+\x20\x20\x6f\x62\x6a\x65\x63\x74\x74\x6f\x6c\x65\x72\x61\x6e\x63\
+\x65\x3d\x22\x31\x30\x22\x0a\x20\x20\x20\x20\x20\x67\x72\x69\x64\
+\x74\x6f\x6c\x65\x72\x61\x6e\x63\x65\x3d\x22\x31\x30\x22\x0a\x20\
+\x20\x20\x20\x20\x67\x75\x69\x64\x65\x74\x6f\x6c\x65\x72\x61\x6e\
+\x63\x65\x3d\x22\x31\x30\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3a\x70\x61\x67\x65\x6f\x70\x61\x63\x69\x74\
+\x79\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\
+\x61\x70\x65\x3a\x70\x61\x67\x65\x73\x68\x61\x64\x6f\x77\x3d\x22\
+\x32\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x77\x69\x64\x74\x68\x3d\x22\x31\
+\x31\x38\x30\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x37\x35\x33\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\
+\x6e\x61\x6d\x65\x64\x76\x69\x65\x77\x34\x35\x22\x0a\x20\x20\x20\
+\x20\x20\x73\x68\x6f\x77\x67\x72\x69\x64\x3d\x22\x66\x61\x6c\x73\
+\x65\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x7a\x6f\x6f\x6d\x3d\x22\x31\x2e\x38\x34\x33\x37\x35\x22\x0a\
+\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x78\
+\x3d\x22\x31\x31\x30\x2e\x36\x34\x34\x30\x37\x22\x0a\x20\x20\x20\
+\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x79\x3d\x22\x31\
+\x32\x38\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\
+\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x78\x3d\x22\x30\x22\x0a\x20\
+\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\
+\x64\x6f\x77\x2d\x79\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x6d\
+\x61\x78\x69\x6d\x69\x7a\x65\x64\x3d\x22\x30\x22\x0a\x20\x20\x20\
+\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x75\x72\x72\x65\
+\x6e\x74\x2d\x6c\x61\x79\x65\x72\x3d\x22\x61\x35\x64\x63\x34\x32\
+\x37\x30\x2d\x30\x36\x61\x32\x2d\x34\x65\x66\x35\x2d\x39\x64\x36\
+\x38\x2d\x39\x36\x63\x63\x61\x36\x35\x63\x30\x35\x37\x63\x22\x20\
+\x2f\x3e\x0a\x20\x20\x3c\x64\x65\x66\x73\x0a\x20\x20\x20\x20\x20\
+\x69\x64\x3d\x22\x64\x65\x66\x73\x39\x22\x3e\x0a\x20\x20\x20\x20\
+\x3c\x73\x74\x79\x6c\x65\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\
+\x3d\x22\x73\x74\x79\x6c\x65\x32\x22\x3e\x2e\x62\x37\x34\x33\x64\
+\x35\x31\x62\x2d\x35\x66\x34\x35\x2d\x34\x33\x63\x65\x2d\x61\x32\
+\x65\x33\x2d\x36\x33\x66\x36\x61\x38\x65\x62\x64\x62\x62\x31\x7b\
+\x66\x69\x6c\x6c\x3a\x23\x32\x38\x33\x39\x39\x36\x3b\x7d\x2e\x66\
+\x37\x38\x31\x39\x66\x32\x63\x2d\x63\x66\x37\x36\x2d\x34\x36\x66\
+\x36\x2d\x61\x66\x32\x66\x2d\x36\x31\x62\x38\x35\x63\x32\x36\x35\
+\x34\x37\x61\x7b\x66\x69\x6c\x6c\x3a\x23\x32\x62\x32\x66\x38\x33\
+\x3b\x7d\x2e\x65\x62\x31\x31\x35\x63\x61\x63\x2d\x37\x30\x35\x34\
+\x2d\x34\x32\x39\x39\x2d\x39\x64\x62\x39\x2d\x31\x37\x63\x61\x38\
+\x62\x63\x34\x39\x63\x63\x39\x7b\x66\x69\x6c\x6c\x3a\x23\x32\x64\
+\x32\x38\x37\x31\x3b\x7d\x2e\x62\x38\x63\x30\x65\x32\x34\x35\x2d\
+\x66\x37\x65\x65\x2d\x34\x36\x32\x62\x2d\x62\x32\x36\x37\x2d\x37\
+\x65\x63\x33\x64\x34\x64\x66\x32\x64\x35\x64\x7b\x66\x69\x6c\x6c\
+\x3a\x23\x63\x63\x63\x3b\x7d\x2e\x61\x35\x38\x35\x65\x34\x34\x30\
+\x2d\x30\x32\x65\x64\x2d\x34\x63\x64\x36\x2d\x39\x39\x61\x61\x2d\
+\x39\x65\x64\x64\x66\x65\x33\x62\x36\x34\x64\x36\x7b\x66\x69\x6c\
+\x6c\x3a\x23\x66\x39\x66\x39\x66\x39\x3b\x7d\x2e\x66\x65\x65\x62\
+\x63\x38\x62\x62\x2d\x66\x62\x38\x38\x2d\x34\x34\x61\x37\x2d\x39\
+\x34\x34\x34\x2d\x61\x38\x30\x36\x65\x31\x65\x36\x61\x39\x32\x38\
+\x7b\x66\x69\x6c\x6c\x3a\x23\x66\x32\x66\x32\x66\x32\x3b\x7d\x2e\
+\x62\x32\x30\x36\x36\x34\x64\x66\x2d\x38\x64\x36\x63\x2d\x34\x31\
+\x65\x31\x2d\x39\x66\x39\x38\x2d\x30\x30\x65\x30\x36\x37\x36\x34\
+\x31\x36\x64\x32\x7b\x66\x69\x6c\x6c\x3a\x23\x30\x32\x30\x32\x30\
+\x32\x3b\x7d\x2e\x61\x36\x31\x65\x33\x32\x64\x37\x2d\x62\x61\x36\
+\x35\x2d\x34\x34\x66\x31\x2d\x61\x30\x66\x35\x2d\x66\x37\x66\x32\
+\x35\x34\x32\x65\x66\x39\x33\x61\x7b\x66\x69\x6c\x6c\x3a\x23\x65\
+\x62\x66\x30\x66\x32\x3b\x7d\x2e\x62\x33\x64\x30\x31\x66\x37\x65\
+\x2d\x36\x39\x62\x31\x2d\x34\x39\x66\x33\x2d\x62\x62\x33\x38\x2d\
+\x35\x66\x30\x34\x37\x63\x39\x34\x31\x34\x30\x63\x7b\x6f\x70\x61\
+\x63\x69\x74\x79\x3a\x30\x2e\x36\x34\x3b\x69\x73\x6f\x6c\x61\x74\
+\x69\x6f\x6e\x3a\x69\x73\x6f\x6c\x61\x74\x65\x3b\x66\x69\x6c\x6c\
+\x3a\x75\x72\x6c\x28\x23\x62\x64\x36\x61\x63\x61\x35\x30\x2d\x61\
+\x37\x35\x62\x2d\x34\x32\x30\x36\x2d\x39\x36\x65\x30\x2d\x36\x35\
+\x37\x63\x64\x34\x66\x36\x37\x38\x35\x30\x29\x3b\x7d\x2e\x61\x34\
+\x66\x64\x66\x30\x63\x32\x2d\x34\x30\x39\x34\x2d\x34\x31\x32\x65\
+\x2d\x38\x31\x62\x30\x2d\x65\x35\x62\x35\x37\x63\x63\x38\x30\x33\
+\x63\x65\x7b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\
+\x30\x2e\x30\x35\x3b\x7d\x2e\x61\x62\x65\x63\x62\x37\x63\x37\x2d\
+\x32\x33\x36\x37\x2d\x34\x61\x64\x65\x2d\x62\x30\x33\x31\x2d\x35\
+\x62\x31\x37\x35\x63\x33\x38\x38\x34\x37\x34\x7b\x66\x69\x6c\x6c\
+\x3a\x23\x34\x30\x62\x64\x66\x34\x3b\x7d\x2e\x62\x65\x36\x65\x63\
+\x65\x62\x38\x2d\x64\x39\x39\x35\x2d\x34\x30\x32\x61\x2d\x62\x63\
+\x30\x61\x2d\x33\x30\x62\x62\x63\x36\x65\x36\x38\x33\x39\x65\x7b\
+\x66\x69\x6c\x6c\x3a\x23\x32\x65\x35\x39\x39\x63\x3b\x7d\x2e\x66\
+\x64\x30\x36\x31\x35\x35\x61\x2d\x31\x66\x37\x37\x2d\x34\x64\x38\
+\x36\x2d\x61\x63\x36\x31\x2d\x64\x31\x64\x31\x64\x38\x34\x37\x39\
+\x63\x31\x39\x7b\x66\x69\x6c\x6c\x3a\x23\x37\x65\x63\x33\x65\x63\
+\x3b\x7d\x2e\x62\x34\x63\x38\x37\x32\x65\x32\x2d\x61\x35\x37\x30\
+\x2d\x34\x32\x65\x63\x2d\x62\x65\x39\x62\x2d\x61\x62\x66\x39\x35\
+\x33\x61\x37\x66\x36\x38\x36\x7b\x66\x69\x6c\x6c\x3a\x23\x61\x63\
+\x65\x30\x66\x33\x3b\x7d\x2e\x61\x31\x61\x62\x31\x63\x37\x30\x2d\
+\x35\x31\x39\x30\x2d\x34\x64\x37\x32\x2d\x38\x35\x35\x63\x2d\x64\
+\x62\x38\x30\x32\x32\x37\x36\x32\x33\x65\x36\x7b\x66\x69\x6c\x6c\
+\x3a\x23\x34\x65\x39\x36\x64\x64\x3b\x7d\x3c\x2f\x73\x74\x79\x6c\
+\x65\x3e\x0a\x20\x20\x20\x20\x3c\x72\x61\x64\x69\x61\x6c\x47\x72\
+\x61\x64\x69\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\
+\x3d\x22\x62\x64\x36\x61\x63\x61\x35\x30\x2d\x61\x37\x35\x62\x2d\
+\x34\x32\x30\x36\x2d\x39\x36\x65\x30\x2d\x36\x35\x37\x63\x64\x34\
+\x66\x36\x37\x38\x35\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x63\
+\x78\x3d\x22\x2d\x35\x35\x34\x2e\x31\x33\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x63\x79\x3d\x22\x34\x38\x32\x2e\x35\x37\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x72\x3d\x22\x35\x2e\x34\x22\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x54\x72\x61\
+\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\x28\x2d\
+\x33\x35\x2e\x38\x35\x2c\x20\x35\x2e\x30\x38\x2c\x20\x2d\x32\x2e\
+\x35\x33\x2c\x20\x2d\x31\x37\x2e\x39\x31\x2c\x20\x2d\x31\x38\x35\
+\x35\x35\x2e\x33\x39\x2c\x20\x31\x31\x35\x31\x32\x2e\x36\x37\x29\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x67\x72\x61\x64\x69\x65\x6e\
+\x74\x55\x6e\x69\x74\x73\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\
+\x65\x4f\x6e\x55\x73\x65\x22\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\
+\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6f\x66\
+\x66\x73\x65\x74\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x66\
+\x66\x66\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\
+\x22\x73\x74\x6f\x70\x34\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x20\
+\x20\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\x22\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3d\x22\
+\x23\x66\x66\x66\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x73\
+\x74\x6f\x70\x2d\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x30\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x73\x74\x6f\
+\x70\x36\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x72\x61\x64\
+\x69\x61\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\x0a\x20\x20\x3c\
+\x2f\x64\x65\x66\x73\x3e\x0a\x20\x20\x3c\x74\x69\x74\x6c\x65\x0a\
+\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x74\x69\x74\x6c\x65\x31\x31\
+\x22\x3e\x43\x61\x73\x68\x20\x41\x64\x64\x72\x20\x46\x69\x6e\x61\
+\x6c\x20\x42\x6c\x75\x65\x3c\x2f\x74\x69\x74\x6c\x65\x3e\x0a\x20\
+\x20\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\
+\x66\x33\x30\x39\x36\x36\x31\x30\x2d\x30\x61\x39\x62\x2d\x34\x63\
+\x64\x38\x2d\x39\x39\x37\x38\x2d\x39\x38\x33\x38\x34\x66\x65\x39\
+\x35\x32\x63\x38\x22\x0a\x20\x20\x20\x20\x20\x64\x61\x74\x61\x2d\
+\x6e\x61\x6d\x65\x3d\x22\x42\x61\x63\x6b\x22\x0a\x20\x20\x20\x20\
+\x20\x63\x6c\x61\x73\x73\x3d\x22\x62\x37\x34\x33\x64\x35\x31\x62\
+\x2d\x35\x66\x34\x35\x2d\x34\x33\x63\x65\x2d\x61\x32\x65\x33\x2d\
+\x36\x33\x66\x36\x61\x38\x65\x62\x64\x62\x62\x31\x22\x0a\x20\x20\
+\x20\x20\x20\x64\x3d\x22\x6d\x20\x37\x32\x2e\x33\x2c\x38\x20\x68\
+\x20\x35\x31\x20\x61\x20\x32\x32\x2c\x32\x32\x20\x30\x20\x30\x20\
+\x31\x20\x32\x31\x2e\x34\x36\x2c\x31\x39\x2e\x37\x33\x20\x4c\x20\
+\x31\x36\x32\x2e\x33\x2c\x32\x32\x38\x2e\x32\x37\x20\x41\x20\x32\
+\x32\x2c\x32\x32\x20\x30\x20\x30\x20\x30\x20\x31\x38\x33\x2e\x37\
+\x2c\x32\x34\x38\x20\x48\x20\x31\x33\x32\x2e\x37\x35\x20\x41\x20\
+\x32\x32\x2c\x32\x32\x20\x30\x20\x30\x20\x31\x20\x31\x31\x31\x2e\
+\x32\x39\x2c\x32\x32\x38\x2e\x32\x37\x20\x4c\x20\x39\x33\x2e\x37\
+\x35\x2c\x32\x37\x2e\x37\x33\x20\x41\x20\x32\x32\x2c\x32\x32\x20\
+\x30\x20\x30\x20\x30\x20\x37\x32\x2e\x33\x2c\x38\x20\x5a\x22\x0a\
+\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\
+\x6e\x6e\x65\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\x61\x74\x75\x72\
+\x65\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\
+\x3d\x22\x64\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\x69\x6e\x65\
+\x3b\x66\x69\x6c\x6c\x3a\x23\x32\x38\x33\x39\x39\x36\x22\x20\x2f\
+\x3e\x0a\x20\x20\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\x20\x20\x69\
+\x64\x3d\x22\x66\x62\x62\x37\x37\x31\x63\x62\x2d\x35\x31\x37\x65\
+\x2d\x34\x64\x63\x37\x2d\x61\x33\x34\x63\x2d\x63\x62\x65\x65\x65\
+\x34\x35\x35\x66\x30\x30\x30\x22\x0a\x20\x20\x20\x20\x20\x64\x61\
+\x74\x61\x2d\x6e\x61\x6d\x65\x3d\x22\x53\x68\x61\x64\x6f\x77\x20\
+\x42\x61\x63\x6b\x20\x32\x22\x0a\x20\x20\x20\x20\x20\x63\x6c\x61\
+\x73\x73\x3d\x22\x66\x37\x38\x31\x39\x66\x32\x63\x2d\x63\x66\x37\
+\x36\x2d\x34\x36\x66\x36\x2d\x61\x66\x32\x66\x2d\x36\x31\x62\x38\
+\x35\x63\x32\x36\x35\x34\x37\x61\x22\x0a\x20\x20\x20\x20\x20\x64\
+\x3d\x22\x6d\x20\x39\x33\x2e\x37\x35\x2c\x32\x37\x2e\x37\x33\x20\
+\x31\x37\x2e\x35\x34\x2c\x32\x30\x30\x2e\x35\x34\x20\x63\x20\x30\
+\x2c\x30\x2e\x32\x35\x20\x30\x2e\x30\x37\x2c\x30\x2e\x34\x39\x20\
+\x30\x2e\x31\x2c\x30\x2e\x37\x33\x20\x68\x20\x35\x31\x20\x63\x20\
+\x30\x2c\x2d\x30\x2e\x32\x34\x20\x2d\x30\x2e\x30\x38\x2c\x2d\x30\
+\x2e\x34\x38\x20\x2d\x30\x2e\x31\x2c\x2d\x30\x2e\x37\x33\x20\x4c\
+\x20\x31\x34\x34\x2e\x37\x31\x2c\x32\x37\x2e\x37\x33\x20\x63\x20\
+\x30\x2c\x2d\x30\x2e\x32\x35\x20\x2d\x30\x2e\x30\x37\x2c\x2d\x30\
+\x2e\x34\x39\x20\x2d\x30\x2e\x31\x2c\x2d\x30\x2e\x37\x33\x20\x68\
+\x20\x2d\x35\x31\x20\x63\x20\x30\x2e\x30\x37\x2c\x30\x2e\x32\x34\
+\x20\x30\x2e\x31\x32\x2c\x30\x2e\x34\x38\x20\x30\x2e\x31\x34\x2c\
+\x30\x2e\x37\x33\x20\x7a\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3a\x63\x6f\x6e\x6e\x65\x63\x74\x6f\x72\x2d\
+\x63\x75\x72\x76\x61\x74\x75\x72\x65\x3d\x22\x30\x22\x0a\x20\x20\
+\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x64\x69\x73\x70\x6c\x61\
+\x79\x3a\x69\x6e\x6c\x69\x6e\x65\x3b\x66\x69\x6c\x6c\x3a\x23\x32\
+\x62\x32\x66\x38\x33\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x67\x0a\x20\
+\x20\x20\x20\x20\x69\x64\x3d\x22\x61\x33\x35\x65\x34\x62\x32\x34\
+\x2d\x64\x39\x32\x62\x2d\x34\x34\x61\x34\x2d\x39\x32\x61\x62\x2d\
+\x65\x61\x32\x37\x36\x38\x62\x63\x34\x32\x35\x31\x22\x0a\x20\x20\
+\x20\x20\x20\x64\x61\x74\x61\x2d\x6e\x61\x6d\x65\x3d\x22\x51\x52\
+\x22\x0a\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x64\x69\
+\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\x69\x6e\x65\x22\x3e\x0a\x20\
+\x20\x20\x20\x3c\x72\x65\x63\x74\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x69\x64\x3d\x22\x62\x65\x61\x38\x38\x38\x36\x34\x2d\x39\x39\x38\
+\x64\x2d\x34\x32\x31\x66\x2d\x61\x63\x34\x33\x2d\x36\x62\x39\x62\
+\x39\x61\x36\x37\x65\x66\x32\x37\x22\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x64\x61\x74\x61\x2d\x6e\x61\x6d\x65\x3d\x22\x51\x52\x36\x22\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x63\x6c\x61\x73\x73\x3d\x22\x62\
+\x38\x63\x30\x65\x32\x34\x35\x2d\x66\x37\x65\x65\x2d\x34\x36\x32\
+\x62\x2d\x62\x32\x36\x37\x2d\x37\x65\x63\x33\x64\x34\x64\x66\x32\
+\x64\x35\x64\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x3d\x22\x33\
+\x35\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x79\x3d\x22\x33\x35\x22\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\x31\
+\x38\x36\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x68\x65\x69\x67\x68\
+\x74\x3d\x22\x31\x38\x36\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x72\
+\x78\x3d\x22\x31\x36\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x74\x72\
+\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x72\x6f\x74\x61\x74\x65\x28\
+\x39\x30\x2c\x31\x32\x38\x2c\x31\x32\x38\x29\x22\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\x6c\x6c\x3a\
+\x23\x63\x63\x63\x63\x63\x63\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\
+\x3c\x72\x65\x63\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\
+\x22\x61\x31\x38\x64\x66\x62\x34\x34\x2d\x34\x38\x31\x34\x2d\x34\
+\x63\x35\x38\x2d\x61\x34\x36\x65\x2d\x31\x65\x66\x64\x35\x34\x30\
+\x63\x33\x64\x61\x33\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x64\x61\
+\x74\x61\x2d\x6e\x61\x6d\x65\x3d\x22\x51\x52\x35\x22\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x63\x6c\x61\x73\x73\x3d\x22\x61\x35\x38\x35\
+\x65\x34\x34\x30\x2d\x30\x32\x65\x64\x2d\x34\x63\x64\x36\x2d\x39\
+\x39\x61\x61\x2d\x39\x65\x64\x64\x66\x65\x33\x62\x36\x34\x64\x36\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x3d\x22\x34\x33\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x79\x3d\x22\x34\x33\x22\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\x31\x37\x30\x22\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\
+\x31\x37\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x72\x78\x3d\x22\
+\x38\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\
+\x22\x66\x69\x6c\x6c\x3a\x23\x66\x39\x66\x39\x66\x39\x22\x20\x2f\
+\x3e\x0a\x20\x20\x20\x20\x3c\x72\x65\x63\x74\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x69\x64\x3d\x22\x65\x31\x33\x63\x62\x61\x39\x63\x2d\
+\x37\x62\x61\x62\x2d\x34\x66\x33\x34\x2d\x39\x62\x34\x33\x2d\x34\
+\x36\x31\x35\x64\x66\x37\x33\x63\x66\x61\x66\x22\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x64\x61\x74\x61\x2d\x6e\x61\x6d\x65\x3d\x22\x51\
+\x52\x34\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x63\x6c\x61\x73\x73\
+\x3d\x22\x66\x65\x65\x62\x63\x38\x62\x62\x2d\x66\x62\x38\x38\x2d\
+\x34\x34\x61\x37\x2d\x39\x34\x34\x34\x2d\x61\x38\x30\x36\x65\x31\
+\x65\x36\x61\x39\x32\x38\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\
+\x3d\x22\x35\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x79\x3d\x22\
+\x35\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x77\x69\x64\x74\x68\
+\x3d\x22\x31\x35\x34\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x68\x65\
+\x69\x67\x68\x74\x3d\x22\x31\x35\x34\x22\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x72\x6f\x74\
+\x61\x74\x65\x28\x39\x30\x2c\x31\x32\x38\x2c\x31\x32\x38\x29\x22\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\
+\x69\x6c\x6c\x3a\x23\x66\x32\x66\x32\x66\x32\x22\x20\x2f\x3e\x0a\
+\x20\x20\x20\x20\x3c\x72\x65\x63\x74\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x69\x64\x3d\x22\x62\x63\x65\x35\x30\x63\x65\x66\x2d\x64\x66\
+\x66\x33\x2d\x34\x64\x62\x61\x2d\x38\x66\x33\x64\x2d\x35\x32\x31\
+\x37\x65\x32\x63\x63\x33\x63\x30\x35\x22\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x64\x61\x74\x61\x2d\x6e\x61\x6d\x65\x3d\x22\x51\x52\x33\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x63\x6c\x61\x73\x73\x3d\x22\
+\x62\x32\x30\x36\x36\x34\x64\x66\x2d\x38\x64\x36\x63\x2d\x34\x31\
+\x65\x31\x2d\x39\x66\x39\x38\x2d\x30\x30\x65\x30\x36\x37\x36\x34\
+\x31\x36\x64\x32\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x3d\x22\
+\x36\x33\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x79\x3d\x22\x36\x33\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\
+\x31\x33\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x68\x65\x69\x67\
+\x68\x74\x3d\x22\x31\x33\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x72\x78\x3d\x22\x31\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x74\
+\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x72\x6f\x74\x61\x74\x65\
+\x28\x39\x30\x2c\x31\x32\x38\x2c\x31\x32\x38\x29\x22\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\x6c\x6c\
+\x3a\x23\x30\x32\x30\x32\x30\x32\x22\x20\x2f\x3e\x0a\x20\x20\x20\
+\x20\x3c\x72\x65\x63\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\
+\x3d\x22\x61\x33\x33\x64\x37\x32\x36\x32\x2d\x35\x64\x34\x35\x2d\
+\x34\x34\x62\x31\x2d\x61\x35\x63\x31\x2d\x65\x38\x66\x61\x38\x37\
+\x64\x37\x66\x35\x62\x65\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x64\
+\x61\x74\x61\x2d\x6e\x61\x6d\x65\x3d\x22\x51\x52\x32\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x63\x6c\x61\x73\x73\x3d\x22\x61\x36\x31\
+\x65\x33\x32\x64\x37\x2d\x62\x61\x36\x35\x2d\x34\x34\x66\x31\x2d\
+\x61\x30\x66\x35\x2d\x66\x37\x66\x32\x35\x34\x32\x65\x66\x39\x33\
+\x61\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x3d\x22\x37\x33\x22\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x79\x3d\x22\x37\x33\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\x31\x31\x30\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\
+\x22\x31\x31\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x74\x72\x61\
+\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x72\x6f\x74\x61\x74\x65\x28\x39\
+\x30\x2c\x31\x32\x38\x2c\x31\x32\x38\x29\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\x6c\x6c\x3a\x23\
+\x65\x62\x66\x30\x66\x32\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\
+\x72\x65\x63\x74\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\
+\x66\x33\x63\x30\x65\x30\x33\x34\x2d\x35\x34\x66\x31\x2d\x34\x31\
+\x39\x36\x2d\x62\x65\x36\x63\x2d\x31\x39\x33\x63\x36\x62\x66\x39\
+\x64\x61\x66\x62\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x64\x61\x74\
+\x61\x2d\x6e\x61\x6d\x65\x3d\x22\x51\x52\x31\x22\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x63\x6c\x61\x73\x73\x3d\x22\x62\x32\x30\x36\x36\
+\x34\x64\x66\x2d\x38\x64\x36\x63\x2d\x34\x31\x65\x31\x2d\x39\x66\
+\x39\x38\x2d\x30\x30\x65\x30\x36\x37\x36\x34\x31\x36\x64\x32\x22\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x3d\x22\x39\x33\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x79\x3d\x22\x39\x33\x22\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\x37\x30\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x37\x30\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x74\x72\x61\x6e\x73\x66\x6f\
+\x72\x6d\x3d\x22\x72\x6f\x74\x61\x74\x65\x28\x39\x30\x2c\x31\x32\
+\x38\x2c\x31\x32\x38\x29\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\
+\x74\x79\x6c\x65\x3d\x22\x66\x69\x6c\x6c\x3a\x23\x30\x32\x30\x32\
+\x30\x32\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x2f\x67\x3e\x0a\x20\x20\
+\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x62\
+\x34\x38\x39\x35\x34\x37\x32\x2d\x30\x64\x38\x36\x2d\x34\x39\x63\
+\x30\x2d\x38\x36\x33\x65\x2d\x64\x30\x66\x36\x65\x63\x63\x37\x62\
+\x62\x66\x35\x22\x0a\x20\x20\x20\x20\x20\x64\x61\x74\x61\x2d\x6e\
+\x61\x6d\x65\x3d\x22\x42\x72\x69\x67\x68\x74\x22\x0a\x20\x20\x20\
+\x20\x20\x63\x6c\x61\x73\x73\x3d\x22\x62\x33\x64\x30\x31\x66\x37\
+\x65\x2d\x36\x39\x62\x31\x2d\x34\x39\x66\x33\x2d\x62\x62\x33\x38\
+\x2d\x35\x66\x30\x34\x37\x63\x39\x34\x31\x34\x30\x63\x22\x0a\x20\
+\x20\x20\x20\x20\x64\x3d\x22\x6d\x20\x36\x31\x2c\x37\x33\x20\x76\
+\x20\x31\x31\x30\x20\x61\x20\x31\x32\x2c\x31\x32\x20\x30\x20\x30\
+\x20\x30\x20\x31\x32\x2c\x31\x32\x20\x68\x20\x31\x31\x30\x20\x61\
+\x20\x31\x32\x2c\x31\x32\x20\x30\x20\x30\x20\x30\x20\x31\x32\x2c\
+\x2d\x31\x32\x20\x56\x20\x37\x33\x20\x41\x20\x31\x32\x2c\x31\x32\
+\x20\x30\x20\x30\x20\x30\x20\x31\x38\x33\x2c\x36\x31\x20\x48\x20\
+\x37\x33\x20\x41\x20\x31\x32\x2c\x31\x32\x20\x30\x20\x30\x20\x30\
+\x20\x36\x31\x2c\x37\x33\x20\x5a\x22\x0a\x20\x20\x20\x20\x20\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6e\x6e\x65\x63\x74\x6f\
+\x72\x2d\x63\x75\x72\x76\x61\x74\x75\x72\x65\x3d\x22\x30\x22\x0a\
+\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x64\x69\x73\x70\
+\x6c\x61\x79\x3a\x69\x6e\x6c\x69\x6e\x65\x3b\x6f\x70\x61\x63\x69\
+\x74\x79\x3a\x30\x2e\x36\x33\x39\x39\x39\x39\x39\x39\x3b\x69\x73\
+\x6f\x6c\x61\x74\x69\x6f\x6e\x3a\x69\x73\x6f\x6c\x61\x74\x65\x3b\
+\x66\x69\x6c\x6c\x3a\x75\x72\x6c\x28\x23\x62\x64\x36\x61\x63\x61\
+\x35\x30\x2d\x61\x37\x35\x62\x2d\x34\x32\x30\x36\x2d\x39\x36\x65\
+\x30\x2d\x36\x35\x37\x63\x64\x34\x66\x36\x37\x38\x35\x30\x29\x22\
+\x20\x2f\x3e\x0a\x20\x20\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\x20\
+\x20\x69\x64\x3d\x22\x61\x35\x34\x35\x30\x64\x35\x66\x2d\x62\x36\
+\x38\x66\x2d\x34\x39\x36\x37\x2d\x39\x39\x32\x36\x2d\x35\x30\x62\
+\x39\x39\x33\x64\x64\x64\x61\x63\x31\x22\x0a\x20\x20\x20\x20\x20\
+\x64\x61\x74\x61\x2d\x6e\x61\x6d\x65\x3d\x22\x53\x68\x61\x64\x6f\
+\x77\x20\x55\x70\x20\x42\x61\x63\x6b\x22\x0a\x20\x20\x20\x20\x20\
+\x63\x6c\x61\x73\x73\x3d\x22\x61\x34\x66\x64\x66\x30\x63\x32\x2d\
+\x34\x30\x39\x34\x2d\x34\x31\x32\x65\x2d\x38\x31\x62\x30\x2d\x65\
+\x35\x62\x35\x37\x63\x63\x38\x30\x33\x63\x65\x22\x0a\x20\x20\x20\
+\x20\x20\x64\x3d\x22\x4d\x20\x37\x33\x2e\x30\x39\x2c\x38\x20\x41\
+\x20\x32\x32\x2c\x32\x32\x20\x30\x20\x30\x20\x31\x20\x39\x33\x2e\
+\x37\x35\x2c\x32\x37\x2e\x37\x33\x20\x4c\x20\x39\x34\x2e\x33\x38\
+\x2c\x33\x35\x20\x48\x20\x35\x31\x20\x61\x20\x31\x35\x2e\x37\x35\
+\x2c\x31\x35\x2e\x37\x35\x20\x30\x20\x30\x20\x30\x20\x2d\x34\x2e\
+\x33\x37\x2c\x30\x2e\x36\x32\x20\x4c\x20\x33\x35\x2c\x36\x38\x2e\
+\x33\x34\x20\x76\x20\x38\x38\x2e\x31\x33\x20\x4c\x20\x39\x39\x2c\
+\x38\x37\x2e\x38\x35\x20\x31\x30\x39\x2e\x36\x32\x2c\x37\x36\x2e\
+\x34\x37\x20\x48\x20\x38\x33\x2e\x30\x37\x20\x6c\x20\x31\x32\x2c\
+\x2d\x33\x33\x2e\x37\x34\x20\x33\x2e\x32\x2c\x2d\x39\x20\x43\x20\
+\x31\x30\x32\x2e\x31\x33\x2c\x32\x32\x2e\x38\x33\x20\x31\x31\x34\
+\x2e\x31\x31\x2c\x31\x34\x20\x31\x32\x35\x2c\x31\x34\x20\x68\x20\
+\x31\x32\x2e\x39\x33\x20\x61\x20\x32\x32\x2e\x32\x34\x2c\x32\x32\
+\x2e\x32\x34\x20\x30\x20\x30\x20\x30\x20\x2d\x34\x2e\x38\x38\x2c\
+\x2d\x33\x2e\x35\x31\x20\x76\x20\x30\x20\x63\x20\x2d\x30\x2e\x35\
+\x35\x2c\x2d\x30\x2e\x33\x20\x2d\x31\x2e\x31\x32\x2c\x2d\x30\x2e\
+\x35\x36\x20\x2d\x31\x2e\x37\x2c\x2d\x30\x2e\x38\x31\x20\x6c\x20\
+\x2d\x30\x2e\x31\x33\x2c\x2d\x30\x2e\x30\x36\x20\x71\x20\x2d\x30\
+\x2e\x38\x31\x2c\x2d\x30\x2e\x33\x33\x20\x2d\x31\x2e\x36\x35\x2c\
+\x2d\x30\x2e\x36\x20\x6c\x20\x2d\x30\x2e\x32\x36\x2c\x2d\x30\x2e\
+\x30\x39\x20\x63\x20\x2d\x30\x2e\x35\x32\x2c\x2d\x30\x2e\x31\x36\
+\x20\x2d\x31\x2c\x2d\x30\x2e\x32\x39\x20\x2d\x31\x2e\x35\x38\x2c\
+\x2d\x30\x2e\x34\x31\x20\x6c\x20\x2d\x30\x2e\x33\x39\x2c\x2d\x30\
+\x2e\x31\x20\x63\x20\x2d\x30\x2e\x35\x31\x2c\x2d\x30\x2e\x31\x20\
+\x2d\x31\x2c\x2d\x30\x2e\x31\x37\x20\x2d\x31\x2e\x35\x36\x2c\x2d\
+\x30\x2e\x32\x34\x20\x2d\x30\x2e\x31\x35\x2c\x30\x20\x2d\x30\x2e\
+\x33\x2c\x2d\x30\x2e\x30\x35\x20\x2d\x30\x2e\x34\x36\x2c\x2d\x30\
+\x2e\x30\x36\x20\x61\x20\x31\x39\x2e\x38\x31\x2c\x31\x39\x2e\x38\
+\x31\x20\x30\x20\x30\x20\x30\x20\x2d\x32\x2c\x2d\x30\x2e\x31\x31\
+\x20\x48\x20\x37\x32\x2e\x33\x20\x63\x20\x30\x2e\x32\x36\x2c\x30\
+\x20\x30\x2e\x35\x32\x2c\x30\x20\x30\x2e\x37\x39\x2c\x30\x20\x7a\
+\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\
+\x63\x6f\x6e\x6e\x65\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\x61\x74\
+\x75\x72\x65\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x73\x74\x79\
+\x6c\x65\x3d\x22\x64\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\x69\
+\x6e\x65\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\
+\x30\x2e\x30\x35\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x70\x61\x74\x68\
+\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x66\x62\x30\x34\x39\x66\
+\x64\x32\x2d\x32\x34\x37\x31\x2d\x34\x34\x65\x39\x2d\x62\x34\x38\
+\x30\x2d\x66\x61\x37\x63\x37\x64\x66\x39\x30\x66\x64\x66\x22\x0a\
+\x20\x20\x20\x20\x20\x64\x61\x74\x61\x2d\x6e\x61\x6d\x65\x3d\x22\
+\x41\x72\x72\x6f\x77\x20\x55\x70\x22\x0a\x20\x20\x20\x20\x20\x63\
+\x6c\x61\x73\x73\x3d\x22\x61\x62\x65\x63\x62\x37\x63\x37\x2d\x32\
+\x33\x36\x37\x2d\x34\x61\x64\x65\x2d\x62\x30\x33\x31\x2d\x35\x62\
+\x31\x37\x35\x63\x33\x38\x38\x34\x37\x34\x22\x0a\x20\x20\x20\x20\
+\x20\x64\x3d\x22\x4d\x20\x39\x32\x2e\x32\x36\x2c\x32\x37\x2e\x37\
+\x33\x20\x43\x20\x39\x36\x2e\x31\x33\x2c\x31\x36\x2e\x38\x33\x20\
+\x31\x30\x38\x2e\x31\x31\x2c\x38\x20\x31\x31\x39\x2c\x38\x20\x48\
+\x20\x36\x38\x20\x43\x20\x35\x37\x2e\x31\x35\x2c\x38\x20\x34\x35\
+\x2e\x31\x38\x2c\x31\x36\x2e\x38\x33\x20\x34\x31\x2e\x33\x2c\x32\
+\x37\x2e\x37\x33\x20\x4c\x20\x32\x36\x2e\x31\x31\x2c\x37\x30\x2e\
+\x34\x37\x20\x48\x20\x31\x30\x2e\x35\x20\x6c\x20\x31\x35\x2e\x37\
+\x39\x2c\x37\x31\x2e\x31\x38\x20\x36\x36\x2e\x34\x2c\x2d\x37\x31\
+\x2e\x31\x38\x20\x48\x20\x37\x37\x2e\x30\x37\x20\x5a\x22\x0a\x20\
+\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6e\
+\x6e\x65\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\x61\x74\x75\x72\x65\
+\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\
+\x22\x64\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\x69\x6e\x65\x3b\
+\x66\x69\x6c\x6c\x3a\x23\x34\x30\x62\x64\x66\x34\x22\x20\x2f\x3e\
+\x0a\x20\x20\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x0a\x20\x20\x20\x20\
+\x20\x69\x64\x3d\x22\x65\x62\x38\x37\x33\x61\x66\x37\x2d\x30\x65\
+\x31\x38\x2d\x34\x36\x30\x64\x2d\x62\x38\x33\x65\x2d\x32\x39\x37\
+\x31\x62\x61\x31\x31\x64\x66\x63\x32\x22\x0a\x20\x20\x20\x20\x20\
+\x64\x61\x74\x61\x2d\x6e\x61\x6d\x65\x3d\x22\x53\x68\x61\x64\x6f\
+\x77\x20\x55\x70\x22\x0a\x20\x20\x20\x20\x20\x63\x6c\x61\x73\x73\
+\x3d\x22\x62\x65\x36\x65\x63\x65\x62\x38\x2d\x64\x39\x39\x35\x2d\
+\x34\x30\x32\x61\x2d\x62\x63\x30\x61\x2d\x33\x30\x62\x62\x63\x36\
+\x65\x36\x38\x33\x39\x65\x22\x0a\x20\x20\x20\x20\x20\x70\x6f\x69\
+\x6e\x74\x73\x3d\x22\x32\x36\x2e\x32\x39\x2c\x31\x34\x31\x2e\x36\
+\x35\x20\x31\x30\x2e\x35\x2c\x37\x30\x2e\x34\x37\x20\x32\x2e\x33\
+\x2c\x37\x30\x2e\x34\x37\x20\x32\x31\x2e\x37\x37\x2c\x31\x35\x38\
+\x2e\x32\x32\x20\x31\x30\x33\x2e\x36\x33\x2c\x37\x30\x2e\x34\x37\
+\x20\x39\x32\x2e\x36\x39\x2c\x37\x30\x2e\x34\x37\x20\x22\x0a\x20\
+\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x64\x69\x73\x70\x6c\
+\x61\x79\x3a\x69\x6e\x6c\x69\x6e\x65\x3b\x66\x69\x6c\x6c\x3a\x23\
+\x32\x65\x35\x39\x39\x63\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x70\x61\
+\x74\x68\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x61\x63\x63\x37\
+\x32\x33\x33\x65\x2d\x32\x36\x61\x65\x2d\x34\x34\x33\x34\x2d\x39\
+\x30\x30\x65\x2d\x36\x36\x65\x34\x36\x39\x34\x32\x62\x35\x66\x32\
+\x22\x0a\x20\x20\x20\x20\x20\x64\x61\x74\x61\x2d\x6e\x61\x6d\x65\
+\x3d\x22\x4c\x69\x67\x68\x74\x20\x55\x70\x20\x33\x22\x0a\x20\x20\
+\x20\x20\x20\x63\x6c\x61\x73\x73\x3d\x22\x66\x64\x30\x36\x31\x35\
+\x35\x61\x2d\x31\x66\x37\x37\x2d\x34\x64\x38\x36\x2d\x61\x63\x36\
+\x31\x2d\x64\x31\x64\x31\x64\x38\x34\x37\x39\x63\x31\x39\x22\x0a\
+\x20\x20\x20\x20\x20\x64\x3d\x22\x4d\x20\x38\x32\x2e\x38\x34\x2c\
+\x38\x20\x48\x20\x36\x38\x20\x43\x20\x36\x30\x2e\x32\x34\x2c\x38\
+\x20\x35\x32\x2c\x31\x32\x2e\x34\x39\x20\x34\x36\x2e\x34\x32\x2c\
+\x31\x39\x20\x68\x20\x35\x31\x20\x43\x20\x31\x30\x33\x2c\x31\x32\
+\x2e\x34\x39\x20\x31\x31\x31\x2e\x32\x34\x2c\x38\x20\x31\x31\x39\
+\x2c\x38\x20\x5a\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\
+\x61\x70\x65\x3a\x63\x6f\x6e\x6e\x65\x63\x74\x6f\x72\x2d\x63\x75\
+\x72\x76\x61\x74\x75\x72\x65\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\
+\x20\x73\x74\x79\x6c\x65\x3d\x22\x64\x69\x73\x70\x6c\x61\x79\x3a\
+\x69\x6e\x6c\x69\x6e\x65\x3b\x66\x69\x6c\x6c\x3a\x23\x37\x65\x63\
+\x33\x65\x63\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x70\x61\x74\x68\x0a\
+\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x62\x31\x37\x31\x63\x32\x38\
+\x37\x2d\x37\x65\x39\x31\x2d\x34\x31\x61\x37\x2d\x61\x33\x63\x61\
+\x2d\x39\x32\x38\x35\x61\x37\x37\x33\x61\x31\x63\x33\x22\x0a\x20\
+\x20\x20\x20\x20\x64\x61\x74\x61\x2d\x6e\x61\x6d\x65\x3d\x22\x4c\
+\x69\x67\x68\x74\x20\x55\x70\x20\x32\x22\x0a\x20\x20\x20\x20\x20\
+\x63\x6c\x61\x73\x73\x3d\x22\x62\x34\x63\x38\x37\x32\x65\x32\x2d\
+\x61\x35\x37\x30\x2d\x34\x32\x65\x63\x2d\x62\x65\x39\x62\x2d\x61\
+\x62\x66\x39\x35\x33\x61\x37\x66\x36\x38\x36\x22\x0a\x20\x20\x20\
+\x20\x20\x64\x3d\x22\x4d\x20\x38\x32\x2e\x38\x34\x2c\x38\x20\x48\
+\x20\x36\x38\x20\x61\x20\x32\x35\x2e\x35\x39\x2c\x32\x35\x2e\x35\
+\x39\x20\x30\x20\x30\x20\x30\x20\x2d\x31\x31\x2e\x34\x39\x2c\x33\
+\x20\x68\x20\x35\x31\x20\x41\x20\x32\x35\x2e\x35\x39\x2c\x32\x35\
+\x2e\x35\x39\x20\x30\x20\x30\x20\x31\x20\x31\x31\x39\x2c\x38\x20\
+\x5a\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x63\x6f\x6e\x6e\x65\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\x61\
+\x74\x75\x72\x65\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x73\x74\
+\x79\x6c\x65\x3d\x22\x64\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\
+\x69\x6e\x65\x3b\x66\x69\x6c\x6c\x3a\x23\x61\x63\x65\x30\x66\x33\
+\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x67\x0a\x20\x20\x20\x20\x20\x69\
+\x64\x3d\x22\x62\x39\x35\x31\x30\x30\x65\x31\x2d\x62\x62\x65\x36\
+\x2d\x34\x35\x38\x34\x2d\x61\x62\x61\x66\x2d\x36\x62\x38\x30\x61\
+\x31\x61\x62\x38\x38\x36\x33\x22\x0a\x20\x20\x20\x20\x20\x64\x61\
+\x74\x61\x2d\x6e\x61\x6d\x65\x3d\x22\x4c\x69\x67\x68\x74\x20\x55\
+\x70\x20\x31\x22\x0a\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\
+\x22\x64\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\x69\x6e\x65\x22\
+\x3e\x0a\x20\x20\x20\x20\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x63\x6c\x61\x73\x73\x3d\x22\x62\x34\x63\
+\x38\x37\x32\x65\x32\x2d\x61\x35\x37\x30\x2d\x34\x32\x65\x63\x2d\
+\x62\x65\x39\x62\x2d\x61\x62\x66\x39\x35\x33\x61\x37\x66\x36\x38\
+\x36\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x70\x6f\x69\x6e\x74\x73\
+\x3d\x22\x31\x32\x2e\x32\x37\x2c\x37\x38\x2e\x34\x37\x20\x32\x33\
+\x2e\x32\x37\x2c\x37\x38\x2e\x34\x37\x20\x32\x36\x2e\x31\x31\x2c\
+\x37\x30\x2e\x34\x37\x20\x32\x2e\x33\x2c\x37\x30\x2e\x34\x37\x20\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x70\x6f\x6c\
+\x79\x67\x6f\x6e\x32\x39\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\
+\x74\x79\x6c\x65\x3d\x22\x66\x69\x6c\x6c\x3a\x23\x61\x63\x65\x30\
+\x66\x33\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x70\x6f\x6c\x79\
+\x67\x6f\x6e\x0a\x20\x20\x20\x20\x20\x20\x20\x63\x6c\x61\x73\x73\
+\x3d\x22\x62\x34\x63\x38\x37\x32\x65\x32\x2d\x61\x35\x37\x30\x2d\
+\x34\x32\x65\x63\x2d\x62\x65\x39\x62\x2d\x61\x62\x66\x39\x35\x33\
+\x61\x37\x66\x36\x38\x36\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x70\
+\x6f\x69\x6e\x74\x73\x3d\x22\x37\x37\x2e\x31\x34\x2c\x37\x30\x2e\
+\x34\x37\x20\x37\x34\x2e\x33\x2c\x37\x38\x2e\x34\x37\x20\x38\x35\
+\x2e\x32\x32\x2c\x37\x38\x2e\x34\x37\x20\x31\x30\x33\x2e\x36\x33\
+\x2c\x37\x30\x2e\x34\x37\x20\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x69\x64\x3d\x22\x70\x6f\x6c\x79\x67\x6f\x6e\x33\x31\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\x6c\
+\x6c\x3a\x23\x61\x63\x65\x30\x66\x33\x22\x20\x2f\x3e\x0a\x20\x20\
+\x3c\x2f\x67\x3e\x0a\x20\x20\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\
+\x20\x20\x69\x64\x3d\x22\x65\x63\x30\x31\x38\x30\x31\x61\x2d\x39\
+\x35\x62\x36\x2d\x34\x61\x30\x31\x2d\x61\x38\x36\x65\x2d\x39\x31\
+\x35\x39\x63\x65\x34\x63\x32\x35\x65\x66\x22\x0a\x20\x20\x20\x20\
+\x20\x64\x61\x74\x61\x2d\x6e\x61\x6d\x65\x3d\x22\x53\x68\x61\x64\
+\x6f\x65\x20\x44\x6f\x77\x6e\x20\x42\x61\x63\x6b\x22\x0a\x20\x20\
+\x20\x20\x20\x63\x6c\x61\x73\x73\x3d\x22\x61\x34\x66\x64\x66\x30\
+\x63\x32\x2d\x34\x30\x39\x34\x2d\x34\x31\x32\x65\x2d\x38\x31\x62\
+\x30\x2d\x65\x35\x62\x35\x37\x63\x63\x38\x30\x33\x63\x65\x22\x0a\
+\x20\x20\x20\x20\x20\x64\x3d\x22\x6d\x20\x31\x38\x32\x2e\x39\x31\
+\x2c\x32\x34\x38\x20\x61\x20\x32\x32\x2c\x32\x32\x20\x30\x20\x30\
+\x20\x31\x20\x2d\x32\x30\x2e\x36\x36\x2c\x2d\x31\x39\x2e\x36\x39\
+\x20\x6c\x20\x2d\x30\x2e\x36\x33\x2c\x2d\x37\x2e\x32\x37\x20\x48\
+\x20\x32\x30\x35\x20\x61\x20\x31\x35\x2e\x37\x35\x2c\x31\x35\x2e\
+\x37\x35\x20\x30\x20\x30\x20\x30\x20\x34\x2e\x33\x37\x2c\x2d\x30\
+\x2e\x36\x32\x20\x4c\x20\x32\x32\x31\x2c\x31\x38\x37\x2e\x36\x36\
+\x20\x56\x20\x39\x39\x2e\x35\x33\x20\x6c\x20\x2d\x36\x34\x2c\x36\
+\x38\x2e\x36\x32\x20\x2d\x31\x30\x2e\x36\x32\x2c\x31\x31\x2e\x33\
+\x38\x20\x68\x20\x32\x36\x2e\x35\x36\x20\x6c\x20\x2d\x31\x32\x2c\
+\x33\x33\x2e\x37\x34\x20\x2d\x33\x2e\x32\x2c\x39\x20\x43\x20\x31\
+\x35\x33\x2e\x38\x37\x2c\x32\x33\x33\x2e\x31\x37\x20\x31\x34\x31\
+\x2e\x38\x39\x2c\x32\x34\x32\x20\x31\x33\x31\x2c\x32\x34\x32\x20\
+\x68\x20\x2d\x31\x32\x2e\x39\x33\x20\x61\x20\x32\x32\x2e\x34\x32\
+\x2c\x32\x32\x2e\x34\x32\x20\x30\x20\x30\x20\x30\x20\x34\x2e\x38\
+\x37\x2c\x33\x2e\x35\x31\x20\x76\x20\x30\x20\x63\x20\x30\x2e\x35\
+\x35\x2c\x30\x2e\x33\x20\x31\x2e\x31\x32\x2c\x30\x2e\x35\x36\x20\
+\x31\x2e\x37\x2c\x30\x2e\x38\x31\x20\x6c\x20\x30\x2e\x31\x33\x2c\
+\x30\x2e\x30\x36\x20\x63\x20\x30\x2e\x35\x34\x2c\x30\x2e\x32\x33\
+\x20\x31\x2e\x30\x39\x2c\x30\x2e\x34\x32\x20\x31\x2e\x36\x35\x2c\
+\x30\x2e\x36\x20\x6c\x20\x30\x2e\x32\x36\x2c\x30\x2e\x30\x39\x20\
+\x63\x20\x30\x2e\x35\x32\x2c\x30\x2e\x31\x36\x20\x31\x2e\x30\x35\
+\x2c\x30\x2e\x32\x39\x20\x31\x2e\x35\x38\x2c\x30\x2e\x34\x31\x20\
+\x6c\x20\x30\x2e\x33\x39\x2c\x30\x2e\x31\x20\x63\x20\x30\x2e\x35\
+\x31\x2c\x30\x2e\x31\x20\x31\x2c\x30\x2e\x31\x37\x20\x31\x2e\x35\
+\x36\x2c\x30\x2e\x32\x34\x20\x30\x2e\x31\x35\x2c\x30\x20\x30\x2e\
+\x33\x2c\x30\x20\x30\x2e\x34\x36\x2c\x30\x2e\x30\x36\x20\x61\x20\
+\x31\x39\x2e\x38\x31\x2c\x31\x39\x2e\x38\x31\x20\x30\x20\x30\x20\
+\x30\x20\x32\x2e\x30\x35\x2c\x30\x2e\x31\x31\x20\x68\x20\x35\x30\
+\x2e\x39\x38\x20\x63\x20\x2d\x30\x2e\x32\x36\x2c\x30\x20\x2d\x30\
+\x2e\x35\x32\x2c\x30\x20\x2d\x30\x2e\x37\x39\x2c\x30\x20\x7a\x22\
+\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\
+\x6f\x6e\x6e\x65\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\x61\x74\x75\
+\x72\x65\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x73\x74\x79\x6c\
+\x65\x3d\x22\x64\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\x69\x6e\
+\x65\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x30\
+\x2e\x30\x35\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x70\x61\x74\x68\x0a\
+\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x62\x35\x35\x39\x61\x38\x64\
+\x66\x2d\x66\x38\x62\x32\x2d\x34\x65\x35\x36\x2d\x38\x63\x36\x30\
+\x2d\x38\x34\x63\x64\x32\x31\x38\x66\x34\x32\x38\x33\x22\x0a\x20\
+\x20\x20\x20\x20\x64\x61\x74\x61\x2d\x6e\x61\x6d\x65\x3d\x22\x41\
+\x72\x72\x6f\x77\x20\x44\x6f\x77\x6e\x22\x0a\x20\x20\x20\x20\x20\
+\x63\x6c\x61\x73\x73\x3d\x22\x61\x62\x65\x63\x62\x37\x63\x37\x2d\
+\x32\x33\x36\x37\x2d\x34\x61\x64\x65\x2d\x62\x30\x33\x31\x2d\x35\
+\x62\x31\x37\x35\x63\x33\x38\x38\x34\x37\x34\x22\x0a\x20\x20\x20\
+\x20\x20\x64\x3d\x22\x4d\x20\x31\x36\x33\x2e\x37\x34\x2c\x32\x32\
+\x38\x2e\x32\x37\x20\x43\x20\x31\x35\x39\x2e\x38\x37\x2c\x32\x33\
+\x39\x2e\x31\x37\x20\x31\x34\x37\x2e\x38\x39\x2c\x32\x34\x38\x20\
+\x31\x33\x37\x2c\x32\x34\x38\x20\x68\x20\x35\x31\x20\x63\x20\x31\
+\x30\x2e\x38\x39\x2c\x30\x20\x32\x32\x2e\x38\x36\x2c\x2d\x38\x2e\
+\x38\x33\x20\x32\x36\x2e\x37\x34\x2c\x2d\x31\x39\x2e\x37\x33\x20\
+\x6c\x20\x31\x35\x2e\x31\x39\x2c\x2d\x34\x32\x2e\x37\x34\x20\x68\
+\x20\x31\x35\x2e\x35\x37\x20\x6c\x20\x2d\x31\x35\x2e\x37\x39\x2c\
+\x2d\x37\x31\x2e\x31\x38\x20\x2d\x36\x36\x2e\x34\x2c\x37\x31\x2e\
+\x31\x38\x20\x68\x20\x31\x35\x2e\x36\x32\x20\x7a\x22\x0a\x20\x20\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6e\x6e\
+\x65\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\x61\x74\x75\x72\x65\x3d\
+\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\
+\x64\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\x69\x6e\x65\x3b\x66\
+\x69\x6c\x6c\x3a\x23\x34\x30\x62\x64\x66\x34\x22\x20\x2f\x3e\x0a\
+\x20\x20\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x0a\x20\x20\x20\x20\x20\
+\x69\x64\x3d\x22\x61\x32\x33\x64\x63\x38\x65\x37\x2d\x38\x34\x30\
+\x38\x2d\x34\x64\x64\x66\x2d\x39\x31\x62\x64\x2d\x33\x34\x38\x31\
+\x37\x36\x35\x30\x33\x34\x35\x61\x22\x0a\x20\x20\x20\x20\x20\x64\
+\x61\x74\x61\x2d\x6e\x61\x6d\x65\x3d\x22\x4c\x69\x67\x68\x74\x20\
+\x44\x6f\x77\x6e\x22\x0a\x20\x20\x20\x20\x20\x63\x6c\x61\x73\x73\
+\x3d\x22\x62\x34\x63\x38\x37\x32\x65\x32\x2d\x61\x35\x37\x30\x2d\
+\x34\x32\x65\x63\x2d\x62\x65\x39\x62\x2d\x61\x62\x66\x39\x35\x33\
+\x61\x37\x66\x36\x38\x36\x22\x0a\x20\x20\x20\x20\x20\x70\x6f\x69\
+\x6e\x74\x73\x3d\x22\x32\x32\x39\x2e\x37\x31\x2c\x31\x31\x34\x2e\
+\x33\x35\x20\x32\x34\x35\x2e\x35\x2c\x31\x38\x35\x2e\x35\x33\x20\
+\x32\x35\x33\x2e\x37\x2c\x31\x38\x35\x2e\x35\x33\x20\x32\x33\x34\
+\x2e\x32\x33\x2c\x39\x37\x2e\x37\x38\x20\x31\x35\x32\x2e\x33\x37\
+\x2c\x31\x38\x35\x2e\x35\x33\x20\x31\x36\x33\x2e\x33\x31\x2c\x31\
+\x38\x35\x2e\x35\x33\x20\x22\x0a\x20\x20\x20\x20\x20\x73\x74\x79\
+\x6c\x65\x3d\x22\x64\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\x69\
+\x6e\x65\x3b\x66\x69\x6c\x6c\x3a\x23\x61\x63\x65\x30\x66\x33\x22\
+\x20\x2f\x3e\x0a\x20\x20\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\x20\
+\x20\x69\x64\x3d\x22\x62\x36\x66\x31\x37\x33\x33\x65\x2d\x38\x66\
+\x35\x31\x2d\x34\x35\x66\x31\x2d\x39\x63\x33\x61\x2d\x39\x36\x34\
+\x64\x36\x32\x35\x33\x39\x62\x30\x37\x22\x0a\x20\x20\x20\x20\x20\
+\x64\x61\x74\x61\x2d\x6e\x61\x6d\x65\x3d\x22\x53\x68\x61\x64\x6f\
+\x77\x20\x44\x6f\x77\x6e\x20\x33\x22\x0a\x20\x20\x20\x20\x20\x63\
+\x6c\x61\x73\x73\x3d\x22\x61\x31\x61\x62\x31\x63\x37\x30\x2d\x35\
+\x31\x39\x30\x2d\x34\x64\x37\x32\x2d\x38\x35\x35\x63\x2d\x64\x62\
+\x38\x30\x32\x32\x37\x36\x32\x33\x65\x36\x22\x0a\x20\x20\x20\x20\
+\x20\x64\x3d\x22\x4d\x20\x31\x37\x33\x2e\x31\x36\x2c\x32\x34\x38\
+\x20\x48\x20\x31\x38\x38\x20\x63\x20\x37\x2e\x37\x36\x2c\x30\x20\
+\x31\x36\x2c\x2d\x34\x2e\x34\x39\x20\x32\x31\x2e\x35\x38\x2c\x2d\
+\x31\x31\x20\x68\x20\x2d\x35\x31\x20\x63\x20\x2d\x35\x2e\x35\x34\
+\x2c\x36\x2e\x35\x31\x20\x2d\x31\x33\x2e\x38\x32\x2c\x31\x31\x20\
+\x2d\x32\x31\x2e\x35\x38\x2c\x31\x31\x20\x7a\x22\x0a\x20\x20\x20\
+\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6e\x6e\x65\
+\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\x61\x74\x75\x72\x65\x3d\x22\
+\x30\x22\x0a\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x64\
+\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\x69\x6e\x65\x3b\x66\x69\
+\x6c\x6c\x3a\x23\x34\x65\x39\x36\x64\x64\x22\x20\x2f\x3e\x0a\x20\
+\x20\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\
+\x65\x62\x30\x33\x32\x30\x65\x36\x2d\x63\x64\x36\x39\x2d\x34\x34\
+\x33\x39\x2d\x38\x65\x61\x31\x2d\x30\x64\x39\x36\x32\x39\x63\x38\
+\x61\x63\x64\x37\x22\x0a\x20\x20\x20\x20\x20\x64\x61\x74\x61\x2d\
+\x6e\x61\x6d\x65\x3d\x22\x53\x68\x61\x64\x6f\x77\x20\x44\x6f\x77\
+\x6e\x20\x32\x22\x0a\x20\x20\x20\x20\x20\x63\x6c\x61\x73\x73\x3d\
+\x22\x62\x65\x36\x65\x63\x65\x62\x38\x2d\x64\x39\x39\x35\x2d\x34\
+\x30\x32\x61\x2d\x62\x63\x30\x61\x2d\x33\x30\x62\x62\x63\x36\x65\
+\x36\x38\x33\x39\x65\x22\x0a\x20\x20\x20\x20\x20\x64\x3d\x22\x4d\
+\x20\x31\x37\x33\x2e\x31\x36\x2c\x32\x34\x38\x20\x48\x20\x31\x38\
+\x38\x20\x61\x20\x32\x35\x2e\x35\x39\x2c\x32\x35\x2e\x35\x39\x20\
+\x30\x20\x30\x20\x30\x20\x31\x31\x2e\x34\x39\x2c\x2d\x33\x20\x68\
+\x20\x2d\x35\x31\x20\x41\x20\x32\x35\x2e\x35\x39\x2c\x32\x35\x2e\
+\x35\x39\x20\x30\x20\x30\x20\x31\x20\x31\x33\x37\x2c\x32\x34\x38\
+\x20\x5a\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\
+\x65\x3a\x63\x6f\x6e\x6e\x65\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\
+\x61\x74\x75\x72\x65\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x73\
+\x74\x79\x6c\x65\x3d\x22\x64\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\
+\x6c\x69\x6e\x65\x3b\x66\x69\x6c\x6c\x3a\x23\x32\x65\x35\x39\x39\
+\x63\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x67\x0a\x20\x20\x20\x20\x20\
+\x69\x64\x3d\x22\x62\x31\x38\x62\x37\x37\x30\x35\x2d\x30\x30\x30\
+\x38\x2d\x34\x32\x65\x33\x2d\x39\x34\x61\x36\x2d\x61\x63\x62\x36\
+\x65\x33\x31\x65\x34\x63\x34\x37\x22\x0a\x20\x20\x20\x20\x20\x64\
+\x61\x74\x61\x2d\x6e\x61\x6d\x65\x3d\x22\x53\x68\x61\x64\x6f\x77\
+\x20\x44\x6f\x77\x6e\x20\x31\x22\x0a\x20\x20\x20\x20\x20\x73\x74\
+\x79\x6c\x65\x3d\x22\x64\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\
+\x69\x6e\x65\x22\x3e\x0a\x20\x20\x20\x20\x3c\x70\x6f\x6c\x79\x67\
+\x6f\x6e\x0a\x20\x20\x20\x20\x20\x20\x20\x63\x6c\x61\x73\x73\x3d\
+\x22\x62\x65\x36\x65\x63\x65\x62\x38\x2d\x64\x39\x39\x35\x2d\x34\
+\x30\x32\x61\x2d\x62\x63\x30\x61\x2d\x33\x30\x62\x62\x63\x36\x65\
+\x36\x38\x33\x39\x65\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x70\x6f\
+\x69\x6e\x74\x73\x3d\x22\x32\x32\x39\x2e\x38\x39\x2c\x31\x38\x35\
+\x2e\x35\x33\x20\x32\x33\x32\x2e\x37\x33\x2c\x31\x37\x37\x2e\x35\
+\x33\x20\x32\x34\x33\x2e\x37\x33\x2c\x31\x37\x37\x2e\x35\x33\x20\
+\x32\x35\x33\x2e\x37\x2c\x31\x38\x35\x2e\x35\x33\x20\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x70\x6f\x6c\x79\x67\x6f\
+\x6e\x33\x39\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\
+\x65\x3d\x22\x66\x69\x6c\x6c\x3a\x23\x32\x65\x35\x39\x39\x63\x22\
+\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x70\x6f\x6c\x79\x6c\x69\x6e\
+\x65\x0a\x20\x20\x20\x20\x20\x20\x20\x63\x6c\x61\x73\x73\x3d\x22\
+\x62\x65\x36\x65\x63\x65\x62\x38\x2d\x64\x39\x39\x35\x2d\x34\x30\
+\x32\x61\x2d\x62\x63\x30\x61\x2d\x33\x30\x62\x62\x63\x36\x65\x36\
+\x38\x33\x39\x65\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x70\x6f\x69\
+\x6e\x74\x73\x3d\x22\x31\x35\x32\x2e\x33\x37\x20\x31\x38\x35\x2e\
+\x35\x33\x20\x31\x37\x38\x2e\x38\x36\x20\x31\x38\x35\x2e\x35\x33\
+\x20\x31\x38\x31\x2e\x37\x20\x31\x37\x37\x2e\x35\x33\x20\x31\x37\
+\x30\x2e\x37\x38\x20\x31\x37\x37\x2e\x35\x33\x22\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x69\x64\x3d\x22\x70\x6f\x6c\x79\x6c\x69\x6e\x65\
+\x34\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\
+\x3d\x22\x66\x69\x6c\x6c\x3a\x23\x32\x65\x35\x39\x39\x63\x22\x20\
+\x2f\x3e\x0a\x20\x20\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
+\x0a\
+\x00\x00\x12\xba\
+\x00\
+\x00\x4a\x93\x78\x9c\xc5\x5c\x69\x6f\x23\x47\x92\xfd\xee\x5f\x51\
+\x43\x63\x00\x37\x96\x2c\x65\x64\xe4\x29\xb7\x7a\xd0\xee\x76\x0f\
+\x16\x58\x63\x17\x63\x7b\x06\x98\x6f\x34\x59\x92\x38\xa6\x48\x81\
+\xa4\xfa\xf0\xaf\xdf\x17\x59\x07\xab\x58\x25\x8a\x6a\x69\x46\x54\
+\x1f\x64\xde\x15\x2f\x5e\x5c\x55\xd4\xeb\xbf\x7c\xbe\x59\x66\x1f\
+\x8b\xcd\x76\xb1\x5e\x5d\x8c\x28\x57\xa3\xac\x58\xcd\xd6\xf3\xc5\
+\xea\xea\x62\xf4\xeb\x2f\x1f\x26\x61\x94\x6d\x77\xd3\xd5\x7c\xba\
+\x5c\xaf\x8a\x8b\xd1\x6a\x3d\xfa\xcb\x9b\x6f\x5e\x6f\x3f\x5e\x7d\
+\x93\x65\x19\x26\xaf\xb6\xe7\xf3\xd9\xc5\xe8\x7a\xb7\xbb\x3d\x3f\
+\x3b\xbb\xbd\xdb\x2c\xf3\xf5\xe6\xea\x6c\x3e\x3b\x2b\x96\xc5\x4d\
+\xb1\xda\x6d\xcf\x28\xa7\xb3\xd1\x7e\xf8\x6c\x3f\x7c\xb6\x29\xa6\
+\xbb\xc5\xc7\x62\xb6\xbe\xb9\x59\xaf\xb6\x69\xe6\x6a\xfb\x6d\x6b\
+\xf0\x66\x7e\xd9\x8c\xfe\xf4\xe9\x53\xfe\x89\xd3\x20\x8a\x31\x9e\
+\x29\x7d\xa6\xf5\x04\x23\x26\xdb\x2f\xab\xdd\xf4\xf3\xa4\x3b\x15\
+\x67\x1c\x9a\xaa\x95\x52\x67\xe8\xdb\x8f\x3c\x6d\xd4\xf9\x16\x52\
+\xb9\xc5\xdf\x66\x78\xdd\x90\x6f\xd7\x77\x9b\x59\x71\x89\x79\x45\
+\xbe\x2a\x76\x67\xef\x7f\x79\xdf\x74\x4e\x54\x3e\xdf\xcd\x5b\xcb\
+\x2c\x56\xbf\x6f\x67\xd3\xdb\xa2\xb3\x6b\xdd\x58\x4a\x60\x7a\x53\
+\x6c\x6f\xa7\xb3\x62\x7b\x56\xb7\xa7\xf9\x9f\x16\xf3\xdd\xf5\xc5\
+\xc8\x99\xf4\xe9\xba\x58\x5c\x5d\xef\x9a\x8f\x1f\x17\xc5\xa7\x1f\
+\xd6\x9f\x2f\x46\x2a\x53\x99\x33\x59\xdd\xbc\x87\x96\x52\xc3\x62\
+\x7e\x31\xc2\x75\x11\x9b\xf2\x73\x7d\xce\xf3\xf9\x7a\x26\x1b\x5f\
+\x8c\x6e\x37\xc5\x65\xb1\x81\x16\x14\xdb\xbc\x96\x40\x7d\x8e\xf3\
+\x66\x3d\x95\x47\x9d\x9b\xec\x3b\x3b\x9f\xba\x10\x67\x4c\x3c\xce\
+\xb4\xa2\x38\x51\x34\x21\xf3\x6a\xf4\x06\xd3\x5e\xdf\x14\xbb\xe9\
+\x7c\xba\x9b\xca\x12\xe5\xd6\x75\x0b\xf6\xb7\x69\x0c\x46\x01\xc1\
+\xf3\xbf\xbd\xff\x50\x7e\xc2\xe7\xd9\xec\xfc\x1f\xeb\xcd\xef\xd5\
+\x47\xbc\x64\xc0\xf4\xb7\xf5\x1d\xae\x76\xf4\xa6\x69\x7e\x3d\x9f\
+\x9d\x43\xe6\x37\xd3\xdd\x9b\xc5\xcd\xf4\xaa\x10\xb8\xfe\x0b\x32\
+\x7e\x7d\xb6\xef\xe8\x0c\xde\x7d\xb9\x2d\xf6\x8b\x96\xcb\x6e\x8a\
+\x12\xbc\x41\x0d\x9e\xcf\x6e\x16\x32\xe9\xec\xe7\xdd\x62\xb9\xfc\
+\x6f\xd9\x64\x94\x9d\x1d\x2c\xba\xd8\x2d\x8b\x37\x2d\x99\xa5\xed\
+\xcb\xd6\xfa\x82\xce\xaa\x2b\xaa\xae\xf7\xac\x75\xc1\xaf\xcf\x6a\
+\x89\xa4\x4f\x0d\x1a\x02\xc5\x5c\x30\x2d\xd7\xb8\xc5\xd6\xb3\xf5\
+\x72\xbd\xb9\x18\x7d\x7b\x99\x5e\xa3\xb2\xe3\xb7\xf5\x66\x5e\x6c\
+\xea\x2e\x97\x5e\x9d\xae\x35\x14\x09\x17\x01\x05\xa8\x9a\xd7\xbf\
+\xfd\xab\x98\xed\x76\xeb\x65\xb1\x99\xae\xe4\xc2\x49\x55\x3d\x57\
+\x1b\x28\xd8\x50\xfb\xdd\x62\x5e\x0c\x75\x34\x5a\x21\xc7\x6b\x36\
+\x1a\xec\xdd\x5e\x4f\xe7\xeb\x4f\x17\x23\x7d\xd8\xf9\x69\xb1\x42\
+\xc7\xa4\xd2\x6d\x32\xa6\x37\xbd\x1a\x51\xeb\x7b\x20\x3b\xda\xeb\
+\x53\x23\x27\x28\x14\x57\xed\xdb\xeb\xf5\x27\xb9\x96\x8b\xd1\xe5\
+\x74\xb9\x2d\x0e\xd7\xfb\x63\xbd\xbe\xb9\x18\xc5\xdc\x3a\x6d\x95\
+\xb2\x87\xdd\x33\x70\x88\x75\x0e\xfe\x53\xe4\x5e\x27\xae\x8f\x29\
+\x8f\xf2\xea\x75\x56\x07\xfd\x3c\x20\x82\xaa\xab\x05\xc3\x61\xd7\
+\xcd\xf4\xf3\xe2\x66\xf1\x47\x31\x1f\x18\x32\xbb\xdb\x40\xb7\x76\
+\x93\xe5\xf4\x4b\xb1\xe9\x10\xb4\x52\xc7\xd7\x7f\x9a\x4c\xb2\xbf\
+\x16\x2b\x20\xb4\x5b\x6f\xce\xb3\x9f\x7f\x2f\x76\xb3\xeb\xcc\x84\
+\x5c\x67\xdf\x19\xcf\xda\xbf\xca\x26\x59\xcb\xde\xfc\xb6\xbe\x2e\
+\x6e\x16\xd3\xca\xd2\xe7\xb0\xbf\x67\xdb\x72\xce\x64\x92\x16\x4c\
+\x0a\xbc\x17\x73\xfa\x48\x9a\xdc\xa8\xab\xea\x8d\x9e\xbf\x9e\x17\
+\xdb\xd9\x7e\xbc\x7c\xc2\xf0\x30\x7a\xf3\x4e\x4c\x7c\x31\x87\xf1\
+\xda\x5d\x57\xe7\xca\x41\x11\xf4\x57\xd3\x2e\xb7\xed\x69\x97\x5b\
+\x62\xda\x5b\x86\xe9\x7c\x31\x5d\xfe\x55\xfe\xc3\xf5\xd7\xbc\x13\
+\x84\x62\x1e\x9d\x89\xae\xc6\x00\x8d\x90\x6d\xa4\xdc\x29\x65\x3c\
+\x35\xad\x97\x43\x43\x2f\x07\x87\x6e\x64\xa4\x8f\x3e\xda\x60\x9a\
+\xc6\xab\x6a\xeb\x5f\xa0\xfa\x5b\xb1\x29\x30\x9e\xb3\xe9\xb2\xf8\
+\x0e\xd3\x59\x43\x07\xf4\x58\xe5\x8e\x34\x7b\x6d\x60\xf4\xea\x69\
+\x72\x2d\xdd\xb3\x4f\xa8\xb7\xe6\xaf\xab\xc5\x0e\xbe\xe7\x6e\x5b\
+\x6c\x7e\x16\x6b\xff\xbf\xab\x5f\xa1\xac\x8d\xd1\xd8\xee\xd6\xb7\
+\x7b\x6b\x25\x9f\x26\x35\xcd\x55\x7a\x8d\xf6\xbd\xeb\xcb\xcb\x6d\
+\x01\x6e\xa8\x3f\xb7\x1a\x93\xa5\xc7\x34\xd2\x5a\xb5\xcc\xd6\xa3\
+\x16\x4e\xbd\x3d\x66\xb7\xb7\x24\x75\xdf\xa6\xba\xd9\x14\x16\xaf\
+\x23\x8c\x07\xd1\xf5\xb9\xb2\xd4\xb8\xa8\x1a\x5e\x22\x9b\x2b\xe3\
+\x42\x07\xdd\xfe\xd0\xcb\xa1\xa1\xb8\x3a\x5d\xd2\x36\x86\x87\xd1\
+\x15\x54\xed\x51\x38\xf5\x4b\xc2\x69\x5f\x02\x4e\xff\xf5\x70\xc2\
+\x9c\x06\x32\x41\x77\xd9\x8a\x56\x07\xda\xa8\x2e\x5b\xfb\x63\x2f\
+\x07\xc7\x6e\x04\x7a\x6d\xac\x0b\xa7\xd0\x15\xd1\x8a\x73\x2a\x92\
+\x0f\x63\xc4\xb8\x6c\x55\x0c\x7c\x14\x5f\x7e\x41\x7c\xf9\x25\xe8\
+\xca\x4f\xa0\xab\x86\x89\x25\x1b\x6c\x07\xde\x68\x72\xe3\x80\xa4\
+\xef\xc0\xdb\x1b\x7a\x39\x38\x34\x19\x63\x0a\x1c\x4e\x61\x2b\x6c\
+\xb1\x81\x01\x08\x41\x6c\xb1\x0a\x58\xc7\x1d\xb7\xc5\x7d\x85\xf9\
+\x0f\x82\xfb\x12\xe4\xe5\x27\x90\x17\x88\x29\x6b\xb4\xed\xda\xe2\
+\x18\x73\xf1\xa9\x64\x0f\xd1\x3d\x18\x7b\x39\x38\x16\xd7\xc7\x80\
+\x0a\x8d\xb6\xef\x17\x07\xf0\xf5\xa4\x2c\x73\x14\xab\x1c\xa0\x29\
+\x3a\x1c\x85\xd7\xbe\x20\xbc\xe6\x25\xb8\x6b\x1e\xe4\xee\x72\xb1\
+\x2a\xa6\x9b\x43\x78\x3f\xd3\xc5\xc8\x50\xce\x3e\x18\xda\x73\xe2\
+\x0b\x5a\x89\x73\xcb\xae\x6d\x6f\x3f\xeb\x8b\xd1\x84\x73\x58\x5b\
+\xdd\xf6\xab\x5f\xd0\x4c\xc0\xd7\x2b\xc0\xde\x01\xa5\xbb\xe5\xc4\
+\x3d\x8c\xb3\x44\x52\x80\xd9\x92\x83\x91\x46\x70\x4e\xac\xdc\xab\
+\x67\xc4\xf2\x3d\xbf\xf7\xef\x3e\x3c\x02\xcb\x53\xa9\xfa\xa3\xbc\
+\xde\x3d\x0a\xb1\x36\x21\xbb\x92\x3a\x05\x31\xa3\xa2\xf2\xdc\x45\
+\x2c\xe6\x6c\x75\x74\x07\x88\xd9\x9c\x63\x80\xb7\x8b\x1d\xc4\xd8\
+\xe4\x01\x44\xb5\xe1\x18\x62\xfe\xe5\x11\x0b\x21\xbc\x6d\xf9\x8a\
+\x07\x11\xb3\xa7\xb2\xcf\x5a\xeb\x2d\x3f\x06\x31\xab\xbf\x1e\x31\
+\xf6\xb9\x55\xde\xb9\x0e\x60\x08\x50\x95\x47\xe8\xea\x0e\x28\x86\
+\xec\x12\x9a\xd7\xba\xea\x44\x31\x0d\x74\x4d\x50\x47\x01\x3b\xc1\
+\x55\x8a\x01\x45\x36\x44\x8a\x04\xb0\x68\xa3\xf1\xfa\x39\x01\xfb\
+\x90\x5e\x8f\x00\xec\x54\x8a\xf5\x16\x7e\x82\xb9\xb4\x4f\x20\x1f\
+\x80\x50\x9e\x8c\x89\x1d\x2c\x1d\xe7\x08\x28\x8d\xf3\x1d\x2c\x07\
+\xc6\xa2\xd5\xc2\x5a\x3a\x56\x91\x8f\x41\x19\x1f\x86\x12\x71\x2c\
+\xbc\xaa\x56\x06\x5e\x31\x5a\xed\xb5\xe5\xf8\x92\x50\xba\x53\xb9\
+\xf7\xc3\xdb\x1f\xde\xff\xe0\x1e\x03\x98\x7b\x0a\xf7\x6c\x1e\x10\
+\x14\xfa\xd0\xb5\x96\x1e\x36\xb4\x55\x2b\xab\x00\x13\x23\x06\x52\
+\xea\x0e\x60\x5a\x21\x7c\x51\xba\x55\x2a\x18\x00\x8c\xd4\x29\xe4\
+\x33\x56\x63\xa1\x10\xc7\x3a\xd7\x92\xc7\xe9\x67\x45\x4c\xff\xc8\
+\x86\x87\x04\x7b\x9f\x58\x4f\x25\x9f\xd7\xf1\xc3\xa0\xe3\xbc\x1f\
+\xb1\xa7\x50\xcc\xe7\x10\xb7\x32\xdd\x88\x04\x28\x68\x6f\x14\x87\
+\x43\xc4\x82\x62\xd3\xca\x16\x05\xb1\x80\xd8\xd2\x13\x1d\x07\xec\
+\x84\xc0\x13\xc4\x0a\x92\x4e\x24\xf7\xa6\x60\xaa\x8d\x7b\x51\x8a\
+\xf9\x53\x29\xf6\x9c\xd6\xd2\x3f\x81\x7c\x80\x32\x90\x6a\x27\xf3\
+\x09\x4a\x9b\x5b\xa7\xe0\x11\xbb\x50\xf6\xc7\x6a\xc9\x02\xb5\x61\
+\x82\xdc\x8f\x62\xd9\xaf\xc6\x0c\x98\x4b\x02\xdd\xad\x21\x98\xcb\
+\x60\x3d\x81\x89\x2f\x8b\xe5\x4b\x78\x3e\xff\x04\x5a\x5a\xb8\x2d\
+\x45\x3e\x74\x69\x69\xe0\xf9\xac\x25\xc3\x1d\x2c\x81\xb0\x73\xb0\
+\xa3\x5d\x43\x2a\x63\x25\xf8\x38\x1a\xc4\x50\xbf\xf2\x32\xc0\xcb\
+\x10\x34\x16\x4a\xd5\x1c\x62\x44\xbd\xda\x3e\x27\x96\xf7\xda\xbb\
+\x7b\xc4\x1a\x4e\xe5\xa5\x8e\xf6\xc7\xb7\xef\x1f\x83\x58\x78\x02\
+\xfb\x60\x47\x35\x82\x92\x56\x54\x22\x88\xb1\xcb\x85\x65\xad\x84\
+\x4f\x10\xb3\x9c\xeb\xe0\xa4\x0a\xd4\x89\x55\x94\x14\xe3\x9c\x37\
+\x47\x11\x3b\xa9\xfe\x86\x24\xc4\x18\xb6\x11\x88\x69\x84\xb2\xe4\
+\x9e\x15\xb1\xc7\xb2\x2f\xbc\x04\xfb\xc2\x53\x9c\xa2\xc9\x15\x43\
+\x68\xd4\xc1\x92\x1c\xcc\x63\xa0\xd8\x0d\x63\x34\x92\x05\x1f\x39\
+\x1e\xa4\x10\xbd\xb1\x43\x58\xf6\x6b\x27\x43\x39\x44\xca\x1b\x8c\
+\x05\x96\x3e\x78\x24\x98\xf4\x9c\x58\xde\x9b\x4d\xdf\x23\xd6\x78\
+\x2a\xfb\xde\xea\xb7\xba\x55\x4f\x3c\x01\xb1\xf8\x14\xdf\xc7\x79\
+\x40\x7e\x17\xbb\xec\xd3\xc2\x33\x1d\x5a\xe9\x5d\x62\x5f\xce\x14\
+\x10\x11\x76\x11\xc3\x58\x42\x9e\x1a\x8e\xd6\x55\xe8\xa4\xc2\x8a\
+\xf1\x36\x5a\x17\x34\x02\x4f\xe4\x7e\x8a\x5f\xd6\xf7\xc5\xe7\x62\
+\x5f\xae\x23\x43\x3e\x8f\x4a\xe4\xe3\x53\x58\xe8\x24\x76\x08\xd6\
+\x76\x31\x0d\x52\xdf\x8c\xbe\x1b\xcf\x68\x89\x33\xd4\x01\x09\xfb\
+\x43\x87\x20\x3d\xa9\xf2\x62\x4d\xb4\x50\x30\x31\xa8\x60\xb5\x35\
+\xee\x59\x13\x79\xf5\x8e\xde\xf3\xe9\x95\x17\x56\xcf\x15\x9a\x7e\
+\x05\xa4\xac\x9e\x40\x53\xb9\x21\x81\xdc\xee\x20\xa1\xd7\x06\x94\
+\x91\x04\xad\x03\x29\x63\x6c\x90\xdc\xbd\x8b\xa9\x8c\x45\x16\x72\
+\x3c\x44\x3d\xa9\x38\xf3\xef\xa5\xe9\x23\x6b\xd9\xac\x5e\xe0\x56\
+\x05\xab\x27\xd0\x13\x01\x0f\x79\x84\x85\x5d\x7a\x4a\x88\xe8\x10\
+\xfa\x76\x43\xd4\x81\xb1\x29\xdd\x00\xa7\x34\x3f\x10\xf0\x9c\x56\
+\x9d\x71\x06\x7a\x25\xf7\xa4\xe0\x8a\x1d\x0c\x41\x78\x41\x27\xc9\
+\x74\x2a\x3f\x7b\x0b\x3f\x01\x4b\x3a\xce\x4b\x79\x0c\xe4\x72\x9b\
+\xde\x5d\x7d\xd3\x4c\xfd\xbf\xe9\x55\xd1\x3c\x2d\xb1\xdd\x7d\x59\
+\x16\x17\xa3\xcb\xc5\x72\x79\xbe\x5a\xaf\x8a\xef\xe5\xdd\x64\x73\
+\xb7\x2c\xce\x8b\x8f\xc5\x6a\x3d\x9f\x7f\xbf\xdd\x6d\xd6\xbf\x17\
+\x65\x6f\xf9\xbe\x7c\x98\xe8\xbc\x5e\x63\xb7\xc7\xe6\x66\xba\xdb\
+\x2c\x3e\xa7\xbc\xde\x48\xe5\xda\x8f\x15\x7e\xa0\x20\xca\x5a\xb6\
+\x8c\xf7\x13\x95\x2b\x70\xdc\x91\x64\xfa\xd5\xd1\xaf\xda\xba\xd0\
+\x7e\xf8\xa6\x6e\xef\xef\x40\x69\x61\x95\x9e\x38\x80\x42\xc9\x3e\
+\x13\x23\x9f\x28\x05\x4b\x0d\x10\xb7\xd3\xdd\xf5\x5e\x72\xf2\x7c\
+\x5c\xc6\x7a\x6c\x5d\x36\xcb\xd4\x98\x11\x15\xb0\x57\x21\x9b\x78\
+\x24\xaf\x6c\x8c\x19\xbb\x0c\x0e\x5f\xfe\x0d\x79\x60\x67\xad\x1b\
+\xab\xd4\x32\xd1\xb9\x43\xf8\x1e\x75\xf9\xc9\x61\xf6\xa4\x99\xde\
+\xcc\x46\x7b\xd9\xdb\x9a\x8d\x86\x66\x6e\x5a\xfa\x8f\x03\x28\xe5\
+\x88\x96\x99\xda\xcd\xcd\x83\x49\xeb\xd5\xaa\x98\xed\xd6\x9b\xc9\
+\xec\x6e\xf3\x71\xba\xbb\xdb\x14\x5d\x15\xa9\xf0\xab\xd4\xe7\x5c\
+\x21\xa0\x49\x10\x9e\xdf\x6d\x96\xdf\x7d\x7b\xf8\x88\xcc\xab\x16\
+\xbc\xc0\xf3\x8f\x62\xb3\x6e\x6b\x6d\x4f\x58\x3f\x65\x5a\x8d\xad\
+\xcf\x6d\xf6\x2e\xbd\x0b\x39\xeb\x00\xd6\x65\xe4\xab\x6b\x1f\xdb\
+\x98\x91\x49\xff\xaa\xf2\x2a\x49\x3e\x84\xd6\xd8\x50\xae\x80\xff\
+\x5c\xee\x3c\x59\xcf\xed\xb1\x2e\x4d\x17\x3c\x6a\x71\x42\x66\x4e\
+\x6e\x34\x97\x43\xa5\x32\x64\x07\x65\xe6\x7c\xab\x68\xf1\x24\x99\
+\xe9\xfb\x45\xa6\x1f\x12\xd9\x7a\xf9\xe5\x6a\xbd\x1a\x38\x9d\xa2\
+\xf6\x9e\xb7\xeb\xc5\x4a\x2c\x11\x5b\x29\x4c\x7a\x07\xa5\x70\x99\
+\xb6\x63\x24\x8b\xd1\x68\x6d\x62\x86\xc8\xc5\x8b\x69\x34\x63\x43\
+\x19\xc7\x31\x83\x28\xd6\x23\xc0\xcd\x8e\x1d\xfd\x08\xda\xfc\xc0\
+\xd1\xaf\xba\x87\xbe\x72\xa1\x55\x30\x1a\xe4\x1c\x68\x6c\x94\x37\
+\x15\xa7\x93\x4f\xa2\x38\x9e\x48\x2d\x42\x79\x70\x7d\x42\x52\x42\
+\x74\x48\xfe\x8a\x89\x79\xd5\x7e\x92\xb4\xab\x59\x15\x11\x9d\xa9\
+\xd6\x10\x05\xe1\x88\x3c\x38\x54\xb4\x54\x08\x02\x20\x9f\x89\xcb\
+\x3d\x74\xc0\x81\xb0\x70\x1b\x12\xd5\x83\x7d\x16\xf6\x43\x47\x51\
+\x9d\xa6\x0d\xaa\xc6\x16\xdb\x26\xae\x56\xfd\xc2\x58\x8b\xe3\x39\
+\xdd\x6e\x6b\xe6\x24\xfa\xa6\x6d\x7c\xd6\xec\x52\x77\x43\x99\x0f\
+\x67\x40\xa5\xcb\x4d\xa2\x50\xba\x39\x43\xb3\x47\xef\x58\xb1\xa3\
+\xb3\x1d\xad\xb5\xdd\x8e\x93\xf5\xf6\x91\x6c\x37\xc7\xf1\xbf\x0f\
+\x15\x6b\x73\xef\xbc\x31\x2c\x14\x26\xe6\x10\x4b\x63\x29\xf5\x3d\
+\x6b\x2c\x67\x10\xac\x77\x86\xbd\x95\x20\x8a\x94\xe6\x28\x40\xc1\
+\xd7\x1b\xc5\xad\x26\xce\x0d\xfc\x56\x92\x57\xdd\x6d\xc4\xfa\x47\
+\x83\x60\xce\xb5\xdb\x9a\x39\x4a\x34\x28\xed\xa2\xb3\x66\x93\x7d\
+\xf7\xc0\x8c\x6a\x93\x64\x33\xea\x23\x54\x5b\xf8\xac\x7f\xa8\xfb\
+\x20\xf1\xfc\x7c\x90\x1c\x31\x26\xf6\x41\x44\xae\x0e\xcf\x77\xe5\
+\x3c\xc7\xce\x86\x2d\x5e\xa6\xb7\xcb\xe9\x2e\x45\xb6\x64\x38\x5a\
+\x5c\x3c\x07\x28\xa2\x6f\xb3\xef\x70\xdd\x7a\x65\x6b\xbb\x97\xdd\
+\x59\x7b\xb3\xde\xc9\xc2\x13\x03\x98\x75\x6e\x9c\x43\x06\x34\x4e\
+\x75\x7f\xad\x0f\x97\x1f\x50\xa5\x4a\x9d\x7e\xca\x24\x0c\x8c\x4a\
+\x1b\x31\xe9\x1a\x84\x23\xd6\xe2\x4d\x38\xf7\x0c\xab\x97\x4a\x1c\
+\xc1\x28\xc7\xd1\x67\x2a\xf7\xf5\x58\x29\x60\xc3\x1e\xd8\x76\x5b\
+\xcc\x43\x50\x16\x17\x99\xd4\x51\xca\x35\x11\xba\x62\xa1\x29\xd6\
+\x47\x2d\x77\x5d\xc7\xf0\x33\xc8\x2a\x10\x0a\x02\x7b\xb0\x55\x93\
+\x34\x46\x38\x22\x85\xb7\x36\xfb\x98\x19\x08\x0a\x9e\xc7\x98\xb4\
+\x06\x74\x4c\xfb\xc0\xb2\x04\xa6\x31\x86\x60\xd9\xa8\x39\x80\xbd\
+\x38\x81\x81\x53\x76\xb1\x6a\x12\x5d\x53\x5e\x21\xda\x80\xae\x55\
+\x9d\x21\x69\x22\x62\x4f\xf8\xaf\x7d\x53\x3d\xfe\xef\x19\x45\x5c\
+\xb2\x42\xca\x91\xbc\x9b\xb7\x36\xb2\x68\x38\xd4\x4d\x51\x73\x42\
+\x31\x31\x3a\x20\x40\x32\xad\xa6\xfd\x99\x53\x5c\x83\xa3\xc1\xee\
+\x46\xa1\x5e\x34\xca\x46\x98\xaa\x20\xd7\x1f\x10\xf0\xa4\xe0\x05\
+\x81\xb0\xd6\x32\x0d\x5e\x33\x6a\x07\x11\xff\x1d\x06\x0b\x32\x74\
+\xe0\x4b\xb6\x4c\x9c\xd5\x1a\xe2\x1a\xcb\xd3\x7f\x08\x4d\xc8\x65\
+\xd7\x19\x56\x56\x36\xd8\xec\x7f\x5a\x28\xed\x67\xfd\x73\x74\x08\
+\x68\x43\x18\x13\xa9\xdf\xf9\x08\xd2\xb4\x88\xb3\x27\xcb\xe1\xf3\
+\x2c\x03\x64\xa9\x63\xd1\xa1\xf1\xfe\x55\x37\x3a\x55\xd5\xd3\xa8\
+\xd1\xd4\xed\x32\x01\x27\x3c\xdf\xac\xef\x56\xf3\x76\xe3\xbf\xe0\
+\x9c\xcb\xd6\x0e\x1b\x8f\x2b\xb6\x03\x6a\xd6\x6b\x1b\x44\xa4\x10\
+\x9d\x09\x49\xad\xa1\xd2\x96\x22\x9c\x38\x54\xca\x20\x82\x09\xa2\
+\x5c\xc8\x73\x15\x31\xd4\x53\x6c\x95\x68\xcb\xbe\xad\xab\xd5\xb0\
+\x67\x88\x9c\x75\xd2\x6a\xa0\x8f\x38\xc1\x8e\x5d\x6e\x89\x90\xff\
+\x5a\xe8\x18\x82\x4c\xd6\x51\x88\xa8\x60\x24\x45\x75\xa5\x4e\x81\
+\x28\x4b\xcc\x9e\x36\xc4\x56\x5a\x02\x14\x58\x27\x63\xe0\xd9\x58\
+\x18\x5b\x34\x45\x85\x3f\x3c\x4e\x1e\x3a\xb2\xeb\x71\x81\x72\xe8\
+\x31\x4b\x38\x96\x7b\xe4\xc5\x26\xc8\x59\x3c\x93\x5c\x12\x4c\x2c\
+\xd5\x9f\xa1\xb9\x1a\x5a\xed\xa2\x13\xcb\x5e\x75\x46\x51\x6b\x0b\
+\x2d\x34\xbe\xd5\xd4\x4c\xe8\x32\x41\x89\x14\xc4\x13\x58\xd8\x66\
+\x39\xae\x94\xd0\x29\x45\x0f\x0a\xfa\x1f\xa8\x3e\x6e\x15\x4f\xc8\
+\x69\x59\x4a\xab\xd6\x25\xfa\xc8\xf3\x30\x8a\x1b\x61\x08\x3f\x2c\
+\x2e\xc4\x86\x56\x53\x4b\x3e\xc2\xd1\xe0\xc1\x39\x03\xd7\x85\xd9\
+\x5a\x25\x96\x5a\xb9\x3f\xcd\x81\x82\x78\xaa\x00\x0a\x6b\xf8\x15\
+\x00\x04\x41\x47\x12\x53\x01\x37\x68\x41\x0a\x2d\xe2\x91\xa4\x45\
+\x19\x91\x31\xc3\x50\x59\xf2\xd2\x42\xc6\x88\x0c\xe4\x46\x8c\x62\
+\x97\x9a\x00\x63\xb4\x72\x03\x0c\x16\x40\x03\xa7\x41\xe6\xe9\x72\
+\x41\x96\x73\x94\x4b\xc2\x39\x69\x69\xf2\xd6\x89\x45\x84\x64\x44\
+\x9d\x24\xd8\xc9\x91\x2a\xb3\x09\xa9\x49\xec\x47\x8b\xb4\xef\x24\
+\x8a\x26\xd8\xe3\x80\x10\x19\x6b\x6b\x56\x2a\x66\x11\xe8\x79\x68\
+\xa3\x97\x36\x44\x2b\x30\x4a\x68\x93\xdb\xba\x48\xc5\xa5\x4d\xc7\
+\x00\x13\x03\xca\x23\x18\x0f\x04\xd7\x07\x0d\x34\xc1\x04\x17\x45\
+\x7f\x5d\x6e\x80\x3d\x41\xa9\x01\x98\x0e\xe8\x16\x43\xa5\xa3\x92\
+\x67\xc0\xa1\x75\x11\x2a\x1b\x35\xb5\x94\xff\x24\x7b\x61\x95\x7d\
+\x2e\x7b\x71\xc4\x02\x84\xc7\x59\x80\x93\xb9\x7e\x93\x95\x0f\xbb\
+\x13\xa4\x6a\x61\x62\x01\x12\xf4\xaf\x15\x13\x49\x88\x99\x43\x9b\
+\x9c\xa1\x3a\xd6\x08\x02\x3c\xc2\x17\xc9\x67\xf6\x4d\x04\x4b\x0e\
+\xee\x78\x89\x89\xaa\x6e\xdf\x8e\x89\xf6\x6d\xcd\x9c\x7d\x4c\x84\
+\xb4\xa9\xdc\xa4\x15\xff\xf4\x26\x20\x74\xdd\xef\xd1\x9c\xa0\xd9\
+\xe1\xf0\x4c\x87\x21\xd1\x01\x6a\xfe\x59\xad\xbc\x3c\x6d\x36\x0d\
+\xf6\x71\x66\x3d\x1e\x80\x4a\x27\x62\xb9\xc1\xe1\x86\xae\x4c\xda\
+\x1d\x4c\x48\xef\xa4\x03\xb1\x0f\x58\x0f\x1f\x2c\x37\x41\xe5\xe9\
+\x78\x85\x04\x9f\xbd\x54\x36\x60\x18\x5e\xf5\xe6\xa7\x2f\xc2\x58\
+\x15\x0c\x78\xd1\xeb\xfc\x92\x6e\x1a\x59\x15\x41\xe6\x5e\x67\xfd\
+\xb5\x43\xf8\x7c\x8e\xce\xf6\xa9\x52\x7f\x33\x8b\x05\xc7\xd8\x7e\
+\x1e\xbf\x7e\x6d\x3e\x4b\x19\xce\xcb\x5d\x29\xd7\xef\xed\xc7\xa8\
+\x30\x39\x4e\x39\xfa\xfe\x5e\xef\x4b\xea\xa1\x58\x55\xca\x4b\x57\
+\x9d\x8f\x7d\xfa\x94\xe4\x81\x7d\x76\x81\x9d\xd8\x0a\x47\x21\x52\
+\x8a\xdb\xa3\xa7\x80\x90\x05\xc6\x0c\x91\x97\x83\x9f\x11\xc7\x80\
+\x73\xb9\x14\x28\x1a\x58\xae\x20\xae\xc1\x13\x07\x2f\xe6\x0f\x31\
+\x8d\x11\x47\xc6\x11\xe6\x49\x14\x5a\x91\xd8\xe1\xa5\xcc\xf2\x3a\
+\x20\x2b\xe5\xdc\xc9\xf7\x85\x74\xe9\x62\xe0\x44\x65\x25\x03\x4b\
+\x8a\x04\x46\xcc\x35\x7c\x92\x30\x21\xc8\xc3\x61\x54\x5a\x6b\x2c\
+\x25\xcf\xe9\x91\x05\xce\x54\x1a\x6b\x58\x42\xf2\xf2\xfc\x90\x45\
+\x90\x43\x5c\xda\x6a\x8d\x38\x52\xa5\x83\xc5\x68\x11\x95\x8a\xad\
+\x56\xde\xa7\xf5\x40\x2c\xef\xa2\x70\x5b\xbe\x8f\x45\xf2\xcd\x16\
+\x58\x43\xd2\x01\x36\x96\xe0\x6f\x62\xa2\x1b\x7a\x25\x18\xf0\x95\
+\xed\x67\x88\x3f\xf9\x40\x70\x90\x8d\x34\x39\xa3\x53\xbe\xa9\xd2\
+\x63\x14\x2a\xb5\x05\xc4\xb5\x30\xb1\x93\xd6\x8a\xc8\x55\x8d\x45\
+\x10\x6a\xc6\x04\x03\x0e\x5b\x1c\x0f\xe1\xde\xd3\xd7\x1f\x2a\xf9\
+\xe3\xc8\xfb\xb0\xc1\x25\x7a\x92\xc5\xbd\x57\x61\x10\x4b\xc3\xff\
+\x1b\x09\x98\x90\xca\x48\x78\x54\x8a\x2d\x28\x1f\x95\xb8\x5c\x04\
+\x10\xf0\xd1\x10\xb9\x43\xcc\x91\xf4\x03\xfa\x0c\x05\x49\x11\xb2\
+\x91\x07\x89\x92\x63\x05\x44\x86\x05\x57\x03\xd4\xad\x3c\xc9\x87\
+\xd8\xdc\x79\x38\xc0\x94\xd2\x02\x30\x1d\xbd\x00\x46\xda\x48\xbd\
+\x41\x32\x14\xb0\x3c\x01\x0d\x95\x34\xd2\x80\xb4\x2a\xc8\x96\xc8\
+\xae\x1c\x73\xd2\x37\x38\x5a\xe4\x26\x49\xdf\x74\x24\x5f\xea\x1b\
+\x05\x2f\x8e\x1f\xf6\x02\xde\x34\x05\x0c\x72\x36\x99\x28\x5f\x8b\
+\xe1\xa4\x45\x92\xa2\xa5\xaf\xb3\x59\x13\x7c\xa9\x6e\x24\x3e\x56\
+\x32\x54\x38\x5b\x8c\xc3\x5a\x5a\x9e\xf7\x80\xd6\x48\xf4\x46\xc8\
+\x70\x08\x91\x08\x7b\x25\xdf\xbe\xd0\xf2\x55\x2c\xa8\x01\x7c\x2e\
+\x6b\xaf\xf6\xd7\x28\x9e\x01\x91\xa5\x4b\x35\x49\x49\xd1\xa2\x5c\
+\x5d\x24\x5c\xb5\x04\x35\x89\x74\xdc\x92\x0d\x12\x05\x58\x31\x28\
+\x70\xaa\xeb\x25\x9f\x6f\xc1\xce\x00\xef\xce\x3a\x23\x44\x4f\x04\
+\x33\x46\x49\xfe\x88\x59\x90\x9b\x0d\x61\xf2\xcf\xec\x26\xc3\x4a\
+\xd0\x7a\xa4\xe9\x1e\xdc\x00\x3a\xbe\xd2\x70\x9b\x34\xd6\xc8\x85\
+\x41\xc8\x94\x24\x02\x13\x60\x09\xc1\x8c\x49\x4b\x49\x98\xe7\xa4\
+\x40\x00\xef\x25\xb1\x08\x38\x8f\xad\x25\x94\x43\x34\x95\x9c\xa2\
+\x0d\x52\x7b\x80\x3c\x90\x33\x82\x9f\x55\x8c\x89\xb0\x04\x78\x12\
+\x62\x33\x28\xb8\xb4\x49\xf0\x1d\x5d\xcf\x91\x35\x3c\x68\xdf\xd3\
+\x7f\x02\x0f\x5a\x35\xb7\x08\x18\x60\xb5\x8e\x58\xcf\x07\xca\x86\
+\x1d\xdb\xd9\x7e\xdb\xab\xc9\x19\xd6\x47\x6b\x72\x20\x05\x1b\xd8\
+\xa2\x74\x1f\x04\x9a\xc0\xa2\x93\x22\xbd\xa1\x66\x0b\x35\xf1\x31\
+\xca\xdd\x2f\xa4\x8e\xf8\xe9\xe4\xf1\x3d\x97\x59\xbb\x4b\x04\xd2\
+\xe1\xbe\x12\x44\xe5\x2a\xa5\x12\x05\xcf\x84\xa8\xd1\xc3\x76\x49\
+\x59\xb8\xf3\xfd\x3e\x79\xc9\xb7\x76\xe5\x59\x22\xa9\x2d\x75\x2b\
+\x1a\xf2\xf5\xb3\xee\x06\xf5\x97\x95\xa1\x5c\x16\x0a\xe1\x3a\x9d\
+\xb5\x37\xd4\x5d\x47\x29\x2e\x50\xbc\x09\xf8\xaa\xc3\x50\x89\xe6\
+\x7e\xb4\x86\x2a\xa5\x75\x4c\xf2\x2d\x32\x83\x4b\x37\x3b\x08\x42\
+\x52\xe1\x12\xfa\xfd\xb5\xa9\xe5\x11\x59\x47\xfd\xb0\xac\x91\x2f\
+\x21\xc1\x3a\x2e\x6c\x9d\xbe\x98\xa0\xd9\xf4\x64\x1d\x07\x65\x6d\
+\x90\xa7\x98\x6e\x49\xbd\x25\x6b\xee\xc9\x5a\xca\x21\x70\x86\x4c\
+\x43\xb2\x6e\x17\xa8\x8f\x39\x10\x73\x18\xdd\x95\x82\x75\xc6\x7e\
+\xb5\x64\x07\x8a\x9a\x3f\x65\xf2\x6d\x1b\xe4\xac\x52\xbb\x91\x6a\
+\x8a\x12\x97\x2d\xe9\xb8\xb7\x01\xa1\xbc\x4b\xf5\x2d\xfc\x85\x48\
+\xad\x58\x3e\x64\x9c\x68\x43\xca\x83\x78\x6e\x8c\x3c\x19\x09\xa7\
+\x2e\xf3\x64\x58\x55\x24\x62\x31\x05\xd0\x48\xad\x75\x2a\x32\x86\
+\x40\x24\xa4\xd2\x52\xaf\x97\x32\x8e\x05\x6f\x61\x49\x93\x83\x27\
+\xc4\x32\x12\x0a\xa4\xf2\x51\x42\x0d\xc6\x5b\x1e\x46\x11\x9b\x0a\
+\x36\x38\xf8\x2f\x8f\xf0\x32\x88\x77\x93\xb6\x88\xd0\x86\xc4\xfc\
+\x2b\xad\xd0\xeb\x24\xd3\x1b\x68\x6d\x5d\x52\xeb\x6d\x37\x09\x6b\
+\x6e\x2f\xc1\x37\x3c\xb5\xc2\x79\x3f\x7d\x86\xca\x9a\x0d\x7d\xaa\
+\x98\x7f\x00\x65\xd8\xfe\xe7\xe7\x8f\x0e\xca\x3c\xc8\x1f\x8d\x10\
+\x10\xa9\x1a\xac\x05\x82\x33\xb6\x62\x17\x1f\xc1\x1f\x63\x86\xf8\
+\xc3\x83\xc3\x6b\xfe\x50\xdf\x56\x49\xe1\xc0\x11\x1f\xf4\xf4\xf8\
+\x73\xcc\xcb\x0c\x95\xc8\x4e\x36\x33\xea\x61\x31\x95\x55\x1e\xc2\
+\x21\xc4\x6a\xdf\x23\xa7\x20\x91\x0e\xc3\x12\x9c\x26\x27\x53\xea\
+\xaa\x0f\xa7\xca\x09\xf9\xac\x94\x91\xb4\xff\x7a\x39\xf9\xaf\x97\
+\x13\xc7\x87\x5d\x5f\x52\x27\x3d\x06\x49\x8d\x66\x64\x8b\x83\x62\
+\x02\xff\x07\xec\xeb\x7f\x5c\x9d\xb4\x3d\x22\xa7\xf0\x75\x77\x8c\
+\x0c\xb6\x66\xf9\x05\x0d\xb0\x3f\x72\x63\x57\x9e\x3d\x0d\x88\xe9\
+\x90\x97\xe1\x87\x33\x09\x5b\x11\xa2\x79\x89\x06\x19\x29\x92\x14\
+\xdd\x52\xcc\x1c\xb5\x4b\xc1\x36\xe1\x85\xac\x56\xac\x2b\xae\x5a\
+\xb3\x04\x2d\x48\x0a\xe1\x5c\x5c\x6a\x43\xf6\x98\x7e\x0f\x04\xf2\
+\x44\xa9\x7f\x94\x89\x55\x0c\xc8\xdf\xfc\x38\x56\xe5\x39\x2a\x53\
+\x27\xec\x23\x45\x73\xe8\xa4\xd6\xa9\xb4\x82\xd0\xd1\xb2\x4f\xa1\
+\xbd\x1c\x22\x25\x53\x36\xfd\xc8\x32\x08\x24\xe5\x97\x77\x48\x04\
+\xea\xab\xd3\xa2\x2d\xd8\x74\xff\x4b\x89\xe5\x65\x39\x93\x51\x36\
+\xdd\x61\xe2\x40\x86\x90\xb8\xa9\xce\x35\xdf\x63\x73\x8d\x55\xff\
+\x3e\x9b\x1b\x1f\xb8\xb9\x5b\xc7\x94\xd5\x9b\xf4\xdf\x6b\xf9\x05\
+\x3e\x6f\xbe\xf9\x7f\x7a\xad\x24\x5f\
+\x00\x00\x08\x7b\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
+\x6e\x6f\x22\x3f\x3e\x0a\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x64\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\
+\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\
+\x6e\x74\x73\x2f\x31\x2e\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\
+\x6e\x73\x3a\x63\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x63\x72\
+\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\x6e\x73\x2e\x6f\x72\
+\x67\x2f\x6e\x73\x23\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
+\x72\x64\x66\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\
+\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x30\x32\x2f\x32\
+\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\x74\x61\x78\x2d\x6e\x73\x23\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x76\x67\x3d\x22\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\
+\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\
+\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x6f\x64\x69\x70\
+\x6f\x64\x69\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x73\x6f\x64\x69\
+\x70\x6f\x64\x69\x2e\x73\x6f\x75\x72\x63\x65\x66\x6f\x72\x67\x65\
+\x2e\x6e\x65\x74\x2f\x44\x54\x44\x2f\x73\x6f\x64\x69\x70\x6f\x64\
+\x69\x2d\x30\x2e\x64\x74\x64\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x69\x6e\x6b\x73\x63\x61\x70\x65\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\
+\x6f\x72\x67\x2f\x6e\x61\x6d\x65\x73\x70\x61\x63\x65\x73\x2f\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\x20\x76\x69\x65\x77\
+\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x31\x32\x38\x20\x31\x32\x38\
+\x22\x0a\x20\x20\x20\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\
+\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\
+\x32\x34\x20\x32\x34\x22\x0a\x20\x20\x20\x76\x65\x72\x73\x69\x6f\
+\x6e\x3d\x22\x31\x2e\x31\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x73\
+\x76\x67\x31\x32\x33\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\
+\x64\x69\x3a\x64\x6f\x63\x6e\x61\x6d\x65\x3d\x22\x73\x61\x76\x65\
+\x2e\x73\x76\x67\x22\x0a\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\
+\x31\x32\x38\x22\x0a\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\
+\x31\x32\x38\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x30\x2e\x39\x32\x2e\x34\
+\x20\x28\x35\x64\x61\x36\x38\x39\x63\x33\x31\x33\x2c\x20\x32\x30\
+\x31\x39\x2d\x30\x31\x2d\x31\x34\x29\x22\x3e\x0a\x20\x20\x3c\x6d\
+\x65\x74\x61\x64\x61\x74\x61\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\
+\x22\x6d\x65\x74\x61\x64\x61\x74\x61\x31\x32\x39\x22\x3e\x0a\x20\
+\x20\x20\x20\x3c\x72\x64\x66\x3a\x52\x44\x46\x3e\x0a\x20\x20\x20\
+\x20\x20\x20\x3c\x63\x63\x3a\x57\x6f\x72\x6b\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x72\x64\x66\x3a\x61\x62\x6f\x75\x74\x3d\x22\
+\x22\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x64\x63\x3a\x66\
+\x6f\x72\x6d\x61\x74\x3e\x69\x6d\x61\x67\x65\x2f\x73\x76\x67\x2b\
+\x78\x6d\x6c\x3c\x2f\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x64\x63\x3a\x74\x79\x70\x65\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x64\x66\x3a\
+\x72\x65\x73\x6f\x75\x72\x63\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\
+\x2f\x70\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x64\x63\x6d\
+\x69\x74\x79\x70\x65\x2f\x53\x74\x69\x6c\x6c\x49\x6d\x61\x67\x65\
+\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x64\x63\
+\x3a\x74\x69\x74\x6c\x65\x3e\x3c\x2f\x64\x63\x3a\x74\x69\x74\x6c\
+\x65\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x2f\x63\x63\x3a\x57\x6f\
+\x72\x6b\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x72\x64\x66\x3a\x52\x44\
+\x46\x3e\x0a\x20\x20\x3c\x2f\x6d\x65\x74\x61\x64\x61\x74\x61\x3e\
+\x0a\x20\x20\x3c\x64\x65\x66\x73\x0a\x20\x20\x20\x20\x20\x69\x64\
+\x3d\x22\x64\x65\x66\x73\x31\x32\x37\x22\x20\x2f\x3e\x0a\x20\x20\
+\x3c\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x6e\x61\x6d\x65\x64\x76\
+\x69\x65\x77\x0a\x20\x20\x20\x20\x20\x70\x61\x67\x65\x63\x6f\x6c\
+\x6f\x72\x3d\x22\x23\x66\x66\x66\x66\x66\x66\x22\x0a\x20\x20\x20\
+\x20\x20\x62\x6f\x72\x64\x65\x72\x63\x6f\x6c\x6f\x72\x3d\x22\x23\
+\x36\x36\x36\x36\x36\x36\x22\x0a\x20\x20\x20\x20\x20\x62\x6f\x72\
+\x64\x65\x72\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x31\x22\x0a\x20\
+\x20\x20\x20\x20\x6f\x62\x6a\x65\x63\x74\x74\x6f\x6c\x65\x72\x61\
+\x6e\x63\x65\x3d\x22\x31\x30\x22\x0a\x20\x20\x20\x20\x20\x67\x72\
+\x69\x64\x74\x6f\x6c\x65\x72\x61\x6e\x63\x65\x3d\x22\x31\x30\x22\
+\x0a\x20\x20\x20\x20\x20\x67\x75\x69\x64\x65\x74\x6f\x6c\x65\x72\
+\x61\x6e\x63\x65\x3d\x22\x31\x30\x22\x0a\x20\x20\x20\x20\x20\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x3a\x70\x61\x67\x65\x6f\x70\x61\x63\
+\x69\x74\x79\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3a\x70\x61\x67\x65\x73\x68\x61\x64\x6f\x77\
+\x3d\x22\x32\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x77\x69\x64\x74\x68\x3d\
+\x22\x31\x30\x38\x33\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\
+\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x68\x65\x69\x67\
+\x68\x74\x3d\x22\x37\x33\x35\x22\x0a\x20\x20\x20\x20\x20\x69\x64\
+\x3d\x22\x6e\x61\x6d\x65\x64\x76\x69\x65\x77\x31\x32\x35\x22\x0a\
+\x20\x20\x20\x20\x20\x73\x68\x6f\x77\x67\x72\x69\x64\x3d\x22\x66\
+\x61\x6c\x73\x65\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\
+\x61\x70\x65\x3a\x7a\x6f\x6f\x6d\x3d\x22\x31\x2e\x37\x33\x38\x33\
+\x30\x34\x32\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x3a\x63\x78\x3d\x22\x2d\x31\x33\x2e\x30\x32\x37\x38\x39\
+\x36\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x63\x79\x3d\x22\x31\x32\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\
+\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x78\x3d\
+\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\
+\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x79\x3d\x22\x30\x22\x0a\x20\
+\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\
+\x64\x6f\x77\x2d\x6d\x61\x78\x69\x6d\x69\x7a\x65\x64\x3d\x22\x30\
+\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\
+\x63\x75\x72\x72\x65\x6e\x74\x2d\x6c\x61\x79\x65\x72\x3d\x22\x73\
+\x76\x67\x31\x32\x33\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x70\x61\x74\
+\x68\x0a\x20\x20\x20\x20\x20\x64\x3d\x22\x4d\x20\x32\x35\x2e\x31\
+\x31\x31\x31\x31\x31\x2c\x31\x34\x20\x43\x20\x31\x39\x2c\x31\x34\
+\x20\x31\x34\x2c\x31\x39\x20\x31\x34\x2c\x32\x35\x2e\x31\x31\x31\
+\x31\x31\x31\x20\x56\x20\x31\x30\x32\x2e\x38\x38\x38\x38\x39\x20\
+\x43\x20\x31\x34\x2c\x31\x30\x39\x20\x31\x39\x2c\x31\x31\x34\x20\
+\x32\x35\x2e\x31\x31\x31\x31\x31\x31\x2c\x31\x31\x34\x20\x48\x20\
+\x31\x30\x32\x2e\x38\x38\x38\x38\x39\x20\x43\x20\x31\x30\x39\x2c\
+\x31\x31\x34\x20\x31\x31\x34\x2c\x31\x30\x39\x20\x31\x31\x34\x2c\
+\x31\x30\x32\x2e\x38\x38\x38\x38\x39\x20\x56\x20\x33\x30\x2e\x36\
+\x36\x36\x36\x36\x36\x20\x4c\x20\x39\x37\x2e\x33\x33\x33\x33\x33\
+\x36\x2c\x31\x34\x20\x5a\x20\x6d\x20\x31\x36\x2e\x36\x36\x36\x36\
+\x36\x37\x2c\x35\x2e\x35\x35\x35\x35\x35\x35\x20\x48\x20\x38\x36\
+\x2e\x32\x32\x32\x32\x32\x32\x20\x56\x20\x34\x37\x2e\x33\x33\x33\
+\x33\x33\x34\x20\x48\x20\x34\x31\x2e\x37\x37\x37\x37\x37\x38\x20\
+\x5a\x20\x6d\x20\x32\x37\x2e\x37\x37\x37\x37\x37\x37\x2c\x35\x2e\
+\x35\x35\x35\x35\x35\x36\x20\x56\x20\x34\x31\x2e\x37\x37\x37\x37\
+\x37\x38\x20\x48\x20\x38\x30\x2e\x36\x36\x36\x36\x36\x36\x20\x56\
+\x20\x32\x35\x2e\x31\x31\x31\x31\x31\x31\x20\x5a\x20\x4d\x20\x33\
+\x36\x2e\x32\x32\x32\x32\x32\x32\x2c\x36\x34\x20\x68\x20\x35\x35\
+\x2e\x35\x35\x35\x35\x35\x36\x20\x63\x20\x33\x2e\x33\x33\x33\x33\
+\x33\x31\x2c\x30\x20\x35\x2e\x35\x35\x35\x35\x35\x38\x2c\x32\x2e\
+\x32\x32\x32\x32\x32\x32\x20\x35\x2e\x35\x35\x35\x35\x35\x38\x2c\
+\x35\x2e\x35\x35\x35\x35\x35\x35\x20\x56\x20\x39\x37\x2e\x33\x33\
+\x33\x33\x34\x20\x63\x20\x30\x2c\x33\x2e\x33\x33\x33\x33\x32\x20\
+\x2d\x32\x2e\x32\x32\x32\x32\x32\x37\x2c\x35\x2e\x35\x35\x35\x35\
+\x35\x20\x2d\x35\x2e\x35\x35\x35\x35\x35\x38\x2c\x35\x2e\x35\x35\
+\x35\x35\x35\x20\x48\x20\x33\x36\x2e\x32\x32\x32\x32\x32\x32\x20\
+\x63\x20\x2d\x33\x2e\x33\x33\x33\x33\x33\x33\x2c\x30\x20\x2d\x35\
+\x2e\x35\x35\x35\x35\x35\x36\x2c\x2d\x32\x2e\x32\x32\x32\x32\x33\
+\x20\x2d\x35\x2e\x35\x35\x35\x35\x35\x36\x2c\x2d\x35\x2e\x35\x35\
+\x35\x35\x35\x20\x56\x20\x36\x39\x2e\x35\x35\x35\x35\x35\x35\x20\
+\x43\x20\x33\x30\x2e\x36\x36\x36\x36\x36\x36\x2c\x36\x36\x2e\x32\
+\x32\x32\x32\x32\x32\x20\x33\x32\x2e\x38\x38\x38\x38\x38\x39\x2c\
+\x36\x34\x20\x33\x36\x2e\x32\x32\x32\x32\x32\x32\x2c\x36\x34\x20\
+\x5a\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\
+\x31\x32\x31\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x3a\x63\x6f\x6e\x6e\x65\x63\x74\x6f\x72\x2d\x63\x75\x72\
+\x76\x61\x74\x75\x72\x65\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\
+\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\
+\x64\x74\x68\x3a\x35\x2e\x35\x35\x35\x35\x35\x35\x38\x32\x22\x20\
+\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\
+\x00\x00\x1b\xd1\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\
+\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\
+\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x33\x2e\x30\x2e\x30\x2c\x20\
+\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\
+\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\
+\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x31\x34\x39\
+\x34\x38\x29\x20\x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\
+\x50\x45\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\
+\x2f\x2f\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\
+\x2e\x31\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\
+\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\
+\x69\x63\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\
+\x73\x76\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\
+\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\
+\x64\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\
+\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\
+\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\
+\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\
+\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\
+\x22\x20\x79\x3d\x22\x30\x70\x78\x22\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x32\x35\x36\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x32\x35\x36\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x32\x35\x36\x20\x32\x35\x36\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x32\x35\x36\x20\x32\x35\
+\x36\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x22\
+\x4c\x61\x79\x65\x72\x5f\x32\x22\x3e\x0a\x09\x3c\x67\x3e\x0a\x09\
+\x09\x0a\x09\x09\x09\x3c\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\
+\x69\x65\x6e\x74\x20\x69\x64\x3d\x22\x50\x31\x5f\x31\x5f\x22\x20\
+\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\x3d\x22\x75\
+\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\x22\x20\x78\
+\x31\x3d\x22\x33\x30\x37\x2e\x32\x36\x32\x37\x22\x20\x79\x31\x3d\
+\x22\x2d\x35\x38\x30\x2e\x33\x38\x38\x37\x22\x20\x78\x32\x3d\x22\
+\x33\x30\x37\x2e\x32\x36\x32\x36\x22\x20\x79\x32\x3d\x22\x2d\x33\
+\x39\x30\x2e\x36\x30\x37\x33\x22\x20\x67\x72\x61\x64\x69\x65\x6e\
+\x74\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\
+\x69\x78\x28\x31\x2e\x32\x35\x32\x34\x20\x30\x20\x30\x20\x2d\x31\
+\x2e\x32\x35\x32\x34\x20\x2d\x32\x35\x37\x2e\x33\x31\x35\x32\x20\
+\x2d\x34\x38\x30\x2e\x35\x33\x34\x34\x29\x22\x3e\x0a\x09\x09\x09\
+\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x30\
+\x2e\x30\x30\x35\x36\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\
+\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x33\x42\x33\x42\x33\x42\
+\x22\x2f\x3e\x0a\x09\x09\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\
+\x66\x73\x65\x74\x3d\x22\x30\x2e\x35\x34\x34\x39\x22\x20\x73\x74\
+\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\
+\x23\x30\x30\x30\x30\x30\x30\x22\x2f\x3e\x0a\x09\x09\x09\x3c\x73\
+\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\x22\x20\
+\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\
+\x72\x3a\x23\x31\x41\x31\x41\x31\x41\x22\x2f\x3e\x0a\x09\x09\x3c\
+\x2f\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\
+\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x69\x64\x3d\x22\x50\x31\x22\
+\x20\x66\x69\x6c\x6c\x3d\x22\x75\x72\x6c\x28\x23\x50\x31\x5f\x31\
+\x5f\x29\x22\x20\x64\x3d\x22\x4d\x31\x2e\x39\x33\x34\x2c\x31\x32\
+\x37\x2e\x35\x63\x30\x2c\x36\x39\x2e\x32\x33\x36\x2c\x35\x36\x2e\
+\x33\x33\x2c\x31\x32\x35\x2e\x35\x36\x36\x2c\x31\x32\x35\x2e\x35\
+\x36\x37\x2c\x31\x32\x35\x2e\x35\x36\x36\x63\x36\x39\x2e\x32\x33\
+\x35\x2c\x30\x2c\x31\x32\x35\x2e\x35\x36\x35\x2d\x35\x36\x2e\x33\
+\x33\x2c\x31\x32\x35\x2e\x35\x36\x35\x2d\x31\x32\x35\x2e\x35\x36\
+\x36\x0a\x09\x09\x09\x63\x30\x2d\x36\x39\x2e\x32\x33\x37\x2d\x35\
+\x36\x2e\x33\x33\x2d\x31\x32\x35\x2e\x35\x36\x37\x2d\x31\x32\x35\
+\x2e\x35\x36\x35\x2d\x31\x32\x35\x2e\x35\x36\x37\x43\x35\x38\x2e\
+\x32\x36\x34\x2c\x31\x2e\x39\x33\x33\x2c\x31\x2e\x39\x33\x34\x2c\
+\x35\x38\x2e\x32\x36\x33\x2c\x31\x2e\x39\x33\x34\x2c\x31\x32\x37\
+\x2e\x35\x7a\x22\x2f\x3e\x0a\x09\x09\x0a\x09\x09\x09\x3c\x6c\x69\
+\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x20\x69\x64\x3d\
+\x22\x50\x32\x5f\x31\x5f\x22\x20\x67\x72\x61\x64\x69\x65\x6e\x74\
+\x55\x6e\x69\x74\x73\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\
+\x4f\x6e\x55\x73\x65\x22\x20\x78\x31\x3d\x22\x33\x30\x37\x2e\x32\
+\x36\x31\x37\x22\x20\x79\x31\x3d\x22\x2d\x35\x38\x30\x2e\x33\x37\
+\x30\x31\x22\x20\x78\x32\x3d\x22\x33\x30\x37\x2e\x32\x36\x31\x37\
+\x22\x20\x79\x32\x3d\x22\x2d\x33\x39\x30\x2e\x35\x38\x34\x35\x22\
+\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x54\x72\x61\x6e\x73\x66\x6f\
+\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\x28\x31\x2e\x32\x35\x32\
+\x34\x20\x30\x20\x30\x20\x2d\x31\x2e\x32\x35\x32\x34\x20\x2d\x32\
+\x35\x37\x2e\x33\x31\x35\x32\x20\x2d\x34\x38\x30\x2e\x35\x33\x34\
+\x34\x29\x22\x3e\x0a\x09\x09\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\
+\x66\x66\x73\x65\x74\x3d\x22\x30\x2e\x30\x30\x35\x36\x22\x20\x73\
+\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\
+\x3a\x23\x37\x42\x37\x42\x37\x42\x22\x2f\x3e\x0a\x09\x09\x09\x3c\
+\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x30\x2e\
+\x35\x37\x33\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\
+\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x42\x34\x42\x34\x42\x34\x22\x2f\
+\x3e\x0a\x09\x09\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\
+\x65\x74\x3d\x22\x31\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\
+\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x45\x36\x45\x36\x45\x36\
+\x22\x2f\x3e\x0a\x09\x09\x3c\x2f\x6c\x69\x6e\x65\x61\x72\x47\x72\
+\x61\x64\x69\x65\x6e\x74\x3e\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\
+\x69\x64\x3d\x22\x50\x32\x22\x20\x66\x69\x6c\x6c\x3d\x22\x75\x72\
+\x6c\x28\x23\x50\x32\x5f\x31\x5f\x29\x22\x20\x64\x3d\x22\x4d\x39\
+\x2e\x34\x38\x37\x2c\x31\x32\x37\x2e\x35\x63\x30\x2c\x36\x35\x2e\
+\x30\x37\x34\x2c\x35\x32\x2e\x39\x34\x31\x2c\x31\x31\x38\x2e\x30\
+\x31\x34\x2c\x31\x31\x38\x2e\x30\x31\x35\x2c\x31\x31\x38\x2e\x30\
+\x31\x34\x63\x36\x35\x2e\x30\x37\x33\x2c\x30\x2c\x31\x31\x38\x2e\
+\x30\x31\x2d\x35\x32\x2e\x39\x33\x38\x2c\x31\x31\x38\x2e\x30\x31\
+\x2d\x31\x31\x38\x2e\x30\x31\x34\x0a\x09\x09\x09\x63\x30\x2d\x36\
+\x35\x2e\x30\x37\x33\x2d\x35\x32\x2e\x39\x33\x38\x2d\x31\x31\x38\
+\x2e\x30\x31\x34\x2d\x31\x31\x38\x2e\x30\x31\x2d\x31\x31\x38\x2e\
+\x30\x31\x34\x43\x36\x32\x2e\x34\x32\x38\x2c\x39\x2e\x34\x38\x36\
+\x2c\x39\x2e\x34\x38\x37\x2c\x36\x32\x2e\x34\x32\x37\x2c\x39\x2e\
+\x34\x38\x37\x2c\x31\x32\x37\x2e\x35\x7a\x22\x2f\x3e\x0a\x09\x09\
+\x0a\x09\x09\x09\x3c\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\
+\x65\x6e\x74\x20\x69\x64\x3d\x22\x50\x33\x5f\x31\x5f\x22\x20\x67\
+\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\x3d\x22\x75\x73\
+\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\x22\x20\x78\x31\
+\x3d\x22\x33\x30\x37\x2e\x32\x36\x32\x37\x22\x20\x79\x31\x3d\x22\
+\x2d\x35\x37\x36\x2e\x35\x33\x39\x36\x22\x20\x78\x32\x3d\x22\x33\
+\x30\x37\x2e\x32\x36\x32\x36\x22\x20\x79\x32\x3d\x22\x2d\x33\x39\
+\x34\x2e\x34\x34\x38\x37\x22\x20\x67\x72\x61\x64\x69\x65\x6e\x74\
+\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\
+\x78\x28\x31\x2e\x32\x35\x32\x34\x20\x30\x20\x30\x20\x2d\x31\x2e\
+\x32\x35\x32\x34\x20\x2d\x32\x35\x37\x2e\x33\x31\x35\x32\x20\x2d\
+\x34\x38\x30\x2e\x35\x33\x34\x34\x29\x22\x3e\x0a\x09\x09\x09\x3c\
+\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x30\x22\
+\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\
+\x6f\x72\x3a\x23\x46\x46\x46\x46\x46\x46\x22\x2f\x3e\x0a\x09\x09\
+\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\
+\x30\x2e\x35\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\
+\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x32\x31\x32\x31\x32\x31\x22\x2f\
+\x3e\x0a\x09\x09\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\
+\x65\x74\x3d\x22\x31\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\
+\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x38\x41\x38\x41\x38\x41\
+\x22\x2f\x3e\x0a\x09\x09\x3c\x2f\x6c\x69\x6e\x65\x61\x72\x47\x72\
+\x61\x64\x69\x65\x6e\x74\x3e\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\
+\x69\x64\x3d\x22\x50\x33\x22\x20\x66\x69\x6c\x6c\x3d\x22\x75\x72\
+\x6c\x28\x23\x50\x33\x5f\x31\x5f\x29\x22\x20\x64\x3d\x22\x4d\x31\
+\x33\x2e\x34\x37\x33\x2c\x31\x32\x37\x2e\x35\x63\x30\x2c\x36\x32\
+\x2e\x38\x38\x2c\x35\x31\x2e\x31\x35\x36\x2c\x31\x31\x34\x2e\x30\
+\x32\x33\x2c\x31\x31\x34\x2e\x30\x32\x38\x2c\x31\x31\x34\x2e\x30\
+\x32\x33\x0a\x09\x09\x09\x63\x36\x32\x2e\x38\x37\x38\x2c\x30\x2c\
+\x31\x31\x34\x2e\x30\x32\x36\x2d\x35\x31\x2e\x31\x34\x36\x2c\x31\
+\x31\x34\x2e\x30\x32\x36\x2d\x31\x31\x34\x2e\x30\x32\x33\x63\x30\
+\x2d\x36\x32\x2e\x38\x37\x33\x2d\x35\x31\x2e\x31\x34\x37\x2d\x31\
+\x31\x34\x2e\x30\x32\x37\x2d\x31\x31\x34\x2e\x30\x32\x36\x2d\x31\
+\x31\x34\x2e\x30\x32\x37\x43\x36\x34\x2e\x36\x32\x39\x2c\x31\x33\
+\x2e\x34\x37\x33\x2c\x31\x33\x2e\x34\x37\x33\x2c\x36\x34\x2e\x36\
+\x32\x37\x2c\x31\x33\x2e\x34\x37\x33\x2c\x31\x32\x37\x2e\x35\x7a\
+\x22\x2f\x3e\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x69\x64\x3d\x22\
+\x50\x34\x22\x20\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x30\x2e\x38\
+\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x46\x46\x46\x46\x46\x22\
+\x20\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\
+\x6e\x64\x3d\x22\x6e\x65\x77\x20\x20\x20\x20\x22\x20\x64\x3d\x22\
+\x4d\x31\x32\x37\x2e\x35\x30\x31\x2c\x32\x37\x2e\x37\x31\x38\x0a\
+\x09\x09\x09\x63\x2d\x35\x37\x2e\x32\x36\x33\x2c\x30\x2d\x31\x30\
+\x33\x2e\x38\x35\x36\x2c\x34\x36\x2e\x35\x38\x33\x2d\x31\x30\x33\
+\x2e\x38\x35\x36\x2c\x31\x30\x33\x2e\x38\x35\x34\x63\x30\x2c\x35\
+\x37\x2e\x32\x36\x33\x2c\x34\x36\x2e\x35\x39\x33\x2c\x31\x30\x33\
+\x2e\x38\x34\x35\x2c\x31\x30\x33\x2e\x38\x35\x36\x2c\x31\x30\x33\
+\x2e\x38\x34\x35\x63\x35\x37\x2e\x32\x36\x37\x2c\x30\x2c\x31\x30\
+\x33\x2e\x38\x35\x34\x2d\x34\x36\x2e\x35\x38\x32\x2c\x31\x30\x33\
+\x2e\x38\x35\x34\x2d\x31\x30\x33\x2e\x38\x34\x35\x0a\x09\x09\x09\
+\x43\x32\x33\x31\x2e\x33\x35\x35\x2c\x37\x34\x2e\x33\x30\x31\x2c\
+\x31\x38\x34\x2e\x37\x36\x38\x2c\x32\x37\x2e\x37\x31\x38\x2c\x31\
+\x32\x37\x2e\x35\x30\x31\x2c\x32\x37\x2e\x37\x31\x38\x7a\x22\x2f\
+\x3e\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x69\x64\x3d\x22\x50\x35\
+\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x38\x44\x30\x30\x30\x30\x22\
+\x20\x64\x3d\x22\x4d\x32\x33\x2e\x36\x34\x35\x2c\x31\x32\x37\x2e\
+\x35\x63\x30\x2c\x35\x37\x2e\x32\x36\x38\x2c\x34\x36\x2e\x35\x39\
+\x33\x2c\x31\x30\x33\x2e\x38\x34\x36\x2c\x31\x30\x33\x2e\x38\x35\
+\x36\x2c\x31\x30\x33\x2e\x38\x34\x36\x63\x35\x37\x2e\x32\x36\x37\
+\x2c\x30\x2c\x31\x30\x33\x2e\x38\x35\x34\x2d\x34\x36\x2e\x35\x37\
+\x38\x2c\x31\x30\x33\x2e\x38\x35\x34\x2d\x31\x30\x33\x2e\x38\x34\
+\x36\x0a\x09\x09\x09\x63\x30\x2d\x35\x37\x2e\x32\x36\x34\x2d\x34\
+\x36\x2e\x35\x38\x38\x2d\x31\x30\x33\x2e\x38\x35\x33\x2d\x31\x30\
+\x33\x2e\x38\x35\x34\x2d\x31\x30\x33\x2e\x38\x35\x33\x43\x37\x30\
+\x2e\x32\x33\x38\x2c\x32\x33\x2e\x36\x34\x37\x2c\x32\x33\x2e\x36\
+\x34\x35\x2c\x37\x30\x2e\x32\x33\x36\x2c\x32\x33\x2e\x36\x34\x35\
+\x2c\x31\x32\x37\x2e\x35\x7a\x22\x2f\x3e\x0a\x09\x09\x0a\x09\x09\
+\x09\x3c\x72\x61\x64\x69\x61\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\
+\x20\x69\x64\x3d\x22\x50\x36\x5f\x31\x5f\x22\x20\x63\x78\x3d\x22\
+\x31\x38\x35\x2e\x35\x33\x39\x31\x22\x20\x63\x79\x3d\x22\x2d\x34\
+\x31\x30\x2e\x36\x33\x39\x32\x22\x20\x72\x3d\x22\x35\x37\x2e\x30\
+\x32\x32\x22\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x54\x72\x61\x6e\
+\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\x28\x31\x2e\
+\x37\x37\x36\x37\x20\x30\x20\x30\x20\x2d\x31\x2e\x37\x37\x36\x37\
+\x20\x2d\x32\x30\x32\x2e\x31\x34\x33\x38\x20\x2d\x36\x30\x32\x2e\
+\x30\x38\x34\x37\x29\x22\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\
+\x6e\x69\x74\x73\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\
+\x6e\x55\x73\x65\x22\x3e\x0a\x09\x09\x09\x3c\x73\x74\x6f\x70\x20\
+\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x30\x2e\x36\x34\x36\x37\x22\
+\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\
+\x6f\x72\x3a\x23\x46\x46\x42\x38\x30\x41\x22\x2f\x3e\x0a\x09\x09\
+\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\
+\x30\x2e\x37\x31\x34\x34\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\
+\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x46\x45\x42\x33\x30\
+\x41\x22\x2f\x3e\x0a\x09\x09\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\
+\x66\x66\x73\x65\x74\x3d\x22\x30\x2e\x37\x38\x39\x39\x22\x20\x73\
+\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\
+\x3a\x23\x46\x43\x41\x36\x30\x38\x22\x2f\x3e\x0a\x09\x09\x09\x3c\
+\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x30\x2e\
+\x38\x36\x39\x31\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\
+\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x46\x39\x39\x30\x30\x36\x22\
+\x2f\x3e\x0a\x09\x09\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\
+\x73\x65\x74\x3d\x22\x30\x2e\x39\x35\x30\x33\x22\x20\x73\x74\x79\
+\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\
+\x46\x34\x37\x31\x30\x32\x22\x2f\x3e\x0a\x09\x09\x09\x3c\x73\x74\
+\x6f\x70\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\x22\x20\x73\
+\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\
+\x3a\x23\x46\x31\x35\x41\x30\x30\x22\x2f\x3e\x0a\x09\x09\x3c\x2f\
+\x72\x61\x64\x69\x61\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\x0a\
+\x09\x09\x3c\x70\x61\x74\x68\x20\x69\x64\x3d\x22\x50\x36\x22\x20\
+\x66\x69\x6c\x6c\x3d\x22\x75\x72\x6c\x28\x23\x50\x36\x5f\x31\x5f\
+\x29\x22\x20\x64\x3d\x22\x4d\x32\x36\x2e\x31\x38\x39\x2c\x31\x32\
+\x37\x2e\x35\x63\x30\x2c\x35\x35\x2e\x38\x36\x31\x2c\x34\x35\x2e\
+\x34\x34\x37\x2c\x31\x30\x31\x2e\x33\x30\x39\x2c\x31\x30\x31\x2e\
+\x33\x31\x32\x2c\x31\x30\x31\x2e\x33\x30\x39\x0a\x09\x09\x09\x63\
+\x35\x35\x2e\x38\x36\x32\x2c\x30\x2c\x31\x30\x31\x2e\x33\x31\x33\
+\x2d\x34\x35\x2e\x34\x34\x37\x2c\x31\x30\x31\x2e\x33\x31\x33\x2d\
+\x31\x30\x31\x2e\x33\x30\x39\x63\x30\x2d\x35\x35\x2e\x38\x36\x32\
+\x2d\x34\x35\x2e\x34\x35\x31\x2d\x31\x30\x31\x2e\x33\x31\x31\x2d\
+\x31\x30\x31\x2e\x33\x31\x33\x2d\x31\x30\x31\x2e\x33\x31\x31\x43\
+\x37\x31\x2e\x36\x33\x37\x2c\x32\x36\x2e\x31\x38\x39\x2c\x32\x36\
+\x2e\x31\x38\x39\x2c\x37\x31\x2e\x36\x33\x38\x2c\x32\x36\x2e\x31\
+\x38\x39\x2c\x31\x32\x37\x2e\x35\x7a\x22\x2f\x3e\x0a\x09\x09\x3c\
+\x70\x61\x74\x68\x20\x69\x64\x3d\x22\x50\x37\x22\x20\x66\x69\x6c\
+\x6c\x3d\x22\x23\x37\x37\x31\x31\x31\x31\x22\x20\x64\x3d\x22\x4d\
+\x33\x34\x2e\x35\x37\x32\x2c\x31\x32\x34\x2e\x31\x38\x38\x63\x2d\
+\x31\x2e\x31\x32\x37\x2c\x30\x2d\x32\x2e\x30\x34\x32\x2c\x30\x2e\
+\x39\x31\x34\x2d\x32\x2e\x30\x34\x32\x2c\x32\x2e\x30\x34\x33\x76\
+\x32\x2e\x35\x33\x37\x63\x30\x2c\x31\x2e\x31\x32\x39\x2c\x30\x2e\
+\x39\x31\x34\x2c\x32\x2e\x30\x34\x33\x2c\x32\x2e\x30\x34\x32\x2c\
+\x32\x2e\x30\x34\x33\x68\x31\x37\x2e\x38\x30\x32\x0a\x09\x09\x09\
+\x63\x31\x2e\x31\x32\x37\x2c\x30\x2c\x32\x2e\x30\x34\x32\x2d\x30\
+\x2e\x39\x31\x34\x2c\x32\x2e\x30\x34\x32\x2d\x32\x2e\x30\x34\x33\
+\x76\x2d\x32\x2e\x35\x33\x37\x63\x30\x2d\x31\x2e\x31\x32\x39\x2d\
+\x30\x2e\x39\x31\x35\x2d\x32\x2e\x30\x34\x33\x2d\x32\x2e\x30\x34\
+\x32\x2d\x32\x2e\x30\x34\x33\x48\x33\x34\x2e\x35\x37\x32\x7a\x22\
+\x2f\x3e\x0a\x09\x09\x3c\x72\x65\x63\x74\x20\x69\x64\x3d\x22\x52\
+\x45\x31\x22\x20\x78\x3d\x22\x33\x34\x2e\x35\x37\x32\x22\x20\x79\
+\x3d\x22\x31\x32\x36\x2e\x32\x33\x22\x20\x66\x69\x6c\x6c\x3d\x22\
+\x23\x41\x30\x30\x30\x30\x30\x22\x20\x77\x69\x64\x74\x68\x3d\x22\
+\x31\x37\x2e\x38\x30\x32\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\
+\x32\x2e\x35\x33\x38\x22\x2f\x3e\x0a\x09\x09\x3c\x70\x61\x74\x68\
+\x20\x69\x64\x3d\x22\x50\x38\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\
+\x37\x37\x31\x31\x31\x31\x22\x20\x64\x3d\x22\x4d\x32\x30\x32\x2e\
+\x30\x37\x33\x2c\x31\x32\x34\x2e\x31\x38\x38\x63\x2d\x31\x2e\x31\
+\x32\x38\x2c\x30\x2d\x32\x2e\x30\x34\x31\x2c\x30\x2e\x39\x31\x34\
+\x2d\x32\x2e\x30\x34\x31\x2c\x32\x2e\x30\x34\x33\x76\x32\x2e\x35\
+\x33\x37\x63\x30\x2c\x31\x2e\x31\x32\x39\x2c\x30\x2e\x39\x31\x33\
+\x2c\x32\x2e\x30\x34\x33\x2c\x32\x2e\x30\x34\x31\x2c\x32\x2e\x30\
+\x34\x33\x68\x31\x37\x2e\x38\x31\x0a\x09\x09\x09\x63\x31\x2e\x31\
+\x32\x36\x2c\x30\x2c\x32\x2e\x30\x34\x31\x2d\x30\x2e\x39\x31\x34\
+\x2c\x32\x2e\x30\x34\x31\x2d\x32\x2e\x30\x34\x33\x76\x2d\x32\x2e\
+\x35\x33\x37\x63\x30\x2d\x31\x2e\x31\x32\x39\x2d\x30\x2e\x39\x31\
+\x35\x2d\x32\x2e\x30\x34\x33\x2d\x32\x2e\x30\x34\x31\x2d\x32\x2e\
+\x30\x34\x33\x48\x32\x30\x32\x2e\x30\x37\x33\x7a\x22\x2f\x3e\x0a\
+\x09\x09\x3c\x72\x65\x63\x74\x20\x69\x64\x3d\x22\x52\x45\x32\x22\
+\x20\x78\x3d\x22\x32\x30\x32\x2e\x30\x37\x33\x22\x20\x79\x3d\x22\
+\x31\x32\x36\x2e\x32\x33\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x41\
+\x30\x30\x30\x30\x30\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x31\x37\
+\x2e\x38\x31\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x2e\x35\
+\x33\x38\x22\x2f\x3e\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x69\x64\
+\x3d\x22\x50\x39\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x37\x37\x31\
+\x31\x31\x31\x22\x20\x64\x3d\x22\x4d\x31\x32\x36\x2e\x32\x33\x2c\
+\x32\x30\x30\x2e\x30\x33\x32\x63\x2d\x31\x2e\x31\x32\x38\x2c\x30\
+\x2d\x32\x2e\x30\x34\x32\x2c\x30\x2e\x39\x31\x33\x2d\x32\x2e\x30\
+\x34\x32\x2c\x32\x2e\x30\x34\x31\x76\x31\x37\x2e\x38\x30\x33\x63\
+\x30\x2c\x31\x2e\x31\x32\x37\x2c\x30\x2e\x39\x31\x34\x2c\x32\x2e\
+\x30\x34\x31\x2c\x32\x2e\x30\x34\x32\x2c\x32\x2e\x30\x34\x31\x68\
+\x32\x2e\x35\x34\x33\x0a\x09\x09\x09\x63\x31\x2e\x31\x32\x39\x2c\
+\x30\x2c\x32\x2e\x30\x34\x31\x2d\x30\x2e\x39\x31\x34\x2c\x32\x2e\
+\x30\x34\x31\x2d\x32\x2e\x30\x34\x31\x76\x2d\x31\x37\x2e\x38\x30\
+\x33\x63\x30\x2d\x31\x2e\x31\x32\x38\x2d\x30\x2e\x39\x31\x32\x2d\
+\x32\x2e\x30\x34\x31\x2d\x32\x2e\x30\x34\x31\x2d\x32\x2e\x30\x34\
+\x31\x48\x31\x32\x36\x2e\x32\x33\x7a\x22\x2f\x3e\x0a\x09\x09\x3c\
+\x72\x65\x63\x74\x20\x69\x64\x3d\x22\x52\x45\x33\x22\x20\x78\x3d\
+\x22\x31\x32\x36\x2e\x32\x33\x22\x20\x79\x3d\x22\x32\x30\x32\x2e\
+\x30\x37\x33\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x41\x30\x30\x30\
+\x30\x30\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x32\x2e\x35\x34\x33\
+\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x37\x2e\x38\x30\x33\
+\x22\x2f\x3e\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x69\x64\x3d\x22\
+\x50\x31\x30\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x37\x37\x31\x31\
+\x31\x31\x22\x20\x64\x3d\x22\x4d\x31\x32\x36\x2e\x32\x33\x2c\x33\
+\x32\x2e\x35\x32\x39\x63\x2d\x31\x2e\x31\x32\x38\x2c\x30\x2d\x32\
+\x2e\x30\x34\x32\x2c\x30\x2e\x39\x31\x34\x2d\x32\x2e\x30\x34\x32\
+\x2c\x32\x2e\x30\x34\x31\x76\x31\x37\x2e\x38\x30\x33\x63\x30\x2c\
+\x31\x2e\x31\x32\x37\x2c\x30\x2e\x39\x31\x34\x2c\x32\x2e\x30\x34\
+\x31\x2c\x32\x2e\x30\x34\x32\x2c\x32\x2e\x30\x34\x31\x68\x32\x2e\
+\x35\x34\x33\x0a\x09\x09\x09\x63\x31\x2e\x31\x32\x39\x2c\x30\x2c\
+\x32\x2e\x30\x34\x31\x2d\x30\x2e\x39\x31\x34\x2c\x32\x2e\x30\x34\
+\x31\x2d\x32\x2e\x30\x34\x31\x56\x33\x34\x2e\x35\x37\x63\x30\x2d\
+\x31\x2e\x31\x32\x37\x2d\x30\x2e\x39\x31\x32\x2d\x32\x2e\x30\x34\
+\x31\x2d\x32\x2e\x30\x34\x31\x2d\x32\x2e\x30\x34\x31\x48\x31\x32\
+\x36\x2e\x32\x33\x4c\x31\x32\x36\x2e\x32\x33\x2c\x33\x32\x2e\x35\
+\x32\x39\x7a\x22\x2f\x3e\x0a\x09\x09\x3c\x72\x65\x63\x74\x20\x69\
+\x64\x3d\x22\x52\x45\x34\x22\x20\x78\x3d\x22\x31\x32\x36\x2e\x32\
+\x33\x22\x20\x79\x3d\x22\x33\x34\x2e\x35\x37\x22\x20\x66\x69\x6c\
+\x6c\x3d\x22\x23\x41\x30\x30\x30\x30\x30\x22\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x32\x2e\x35\x34\x33\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x31\x37\x2e\x38\x30\x33\x22\x2f\x3e\x0a\x09\x09\x3c\x67\
+\x20\x69\x64\x3d\x22\x47\x34\x22\x20\x74\x72\x61\x6e\x73\x66\x6f\
+\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x38\x33\
+\x32\x34\x32\x2c\x2d\x30\x2e\x31\x38\x32\x33\x30\x33\x2c\x30\x2e\
+\x31\x38\x32\x33\x30\x33\x2c\x30\x2e\x39\x38\x33\x32\x34\x32\x2c\
+\x2d\x31\x30\x2e\x34\x35\x38\x34\x33\x2c\x35\x37\x2e\x37\x30\x35\
+\x33\x37\x29\x22\x3e\x0a\x09\x09\x09\x3c\x70\x61\x74\x68\x20\x6f\
+\x70\x61\x63\x69\x74\x79\x3d\x22\x30\x2e\x32\x38\x22\x20\x66\x69\
+\x6c\x6c\x3d\x22\x23\x38\x44\x30\x30\x30\x30\x22\x20\x65\x6e\x61\
+\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\
+\x6e\x65\x77\x20\x20\x20\x20\x22\x20\x64\x3d\x22\x4d\x31\x31\x35\
+\x2e\x33\x37\x33\x2c\x31\x30\x30\x2e\x31\x37\x35\x4c\x37\x30\x2e\
+\x35\x37\x31\x2c\x32\x32\x2e\x35\x37\x33\x0a\x09\x09\x09\x09\x63\
+\x2d\x32\x2e\x30\x32\x36\x2d\x33\x2e\x35\x30\x37\x2d\x30\x2e\x38\
+\x32\x34\x2d\x37\x2e\x39\x39\x34\x2c\x32\x2e\x36\x38\x33\x2d\x31\
+\x30\x2e\x30\x32\x6c\x30\x2c\x30\x63\x33\x2e\x35\x30\x39\x2d\x32\
+\x2e\x30\x32\x36\x2c\x37\x2e\x39\x39\x36\x2d\x30\x2e\x38\x32\x34\
+\x2c\x31\x30\x2e\x30\x32\x31\x2c\x32\x2e\x36\x38\x35\x6c\x30\x2c\
+\x30\x6c\x34\x34\x2e\x38\x30\x33\x2c\x37\x37\x2e\x36\x30\x32\x0a\
+\x09\x09\x09\x09\x63\x32\x2e\x30\x32\x35\x2c\x33\x2e\x35\x30\x39\
+\x2c\x30\x2e\x38\x32\x32\x2c\x37\x2e\x39\x39\x34\x2d\x32\x2e\x36\
+\x38\x34\x2c\x31\x30\x2e\x30\x31\x38\x6c\x30\x2c\x30\x63\x2d\x31\
+\x2e\x35\x37\x35\x2c\x30\x2e\x39\x31\x2d\x33\x2e\x33\x34\x35\x2c\
+\x31\x2e\x31\x36\x39\x2d\x35\x2e\x30\x30\x31\x2c\x30\x2e\x38\x35\
+\x39\x6c\x30\x2c\x30\x0a\x09\x09\x09\x09\x43\x31\x31\x38\x2e\x33\
+\x35\x36\x2c\x31\x30\x33\x2e\x33\x34\x31\x2c\x31\x31\x36\x2e\x34\
+\x39\x2c\x31\x30\x32\x2e\x31\x30\x39\x2c\x31\x31\x35\x2e\x33\x37\
+\x33\x2c\x31\x30\x30\x2e\x31\x37\x35\x4c\x31\x31\x35\x2e\x33\x37\
+\x33\x2c\x31\x30\x30\x2e\x31\x37\x35\x7a\x22\x2f\x3e\x0a\x09\x09\
+\x09\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\x43\x36\
+\x35\x43\x30\x35\x22\x20\x64\x3d\x22\x4d\x31\x31\x34\x2e\x33\x38\
+\x39\x2c\x39\x36\x2e\x35\x30\x39\x6c\x2d\x30\x2e\x30\x30\x31\x2d\
+\x38\x39\x2e\x36\x30\x37\x63\x30\x2e\x30\x30\x31\x2d\x34\x2e\x30\
+\x35\x31\x2c\x33\x2e\x32\x38\x33\x2d\x37\x2e\x33\x33\x36\x2c\x37\
+\x2e\x33\x33\x36\x2d\x37\x2e\x33\x33\x35\x6c\x30\x2c\x30\x0a\x09\
+\x09\x09\x09\x63\x34\x2e\x30\x35\x32\x2d\x30\x2e\x30\x30\x31\x2c\
+\x37\x2e\x33\x33\x34\x2c\x33\x2e\x32\x38\x34\x2c\x37\x2e\x33\x33\
+\x36\x2c\x37\x2e\x33\x33\x34\x6c\x30\x2c\x30\x6c\x30\x2e\x30\x30\
+\x31\x2c\x38\x39\x2e\x36\x30\x37\x63\x2d\x30\x2e\x30\x30\x32\x2c\
+\x34\x2e\x30\x35\x2d\x33\x2e\x32\x38\x35\x2c\x37\x2e\x33\x33\x35\
+\x2d\x37\x2e\x33\x33\x36\x2c\x37\x2e\x33\x33\x33\x6c\x30\x2c\x30\
+\x0a\x09\x09\x09\x09\x63\x2d\x30\x2e\x34\x36\x2c\x30\x2e\x30\x30\
+\x31\x2d\x30\x2e\x39\x30\x39\x2d\x30\x2e\x30\x34\x2d\x31\x2e\x33\
+\x34\x34\x2d\x30\x2e\x31\x32\x32\x6c\x30\x2c\x30\x43\x31\x31\x36\
+\x2e\x39\x37\x32\x2c\x31\x30\x33\x2e\x30\x38\x39\x2c\x31\x31\x34\
+\x2e\x33\x38\x39\x2c\x31\x30\x30\x2e\x30\x39\x38\x2c\x31\x31\x34\
+\x2e\x33\x38\x39\x2c\x39\x36\x2e\x35\x30\x39\x4c\x31\x31\x34\x2e\
+\x33\x38\x39\x2c\x39\x36\x2e\x35\x30\x39\x7a\x22\x2f\x3e\x0a\x09\
+\x09\x09\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\x41\
+\x41\x32\x45\x30\x33\x22\x20\x64\x3d\x22\x4d\x31\x31\x38\x2e\x30\
+\x35\x37\x2c\x31\x30\x32\x2e\x38\x35\x39\x63\x2d\x33\x2e\x35\x30\
+\x38\x2d\x32\x2e\x30\x32\x35\x2d\x34\x2e\x37\x31\x31\x2d\x36\x2e\
+\x35\x31\x2d\x32\x2e\x36\x38\x35\x2d\x31\x30\x2e\x30\x31\x38\x6c\
+\x30\x2c\x30\x6c\x34\x34\x2e\x38\x30\x33\x2d\x37\x37\x2e\x36\x30\
+\x32\x0a\x09\x09\x09\x09\x63\x32\x2e\x30\x32\x35\x2d\x33\x2e\x35\
+\x30\x38\x2c\x36\x2e\x35\x31\x2d\x34\x2e\x37\x31\x31\x2c\x31\x30\
+\x2e\x30\x31\x39\x2d\x32\x2e\x36\x38\x35\x6c\x30\x2c\x30\x63\x33\
+\x2e\x35\x31\x2c\x32\x2e\x30\x32\x36\x2c\x34\x2e\x37\x31\x2c\x36\
+\x2e\x35\x31\x31\x2c\x32\x2e\x36\x38\x35\x2c\x31\x30\x2e\x30\x32\
+\x6c\x30\x2c\x30\x6c\x2d\x34\x34\x2e\x38\x2c\x37\x37\x2e\x36\x30\
+\x32\x0a\x09\x09\x09\x09\x63\x2d\x31\x2e\x35\x39\x37\x2c\x32\x2e\
+\x37\x36\x36\x2d\x34\x2e\x37\x32\x33\x2c\x34\x2e\x30\x39\x38\x2d\
+\x37\x2e\x36\x39\x32\x2c\x33\x2e\x35\x34\x37\x6c\x30\x2c\x30\x43\
+\x31\x31\x39\x2e\x35\x38\x38\x2c\x31\x30\x33\x2e\x35\x37\x34\x2c\
+\x31\x31\x38\x2e\x38\x30\x31\x2c\x31\x30\x33\x2e\x32\x38\x39\x2c\
+\x31\x31\x38\x2e\x30\x35\x37\x2c\x31\x30\x32\x2e\x38\x35\x39\x4c\
+\x31\x31\x38\x2e\x30\x35\x37\x2c\x31\x30\x32\x2e\x38\x35\x39\x7a\
+\x22\x2f\x3e\x0a\x09\x09\x09\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\
+\x6c\x3d\x22\x23\x38\x44\x30\x30\x30\x30\x22\x20\x64\x3d\x22\x4d\
+\x31\x31\x38\x2e\x30\x35\x39\x2c\x31\x30\x32\x2e\x38\x35\x39\x4c\
+\x35\x38\x2e\x38\x35\x33\x2c\x36\x38\x2e\x36\x37\x37\x63\x2d\x33\
+\x2e\x35\x30\x39\x2d\x32\x2e\x30\x32\x34\x2d\x34\x2e\x37\x31\x31\
+\x2d\x36\x2e\x35\x31\x2d\x32\x2e\x36\x38\x34\x2d\x31\x30\x2e\x30\
+\x32\x6c\x30\x2c\x30\x0a\x09\x09\x09\x09\x63\x32\x2e\x30\x32\x35\
+\x2d\x33\x2e\x35\x30\x39\x2c\x36\x2e\x35\x31\x31\x2d\x34\x2e\x37\
+\x31\x31\x2c\x31\x30\x2e\x30\x32\x2d\x32\x2e\x36\x38\x36\x6c\x30\
+\x2c\x30\x6c\x35\x35\x2e\x35\x33\x38\x2c\x33\x32\x2e\x30\x36\x36\
+\x6c\x37\x33\x2e\x39\x33\x33\x2d\x34\x32\x2e\x36\x38\x34\x63\x33\
+\x2e\x35\x30\x35\x2d\x32\x2e\x30\x32\x36\x2c\x37\x2e\x39\x39\x33\
+\x2d\x30\x2e\x38\x32\x34\x2c\x31\x30\x2e\x30\x31\x38\x2c\x32\x2e\
+\x36\x38\x34\x6c\x30\x2c\x30\x0a\x09\x09\x09\x09\x63\x32\x2e\x30\
+\x32\x34\x2c\x33\x2e\x35\x30\x37\x2c\x30\x2e\x38\x32\x31\x2c\x37\
+\x2e\x39\x39\x34\x2d\x32\x2e\x36\x38\x33\x2c\x31\x30\x2e\x30\x32\
+\x6c\x30\x2c\x30\x6c\x2d\x37\x37\x2e\x36\x30\x31\x2c\x34\x34\x2e\
+\x38\x30\x32\x63\x2d\x31\x2e\x35\x33\x37\x2c\x30\x2e\x38\x38\x39\
+\x2d\x33\x2e\x33\x31\x33\x2c\x31\x2e\x31\x37\x36\x2d\x35\x2e\x30\
+\x30\x35\x2c\x30\x2e\x38\x36\x6c\x30\x2c\x30\x0a\x09\x09\x09\x09\
+\x43\x31\x31\x39\x2e\x35\x38\x32\x2c\x31\x30\x33\x2e\x35\x36\x39\
+\x2c\x31\x31\x38\x2e\x37\x39\x32\x2c\x31\x30\x33\x2e\x32\x38\x32\
+\x2c\x31\x31\x38\x2e\x30\x35\x39\x2c\x31\x30\x32\x2e\x38\x35\x39\
+\x4c\x31\x31\x38\x2e\x30\x35\x39\x2c\x31\x30\x32\x2e\x38\x35\x39\
+\x7a\x22\x2f\x3e\x0a\x09\x09\x3c\x2f\x67\x3e\x0a\x09\x09\x3c\x67\
+\x3e\x0a\x09\x09\x09\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\
+\x22\x23\x46\x46\x46\x46\x46\x46\x22\x20\x73\x74\x72\x6f\x6b\x65\
+\x3d\x22\x23\x30\x30\x30\x30\x30\x30\x22\x20\x73\x74\x72\x6f\x6b\
+\x65\x2d\x77\x69\x64\x74\x68\x3d\x22\x36\x22\x20\x73\x74\x72\x6f\
+\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\x22\x72\x6f\x75\x6e\
+\x64\x22\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\
+\x69\x6e\x3d\x22\x72\x6f\x75\x6e\x64\x22\x20\x64\x3d\x22\x4d\x32\
+\x33\x33\x2e\x39\x31\x38\x2c\x31\x31\x34\x2e\x38\x37\x36\x0a\x09\
+\x09\x09\x09\x63\x30\x2c\x34\x2e\x39\x31\x34\x2d\x30\x2e\x32\x33\
+\x2c\x39\x2e\x32\x31\x33\x2d\x30\x2e\x36\x38\x39\x2c\x31\x32\x2e\
+\x38\x39\x38\x63\x2d\x30\x2e\x39\x32\x2c\x34\x2e\x37\x36\x33\x2d\
+\x31\x2e\x36\x30\x37\x2c\x38\x2e\x35\x32\x32\x2d\x32\x2e\x30\x36\
+\x37\x2c\x31\x31\x2e\x32\x38\x39\x63\x2d\x30\x2e\x39\x31\x39\x2c\
+\x35\x2e\x30\x36\x37\x2d\x31\x2e\x39\x35\x34\x2c\x39\x2e\x39\x38\
+\x2d\x33\x2e\x31\x30\x34\x2c\x31\x34\x2e\x37\x34\x0a\x09\x09\x09\
+\x09\x63\x2d\x31\x2e\x31\x34\x39\x2c\x34\x2e\x37\x36\x2d\x33\x2e\
+\x31\x30\x34\x2c\x31\x31\x2e\x35\x31\x36\x2d\x35\x2e\x38\x36\x31\
+\x2c\x32\x30\x2e\x32\x37\x31\x6c\x2d\x34\x2e\x31\x33\x39\x2c\x31\
+\x33\x2e\x33\x35\x36\x6c\x2d\x31\x2e\x38\x33\x39\x2c\x35\x2e\x37\
+\x35\x38\x68\x2d\x31\x36\x2e\x30\x39\x32\x6c\x2d\x31\x2e\x36\x30\
+\x38\x2d\x35\x2e\x37\x35\x38\x6c\x2d\x34\x2e\x31\x33\x38\x2d\x31\
+\x33\x2e\x33\x35\x36\x0a\x09\x09\x09\x09\x63\x2d\x34\x2e\x35\x39\
+\x38\x2d\x31\x35\x2e\x33\x35\x35\x2d\x37\x2e\x34\x37\x31\x2d\x32\
+\x36\x2e\x35\x32\x35\x2d\x38\x2e\x36\x32\x2d\x33\x33\x2e\x35\x31\
+\x33\x63\x2d\x31\x2e\x31\x34\x38\x2d\x36\x2e\x39\x38\x34\x2d\x31\
+\x2e\x39\x35\x33\x2d\x31\x32\x2e\x32\x38\x34\x2d\x32\x2e\x34\x31\
+\x34\x2d\x31\x35\x2e\x38\x39\x34\x63\x2d\x30\x2e\x34\x35\x39\x2d\
+\x33\x2e\x36\x30\x36\x2d\x30\x2e\x36\x38\x38\x2d\x36\x2e\x38\x37\
+\x31\x2d\x30\x2e\x36\x38\x38\x2d\x39\x2e\x37\x39\x31\x0a\x09\x09\
+\x09\x09\x63\x30\x2d\x31\x31\x2e\x38\x32\x31\x2c\x31\x2e\x32\x32\
+\x35\x2d\x32\x30\x2e\x35\x37\x34\x2c\x33\x2e\x36\x37\x38\x2d\x32\
+\x36\x2e\x32\x35\x36\x63\x32\x2e\x34\x34\x39\x2d\x35\x2e\x36\x38\
+\x32\x2c\x36\x2e\x31\x36\x37\x2d\x39\x2e\x32\x35\x32\x2c\x31\x31\
+\x2e\x31\x34\x36\x2d\x31\x30\x2e\x37\x31\x73\x39\x2e\x30\x38\x32\
+\x2d\x32\x2e\x31\x38\x38\x2c\x31\x32\x2e\x33\x30\x31\x2d\x32\x2e\
+\x31\x38\x38\x0a\x09\x09\x09\x09\x43\x32\x32\x35\x2e\x38\x37\x32\
+\x2c\x37\x35\x2e\x37\x32\x33\x2c\x32\x33\x33\x2e\x39\x31\x38\x2c\
+\x38\x38\x2e\x37\x37\x35\x2c\x32\x33\x33\x2e\x39\x31\x38\x2c\x31\
+\x31\x34\x2e\x38\x37\x36\x7a\x20\x4d\x32\x32\x34\x2e\x32\x36\x34\
+\x2c\x32\x30\x37\x2e\x38\x39\x38\x63\x34\x2e\x32\x38\x38\x2c\x34\
+\x2e\x32\x39\x33\x2c\x36\x2e\x34\x33\x38\x2c\x39\x2e\x35\x30\x34\
+\x2c\x36\x2e\x34\x33\x38\x2c\x31\x35\x2e\x36\x33\x31\x0a\x09\x09\
+\x09\x09\x63\x30\x2c\x36\x2e\x32\x38\x37\x2d\x32\x2e\x33\x30\x31\
+\x2c\x31\x31\x2e\x36\x30\x39\x2d\x36\x2e\x38\x39\x36\x2c\x31\x35\
+\x2e\x39\x37\x38\x63\x2d\x34\x2e\x35\x39\x39\x2c\x34\x2e\x33\x36\
+\x37\x2d\x39\x2e\x38\x38\x36\x2c\x36\x2e\x35\x35\x32\x2d\x31\x35\
+\x2e\x38\x36\x31\x2c\x36\x2e\x35\x35\x32\x63\x2d\x36\x2e\x31\x33\
+\x33\x2c\x30\x2d\x31\x31\x2e\x33\x37\x39\x2d\x32\x2e\x31\x30\x37\
+\x2d\x31\x35\x2e\x37\x34\x38\x2d\x36\x2e\x33\x32\x32\x0a\x09\x09\
+\x09\x09\x63\x2d\x34\x2e\x33\x36\x35\x2d\x34\x2e\x32\x31\x33\x2d\
+\x36\x2e\x35\x35\x31\x2d\x39\x2e\x33\x38\x35\x2d\x36\x2e\x35\x35\
+\x31\x2d\x31\x35\x2e\x35\x31\x36\x63\x30\x2d\x36\x2e\x32\x38\x31\
+\x2c\x32\x2e\x31\x34\x36\x2d\x31\x31\x2e\x37\x32\x35\x2c\x36\x2e\
+\x34\x33\x38\x2d\x31\x36\x2e\x33\x32\x63\x34\x2e\x32\x38\x38\x2d\
+\x34\x2e\x35\x39\x39\x2c\x39\x2e\x35\x37\x35\x2d\x36\x2e\x38\x39\
+\x36\x2c\x31\x35\x2e\x38\x36\x2d\x36\x2e\x38\x39\x36\x0a\x09\x09\
+\x09\x09\x43\x32\x31\x34\x2e\x32\x32\x35\x2c\x32\x30\x31\x2e\x30\
+\x30\x33\x2c\x32\x31\x39\x2e\x36\x36\x36\x2c\x32\x30\x33\x2e\x33\
+\x30\x32\x2c\x32\x32\x34\x2e\x32\x36\x34\x2c\x32\x30\x37\x2e\x38\
+\x39\x38\x7a\x22\x2f\x3e\x0a\x09\x09\x3c\x2f\x67\x3e\x0a\x09\x3c\
+\x2f\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\
+\
+\x00\x00\x0b\x5c\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x48\x00\x00\x00\x45\x08\x06\x00\x00\x01\x9e\x74\x90\x0f\
+\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x0b\
+\x16\x49\x44\x41\x54\x78\x01\xed\x5c\x7b\x8c\x9d\x45\x15\x3f\xf3\
+\xed\xa3\xb4\xb4\x42\x91\x87\x46\x74\x11\x23\x7f\xd8\x82\x0f\x04\
+\xac\x31\x51\x11\x8d\x88\x20\xa2\xbb\x5b\x6a\xa9\x54\x63\x8d\x96\
+\x6e\x4b\x77\xd7\x06\x44\x59\x8d\x31\xea\x6e\x11\x4a\xa9\xd4\x04\
+\x4d\xe9\x6b\xb7\xd7\x80\x52\x90\x20\x41\x6c\x8d\x12\x2b\x41\xac\
+\x41\x5e\x11\x2d\x56\x53\xa1\xb4\x74\x4b\xbb\x8f\xee\xde\xf1\x77\
+\xe6\xde\x33\x3b\xdf\x77\xbf\xd7\xfd\xf6\xde\xdb\xee\xd2\x2f\x69\
+\x67\xe6\xbc\xe6\x9c\x33\x73\xe6\x7d\x57\x51\xf1\x6b\xee\xd6\x5a\
+\xf2\x4e\xfa\x72\xae\x53\x9d\x6e\xca\x2d\xdd\x7a\x9d\x83\xf0\x65\
+\x0d\x73\x84\x04\x4b\xc8\x02\xea\xa5\xd4\xdc\xa3\x3f\xee\x11\xd9\
+\x72\x5f\x87\x7a\x50\x70\x16\x98\xeb\x50\x0f\x0b\x30\x98\x82\x39\
+\xfe\x83\x35\x0b\x2c\x11\xeb\x16\xd4\xcf\x94\x3d\x5a\x4d\xc8\xfc\
+\x31\x4c\xd6\xd5\xb7\xea\x33\x04\xae\x38\x13\x94\x20\x48\xf8\xc8\
+\xe0\xcd\x7f\x2d\x3d\xfa\x31\xb8\xf2\x03\x82\x94\xb4\x41\xd1\x59\
+\x9b\x3a\xd4\xae\x48\x29\x42\x08\x01\x7b\xac\xe2\x02\x0c\xa6\xa8\
+\xe1\x0c\xeb\xa7\xd6\x1e\x7d\xa9\x10\xb8\x8e\x64\x98\x25\x0a\x22\
+\x84\x81\xd3\xc4\xea\x0c\xb1\x98\x2f\xa9\x48\xe0\xb2\x85\xd9\x8c\
+\x60\x8b\xa9\x0b\xaf\x87\xbb\xfe\xec\x02\x84\x56\x1c\xc9\x65\x71\
+\xe6\x0e\x98\x7a\x81\x10\x94\x9b\xb2\x40\x85\x9a\xb8\x7d\xe7\xb8\
+\xd2\xcb\x11\x84\x8e\xbb\x0f\xbd\x69\x26\xbb\x72\x8e\xcb\x18\x66\
+\x82\x8b\x0f\xa9\x70\x2b\xf0\x0b\x6c\x9b\x08\x71\x08\xa1\xa0\x62\
+\xd3\x12\x41\x61\x1a\xa5\x11\x5e\x22\x28\x0d\x93\xa8\x86\x58\x7e\
+\x01\x8d\xf4\x76\x4f\xd1\x85\x25\x82\x5c\x8d\xa2\x84\x32\x0d\xe3\
+\x10\xef\x67\x8b\x50\x93\x32\x22\x6e\xdc\x71\x89\x99\xd6\xad\x4c\
+\x70\xa6\x1f\x49\x21\x2a\x38\x0d\x5e\x91\x46\xaf\x5b\x9c\x6b\x57\
+\x3f\x11\x7a\x37\xb5\x82\x20\xe4\x4a\xd8\xdb\x07\x64\xa3\x4b\x10\
+\x99\x57\x74\x3f\x4c\xbb\x5c\xf0\x46\x50\x98\xaa\x42\x90\x94\x22\
+\x7c\x3e\xbc\xa5\x43\x6d\xaf\x17\x21\x51\x8e\x8d\x13\x04\x2b\x86\
+\x61\xc5\x36\xd0\xa8\x42\xfc\xd7\xd1\x55\x71\x0c\x51\x38\x68\x62\
+\xdc\x30\xef\x36\xfd\x4e\x23\x28\xb7\x5c\xdd\x1b\x45\x9c\x06\x3e\
+\x3a\x42\x73\x7c\xfd\x48\xcc\x8c\x62\x8e\x33\xdf\x27\x88\x09\xdd\
+\xc1\xd2\x15\x98\x27\x1a\x71\xcb\xc1\xbc\x4f\x10\x23\xe3\x06\xd4\
+\x20\xb3\x5b\x4e\x37\xd8\xba\x1c\x11\x79\x9f\x46\x51\x3e\x8a\xf3\
+\x8d\x95\x1b\xc5\x6c\x09\x12\x32\xc2\xef\xd3\x28\x81\xc7\x87\xee\
+\x7a\x54\xd7\x3f\xf5\x38\x1d\x11\xa0\x4f\x10\xa4\xef\x02\xe2\x6d\
+\x06\x89\x09\x1b\x01\xba\x44\x08\x25\x15\x0d\x20\xc4\x7c\x62\xb6\
+\x4f\x10\x02\xef\x1e\x0c\xe4\xcb\x98\xa2\x8e\xe8\x97\x05\xd2\xf0\
+\xff\x45\x80\xc5\x72\x0d\xcd\xb7\xe8\xcf\x5a\x40\x42\xc6\xd0\x77\
+\x6b\x6b\x92\x90\x17\x9a\x7f\x94\xee\x11\x40\x5c\xda\xda\xad\x17\
+\x32\x7e\x56\x07\x4d\x09\xd2\xc1\x9a\xe8\x25\x49\x90\x98\xcb\x60\
+\xd8\xbf\xa5\x53\x9d\x12\xc4\x19\x41\x0c\x34\xe6\x8d\x52\x2f\xb2\
+\x51\x03\xdb\x93\xf0\xcb\x7b\x83\x02\xa4\x6c\x05\x31\x00\xe3\xcb\
+\x37\x30\xbe\xfc\x50\x90\x35\x49\xa7\xd1\x9b\x73\x8b\xd5\x1e\xa9\
+\xcb\x28\x84\x09\x64\x05\x5a\xfd\x07\x02\x44\x3a\x82\xe6\x6f\xa1\
+\x33\xe9\x81\x5c\x8b\x1a\x76\xe0\xe3\xce\x36\xaf\xd2\xa7\x41\x62\
+\x1b\x0c\xbf\xc9\x15\x36\xeb\xfd\xd4\xd0\xf5\x51\x35\xa2\x8a\x73\
+\x87\x8c\x8f\x23\x70\x67\x83\x4b\x58\xed\xbc\xc4\x09\xd7\xc3\x5d\
+\xdc\x2b\x4e\x64\x85\x7a\x9b\xe8\xc4\x6a\x2b\x50\x22\x5f\x99\x89\
+\xd4\x80\x9b\x57\xea\x56\x0e\x58\xdb\xf9\x82\xcd\x53\x74\xef\x5d\
+\x68\x4e\x5f\x60\x97\x08\x0d\x00\xd0\x0f\x46\x74\x23\x7d\x39\xd7\
+\xa6\x5e\x0e\xa0\x4a\x8a\x4a\xd3\x10\xe4\x9b\x0f\xb1\x3a\x25\xbe\
+\xa2\x21\x7a\x49\x88\x4b\x24\xc5\x00\x0c\x0f\x78\x41\xe2\x0b\x9a\
+\x18\x16\x8b\x8a\x55\xa8\x64\xd8\xb2\x6c\xd5\xcb\x54\x6c\x42\xab\
+\x94\x8a\xb1\x1e\xc2\x6a\x75\x27\x16\x7a\xe7\x26\x55\x86\x45\xd6\
+\xb5\x58\xda\xac\x4b\xa2\x4b\x83\x8f\xf5\x10\x3a\xc0\xd3\x69\x84\
+\x80\xe6\x9f\x29\xe9\x4a\xc8\xb4\xa2\x59\x02\xcc\x2b\x7a\x26\xd6\
+\x43\xb0\xba\x15\xc4\xfc\xaf\x2a\x1f\x06\xe4\x07\x30\xec\x9c\x2f\
+\xc2\xb1\x5e\xdc\x11\xab\x90\x10\x8e\x37\xc5\xe0\xfb\x2c\x2a\x3e\
+\x27\x28\xc7\x46\xb0\xa2\x07\xb1\x50\xff\x14\xe3\x63\x15\x72\x47\
+\xd1\xa0\xb0\x72\x22\x30\x4c\x19\xc8\xbb\x17\xd3\xfd\xe7\xbb\x94\
+\xc2\x92\x74\xec\xe3\x6d\xec\x10\x8a\x85\xc1\xb1\x89\xa6\x04\x07\
+\xc7\x31\xd2\xec\x39\xd7\xb0\x24\x43\x3c\x44\xc8\x58\x1f\xd9\x45\
+\x87\xb2\x57\x1b\xce\x89\x48\x7d\x5e\x30\x08\x92\x1e\xc9\x47\xa5\
+\x66\x24\xad\xe4\x6c\xaf\xb5\x56\xad\xb7\xd2\x07\xf5\x08\xf1\x84\
+\x7d\x9a\x54\x0c\xc3\x1f\x42\x90\x7c\x52\xca\x51\xa9\x51\x48\x90\
+\x21\x8a\x09\x2a\x73\x0a\x45\x36\x43\x91\x79\x69\x05\xf8\x14\x62\
+\xa6\x45\x6b\xf5\xb4\x57\x0f\xd2\x6a\x44\xc0\xc5\x18\x14\x9b\xd2\
+\x0a\x4a\x45\x87\xfd\x34\x2a\xe4\xc1\xf6\x67\x58\x76\xae\x0a\xe3\
+\xb1\x0a\xb1\xab\x5b\x56\x52\x3f\x88\xa7\x87\x11\x56\x03\x06\xef\
+\x6d\x85\xf7\xae\x70\x65\x1b\x85\xd8\x2b\xfb\xfb\x2b\xdf\xa1\xdd\
+\x8a\x62\xf2\x87\x11\x79\x76\x1d\x66\x14\x72\xc3\x92\x19\x01\xdc\
+\x50\xaf\xe8\x26\x73\x9e\x18\x23\xa9\x5c\x14\xb7\xc2\xdc\x5b\xe8\
+\xa2\xbc\xa6\x5f\xa0\x25\xde\xe2\xf0\xef\x84\x52\xef\xe6\x32\x2f\
+\x61\xef\xc0\xc0\xf5\x75\x41\xca\xda\x56\xca\xd5\x4a\x11\x40\x97\
+\xa3\x9f\xde\x27\xf2\x4f\x20\x9a\xbe\xbe\x53\x1d\xe2\x25\xac\x55\
+\xa6\xa1\x91\xce\xe1\x85\xb6\x10\x55\x33\x45\xa7\xde\x8a\x3e\xb4\
+\x5d\xea\x18\x52\xb4\x81\xf3\xbe\xd9\x7e\xd3\x52\x65\x07\x31\x21\
+\xac\x66\xfa\xae\xf3\xe9\x63\x22\x1f\x8e\xb9\x92\xf3\x3e\x85\x04\
+\x59\xab\x34\xac\x35\x8e\xaa\x42\x61\x86\xc7\xce\xf6\x2d\x2b\xf5\
+\xf7\xe1\xca\xf7\x84\x31\xc6\xc1\xd0\x37\x9e\xdc\xd2\xae\x6e\x8c\
+\xa3\x89\xc2\x45\x2a\x64\xb6\xd5\x79\xba\x21\x8a\x31\x0e\x0e\x23\
+\x2e\x45\x14\x1d\x40\xc7\x2d\x7b\x5b\x1e\xd9\x64\x18\xe3\x9f\x89\
+\xab\x34\x09\xa7\xea\xb2\xf1\x47\x7a\x08\xc7\x43\xf7\xe1\x24\xe3\
+\x4c\x2f\x4f\xe7\x25\x55\x1e\xc4\xe7\x3d\xda\xd9\xb7\x5c\xfd\x27\
+\x08\x4f\x53\x8e\x54\x88\x99\xb1\xc6\x65\xa1\x99\x04\xa7\xa9\x3c\
+\x8c\x26\xb2\xc9\xc2\x88\x6b\x01\x3b\xae\x50\x92\x97\x23\xfb\x10\
+\x3a\xf4\x54\x1a\xa5\xc3\x49\x02\xb0\x32\xc8\x23\xbc\x71\xba\x59\
+\x99\x2f\xb2\xc9\xb0\x39\x49\x35\x86\x60\xc6\xf6\x16\xac\xd6\x6f\
+\xac\x8c\x3a\x31\x73\x59\x5f\x3b\x2d\x4d\x55\x89\xa2\x7d\x77\x5f\
+\xa7\x5e\x49\x45\x9b\x82\x28\xb2\xc9\x70\xf3\x08\xe3\xcb\x3f\xdf\
+\x49\x51\xa7\x25\xc1\x68\xde\xc6\x95\x14\xbf\x17\x39\x8d\x6c\x32\
+\xa1\xaa\x56\xda\xa5\xb5\x07\x65\x6e\x13\xf9\x98\xff\xae\xe1\xfc\
+\x51\x51\x08\xf3\xe4\xd5\x4f\xf5\x20\x64\xe4\xc3\x6e\x04\x8b\xfd\
+\xed\x5c\x8c\x6c\x32\xa1\x1d\x6f\xca\xe7\x94\x54\x38\xde\xb3\xa2\
+\x30\xf9\xfa\xbe\x59\xed\x54\x9f\xeb\x28\x80\x22\x15\xba\xf6\xc7\
+\xfa\xe4\x43\x23\xb4\xdf\xc7\x59\x2c\x24\xed\xcf\x7d\x3c\xc3\x74\
+\xbf\xaf\x1c\x28\x98\x35\xbc\x73\xe0\x10\xd9\x64\x87\x46\xa9\x2b\
+\xc0\x6b\x8b\x73\x57\xea\xc8\xab\x01\x4b\x24\x19\x3d\x76\xca\x2b\
+\x20\xa4\x87\x31\x7e\xb5\xb2\x61\xc1\x55\x63\xa4\x87\x70\x5e\xb3\
+\x0c\x07\x05\x6d\xd8\xae\x98\xad\x92\x08\x43\xe7\xdb\xdb\xdb\xae\
+\xfe\x22\xe5\xc4\x94\x6f\x7f\x8b\x4d\x54\xe7\xd1\xfb\x92\x78\x23\
+\x15\xe2\x8a\xa0\x54\xa4\x07\x13\x15\x11\x02\xcd\x77\x54\x85\x0f\
+\xe3\xf9\x58\x47\x16\x60\x20\x1d\x7f\x85\x01\x81\x25\x45\x35\x76\
+\x68\xba\x69\x29\xfd\xad\x04\x1f\x00\xf8\x14\xe2\xcb\xe1\x00\x7e\
+\x5c\x45\x6c\xd1\x1b\xdc\x26\x2f\x0e\xb6\xb1\x32\xf9\xc0\x6a\x8d\
+\x50\x1c\x19\xa6\xe7\xf8\xd6\x51\xca\xe3\x4d\xf7\x1f\x44\xc0\xcb\
+\xa7\x92\xbd\xc3\xa4\xa6\xc3\x86\xed\xed\x71\x57\xf1\xcd\xdc\x52\
+\xf5\xa2\xc8\x4b\x9b\x5e\xd3\xad\x4f\x1f\xf2\x68\xb9\xce\xd3\x0a\
+\x97\x27\xed\x50\x61\xbc\x31\xf3\x0d\x74\xa2\x7b\xfa\x81\xa0\x98\
+\x4f\xc3\x34\x1f\x8a\xba\x32\x53\xe5\x07\x99\xca\x77\x8c\x89\xd1\
+\xb7\x8e\x66\xa7\x62\x06\x91\x0d\xe9\xaa\x9c\x0f\x71\xc8\xcf\xa0\
+\x99\xb9\xaf\xaa\x03\x65\x2b\x24\x0c\xf6\x04\x4d\x9b\x7d\x77\xe1\
+\x92\x5a\x90\x69\x52\x85\x5b\x20\x4d\x8f\x21\xd8\x17\x17\x37\x09\
+\x69\xb8\x2c\x8d\xf5\x90\x85\x38\x19\xd3\x1f\x14\xdd\x8c\x86\x5b\
+\x88\x4a\xa6\x3a\xa8\x09\x9d\x85\xd1\x7f\xf0\xea\xe8\x86\xde\xe5\
+\xea\xf7\x49\x86\x94\x38\xc8\xb4\x58\x3f\xdd\x0d\xa7\x7c\x2e\x89\
+\x79\x92\xe0\x77\x7b\xf5\xf4\x99\xbe\xeb\xd5\x13\x61\xf6\x58\x07\
+\x99\xe3\xee\x1e\xca\xbd\x8e\x1c\xe3\xf3\x07\x2f\x19\xd0\xab\x2e\
+\xe8\xbd\x5e\xfd\xcb\x45\x18\x07\x71\x28\x0d\x2a\xfa\x07\xc2\x28\
+\xfc\x80\x5a\xd1\xef\x1a\x1a\x68\x51\xad\xcf\xfb\x5c\x45\x2b\x91\
+\xe7\x8d\xa6\x1a\x35\xd3\xc7\xb7\xd0\x11\x7c\x93\xb8\xc8\x87\xa3\
+\xbe\x86\xb5\xf4\x9d\xb6\x6c\x0e\xcc\x0f\xd2\xde\x88\x31\x66\x1b\
+\x96\x97\x97\x04\x57\x74\xc2\x3c\x91\x53\x2c\x3c\x17\xc1\xe6\xb5\
+\x61\x36\xc0\x49\xf6\xfe\xd8\xe3\x3b\x96\x30\xe7\xa0\x6b\x6d\xc0\
+\xe4\xfc\x91\xc9\xe8\x1c\x76\x0a\x16\xc2\x3f\xc5\x24\xfe\x89\x30\
+\x07\x61\x43\xb4\x66\xc9\x2a\x6d\xde\x35\xf1\xbe\xf1\xe2\x30\x22\
+\xbe\xe5\x08\x83\x4f\x26\x18\x9c\xf4\x30\xec\xd9\x16\x62\xd3\xb4\
+\x3d\x23\x85\x97\xe4\x1e\x7a\x4f\x53\x08\x01\x55\xfa\x0a\x28\xac\
+\x8e\x63\x01\x86\x48\xd9\x15\xa6\x07\x7a\x8e\xf1\x4b\xe8\x40\x15\
+\xc6\xf0\x7a\x85\x65\xda\xe9\xcc\x5b\xa3\x67\x1e\x39\x84\x3b\x5c\
+\xc2\x6b\xb9\x5a\x7f\x0a\xc7\xe5\x1e\x9d\x87\x55\xf1\xbe\x5a\x54\
+\x9d\xa9\x07\x1d\x39\x4c\x37\x1f\x15\xe7\xb0\x47\x70\x43\x8b\x23\
+\x46\xae\xbf\x26\x5f\x26\x07\xf1\xf9\x0c\x62\xb7\x07\xb3\x80\xae\
+\x89\x96\x52\x09\xea\xc3\x14\xbc\x12\x17\x70\xe9\x8e\x85\x85\x6f\
+\x1c\x69\xa6\x10\xe3\xfa\x70\x62\xdf\x89\x84\xff\x4d\xea\x2f\x53\
+\x0f\x9a\xd4\x1e\x09\x18\x77\xdc\x41\x01\x87\x04\x8b\xc7\x1d\x14\
+\xf4\x48\xa0\x9c\x79\x0c\x32\x1b\xbf\x3c\x7d\x11\xf2\xce\xc5\x50\
+\x6d\xcf\x9e\x03\xf2\x93\x8b\x8a\x5e\xd1\x1e\xfd\x8a\x5f\x75\x26\
+\x13\xd7\x9e\x22\x93\x83\xf0\xa3\xa1\x25\xf9\x51\x5a\x55\x91\x29\
+\x8c\x85\x8c\xd2\x8d\xd8\x3c\xee\xdb\xd2\x4e\xa7\xa6\x39\xba\xae\
+\xa5\x9b\xb2\x86\x58\xc5\x17\x69\x58\xdb\xec\x3f\x1a\xce\x41\xfb\
+\x9c\x14\xe6\x70\x6c\x58\xfb\x19\x9e\xa9\x07\xe1\xd7\x62\x1b\xc1\
+\xbb\x71\x6e\xb7\xbe\x08\x77\x39\xb3\x3d\x2f\x9b\x1c\x56\x00\x0a\
+\xee\xad\xc3\x4f\xf7\x36\x77\xa8\xbd\x5c\xae\xe5\xc7\x77\xf9\x03\
+\x83\xf4\xe9\xb0\xd5\x1c\x1e\xdf\x3d\xce\xba\x64\x72\x90\x18\xd1\
+\xdb\xa9\xfe\x84\x3c\xff\x9b\x70\x5f\xf3\x5a\x7d\xd2\xc0\x41\xfa\
+\x7b\xd8\xf8\x89\xc5\xe8\xed\x1b\xdb\xd4\x6e\x36\x6a\x5c\x0e\x9a\
+\x70\x5e\x81\xc2\xcd\x77\xe8\xe9\x6a\x80\xd6\xeb\xfe\xc2\x8b\xc4\
+\x12\x1b\x70\x7a\x8a\x13\xc5\x36\x81\x4f\x1a\x07\x99\x77\x3b\x79\
+\xba\x0c\x63\xd9\x3b\xf0\x52\x0e\x3b\x21\xfb\x9d\x82\xc2\x59\xe8\
+\x29\x97\x20\x9c\x67\xf2\xcb\x1e\x9e\x17\xc2\x3e\xb3\x8d\xe9\x50\
+\xc5\xb7\x02\x05\x8a\xcc\x0e\xe2\xf8\x1d\x1c\x34\xbf\x81\x9c\x8d\
+\x0a\x23\xe5\x40\xb9\x03\xa8\xf8\x37\xbd\xcb\x69\x7d\xb5\x06\x61\
+\xbc\xd1\x58\xad\x47\x69\x31\x9b\x64\x8c\x0f\x78\x20\x50\x2c\xf5\
+\x8d\xa2\x47\x1a\x1b\xe9\x2a\x84\x95\x19\x98\x5d\x82\x48\xc3\x5c\
+\xa2\x60\x1e\x57\x9c\x9d\x03\x03\xf4\xa3\x20\x3c\xac\xcc\xca\x61\
+\x46\xf8\x42\x4b\x0f\xad\xc3\x5f\x8a\x78\xd3\xe6\x65\xea\x7f\x61\
+\x74\xe3\x84\x7d\xa8\x5c\x7e\x34\xda\x5f\xc1\xb3\x02\xe1\xf4\x50\
+\x1c\x6f\x26\x07\x41\xf8\xf3\x30\xba\xbc\x0f\x37\x9c\xa7\x7a\xf4\
+\x6a\x79\x4c\xe9\xa8\xa1\x4b\xa8\x36\xd0\xf3\xe7\xc0\x3d\x8d\x3f\
+\x49\xf0\x5f\xbc\xe9\xdc\x0d\x69\x3b\xb0\x20\x1d\x48\x27\xb5\x40\
+\x95\xc9\x41\xf0\x3a\xff\xac\x58\xe1\x2d\xcc\x5b\xa1\xc0\x6c\x44\
+\x7c\xe4\x4a\x1a\xf8\x7e\xbc\xea\x7b\x02\xbf\x58\x7d\xad\x1c\xc5\
+\xca\xa2\xe5\x63\x97\x10\x17\xc1\x31\xb7\xf7\x76\x94\xf1\x3c\x26\
+\xa4\xd2\x7a\x18\xb7\x0b\xc2\x9b\x82\xb8\x79\x3d\xba\x29\xe9\x5c\
+\x1a\xef\x6b\xfe\x0d\x3e\xfe\x77\xb4\x3f\xf7\x67\x0e\x56\x97\x86\
+\xfc\xf8\x1f\xeb\xc2\xc9\xf4\x5b\x2b\xd1\xc9\x8c\x68\xfa\x9e\x53\
+\x3c\x66\xb3\xc5\xfb\xad\xc2\x1f\x00\x72\xb5\xc4\x9b\x6f\xfc\xf4\
+\xe2\x25\x17\x94\x25\xef\x9d\x3c\x83\xae\x43\x2f\x2a\x89\x4b\xf4\
+\xd8\xf9\xa8\xfc\xd1\x4a\xbe\xd0\xc9\xa2\x60\x1c\x0f\xf4\xfb\x0e\
+\x7a\x7f\xe8\xe5\x1f\xf8\xbe\x12\xc7\x9b\x16\x87\x0e\x44\x34\x91\
+\xae\x9e\xbf\x74\x97\x9e\xf1\xda\x3e\xfa\x2e\x1a\x70\x59\x94\x91\
+\x78\x1b\x77\x19\x8e\x65\x7f\x1d\x85\x2f\x07\x6e\x1c\xc4\x0c\x93\
+\xe2\xf1\x82\xa2\x17\xa6\x9e\x40\x17\x56\xf2\x79\xb2\x75\x90\x78\
+\x75\x82\x3e\x7f\x79\x16\x1b\xe6\x2b\xfa\xda\xd5\x73\x62\x47\xa5\
+\xd2\x12\x07\xb9\x82\xf9\x4f\x80\xe1\xcf\xd1\x7c\x1b\xdd\x79\x21\
+\x62\xfd\xd8\x79\x40\x85\x69\x1d\x5b\x8a\x47\x8a\x8f\xa0\xcc\xae\
+\xdb\xd5\xbb\x92\xf9\xff\x03\x97\x6f\xb3\xa7\xdd\xab\x63\x63\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x08\x1e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\
+\x00\x00\x07\xe5\x49\x44\x41\x54\x68\xde\xcd\x5a\x5b\x6f\x1d\x57\
+\x15\xfe\xd6\x9a\x39\x27\xc7\x8e\x9d\x38\x17\x27\x84\x80\xd4\xa6\
+\x12\x42\xc2\x79\x2b\xa0\x22\x54\xda\x08\x5a\x04\x6a\x29\xe5\xa2\
+\x02\x0d\x57\x51\xf1\x0f\xa0\x34\x14\x35\xa4\x85\x4a\x94\x37\x90\
+\xfa\x82\x90\x5a\x51\xb5\x2a\xea\x0d\xa1\x42\xab\xb4\x3c\xc0\x43\
+\x24\x84\x44\xc3\x45\x90\x36\x0f\x25\x51\xe2\xc4\x71\x9a\x3a\x71\
+\x7d\xce\xac\xef\xe3\x61\xce\xd8\xe3\x73\x66\x8e\x7d\x6c\xab\x65\
+\x24\x6b\xd6\x59\x5e\x7b\xcf\xde\xb3\xbe\xf5\xed\xb5\xd7\x1e\x43\
+\xc5\x75\xe8\x89\x0b\xe9\x48\xe2\x77\x9a\xe3\x40\x3b\xc3\xd5\x14\
+\x46\xf0\x0e\x5c\x6e\x98\x6f\x26\x38\x19\xc0\xd1\x85\x36\x1f\x3d\
+\x72\xc7\xf6\xac\xd7\xc6\x7a\x15\x0f\x3c\x75\xf1\xf0\xe5\x05\xfd\
+\x60\xfa\x12\xf1\x56\x56\x61\xf0\x36\x5f\x02\xd0\x4a\x81\x5d\x5b\
+\x1d\xa3\x0d\xfb\xd1\x3d\xb7\x4f\xdc\x5b\x3b\x81\x1f\x3f\x35\xfb\
+\xca\xab\xe7\x38\xf5\x56\x47\x6a\x24\x6e\x12\x09\x00\xee\xee\x24\
+\x59\xdc\x17\xdf\x50\xe9\xf7\x5a\xe5\xd5\xd8\x9a\xb9\x77\x82\x6a\
+\x35\xcc\xae\x99\xf4\xe3\x77\x7f\x76\xdb\xfe\xbe\x09\x3c\xf0\xd4\
+\xec\x2b\xff\x3a\x15\x53\x96\x18\xfc\x9d\x7e\xed\x35\x17\x05\x28\
+\x84\xf7\xef\x4d\x8e\x7f\xbf\x3b\x09\x07\x80\xc3\x4f\xce\x1e\x3e\
+\x71\x36\xa6\xe0\x82\x41\x94\x44\x8a\x90\x96\xcb\x65\x5d\x9d\xcd\
+\xb0\xf2\x30\xb6\x06\x11\x2e\x9c\x38\x1b\x53\xf7\x3d\x39\x7b\x18\
+\x00\xec\xee\xc7\x2e\x34\x82\x68\x9f\xba\x90\xa9\xe1\x6e\x44\xd7\
+\x85\x70\xef\x95\xcb\xba\x3a\x9b\x61\xe5\xb5\xb4\xeb\x90\xda\xbb\
+\x23\x35\x90\xcd\x34\x49\x70\xf0\xec\x6c\x86\xc4\xcd\x64\x82\xc1\
+\x3c\x0f\x9e\x7e\xb9\xac\xab\xb3\x19\x56\x5e\x4b\xbb\xc4\xcd\xce\
+\x5f\xcc\xb0\x67\x7b\x7a\x30\x25\x71\x60\x3e\x13\x1a\x09\x28\xc1\
+\x01\x70\xf1\x05\x97\x64\x52\xec\xd1\xf5\xd9\xf4\xc9\x06\xb8\xd9\
+\x60\x9b\x95\xfa\xa8\x91\xe7\x33\x39\xa1\x03\x69\x27\xd3\x55\x26\
+\x41\xaa\x0f\x9e\x4b\x57\x02\x23\x4d\x1f\x2e\xe2\x0c\xc8\x32\xa1\
+\x1d\xc2\xe6\x4d\x8e\x34\xd9\x58\x66\x30\x09\x59\x1b\xfb\xd2\xa0\
+\x5a\xca\x27\x50\xe9\xce\xb9\xf9\xc0\xa1\xcf\x6d\xc3\xb5\xfb\x46\
+\xbc\xf4\x06\xd0\xe3\x85\x5a\xf9\xdf\xa7\xdb\x78\xe8\xb7\x17\xfd\
+\xcc\x1b\x19\xc6\x5b\x0e\xb3\xf5\x43\xc8\x60\x2e\x09\x01\x35\x9d\
+\x04\x24\x81\x22\x4d\x06\x8a\x2c\xcb\xf3\x1d\xf1\xda\x7d\x23\x50\
+\x97\x93\x59\xba\xca\xbf\xeb\xe4\xf7\xbd\xbb\x89\x87\xef\xda\xc5\
+\x3b\x3f\xba\x85\x33\x6f\x32\xd7\x97\xfa\xaf\x7a\xe6\x6a\x64\x49\
+\x20\x01\x97\x04\x08\x30\x19\x24\xc1\x64\xcb\xe4\x02\x79\x75\x08\
+\x73\x77\xb8\xfb\x40\x19\x00\xbe\x70\xdd\x18\x7e\xfe\xad\x9d\x98\
+\x5b\x20\x8c\x4b\xfd\x57\x3d\x73\x35\x32\x04\x84\x84\x34\x94\x7b\
+\xa0\x1b\xc0\x7d\x30\x90\xb8\xb8\xea\x96\xef\x00\x70\xd3\xe1\xd7\
+\x01\x83\x37\x12\x43\x9a\x18\x54\xb4\x15\x90\x38\xbc\x91\x5a\x31\
+\x73\x07\x80\x56\xd3\xb0\xb9\x69\x4e\xa9\x58\x41\x7d\x35\x30\xac\
+\x1c\x17\x04\x06\x90\x32\x04\x41\x90\xaa\x19\x41\x79\x74\x57\x2d\
+\xfb\xd8\x32\xea\x9e\x3a\x68\x66\x00\xe4\x54\xa9\xad\xc0\x2e\x33\
+\x2c\xf6\xb9\xd0\x96\xc3\x40\xc3\x92\xde\x0c\x6e\x66\x43\xb3\x90\
+\x24\x27\x84\x94\x50\xe1\x81\xea\x64\x6a\x00\x3d\xb5\x23\x90\xb8\
+\xc3\x00\x5c\xbc\x1c\x18\x6d\x39\x4c\xc3\xb1\xc9\x42\x26\xa4\x0e\
+\xb4\x86\x64\x39\x49\x50\xa8\xeb\x81\x81\x10\x52\x2d\x84\x22\x13\
+\x90\xca\x2f\x5c\x0e\x3c\x7c\xd7\x1e\x5c\xb5\xbb\x39\x34\x14\x00\
+\xe0\xc1\xa7\xcf\xf9\xd1\xbf\x5d\xc1\xb6\xb1\x64\xf5\x10\xca\x59\
+\x08\x9e\x11\x80\x54\xe4\x1d\xe5\x5c\xa7\x9b\xab\x68\x91\x55\x7a\
+\x98\x86\x94\x10\x21\x8e\xb7\x8c\x57\xed\x6e\x62\x18\x76\x2a\xf7\
+\xf9\xdd\xdb\x26\xf9\xb5\x1b\xb6\x72\xfa\x8d\x4e\xdf\xf3\xeb\x64\
+\x48\x60\x08\x29\xb5\x76\x0f\x28\x8f\x1f\xb7\x1e\x9b\x35\xc8\xfe\
+\xe5\xeb\x27\x30\x3e\xe2\x78\xe8\xd9\x73\xbe\x6b\x6b\x63\x75\x1e\
+\x20\x90\x92\x02\x19\x90\xac\x32\x88\xc9\xa8\x0d\xe2\x8c\x74\x06\
+\xd8\xcd\x8e\xd6\xbd\x1f\xb8\xe5\x83\x5b\x5c\x12\x7f\xf6\xdc\x79\
+\xec\x18\xf3\x95\x83\x58\x84\x93\x1a\x18\xa8\x2b\xfd\xaf\xf8\xdb\
+\xa8\xeb\xd6\x0f\x6d\xc5\x37\x6f\xdc\x86\xd9\xb9\x6c\xc5\x20\x66\
+\xe1\x81\xee\x20\x86\x86\x90\x83\x90\xcc\x8b\x77\xb3\x56\x08\x95\
+\x75\x00\xfc\xab\x07\xb6\xe3\xe4\xf4\x02\x8e\xfd\xe7\xb2\x6f\x6a\
+\x78\x0d\x84\x80\x20\xe1\x41\x42\xf9\x8c\x6a\x03\xa7\x2e\x88\xab\
+\x02\x7d\x2d\x41\xdc\xa7\x93\xf8\xc3\x3b\xf6\xe0\xd2\x95\xac\x3e\
+\xa0\x21\x90\xca\x3d\x80\x10\x54\x93\x2c\x2a\xea\xe1\x41\x0a\xa2\
+\xfa\xd3\xbb\x75\x6f\x1d\x05\x37\x03\x43\xf5\xcf\x57\x69\x02\x5a\
+\x5a\x19\x87\x63\x21\x74\xa1\xb7\x4e\x16\xaa\xfb\xbf\x24\xd7\x52\
+\x16\xd6\x9f\x4a\xe4\x13\x60\x11\x84\x43\xa7\x12\x26\xb9\x24\x22\
+\xd4\xc7\x42\xa7\x67\x16\x78\xf0\xa1\x57\xf1\xe6\x5b\xf2\xc4\xeb\
+\xd9\x24\x08\xdf\x39\x9e\xf2\xf1\xef\x5d\x83\xf1\x91\x74\x59\x1f\
+\x05\x64\x6a\x59\x88\x44\x1a\x91\xd3\x28\xac\x1a\x43\x11\x1c\xe8\
+\xea\x60\xc0\x2b\xda\x3e\xf2\xf2\x0c\x3a\x41\x4c\x6e\x4d\x56\x84\
+\xcc\xec\x5c\x1b\xbf\xf9\xd3\x05\x7c\xfd\xe3\xbb\x7a\x20\x4a\x44\
+\x4e\xe3\x95\x10\x8a\x28\x3c\x40\xc0\xea\x32\x43\x0e\x60\x21\x09\
+\xa2\xb9\xbc\x1f\x42\x77\x7e\x6c\x87\xff\xee\xd8\x05\x9c\x99\x69\
+\x17\xdb\xca\x4a\x28\x04\x85\xc9\x89\xd4\x6f\xff\xc8\x36\x54\x2c\
+\x94\x8e\xa8\xcb\x46\xf3\x09\xa6\x11\x04\xf3\x19\x54\x42\x28\x54\
+\xbf\x90\x09\x72\x2a\x28\x5a\x1f\x84\xf6\xee\x6c\xf2\x8f\x0f\x4e\
+\xad\x26\xc3\xec\xde\xfb\x61\x18\x0a\x46\x3e\xee\xfe\x76\x82\x23\
+\x88\x94\xc1\xbc\x62\x54\x03\x21\x51\x03\x2b\x4d\xca\x53\xe9\x4a\
+\x86\x02\x04\x77\x47\x51\xcc\xab\x92\x97\xeb\xac\xff\xd9\x44\x3d\
+\x0b\x81\x48\x33\x12\x4e\x42\x4b\x6e\x5e\xee\xe2\xe0\x80\x45\x87\
+\x08\xc2\x8b\x18\xd8\x68\x16\x8a\xa0\x47\xb9\x0c\x55\xae\xfb\x16\
+\x13\x88\x60\x8e\x9e\x9a\x5c\xa8\xa8\x27\x55\x42\x88\x72\x33\x31\
+\xf7\xc2\x72\xf7\x9f\x3a\x3f\xcf\xcf\x1f\xf9\x07\xe6\xae\x64\xee\
+\x03\x36\x2c\x41\xf9\xe4\x44\x83\xcf\xdc\xb7\x1f\x5b\x46\x1b\xcb\
+\xfa\x00\xb9\x54\xcf\xea\x65\x21\xc8\x23\xba\x13\x70\x1b\xc0\x34\
+\x5d\x16\xa8\x44\x98\x84\x10\xe1\xd6\xbf\x92\xfd\xf2\xf9\x33\xe8\
+\x74\x32\xec\x9a\x48\x57\x64\xa1\x99\x4b\x1d\x3c\xfe\xd2\x34\xbe\
+\xfd\xe9\xbd\xcb\x19\x90\xb1\xf8\xfc\x4a\x86\x14\x91\x46\x87\x48\
+\x52\x01\xa8\x86\x50\xab\xe1\x78\xe2\xe5\x33\xf8\xe2\x0d\xef\xea\
+\x73\xb7\x19\xc1\x90\x9b\x45\x9f\xfb\xbf\x71\xf3\x1e\x7f\xee\xcf\
+\xd3\xf8\xef\xb9\x05\x24\x0e\x2f\x0a\x03\x05\xdb\x15\x72\x10\xd8\
+\x35\xd1\xf4\x3b\x6e\xd8\xdd\xd7\x07\x29\x5f\x42\x50\x6f\x6a\x2d\
+\x44\x56\xb0\x90\xb1\x36\x9d\x1e\x69\x3a\x7e\xf2\xd8\x49\xbf\xf7\
+\x57\x27\xfa\x2a\x73\x3b\xb7\x34\xf3\x94\xdb\xfb\x19\xe4\x3d\x93\
+\x9b\x78\xec\x17\x1f\x5e\x1f\x0b\x05\x19\x59\x35\x84\xcc\xe4\x11\
+\x81\x34\x8b\x40\xd3\x89\x41\x47\x19\x63\x2d\xc7\x58\xcb\x7b\xcf\
+\x15\x04\xe4\x8b\x49\x5d\x9e\xb4\x56\x16\x5a\x84\x2b\x09\x88\xb5\
+\xe9\x74\x16\x96\xd3\x28\x93\xc0\x90\x67\x31\x2a\x0f\xd4\x36\x70\
+\x3f\xd0\x0d\x2d\x98\x01\x11\x83\x62\x40\x60\x18\xd2\x92\xd1\x6a\
+\x6b\x34\xde\xf3\xa6\x17\x17\xda\x8d\xa6\x51\x32\x73\x32\xa9\x1d\
+\x4b\x84\x21\x8d\x2c\xc0\x06\xa1\xd5\x55\x8a\xfb\xaa\xd3\x14\x28\
+\x66\x45\x11\x8c\xd2\xfa\x8f\x98\xcc\x0c\x66\xe6\x24\x19\x35\x34\
+\x6a\x80\x47\x16\xdd\x85\x8a\x00\x08\x2f\xdd\xeb\xe4\xb2\xce\x41\
+\xc0\x01\xbf\x34\xd7\xf1\xa3\x7f\x99\x86\x99\x7b\xf9\xad\xae\x46\
+\xae\xd2\x99\x99\xff\xfa\x0f\xaf\x63\xb4\xe9\x03\xc7\x12\x91\x21\
+\x8d\x2c\x6b\x33\xaf\x95\x51\x80\x17\xd5\xd0\x2a\xb9\xac\x2b\xeb\
+\xb7\x6e\x4e\xf1\x9d\x9f\xfe\xd5\xe7\x17\x62\xe8\x0a\x5b\xdd\xb9\
+\xc2\xe6\x56\xe2\xe3\xa3\x8d\x7c\x83\x56\x31\x16\x03\x3c\x02\xed\
+\xb4\xdd\xd1\x6b\x92\xae\x8b\xee\xc6\x2a\x4a\x3d\xf5\xca\x65\x5d\
+\xaf\xcd\x96\xd1\x04\x63\xa3\xc9\x06\x8c\xbe\xd4\x77\xc1\x4e\x15\
+\x63\x49\x0c\x68\xb7\xf1\x5a\x1a\x8c\xa3\xed\x36\xbe\x92\x24\x70\
+\x96\x02\xa4\x4a\x66\x4f\x30\xad\x64\xbf\x1a\x79\xad\xed\xda\x01\
+\x04\x71\xd4\xde\x7b\xfb\xf3\x8d\x04\x68\x4f\x8c\x43\xcc\x8b\xc6\
+\x43\x05\xf1\x5a\x8e\x87\xd6\x7b\xc4\xe4\x06\xcd\xbe\x09\x83\xd0\
+\x4c\x2e\xfd\xf3\x51\x36\xf7\x7d\xa9\xd1\x6a\xe8\x7a\x87\x75\x77\
+\xea\x02\x64\x06\xf5\xca\x65\x5d\x9d\xcd\xb0\xf2\x90\xed\x60\x96\
+\x05\xed\x8d\xcb\xba\xff\xf4\xb3\x9f\x7a\x71\x71\xf5\xda\xf1\xc9\
+\xe7\x8e\xef\xdd\xe1\x1f\xd0\xb2\xb5\xca\x7a\x64\xf5\x2c\x78\x55\
+\x36\xc3\xca\xc3\xb5\x33\x00\xa7\x67\xf8\xf7\xf3\xcf\xdf\x32\xd5\
+\xf7\xa9\xc1\xf6\x9b\x9e\x7d\x65\xf7\x76\x9f\x6a\x78\x17\x4e\xfa\
+\x3f\x81\x90\xe5\xb0\xe9\x10\x36\x3d\xc3\xe3\x33\x2f\xdc\xba\xbf\
+\xf6\x63\x8f\x6d\x9f\x78\xfa\xc8\xa6\xd4\xef\x99\x18\x13\xd2\xc6\
+\xf2\x7a\xff\xc6\x26\x0c\x03\x0f\x38\x97\x9e\x69\x40\xd6\x21\x2e\
+\xce\x19\x16\x32\xde\x3f\xfb\xc2\x6d\x87\x06\x7e\xad\x02\x00\x93\
+\x37\x3f\x93\x66\x19\x0f\x0a\xb8\x31\x4d\x71\xb5\x75\x3f\xb7\x79\
+\xbb\x3e\xa1\xd0\xd2\xe0\xe7\xb3\x0c\x27\x0d\x78\xa9\x99\xfa\x23\
+\x67\x7f\xff\x99\xbe\x82\xe9\xff\x00\xa0\x8e\x43\x09\x34\xd7\x80\
+\xa9\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x06\xdf\
+\x00\
+\x00\x1a\x81\x78\x9c\xdd\x58\x59\x73\xdb\x36\x10\x7e\xcf\xaf\xe0\
+\x28\x2f\xf1\x54\x04\x01\x10\x27\x7d\x74\x7a\x4c\x32\xed\x64\xda\
+\x4e\xd3\x4c\x9f\x69\x12\x92\x59\x53\xa4\x0a\x52\x3e\xfa\xeb\xbb\
+\x00\x25\x91\xb4\xe8\x58\x4e\xdc\xce\xb4\xf6\x03\x89\xe5\x62\x2f\
+\x7c\xd8\x43\x67\x5f\xdf\xad\xca\xe0\xc6\xd8\xa6\xa8\xab\xf3\x19\
+\x41\x78\x16\x98\x2a\xab\xf3\xa2\x5a\x9e\xcf\x3e\xfe\xf6\x36\x54\
+\xb3\xa0\x69\xd3\x2a\x4f\xcb\xba\x32\xe7\xb3\xaa\x9e\x7d\x7d\xf1\
+\xea\xac\xb9\x59\xbe\x0a\x82\x00\x36\x57\x4d\x92\x67\xe7\xb3\xab\
+\xb6\x5d\x27\x51\xb4\xde\xd8\x12\xd5\x76\x19\xe5\x59\x64\x4a\xb3\
+\x32\x55\xdb\x44\x04\x91\x68\xd6\xb3\x67\x3d\x7b\x66\x4d\xda\x16\
+\x37\x26\xab\x57\xab\xba\x6a\xfc\xce\xaa\x79\x3d\x60\xb6\xf9\x62\
+\xcf\x7d\x7b\x7b\x8b\x6e\x63\xcf\x44\xb4\xd6\x11\xa6\x11\xa5\x21\
+\x70\x84\xcd\x7d\xd5\xa6\x77\xe1\x78\x2b\xd8\x38\xb5\x95\x62\x8c\
+\x23\xf8\xd6\x73\x1e\xc7\x95\xdc\x95\x45\x75\xfd\xa8\x31\xfe\xab\
+\xe7\x1e\x45\xd3\x11\x8a\xfc\x7c\x06\xa2\xa4\xe2\xcc\xaf\xaf\x4c\
+\xb1\xbc\x6a\xcf\x67\x94\x0b\xbf\xbe\x2d\xf2\xf6\xaa\x5b\x5e\xc0\
+\xfa\x2c\x37\x8b\xc6\xd1\xbb\x9d\x6e\x05\x5b\xbb\x6f\xf0\x15\xf4\
+\x98\xd4\xbe\xb3\x69\x5e\x40\x74\x3b\xbe\x8e\x73\xfc\x45\x72\x29\
+\xb7\x7b\x60\x57\xd3\xd6\xeb\x1d\xef\xd6\x22\xa0\x00\x8f\x9e\xf5\
+\xe4\x7a\xb1\x68\x0c\x18\x86\x07\xb4\xa6\xbd\x2f\x4d\xc7\x1d\x66\
+\x75\x59\xdb\xe4\x35\xf6\x7f\xa7\x9e\x54\xaf\xd3\xac\x68\xef\x13\
+\x8c\x62\x12\x4b\xca\xf9\xe9\x2c\x88\x9e\xd4\xaa\xc8\x84\x56\xf2\
+\x69\xad\x0b\xff\x37\xd6\x4a\xf6\xca\xce\xa2\xb1\xf7\xcf\x0c\x16\
+\x27\xe2\xd1\x60\x4d\x46\x40\x63\xf3\xd0\x96\xd3\x27\x22\xb9\x73\
+\x1f\x74\xe9\xc7\x83\x34\xa9\x4d\xd0\x4b\x7a\x84\x36\x32\xa9\x4d\
+\xbe\x60\x94\x14\x3b\x3e\x4a\xb7\x57\x45\x6b\x3e\x3b\x46\x4a\x3c\
+\x27\x46\x13\xba\xf0\xf1\x11\x52\xea\xe5\x22\x24\xe9\xbf\x15\x21\
+\xc9\xfe\xbd\x08\x49\xf1\x79\x11\xba\xa7\x20\x51\x22\x4c\x19\x1b\
+\x64\x9a\x3b\x47\x15\x48\x70\xc9\x31\xdf\x53\xef\x09\x50\x31\x52\
+\x2a\x16\x2a\xee\x79\x1d\x95\x23\x4c\x88\x94\x3d\x75\xb9\xd5\xf3\
+\xb1\x2a\x5a\xc8\xdf\x9b\xc6\xd8\x0f\xe0\x95\xf9\xb9\xfa\xd8\x98\
+\xd9\xe3\xe7\xa3\x62\x22\x7b\xd1\x2e\x65\x27\x57\xd6\x40\x89\x79\
+\x3d\x91\x3c\xf7\x1e\x3b\x62\x5a\x3e\xf4\xcd\x9e\xcf\x24\xe2\x4a\
+\x0b\x12\xb3\xbd\xcc\xc5\x3d\x24\x72\x8c\x18\xc1\xbb\x6c\xef\xa9\
+\x77\xde\x09\x05\x1e\x63\xb5\xa7\x66\x93\xbc\xd9\x24\xef\xf1\x0e\
+\x8f\x8d\x05\x87\xf5\x31\x0e\xfb\x04\xf8\xb4\xc3\x1c\x69\xa1\x24\
+\x1f\xb9\x4b\x08\x8a\xc1\x03\xae\xc6\xee\x32\x84\xb9\x50\x7c\xe4\
+\xed\x21\x6b\x36\xc5\xba\x73\xf6\x37\x9b\x56\xcd\xa2\xb6\xab\xf3\
+\xd9\x2a\x6d\x6d\x71\xf7\x26\x64\x08\x2a\x33\x8d\x09\x9f\x63\xc4\
+\x35\x8f\x19\x8e\xe1\x8d\x6a\xae\x18\xa3\x73\x8a\xb0\x56\x3a\x56\
+\x62\x1e\x52\xc9\x90\x50\x4a\xd1\x79\x48\x14\x92\x31\xd5\x54\x9d\
+\xbc\x40\x38\x29\x39\x2e\x9c\xaa\xbf\x9d\x9f\xb8\x1b\x54\x20\x06\
+\xce\x28\x39\xbe\x1b\x31\x62\x1c\xee\x81\x1e\xdd\x0d\x70\x8e\x48\
+\x35\x04\x9b\xbb\x1b\x0a\x69\xc0\x34\x55\xec\x05\xee\x06\x8d\x8f\
+\xf3\x0d\x72\x5c\xe7\xdb\x59\xe4\xba\x13\xff\xb6\x32\x6d\x9a\xa7\
+\x6d\xda\x37\x2e\x3b\x0a\x34\x2f\x7a\xd7\xbc\x40\xb3\x96\xfc\xfa\
+\xfd\xdb\x7d\xd6\xca\xb2\xe4\xf7\xda\x5e\xf7\x29\xc7\x31\xa4\x97\
+\xf5\x06\x32\xd1\x3e\x8f\xba\x96\x28\x4b\x1c\x0e\xd2\xf6\xa2\x58\
+\xa5\x4b\xe3\x3a\xb3\xaf\xa0\x2b\x03\xfd\xfb\x0f\x23\xe6\xf6\x7e\
+\x6d\x7a\xa1\x9d\x58\x6b\x9a\x7a\x63\x33\x33\xd9\xac\xe6\xd9\xaa\
+\x70\x9b\xa2\x0f\x6d\x51\x96\x3f\x38\x25\x83\xec\xda\x09\xf5\xdd\
+\x6a\x6d\x2f\x06\x82\x9d\x03\xdf\x2c\xf7\x59\x70\x64\x42\xd1\x96\
+\xe6\xe2\x7d\xba\xae\x83\xef\xd2\x32\x5d\x41\x0f\x6d\x4d\xe1\x2d\
+\xee\x3e\x0d\xc5\x44\x87\x72\x3c\xe7\x81\x4a\x27\xb9\x73\x63\x64\
+\x1d\x6c\x2f\x8b\xcc\x54\xcd\xd3\x5e\x4f\xf5\xdc\xdb\xbd\x4d\xf4\
+\xee\x97\xf7\x11\xe0\x2c\x3a\xf0\xbd\x33\x79\xca\x7a\x6f\xd1\xe6\
+\xf2\x0f\x93\x8d\x82\xe0\x8f\xfa\xdb\x74\xf9\x20\x30\x8e\x5a\x16\
+\x17\x16\xd4\xdb\xfc\x2c\xda\x2e\x27\x79\x56\x06\x6e\xde\x14\x4b\
+\x47\x1b\xc9\xf6\x86\x1d\x58\xe1\x0f\xad\xae\x20\x73\x5c\x6e\x9e\
+\x7b\x70\x3f\xa6\xd7\x9b\xcb\xe0\x43\x6b\x00\xfb\xf6\xb9\xa7\x76\
+\xa8\xd3\xf3\x3a\xa8\x0f\xa1\xff\xfe\xe1\x91\x0d\xd0\xff\xac\xd3\
+\x1a\x23\x61\x6d\x2c\x80\xb9\x79\x12\x09\xb7\xe6\x12\xed\x88\x5e\
+\x70\x96\x45\xbf\x9a\xb5\xad\xf3\x4d\xd6\xc2\x04\x33\x7b\x08\xb1\
+\x2f\x11\xfc\x7d\xd1\x74\x31\x99\x12\x6c\xcd\x9f\x9b\x02\x76\x7c\
+\x96\xe4\x9f\xea\x16\x02\xf2\xb2\xc6\x1a\x5b\xdc\xf8\xb8\xbb\x23\
+\x6b\x5e\xd6\xde\x0f\x57\xa9\x35\xdf\x94\xc5\xf5\xa1\xcd\x5f\x26\
+\xd7\xaf\xbe\xab\xf3\xa1\x5c\x8f\xbb\x2d\xce\x76\xfd\xdb\x20\x09\
+\x9f\x45\xbb\x2c\xed\x57\xcb\x6e\x57\xdb\xd7\x5d\xff\x5a\xa6\xad\
+\x79\x43\x70\x8c\x60\xd0\x25\x62\xde\xbd\x49\x2d\x77\xf5\xd4\xd7\
+\x92\xf4\xde\x58\xb2\xcb\xf3\xcb\x9d\x07\xed\x41\x09\x57\x88\xc7\
+\x02\xca\x34\x9d\x63\xf8\x77\x2b\xc6\x94\x14\x73\xaa\xb0\x40\x52\
+\x40\x65\x87\x82\x0d\x6d\x20\xa3\x5a\x9f\x8c\xca\xd5\x52\x12\x89\
+\xfb\xee\x3a\x2b\x6c\x56\x0e\x2f\x8f\xeb\xc7\x08\xe1\x54\xd0\x41\
+\x0f\xeb\xdb\x0e\x81\xa0\x6c\x52\x3d\xec\x6d\xa7\xdb\xac\x29\x83\
+\x29\x22\x58\x32\x01\x8e\x3b\x83\xfd\x0a\x2a\x5a\x3c\x0f\x63\xae\
+\xa1\x7a\x73\x4e\xc0\x62\x8c\x60\x4a\x93\x4a\x9c\x0c\x44\x39\x9b\
+\xd7\x69\x7b\x25\x85\x9e\x98\x6d\xc7\xc3\x74\x5e\x34\x6b\x08\x61\
+\x52\x54\xae\xd8\x9e\xd6\x37\xc6\x2e\xca\xfa\x36\xb9\x29\x9a\xe2\
+\xb2\x34\xa7\xfe\x59\x94\xae\x6d\xdf\x91\xfa\xd1\x9b\x9d\x2e\xa0\
+\x68\x25\x50\xce\xde\xbc\x3e\xec\x77\x4f\xfc\xd7\xc1\x84\xe1\x97\
+\x76\x53\x9a\xa4\xaa\xab\xbf\x8c\xad\x61\x2c\xb0\xf5\xb5\x5f\x9a\
+\xed\x7b\xe8\x7f\x94\x00\xd9\x9c\x4a\x4c\x25\xcc\xf5\x5b\xba\x93\
+\x9f\xa5\xeb\x04\x6e\x72\x3b\xa4\xfd\x51\x17\x55\x02\x17\xce\xd8\
+\x1d\xd5\x2f\xca\x02\x1e\x09\xdb\xd1\xf2\xb4\x01\xf4\x5b\x70\x74\
+\xa8\xcb\x51\xbb\xf9\x23\xc1\x3b\x5a\x6f\xee\x2a\xb5\xd7\xc6\x76\
+\x1b\xba\xf7\xb0\x69\x53\xdb\x8e\x28\xab\x22\x1f\xad\x4d\xd5\xad\
+\x87\x57\x61\x39\x3e\x9a\xa5\xe4\x82\x8d\x52\xe7\x03\x40\x3d\x06\
+\xa9\xc7\x41\xf5\x38\xac\xa6\x80\x45\x90\xd2\x92\x72\xe9\x71\xe5\
+\x17\x1e\xfd\x31\x07\xc9\x18\x33\x68\x62\x61\x46\x22\x4c\xb0\x38\
+\x3e\x19\x89\xda\x03\x0b\x9a\xf1\xd1\x87\x97\x82\x56\x0f\xa7\xc3\
+\x69\xe2\x78\x38\x81\x01\xf1\x5b\x89\xff\xbf\x88\x02\xcc\xb8\x63\
+\x98\x3e\x1a\x89\x47\x47\xe3\x1a\xe2\x20\x8c\x29\x4c\x25\x24\xd6\
+\x73\xd7\xe2\x2b\x0e\x01\x0a\xb2\x20\x84\xf1\x56\x88\x18\xd2\x08\
+\x86\x04\x88\xb1\x94\x41\xa8\xa1\xad\x67\x54\x42\xba\x89\x5d\x73\
+\xcf\x83\xd0\xcd\x4e\x4a\x90\xb9\x44\x54\x6a\x4e\xe2\x80\x20\xa2\
+\x94\x24\xf3\x18\x9e\x38\xd6\x01\x24\x65\xac\x08\x99\x73\x24\xb1\
+\xd6\x71\x20\x11\x13\x42\xca\x39\x8c\x18\x52\x52\x16\x70\x18\x93\
+\x18\x07\xd5\x88\x30\x22\x30\x0d\x20\x69\x71\x98\xab\x01\x72\xd0\
+\x44\xc0\x89\x30\x90\xe9\x86\x0c\x18\xca\xe7\x21\xe0\x9e\xc5\x4a\
+\x3b\xc5\x4e\x8f\xd0\x00\x4c\xa7\x88\x81\xe6\xb0\x53\x05\xa3\x55\
+\xa7\x8b\xd3\x20\xec\xb4\x71\x87\x59\xa7\x0e\xec\x01\x6f\x28\x91\
+\xce\x29\xc0\xb2\x54\x6e\xcd\x08\x65\xca\x51\xa0\x84\x10\xb7\x0b\
+\x23\x41\x01\xf7\x9e\x04\xb8\x27\x3a\xf8\xeb\x1f\x01\x74\x9f\x2b\
+\x05\xc3\x8c\x69\xa6\x3f\x81\x71\x4a\xbe\x24\x65\x12\x98\x41\x99\
+\xfb\x69\x83\xfd\x2f\x00\xfe\xcf\x26\xc5\x97\x3f\x5f\xee\x4e\x17\
+\x40\xda\x9d\xaf\xf7\xef\xd8\xb3\x9c\xac\x9f\x34\x3e\x39\x48\x60\
+\x42\xc1\x6d\xa5\xfa\xbf\x7a\xbe\x8f\xe4\x2b\xfa\x64\xb9\x92\x5c\
+\x13\xc8\x60\xdb\x7a\x25\xb9\xc2\x9a\xba\xbc\xc0\x7d\x3e\xd0\xf0\
+\xca\x10\xdc\x62\x0a\x69\xe9\x64\xd4\x83\x2e\x77\xad\xe7\xb2\x6b\
+\x3a\xe1\x71\xe6\x66\xf8\x8b\x57\x7f\x03\xdd\xbe\x7d\xfa\
+\x00\x00\x08\xa2\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
+\x6e\x6f\x22\x3f\x3e\x0a\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x64\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\
+\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\
+\x6e\x74\x73\x2f\x31\x2e\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\
+\x6e\x73\x3a\x63\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x63\x72\
+\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\x6e\x73\x2e\x6f\x72\
+\x67\x2f\x6e\x73\x23\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
+\x72\x64\x66\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\
+\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x30\x32\x2f\x32\
+\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\x74\x61\x78\x2d\x6e\x73\x23\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x76\x67\x3d\x22\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\
+\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\
+\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x6f\x64\x69\x70\
+\x6f\x64\x69\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x73\x6f\x64\x69\
+\x70\x6f\x64\x69\x2e\x73\x6f\x75\x72\x63\x65\x66\x6f\x72\x67\x65\
+\x2e\x6e\x65\x74\x2f\x44\x54\x44\x2f\x73\x6f\x64\x69\x70\x6f\x64\
+\x69\x2d\x30\x2e\x64\x74\x64\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x69\x6e\x6b\x73\x63\x61\x70\x65\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\
+\x6f\x72\x67\x2f\x6e\x61\x6d\x65\x73\x70\x61\x63\x65\x73\x2f\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\x20\x76\x69\x65\x77\
+\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x31\x32\x38\x20\x31\x32\x38\
+\x22\x0a\x20\x20\x20\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\
+\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\
+\x32\x34\x20\x32\x34\x22\x0a\x20\x20\x20\x76\x65\x72\x73\x69\x6f\
+\x6e\x3d\x22\x31\x2e\x31\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x73\
+\x76\x67\x31\x32\x33\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\
+\x64\x69\x3a\x64\x6f\x63\x6e\x61\x6d\x65\x3d\x22\x73\x61\x76\x65\
+\x5f\x64\x61\x72\x6b\x5f\x74\x68\x65\x6d\x65\x2e\x73\x76\x67\x22\
+\x0a\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\x31\x32\x38\x22\x0a\
+\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x32\x38\x22\x0a\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x76\x65\x72\x73\
+\x69\x6f\x6e\x3d\x22\x30\x2e\x39\x32\x2e\x34\x20\x28\x35\x64\x61\
+\x36\x38\x39\x63\x33\x31\x33\x2c\x20\x32\x30\x31\x39\x2d\x30\x31\
+\x2d\x31\x34\x29\x22\x3e\x0a\x20\x20\x3c\x6d\x65\x74\x61\x64\x61\
+\x74\x61\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6d\x65\x74\x61\
+\x64\x61\x74\x61\x31\x32\x39\x22\x3e\x0a\x20\x20\x20\x20\x3c\x72\
+\x64\x66\x3a\x52\x44\x46\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x63\
+\x63\x3a\x57\x6f\x72\x6b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x72\x64\x66\x3a\x61\x62\x6f\x75\x74\x3d\x22\x22\x3e\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x20\x3c\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\
+\x3e\x69\x6d\x61\x67\x65\x2f\x73\x76\x67\x2b\x78\x6d\x6c\x3c\x2f\
+\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x20\x3c\x64\x63\x3a\x74\x79\x70\x65\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x72\x64\x66\x3a\x72\x65\x73\x6f\x75\
+\x72\x63\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\
+\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x64\x63\x6d\x69\x74\x79\x70\x65\
+\x2f\x53\x74\x69\x6c\x6c\x49\x6d\x61\x67\x65\x22\x20\x2f\x3e\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x64\x63\x3a\x74\x69\x74\x6c\
+\x65\x3e\x3c\x2f\x64\x63\x3a\x74\x69\x74\x6c\x65\x3e\x0a\x20\x20\
+\x20\x20\x20\x20\x3c\x2f\x63\x63\x3a\x57\x6f\x72\x6b\x3e\x0a\x20\
+\x20\x20\x20\x3c\x2f\x72\x64\x66\x3a\x52\x44\x46\x3e\x0a\x20\x20\
+\x3c\x2f\x6d\x65\x74\x61\x64\x61\x74\x61\x3e\x0a\x20\x20\x3c\x64\
+\x65\x66\x73\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x64\x65\x66\
+\x73\x31\x32\x37\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x73\x6f\x64\x69\
+\x70\x6f\x64\x69\x3a\x6e\x61\x6d\x65\x64\x76\x69\x65\x77\x0a\x20\
+\x20\x20\x20\x20\x70\x61\x67\x65\x63\x6f\x6c\x6f\x72\x3d\x22\x23\
+\x66\x66\x66\x66\x66\x66\x22\x0a\x20\x20\x20\x20\x20\x62\x6f\x72\
+\x64\x65\x72\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x36\x36\x36\x36\x36\
+\x36\x22\x0a\x20\x20\x20\x20\x20\x62\x6f\x72\x64\x65\x72\x6f\x70\
+\x61\x63\x69\x74\x79\x3d\x22\x31\x22\x0a\x20\x20\x20\x20\x20\x6f\
+\x62\x6a\x65\x63\x74\x74\x6f\x6c\x65\x72\x61\x6e\x63\x65\x3d\x22\
+\x31\x30\x22\x0a\x20\x20\x20\x20\x20\x67\x72\x69\x64\x74\x6f\x6c\
+\x65\x72\x61\x6e\x63\x65\x3d\x22\x31\x30\x22\x0a\x20\x20\x20\x20\
+\x20\x67\x75\x69\x64\x65\x74\x6f\x6c\x65\x72\x61\x6e\x63\x65\x3d\
+\x22\x31\x30\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x3a\x70\x61\x67\x65\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\
+\x30\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x70\x61\x67\x65\x73\x68\x61\x64\x6f\x77\x3d\x22\x32\x22\x0a\
+\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\
+\x6e\x64\x6f\x77\x2d\x77\x69\x64\x74\x68\x3d\x22\x31\x30\x38\x33\
+\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\
+\x77\x69\x6e\x64\x6f\x77\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x37\
+\x33\x35\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6e\x61\x6d\
+\x65\x64\x76\x69\x65\x77\x31\x32\x35\x22\x0a\x20\x20\x20\x20\x20\
+\x73\x68\x6f\x77\x67\x72\x69\x64\x3d\x22\x66\x61\x6c\x73\x65\x22\
+\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x7a\
+\x6f\x6f\x6d\x3d\x22\x31\x2e\x37\x33\x38\x33\x30\x34\x32\x22\x0a\
+\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x78\
+\x3d\x22\x2d\x31\x30\x38\x2e\x35\x32\x33\x32\x36\x22\x0a\x20\x20\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x79\x3d\x22\
+\x31\x32\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\
+\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x78\x3d\x22\x30\x22\x0a\x20\
+\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\
+\x64\x6f\x77\x2d\x79\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x6d\
+\x61\x78\x69\x6d\x69\x7a\x65\x64\x3d\x22\x30\x22\x0a\x20\x20\x20\
+\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x75\x72\x72\x65\
+\x6e\x74\x2d\x6c\x61\x79\x65\x72\x3d\x22\x73\x76\x67\x31\x32\x33\
+\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\
+\x20\x20\x64\x3d\x22\x4d\x20\x32\x35\x2e\x31\x31\x31\x31\x31\x31\
+\x2c\x31\x34\x20\x43\x20\x31\x39\x2c\x31\x34\x20\x31\x34\x2c\x31\
+\x39\x20\x31\x34\x2c\x32\x35\x2e\x31\x31\x31\x31\x31\x31\x20\x56\
+\x20\x31\x30\x32\x2e\x38\x38\x38\x38\x39\x20\x43\x20\x31\x34\x2c\
+\x31\x30\x39\x20\x31\x39\x2c\x31\x31\x34\x20\x32\x35\x2e\x31\x31\
+\x31\x31\x31\x31\x2c\x31\x31\x34\x20\x48\x20\x31\x30\x32\x2e\x38\
+\x38\x38\x38\x39\x20\x43\x20\x31\x30\x39\x2c\x31\x31\x34\x20\x31\
+\x31\x34\x2c\x31\x30\x39\x20\x31\x31\x34\x2c\x31\x30\x32\x2e\x38\
+\x38\x38\x38\x39\x20\x56\x20\x33\x30\x2e\x36\x36\x36\x36\x36\x36\
+\x20\x4c\x20\x39\x37\x2e\x33\x33\x33\x33\x33\x36\x2c\x31\x34\x20\
+\x5a\x20\x6d\x20\x31\x36\x2e\x36\x36\x36\x36\x36\x37\x2c\x35\x2e\
+\x35\x35\x35\x35\x35\x35\x20\x48\x20\x38\x36\x2e\x32\x32\x32\x32\
+\x32\x32\x20\x56\x20\x34\x37\x2e\x33\x33\x33\x33\x33\x34\x20\x48\
+\x20\x34\x31\x2e\x37\x37\x37\x37\x37\x38\x20\x5a\x20\x6d\x20\x32\
+\x37\x2e\x37\x37\x37\x37\x37\x37\x2c\x35\x2e\x35\x35\x35\x35\x35\
+\x36\x20\x56\x20\x34\x31\x2e\x37\x37\x37\x37\x37\x38\x20\x48\x20\
+\x38\x30\x2e\x36\x36\x36\x36\x36\x36\x20\x56\x20\x32\x35\x2e\x31\
+\x31\x31\x31\x31\x31\x20\x5a\x20\x4d\x20\x33\x36\x2e\x32\x32\x32\
+\x32\x32\x32\x2c\x36\x34\x20\x68\x20\x35\x35\x2e\x35\x35\x35\x35\
+\x35\x36\x20\x63\x20\x33\x2e\x33\x33\x33\x33\x33\x31\x2c\x30\x20\
+\x35\x2e\x35\x35\x35\x35\x35\x38\x2c\x32\x2e\x32\x32\x32\x32\x32\
+\x32\x20\x35\x2e\x35\x35\x35\x35\x35\x38\x2c\x35\x2e\x35\x35\x35\
+\x35\x35\x35\x20\x56\x20\x39\x37\x2e\x33\x33\x33\x33\x34\x20\x63\
+\x20\x30\x2c\x33\x2e\x33\x33\x33\x33\x32\x20\x2d\x32\x2e\x32\x32\
+\x32\x32\x32\x37\x2c\x35\x2e\x35\x35\x35\x35\x35\x20\x2d\x35\x2e\
+\x35\x35\x35\x35\x35\x38\x2c\x35\x2e\x35\x35\x35\x35\x35\x20\x48\
+\x20\x33\x36\x2e\x32\x32\x32\x32\x32\x32\x20\x63\x20\x2d\x33\x2e\
+\x33\x33\x33\x33\x33\x33\x2c\x30\x20\x2d\x35\x2e\x35\x35\x35\x35\
+\x35\x36\x2c\x2d\x32\x2e\x32\x32\x32\x32\x33\x20\x2d\x35\x2e\x35\
+\x35\x35\x35\x35\x36\x2c\x2d\x35\x2e\x35\x35\x35\x35\x35\x20\x56\
+\x20\x36\x39\x2e\x35\x35\x35\x35\x35\x35\x20\x43\x20\x33\x30\x2e\
+\x36\x36\x36\x36\x36\x36\x2c\x36\x36\x2e\x32\x32\x32\x32\x32\x32\
+\x20\x33\x32\x2e\x38\x38\x38\x38\x38\x39\x2c\x36\x34\x20\x33\x36\
+\x2e\x32\x32\x32\x32\x32\x32\x2c\x36\x34\x20\x5a\x22\x0a\x20\x20\
+\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x31\x32\x31\x22\x0a\
+\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\
+\x6e\x6e\x65\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\x61\x74\x75\x72\
+\x65\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\
+\x3d\x22\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x35\
+\x2e\x35\x35\x35\x35\x35\x35\x38\x32\x3b\x66\x69\x6c\x6c\x3a\x23\
+\x63\x63\x63\x63\x63\x63\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\
+\x69\x74\x79\x3a\x31\x22\x20\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
+\x0a\
+\x00\x00\x39\x69\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
+\x6e\x6f\x22\x3f\x3e\x0a\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x64\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\
+\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\
+\x6e\x74\x73\x2f\x31\x2e\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\
+\x6e\x73\x3a\x63\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x63\x72\
+\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\x6e\x73\x2e\x6f\x72\
+\x67\x2f\x6e\x73\x23\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
+\x72\x64\x66\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\
+\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x30\x32\x2f\x32\
+\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\x74\x61\x78\x2d\x6e\x73\x23\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x76\x67\x3d\x22\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\
+\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\
+\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x6f\x64\x69\x70\
+\x6f\x64\x69\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x73\x6f\x64\x69\
+\x70\x6f\x64\x69\x2e\x73\x6f\x75\x72\x63\x65\x66\x6f\x72\x67\x65\
+\x2e\x6e\x65\x74\x2f\x44\x54\x44\x2f\x73\x6f\x64\x69\x70\x6f\x64\
+\x69\x2d\x30\x2e\x64\x74\x64\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x69\x6e\x6b\x73\x63\x61\x70\x65\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\
+\x6f\x72\x67\x2f\x6e\x61\x6d\x65\x73\x70\x61\x63\x65\x73\x2f\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\
+\x4c\x61\x79\x65\x72\x5f\x31\x22\x0a\x20\x20\x20\x64\x61\x74\x61\
+\x2d\x6e\x61\x6d\x65\x3d\x22\x4c\x61\x79\x65\x72\x20\x31\x22\x0a\
+\x20\x20\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\
+\x31\x31\x34\x30\x2e\x37\x36\x38\x34\x20\x31\x31\x34\x30\x2e\x37\
+\x36\x38\x34\x22\x0a\x20\x20\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\
+\x22\x31\x2e\x31\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\
+\x69\x3a\x64\x6f\x63\x6e\x61\x6d\x65\x3d\x22\x65\x6c\x65\x63\x74\
+\x72\x6f\x6e\x2d\x63\x61\x73\x68\x2d\x75\x70\x64\x61\x74\x65\x2e\
+\x73\x76\x67\x22\x0a\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\x31\
+\x31\x34\x30\x2e\x37\x36\x38\x34\x22\x0a\x20\x20\x20\x68\x65\x69\
+\x67\x68\x74\x3d\x22\x31\x31\x34\x30\x2e\x37\x36\x38\x34\x22\x0a\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x76\x65\x72\x73\
+\x69\x6f\x6e\x3d\x22\x30\x2e\x39\x32\x2e\x34\x20\x28\x35\x64\x61\
+\x36\x38\x39\x63\x33\x31\x33\x2c\x20\x32\x30\x31\x39\x2d\x30\x31\
+\x2d\x31\x34\x29\x22\x3e\x0a\x20\x20\x3c\x6d\x65\x74\x61\x64\x61\
+\x74\x61\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6d\x65\x74\x61\
+\x64\x61\x74\x61\x33\x38\x30\x36\x22\x3e\x0a\x20\x20\x20\x20\x3c\
+\x72\x64\x66\x3a\x52\x44\x46\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\
+\x63\x63\x3a\x57\x6f\x72\x6b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x72\x64\x66\x3a\x61\x62\x6f\x75\x74\x3d\x22\x22\x3e\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x20\x3c\x64\x63\x3a\x66\x6f\x72\x6d\x61\
+\x74\x3e\x69\x6d\x61\x67\x65\x2f\x73\x76\x67\x2b\x78\x6d\x6c\x3c\
+\x2f\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x3c\x64\x63\x3a\x74\x79\x70\x65\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x72\x64\x66\x3a\x72\x65\x73\x6f\
+\x75\x72\x63\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\
+\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x64\x63\x6d\x69\x74\x79\x70\
+\x65\x2f\x53\x74\x69\x6c\x6c\x49\x6d\x61\x67\x65\x22\x20\x2f\x3e\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x64\x63\x3a\x74\x69\x74\
+\x6c\x65\x3e\x34\x2d\x62\x69\x74\x63\x6f\x69\x6e\x2d\x63\x61\x73\
+\x68\x2d\x6c\x6f\x67\x6f\x2d\x66\x6c\x61\x67\x3c\x2f\x64\x63\x3a\
+\x74\x69\x74\x6c\x65\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x2f\x63\
+\x63\x3a\x57\x6f\x72\x6b\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x72\x64\
+\x66\x3a\x52\x44\x46\x3e\x0a\x20\x20\x3c\x2f\x6d\x65\x74\x61\x64\
+\x61\x74\x61\x3e\x0a\x20\x20\x3c\x73\x6f\x64\x69\x70\x6f\x64\x69\
+\x3a\x6e\x61\x6d\x65\x64\x76\x69\x65\x77\x0a\x20\x20\x20\x20\x20\
+\x70\x61\x67\x65\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x66\x66\x66\x66\
+\x66\x66\x22\x0a\x20\x20\x20\x20\x20\x62\x6f\x72\x64\x65\x72\x63\
+\x6f\x6c\x6f\x72\x3d\x22\x23\x36\x36\x36\x36\x36\x36\x22\x0a\x20\
+\x20\x20\x20\x20\x62\x6f\x72\x64\x65\x72\x6f\x70\x61\x63\x69\x74\
+\x79\x3d\x22\x31\x22\x0a\x20\x20\x20\x20\x20\x6f\x62\x6a\x65\x63\
+\x74\x74\x6f\x6c\x65\x72\x61\x6e\x63\x65\x3d\x22\x31\x30\x22\x0a\
+\x20\x20\x20\x20\x20\x67\x72\x69\x64\x74\x6f\x6c\x65\x72\x61\x6e\
+\x63\x65\x3d\x22\x31\x30\x22\x0a\x20\x20\x20\x20\x20\x67\x75\x69\
+\x64\x65\x74\x6f\x6c\x65\x72\x61\x6e\x63\x65\x3d\x22\x31\x30\x22\
+\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x70\
+\x61\x67\x65\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x30\x22\x0a\x20\
+\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x70\x61\x67\
+\x65\x73\x68\x61\x64\x6f\x77\x3d\x22\x32\x22\x0a\x20\x20\x20\x20\
+\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\
+\x2d\x77\x69\x64\x74\x68\x3d\x22\x31\x33\x39\x39\x22\x0a\x20\x20\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\
+\x6f\x77\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x38\x30\x35\x22\x0a\
+\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6e\x61\x6d\x65\x64\x76\x69\
+\x65\x77\x33\x38\x30\x34\x22\x0a\x20\x20\x20\x20\x20\x73\x68\x6f\
+\x77\x67\x72\x69\x64\x3d\x22\x66\x61\x6c\x73\x65\x22\x0a\x20\x20\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x7a\x6f\x6f\x6d\
+\x3d\x22\x30\x2e\x32\x30\x30\x35\x33\x30\x32\x33\x22\x0a\x20\x20\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x78\x3d\x22\
+\x35\x37\x30\x2e\x33\x38\x34\x32\x33\x22\x0a\x20\x20\x20\x20\x20\
+\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x79\x3d\x22\x35\x39\x38\
+\x2e\x39\x32\x37\x38\x32\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x78\x3d\x22\
+\x30\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x79\x3d\x22\x30\x22\x0a\x20\x20\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\
+\x6f\x77\x2d\x6d\x61\x78\x69\x6d\x69\x7a\x65\x64\x3d\x22\x30\x22\
+\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\
+\x75\x72\x72\x65\x6e\x74\x2d\x6c\x61\x79\x65\x72\x3d\x22\x4c\x61\
+\x79\x65\x72\x5f\x31\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x64\x65\x66\
+\x73\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x64\x65\x66\x73\x33\
+\x37\x39\x31\x22\x3e\x0a\x20\x20\x20\x20\x3c\x73\x74\x79\x6c\x65\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x73\x74\x79\x6c\
+\x65\x33\x37\x38\x39\x22\x3e\x2e\x63\x6c\x73\x2d\x31\x7b\x66\x69\
+\x6c\x6c\x3a\x23\x30\x30\x35\x36\x43\x30\x3b\x7d\x2e\x63\x6c\x73\
+\x2d\x32\x7b\x66\x69\x6c\x6c\x3a\x23\x66\x66\x66\x3b\x7d\x3c\x2f\
+\x73\x74\x79\x6c\x65\x3e\x0a\x20\x20\x20\x20\x3c\x73\x74\x79\x6c\
+\x65\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x73\x74\x79\
+\x6c\x65\x39\x38\x22\x3e\x2e\x63\x6c\x73\x2d\x31\x7b\x66\x69\x6c\
+\x6c\x3a\x23\x30\x30\x35\x36\x43\x30\x3b\x7d\x2e\x63\x6c\x73\x2d\
+\x32\x7b\x66\x69\x6c\x6c\x3a\x23\x66\x66\x66\x3b\x7d\x3c\x2f\x73\
+\x74\x79\x6c\x65\x3e\x0a\x20\x20\x3c\x2f\x64\x65\x66\x73\x3e\x0a\
+\x20\x20\x3c\x74\x69\x74\x6c\x65\x0a\x20\x20\x20\x20\x20\x69\x64\
+\x3d\x22\x74\x69\x74\x6c\x65\x33\x37\x39\x33\x22\x3e\x34\x2d\x62\
+\x69\x74\x63\x6f\x69\x6e\x2d\x63\x61\x73\x68\x2d\x6c\x6f\x67\x6f\
+\x2d\x66\x6c\x61\x67\x3c\x2f\x74\x69\x74\x6c\x65\x3e\x0a\x20\x20\
+\x3c\x67\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x6c\x61\x62\x65\x6c\x3d\x22\x4c\x4f\x47\x4f\x5f\x47\x52\x4f\
+\x55\x50\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x67\x31\x34\
+\x37\x30\x22\x0a\x20\x20\x20\x20\x20\x74\x72\x61\x6e\x73\x66\x6f\
+\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\x28\x31\x2e\x38\x37\x38\
+\x39\x33\x35\x35\x2c\x30\x2c\x30\x2c\x31\x2e\x38\x37\x38\x39\x33\
+\x35\x35\x2c\x30\x2c\x32\x32\x33\x2e\x37\x30\x32\x31\x39\x29\x22\
+\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x64\x69\x73\x70\x6c\x61\
+\x79\x3a\x69\x6e\x6c\x69\x6e\x65\x3b\x66\x69\x6c\x6c\x3a\x23\x30\
+\x30\x35\x36\x63\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\
+\x74\x68\x3a\x30\x2e\x36\x37\x38\x32\x34\x32\x39\x38\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x64\x3d\x22\x6d\x20\x34\x33\x33\x2e\x39\
+\x35\x33\x31\x32\x2c\x31\x31\x36\x2e\x38\x35\x31\x35\x36\x20\x63\
+\x20\x32\x37\x2e\x32\x33\x39\x38\x33\x2c\x33\x39\x2e\x36\x31\x35\
+\x31\x32\x20\x34\x33\x2e\x31\x38\x35\x35\x35\x2c\x38\x37\x2e\x36\
+\x31\x30\x34\x31\x20\x34\x33\x2e\x31\x38\x35\x35\x35\x2c\x31\x33\
+\x39\x2e\x33\x31\x34\x34\x36\x20\x30\x2c\x35\x31\x2e\x35\x38\x30\
+\x36\x33\x20\x2d\x31\x35\x2e\x38\x37\x31\x31\x35\x2c\x39\x39\x2e\
+\x34\x34\x32\x33\x31\x20\x2d\x34\x32\x2e\x39\x39\x32\x31\x39\x2c\
+\x31\x33\x38\x2e\x39\x38\x32\x34\x32\x20\x48\x20\x35\x31\x32\x20\
+\x56\x20\x31\x31\x36\x2e\x38\x35\x31\x35\x36\x20\x5a\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x31\x30\
+\x34\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x3a\x63\x6f\x6e\x6e\x65\x63\x74\x6f\x72\x2d\x63\x75\x72\
+\x76\x61\x74\x75\x72\x65\x3d\x22\x30\x22\x20\x2f\x3e\x0a\x20\x20\
+\x20\x20\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\x20\x20\x20\x20\x73\
+\x74\x79\x6c\x65\x3d\x22\x64\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\
+\x6c\x69\x6e\x65\x3b\x66\x69\x6c\x6c\x3a\x23\x30\x30\x35\x36\x63\
+\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x30\
+\x2e\x36\x37\x38\x32\x34\x32\x39\x38\x22\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x64\x3d\x22\x4d\x20\x30\x2c\x31\x31\x36\x2e\x38\x35\x31\
+\x35\x36\x20\x56\x20\x33\x39\x35\x2e\x31\x34\x38\x34\x34\x20\x48\
+\x20\x37\x38\x2e\x31\x30\x35\x34\x36\x39\x20\x43\x20\x35\x30\x2e\
+\x39\x35\x33\x39\x35\x31\x2c\x33\x35\x35\x2e\x35\x39\x34\x37\x35\
+\x20\x33\x35\x2e\x30\x36\x32\x35\x2c\x33\x30\x37\x2e\x37\x30\x38\
+\x36\x33\x20\x33\x35\x2e\x30\x36\x32\x35\x2c\x32\x35\x36\x2e\x30\
+\x39\x39\x36\x31\x20\x63\x20\x30\x2c\x2d\x35\x31\x2e\x36\x39\x35\
+\x30\x37\x20\x31\x35\x2e\x39\x34\x32\x39\x38\x32\x2c\x2d\x39\x39\
+\x2e\x36\x35\x36\x38\x36\x20\x34\x33\x2e\x31\x37\x35\x37\x38\x31\
+\x2c\x2d\x31\x33\x39\x2e\x32\x34\x38\x30\x35\x20\x7a\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x31\x30\
+\x36\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x3a\x63\x6f\x6e\x6e\x65\x63\x74\x6f\x72\x2d\x63\x75\x72\
+\x76\x61\x74\x75\x72\x65\x3d\x22\x30\x22\x20\x2f\x3e\x0a\x20\x20\
+\x20\x20\x3c\x63\x69\x72\x63\x6c\x65\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x63\x6c\x61\x73\x73\x3d\x22\x63\x6c\x73\x2d\x31\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x63\x78\x3d\x22\x32\x35\x36\x2e\x30\x30\
+\x31\x37\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x63\x79\x3d\x22\
+\x32\x35\x36\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x72\x3d\x22\x31\
+\x39\x34\x2e\x38\x32\x32\x34\x32\x22\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x69\x64\x3d\x22\x63\x69\x72\x63\x6c\x65\x31\x30\x38\x22\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x64\x69\
+\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\x69\x6e\x65\x3b\x66\x69\x6c\
+\x6c\x3a\x23\x30\x30\x35\x36\x63\x30\x3b\x73\x74\x72\x6f\x6b\x65\
+\x2d\x77\x69\x64\x74\x68\x3a\x30\x2e\x36\x35\x36\x31\x37\x37\x37\
+\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x63\x6c\x61\x73\x73\x3d\x22\x63\x6c\x73\
+\x2d\x32\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x64\x3d\x22\x6d\x20\
+\x33\x36\x34\x2e\x32\x32\x32\x32\x38\x2c\x32\x36\x35\x2e\x36\x32\
+\x33\x38\x31\x20\x2d\x30\x2e\x31\x32\x38\x30\x37\x2c\x2d\x30\x2e\
+\x32\x33\x38\x32\x34\x20\x2d\x30\x2e\x30\x32\x31\x39\x2c\x2d\x30\
+\x2e\x30\x33\x39\x32\x20\x63\x20\x2d\x30\x2e\x30\x37\x37\x36\x2c\
+\x2d\x30\x2e\x32\x33\x39\x38\x20\x2d\x30\x2e\x31\x33\x35\x37\x39\
+\x2c\x2d\x30\x2e\x34\x39\x30\x34\x33\x20\x2d\x30\x2e\x32\x32\x34\
+\x32\x36\x2c\x2d\x30\x2e\x37\x34\x39\x36\x32\x20\x6c\x20\x2d\x30\
+\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\
+\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x35\x20\x2d\x30\x2e\x30\
+\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\x30\
+\x39\x2c\x2d\x30\x2e\x30\x32\x30\x35\x20\x2d\x30\x2e\x30\x30\x39\
+\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\
+\x2d\x30\x2e\x30\x32\x30\x33\x20\x2d\x30\x2e\x30\x32\x31\x38\x2c\
+\x2d\x30\x2e\x30\x33\x39\x36\x20\x61\x20\x34\x37\x2e\x30\x36\x35\
+\x38\x37\x39\x2c\x34\x37\x2e\x30\x36\x35\x38\x37\x39\x20\x30\x20\
+\x30\x20\x30\x20\x2d\x31\x35\x2e\x33\x38\x37\x39\x35\x2c\x2d\x32\
+\x33\x2e\x30\x32\x35\x32\x20\x6c\x20\x2d\x30\x2e\x30\x30\x39\x2c\
+\x2d\x30\x2e\x30\x32\x30\x33\x20\x63\x20\x2d\x30\x2e\x32\x31\x36\
+\x35\x33\x2c\x2d\x30\x2e\x31\x36\x35\x33\x31\x20\x2d\x30\x2e\x34\
+\x34\x33\x38\x39\x2c\x2d\x30\x2e\x33\x34\x39\x39\x37\x20\x2d\x30\
+\x2e\x36\x36\x31\x32\x31\x2c\x2d\x30\x2e\x35\x31\x34\x35\x31\x20\
+\x6c\x20\x2d\x30\x2e\x32\x39\x39\x35\x36\x2c\x2d\x30\x2e\x32\x32\
+\x32\x37\x31\x20\x2d\x30\x2e\x32\x31\x36\x34\x36\x2c\x2d\x30\x2e\
+\x31\x36\x34\x35\x31\x20\x2d\x30\x2e\x30\x39\x33\x32\x2c\x2d\x30\
+\x2e\x30\x37\x37\x37\x20\x2d\x30\x2e\x32\x30\x36\x33\x38\x2c\x2d\
+\x30\x2e\x31\x34\x35\x30\x38\x20\x2d\x30\x2e\x30\x39\x33\x34\x2c\
+\x2d\x30\x2e\x30\x37\x37\x36\x20\x2d\x30\x2e\x32\x30\x36\x34\x2c\
+\x2d\x30\x2e\x31\x34\x35\x30\x34\x20\x2d\x30\x2e\x30\x39\x33\x32\
+\x2c\x2d\x30\x2e\x30\x37\x37\x38\x20\x2d\x30\x2e\x32\x31\x36\x34\
+\x38\x2c\x2d\x30\x2e\x31\x36\x34\x35\x33\x20\x2d\x30\x2e\x31\x31\
+\x33\x33\x32\x2c\x2d\x30\x2e\x30\x36\x37\x37\x20\x2d\x30\x2e\x32\
+\x31\x36\x35\x33\x2c\x2d\x30\x2e\x31\x36\x34\x34\x38\x20\x2d\x30\
+\x2e\x31\x31\x33\x33\x34\x2c\x2d\x30\x2e\x30\x36\x37\x37\x20\x2d\
+\x30\x2e\x32\x33\x32\x38\x31\x2c\x2d\x30\x2e\x31\x35\x35\x32\x31\
+\x20\x2d\x30\x2e\x31\x31\x33\x33\x33\x2c\x2d\x30\x2e\x30\x36\x37\
+\x37\x20\x2d\x30\x2e\x31\x33\x37\x33\x34\x2c\x2d\x30\x2e\x32\x30\
+\x37\x39\x38\x20\x2d\x30\x2e\x31\x32\x33\x33\x31\x2c\x2d\x30\x2e\
+\x30\x38\x36\x38\x20\x2d\x30\x2e\x32\x33\x32\x38\x32\x2c\x2d\x30\
+\x2e\x31\x35\x35\x31\x38\x20\x2d\x30\x2e\x31\x32\x33\x32\x39\x2c\
+\x2d\x30\x2e\x30\x38\x36\x36\x20\x2d\x30\x2e\x32\x33\x36\x36\x34\
+\x2c\x2d\x30\x2e\x31\x35\x35\x32\x33\x20\x2d\x30\x2e\x31\x32\x33\
+\x33\x32\x2c\x2d\x30\x2e\x30\x38\x36\x36\x20\x2d\x30\x2e\x32\x33\
+\x32\x37\x38\x2c\x2d\x30\x2e\x31\x35\x35\x32\x35\x20\x2d\x30\x2e\
+\x31\x32\x33\x33\x35\x2c\x2d\x30\x2e\x30\x38\x36\x38\x20\x2d\x30\
+\x2e\x32\x34\x37\x35\x34\x2c\x2d\x30\x2e\x31\x37\x33\x38\x38\x20\
+\x2d\x30\x2e\x31\x32\x33\x32\x38\x2c\x2d\x30\x2e\x30\x38\x36\x38\
+\x20\x2d\x30\x2e\x32\x36\x37\x2c\x2d\x30\x2e\x31\x36\x33\x37\x32\
+\x20\x2d\x30\x2e\x31\x32\x33\x33\x31\x2c\x2d\x30\x2e\x30\x38\x36\
+\x39\x20\x2d\x30\x2e\x32\x36\x36\x39\x32\x2c\x2d\x30\x2e\x31\x36\
+\x33\x37\x32\x20\x2d\x30\x2e\x31\x32\x33\x33\x34\x2c\x2d\x30\x2e\
+\x30\x38\x36\x38\x20\x2d\x30\x2e\x32\x36\x36\x39\x34\x2c\x2d\x30\
+\x2e\x31\x36\x33\x37\x36\x20\x2d\x30\x2e\x31\x32\x33\x33\x31\x2c\
+\x2d\x30\x2e\x30\x38\x36\x37\x20\x2d\x30\x2e\x32\x36\x36\x39\x32\
+\x2c\x2d\x30\x2e\x31\x36\x33\x37\x34\x20\x2d\x30\x2e\x31\x34\x33\
+\x37\x2c\x2d\x30\x2e\x30\x37\x37\x36\x20\x2d\x30\x2e\x32\x36\x36\
+\x38\x39\x2c\x2d\x30\x2e\x31\x36\x33\x37\x36\x20\x2d\x30\x2e\x31\
+\x34\x33\x36\x32\x2c\x2d\x30\x2e\x30\x37\x37\x34\x20\x2d\x30\x2e\
+\x32\x38\x37\x31\x35\x2c\x2d\x30\x2e\x31\x35\x35\x31\x38\x20\x2d\
+\x30\x2e\x31\x34\x33\x36\x33\x2c\x2d\x30\x2e\x30\x37\x37\x35\x20\
+\x2d\x30\x2e\x32\x39\x38\x2c\x2d\x30\x2e\x31\x37\x32\x32\x38\x20\
+\x2d\x30\x2e\x31\x34\x33\x36\x33\x2c\x2d\x30\x2e\x30\x37\x37\x38\
+\x20\x2d\x30\x2e\x32\x39\x38\x30\x31\x2c\x2d\x30\x2e\x31\x37\x32\
+\x32\x39\x20\x2d\x30\x2e\x31\x34\x33\x35\x35\x2c\x2d\x30\x2e\x30\
+\x37\x37\x35\x20\x2d\x30\x2e\x32\x39\x38\x30\x35\x2c\x2d\x30\x2e\
+\x31\x37\x32\x32\x38\x20\x2d\x30\x2e\x31\x35\x35\x32\x2c\x2d\x30\
+\x2e\x30\x39\x36\x32\x20\x2d\x30\x2e\x32\x39\x37\x39\x36\x2c\x2d\
+\x30\x2e\x31\x37\x32\x33\x35\x20\x2d\x30\x2e\x31\x35\x35\x32\x31\
+\x2c\x2d\x30\x2e\x30\x39\x36\x31\x20\x2d\x30\x2e\x33\x31\x37\x34\
+\x2c\x2d\x30\x2e\x31\x36\x32\x31\x39\x20\x2d\x30\x2e\x31\x35\x35\
+\x32\x32\x2c\x2d\x30\x2e\x30\x39\x36\x32\x20\x2d\x30\x2e\x33\x31\
+\x37\x34\x32\x2c\x2d\x30\x2e\x31\x36\x32\x31\x39\x20\x2d\x30\x2e\
+\x32\x31\x34\x39\x32\x2c\x2d\x30\x2e\x31\x31\x34\x37\x32\x20\x2d\
+\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x35\x20\x63\x20\
+\x2d\x30\x2e\x31\x35\x35\x32\x32\x2c\x2d\x30\x2e\x30\x39\x35\x39\
+\x20\x2d\x30\x2e\x33\x31\x37\x34\x32\x2c\x2d\x30\x2e\x31\x36\x32\
+\x31\x38\x20\x2d\x30\x2e\x34\x37\x31\x38\x31\x2c\x2d\x30\x2e\x32\
+\x35\x38\x34\x34\x20\x61\x20\x36\x35\x2e\x36\x39\x37\x34\x34\x35\
+\x2c\x36\x35\x2e\x36\x39\x37\x34\x34\x35\x20\x30\x20\x30\x20\x30\
+\x20\x2d\x32\x31\x2e\x30\x33\x38\x30\x34\x2c\x2d\x36\x2e\x36\x34\
+\x37\x33\x39\x20\x35\x38\x2e\x38\x32\x32\x36\x35\x31\x2c\x35\x38\
+\x2e\x38\x32\x32\x36\x35\x31\x20\x30\x20\x30\x20\x30\x20\x35\x2e\
+\x36\x33\x36\x32\x36\x2c\x2d\x37\x2e\x30\x37\x38\x38\x39\x20\x6c\
+\x20\x30\x2e\x32\x37\x30\x30\x38\x2c\x2d\x30\x2e\x34\x30\x31\x32\
+\x20\x30\x2e\x30\x32\x30\x34\x2c\x2d\x30\x2e\x30\x30\x39\x20\x30\
+\x2e\x31\x32\x34\x39\x34\x2c\x2d\x30\x2e\x31\x39\x35\x36\x31\x20\
+\x30\x2e\x31\x36\x33\x37\x37\x2c\x2d\x30\x2e\x32\x36\x36\x39\x31\
+\x20\x30\x2e\x30\x38\x36\x38\x2c\x2d\x30\x2e\x31\x32\x33\x33\x33\
+\x20\x30\x2e\x31\x36\x33\x37\x38\x2c\x2d\x30\x2e\x32\x36\x36\x39\
+\x35\x20\x30\x2e\x30\x38\x37\x2c\x2d\x30\x2e\x31\x32\x33\x33\x33\
+\x20\x30\x2e\x31\x36\x33\x37\x34\x2c\x2d\x30\x2e\x32\x36\x36\x39\
+\x32\x20\x30\x2e\x30\x38\x36\x38\x2c\x2d\x30\x2e\x31\x32\x33\x33\
+\x34\x20\x30\x2e\x31\x36\x33\x37\x35\x2c\x2d\x30\x2e\x32\x36\x36\
+\x39\x20\x30\x2e\x30\x38\x36\x38\x2c\x2d\x30\x2e\x31\x32\x33\x33\
+\x36\x20\x30\x2e\x31\x36\x33\x37\x2c\x2d\x30\x2e\x32\x36\x36\x39\
+\x35\x20\x30\x2e\x30\x38\x36\x35\x2c\x2d\x30\x2e\x31\x32\x33\x33\
+\x33\x20\x30\x2e\x31\x34\x33\x35\x39\x2c\x2d\x30\x2e\x32\x35\x36\
+\x37\x39\x20\x30\x2e\x30\x38\x36\x37\x2c\x2d\x30\x2e\x31\x32\x33\
+\x33\x32\x20\x30\x2e\x31\x34\x33\x36\x31\x2c\x2d\x30\x2e\x32\x35\
+\x36\x38\x39\x20\x30\x2e\x30\x36\x37\x37\x2c\x2d\x30\x2e\x31\x31\
+\x33\x33\x33\x20\x30\x2e\x31\x34\x33\x36\x33\x2c\x2d\x30\x2e\x32\
+\x35\x36\x38\x35\x20\x30\x2e\x30\x36\x37\x38\x2c\x2d\x30\x2e\x31\
+\x31\x33\x33\x33\x20\x30\x2e\x31\x34\x33\x36\x35\x2c\x2d\x30\x2e\
+\x32\x35\x36\x38\x36\x20\x30\x2e\x30\x36\x37\x33\x2c\x2d\x30\x2e\
+\x31\x31\x33\x33\x33\x20\x30\x2e\x31\x32\x33\x33\x2c\x2d\x30\x2e\
+\x32\x34\x35\x39\x39\x20\x30\x2e\x30\x36\x37\x33\x2c\x2d\x30\x2e\
+\x31\x31\x33\x33\x34\x20\x30\x2e\x31\x32\x33\x32\x36\x2c\x2d\x30\
+\x2e\x32\x34\x35\x39\x36\x20\x30\x2e\x30\x36\x37\x37\x2c\x2d\x30\
+\x2e\x31\x31\x33\x33\x33\x20\x30\x2e\x31\x32\x33\x33\x31\x2c\x2d\
+\x30\x2e\x32\x34\x36\x20\x30\x2e\x30\x36\x37\x33\x2c\x2d\x30\x2e\
+\x31\x31\x33\x33\x34\x20\x30\x2e\x31\x33\x33\x34\x32\x2c\x2d\x30\
+\x2e\x32\x32\x35\x38\x32\x20\x30\x2e\x30\x36\x37\x37\x2c\x2d\x30\
+\x2e\x31\x31\x33\x33\x34\x20\x30\x2e\x31\x33\x34\x32\x33\x2c\x2d\
+\x30\x2e\x32\x32\x35\x38\x33\x20\x30\x2e\x30\x36\x37\x35\x2c\x2d\
+\x30\x2e\x31\x31\x33\x33\x34\x20\x30\x2e\x31\x31\x34\x38\x33\x2c\
+\x2d\x30\x2e\x32\x31\x35\x20\x30\x2e\x30\x36\x37\x36\x2c\x2d\x30\
+\x2e\x31\x31\x33\x33\x33\x20\x30\x2e\x31\x31\x34\x38\x34\x2c\x2d\
+\x30\x2e\x32\x31\x34\x39\x33\x20\x30\x2e\x30\x34\x37\x35\x2c\x2d\
+\x30\x2e\x31\x30\x32\x34\x38\x20\x30\x2e\x31\x31\x34\x36\x2c\x2d\
+\x30\x2e\x32\x31\x34\x39\x39\x20\x30\x2e\x30\x34\x37\x39\x2c\x2d\
+\x30\x2e\x31\x30\x32\x35\x39\x20\x30\x2e\x31\x31\x34\x38\x34\x2c\
+\x2d\x30\x2e\x32\x31\x34\x39\x36\x20\x30\x2e\x30\x34\x37\x35\x2c\
+\x2d\x30\x2e\x31\x30\x32\x35\x38\x20\x30\x2e\x31\x31\x34\x37\x31\
+\x2c\x2d\x30\x2e\x32\x31\x34\x39\x38\x20\x30\x2e\x30\x34\x37\x38\
+\x2c\x2d\x30\x2e\x31\x30\x32\x35\x38\x20\x30\x2e\x30\x39\x34\x37\
+\x2c\x2d\x30\x2e\x32\x30\x34\x38\x36\x20\x30\x2e\x30\x34\x37\x33\
+\x2c\x2d\x30\x2e\x31\x30\x32\x36\x39\x20\x30\x2e\x30\x39\x34\x35\
+\x2c\x2d\x30\x2e\x32\x30\x34\x38\x37\x20\x30\x2e\x30\x34\x37\x37\
+\x2c\x2d\x30\x2e\x31\x30\x32\x34\x38\x20\x30\x2e\x30\x39\x34\x37\
+\x2c\x2d\x30\x2e\x32\x30\x34\x38\x33\x20\x30\x2e\x30\x34\x37\x36\
+\x2c\x2d\x30\x2e\x31\x30\x32\x34\x38\x20\x30\x2e\x31\x30\x33\x38\
+\x34\x2c\x2d\x30\x2e\x32\x33\x32\x38\x36\x20\x30\x2e\x31\x34\x32\
+\x30\x32\x2c\x2d\x30\x2e\x33\x31\x30\x34\x31\x20\x63\x20\x30\x2e\
+\x31\x30\x33\x38\x34\x2c\x2d\x30\x2e\x32\x33\x32\x37\x37\x20\x30\
+\x2e\x31\x38\x37\x38\x33\x2c\x2d\x30\x2e\x34\x35\x39\x34\x32\x20\
+\x30\x2e\x32\x39\x31\x37\x38\x2c\x2d\x30\x2e\x36\x39\x34\x35\x20\
+\x6c\x20\x30\x2e\x30\x32\x30\x34\x2c\x2d\x30\x2e\x30\x30\x39\x20\
+\x61\x20\x34\x31\x2e\x38\x30\x32\x31\x30\x33\x2c\x34\x31\x2e\x38\
+\x30\x32\x31\x30\x33\x20\x30\x20\x30\x20\x30\x20\x32\x2e\x31\x32\
+\x33\x39\x35\x2c\x2d\x32\x34\x2e\x35\x34\x32\x35\x36\x20\x6c\x20\
+\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x33\x20\x2d\
+\x30\x2e\x30\x32\x31\x36\x2c\x2d\x30\x2e\x30\x33\x39\x36\x20\x2d\
+\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x33\x20\x2d\x30\
+\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\
+\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x33\x20\x2d\x30\x2e\x30\
+\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\x30\
+\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\
+\x2c\x2d\x30\x2e\x30\x32\x30\x35\x20\x63\x20\x2d\x30\x2e\x30\x34\
+\x37\x37\x2c\x2d\x30\x2e\x32\x33\x32\x38\x20\x2d\x30\x2e\x30\x39\
+\x34\x39\x2c\x2d\x30\x2e\x34\x36\x30\x39\x33\x20\x2d\x30\x2e\x31\
+\x36\x31\x33\x36\x2c\x2d\x30\x2e\x36\x38\x31\x33\x33\x20\x76\x20\
+\x2d\x30\x2e\x30\x35\x30\x34\x20\x6c\x20\x2d\x30\x2e\x30\x30\x39\
+\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\
+\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\
+\x30\x2e\x30\x32\x30\x35\x20\x30\x2e\x30\x30\x39\x2c\x30\x2e\x30\
+\x32\x30\x35\x20\x2d\x30\x2e\x30\x39\x36\x33\x2c\x2d\x30\x2e\x31\
+\x37\x38\x34\x35\x20\x63\x20\x2d\x30\x2e\x30\x37\x2c\x2d\x30\x2e\
+\x33\x32\x30\x34\x37\x20\x2d\x30\x2e\x31\x34\x30\x33\x38\x2c\x2d\
+\x30\x2e\x36\x34\x31\x20\x2d\x30\x2e\x32\x34\x31\x33\x2c\x2d\x30\
+\x2e\x39\x37\x30\x38\x35\x20\x2d\x30\x2e\x30\x37\x2c\x2d\x30\x2e\
+\x33\x32\x30\x34\x38\x20\x2d\x30\x2e\x31\x37\x30\x37\x37\x2c\x2d\
+\x30\x2e\x36\x35\x30\x32\x39\x20\x2d\x30\x2e\x32\x36\x30\x37\x34\
+\x2c\x2d\x30\x2e\x39\x36\x30\x36\x38\x20\x6c\x20\x2d\x30\x2e\x31\
+\x31\x37\x30\x38\x2c\x2d\x30\x2e\x32\x31\x38\x30\x39\x20\x2d\x30\
+\x2e\x30\x32\x31\x38\x2c\x2d\x30\x2e\x30\x33\x39\x34\x20\x63\x20\
+\x2d\x30\x2e\x30\x36\x37\x38\x2c\x2d\x30\x2e\x32\x31\x39\x35\x38\
+\x20\x2d\x30\x2e\x31\x33\x34\x32\x35\x2c\x2d\x30\x2e\x34\x34\x20\
+\x2d\x30\x2e\x32\x30\x31\x37\x36\x2c\x2d\x30\x2e\x36\x35\x39\x36\
+\x33\x20\x6c\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\
+\x30\x32\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\
+\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x33\
+\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\
+\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x33\x20\x2d\
+\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x35\x20\x2d\x30\
+\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x33\x20\x41\x20\x34\
+\x31\x2e\x38\x31\x32\x31\x39\x33\x2c\x34\x31\x2e\x38\x31\x32\x31\
+\x39\x33\x20\x30\x20\x30\x20\x30\x20\x33\x31\x35\x2e\x31\x38\x36\
+\x36\x2c\x31\x36\x32\x2e\x32\x33\x30\x35\x38\x20\x6c\x20\x2d\x30\
+\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x35\x20\x63\x20\x2d\
+\x30\x2e\x31\x38\x36\x32\x35\x2c\x2d\x30\x2e\x31\x35\x35\x31\x39\
+\x20\x2d\x30\x2e\x33\x39\x32\x37\x31\x2c\x2d\x30\x2e\x33\x30\x31\
+\x31\x32\x20\x2d\x30\x2e\x35\x37\x38\x39\x34\x2c\x2d\x30\x2e\x34\
+\x35\x36\x32\x38\x20\x6c\x20\x2d\x30\x2e\x32\x35\x37\x36\x36\x2c\
+\x2d\x30\x2e\x31\x39\x34\x30\x33\x20\x2d\x30\x2e\x32\x30\x36\x34\
+\x32\x2c\x2d\x30\x2e\x31\x34\x35\x30\x37\x20\x2d\x30\x2e\x30\x39\
+\x33\x32\x2c\x2d\x30\x2e\x30\x37\x37\x35\x20\x2d\x30\x2e\x31\x37\
+\x35\x33\x39\x2c\x2d\x30\x2e\x31\x33\x35\x36\x36\x20\x2d\x30\x2e\
+\x30\x39\x33\x31\x2c\x2d\x30\x2e\x30\x37\x37\x38\x20\x2d\x30\x2e\
+\x31\x37\x35\x33\x39\x2c\x2d\x30\x2e\x31\x33\x35\x38\x31\x20\x2d\
+\x30\x2e\x30\x39\x33\x32\x2c\x2d\x30\x2e\x30\x37\x37\x37\x20\x2d\
+\x30\x2e\x31\x39\x35\x35\x33\x2c\x2d\x30\x2e\x31\x32\x34\x39\x37\
+\x20\x2d\x30\x2e\x30\x39\x33\x31\x2c\x2d\x30\x2e\x30\x37\x37\x38\
+\x20\x2d\x30\x2e\x32\x30\x36\x34\x33\x2c\x2d\x30\x2e\x31\x34\x35\
+\x30\x33\x20\x2d\x30\x2e\x30\x39\x33\x31\x2c\x2d\x30\x2e\x30\x37\
+\x37\x38\x20\x2d\x30\x2e\x32\x30\x36\x34\x31\x2c\x2d\x30\x2e\x31\
+\x34\x35\x30\x37\x20\x2d\x30\x2e\x30\x39\x33\x2c\x2d\x30\x2e\x30\
+\x37\x37\x36\x20\x2d\x30\x2e\x32\x30\x36\x34\x32\x2c\x2d\x30\x2e\
+\x31\x34\x35\x30\x36\x20\x2d\x30\x2e\x31\x31\x33\x33\x32\x2c\x2d\
+\x30\x2e\x30\x36\x37\x36\x20\x2d\x30\x2e\x32\x30\x36\x33\x39\x2c\
+\x2d\x30\x2e\x31\x34\x35\x30\x38\x20\x2d\x30\x2e\x31\x31\x33\x33\
+\x33\x2c\x2d\x30\x2e\x30\x36\x37\x37\x20\x2d\x30\x2e\x32\x30\x36\
+\x34\x36\x2c\x2d\x30\x2e\x31\x34\x35\x31\x36\x20\x2d\x30\x2e\x31\
+\x31\x33\x33\x33\x2c\x2d\x30\x2e\x30\x36\x37\x35\x20\x2d\x30\x2e\
+\x32\x32\x35\x38\x31\x2c\x2d\x30\x2e\x31\x33\x34\x32\x38\x20\x2d\
+\x30\x2e\x31\x31\x33\x33\x33\x2c\x2d\x30\x2e\x30\x36\x37\x38\x20\
+\x2d\x30\x2e\x32\x32\x35\x38\x36\x2c\x2d\x30\x2e\x31\x33\x34\x33\
+\x33\x20\x2d\x30\x2e\x31\x31\x33\x33\x32\x2c\x2d\x30\x2e\x30\x36\
+\x37\x35\x20\x2d\x30\x2e\x32\x32\x35\x38\x38\x2c\x2d\x30\x2e\x31\
+\x33\x34\x32\x38\x20\x2d\x30\x2e\x31\x31\x33\x33\x33\x2c\x2d\x30\
+\x2e\x30\x36\x37\x37\x20\x2d\x30\x2e\x32\x32\x35\x38\x33\x2c\x2d\
+\x30\x2e\x31\x33\x34\x33\x32\x20\x2d\x30\x2e\x31\x31\x33\x33\x33\
+\x2c\x2d\x30\x2e\x30\x36\x37\x36\x20\x2d\x30\x2e\x32\x33\x36\x36\
+\x38\x2c\x2d\x30\x2e\x31\x35\x35\x31\x39\x20\x2d\x30\x2e\x31\x31\
+\x33\x33\x34\x2c\x2d\x30\x2e\x30\x36\x37\x37\x20\x2d\x30\x2e\x32\
+\x33\x36\x36\x39\x2c\x2d\x30\x2e\x31\x35\x35\x31\x38\x20\x2d\x30\
+\x2e\x31\x31\x33\x33\x34\x2c\x2d\x30\x2e\x30\x36\x37\x35\x20\x2d\
+\x30\x2e\x32\x35\x36\x38\x35\x2c\x2d\x30\x2e\x31\x34\x33\x36\x37\
+\x20\x2d\x30\x2e\x31\x31\x33\x33\x33\x2c\x2d\x30\x2e\x30\x36\x37\
+\x37\x20\x2d\x30\x2e\x32\x35\x36\x30\x38\x2c\x2d\x30\x2e\x31\x34\
+\x33\x36\x32\x20\x2d\x30\x2e\x31\x32\x33\x33\x34\x2c\x2d\x30\x2e\
+\x30\x38\x36\x39\x20\x2d\x30\x2e\x32\x35\x36\x38\x31\x2c\x2d\x30\
+\x2e\x31\x34\x33\x35\x38\x20\x2d\x30\x2e\x31\x32\x33\x33\x33\x2c\
+\x2d\x30\x2e\x30\x38\x36\x37\x20\x2d\x30\x2e\x32\x35\x36\x30\x39\
+\x2c\x2d\x30\x2e\x31\x34\x33\x36\x20\x2d\x30\x2e\x31\x32\x33\x33\
+\x33\x2c\x2d\x30\x2e\x30\x38\x36\x37\x20\x2d\x30\x2e\x32\x36\x36\
+\x39\x34\x2c\x2d\x30\x2e\x31\x36\x33\x37\x33\x20\x2d\x30\x2e\x31\
+\x34\x33\x36\x2c\x2d\x30\x2e\x30\x37\x37\x35\x20\x2d\x30\x2e\x32\
+\x36\x36\x39\x36\x2c\x2d\x30\x2e\x31\x36\x33\x37\x32\x20\x2d\x30\
+\x2e\x31\x34\x33\x36\x32\x2c\x2d\x30\x2e\x30\x37\x37\x36\x20\x2d\
+\x30\x2e\x32\x38\x37\x31\x31\x2c\x2d\x30\x2e\x31\x35\x35\x32\x31\
+\x20\x2d\x30\x2e\x31\x34\x33\x36\x36\x2c\x2d\x30\x2e\x30\x37\x37\
+\x36\x20\x2d\x30\x2e\x32\x38\x37\x31\x33\x2c\x2d\x30\x2e\x31\x35\
+\x35\x31\x37\x20\x2d\x30\x2e\x32\x30\x34\x38\x35\x2c\x2d\x30\x2e\
+\x30\x39\x34\x36\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\
+\x32\x30\x34\x20\x2d\x30\x2e\x34\x33\x30\x37\x2c\x2d\x30\x2e\x32\
+\x33\x32\x38\x20\x63\x20\x2d\x31\x32\x2e\x35\x38\x32\x35\x2c\x2d\
+\x36\x2e\x35\x33\x39\x35\x36\x20\x2d\x32\x38\x2e\x35\x36\x37\x37\
+\x39\x2c\x2d\x38\x2e\x35\x30\x38\x33\x34\x20\x2d\x34\x34\x2e\x36\
+\x35\x30\x39\x33\x2c\x2d\x34\x2e\x33\x38\x32\x32\x20\x6c\x20\x2d\
+\x34\x2e\x31\x38\x33\x35\x36\x2c\x31\x2e\x30\x37\x34\x30\x31\x20\
+\x2d\x31\x30\x2e\x35\x38\x31\x38\x36\x2c\x2d\x34\x31\x2e\x32\x30\
+\x36\x39\x20\x2d\x32\x34\x2e\x35\x32\x32\x33\x31\x2c\x36\x2e\x32\
+\x38\x35\x37\x39\x20\x31\x30\x2e\x35\x34\x36\x39\x34\x2c\x34\x31\
+\x2e\x30\x34\x33\x39\x20\x2d\x31\x39\x2e\x36\x32\x32\x36\x2c\x35\
+\x2e\x30\x35\x38\x31\x34\x20\x2d\x31\x30\x2e\x35\x35\x33\x39\x31\
+\x2c\x2d\x34\x30\x2e\x39\x31\x32\x37\x38\x20\x2d\x32\x34\x2e\x35\
+\x32\x32\x33\x36\x2c\x36\x2e\x32\x38\x35\x38\x31\x20\x31\x30\x2e\
+\x35\x34\x36\x39\x34\x2c\x34\x31\x2e\x30\x34\x33\x39\x37\x20\x2d\
+\x35\x30\x2e\x35\x37\x31\x31\x37\x2c\x31\x33\x2e\x30\x31\x33\x31\
+\x33\x20\x36\x2e\x37\x32\x38\x39\x2c\x32\x36\x2e\x31\x35\x32\x30\
+\x32\x20\x32\x30\x2e\x33\x37\x36\x38\x34\x2c\x2d\x35\x2e\x32\x33\
+\x33\x35\x20\x61\x20\x31\x32\x2e\x36\x31\x30\x33\x39\x36\x2c\x31\
+\x32\x2e\x36\x31\x30\x33\x39\x36\x20\x30\x20\x30\x20\x31\x20\x31\
+\x35\x2e\x33\x36\x35\x33\x32\x2c\x39\x2e\x30\x38\x37\x39\x39\x20\
+\x76\x20\x30\x20\x6c\x20\x32\x38\x2e\x32\x38\x33\x37\x33\x2c\x31\
+\x31\x30\x2e\x30\x35\x33\x34\x35\x20\x61\x20\x38\x2e\x34\x32\x35\
+\x32\x39\x38\x2c\x38\x2e\x34\x32\x35\x32\x39\x38\x20\x30\x20\x30\
+\x20\x31\x20\x2d\x36\x2e\x30\x35\x32\x39\x39\x2c\x31\x30\x2e\x32\
+\x34\x38\x32\x33\x20\x6c\x20\x2d\x31\x37\x2e\x38\x35\x34\x37\x39\
+\x2c\x34\x2e\x35\x39\x33\x32\x34\x20\x31\x2e\x30\x34\x39\x32\x32\
+\x2c\x33\x31\x2e\x31\x30\x33\x30\x37\x20\x35\x30\x2e\x35\x31\x31\
+\x34\x2c\x2d\x31\x32\x2e\x39\x38\x30\x35\x34\x20\x31\x30\x2e\x36\
+\x38\x32\x37\x35\x2c\x34\x30\x2e\x39\x36\x39\x34\x31\x20\x32\x34\
+\x2e\x35\x30\x39\x39\x35\x2c\x2d\x36\x2e\x33\x30\x36\x37\x35\x20\
+\x2d\x31\x30\x2e\x35\x35\x33\x39\x32\x2c\x2d\x34\x31\x2e\x30\x36\
+\x34\x31\x35\x20\x31\x39\x2e\x36\x31\x36\x33\x34\x2c\x2d\x35\x2e\
+\x30\x32\x39\x33\x37\x20\x31\x30\x2e\x35\x35\x37\x38\x31\x2c\x34\
+\x31\x2e\x30\x36\x33\x33\x33\x20\x32\x34\x2e\x35\x30\x39\x39\x36\
+\x2c\x2d\x36\x2e\x33\x30\x36\x37\x33\x20\x2d\x31\x30\x2e\x35\x39\
+\x33\x35\x33\x2c\x2d\x34\x31\x2e\x32\x32\x33\x39\x36\x20\x63\x20\
+\x34\x2e\x31\x35\x33\x33\x31\x2c\x2d\x31\x2e\x30\x38\x36\x34\x37\
+\x20\x37\x2e\x37\x32\x36\x31\x36\x2c\x2d\x32\x2e\x30\x30\x38\x33\
+\x37\x20\x31\x30\x2e\x31\x39\x37\x37\x36\x2c\x2d\x32\x2e\x36\x34\
+\x37\x38\x32\x20\x31\x38\x2e\x31\x32\x34\x38\x33\x2c\x2d\x34\x2e\
+\x36\x36\x31\x35\x38\x20\x33\x32\x2e\x37\x38\x31\x36\x32\x2c\x2d\
+\x31\x35\x2e\x32\x38\x37\x37\x31\x20\x34\x31\x2e\x36\x35\x30\x38\
+\x31\x2c\x2d\x32\x38\x2e\x35\x33\x38\x33\x20\x6c\x20\x30\x2e\x32\
+\x39\x39\x35\x31\x2c\x2d\x30\x2e\x34\x34\x32\x33\x34\x20\x30\x2e\
+\x30\x32\x30\x35\x2c\x2d\x30\x2e\x30\x30\x39\x20\x30\x2e\x31\x34\
+\x35\x30\x36\x2c\x2d\x30\x2e\x32\x30\x36\x34\x32\x20\x30\x2e\x31\
+\x39\x32\x34\x38\x2c\x2d\x30\x2e\x33\x31\x30\x34\x33\x20\x30\x2e\
+\x30\x39\x36\x32\x2c\x2d\x30\x2e\x31\x35\x35\x32\x20\x30\x2e\x31\
+\x39\x32\x34\x32\x2c\x2d\x30\x2e\x33\x31\x30\x33\x39\x20\x30\x2e\
+\x30\x39\x35\x39\x2c\x2d\x30\x2e\x31\x35\x35\x32\x31\x20\x30\x2e\
+\x31\x37\x32\x33\x2c\x2d\x30\x2e\x32\x39\x37\x39\x37\x20\x30\x2e\
+\x30\x39\x36\x2c\x2d\x30\x2e\x31\x35\x35\x32\x34\x20\x30\x2e\x31\
+\x37\x32\x33\x33\x2c\x2d\x30\x2e\x32\x39\x38\x30\x31\x20\x30\x2e\
+\x30\x37\x37\x35\x2c\x2d\x30\x2e\x31\x34\x33\x35\x39\x20\x30\x2e\
+\x31\x37\x32\x33\x31\x2c\x2d\x30\x2e\x32\x39\x37\x39\x38\x20\x30\
+\x2e\x30\x37\x37\x37\x2c\x2d\x30\x2e\x31\x34\x33\x36\x35\x20\x30\
+\x2e\x31\x37\x32\x32\x37\x2c\x2d\x30\x2e\x32\x39\x38\x20\x30\x2e\
+\x30\x37\x37\x35\x2c\x2d\x30\x2e\x31\x34\x33\x36\x20\x30\x2e\x31\
+\x35\x35\x32\x34\x2c\x2d\x30\x2e\x32\x38\x37\x31\x35\x20\x30\x2e\
+\x30\x37\x37\x36\x2c\x2d\x30\x2e\x31\x34\x33\x36\x20\x30\x2e\x31\
+\x35\x35\x32\x2c\x2d\x30\x2e\x32\x38\x37\x30\x39\x20\x30\x2e\x30\
+\x37\x37\x34\x2c\x2d\x30\x2e\x31\x34\x33\x36\x37\x20\x30\x2e\x31\
+\x36\x33\x37\x37\x2c\x2d\x30\x2e\x32\x36\x36\x39\x35\x20\x30\x2e\
+\x30\x37\x37\x39\x2c\x2d\x30\x2e\x31\x34\x33\x36\x20\x30\x2e\x31\
+\x36\x33\x37\x36\x2c\x2d\x30\x2e\x32\x36\x36\x39\x38\x20\x30\x2e\
+\x30\x37\x37\x37\x2c\x2d\x30\x2e\x31\x34\x33\x35\x39\x20\x30\x2e\
+\x31\x34\x33\x36\x34\x2c\x2d\x30\x2e\x32\x35\x36\x39\x32\x20\x30\
+\x2e\x30\x37\x37\x37\x2c\x2d\x30\x2e\x31\x34\x33\x36\x33\x20\x30\
+\x2e\x31\x34\x33\x36\x32\x2c\x2d\x30\x2e\x32\x35\x36\x30\x35\x20\
+\x30\x2e\x30\x37\x37\x36\x2c\x2d\x30\x2e\x31\x34\x33\x36\x33\x20\
+\x30\x2e\x31\x34\x33\x36\x33\x2c\x2d\x30\x2e\x32\x35\x36\x31\x31\
+\x20\x30\x2e\x30\x35\x36\x38\x2c\x2d\x30\x2e\x31\x33\x32\x37\x37\
+\x20\x30\x2e\x31\x34\x33\x36\x35\x2c\x2d\x30\x2e\x32\x35\x36\x30\
+\x36\x20\x30\x2e\x30\x35\x36\x38\x2c\x2d\x30\x2e\x31\x33\x32\x37\
+\x37\x20\x30\x2e\x31\x32\x33\x32\x37\x2c\x2d\x30\x2e\x32\x34\x35\
+\x39\x37\x20\x30\x2e\x30\x36\x37\x35\x2c\x2d\x30\x2e\x31\x31\x33\
+\x33\x32\x20\x30\x2e\x31\x32\x33\x33\x39\x2c\x2d\x30\x2e\x32\x34\
+\x35\x39\x38\x20\x30\x2e\x30\x36\x37\x33\x2c\x2d\x30\x2e\x31\x31\
+\x33\x33\x32\x20\x30\x2e\x31\x32\x33\x33\x2c\x2d\x30\x2e\x32\x34\
+\x36\x30\x37\x20\x30\x2e\x30\x36\x37\x35\x2c\x2d\x30\x2e\x31\x31\
+\x33\x32\x31\x20\x30\x2e\x31\x32\x33\x33\x32\x2c\x2d\x30\x2e\x32\
+\x34\x35\x39\x39\x20\x30\x2e\x30\x36\x37\x33\x2c\x2d\x30\x2e\x31\
+\x31\x33\x33\x33\x20\x30\x2e\x31\x32\x33\x33\x36\x2c\x2d\x30\x2e\
+\x32\x34\x35\x39\x38\x20\x30\x2e\x30\x36\x37\x37\x2c\x2d\x30\x2e\
+\x31\x31\x33\x33\x32\x20\x30\x2e\x31\x32\x33\x33\x32\x2c\x2d\x30\
+\x2e\x32\x34\x36\x30\x32\x20\x30\x2e\x30\x36\x37\x37\x2c\x2d\x30\
+\x2e\x31\x31\x33\x33\x32\x20\x30\x2e\x31\x30\x33\x38\x35\x2c\x2d\
+\x30\x2e\x32\x33\x32\x38\x35\x20\x30\x2e\x30\x36\x37\x37\x2c\x2d\
+\x30\x2e\x31\x31\x33\x33\x33\x20\x30\x2e\x31\x30\x34\x30\x36\x2c\
+\x2d\x30\x2e\x32\x33\x32\x38\x32\x20\x30\x2e\x30\x34\x37\x37\x2c\
+\x2d\x30\x2e\x31\x30\x32\x34\x38\x20\x30\x2e\x31\x31\x33\x33\x32\
+\x2c\x2d\x30\x2e\x32\x36\x35\x33\x39\x20\x30\x2e\x31\x35\x35\x32\
+\x33\x2c\x2d\x30\x2e\x33\x33\x37\x35\x33\x20\x63\x20\x30\x2e\x31\
+\x31\x33\x33\x33\x2c\x2d\x30\x2e\x32\x36\x35\x34\x20\x30\x2e\x32\
+\x33\x32\x37\x38\x2c\x2d\x30\x2e\x35\x31\x31\x34\x33\x20\x30\x2e\
+\x33\x32\x39\x37\x39\x2c\x2d\x30\x2e\x37\x36\x36\x37\x20\x6c\x20\
+\x30\x2e\x30\x30\x38\x2c\x2d\x30\x2e\x30\x33\x30\x31\x20\x61\x20\
+\x34\x37\x2e\x31\x31\x37\x30\x39\x37\x2c\x34\x37\x2e\x31\x31\x37\
+\x30\x39\x37\x20\x30\x20\x30\x20\x30\x20\x32\x2e\x33\x39\x36\x33\
+\x37\x2c\x2d\x32\x37\x2e\x36\x30\x35\x35\x38\x20\x6c\x20\x2d\x30\
+\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\
+\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x32\x20\x2d\x30\x2e\x30\
+\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\x30\
+\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\
+\x2c\x2d\x30\x2e\x30\x32\x30\x33\x20\x2d\x30\x2e\x30\x30\x39\x2c\
+\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\
+\x30\x2e\x30\x32\x30\x33\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\
+\x2e\x30\x32\x30\x32\x20\x63\x20\x2d\x30\x2e\x30\x35\x38\x33\x2c\
+\x2d\x30\x2e\x32\x35\x30\x36\x36\x20\x2d\x30\x2e\x31\x31\x35\x37\
+\x36\x2c\x2d\x30\x2e\x35\x30\x30\x35\x35\x20\x2d\x30\x2e\x31\x37\
+\x33\x38\x34\x2c\x2d\x30\x2e\x37\x35\x31\x31\x36\x20\x76\x20\x2d\
+\x30\x2e\x30\x35\x30\x35\x20\x6c\x20\x2d\x30\x2e\x30\x30\x39\x2c\
+\x2d\x30\x2e\x30\x32\x30\x35\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\
+\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\
+\x2e\x30\x32\x30\x35\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\
+\x30\x32\x30\x32\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\
+\x32\x30\x35\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\
+\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\
+\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x35\
+\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\
+\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x35\x20\x2d\
+\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\
+\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\
+\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\
+\x34\x33\x2c\x2d\x30\x2e\x30\x37\x37\x36\x20\x63\x20\x2d\x30\x2e\
+\x30\x39\x31\x36\x2c\x2d\x30\x2e\x33\x36\x30\x30\x38\x20\x2d\x30\
+\x2e\x31\x36\x32\x39\x39\x2c\x2d\x30\x2e\x37\x33\x31\x30\x33\x20\
+\x2d\x30\x2e\x32\x37\x34\x37\x34\x2c\x2d\x31\x2e\x30\x38\x31\x30\
+\x31\x20\x2d\x30\x2e\x30\x33\x37\x32\x2c\x2d\x30\x2e\x32\x30\x38\
+\x37\x35\x20\x2d\x30\x2e\x30\x38\x39\x32\x2c\x2d\x30\x2e\x35\x39\
+\x30\x35\x38\x20\x2d\x30\x2e\x31\x31\x31\x35\x39\x2c\x2d\x31\x2e\
+\x30\x30\x39\x36\x20\x7a\x20\x6d\x20\x2d\x31\x34\x34\x2e\x30\x37\
+\x37\x35\x2c\x2d\x37\x33\x2e\x36\x32\x32\x31\x37\x20\x63\x20\x34\
+\x2e\x31\x38\x33\x35\x38\x2c\x2d\x31\x2e\x30\x37\x34\x30\x31\x20\
+\x32\x31\x2e\x34\x38\x31\x31\x38\x2c\x2d\x35\x2e\x34\x31\x38\x32\
+\x32\x20\x32\x37\x2e\x31\x38\x34\x39\x34\x2c\x2d\x36\x2e\x39\x30\
+\x31\x31\x36\x20\x39\x2e\x30\x36\x37\x38\x35\x2c\x2d\x32\x2e\x33\
+\x32\x31\x31\x32\x20\x31\x38\x2e\x30\x30\x33\x37\x37\x2c\x2d\x31\
+\x2e\x34\x32\x30\x31\x36\x20\x32\x34\x2e\x39\x38\x30\x32\x33\x2c\
+\x31\x2e\x39\x34\x20\x6c\x20\x30\x2e\x32\x33\x32\x38\x2c\x30\x2e\
+\x31\x30\x33\x39\x35\x20\x76\x20\x30\x20\x6c\x20\x30\x2e\x31\x30\
+\x32\x34\x38\x2c\x30\x2e\x30\x34\x37\x36\x20\x30\x2e\x31\x34\x33\
+\x36\x32\x2c\x30\x2e\x30\x37\x37\x38\x20\x30\x2e\x30\x37\x31\x32\
+\x2c\x30\x2e\x30\x33\x38\x31\x20\x30\x2e\x31\x34\x33\x35\x38\x2c\
+\x30\x2e\x30\x37\x37\x35\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\
+\x30\x33\x37\x39\x20\x30\x2e\x31\x34\x33\x36\x36\x2c\x30\x2e\x30\
+\x37\x37\x35\x20\x30\x2e\x30\x37\x31\x35\x2c\x30\x2e\x30\x33\x37\
+\x38\x20\x30\x2e\x31\x34\x33\x36\x2c\x30\x2e\x30\x37\x37\x35\x20\
+\x30\x2e\x30\x37\x31\x35\x2c\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\
+\x31\x34\x33\x35\x39\x2c\x30\x2e\x30\x37\x37\x36\x20\x30\x2e\x30\
+\x37\x31\x36\x2c\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x34\x33\
+\x36\x31\x2c\x30\x2e\x30\x37\x37\x35\x20\x30\x2e\x30\x37\x31\x34\
+\x2c\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x34\x33\x36\x32\x2c\
+\x30\x2e\x30\x37\x37\x34\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\
+\x30\x33\x37\x39\x20\x30\x2e\x31\x34\x33\x35\x37\x2c\x30\x2e\x30\
+\x37\x37\x35\x20\x30\x2e\x30\x37\x31\x36\x2c\x30\x2e\x30\x33\x37\
+\x39\x20\x30\x2e\x31\x34\x33\x36\x2c\x30\x2e\x30\x37\x37\x38\x20\
+\x30\x2e\x30\x37\x31\x35\x2c\x30\x2e\x30\x33\x38\x31\x20\x30\x2e\
+\x31\x32\x33\x32\x36\x2c\x30\x2e\x30\x38\x36\x37\x20\x30\x2e\x30\
+\x37\x31\x32\x2c\x30\x2e\x30\x33\x38\x31\x20\x30\x2e\x31\x32\x33\
+\x33\x32\x2c\x30\x2e\x30\x38\x36\x36\x20\x30\x2e\x30\x37\x31\x35\
+\x2c\x30\x2e\x30\x33\x38\x31\x20\x30\x2e\x31\x32\x33\x33\x31\x2c\
+\x30\x2e\x30\x38\x36\x36\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\
+\x30\x33\x38\x31\x20\x30\x2e\x31\x31\x33\x33\x34\x2c\x30\x2e\x30\
+\x36\x37\x37\x20\x30\x2e\x30\x37\x31\x33\x2c\x30\x2e\x30\x33\x37\
+\x39\x20\x30\x2e\x31\x31\x33\x33\x33\x2c\x30\x2e\x30\x36\x37\x35\
+\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\x33\x37\x39\x20\x30\
+\x2e\x31\x31\x33\x33\x33\x2c\x30\x2e\x30\x36\x37\x35\x20\x30\x2e\
+\x30\x37\x31\x33\x2c\x30\x2e\x30\x33\x38\x20\x30\x2e\x31\x31\x33\
+\x33\x34\x2c\x30\x2e\x30\x36\x37\x35\x20\x30\x2e\x30\x37\x31\x33\
+\x2c\x30\x2e\x30\x33\x38\x20\x30\x2e\x31\x31\x33\x33\x33\x2c\x30\
+\x2e\x30\x36\x37\x36\x20\x30\x2e\x30\x35\x31\x39\x2c\x30\x2e\x30\
+\x34\x38\x38\x20\x30\x2e\x31\x31\x33\x33\x34\x2c\x30\x2e\x30\x36\
+\x37\x36\x20\x30\x2e\x30\x34\x31\x2c\x30\x2e\x30\x32\x38\x36\x20\
+\x30\x2e\x31\x31\x33\x33\x33\x2c\x30\x2e\x30\x36\x37\x37\x20\x30\
+\x2e\x30\x34\x31\x32\x2c\x30\x2e\x30\x32\x38\x37\x20\x30\x2e\x31\
+\x31\x33\x33\x33\x2c\x30\x2e\x30\x36\x37\x34\x20\x30\x2e\x30\x34\
+\x31\x33\x2c\x30\x2e\x30\x32\x38\x34\x20\x30\x2e\x31\x31\x33\x33\
+\x34\x2c\x30\x2e\x30\x36\x37\x37\x20\x30\x2e\x30\x34\x31\x2c\x30\
+\x2e\x30\x32\x38\x36\x20\x30\x2e\x30\x39\x33\x31\x2c\x30\x2e\x30\
+\x37\x37\x35\x20\x30\x2e\x30\x34\x31\x2c\x30\x2e\x30\x32\x38\x34\
+\x20\x30\x2e\x31\x31\x33\x33\x34\x2c\x30\x2e\x30\x36\x37\x34\x20\
+\x30\x2e\x31\x35\x35\x31\x36\x2c\x30\x2e\x30\x39\x36\x32\x20\x63\
+\x20\x30\x2e\x31\x31\x33\x33\x34\x2c\x30\x2e\x30\x36\x37\x37\x20\
+\x30\x2e\x32\x31\x36\x34\x39\x2c\x30\x2e\x31\x36\x35\x33\x20\x30\
+\x2e\x33\x32\x39\x38\x34\x2c\x30\x2e\x32\x33\x32\x38\x32\x20\x76\
+\x20\x30\x20\x61\x20\x32\x31\x2e\x31\x34\x37\x34\x33\x39\x2c\x32\
+\x31\x2e\x31\x34\x37\x34\x33\x39\x20\x30\x20\x30\x20\x31\x20\x37\
+\x2e\x34\x39\x34\x38\x31\x2c\x31\x30\x2e\x37\x33\x37\x30\x34\x20\
+\x76\x20\x30\x20\x6c\x20\x30\x2e\x30\x33\x31\x37\x2c\x30\x2e\x30\
+\x35\x39\x38\x20\x63\x20\x30\x2e\x30\x33\x33\x36\x2c\x30\x2e\x31\
+\x31\x30\x32\x35\x20\x30\x2e\x30\x37\x37\x36\x2c\x30\x2e\x32\x33\
+\x39\x37\x36\x20\x30\x2e\x31\x31\x30\x39\x2c\x30\x2e\x33\x34\x39\
+\x39\x37\x20\x6c\x20\x30\x2e\x30\x30\x39\x2c\x30\x2e\x30\x32\x30\
+\x34\x20\x30\x2e\x30\x36\x34\x35\x2c\x30\x2e\x31\x31\x38\x37\x20\
+\x63\x20\x30\x2e\x30\x34\x35\x38\x2c\x30\x2e\x31\x38\x30\x30\x39\
+\x20\x30\x2e\x31\x30\x30\x39\x31\x2c\x30\x2e\x33\x32\x39\x38\x35\
+\x20\x30\x2e\x31\x34\x36\x36\x38\x2c\x30\x2e\x35\x30\x39\x38\x36\
+\x20\x61\x20\x33\x2e\x30\x36\x37\x36\x32\x34\x37\x2c\x33\x2e\x30\
+\x36\x37\x36\x32\x34\x37\x20\x30\x20\x30\x20\x31\x20\x30\x2e\x30\
+\x39\x37\x37\x2c\x30\x2e\x35\x36\x31\x39\x31\x20\x6c\x20\x30\x2e\
+\x30\x36\x34\x33\x2c\x30\x2e\x31\x31\x38\x36\x39\x20\x30\x2e\x30\
+\x30\x39\x2c\x30\x2e\x30\x32\x30\x35\x20\x61\x20\x31\x2e\x37\x30\
+\x37\x32\x35\x33\x34\x2c\x31\x2e\x37\x30\x37\x32\x35\x33\x37\x20\
+\x30\x20\x30\x20\x30\x20\x30\x2e\x30\x39\x31\x36\x2c\x30\x2e\x33\
+\x36\x30\x30\x34\x20\x6c\x20\x30\x2e\x30\x33\x31\x38\x2c\x30\x2e\
+\x30\x36\x20\x76\x20\x30\x20\x61\x20\x32\x31\x2e\x32\x31\x37\x32\
+\x38\x33\x2c\x32\x31\x2e\x32\x31\x37\x32\x38\x33\x20\x30\x20\x30\
+\x20\x31\x20\x2d\x31\x2e\x33\x39\x36\x38\x37\x2c\x31\x33\x2e\x30\
+\x31\x32\x33\x34\x20\x76\x20\x30\x20\x6c\x20\x2d\x30\x2e\x31\x36\
+\x30\x36\x36\x2c\x30\x2e\x33\x36\x37\x38\x36\x20\x2d\x30\x2e\x30\
+\x38\x35\x33\x2c\x30\x2e\x31\x37\x33\x38\x38\x20\x2d\x30\x2e\x30\
+\x36\x37\x34\x2c\x30\x2e\x31\x31\x33\x33\x34\x20\x2d\x30\x2e\x30\
+\x31\x38\x36\x2c\x30\x2e\x30\x36\x31\x31\x20\x2d\x30\x2e\x30\x34\
+\x37\x33\x2c\x30\x2e\x31\x30\x32\x35\x38\x20\x2d\x30\x2e\x30\x31\
+\x38\x36\x2c\x30\x2e\x30\x36\x31\x34\x20\x2d\x30\x2e\x30\x36\x37\
+\x36\x2c\x30\x2e\x31\x31\x33\x33\x32\x20\x2d\x30\x2e\x30\x31\x38\
+\x36\x2c\x30\x2e\x30\x36\x31\x20\x2d\x30\x2e\x30\x36\x37\x35\x2c\
+\x30\x2e\x31\x31\x33\x33\x32\x20\x2d\x30\x2e\x30\x31\x38\x36\x2c\
+\x30\x2e\x30\x36\x31\x33\x20\x2d\x30\x2e\x30\x36\x37\x35\x2c\x30\
+\x2e\x31\x31\x33\x33\x34\x20\x2d\x30\x2e\x30\x31\x38\x35\x2c\x30\
+\x2e\x30\x36\x31\x32\x20\x2d\x30\x2e\x30\x36\x37\x37\x2c\x30\x2e\
+\x31\x31\x33\x33\x33\x20\x2d\x30\x2e\x30\x31\x38\x36\x2c\x30\x2e\
+\x30\x36\x31\x33\x20\x2d\x30\x2e\x30\x36\x37\x33\x2c\x30\x2e\x31\
+\x31\x33\x33\x33\x20\x2d\x30\x2e\x30\x31\x38\x35\x2c\x30\x2e\x30\
+\x36\x31\x33\x20\x2d\x30\x2e\x30\x36\x37\x37\x2c\x30\x2e\x31\x31\
+\x33\x33\x34\x20\x2d\x30\x2e\x30\x33\x37\x39\x2c\x30\x2e\x30\x37\
+\x31\x37\x20\x2d\x30\x2e\x30\x36\x37\x35\x2c\x30\x2e\x31\x31\x33\
+\x33\x34\x20\x2d\x30\x2e\x30\x33\x37\x39\x2c\x30\x2e\x30\x37\x31\
+\x37\x20\x2d\x30\x2e\x30\x36\x37\x37\x2c\x30\x2e\x31\x31\x33\x33\
+\x34\x20\x2d\x30\x2e\x30\x33\x37\x39\x2c\x30\x2e\x30\x37\x31\x34\
+\x20\x2d\x30\x2e\x30\x36\x37\x37\x2c\x30\x2e\x31\x31\x33\x33\x34\
+\x20\x2d\x30\x2e\x30\x33\x37\x38\x2c\x30\x2e\x30\x37\x31\x33\x20\
+\x2d\x30\x2e\x30\x38\x36\x38\x2c\x30\x2e\x31\x32\x33\x33\x31\x20\
+\x2d\x30\x2e\x30\x33\x38\x31\x2c\x30\x2e\x30\x37\x31\x34\x20\x2d\
+\x30\x2e\x30\x38\x36\x36\x2c\x30\x2e\x31\x32\x33\x33\x33\x20\x2d\
+\x30\x2e\x30\x33\x38\x31\x2c\x30\x2e\x30\x37\x31\x34\x20\x2d\x30\
+\x2e\x30\x38\x36\x38\x2c\x30\x2e\x31\x32\x33\x32\x37\x20\x2d\x30\
+\x2e\x30\x33\x37\x38\x2c\x30\x2e\x30\x37\x31\x35\x20\x2d\x30\x2e\
+\x30\x38\x37\x31\x2c\x30\x2e\x31\x32\x33\x33\x33\x20\x2d\x30\x2e\
+\x30\x33\x38\x31\x2c\x30\x2e\x30\x37\x31\x36\x20\x2d\x30\x2e\x30\
+\x38\x36\x38\x2c\x30\x2e\x31\x32\x33\x33\x33\x20\x2d\x30\x2e\x30\
+\x33\x37\x39\x2c\x30\x2e\x30\x37\x31\x34\x20\x2d\x30\x2e\x30\x38\
+\x36\x36\x2c\x30\x2e\x31\x32\x33\x32\x35\x20\x2d\x30\x2e\x30\x33\
+\x38\x33\x2c\x30\x2e\x30\x37\x31\x37\x20\x2d\x30\x2e\x30\x38\x36\
+\x36\x2c\x30\x2e\x31\x32\x33\x33\x20\x2d\x30\x2e\x30\x33\x37\x38\
+\x2c\x30\x2e\x30\x37\x31\x34\x20\x2d\x30\x2e\x30\x38\x36\x37\x2c\
+\x30\x2e\x31\x32\x33\x32\x39\x20\x2d\x30\x2e\x30\x33\x37\x39\x2c\
+\x30\x2e\x30\x37\x31\x36\x20\x2d\x30\x2e\x31\x30\x37\x31\x36\x2c\
+\x30\x2e\x31\x33\x34\x32\x37\x20\x2d\x30\x2e\x30\x33\x38\x31\x2c\
+\x30\x2e\x30\x37\x31\x39\x20\x2d\x30\x2e\x31\x30\x36\x39\x34\x2c\
+\x30\x2e\x31\x33\x34\x32\x38\x20\x2d\x30\x2e\x30\x33\x38\x2c\x30\
+\x2e\x30\x37\x31\x37\x20\x2d\x30\x2e\x31\x30\x36\x39\x34\x2c\x30\
+\x2e\x31\x33\x34\x32\x33\x20\x2d\x30\x2e\x30\x33\x37\x39\x2c\x30\
+\x2e\x30\x37\x31\x37\x20\x2d\x30\x2e\x31\x30\x37\x31\x36\x2c\x30\
+\x2e\x31\x33\x34\x33\x20\x2d\x30\x2e\x30\x37\x37\x34\x2c\x30\x2e\
+\x30\x39\x33\x32\x20\x76\x20\x30\x20\x6c\x20\x2d\x30\x2e\x31\x34\
+\x35\x30\x37\x2c\x30\x2e\x32\x30\x36\x34\x20\x63\x20\x2d\x34\x2e\
+\x35\x30\x39\x34\x37\x2c\x36\x2e\x33\x31\x38\x34\x32\x20\x2d\x31\
+\x31\x2e\x38\x39\x39\x35\x34\x2c\x31\x31\x2e\x34\x32\x33\x31\x32\
+\x20\x2d\x32\x30\x2e\x39\x36\x37\x34\x2c\x31\x33\x2e\x37\x34\x34\
+\x32\x31\x20\x2d\x35\x2e\x37\x31\x34\x36\x35\x2c\x31\x2e\x34\x36\
+\x33\x35\x33\x20\x2d\x32\x32\x2e\x39\x37\x30\x33\x35\x2c\x35\x2e\
+\x39\x38\x37\x37\x36\x20\x2d\x32\x37\x2e\x31\x34\x39\x39\x37\x2c\
+\x37\x2e\x30\x36\x31\x38\x20\x7a\x20\x6d\x20\x39\x35\x2e\x38\x34\
+\x38\x33\x33\x2c\x38\x34\x2e\x33\x37\x31\x36\x39\x20\x30\x2e\x30\
+\x36\x34\x35\x2c\x30\x2e\x31\x31\x38\x37\x36\x20\x30\x2e\x30\x30\
+\x39\x2c\x30\x2e\x30\x32\x30\x32\x20\x63\x20\x30\x2e\x30\x32\x34\
+\x34\x2c\x30\x2e\x31\x34\x30\x34\x34\x20\x30\x2e\x30\x35\x38\x32\
+\x2c\x30\x2e\x32\x35\x30\x36\x37\x20\x30\x2e\x30\x38\x32\x2c\x30\
+\x2e\x33\x38\x38\x30\x35\x20\x76\x20\x30\x20\x6c\x20\x30\x2e\x30\
+\x30\x39\x2c\x30\x2e\x30\x32\x30\x32\x20\x76\x20\x30\x20\x6c\x20\
+\x30\x2e\x30\x30\x39\x2c\x30\x2e\x30\x32\x30\x34\x20\x30\x2e\x30\
+\x30\x39\x2c\x30\x2e\x30\x32\x30\x33\x20\x30\x2e\x30\x30\x39\x2c\
+\x30\x2e\x30\x32\x30\x34\x20\x76\x20\x30\x20\x61\x20\x32\x31\x2e\
+\x37\x39\x36\x31\x39\x36\x2c\x32\x31\x2e\x37\x39\x36\x31\x39\x36\
+\x20\x30\x20\x30\x20\x31\x20\x2d\x31\x2e\x39\x37\x31\x38\x33\x2c\
+\x31\x34\x2e\x32\x31\x39\x38\x39\x20\x76\x20\x30\x20\x6c\x20\x2d\
+\x30\x2e\x32\x31\x39\x36\x33\x2c\x30\x2e\x33\x39\x39\x36\x35\x20\
+\x2d\x30\x2e\x31\x30\x35\x35\x32\x2c\x30\x2e\x31\x38\x34\x36\x38\
+\x20\x2d\x30\x2e\x30\x37\x37\x36\x2c\x30\x2e\x31\x34\x33\x36\x33\
+\x20\x2d\x30\x2e\x30\x33\x38\x2c\x30\x2e\x30\x37\x31\x37\x20\x2d\
+\x30\x2e\x30\x36\x37\x35\x2c\x30\x2e\x31\x31\x33\x33\x33\x20\x2d\
+\x30\x2e\x30\x33\x37\x38\x2c\x30\x2e\x30\x37\x31\x33\x20\x2d\x30\
+\x2e\x30\x36\x37\x37\x2c\x30\x2e\x31\x31\x33\x33\x34\x20\x2d\x30\
+\x2e\x30\x33\x37\x39\x2c\x30\x2e\x30\x37\x31\x36\x20\x2d\x30\x2e\
+\x30\x38\x36\x38\x2c\x30\x2e\x31\x32\x33\x32\x34\x20\x2d\x30\x2e\
+\x30\x33\x38\x2c\x30\x2e\x30\x37\x31\x33\x20\x2d\x30\x2e\x30\x38\
+\x36\x38\x2c\x30\x2e\x31\x32\x33\x33\x33\x20\x2d\x30\x2e\x30\x33\
+\x38\x2c\x30\x2e\x30\x37\x31\x34\x20\x2d\x30\x2e\x30\x38\x36\x38\
+\x2c\x30\x2e\x31\x32\x33\x33\x33\x20\x2d\x30\x2e\x30\x33\x38\x2c\
+\x30\x2e\x30\x37\x31\x34\x20\x2d\x30\x2e\x30\x38\x36\x38\x2c\x30\
+\x2e\x31\x32\x33\x33\x31\x20\x2d\x30\x2e\x30\x33\x37\x38\x2c\x30\
+\x2e\x30\x37\x31\x33\x20\x2d\x30\x2e\x30\x38\x36\x35\x2c\x30\x2e\
+\x31\x32\x33\x33\x32\x20\x2d\x30\x2e\x30\x33\x37\x38\x2c\x30\x2e\
+\x30\x37\x31\x34\x20\x2d\x30\x2e\x30\x38\x36\x37\x2c\x30\x2e\x31\
+\x32\x33\x32\x39\x20\x2d\x30\x2e\x30\x33\x37\x39\x2c\x30\x2e\x30\
+\x37\x31\x34\x20\x2d\x30\x2e\x30\x38\x36\x36\x2c\x30\x2e\x31\x32\
+\x33\x33\x20\x2d\x30\x2e\x30\x33\x37\x39\x2c\x30\x2e\x30\x37\x31\
+\x36\x20\x2d\x30\x2e\x30\x38\x37\x31\x2c\x30\x2e\x31\x32\x33\x33\
+\x20\x2d\x30\x2e\x30\x33\x38\x2c\x30\x2e\x30\x37\x31\x35\x20\x2d\
+\x30\x2e\x30\x38\x36\x37\x2c\x30\x2e\x31\x32\x33\x32\x35\x20\x2d\
+\x30\x2e\x30\x33\x38\x31\x2c\x30\x2e\x30\x37\x31\x37\x20\x2d\x30\
+\x2e\x31\x30\x37\x30\x35\x2c\x30\x2e\x31\x33\x34\x33\x35\x20\x2d\
+\x30\x2e\x30\x33\x37\x38\x2c\x30\x2e\x30\x37\x31\x34\x20\x2d\x30\
+\x2e\x31\x30\x37\x31\x36\x2c\x30\x2e\x31\x33\x34\x32\x31\x20\x2d\
+\x30\x2e\x30\x33\x38\x2c\x30\x2e\x30\x37\x31\x34\x20\x2d\x30\x2e\
+\x30\x39\x36\x32\x2c\x30\x2e\x31\x35\x35\x31\x37\x20\x2d\x30\x2e\
+\x30\x33\x38\x2c\x30\x2e\x30\x37\x31\x35\x20\x2d\x30\x2e\x30\x39\
+\x36\x32\x2c\x30\x2e\x31\x35\x35\x32\x31\x20\x2d\x30\x2e\x30\x33\
+\x37\x39\x2c\x30\x2e\x30\x37\x31\x36\x20\x2d\x30\x2e\x30\x39\x36\
+\x32\x2c\x30\x2e\x31\x35\x35\x31\x37\x20\x2d\x30\x2e\x30\x35\x38\
+\x33\x2c\x30\x2e\x30\x38\x32\x34\x20\x2d\x30\x2e\x30\x39\x36\x32\
+\x2c\x30\x2e\x31\x35\x35\x32\x20\x2d\x30\x2e\x30\x35\x38\x34\x2c\
+\x30\x2e\x30\x38\x32\x34\x20\x2d\x30\x2e\x31\x31\x36\x33\x35\x2c\
+\x30\x2e\x31\x36\x34\x35\x34\x20\x2d\x30\x2e\x30\x35\x38\x33\x2c\
+\x30\x2e\x30\x38\x32\x32\x20\x2d\x30\x2e\x31\x31\x36\x33\x36\x2c\
+\x30\x2e\x31\x36\x34\x35\x31\x20\x2d\x30\x2e\x30\x35\x38\x33\x2c\
+\x30\x2e\x30\x38\x32\x31\x20\x2d\x30\x2e\x31\x31\x36\x33\x39\x2c\
+\x30\x2e\x31\x36\x34\x35\x20\x2d\x30\x2e\x30\x35\x38\x32\x2c\x30\
+\x2e\x30\x38\x32\x34\x20\x2d\x30\x2e\x31\x31\x37\x30\x36\x2c\x30\
+\x2e\x31\x36\x34\x35\x36\x20\x2d\x30\x2e\x30\x35\x38\x32\x2c\x30\
+\x2e\x30\x38\x32\x34\x20\x2d\x30\x2e\x31\x31\x36\x33\x2c\x30\x2e\
+\x31\x36\x34\x34\x37\x20\x2d\x30\x2e\x30\x39\x37\x37\x2c\x30\x2e\
+\x31\x30\x33\x37\x34\x20\x76\x20\x30\x20\x6c\x20\x2d\x30\x2e\x31\
+\x38\x34\x37\x32\x2c\x30\x2e\x32\x32\x37\x33\x36\x20\x63\x20\x2d\
+\x35\x2e\x34\x37\x36\x33\x39\x2c\x36\x2e\x39\x39\x33\x35\x37\x20\
+\x2d\x31\x34\x2e\x33\x30\x39\x38\x37\x2c\x31\x32\x2e\x37\x34\x36\
+\x31\x39\x20\x2d\x32\x35\x2e\x30\x33\x38\x34\x31\x2c\x31\x35\x2e\
+\x35\x30\x30\x33\x34\x20\x2d\x36\x2e\x37\x36\x36\x31\x31\x2c\x31\
+\x2e\x37\x34\x36\x38\x31\x20\x2d\x32\x37\x2e\x32\x30\x39\x37\x2c\
+\x37\x2e\x30\x39\x33\x36\x33\x20\x2d\x33\x32\x2e\x31\x38\x34\x30\
+\x38\x2c\x38\x2e\x33\x36\x33\x32\x32\x20\x6c\x20\x2d\x31\x33\x2e\
+\x39\x32\x30\x33\x2c\x2d\x35\x34\x2e\x31\x35\x37\x32\x20\x63\x20\
+\x34\x2e\x39\x36\x36\x36\x2c\x2d\x31\x2e\x32\x38\x39\x37\x32\x20\
+\x32\x35\x2e\x34\x36\x34\x35\x33\x2c\x2d\x36\x2e\x34\x33\x36\x33\
+\x36\x20\x33\x32\x2e\x32\x32\x39\x38\x35\x2c\x2d\x38\x2e\x31\x38\
+\x33\x31\x36\x20\x31\x30\x2e\x37\x32\x39\x33\x36\x2c\x2d\x32\x2e\
+\x37\x35\x34\x31\x20\x32\x31\x2e\x32\x36\x33\x31\x2c\x2d\x31\x2e\
+\x39\x37\x32\x36\x38\x20\x32\x39\x2e\x34\x30\x34\x33\x36\x2c\x31\
+\x2e\x35\x30\x33\x39\x34\x20\x6c\x20\x30\x2e\x32\x36\x35\x34\x32\
+\x2c\x30\x2e\x31\x31\x33\x33\x33\x20\x76\x20\x30\x20\x6c\x20\x30\
+\x2e\x31\x33\x32\x37\x31\x2c\x30\x2e\x30\x35\x36\x37\x20\x30\x2e\
+\x31\x39\x34\x2c\x30\x2e\x30\x37\x37\x33\x20\x30\x2e\x30\x39\x31\
+\x37\x2c\x30\x2e\x30\x32\x37\x33\x20\x30\x2e\x31\x37\x33\x38\x34\
+\x2c\x30\x2e\x30\x38\x35\x32\x20\x30\x2e\x30\x39\x31\x33\x2c\x30\
+\x2e\x30\x32\x37\x20\x30\x2e\x31\x37\x33\x37\x38\x2c\x30\x2e\x30\
+\x38\x35\x33\x20\x30\x2e\x30\x39\x31\x38\x2c\x30\x2e\x30\x32\x37\
+\x31\x20\x30\x2e\x31\x37\x33\x38\x33\x2c\x30\x2e\x30\x38\x35\x33\
+\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\x33\x38\x31\x20\x30\
+\x2e\x31\x37\x33\x39\x2c\x30\x2e\x30\x38\x35\x33\x20\x30\x2e\x30\
+\x37\x31\x34\x2c\x30\x2e\x30\x33\x37\x38\x20\x30\x2e\x31\x37\x33\
+\x38\x34\x2c\x30\x2e\x30\x38\x35\x33\x20\x30\x2e\x30\x37\x31\x33\
+\x2c\x30\x2e\x30\x33\x37\x38\x20\x30\x2e\x31\x37\x33\x38\x38\x2c\
+\x30\x2e\x30\x38\x35\x33\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\
+\x30\x33\x38\x20\x30\x2e\x31\x34\x33\x35\x39\x2c\x30\x2e\x30\x37\
+\x37\x38\x20\x30\x2e\x30\x37\x31\x32\x2c\x30\x2e\x30\x33\x37\x39\
+\x20\x30\x2e\x31\x34\x33\x36\x32\x2c\x30\x2e\x30\x37\x37\x37\x20\
+\x30\x2e\x30\x37\x31\x32\x2c\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\
+\x31\x34\x33\x36\x34\x2c\x30\x2e\x30\x37\x37\x34\x20\x30\x2e\x30\
+\x37\x31\x34\x2c\x30\x2e\x30\x33\x38\x31\x20\x30\x2e\x31\x34\x33\
+\x36\x31\x2c\x30\x2e\x30\x37\x37\x36\x20\x30\x2e\x30\x37\x31\x33\
+\x2c\x30\x2e\x30\x33\x38\x33\x20\x30\x2e\x31\x34\x33\x36\x37\x2c\
+\x30\x2e\x30\x37\x37\x36\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\
+\x30\x33\x37\x39\x20\x30\x2e\x31\x34\x33\x36\x2c\x30\x2e\x30\x37\
+\x37\x35\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\x33\x37\x36\
+\x20\x30\x2e\x31\x34\x33\x36\x35\x2c\x30\x2e\x30\x37\x37\x36\x20\
+\x30\x2e\x30\x37\x31\x33\x2c\x30\x2e\x30\x33\x38\x33\x20\x30\x2e\
+\x31\x34\x33\x36\x36\x2c\x30\x2e\x30\x37\x37\x36\x20\x30\x2e\x30\
+\x37\x31\x34\x2c\x30\x2e\x30\x33\x38\x33\x20\x30\x2e\x31\x34\x33\
+\x36\x39\x2c\x30\x2e\x30\x37\x37\x35\x20\x30\x2e\x30\x37\x31\x34\
+\x2c\x30\x2e\x30\x33\x38\x31\x20\x30\x2e\x31\x32\x33\x33\x33\x2c\
+\x30\x2e\x30\x38\x36\x39\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\
+\x30\x33\x37\x39\x20\x30\x2e\x31\x32\x33\x33\x32\x2c\x30\x2e\x30\
+\x38\x36\x36\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\x33\x38\
+\x31\x20\x30\x2e\x31\x32\x33\x32\x38\x2c\x30\x2e\x30\x38\x36\x36\
+\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\x33\x37\x39\x20\x30\
+\x2e\x31\x32\x33\x32\x38\x2c\x30\x2e\x30\x38\x36\x36\x20\x30\x2e\
+\x30\x37\x31\x36\x2c\x30\x2e\x30\x33\x38\x20\x30\x2e\x31\x32\x33\
+\x33\x2c\x30\x2e\x30\x38\x36\x38\x20\x30\x2e\x30\x37\x31\x34\x2c\
+\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x31\x33\x33\x34\x2c\x30\
+\x2e\x30\x36\x37\x35\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\
+\x33\x38\x20\x30\x2e\x31\x32\x33\x33\x2c\x30\x2e\x30\x38\x36\x38\
+\x20\x30\x2e\x31\x36\x34\x35\x36\x2c\x30\x2e\x31\x31\x36\x34\x20\
+\x63\x20\x30\x2e\x31\x32\x33\x33\x32\x2c\x30\x2e\x30\x38\x36\x36\
+\x20\x30\x2e\x32\x36\x36\x39\x32\x2c\x30\x2e\x31\x36\x33\x37\x36\
+\x20\x30\x2e\x33\x38\x37\x39\x38\x2c\x30\x2e\x32\x35\x30\x37\x20\
+\x76\x20\x30\x20\x61\x20\x32\x31\x2e\x38\x36\x32\x31\x36\x32\x2c\
+\x32\x31\x2e\x38\x36\x32\x31\x36\x20\x30\x20\x30\x20\x31\x20\x38\
+\x2e\x35\x37\x37\x34\x31\x2c\x31\x31\x2e\x35\x31\x31\x35\x31\x20\
+\x76\x20\x30\x20\x6c\x20\x30\x2e\x30\x34\x32\x37\x2c\x30\x2e\x30\
+\x37\x37\x36\x20\x63\x20\x30\x2e\x30\x34\x34\x32\x2c\x30\x2e\x31\
+\x32\x39\x36\x34\x20\x30\x2e\x30\x37\x37\x36\x2c\x30\x2e\x32\x33\
+\x39\x38\x31\x20\x30\x2e\x31\x32\x31\x39\x33\x2c\x30\x2e\x33\x36\
+\x39\x34\x33\x20\x6c\x20\x30\x2e\x30\x30\x39\x2c\x30\x2e\x30\x32\
+\x30\x35\x20\x30\x2e\x30\x36\x34\x35\x2c\x30\x2e\x31\x31\x38\x37\
+\x33\x20\x63\x20\x30\x2e\x30\x34\x35\x39\x2c\x30\x2e\x31\x38\x30\
+\x30\x36\x20\x30\x2e\x30\x39\x31\x38\x2c\x30\x2e\x33\x36\x30\x30\
+\x38\x20\x30\x2e\x31\x34\x38\x32\x34\x2c\x30\x2e\x35\x36\x30\x32\
+\x37\x20\x30\x2e\x31\x30\x30\x30\x37\x2c\x30\x2e\x30\x34\x34\x33\
+\x20\x30\x2e\x31\x31\x36\x33\x37\x2c\x30\x2e\x32\x36\x35\x34\x33\
+\x20\x30\x2e\x30\x38\x34\x36\x2c\x30\x2e\x35\x33\x38\x35\x38\x20\
+\x7a\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x70\x61\
+\x74\x68\x31\x31\x30\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\
+\x79\x6c\x65\x3d\x22\x64\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\
+\x69\x6e\x65\x3b\x66\x69\x6c\x6c\x3a\x23\x66\x66\x66\x66\x66\x66\
+\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x30\x2e\
+\x37\x37\x36\x30\x32\x34\x34\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6e\x6e\x65\x63\x74\
+\x6f\x72\x2d\x63\x75\x72\x76\x61\x74\x75\x72\x65\x3d\x22\x30\x22\
+\x20\x2f\x3e\x0a\x20\x20\x3c\x2f\x67\x3e\x0a\x20\x20\x3c\x67\x0a\
+\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x67\x34\x37\x36\x33\x22\x0a\
+\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x6c\x61\
+\x62\x65\x6c\x3d\x22\x42\x61\x64\x67\x65\x5f\x47\x72\x6f\x75\x70\
+\x22\x0a\x20\x20\x20\x20\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\
+\x3d\x22\x6d\x61\x74\x72\x69\x78\x28\x31\x2e\x34\x37\x30\x38\x30\
+\x36\x37\x2c\x30\x2c\x30\x2c\x31\x2e\x35\x36\x39\x35\x37\x34\x2c\
+\x2d\x33\x33\x35\x2e\x38\x35\x33\x38\x2c\x31\x39\x2e\x31\x31\x38\
+\x38\x36\x36\x29\x22\x0a\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\
+\x3d\x22\x64\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\x69\x6e\x65\
+\x22\x3e\x0a\x20\x20\x20\x20\x3c\x65\x6c\x6c\x69\x70\x73\x65\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\
+\x6c\x61\x62\x65\x6c\x3d\x22\x62\x61\x64\x67\x65\x5f\x63\x69\x72\
+\x63\x6c\x65\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x72\x79\x3d\x22\
+\x31\x38\x33\x2e\x35\x35\x34\x33\x31\x22\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x72\x78\x3d\x22\x31\x39\x30\x2e\x34\x35\x34\x38\x33\x22\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x63\x79\x3d\x22\x31\x39\x36\x2e\
+\x30\x35\x34\x33\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x63\x78\
+\x3d\x22\x37\x39\x37\x2e\x30\x34\x35\x31\x37\x22\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x33\x38\x30\x38\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\
+\x64\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\x69\x6e\x65\x3b\x6f\
+\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x3a\x23\x66\
+\x66\x32\x32\x32\x32\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\
+\x74\x79\x3a\x31\x3b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3a\x6e\
+\x6f\x6e\x7a\x65\x72\x6f\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x23\x66\
+\x66\x66\x66\x66\x66\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\
+\x74\x68\x3a\x33\x32\x2e\x39\x30\x37\x39\x38\x35\x36\x39\x3b\x73\
+\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\x72\x6f\
+\x75\x6e\x64\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\
+\x6f\x69\x6e\x3a\x72\x6f\x75\x6e\x64\x3b\x73\x74\x72\x6f\x6b\x65\
+\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3a\x34\x2e\x31\x39\
+\x39\x39\x39\x39\x38\x31\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\
+\x73\x68\x61\x72\x72\x61\x79\x3a\x6e\x6f\x6e\x65\x3b\x73\x74\x72\
+\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x70\x61\
+\x69\x6e\x74\x2d\x6f\x72\x64\x65\x72\x3a\x6d\x61\x72\x6b\x65\x72\
+\x73\x20\x66\x69\x6c\x6c\x20\x73\x74\x72\x6f\x6b\x65\x22\x20\x2f\
+\x3e\x0a\x20\x20\x20\x20\x3c\x74\x65\x78\x74\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x69\x64\x3d\x22\x74\x65\x78\x74\x34\x37\x35\x38\x22\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x79\x3d\x22\x32\x38\x30\x2e\x39\
+\x36\x33\x39\x36\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x3d\x22\
+\x37\x31\x37\x2e\x36\x35\x35\x38\x38\x22\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x6f\x6e\x74\x2d\x73\x74\
+\x79\x6c\x65\x3a\x6e\x6f\x72\x6d\x61\x6c\x3b\x66\x6f\x6e\x74\x2d\
+\x76\x61\x72\x69\x61\x6e\x74\x3a\x6e\x6f\x72\x6d\x61\x6c\x3b\x66\
+\x6f\x6e\x74\x2d\x77\x65\x69\x67\x68\x74\x3a\x62\x6f\x6c\x64\x3b\
+\x66\x6f\x6e\x74\x2d\x73\x74\x72\x65\x74\x63\x68\x3a\x6e\x6f\x72\
+\x6d\x61\x6c\x3b\x66\x6f\x6e\x74\x2d\x73\x69\x7a\x65\x3a\x32\x36\
+\x36\x2e\x36\x36\x36\x36\x35\x36\x34\x39\x70\x78\x3b\x6c\x69\x6e\
+\x65\x2d\x68\x65\x69\x67\x68\x74\x3a\x31\x2e\x32\x35\x3b\x66\x6f\
+\x6e\x74\x2d\x66\x61\x6d\x69\x6c\x79\x3a\x48\x65\x6c\x76\x65\x74\
+\x69\x63\x61\x3b\x2d\x69\x6e\x6b\x73\x63\x61\x70\x65\x2d\x66\x6f\
+\x6e\x74\x2d\x73\x70\x65\x63\x69\x66\x69\x63\x61\x74\x69\x6f\x6e\
+\x3a\x27\x48\x65\x6c\x76\x65\x74\x69\x63\x61\x2c\x20\x42\x6f\x6c\
+\x64\x27\x3b\x66\x6f\x6e\x74\x2d\x76\x61\x72\x69\x61\x6e\x74\x2d\
+\x6c\x69\x67\x61\x74\x75\x72\x65\x73\x3a\x6e\x6f\x72\x6d\x61\x6c\
+\x3b\x66\x6f\x6e\x74\x2d\x76\x61\x72\x69\x61\x6e\x74\x2d\x63\x61\
+\x70\x73\x3a\x6e\x6f\x72\x6d\x61\x6c\x3b\x66\x6f\x6e\x74\x2d\x76\
+\x61\x72\x69\x61\x6e\x74\x2d\x6e\x75\x6d\x65\x72\x69\x63\x3a\x6e\
+\x6f\x72\x6d\x61\x6c\x3b\x66\x6f\x6e\x74\x2d\x66\x65\x61\x74\x75\
+\x72\x65\x2d\x73\x65\x74\x74\x69\x6e\x67\x73\x3a\x6e\x6f\x72\x6d\
+\x61\x6c\x3b\x74\x65\x78\x74\x2d\x61\x6c\x69\x67\x6e\x3a\x73\x74\
+\x61\x72\x74\x3b\x6c\x65\x74\x74\x65\x72\x2d\x73\x70\x61\x63\x69\
+\x6e\x67\x3a\x30\x70\x78\x3b\x77\x6f\x72\x64\x2d\x73\x70\x61\x63\
+\x69\x6e\x67\x3a\x30\x70\x78\x3b\x77\x72\x69\x74\x69\x6e\x67\x2d\
+\x6d\x6f\x64\x65\x3a\x6c\x72\x2d\x74\x62\x3b\x74\x65\x78\x74\x2d\
+\x61\x6e\x63\x68\x6f\x72\x3a\x73\x74\x61\x72\x74\x3b\x66\x69\x6c\
+\x6c\x3a\x23\x30\x30\x30\x30\x30\x30\x3b\x66\x69\x6c\x6c\x2d\x6f\
+\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x73\x74\x72\x6f\x6b\x65\x3a\
+\x6e\x6f\x6e\x65\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x78\x6d\x6c\
+\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\
+\x22\x3e\x3c\x74\x73\x70\x61\x6e\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x6f\x6e\x74\x2d\x73\x74\
+\x79\x6c\x65\x3a\x6e\x6f\x72\x6d\x61\x6c\x3b\x66\x6f\x6e\x74\x2d\
+\x76\x61\x72\x69\x61\x6e\x74\x3a\x6e\x6f\x72\x6d\x61\x6c\x3b\x66\
+\x6f\x6e\x74\x2d\x77\x65\x69\x67\x68\x74\x3a\x62\x6f\x6c\x64\x3b\
+\x66\x6f\x6e\x74\x2d\x73\x74\x72\x65\x74\x63\x68\x3a\x6e\x6f\x72\
+\x6d\x61\x6c\x3b\x66\x6f\x6e\x74\x2d\x73\x69\x7a\x65\x3a\x32\x36\
+\x36\x2e\x36\x36\x36\x36\x35\x36\x34\x39\x70\x78\x3b\x66\x6f\x6e\
+\x74\x2d\x66\x61\x6d\x69\x6c\x79\x3a\x48\x65\x6c\x76\x65\x74\x69\
+\x63\x61\x3b\x2d\x69\x6e\x6b\x73\x63\x61\x70\x65\x2d\x66\x6f\x6e\
+\x74\x2d\x73\x70\x65\x63\x69\x66\x69\x63\x61\x74\x69\x6f\x6e\x3a\
+\x27\x48\x65\x6c\x76\x65\x74\x69\x63\x61\x2c\x20\x42\x6f\x6c\x64\
+\x27\x3b\x66\x6f\x6e\x74\x2d\x76\x61\x72\x69\x61\x6e\x74\x2d\x6c\
+\x69\x67\x61\x74\x75\x72\x65\x73\x3a\x6e\x6f\x72\x6d\x61\x6c\x3b\
+\x66\x6f\x6e\x74\x2d\x76\x61\x72\x69\x61\x6e\x74\x2d\x63\x61\x70\
+\x73\x3a\x6e\x6f\x72\x6d\x61\x6c\x3b\x66\x6f\x6e\x74\x2d\x76\x61\
+\x72\x69\x61\x6e\x74\x2d\x6e\x75\x6d\x65\x72\x69\x63\x3a\x6e\x6f\
+\x72\x6d\x61\x6c\x3b\x66\x6f\x6e\x74\x2d\x66\x65\x61\x74\x75\x72\
+\x65\x2d\x73\x65\x74\x74\x69\x6e\x67\x73\x3a\x6e\x6f\x72\x6d\x61\
+\x6c\x3b\x74\x65\x78\x74\x2d\x61\x6c\x69\x67\x6e\x3a\x73\x74\x61\
+\x72\x74\x3b\x77\x72\x69\x74\x69\x6e\x67\x2d\x6d\x6f\x64\x65\x3a\
+\x6c\x72\x2d\x74\x62\x3b\x74\x65\x78\x74\x2d\x61\x6e\x63\x68\x6f\
+\x72\x3a\x73\x74\x61\x72\x74\x3b\x66\x69\x6c\x6c\x3a\x23\x66\x66\
+\x66\x66\x66\x66\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\
+\x79\x3a\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x79\x3d\
+\x22\x32\x38\x30\x2e\x39\x36\x33\x39\x36\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x78\x3d\x22\x37\x31\x37\x2e\x36\x35\x35\x38\
+\x38\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\
+\x74\x73\x70\x61\x6e\x34\x37\x35\x36\x22\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x72\x6f\x6c\
+\x65\x3d\x22\x6c\x69\x6e\x65\x22\x3e\x31\x3c\x2f\x74\x73\x70\x61\
+\x6e\x3e\x3c\x2f\x74\x65\x78\x74\x3e\x0a\x20\x20\x3c\x2f\x67\x3e\
+\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\
+\x00\x00\x0a\x2d\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
+\x6e\x6f\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\
+\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\
+\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x39\x2e\x30\x2e\x30\x2c\x20\
+\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\
+\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\
+\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\
+\x20\x2d\x2d\x3e\x0a\x0a\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x64\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\
+\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\
+\x6e\x74\x73\x2f\x31\x2e\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\
+\x6e\x73\x3a\x63\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x63\x72\
+\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\x6e\x73\x2e\x6f\x72\
+\x67\x2f\x6e\x73\x23\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
+\x72\x64\x66\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\
+\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x30\x32\x2f\x32\
+\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\x74\x61\x78\x2d\x6e\x73\x23\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x76\x67\x3d\x22\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\
+\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\
+\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x6f\x64\x69\x70\
+\x6f\x64\x69\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x73\x6f\x64\x69\
+\x70\x6f\x64\x69\x2e\x73\x6f\x75\x72\x63\x65\x66\x6f\x72\x67\x65\
+\x2e\x6e\x65\x74\x2f\x44\x54\x44\x2f\x73\x6f\x64\x69\x70\x6f\x64\
+\x69\x2d\x30\x2e\x64\x74\x64\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x69\x6e\x6b\x73\x63\x61\x70\x65\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\
+\x6f\x72\x67\x2f\x6e\x61\x6d\x65\x73\x70\x61\x63\x65\x73\x2f\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\x20\x76\x65\x72\x73\
+\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x0a\x20\x20\x20\x69\x64\x3d\
+\x22\x43\x61\x70\x61\x5f\x31\x22\x0a\x20\x20\x20\x78\x3d\x22\x30\
+\x70\x78\x22\x0a\x20\x20\x20\x79\x3d\x22\x30\x70\x78\x22\x0a\x20\
+\x20\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x35\
+\x31\x31\x2e\x39\x39\x39\x39\x39\x20\x35\x31\x31\x2e\x39\x39\x39\
+\x39\x39\x22\x0a\x20\x20\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\
+\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x0a\x20\x20\x20\x73\
+\x6f\x64\x69\x70\x6f\x64\x69\x3a\x64\x6f\x63\x6e\x61\x6d\x65\x3d\
+\x22\x70\x61\x70\x65\x72\x2d\x70\x6c\x61\x6e\x65\x5f\x64\x61\x72\
+\x6b\x5f\x74\x68\x65\x6d\x65\x2e\x73\x76\x67\x22\x0a\x20\x20\x20\
+\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x76\x65\x72\x73\x69\x6f\x6e\
+\x3d\x22\x30\x2e\x39\x32\x2e\x34\x20\x28\x35\x64\x61\x36\x38\x39\
+\x63\x33\x31\x33\x2c\x20\x32\x30\x31\x39\x2d\x30\x31\x2d\x31\x34\
+\x29\x22\x0a\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\x35\x31\x32\
+\x22\x0a\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\x32\
+\x22\x3e\x3c\x6d\x65\x74\x61\x64\x61\x74\x61\x0a\x20\x20\x20\x69\
+\x64\x3d\x22\x6d\x65\x74\x61\x64\x61\x74\x61\x39\x37\x34\x22\x3e\
+\x3c\x72\x64\x66\x3a\x52\x44\x46\x3e\x3c\x63\x63\x3a\x57\x6f\x72\
+\x6b\x0a\x20\x20\x20\x20\x20\x20\x20\x72\x64\x66\x3a\x61\x62\x6f\
+\x75\x74\x3d\x22\x22\x3e\x3c\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\
+\x3e\x69\x6d\x61\x67\x65\x2f\x73\x76\x67\x2b\x78\x6d\x6c\x3c\x2f\
+\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x3c\x64\x63\x3a\x74\x79\
+\x70\x65\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x64\x66\x3a\
+\x72\x65\x73\x6f\x75\x72\x63\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\
+\x2f\x70\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x64\x63\x6d\
+\x69\x74\x79\x70\x65\x2f\x53\x74\x69\x6c\x6c\x49\x6d\x61\x67\x65\
+\x22\x20\x2f\x3e\x3c\x64\x63\x3a\x74\x69\x74\x6c\x65\x3e\x3c\x2f\
+\x64\x63\x3a\x74\x69\x74\x6c\x65\x3e\x3c\x2f\x63\x63\x3a\x57\x6f\
+\x72\x6b\x3e\x3c\x2f\x72\x64\x66\x3a\x52\x44\x46\x3e\x3c\x2f\x6d\
+\x65\x74\x61\x64\x61\x74\x61\x3e\x3c\x64\x65\x66\x73\x0a\x20\x20\
+\x20\x69\x64\x3d\x22\x64\x65\x66\x73\x39\x37\x32\x22\x20\x2f\x3e\
+\x3c\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x6e\x61\x6d\x65\x64\x76\
+\x69\x65\x77\x0a\x20\x20\x20\x70\x61\x67\x65\x63\x6f\x6c\x6f\x72\
+\x3d\x22\x23\x66\x66\x66\x66\x66\x66\x22\x0a\x20\x20\x20\x62\x6f\
+\x72\x64\x65\x72\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x36\x36\x36\x36\
+\x36\x36\x22\x0a\x20\x20\x20\x62\x6f\x72\x64\x65\x72\x6f\x70\x61\
+\x63\x69\x74\x79\x3d\x22\x31\x22\x0a\x20\x20\x20\x6f\x62\x6a\x65\
+\x63\x74\x74\x6f\x6c\x65\x72\x61\x6e\x63\x65\x3d\x22\x31\x30\x22\
+\x0a\x20\x20\x20\x67\x72\x69\x64\x74\x6f\x6c\x65\x72\x61\x6e\x63\
+\x65\x3d\x22\x31\x30\x22\x0a\x20\x20\x20\x67\x75\x69\x64\x65\x74\
+\x6f\x6c\x65\x72\x61\x6e\x63\x65\x3d\x22\x31\x30\x22\x0a\x20\x20\
+\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x70\x61\x67\x65\x6f\x70\
+\x61\x63\x69\x74\x79\x3d\x22\x30\x22\x0a\x20\x20\x20\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3a\x70\x61\x67\x65\x73\x68\x61\x64\x6f\x77\
+\x3d\x22\x32\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x77\x69\x64\x74\x68\x3d\x22\x31\
+\x32\x33\x30\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\
+\x37\x37\x37\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x6e\x61\x6d\x65\
+\x64\x76\x69\x65\x77\x39\x37\x30\x22\x0a\x20\x20\x20\x73\x68\x6f\
+\x77\x67\x72\x69\x64\x3d\x22\x66\x61\x6c\x73\x65\x22\x0a\x20\x20\
+\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x7a\x6f\x6f\x6d\x3d\x22\
+\x31\x2e\x32\x34\x32\x31\x34\x32\x32\x22\x0a\x20\x20\x20\x69\x6e\
+\x6b\x73\x63\x61\x70\x65\x3a\x63\x78\x3d\x22\x32\x30\x34\x2e\x38\
+\x38\x37\x39\x37\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\
+\x65\x3a\x63\x79\x3d\x22\x33\x30\x36\x2e\x39\x38\x34\x37\x33\x22\
+\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\
+\x64\x6f\x77\x2d\x78\x3d\x22\x30\x22\x0a\x20\x20\x20\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x79\x3d\x22\
+\x30\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\
+\x69\x6e\x64\x6f\x77\x2d\x6d\x61\x78\x69\x6d\x69\x7a\x65\x64\x3d\
+\x22\x30\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\
+\x63\x75\x72\x72\x65\x6e\x74\x2d\x6c\x61\x79\x65\x72\x3d\x22\x67\
+\x39\x33\x37\x22\x20\x2f\x3e\x0a\x3c\x67\x0a\x20\x20\x20\x69\x64\
+\x3d\x22\x67\x39\x33\x37\x22\x0a\x20\x20\x20\x73\x74\x79\x6c\x65\
+\x3d\x22\x64\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\x69\x6e\x65\
+\x22\x0a\x20\x20\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\
+\x74\x72\x61\x6e\x73\x6c\x61\x74\x65\x28\x30\x2c\x32\x31\x2e\x37\
+\x31\x37\x39\x38\x37\x29\x22\x3e\x0a\x09\x3c\x70\x61\x74\x68\x0a\
+\x20\x20\x20\x64\x3d\x22\x4d\x20\x30\x2e\x30\x34\x35\x30\x36\x34\
+\x38\x33\x2c\x32\x33\x34\x2e\x33\x35\x30\x30\x33\x20\x43\x20\x30\
+\x2e\x36\x37\x31\x36\x34\x33\x33\x39\x2c\x32\x34\x36\x2e\x35\x39\
+\x35\x20\x37\x2e\x36\x36\x38\x34\x33\x37\x33\x2c\x32\x35\x36\x2e\
+\x39\x30\x30\x31\x37\x20\x31\x37\x2e\x37\x39\x38\x31\x32\x34\x2c\
+\x32\x36\x30\x2e\x34\x31\x36\x30\x35\x20\x6c\x20\x31\x38\x37\x2e\
+\x35\x35\x35\x38\x34\x36\x2c\x36\x35\x2e\x38\x33\x31\x38\x37\x20\
+\x36\x2e\x38\x39\x32\x33\x37\x2c\x31\x35\x30\x2e\x30\x39\x31\x38\
+\x20\x63\x20\x30\x2e\x33\x31\x33\x32\x38\x2c\x35\x2e\x39\x34\x30\
+\x36\x33\x20\x33\x2e\x37\x35\x39\x34\x37\x2c\x31\x31\x2e\x31\x35\
+\x33\x38\x33\x20\x38\x2e\x36\x36\x37\x36\x37\x2c\x31\x33\x2e\x30\
+\x39\x33\x36\x33\x20\x31\x2e\x33\x35\x37\x35\x38\x2c\x30\x2e\x36\
+\x30\x36\x31\x39\x20\x32\x2e\x38\x31\x39\x36\x2c\x30\x2e\x38\x34\
+\x38\x36\x36\x20\x34\x2e\x31\x37\x37\x31\x39\x2c\x30\x2e\x38\x34\
+\x38\x36\x36\x20\x33\x2e\x36\x35\x35\x30\x34\x2c\x30\x20\x37\x2e\
+\x31\x30\x31\x32\x32\x2c\x2d\x31\x2e\x36\x39\x37\x33\x32\x20\x39\
+\x2e\x36\x30\x37\x35\x33\x2c\x2d\x34\x2e\x39\x37\x30\x37\x33\x20\
+\x6c\x20\x36\x36\x2e\x33\x31\x32\x39\x2c\x2d\x38\x35\x2e\x32\x32\
+\x39\x38\x34\x20\x39\x33\x2e\x39\x38\x36\x37\x39\x2c\x37\x35\x2e\
+\x35\x33\x30\x38\x35\x20\x63\x20\x34\x2e\x31\x37\x37\x31\x39\x2c\
+\x33\x2e\x33\x39\x34\x36\x35\x20\x39\x2e\x30\x38\x35\x33\x39\x2c\
+\x35\x2e\x32\x31\x33\x32\x31\x20\x31\x34\x2e\x32\x30\x32\x34\x34\
+\x2c\x35\x2e\x32\x31\x33\x32\x31\x20\x31\x31\x2e\x38\x30\x30\x35\
+\x37\x2c\x30\x20\x32\x32\x2e\x30\x33\x34\x36\x38\x2c\x2d\x39\x2e\
+\x36\x39\x38\x39\x39\x20\x32\x34\x2e\x35\x34\x31\x2c\x2d\x32\x33\
+\x2e\x32\x37\x37\x35\x37\x20\x4c\x20\x35\x31\x31\x2e\x37\x35\x30\
+\x38\x39\x2c\x2d\x34\x2e\x30\x30\x32\x35\x33\x35\x32\x20\x63\x20\
+\x30\x2e\x39\x33\x39\x38\x37\x2c\x2d\x35\x2e\x33\x33\x34\x34\x34\
+\x32\x31\x20\x2d\x30\x2e\x38\x33\x35\x34\x34\x2c\x2d\x31\x30\x2e\
+\x39\x31\x31\x33\x35\x38\x38\x20\x2d\x34\x2e\x33\x38\x36\x30\x35\
+\x2c\x2d\x31\x34\x2e\x33\x30\x36\x30\x30\x33\x38\x20\x2d\x33\x2e\
+\x36\x35\x35\x30\x34\x2c\x2d\x33\x2e\x35\x31\x35\x38\x38\x32\x20\
+\x2d\x38\x2e\x35\x36\x33\x32\x34\x2c\x2d\x34\x2e\x33\x36\x34\x35\
+\x34\x33\x20\x2d\x31\x32\x2e\x39\x34\x39\x32\x39\x2c\x2d\x32\x2e\
+\x33\x30\x33\x35\x30\x39\x20\x4c\x20\x31\x35\x2e\x30\x38\x32\x39\
+\x35\x2c\x32\x30\x35\x2e\x38\x35\x39\x32\x36\x20\x63\x20\x2d\x39\
+\x2e\x37\x31\x31\x39\x36\x37\x34\x2c\x35\x2e\x30\x39\x31\x39\x37\
+\x20\x2d\x31\x35\x2e\x36\x36\x34\x34\x36\x33\x37\x34\x2c\x31\x36\
+\x2e\x32\x34\x35\x38\x20\x2d\x31\x35\x2e\x30\x33\x37\x38\x38\x35\
+\x31\x37\x2c\x32\x38\x2e\x34\x39\x30\x37\x37\x20\x7a\x20\x4d\x20\
+\x32\x33\x36\x2e\x30\x35\x36\x33\x32\x2c\x34\x33\x39\x2e\x31\x31\
+\x39\x38\x36\x20\x32\x33\x31\x2e\x37\x37\x34\x37\x2c\x33\x34\x34\
+\x2e\x34\x33\x33\x35\x32\x20\x32\x37\x39\x2e\x38\x31\x32\x33\x39\
+\x2c\x33\x38\x32\x2e\x39\x38\x36\x39\x38\x20\x5a\x20\x4d\x20\x34\
+\x30\x38\x2e\x37\x38\x33\x31\x35\x2c\x34\x35\x30\x2e\x36\x33\x37\
+\x34\x31\x20\x32\x33\x37\x2e\x37\x32\x37\x32\x2c\x33\x31\x33\x2e\
+\x31\x35\x34\x32\x39\x20\x34\x37\x37\x2e\x36\x30\x32\x33\x36\x2c\
+\x34\x33\x2e\x37\x36\x34\x39\x36\x35\x20\x5a\x20\x4d\x20\x34\x35\
+\x31\x2e\x32\x38\x36\x30\x36\x2c\x33\x31\x2e\x38\x38\x33\x37\x30\
+\x38\x20\x32\x31\x34\x2e\x31\x32\x36\x30\x37\x2c\x32\x39\x38\x2e\
+\x32\x34\x32\x31\x20\x32\x36\x2e\x37\x37\x39\x30\x38\x33\x2c\x32\
+\x33\x32\x2e\x35\x33\x31\x34\x37\x20\x5a\x22\x0a\x20\x20\x20\x69\
+\x64\x3d\x22\x70\x61\x74\x68\x39\x33\x35\x22\x0a\x20\x20\x20\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6e\x6e\x65\x63\x74\x6f\
+\x72\x2d\x63\x75\x72\x76\x61\x74\x75\x72\x65\x3d\x22\x30\x22\x0a\
+\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x72\x6f\x6b\x65\
+\x2d\x77\x69\x64\x74\x68\x3a\x31\x2e\x31\x32\x35\x32\x30\x31\x34\
+\x36\x3b\x66\x69\x6c\x6c\x3a\x23\x66\x66\x66\x66\x66\x66\x3b\x66\
+\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x22\x20\x2f\
+\x3e\x0a\x3c\x2f\x67\x3e\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\
+\x0a\x0a\x0a\x0a\x0a\x0a\x3c\x2f\x73\x76\x67\x3e\
+\x00\x00\x09\x42\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
+\x6e\x6f\x22\x3f\x3e\x0a\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x64\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\
+\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\
+\x6e\x74\x73\x2f\x31\x2e\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\
+\x6e\x73\x3a\x63\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x63\x72\
+\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\x6e\x73\x2e\x6f\x72\
+\x67\x2f\x6e\x73\x23\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
+\x72\x64\x66\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\
+\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x30\x32\x2f\x32\
+\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\x74\x61\x78\x2d\x6e\x73\x23\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x76\x67\x3d\x22\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\
+\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\
+\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x6f\x64\x69\x70\
+\x6f\x64\x69\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x73\x6f\x64\x69\
+\x70\x6f\x64\x69\x2e\x73\x6f\x75\x72\x63\x65\x66\x6f\x72\x67\x65\
+\x2e\x6e\x65\x74\x2f\x44\x54\x44\x2f\x73\x6f\x64\x69\x70\x6f\x64\
+\x69\x2d\x30\x2e\x64\x74\x64\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x69\x6e\x6b\x73\x63\x61\x70\x65\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\
+\x6f\x72\x67\x2f\x6e\x61\x6d\x65\x73\x70\x61\x63\x65\x73\x2f\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\x20\x76\x65\x72\x73\
+\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x0a\x20\x20\x20\x78\x3d\x22\
+\x30\x70\x78\x22\x0a\x20\x20\x20\x79\x3d\x22\x30\x70\x78\x22\x0a\
+\x20\x20\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\
+\x31\x32\x38\x20\x31\x32\x38\x22\x0a\x20\x20\x20\x65\x6e\x61\x62\
+\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\
+\x65\x77\x20\x30\x20\x30\x20\x31\x30\x30\x20\x31\x30\x30\x22\x0a\
+\x20\x20\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x73\
+\x76\x67\x38\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\
+\x3a\x64\x6f\x63\x6e\x61\x6d\x65\x3d\x22\x69\x6d\x70\x6f\x72\x74\
+\x2e\x73\x76\x67\x22\x0a\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\
+\x31\x32\x38\x22\x0a\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\
+\x31\x32\x38\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x30\x2e\x39\x32\x2e\x34\
+\x20\x28\x35\x64\x61\x36\x38\x39\x63\x33\x31\x33\x2c\x20\x32\x30\
+\x31\x39\x2d\x30\x31\x2d\x31\x34\x29\x22\x3e\x3c\x6d\x65\x74\x61\
+\x64\x61\x74\x61\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6d\x65\
+\x74\x61\x64\x61\x74\x61\x31\x34\x22\x3e\x3c\x72\x64\x66\x3a\x52\
+\x44\x46\x3e\x3c\x63\x63\x3a\x57\x6f\x72\x6b\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x72\x64\x66\x3a\x61\x62\x6f\x75\x74\x3d\x22\
+\x22\x3e\x3c\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x69\x6d\x61\
+\x67\x65\x2f\x73\x76\x67\x2b\x78\x6d\x6c\x3c\x2f\x64\x63\x3a\x66\
+\x6f\x72\x6d\x61\x74\x3e\x3c\x64\x63\x3a\x74\x79\x70\x65\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x64\x66\x3a\x72\x65\
+\x73\x6f\x75\x72\x63\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\
+\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x64\x63\x6d\x69\x74\
+\x79\x70\x65\x2f\x53\x74\x69\x6c\x6c\x49\x6d\x61\x67\x65\x22\x20\
+\x2f\x3e\x3c\x64\x63\x3a\x74\x69\x74\x6c\x65\x3e\x3c\x2f\x64\x63\
+\x3a\x74\x69\x74\x6c\x65\x3e\x3c\x2f\x63\x63\x3a\x57\x6f\x72\x6b\
+\x3e\x3c\x2f\x72\x64\x66\x3a\x52\x44\x46\x3e\x3c\x2f\x6d\x65\x74\
+\x61\x64\x61\x74\x61\x3e\x3c\x64\x65\x66\x73\x0a\x20\x20\x20\x20\
+\x20\x69\x64\x3d\x22\x64\x65\x66\x73\x31\x32\x22\x20\x2f\x3e\x3c\
+\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x6e\x61\x6d\x65\x64\x76\x69\
+\x65\x77\x0a\x20\x20\x20\x20\x20\x70\x61\x67\x65\x63\x6f\x6c\x6f\
+\x72\x3d\x22\x23\x66\x66\x66\x66\x66\x66\x22\x0a\x20\x20\x20\x20\
+\x20\x62\x6f\x72\x64\x65\x72\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x36\
+\x36\x36\x36\x36\x36\x22\x0a\x20\x20\x20\x20\x20\x62\x6f\x72\x64\
+\x65\x72\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x31\x22\x0a\x20\x20\
+\x20\x20\x20\x6f\x62\x6a\x65\x63\x74\x74\x6f\x6c\x65\x72\x61\x6e\
+\x63\x65\x3d\x22\x31\x30\x22\x0a\x20\x20\x20\x20\x20\x67\x72\x69\
+\x64\x74\x6f\x6c\x65\x72\x61\x6e\x63\x65\x3d\x22\x31\x30\x22\x0a\
+\x20\x20\x20\x20\x20\x67\x75\x69\x64\x65\x74\x6f\x6c\x65\x72\x61\
+\x6e\x63\x65\x3d\x22\x31\x30\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\
+\x6b\x73\x63\x61\x70\x65\x3a\x70\x61\x67\x65\x6f\x70\x61\x63\x69\
+\x74\x79\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\
+\x63\x61\x70\x65\x3a\x70\x61\x67\x65\x73\x68\x61\x64\x6f\x77\x3d\
+\x22\x32\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\
+\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x77\x69\x64\x74\x68\x3d\x22\
+\x39\x38\x39\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x36\x38\x39\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\
+\x6e\x61\x6d\x65\x64\x76\x69\x65\x77\x31\x30\x22\x0a\x20\x20\x20\
+\x20\x20\x73\x68\x6f\x77\x67\x72\x69\x64\x3d\x22\x66\x61\x6c\x73\
+\x65\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x7a\x6f\x6f\x6d\x3d\x22\x33\x2e\x37\x37\x36\x22\x0a\x20\x20\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x78\x3d\x22\
+\x35\x31\x2e\x39\x39\x39\x33\x33\x32\x22\x0a\x20\x20\x20\x20\x20\
+\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x79\x3d\x22\x36\x30\x2e\
+\x34\x39\x35\x31\x33\x35\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x78\x3d\x22\
+\x30\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x79\x3d\x22\x30\x22\x0a\x20\x20\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\
+\x6f\x77\x2d\x6d\x61\x78\x69\x6d\x69\x7a\x65\x64\x3d\x22\x30\x22\
+\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\
+\x75\x72\x72\x65\x6e\x74\x2d\x6c\x61\x79\x65\x72\x3d\x22\x73\x76\
+\x67\x38\x22\x20\x2f\x3e\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\x20\
+\x20\x64\x3d\x22\x4d\x20\x31\x32\x30\x2c\x31\x31\x35\x2e\x37\x30\
+\x32\x39\x37\x20\x43\x20\x31\x32\x30\x2c\x31\x31\x38\x2e\x30\x35\
+\x39\x34\x31\x20\x31\x31\x37\x2e\x37\x34\x37\x31\x33\x2c\x31\x32\
+\x30\x20\x31\x31\x35\x2e\x30\x31\x31\x35\x2c\x31\x32\x30\x20\x48\
+\x20\x31\x32\x2e\x39\x38\x38\x35\x30\x36\x20\x43\x20\x31\x30\x2e\
+\x32\x35\x32\x38\x37\x33\x2c\x31\x32\x30\x20\x38\x2c\x31\x31\x38\
+\x2e\x30\x35\x39\x34\x31\x20\x38\x2c\x31\x31\x35\x2e\x37\x30\x32\
+\x39\x37\x20\x63\x20\x30\x2c\x2d\x32\x2e\x33\x35\x36\x34\x33\x20\
+\x32\x2e\x32\x35\x32\x38\x37\x33\x2c\x2d\x34\x2e\x32\x39\x37\x30\
+\x33\x20\x34\x2e\x39\x38\x38\x35\x30\x36\x2c\x2d\x34\x2e\x32\x39\
+\x37\x30\x33\x20\x48\x20\x31\x31\x35\x2e\x30\x31\x31\x35\x20\x63\
+\x20\x32\x2e\x37\x33\x35\x36\x33\x2c\x2d\x30\x2e\x31\x33\x38\x36\
+\x31\x20\x34\x2e\x39\x38\x38\x35\x2c\x31\x2e\x38\x30\x31\x39\x38\
+\x20\x34\x2e\x39\x38\x38\x35\x2c\x34\x2e\x32\x39\x37\x30\x33\x20\
+\x7a\x20\x4d\x20\x36\x34\x2c\x38\x20\x63\x20\x2d\x32\x2e\x37\x33\
+\x35\x36\x33\x32\x2c\x30\x20\x2d\x34\x2e\x39\x38\x38\x35\x30\x36\
+\x2c\x31\x2e\x39\x34\x30\x35\x39\x33\x38\x20\x2d\x34\x2e\x39\x38\
+\x38\x35\x30\x36\x2c\x34\x2e\x32\x39\x37\x30\x33\x20\x56\x20\x38\
+\x32\x2e\x30\x31\x39\x38\x30\x32\x20\x4c\x20\x33\x39\x2e\x33\x37\
+\x39\x33\x31\x2c\x36\x35\x2e\x32\x34\x37\x35\x32\x35\x20\x63\x20\
+\x2d\x31\x2e\x39\x33\x31\x30\x33\x34\x2c\x2d\x31\x2e\x36\x36\x33\
+\x33\x36\x36\x20\x2d\x35\x2e\x31\x34\x39\x34\x32\x34\x2c\x2d\x31\
+\x2e\x36\x36\x33\x33\x36\x36\x20\x2d\x37\x2e\x30\x38\x30\x34\x36\
+\x2c\x30\x20\x2d\x31\x2e\x39\x33\x31\x30\x33\x33\x2c\x31\x2e\x36\
+\x36\x33\x33\x36\x36\x20\x2d\x31\x2e\x39\x33\x31\x30\x33\x33\x2c\
+\x34\x2e\x34\x33\x35\x36\x34\x34\x20\x30\x2c\x36\x2e\x30\x39\x39\
+\x30\x31\x20\x6c\x20\x32\x38\x2e\x31\x36\x30\x39\x32\x2c\x32\x34\
+\x2e\x32\x35\x37\x34\x32\x33\x20\x63\x20\x30\x2e\x39\x36\x35\x35\
+\x31\x38\x2c\x30\x2e\x38\x33\x31\x36\x39\x20\x32\x2e\x32\x35\x32\
+\x38\x37\x32\x2c\x31\x2e\x32\x34\x37\x35\x32\x34\x20\x33\x2e\x35\
+\x34\x30\x32\x33\x2c\x31\x2e\x32\x34\x37\x35\x32\x34\x20\x31\x2e\
+\x32\x38\x37\x33\x35\x38\x2c\x30\x20\x32\x2e\x35\x37\x34\x37\x31\
+\x32\x2c\x2d\x30\x2e\x34\x31\x35\x38\x33\x34\x20\x33\x2e\x35\x34\
+\x30\x32\x33\x2c\x2d\x31\x2e\x32\x34\x37\x35\x32\x34\x20\x4c\x20\
+\x39\x35\x2e\x37\x30\x31\x31\x35\x2c\x37\x31\x2e\x33\x34\x36\x35\
+\x33\x35\x20\x63\x20\x31\x2e\x39\x33\x31\x30\x33\x2c\x2d\x31\x2e\
+\x36\x36\x33\x33\x36\x36\x20\x31\x2e\x39\x33\x31\x30\x33\x2c\x2d\
+\x34\x2e\x34\x33\x35\x36\x34\x34\x20\x30\x2c\x2d\x36\x2e\x30\x39\
+\x39\x30\x31\x20\x2d\x31\x2e\x39\x33\x31\x30\x33\x36\x2c\x2d\x31\
+\x2e\x36\x36\x33\x33\x36\x36\x20\x2d\x35\x2e\x31\x34\x39\x34\x32\
+\x36\x2c\x2d\x31\x2e\x36\x36\x33\x33\x36\x36\x20\x2d\x37\x2e\x30\
+\x38\x30\x34\x36\x2c\x30\x20\x4c\x20\x36\x38\x2e\x39\x38\x38\x35\
+\x30\x36\x2c\x38\x32\x2e\x31\x35\x38\x34\x31\x36\x20\x56\x20\x31\
+\x32\x2e\x32\x39\x37\x30\x33\x20\x43\x20\x36\x38\x2e\x39\x38\x38\
+\x35\x30\x36\x2c\x39\x2e\x39\x34\x30\x35\x39\x33\x38\x20\x36\x36\
+\x2e\x37\x33\x35\x36\x33\x32\x2c\x38\x20\x36\x34\x2c\x38\x20\x5a\
+\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x32\
+\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\
+\x63\x6f\x6e\x6e\x65\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\x61\x74\
+\x75\x72\x65\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x73\x74\x79\
+\x6c\x65\x3d\x22\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\
+\x3a\x31\x2e\x34\x39\x33\x35\x30\x38\x35\x38\x22\x0a\x20\x20\x20\
+\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x6c\x61\x62\x65\x6c\
+\x3d\x22\x70\x61\x74\x68\x32\x22\x20\x2f\x3e\x3c\x2f\x73\x76\x67\
+\x3e\
+\x00\x00\x09\x1f\
+\x00\
+\x00\x20\xfb\x78\x9c\xdd\x58\x59\x73\xdb\x38\x12\x7e\x9f\x5f\x81\
+\x52\x5e\xe2\x5a\x8a\xc2\x49\x00\xf2\x31\x35\x9b\xa9\x99\xda\xad\
+\xec\x51\x93\xc9\xee\x33\x4d\xd1\x32\xc7\x94\xe8\x25\xe9\x2b\xbf\
+\x7e\xbf\x06\x25\x93\xb4\x64\x3b\x4e\x9c\x79\x88\x5c\x65\x12\x8d\
+\x46\x9f\x1f\x1a\x0d\x1e\xfd\x78\xbb\x2a\xd9\x75\x5e\x37\x45\xb5\
+\x3e\x9e\x88\x98\x4f\x58\xbe\xce\xaa\x45\xb1\x5e\x1e\x4f\x3e\xfe\
+\xfe\xcb\xd4\x4d\x58\xd3\xa6\xeb\x45\x5a\x56\xeb\xfc\x78\xb2\xae\
+\x26\x3f\x9e\xfc\x70\xd4\x5c\x2f\x7f\x60\x8c\x61\xf1\xba\x99\x2f\
+\xb2\xe3\xc9\x79\xdb\x5e\xce\x67\xb3\xcb\xab\xba\x8c\xab\x7a\x39\
+\x5b\x64\xb3\xbc\xcc\x57\xf9\xba\x6d\x66\x22\x16\xb3\x49\xcf\x9e\
+\xf5\xec\x59\x9d\xa7\x6d\x71\x9d\x67\xd5\x6a\x55\xad\x9b\xb0\x72\
+\xdd\xbc\x19\x30\xd7\x8b\xb3\x7b\xee\x9b\x9b\x9b\xf8\x46\x05\x26\
+\xe1\xbd\x9f\x71\x39\x93\x72\x0a\x8e\x69\x73\xb7\x6e\xd3\xdb\xe9\
+\x78\x29\x6c\xdc\xb7\x54\x72\xce\x67\x98\xeb\x39\x3f\x8f\x6b\x7e\
+\x5b\x16\xeb\x8b\x47\x8d\x09\xb3\x81\xfb\xa6\x58\xb4\xe7\xc7\x13\
+\x69\x92\x30\x3c\xcf\x8b\xe5\x79\xdb\x8f\x8b\xc5\xf1\x04\x82\xad\
+\x33\x3a\x8c\x47\xc1\x3f\x01\xe5\x68\x91\x9f\x35\x34\xd3\xf1\xd2\
+\x08\xcc\x49\x98\xc3\x2c\xf4\xe4\x69\xfd\x6b\x9d\x2e\x0a\x44\xb7\
+\xe3\xeb\x38\xc7\x33\xd2\x7a\xbf\x59\x83\x55\x4d\x5b\x5d\x6e\x79\
+\x37\x36\x80\x02\x1e\x33\xe9\xc9\xd5\xd9\x59\x93\xc3\x54\x3e\xa0\
+\x35\xed\x5d\x99\x77\xdc\xd3\xac\x2a\xab\x7a\xfe\x86\x87\xdf\x61\
+\x20\x55\x97\x69\x56\xb4\x77\x73\x31\x61\xb3\xe7\x95\xd9\x3d\xca\
+\xc4\xd3\xca\xf4\x82\xfe\x1e\x53\x76\x34\x1b\x3b\xfd\xc2\x18\x59\
+\x63\xed\x63\x31\xfa\x4c\xc7\x79\xac\x84\xb2\xd2\x98\xc3\x67\x02\
+\xb9\x0d\x03\x74\xfa\xc7\x83\xb5\x47\xeb\x59\xf8\x3d\x8c\xc0\xd3\
+\x81\xec\x95\xb9\x57\x0b\x96\x11\xc9\xa3\xc1\xda\xea\x03\x8f\x7f\
+\x39\xa0\x6c\xb2\xb0\xc2\x3e\xf0\xf0\xf0\x79\x44\x19\x61\x9f\x0b\
+\xc4\x1e\x6d\x86\xfb\x9c\x3f\xae\xed\xab\xa3\xe4\xf4\xf3\x51\x72\
+\xc9\x8b\xa3\x74\x73\x5e\xb4\xf9\x97\xc4\xc8\xb9\x17\xc7\x68\x8f\
+\x2e\xfe\x8a\x11\xb2\xf2\xf9\x08\x59\xfd\xe7\x45\xc8\xee\xcb\xc6\
+\x9f\x16\xa1\x70\x72\xcc\xcf\xeb\x1c\x27\xdd\x9b\x3d\xf5\xe9\xf1\
+\x48\x3a\x25\xfa\xe9\xe5\x86\xf8\x71\x5d\xb4\x38\xd2\xae\x9a\xbc\
+\xfe\x00\xcb\xf2\x7f\xad\x3f\x36\xf9\x3d\xd7\xad\x80\x67\x26\xe6\
+\x42\x58\xab\xee\xa9\x77\x44\xe5\xb1\x73\x2a\x71\x3d\xf5\x56\x82\
+\x9a\xc4\x89\xb1\x86\xf7\xc7\xc4\x1d\x51\x6d\xcc\xa5\xd6\x83\x42\
+\x76\x44\xda\xd3\xf2\x05\xbe\x85\x72\x32\xf4\x6d\x2c\x01\xbe\xf9\
+\x17\xfa\x96\xdd\x06\xdf\x1c\x0c\xe6\x3d\xe6\xb3\x3b\x9c\xbd\x3c\
+\xd6\x82\x6f\x4f\x5c\xfa\x9d\xed\xe5\x3d\xdb\xcb\x5b\x1f\x4f\x6c\
+\x6c\x9c\x4f\x84\xd2\x5f\xe5\xb0\xd3\x4f\x3a\x2c\xc5\x0b\x1d\xde\
+\x72\xfd\x5e\xa7\xeb\xe6\xac\xaa\x57\xc7\x93\x55\xda\xd6\xc5\xed\
+\xdb\xa9\x8e\xd1\xc1\x48\x25\x4c\xc4\x63\xe3\x8d\xd2\x5c\xe1\x4d\
+\x7a\xe3\xb4\x96\x91\x8c\xb9\x77\x5e\xb9\x24\x9a\x4a\xab\xe3\xc4\
+\x39\x27\xa3\xa9\x70\xb1\x55\xd2\x4b\x77\x30\x0e\xa9\x8e\xb9\x49\
+\x9c\x19\x45\x54\x88\x58\x21\x48\xc6\x8d\x23\xfa\x90\xf5\x6c\x2f\
+\x2b\x02\x6a\x62\x9f\x38\x6b\xfa\x70\xbe\x78\x6f\x84\x32\xf2\xd4\
+\xde\x90\xea\x0b\xf6\x86\x8b\x3d\x36\x95\x1c\x64\x8a\xf6\x06\xe2\
+\x25\xac\xa3\xf4\x8f\xf6\x86\x8a\xb5\xc1\x9e\xf1\xa3\xbd\x21\x93\
+\x58\x23\xee\xce\x3e\xe7\xdb\xe7\x19\x45\x22\x11\x55\xa4\x45\x0d\
+\x22\x48\xea\x0d\x36\xac\x35\x49\xe2\x46\xa6\xfa\x04\xf9\xf6\x5c\
+\x8d\xbc\x32\x22\x96\x08\xb7\x7e\x2a\x60\xd2\x0d\x36\xf9\x13\x71\
+\x0f\x7d\x65\xe7\xda\xd1\x8c\x9a\xd3\xf0\xb6\xca\xdb\x74\x91\xb6\
+\x69\xdf\xb7\x6e\x29\xe8\x5d\xb7\x7d\xe8\x11\x7a\xf5\xf9\x6f\x3f\
+\xff\x72\x5f\x90\xb3\x6c\xfe\xdf\xaa\xbe\xe8\x0b\x2d\x31\xa4\xa7\
+\xd5\x15\xea\xef\xfd\x11\x41\x1d\x71\x36\x27\x78\xa7\xed\x49\xb1\
+\x4a\x97\x39\x35\xe6\x7f\x41\x53\x0e\xfd\xf7\x13\x23\xe6\xf6\xee\
+\x32\xef\x85\x76\x62\xeb\xbc\xa9\xae\xea\x2c\xdf\x7b\x57\x59\x64\
+\xab\x82\x16\xcd\x3e\xb4\x45\x59\xfe\x8d\x94\x0c\x0e\x8e\x4e\x68\
+\xb8\xac\x54\xf5\xc9\x40\x30\x39\xf0\xd3\xf2\xbe\xc0\x8f\x4c\x28\
+\xda\x32\x3f\x79\x9f\x5e\x56\xec\x5d\x5a\xa6\x2b\x5c\xa1\xea\xbc\
+\x08\x16\x77\x53\x43\x31\xb3\x5d\x39\x81\x73\x47\x25\x49\xee\xdc\
+\x18\x59\x87\xe5\x65\x91\xe5\xeb\xe6\x79\xaf\xf7\x5d\xb9\x36\x6b\
+\x9b\xd9\xaf\xff\x7e\x3f\x03\xd6\x67\x3b\xbe\x77\x26\xef\xb3\x3e\
+\x58\x74\x75\xfa\x47\x9e\x8d\x82\x10\x52\xfd\xd7\x74\xf9\x20\x30\
+\x44\x2d\x8b\x93\x1a\xea\xeb\xc5\xd1\x6c\x33\xdc\xcb\xb3\xca\x51\
+\x1d\xf7\xb1\x74\xb4\x91\xec\x60\xd8\x8e\x15\x21\x69\xd5\x1a\x05\
+\xf1\xf4\xea\xa5\x89\xfb\x7b\x7a\x71\x75\xca\x3e\xb4\x39\xb0\x5f\
+\xbf\x34\x6b\xbb\x3a\x03\x2f\x41\x7d\x08\xfd\xf7\x0f\x53\x36\x40\
+\xff\x8b\xb2\x35\x46\xc2\x65\x5e\x03\xcc\xcd\xb3\x48\xb8\xc9\x4f\
+\xe3\x2d\x31\x08\xce\xb2\xd9\x6f\xf9\x65\x5d\x2d\xae\xb2\x16\x37\
+\xd2\xc9\x43\x88\x7d\x8d\xe0\x9f\x8b\xa6\x8b\xc9\x3e\xc1\x75\xfe\
+\xbf\xab\x02\x2b\xbe\x48\xf2\x3f\xab\x16\x01\x79\x5d\x63\xf3\xba\
+\xb8\x0e\x71\xa7\x94\x35\xaf\x6b\xef\x87\xf3\xb4\xce\x7f\x2a\x8b\
+\x8b\x5d\x9b\xbf\x4e\x6e\x18\xbd\xab\x16\x43\xb9\x01\x77\x1b\x9c\
+\x6d\x5b\xd3\x41\x11\x3e\x9a\x6d\xab\x74\x18\x2d\xfb\xea\x5d\xa6\
+\x77\x79\xbd\xed\x47\xda\xbe\xbf\x08\xaf\x65\xda\xe6\x6f\x05\x57\
+\xb1\xf7\x5e\x24\x51\xf7\x86\xdb\xfd\xc1\xb6\xce\x2f\x87\xc7\xcc\
+\x12\x77\xbb\xbe\x71\x6f\x77\x7a\x15\x17\x1b\x95\xa0\x1f\x91\x11\
+\xc7\x1f\x8d\xb4\x76\x36\x89\x70\x20\x25\xb1\x4d\xd0\xc2\xa0\x33\
+\xc1\x59\xa7\xa5\xf7\x07\xfd\xc5\x21\x2b\xea\xac\x1c\x6c\x9e\x4d\
+\x8f\x3e\xbe\xaa\x2f\x8a\xe6\x12\xae\xcc\x8b\x35\x1d\x62\x87\xd5\
+\x75\x5e\x9f\x95\xd5\xcd\xfc\xba\x68\x8a\xd3\x32\x3f\x0c\xcf\xa2\
+\xa4\xf6\x7d\x4b\xea\x2f\xf6\xfa\xf0\x0c\x87\xc1\x1c\xc7\xc4\xdb\
+\x37\xbb\x8d\xf7\x41\x98\x1d\xdc\x34\xc2\xb0\xbe\x2a\xf3\xf9\xba\
+\x5a\x7f\xca\xeb\x0a\xd7\x83\xba\xba\x08\xc3\x7c\xf3\x3e\x0d\x1f\
+\x87\x20\xdb\x48\xcb\xa5\x35\x66\x4b\x27\xf9\x59\x7a\x39\xc7\x0e\
+\x69\x87\xb4\x3f\xaa\x62\x3d\x07\x90\xf3\x7a\x4b\x0d\x83\xb2\xc0\
+\x63\xae\xb7\xb4\x45\xda\x00\x55\x35\x1c\x1d\xea\x22\x6a\x77\x9b\
+\x99\xf3\x2d\xad\x37\x77\x95\xd6\x17\x79\xdd\x2d\xe8\xde\xa7\x4d\
+\x9b\xd6\xed\x88\xb2\x2a\x16\xa3\x71\xbe\xee\xc6\x0f\x3e\x35\x5c\
+\xa6\xed\xb9\x4d\xfc\xf0\xca\xb4\x9b\x67\x19\x0b\x6e\x75\x02\xc0\
+\x50\x9e\xc3\x08\xad\x81\x8a\xa6\xca\x78\xb4\x4c\xc6\x08\x24\x9a\
+\xc7\x9c\x27\xd6\x25\x07\x03\x51\xfb\xfb\xfa\x4d\x1f\x9a\xc4\x68\
+\xcb\xe4\x48\x75\xe8\xd7\x85\x30\x32\x91\xc3\xad\xb0\x1c\xdb\xbc\
+\x44\xef\xa4\x47\xa5\xf3\x01\xa0\x5e\x0f\x52\x3d\x8c\x76\xef\x38\
+\x9f\x0f\xa3\x37\x4a\x25\x9a\xcb\xef\x17\x49\x03\x2c\xf9\xc4\x8d\
+\x26\x76\xd1\x24\x62\xe7\xad\x34\x36\x80\x29\x0c\x42\xa5\x50\x06\
+\x80\xe0\x5c\xe3\x66\x83\x9b\xab\xd0\x89\x56\xea\x60\x24\xea\x31\
+\x34\x3d\x8e\xa7\xc7\x10\x05\xcc\x90\xb1\xdf\x02\x31\x7d\x11\x42\
+\xca\xb5\xf6\xda\x3f\x01\x22\x29\xbe\xa6\x16\x09\xdc\x05\x35\xdd\
+\xf1\xf5\xf7\x80\x20\xba\x78\xb0\xa9\x92\xb8\xd4\x0a\xe5\x23\xba\
+\xa2\x39\xc3\xb9\x62\x19\x9b\x9a\x98\x27\x89\x42\x95\xe1\x38\x56\
+\x38\xb7\x96\x4d\x3d\xae\x7b\x5a\x5a\x54\x23\x45\x97\x3e\xc3\xa6\
+\x74\x5b\x75\x89\x88\x6c\x4c\x1f\xc7\x85\x62\x22\x16\xce\x59\x11\
+\x29\x3c\xb9\xf2\x0c\x67\x1d\x77\x42\x44\x26\xb6\xdc\x7b\xc5\x6c\
+\xac\x93\xc4\xda\x08\xd7\x3e\x6b\xa5\x66\x06\xb7\x6c\x6d\xa0\x3a\
+\x16\x5a\x24\x5c\x32\xd4\x34\xc3\x05\x81\x13\xcd\x1a\x76\xaa\x86\
+\x4c\xba\x50\x1a\x0e\x12\x60\xa5\x95\xf3\xa4\x98\xf4\x24\x1e\x10\
+\x26\x45\x1a\x9a\xa7\x9d\x2a\xdc\xcc\x3b\x5d\x46\xb2\x69\xa7\xcd\
+\x10\xba\x49\x1d\xec\x81\x37\x52\x58\x72\x0a\xa8\xb7\x8e\xc6\x5a\
+\x48\xed\x88\x82\x93\x59\xd0\x2a\xc0\x48\x62\x87\x04\x12\x76\x88\
+\xf0\xec\xd3\x23\xfb\x0e\x27\xf5\xb8\x2b\xd9\x29\x8a\xfb\xb6\xa2\
+\x35\x5e\x20\xe6\x9b\xbd\x68\x8d\xe3\x5e\x92\x27\x26\x78\xe0\xf1\
+\xaa\x63\xe8\x95\x08\xe4\xc1\x63\x8a\xe5\xe4\xdb\x6e\x24\x43\xdb\
+\x08\x61\xed\x36\x52\x00\xd2\xe7\x6e\x9a\xbd\x1d\x80\x54\x07\x3b\
+\xa5\x38\x71\xc0\x97\xf4\xdf\xc3\x46\x7a\xbd\x32\x79\x34\x5b\x6e\
+\x5b\xcf\x65\xd7\x74\x2e\x87\xdd\xe6\x26\xd3\x7b\x72\xb1\x2f\xee\
+\xf4\x95\xe2\x60\xb7\x2d\xbd\x47\x62\x62\x24\x0e\x85\xed\xa9\xb0\
+\x1d\x69\x89\xae\x92\x3b\xee\x22\x6d\x60\xb8\x97\xf6\xbe\xc1\x08\
+\xad\x00\xc6\xf7\xdf\x28\x86\x25\xfd\xcb\x6d\xeb\xa1\x0d\xd9\xfd\
+\x77\x15\xd0\xfe\xc1\x70\x44\xc9\x28\x81\x49\xec\x5d\xf7\x6e\x04\
+\x33\xd8\xb5\x91\x46\xd5\x62\xf8\xe7\x22\xe5\x62\xc5\x34\x10\x15\
+\x29\x05\x3e\x95\xc4\x0a\xfd\x70\x8c\xea\xa3\xe9\x0d\x7b\x8c\x95\
+\xa8\x34\x0e\x55\x48\xa0\xb4\xf1\xd8\x47\xe8\x90\x99\x84\xcf\x12\
+\x15\x4a\x84\x27\x2a\x59\xc4\x99\x8c\x13\xda\xf7\x10\x42\x2f\x88\
+\x09\xe8\xa8\x04\x34\x8d\xb1\x09\xf5\x82\xca\x89\x65\xef\x99\xf4\
+\x41\xa4\x84\x61\xa4\x2d\xd2\xb1\x66\xd2\x82\x86\x07\x38\xba\x87\
+\xee\x1e\x92\x1e\x26\x30\x09\x86\x7a\x6b\xf0\xa2\x98\x54\x50\x4a\
+\x12\x24\xfc\xa3\x9a\x08\xa9\x82\x5e\x51\x19\x33\x2a\x72\x8a\x6a\
+\x2d\x29\x35\x81\x0d\x27\x37\xb8\x0c\x3c\x40\xce\xc0\x2d\x62\xfa\
+\x62\x99\xc0\x6a\x15\x9e\x64\x2b\x67\x24\x14\x4b\x3c\x83\x2e\x2a\
+\xa3\x1a\xde\x2b\xf2\x82\x96\x66\x8c\xe4\xa3\xca\x5a\x86\xa8\x45\
+\x02\x10\x64\xa8\xfb\x32\x22\x13\x18\xa9\x31\xcc\x47\xa8\xf4\xf8\
+\x8f\x49\xc7\xae\xe1\x27\x05\x0d\x96\x90\x22\x01\xc3\x1d\xa3\xa8\
+\xd3\x93\xc2\xc5\xc3\x08\x7a\x44\xf7\x42\xf4\x4f\xfd\xe7\xbc\x6f\
+\x80\x10\x3b\x46\x88\x87\xeb\x91\x32\x30\xcf\xba\x48\x78\xc4\x29\
+\xa3\x90\x79\xca\x9f\x60\x30\x8c\xbe\xd6\xc2\xa8\xe9\x26\xa7\x9e\
+\x22\x8b\xf2\x4b\x53\x8e\xbe\xf8\xd2\x8c\xa5\x0d\x80\xf0\x03\x62\
+\x3e\x52\x04\xad\x90\x00\x1c\x76\xf4\x40\x5c\x18\x65\x9e\x12\x4f\
+\xb0\xb1\x88\x14\xa8\x8c\xd2\x4c\x90\x08\xf8\x0a\xe7\x8c\xea\xd6\
+\xe9\x88\xec\x98\x12\xe8\x04\x09\xa3\x5e\xdd\x90\x71\x8e\x91\xb5\
+\x94\x14\x11\xe0\x28\x22\xc7\xfe\xc3\x12\x87\x65\xa4\x26\x84\x91\
+\xd2\x31\x25\xa0\x18\x7a\x21\x99\xef\x98\x0d\x18\x00\x82\x18\xed\
+\x50\x07\x0b\x2c\x61\x4e\x25\x50\x4d\x79\x36\xb1\xde\x40\x9b\xc0\
+\x4c\x80\x20\x47\x15\xe9\xc7\x53\x10\xb4\xc9\x52\x60\x2e\x04\x26\
+\x64\x92\xfc\x0b\x70\x98\x92\x89\x21\x62\xe4\xe0\xa7\xfb\x0f\x96\
+\x28\x3d\x47\xf4\xf9\xf0\xe4\x87\xff\x03\x2e\x13\xf8\xea\
+\x00\x00\x06\xf0\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x50\x00\x00\x00\x50\x08\x03\x00\x00\x00\xb9\xcf\x02\x9f\
+\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\
+\x01\x00\x9a\x9c\x18\x00\x00\x02\x1c\x50\x4c\x54\x45\x23\x1f\x20\
+\x23\x1f\x21\x23\x20\x20\x23\x20\x21\x24\x20\x21\x25\x21\x22\x26\
+\x22\x23\x27\x23\x24\x27\x24\x24\x28\x24\x25\x29\x25\x26\x2a\x26\
+\x27\x2c\x29\x2a\x2d\x2a\x2a\x2e\x2a\x2b\x33\x2f\x30\x33\x30\x30\
+\x33\x31\x31\x33\x37\x45\x34\x31\x31\x37\x33\x34\x37\x34\x34\x39\
+\x36\x36\x3a\x37\x38\x3d\x39\x3a\x3d\x3a\x3a\x3e\x3a\x3b\x3f\x3c\
+\x3c\x40\x3d\x3e\x41\x3f\x3f\x42\x3f\x3f\x43\x40\x40\x44\x40\x41\
+\x47\x44\x45\x48\x45\x46\x4a\x47\x47\x4b\x48\x48\x4c\x48\x49\x4d\
+\x4a\x4b\x4e\x4b\x4c\x4e\x4c\x4c\x51\x4e\x4e\x52\x4f\x50\x52\x4f\
+\x51\x57\x54\x54\x58\x55\x55\x59\x56\x57\x5c\x59\x5a\x5e\x5b\x5c\
+\x5f\x5d\x5d\x5f\x5d\x5e\x60\x5e\x5e\x66\x64\x64\x69\x66\x67\x69\
+\x67\x67\x69\x67\x68\x6b\x69\x69\x6e\x6b\x6c\x6f\x6c\x6d\x70\x6d\
+\x6e\x73\x71\x71\x74\x72\x72\x76\x73\x74\x78\x75\x76\x7b\x79\x79\
+\x7e\x7b\x7c\x82\x80\x80\x86\x84\x85\x87\x85\x85\x89\x87\x87\x8b\
+\x88\x89\x8c\x8b\x8b\x90\x8e\x8e\x91\x90\x91\x93\x91\x92\x94\x92\
+\x93\x9a\x98\x99\x9c\x9a\x9a\x9d\x9b\x9b\x9e\x9c\x9c\x9e\x9d\x9d\
+\x9f\x9d\x9e\xa4\xa3\xa3\xa8\xa6\xa7\xa9\xa7\xa8\xac\xab\xab\xae\
+\xad\xad\xb0\xaf\xaf\xb2\xb1\xb1\xb3\xb2\xb2\xb4\xb3\xb3\xb7\xb6\
+\xb6\xba\xb9\xb9\xbc\xba\xbb\xbd\xbc\xbd\xc1\xc0\xc1\xc2\xc1\xc1\
+\xc3\xc2\xc3\xc4\xc3\xc4\xc6\xc5\xc5\xc8\xc7\xc7\xca\xc9\xc9\xd0\
+\xcf\xcf\xd1\xd0\xd1\xd6\xd6\xd6\xd9\xd8\xd9\xda\xd9\xd9\xdd\xdc\
+\xdc\xde\xde\xde\xdf\xde\xdf\xe0\xdf\xe0\xe4\xe4\xe4\xe7\xe6\xe7\
+\xe7\xe7\xe7\xec\xec\xec\xed\xed\xed\xee\xed\xee\xee\xee\xee\xef\
+\xee\xee\xef\xef\xef\xf0\xf0\xf0\xf3\xf3\xf3\xf5\xf4\xf5\xf6\xf5\
+\xf5\xf6\xf6\xf6\xf6\xf6\xf7\xf7\xf7\xf7\xf7\xf7\xf8\xf7\xf8\xf8\
+\xf8\xf8\xf8\xf8\xf8\xf9\xf8\xf9\xf9\xf9\xf6\xf6\xf9\xf7\xf7\xf9\
+\xf8\xf8\xf9\xf9\xf9\xf9\xfa\xfa\xfa\xbb\xbb\xfa\xbc\xbc\xfa\xbd\
+\xbd\xfa\xd3\xd3\xfa\xd4\xd4\xfa\xd5\xd5\xfa\xd9\xd9\xfa\xda\xda\
+\xfa\xfa\xfa\xfb\x99\x99\xfb\x9a\x9a\xfb\x9b\x9b\xfb\xb5\xb5\xfb\
+\xb7\xb7\xfb\xb9\xb9\xfb\xfb\xfb\xfb\xfb\xfc\xfb\xfc\xfc\xfc\x72\
+\x72\xfc\x73\x73\xfc\x96\x96\xfc\xfc\xfc\xfd\xe5\xe5\xfd\xfd\xfd\
+\xfe\x16\x16\xfe\x23\x23\xfe\x24\x24\xfe\x25\x25\xfe\x34\x34\xfe\
+\x35\x35\xfe\x39\x39\xfe\x3a\x3a\xfe\x3c\x3c\xfe\x3d\x3d\xfe\xfe\
+\xfe\xff\x00\x00\xff\x06\x06\xff\x07\x07\xff\x0c\x0c\xff\x0d\x0d\
+\xff\x14\x14\xff\x15\x15\xff\xff\xff\x04\xcc\xe9\xb6\x00\x00\x00\
+\x01\x62\x4b\x47\x44\x12\x7b\xbc\x6c\x00\x00\x00\x04\x6d\x49\x44\
+\x41\x54\x58\xc3\xed\x98\x77\x5b\xd4\x40\x10\xc6\xd7\xb1\x60\xbf\
+\xf3\x51\x11\x3b\x2a\x76\xc5\xde\x7b\xef\xbd\xf7\xde\x7b\xef\xa8\
+\xe8\x5d\x14\x1b\x07\x96\xa8\x18\x83\x05\xcb\xde\xd9\xf2\x05\xdd\
+\x9a\x4b\xd9\x9c\x04\xf6\x4f\xe7\x81\x83\x4b\xb8\x1f\x33\xbb\x33\
+\xef\xcc\x06\x39\x9a\x0d\xfd\x07\xea\x02\x9e\xdf\xb6\x68\x74\x8f\
+\x44\x72\xc0\xec\xad\x37\xf5\x00\x4b\x01\x11\xa3\x2f\x65\xfb\xb4\
+\x00\x3b\x03\x81\xd1\x6f\x04\xed\x76\xeb\x00\x26\x01\xa4\x8f\xd0\
+\xfd\x82\x0e\x20\x42\x9c\x47\xb9\x1b\x35\x00\x13\x48\x10\xa9\x9f\
+\xd3\x34\x01\x69\xd4\x2c\xf2\x81\x96\x0e\x20\xc8\x80\x01\x95\xdc\
+\x68\x3e\xb0\x1d\x4b\x19\x60\x58\xe8\xa9\x01\xb8\x79\xe9\x20\xe4\
+\x9a\x0e\x0f\x1d\xe7\xee\x72\xb9\xd1\x9a\x80\x8e\x33\x5c\x2e\xa3\
+\x2e\xe0\x54\xba\xcb\x3a\x81\x93\x64\xb1\x68\x03\x8a\xbc\xd6\x08\
+\xe4\x3c\x9d\x1e\xf2\x90\x7b\xea\xf3\x90\x97\x9f\x56\x0f\x01\x74\
+\x86\xdc\x82\x8b\x83\x2e\xe0\x64\x5e\xcb\xfa\x80\x53\x90\xd0\x30\
+\x9d\x6b\xc8\xf4\x4b\x2b\x30\x32\xe4\xa3\x6b\xd6\x32\x5b\xb3\xa9\
+\xf1\x6b\x08\x42\x14\x55\xc0\xe3\xdd\xb8\xff\x80\xba\xc5\xd8\x14\
+\xde\xf5\x54\x21\x9f\xeb\x0f\xfc\x26\x42\xfd\xe2\xee\xb2\xaa\x52\
+\xae\x8f\x70\xc5\x32\x0e\x50\x94\x72\x18\x68\x4e\x10\x09\x00\x31\
+\x3d\x14\x1f\x0b\x85\x3c\x4f\xac\x1f\xcb\x81\x78\x21\x2b\x3d\x5c\
+\x21\xc3\x85\x78\x21\x4f\x02\x91\x36\x01\xe0\x06\x10\x53\x0f\xbf\
+\xdf\x23\x96\xc0\xb2\x8f\xf9\x81\x3b\x8b\xdc\x99\x02\x4a\x47\x8f\
+\x1a\x35\x2d\xbe\x1e\xfa\xd6\xf0\x48\x27\x51\xe1\x64\x05\x87\x5d\
+\x8c\xd9\x53\x14\xc0\xd3\x7d\x64\xfd\x20\x54\x7a\x26\xbe\xc0\x06\
+\x5b\xc0\xa5\x41\x6e\xfe\xa1\xae\xc7\x9a\xa4\xd8\xbe\x4a\xa9\x18\
+\x83\xdc\x8c\x6e\xbf\xbf\x89\xe2\xe0\x99\x6d\xec\xe9\x62\x33\xe8\
+\xff\xd9\xdc\x04\x81\x15\x33\x67\x89\x1c\xdc\xe7\xcb\x89\x91\xd8\
+\xe2\xe0\x27\x6f\x57\xbc\xc1\xc4\xec\xd7\x95\x0f\xfe\xa1\x87\xa8\
+\x97\xcd\x2f\xac\x13\xab\x47\x7d\x9c\xe5\xa7\x59\x15\x98\xfe\xc0\
+\xc2\x6c\x1c\xed\x21\xb1\x0e\xe5\x63\xa8\x95\x17\x21\x59\x72\x68\
+\xbc\xe1\xe3\xdd\x12\x28\xdb\x32\xcd\x8c\x41\xcd\x56\xeb\x21\xf2\
+\x16\x59\xfe\x0b\x06\x5f\xf6\xe2\x2a\x6d\x8c\x2d\xc3\x32\x7c\x96\
+\xc1\x11\x40\x00\x4f\xdd\x8a\x44\x2a\xf6\x25\xe0\x3d\x07\xdb\x26\
+\x31\x23\x60\x38\x62\x14\x11\xbb\xc0\x7d\x64\xbf\x77\x3c\xe4\xe5\
+\x61\xc2\xa3\x9f\x4f\x57\xd5\x7d\xad\xcf\xe5\xea\xbf\xd6\x55\xa5\
+\x3d\xc4\x70\x62\xe7\xa9\xe2\x6d\xeb\xed\x3e\x1e\xc6\xd4\xb7\xd4\
+\xf3\x4f\x59\xd7\x3e\xd6\xa6\x5c\x62\x50\xb1\xc1\xe3\x25\x5f\xc1\
+\x56\xeb\x14\xbc\xa7\x0d\x59\x9f\x35\x54\x53\xa0\x89\xc3\x1e\xb2\
+\x1c\x96\x4a\x4b\x81\x2d\xd1\x4a\x3f\x90\xc6\xfb\xe2\x57\x36\x60\
+\x7f\x1e\xd1\x8d\xb1\x83\x1e\xca\xa1\x18\x24\x90\x5a\x9b\xfd\x41\
+\x07\xab\x72\xd9\x90\xe5\x5e\xd1\xe4\xc1\x7e\xb5\x69\xe9\xdd\x5c\
+\x90\x48\x28\x3e\xe9\x77\xb0\xfa\x4f\x56\x61\xbf\x9e\x10\xa0\x15\
+\xea\xcb\xde\x8d\x76\xf3\x70\x84\xe9\x75\x30\xd5\x90\x55\x5a\x43\
+\xca\xb0\x30\x56\xf5\x14\xd1\x4d\xf3\x87\x3f\xb4\x50\xaa\x05\x05\
+\xd6\x66\x23\xac\xc6\x30\x2c\x33\x3c\xb4\x23\x94\x58\xc9\x86\x8e\
+\xd5\x7d\xc1\xed\x75\x3b\x38\x8f\xb8\x98\x49\x7f\x88\x02\x7e\x48\
+\x93\xf2\x09\x35\x29\xf2\xd2\x5b\x5c\x38\xd8\x46\x7a\x09\xc9\xe3\
+\xf4\xc2\x1d\xc2\xb4\xde\x67\x23\xed\xa1\x61\x9a\xe1\x9e\xe2\x51\
+\xec\x55\xf2\x88\x8a\xd0\x10\x7a\xcd\x70\xb0\x65\xbe\x8b\x06\xd6\
+\x91\x8d\xf6\x87\x0c\x81\xa3\xd9\x0c\xb7\x5e\xd0\x1c\xf2\x36\xe3\
+\x90\x25\xfc\x16\x0d\xfc\xee\x07\x4e\x91\x21\xe7\xdb\xe8\xb5\xa1\
+\xee\x31\x1f\x36\xb1\x35\xcc\x18\xf5\xd1\xc0\xfa\xa0\x87\x28\x34\
+\x63\x9f\xea\x22\x77\x1d\xb5\x3f\x4c\xb3\x26\x63\xfc\x88\x06\xe6\
+\xfc\xc0\xc9\x32\x97\xbd\x8d\x7e\x57\x2b\x37\x89\xfa\x5f\x89\x0b\
+\x54\xf5\x65\x67\x09\xb8\xa9\x39\xd5\xc6\xb1\x42\x96\xd3\x97\x1f\
+\x68\x94\xe7\x3b\xf3\x55\x0a\x2c\xb0\x29\xdf\xc2\x21\x2b\x66\x9b\
+\xb3\x25\xae\xf6\xec\xa5\x85\x52\x17\x23\x6d\xd4\x0f\x31\x0e\x14\
+\x89\xe9\x1a\x2d\xa3\xc0\x87\x85\x12\x3b\x94\x87\xca\x53\xc0\x7a\
+\x24\x64\x63\x24\x05\x16\x2c\x3d\xd5\x2e\x2b\x4e\x01\x73\x45\x09\
+\xb6\x65\x6a\x58\x53\x40\x1c\xc2\x9b\x02\xa0\x18\xda\xaf\x0f\x14\
+\xb2\xb3\x87\x02\xa3\xe4\xeb\xf3\x7d\xda\x05\x82\x03\x27\x28\xcf\
+\x29\x47\x3b\x71\xc9\x1d\x8b\x69\x37\x7e\xa6\x16\xd8\xc7\xac\x4f\
+\x85\x26\x58\xf2\xa2\x38\x80\x6f\x11\xd2\x7b\x82\x75\x50\x65\x0b\
+\x78\xc9\xda\xbd\x57\xb1\x27\x4a\x4d\x2d\x56\x9c\xa4\x16\xf0\x29\
+\x6c\x9c\xcd\xfa\xfb\x8b\x9f\x41\xde\xef\x47\xa2\x91\x7a\x80\x33\
+\x93\x89\x44\x22\x99\x48\x26\xcb\x14\x8f\x4d\xad\x89\xe4\x1e\xf9\
+\x83\x6d\x7c\x02\x79\xf2\x39\xb0\x7e\xcf\xd8\x65\x33\xfe\x43\x5d\
+\x6c\x5a\x6c\x3a\x4a\xd5\x7e\xf4\x34\xfa\x9a\x94\x3b\x3b\xc4\x7e\
+\x4a\x8c\x0d\x31\xd4\xa4\xab\xde\x7e\xa1\xa3\xc8\x97\xb7\x72\x14\
+\x09\x4e\x0e\x8d\xf6\x31\x34\x26\x19\xea\xd9\xa6\xd1\x44\xab\x00\
+\xaf\x49\x0f\xc6\xb1\xa5\x40\xda\xcd\x7a\xd2\x6e\x07\x89\x66\x73\
+\x1f\xdd\xf3\x11\x51\x0e\xaf\xb6\xe7\xce\x5f\xe3\x5e\xb8\xc2\xf7\
+\x21\x32\x85\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x15\x7b\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
+\x6e\x6f\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\
+\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\
+\x73\x74\x72\x61\x74\x6f\x72\x20\x32\x33\x2e\x30\x2e\x32\x2c\x20\
+\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\
+\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\
+\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\
+\x20\x2d\x2d\x3e\x0a\x0a\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x64\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\
+\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\
+\x6e\x74\x73\x2f\x31\x2e\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\
+\x6e\x73\x3a\x63\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x63\x72\
+\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\x6e\x73\x2e\x6f\x72\
+\x67\x2f\x6e\x73\x23\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
+\x72\x64\x66\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\
+\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x30\x32\x2f\x32\
+\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\x74\x61\x78\x2d\x6e\x73\x23\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x76\x67\x3d\x22\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\
+\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\
+\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x6f\x64\x69\x70\
+\x6f\x64\x69\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x73\x6f\x64\x69\
+\x70\x6f\x64\x69\x2e\x73\x6f\x75\x72\x63\x65\x66\x6f\x72\x67\x65\
+\x2e\x6e\x65\x74\x2f\x44\x54\x44\x2f\x73\x6f\x64\x69\x70\x6f\x64\
+\x69\x2d\x30\x2e\x64\x74\x64\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x69\x6e\x6b\x73\x63\x61\x70\x65\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\
+\x6f\x72\x67\x2f\x6e\x61\x6d\x65\x73\x70\x61\x63\x65\x73\x2f\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\x20\x76\x65\x72\x73\
+\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x0a\x20\x20\x20\x69\x64\x3d\
+\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x0a\x20\x20\x20\x78\x3d\x22\
+\x30\x70\x78\x22\x0a\x20\x20\x20\x79\x3d\x22\x30\x70\x78\x22\x0a\
+\x20\x20\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\
+\x31\x37\x36\x20\x31\x37\x36\x22\x0a\x20\x20\x20\x78\x6d\x6c\x3a\
+\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\
+\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x64\x6f\x63\
+\x6e\x61\x6d\x65\x3d\x22\x63\x61\x73\x68\x73\x68\x75\x66\x66\x6c\
+\x65\x5f\x6f\x66\x66\x2e\x73\x76\x67\x22\x0a\x20\x20\x20\x69\x6e\
+\x6b\x73\x63\x61\x70\x65\x3a\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\
+\x30\x2e\x39\x32\x2e\x34\x20\x28\x35\x64\x61\x36\x38\x39\x63\x33\
+\x31\x33\x2c\x20\x32\x30\x31\x39\x2d\x30\x31\x2d\x31\x34\x29\x22\
+\x0a\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\x31\x37\x36\x22\x0a\
+\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x37\x36\x22\x3e\
+\x3c\x6d\x65\x74\x61\x64\x61\x74\x61\x0a\x20\x20\x20\x69\x64\x3d\
+\x22\x6d\x65\x74\x61\x64\x61\x74\x61\x34\x30\x31\x34\x22\x3e\x3c\
+\x72\x64\x66\x3a\x52\x44\x46\x3e\x3c\x63\x63\x3a\x57\x6f\x72\x6b\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x72\x64\x66\x3a\x61\x62\x6f\x75\
+\x74\x3d\x22\x22\x3e\x3c\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\
+\x69\x6d\x61\x67\x65\x2f\x73\x76\x67\x2b\x78\x6d\x6c\x3c\x2f\x64\
+\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x3c\x64\x63\x3a\x74\x79\x70\
+\x65\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x64\x66\x3a\x72\
+\x65\x73\x6f\x75\x72\x63\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\
+\x70\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x64\x63\x6d\x69\
+\x74\x79\x70\x65\x2f\x53\x74\x69\x6c\x6c\x49\x6d\x61\x67\x65\x22\
+\x20\x2f\x3e\x3c\x64\x63\x3a\x74\x69\x74\x6c\x65\x3e\x3c\x2f\x64\
+\x63\x3a\x74\x69\x74\x6c\x65\x3e\x3c\x2f\x63\x63\x3a\x57\x6f\x72\
+\x6b\x3e\x3c\x2f\x72\x64\x66\x3a\x52\x44\x46\x3e\x3c\x2f\x6d\x65\
+\x74\x61\x64\x61\x74\x61\x3e\x3c\x64\x65\x66\x73\x0a\x20\x20\x20\
+\x69\x64\x3d\x22\x64\x65\x66\x73\x34\x30\x31\x32\x22\x20\x2f\x3e\
+\x3c\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x6e\x61\x6d\x65\x64\x76\
+\x69\x65\x77\x0a\x20\x20\x20\x70\x61\x67\x65\x63\x6f\x6c\x6f\x72\
+\x3d\x22\x23\x66\x66\x66\x66\x66\x66\x22\x0a\x20\x20\x20\x62\x6f\
+\x72\x64\x65\x72\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x36\x36\x36\x36\
+\x36\x36\x22\x0a\x20\x20\x20\x62\x6f\x72\x64\x65\x72\x6f\x70\x61\
+\x63\x69\x74\x79\x3d\x22\x31\x22\x0a\x20\x20\x20\x6f\x62\x6a\x65\
+\x63\x74\x74\x6f\x6c\x65\x72\x61\x6e\x63\x65\x3d\x22\x31\x30\x22\
+\x0a\x20\x20\x20\x67\x72\x69\x64\x74\x6f\x6c\x65\x72\x61\x6e\x63\
+\x65\x3d\x22\x31\x30\x22\x0a\x20\x20\x20\x67\x75\x69\x64\x65\x74\
+\x6f\x6c\x65\x72\x61\x6e\x63\x65\x3d\x22\x31\x30\x22\x0a\x20\x20\
+\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x70\x61\x67\x65\x6f\x70\
+\x61\x63\x69\x74\x79\x3d\x22\x30\x22\x0a\x20\x20\x20\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3a\x70\x61\x67\x65\x73\x68\x61\x64\x6f\x77\
+\x3d\x22\x32\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x77\x69\x64\x74\x68\x3d\x22\x39\
+\x38\x39\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\
+\x77\x69\x6e\x64\x6f\x77\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x37\
+\x32\x35\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x6e\x61\x6d\x65\x64\
+\x76\x69\x65\x77\x34\x30\x31\x30\x22\x0a\x20\x20\x20\x73\x68\x6f\
+\x77\x67\x72\x69\x64\x3d\x22\x66\x61\x6c\x73\x65\x22\x0a\x20\x20\
+\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x7a\x6f\x6f\x6d\x3d\x22\
+\x31\x2e\x35\x30\x35\x39\x30\x38\x22\x0a\x20\x20\x20\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3a\x63\x78\x3d\x22\x35\x33\x2e\x30\x30\x30\
+\x35\x30\x34\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x63\x79\x3d\x22\x35\x33\x2e\x31\x30\x30\x37\x30\x37\x22\x0a\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\
+\x6f\x77\x2d\x78\x3d\x22\x31\x32\x39\x22\x0a\x20\x20\x20\x69\x6e\
+\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x79\x3d\
+\x22\x36\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\
+\x77\x69\x6e\x64\x6f\x77\x2d\x6d\x61\x78\x69\x6d\x69\x7a\x65\x64\
+\x3d\x22\x30\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x63\x75\x72\x72\x65\x6e\x74\x2d\x6c\x61\x79\x65\x72\x3d\x22\
+\x67\x34\x30\x30\x37\x22\x20\x2f\x3e\x0a\x3c\x73\x74\x79\x6c\x65\
+\x0a\x20\x20\x20\x74\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x63\
+\x73\x73\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x73\x74\x79\x6c\x65\
+\x33\x39\x37\x39\x22\x3e\x0a\x09\x2e\x73\x74\x30\x7b\x66\x69\x6c\
+\x6c\x2d\x72\x75\x6c\x65\x3a\x65\x76\x65\x6e\x6f\x64\x64\x3b\x63\
+\x6c\x69\x70\x2d\x72\x75\x6c\x65\x3a\x65\x76\x65\x6e\x6f\x64\x64\
+\x3b\x66\x69\x6c\x6c\x3a\x23\x45\x31\x45\x31\x45\x31\x3b\x7d\x0a\
+\x09\x2e\x73\x74\x31\x7b\x66\x69\x6c\x6c\x3a\x23\x46\x46\x36\x36\
+\x30\x30\x3b\x7d\x0a\x09\x2e\x73\x74\x32\x7b\x66\x69\x6c\x6c\x3a\
+\x23\x34\x43\x34\x43\x34\x43\x3b\x7d\x0a\x09\x2e\x73\x74\x33\x7b\
+\x66\x69\x6c\x6c\x3a\x23\x46\x46\x46\x46\x46\x46\x3b\x7d\x0a\x3c\
+\x2f\x73\x74\x79\x6c\x65\x3e\x0a\x3c\x67\x0a\x20\x20\x20\x69\x64\
+\x3d\x22\x67\x34\x30\x30\x37\x22\x0a\x20\x20\x20\x74\x72\x61\x6e\
+\x73\x66\x6f\x72\x6d\x3d\x22\x74\x72\x61\x6e\x73\x6c\x61\x74\x65\
+\x28\x30\x2c\x2d\x34\x35\x2e\x36\x33\x30\x30\x30\x35\x29\x22\x3e\
+\x0a\x09\x0a\x09\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\x63\x6c\x61\
+\x73\x73\x3d\x22\x73\x74\x31\x22\x0a\x20\x20\x20\x64\x3d\x22\x6d\
+\x20\x32\x37\x2e\x31\x33\x33\x36\x36\x32\x2c\x31\x32\x32\x2e\x30\
+\x32\x35\x39\x39\x20\x63\x20\x2d\x32\x2e\x37\x33\x2c\x2d\x33\x2e\
+\x37\x32\x20\x2d\x35\x2e\x37\x35\x2c\x2d\x38\x2e\x36\x20\x2d\x39\
+\x2e\x30\x36\x2c\x2d\x31\x34\x2e\x37\x39\x20\x2d\x31\x2e\x38\x39\
+\x2c\x2d\x33\x2e\x32\x37\x20\x2d\x32\x2e\x30\x38\x2c\x2d\x34\x2e\
+\x37\x39\x20\x31\x2e\x30\x37\x2c\x2d\x36\x2e\x31\x33\x20\x6c\x20\
+\x35\x36\x2e\x38\x33\x2c\x2d\x32\x33\x2e\x35\x30\x39\x39\x39\x38\
+\x20\x63\x20\x31\x2e\x36\x2c\x2d\x30\x2e\x37\x20\x33\x2e\x37\x2c\
+\x2d\x30\x2e\x37\x31\x20\x35\x2e\x30\x36\x2c\x31\x2e\x37\x35\x20\
+\x37\x2e\x36\x34\x2c\x31\x31\x2e\x32\x39\x20\x31\x33\x2e\x32\x2c\
+\x31\x39\x2e\x32\x33\x20\x32\x31\x2e\x30\x39\x39\x39\x39\x38\x2c\
+\x32\x37\x2e\x37\x39\x39\x39\x39\x38\x20\x31\x32\x2e\x31\x35\x2c\
+\x31\x32\x2e\x35\x38\x20\x32\x35\x2e\x35\x33\x2c\x32\x36\x2e\x32\
+\x32\x20\x34\x38\x2e\x37\x33\x2c\x33\x36\x2e\x31\x32\x20\x37\x2e\
+\x33\x32\x2c\x32\x2e\x37\x20\x31\x34\x2e\x34\x38\x2c\x34\x2e\x39\
+\x33\x20\x32\x32\x2e\x39\x32\x2c\x36\x2e\x33\x36\x20\x30\x2e\x33\
+\x32\x2c\x30\x2e\x30\x35\x20\x31\x2e\x38\x38\x2c\x30\x2e\x38\x20\
+\x31\x2e\x37\x37\x2c\x32\x2e\x31\x34\x20\x6c\x20\x2d\x30\x2e\x32\
+\x33\x2c\x31\x33\x2e\x32\x36\x20\x2d\x33\x39\x2e\x34\x31\x2c\x32\
+\x32\x2e\x36\x33\x30\x30\x31\x20\x63\x20\x2d\x32\x2c\x31\x2e\x37\
+\x36\x20\x2d\x33\x2e\x39\x31\x2c\x33\x2e\x32\x38\x20\x2d\x38\x2e\
+\x34\x2c\x31\x2e\x38\x34\x20\x6c\x20\x2d\x31\x31\x37\x2e\x31\x39\
+\x39\x39\x39\x39\x2c\x2d\x32\x34\x2e\x33\x39\x30\x30\x31\x20\x2d\
+\x30\x2e\x30\x32\x2c\x2d\x37\x2e\x38\x36\x20\x2d\x39\x2e\x32\x38\
+\x39\x39\x39\x39\x36\x2c\x2d\x32\x2e\x34\x20\x63\x20\x2d\x30\x2e\
+\x37\x32\x30\x30\x30\x30\x30\x32\x2c\x2d\x30\x2e\x31\x38\x20\x2d\
+\x30\x2e\x37\x33\x30\x30\x30\x30\x30\x32\x2c\x2d\x31\x2e\x31\x33\
+\x20\x2d\x30\x2e\x31\x34\x30\x30\x30\x30\x30\x32\x2c\x2d\x31\x2e\
+\x35\x33\x20\x6c\x20\x39\x2e\x37\x35\x30\x30\x30\x30\x36\x32\x2c\
+\x2d\x37\x2e\x39\x34\x20\x63\x20\x2d\x30\x2e\x30\x34\x2c\x2d\x31\
+\x2e\x35\x33\x20\x30\x2e\x34\x2c\x2d\x32\x2e\x35\x20\x31\x2e\x31\
+\x36\x2c\x2d\x33\x2e\x34\x36\x20\x2d\x34\x2e\x32\x38\x30\x30\x30\
+\x30\x36\x2c\x2d\x31\x2e\x35\x20\x2d\x35\x2e\x39\x37\x30\x30\x30\
+\x30\x36\x2c\x2d\x33\x2e\x33\x39\x20\x2d\x33\x2e\x32\x32\x30\x30\
+\x30\x30\x36\x2c\x2d\x35\x2e\x39\x37\x20\x6c\x20\x31\x37\x2e\x32\
+\x31\x30\x30\x30\x30\x36\x2c\x2d\x31\x32\x2e\x37\x35\x20\x7a\x22\
+\x0a\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x33\x39\x38\x33\
+\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\
+\x6e\x6e\x65\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\x61\x74\x75\x72\
+\x65\x3d\x22\x30\x22\x0a\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\
+\x66\x69\x6c\x6c\x3a\x23\x37\x66\x37\x66\x37\x66\x3b\x66\x69\x6c\
+\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x22\x20\x2f\x3e\x0a\
+\x09\x0a\x09\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\x63\x6c\x61\x73\
+\x73\x3d\x22\x73\x74\x33\x22\x0a\x20\x20\x20\x64\x3d\x22\x6d\x20\
+\x31\x37\x32\x2e\x34\x35\x33\x36\x36\x2c\x31\x35\x31\x2e\x34\x35\
+\x35\x39\x39\x20\x2d\x34\x32\x2e\x39\x32\x2c\x32\x34\x2e\x32\x35\
+\x20\x63\x20\x2d\x31\x39\x2e\x37\x36\x2c\x2d\x34\x2e\x30\x36\x20\
+\x2d\x33\x36\x2e\x35\x30\x39\x39\x39\x38\x2c\x2d\x31\x30\x2e\x30\
+\x36\x20\x2d\x35\x30\x2e\x35\x36\x39\x39\x39\x38\x2c\x2d\x31\x37\
+\x2e\x30\x38\x20\x33\x2e\x36\x37\x2c\x30\x2e\x38\x36\x20\x37\x2e\
+\x36\x33\x2c\x31\x2e\x33\x33\x20\x31\x31\x2e\x37\x36\x2c\x31\x2e\
+\x33\x33\x20\x31\x38\x2e\x39\x36\x39\x39\x39\x38\x2c\x30\x20\x33\
+\x34\x2e\x33\x34\x39\x39\x39\x38\x2c\x2d\x39\x2e\x39\x34\x20\x33\
+\x34\x2e\x33\x34\x39\x39\x39\x38\x2c\x2d\x32\x32\x2e\x31\x39\x20\
+\x30\x2c\x2d\x32\x2e\x38\x36\x20\x2d\x30\x2e\x38\x34\x2c\x2d\x35\
+\x2e\x36\x20\x2d\x32\x2e\x33\x37\x2c\x2d\x38\x2e\x31\x31\x20\x31\
+\x34\x2e\x37\x37\x2c\x31\x31\x2e\x32\x32\x20\x33\x31\x2e\x37\x33\
+\x2c\x31\x39\x2e\x37\x36\x20\x34\x39\x2e\x37\x35\x2c\x32\x31\x2e\
+\x38\x20\x7a\x20\x6d\x20\x2d\x38\x32\x2e\x30\x34\x39\x39\x39\x38\
+\x2c\x2d\x33\x34\x2e\x33\x33\x20\x63\x20\x31\x37\x2e\x34\x31\x39\
+\x39\x39\x38\x2c\x30\x20\x33\x31\x2e\x35\x33\x39\x39\x39\x38\x2c\
+\x38\x2e\x39\x39\x20\x33\x31\x2e\x35\x33\x39\x39\x39\x38\x2c\x32\
+\x30\x2e\x30\x39\x20\x30\x2c\x31\x31\x2e\x31\x20\x2d\x31\x34\x2e\
+\x31\x32\x2c\x32\x30\x2e\x30\x39\x20\x2d\x33\x31\x2e\x35\x33\x39\
+\x39\x39\x38\x2c\x32\x30\x2e\x30\x39\x20\x2d\x31\x37\x2e\x34\x32\
+\x2c\x30\x20\x2d\x33\x31\x2e\x35\x34\x2c\x2d\x38\x2e\x39\x39\x20\
+\x2d\x33\x31\x2e\x35\x34\x2c\x2d\x32\x30\x2e\x30\x39\x20\x30\x2c\
+\x2d\x31\x31\x2e\x31\x20\x31\x34\x2e\x31\x32\x2c\x2d\x32\x30\x2e\
+\x30\x39\x20\x33\x31\x2e\x35\x34\x2c\x2d\x32\x30\x2e\x30\x39\x20\
+\x7a\x20\x6d\x20\x32\x30\x2e\x36\x31\x39\x39\x39\x38\x2c\x32\x2e\
+\x37\x35\x20\x63\x20\x2d\x35\x2e\x36\x39\x2c\x2d\x32\x2e\x37\x20\
+\x2d\x31\x32\x2e\x37\x30\x39\x39\x39\x38\x2c\x2d\x34\x2e\x32\x39\
+\x20\x2d\x32\x30\x2e\x33\x30\x39\x39\x39\x38\x2c\x2d\x34\x2e\x32\
+\x39\x20\x2d\x31\x38\x2e\x39\x37\x2c\x30\x20\x2d\x33\x34\x2e\x33\
+\x35\x2c\x39\x2e\x39\x34\x20\x2d\x33\x34\x2e\x33\x35\x2c\x32\x32\
+\x2e\x31\x39\x20\x30\x2c\x33\x2e\x34\x34\x20\x31\x2e\x32\x31\x2c\
+\x36\x2e\x36\x39\x20\x33\x2e\x33\x37\x2c\x39\x2e\x35\x39\x20\x2d\
+\x32\x30\x2e\x36\x37\x2c\x2d\x31\x34\x2e\x31\x36\x20\x2d\x33\x33\
+\x2e\x30\x31\x2c\x2d\x33\x30\x2e\x32\x20\x2d\x33\x38\x2e\x38\x33\
+\x2c\x2d\x34\x32\x2e\x37\x38\x20\x6c\x20\x35\x37\x2e\x32\x2c\x2d\
+\x32\x34\x2e\x37\x37\x39\x39\x39\x38\x20\x63\x20\x37\x2e\x33\x35\
+\x2c\x31\x32\x2e\x32\x32\x20\x31\x38\x2e\x37\x36\x2c\x32\x37\x2e\
+\x30\x34\x39\x39\x39\x38\x20\x33\x32\x2e\x39\x31\x39\x39\x39\x38\
+\x2c\x34\x30\x2e\x30\x36\x39\x39\x39\x38\x20\x7a\x20\x6d\x20\x2d\
+\x32\x33\x2e\x36\x32\x39\x39\x39\x38\x2c\x2d\x30\x2e\x35\x35\x20\
+\x2d\x31\x2e\x34\x35\x2c\x34\x2e\x34\x20\x2d\x34\x2e\x35\x33\x2c\
+\x2d\x30\x2e\x33\x32\x20\x2d\x31\x2e\x30\x33\x2c\x32\x2e\x37\x31\
+\x20\x63\x20\x32\x2e\x37\x35\x2c\x30\x2e\x32\x35\x20\x33\x2e\x39\
+\x36\x2c\x2d\x30\x2e\x30\x36\x20\x33\x2e\x33\x2c\x32\x2e\x30\x36\
+\x20\x6c\x20\x2d\x34\x2e\x32\x37\x2c\x31\x33\x2e\x38\x35\x20\x63\
+\x20\x2d\x30\x2e\x34\x36\x2c\x31\x2e\x34\x38\x20\x2d\x30\x2e\x38\
+\x33\x2c\x31\x2e\x32\x31\x20\x2d\x32\x2e\x37\x38\x2c\x30\x2e\x39\
+\x33\x20\x6c\x20\x2d\x32\x2e\x32\x38\x2c\x2d\x30\x2e\x33\x32\x20\
+\x2d\x31\x2e\x32\x39\x2c\x33\x2e\x38\x38\x20\x34\x2e\x37\x37\x2c\
+\x30\x2e\x38\x20\x2d\x31\x2e\x34\x31\x2c\x34\x2e\x39\x31\x20\x36\
+\x2e\x32\x38\x2c\x31\x2e\x30\x38\x20\x31\x2e\x34\x34\x2c\x2d\x35\
+\x20\x35\x2e\x31\x32\x2c\x30\x2e\x37\x20\x2d\x31\x2e\x32\x38\x2c\
+\x35\x2e\x30\x38\x20\x36\x2e\x31\x32\x2c\x30\x2e\x38\x20\x31\x2e\
+\x32\x32\x2c\x2d\x35\x2e\x31\x37\x20\x63\x20\x31\x2e\x37\x31\x2c\
+\x30\x2e\x31\x32\x20\x31\x2e\x36\x37\x2c\x30\x2e\x30\x32\x20\x32\
+\x2e\x38\x36\x2c\x2d\x30\x2e\x31\x34\x20\x32\x2e\x30\x36\x39\x39\
+\x39\x38\x2c\x2d\x30\x2e\x32\x36\x20\x33\x2e\x37\x38\x39\x39\x39\
+\x38\x2c\x2d\x30\x2e\x38\x35\x20\x35\x2e\x31\x34\x39\x39\x39\x38\
+\x2c\x2d\x31\x2e\x37\x35\x20\x31\x2e\x33\x35\x2c\x2d\x30\x2e\x39\
+\x20\x32\x2e\x33\x2c\x2d\x32\x2e\x34\x34\x20\x32\x2e\x36\x37\x2c\
+\x2d\x33\x2e\x37\x31\x20\x30\x2e\x33\x31\x2c\x2d\x31\x2e\x30\x36\
+\x20\x30\x2e\x31\x35\x2c\x2d\x32\x2e\x34\x39\x20\x2d\x30\x2e\x32\
+\x39\x2c\x2d\x33\x2e\x34\x35\x20\x2d\x30\x2e\x34\x34\x2c\x2d\x30\
+\x2e\x39\x37\x20\x2d\x31\x2e\x31\x38\x2c\x2d\x31\x2e\x37\x38\x20\
+\x2d\x32\x2e\x32\x32\x2c\x2d\x32\x2e\x34\x34\x20\x2d\x30\x2e\x37\
+\x32\x2c\x2d\x30\x2e\x34\x36\x20\x2d\x31\x2e\x38\x2c\x2d\x30\x2e\
+\x39\x36\x20\x2d\x33\x2e\x32\x35\x2c\x2d\x31\x2e\x34\x38\x20\x32\
+\x2e\x35\x32\x2c\x2d\x30\x2e\x32\x31\x20\x34\x2e\x30\x32\x2c\x2d\
+\x30\x2e\x39\x36\x20\x35\x2e\x36\x2c\x2d\x32\x2e\x34\x36\x20\x31\
+\x2e\x36\x31\x2c\x2d\x31\x2e\x35\x33\x20\x31\x2e\x39\x33\x2c\x2d\
+\x33\x2e\x35\x34\x20\x30\x2e\x38\x39\x2c\x2d\x35\x2e\x33\x31\x20\
+\x2d\x31\x2e\x32\x38\x2c\x2d\x32\x2e\x31\x36\x20\x2d\x33\x2e\x39\
+\x31\x2c\x2d\x33\x2e\x31\x37\x20\x2d\x36\x2e\x36\x35\x2c\x2d\x33\
+\x2e\x37\x39\x20\x6c\x20\x31\x2e\x30\x33\x2c\x2d\x34\x2e\x35\x39\
+\x20\x2d\x34\x2e\x30\x36\x39\x39\x39\x38\x2c\x2d\x30\x2e\x34\x20\
+\x2d\x31\x2e\x33\x31\x2c\x34\x2e\x35\x35\x20\x2d\x34\x2e\x37\x31\
+\x2c\x2d\x30\x2e\x34\x38\x20\x31\x2e\x32\x33\x2c\x2d\x34\x2e\x33\
+\x39\x20\x7a\x20\x6d\x20\x31\x2e\x30\x34\x2c\x31\x33\x2e\x39\x38\
+\x20\x31\x2e\x38\x31\x2c\x2d\x36\x2e\x32\x32\x20\x33\x2e\x36\x38\
+\x2c\x30\x2e\x34\x32\x20\x63\x20\x32\x2e\x31\x31\x2c\x30\x2e\x32\
+\x34\x20\x33\x2e\x35\x33\x2c\x30\x2e\x36\x34\x20\x34\x2e\x32\x38\
+\x2c\x30\x2e\x39\x35\x20\x33\x2e\x31\x39\x39\x39\x39\x38\x2c\x31\
+\x2e\x33\x20\x32\x2e\x31\x33\x39\x39\x39\x38\x2c\x35\x2e\x33\x31\
+\x20\x2d\x31\x2e\x39\x32\x2c\x35\x2e\x36\x39\x20\x2d\x30\x2e\x39\
+\x36\x2c\x30\x2e\x30\x39\x20\x2d\x32\x2e\x33\x39\x2c\x2d\x30\x2e\
+\x30\x31\x20\x2d\x34\x2e\x32\x36\x2c\x2d\x30\x2e\x32\x39\x20\x7a\
+\x20\x6d\x20\x2d\x31\x2c\x33\x2e\x34\x36\x20\x34\x2e\x32\x34\x2c\
+\x30\x2e\x36\x35\x20\x63\x20\x31\x2e\x38\x36\x2c\x30\x2e\x32\x38\
+\x20\x33\x2e\x32\x31\x2c\x30\x2e\x36\x32\x20\x34\x2e\x30\x34\x2c\
+\x31\x2e\x30\x31\x20\x30\x2e\x38\x33\x2c\x30\x2e\x33\x39\x20\x31\
+\x2e\x34\x31\x2c\x30\x2e\x38\x36\x20\x31\x2e\x37\x31\x2c\x31\x2e\
+\x34\x32\x20\x30\x2e\x33\x32\x2c\x30\x2e\x35\x36\x20\x30\x2e\x33\
+\x37\x2c\x31\x2e\x32\x20\x30\x2e\x31\x36\x2c\x31\x2e\x39\x31\x20\
+\x2d\x30\x2e\x32\x34\x2c\x30\x2e\x38\x33\x20\x2d\x30\x2e\x37\x36\
+\x2c\x32\x2e\x33\x37\x20\x2d\x31\x2e\x35\x38\x2c\x32\x2e\x38\x37\
+\x20\x2d\x30\x2e\x38\x31\x2c\x30\x2e\x35\x20\x2d\x31\x2e\x37\x2c\
+\x30\x2e\x37\x37\x20\x2d\x32\x2e\x36\x37\x2c\x30\x2e\x38\x32\x20\
+\x2d\x30\x2e\x39\x37\x2c\x30\x2e\x30\x35\x20\x2d\x32\x2e\x31\x35\
+\x2c\x2d\x30\x2e\x30\x37\x20\x2d\x33\x2e\x35\x33\x2c\x2d\x30\x2e\
+\x32\x39\x20\x2d\x30\x2e\x34\x35\x2c\x2d\x30\x2e\x30\x37\x20\x2d\
+\x34\x2e\x35\x33\x2c\x2d\x30\x2e\x36\x36\x20\x2d\x34\x2e\x35\x34\
+\x2c\x2d\x30\x2e\x37\x34\x20\x7a\x20\x6d\x20\x2d\x38\x2e\x39\x38\
+\x2c\x32\x37\x2e\x38\x38\x20\x63\x20\x36\x2e\x34\x39\x2c\x31\x2e\
+\x33\x36\x20\x31\x30\x2e\x33\x2c\x32\x2e\x31\x20\x31\x33\x2e\x38\
+\x36\x2c\x32\x2e\x35\x39\x20\x39\x2e\x38\x33\x39\x39\x39\x38\x2c\
+\x33\x2e\x31\x36\x20\x31\x38\x2e\x34\x33\x39\x39\x39\x38\x2c\x35\
+\x2e\x37\x38\x20\x32\x38\x2e\x32\x33\x39\x39\x39\x38\x2c\x38\x2e\
+\x31\x36\x20\x2d\x31\x33\x2e\x39\x37\x2c\x2d\x32\x2e\x30\x31\x20\
+\x2d\x32\x37\x2e\x37\x37\x39\x39\x39\x38\x2c\x2d\x36\x2e\x32\x34\
+\x20\x2d\x34\x32\x2e\x30\x39\x39\x39\x39\x38\x2c\x2d\x31\x30\x2e\
+\x37\x35\x20\x7a\x20\x6d\x20\x36\x35\x2e\x34\x31\x39\x39\x39\x38\
+\x2c\x34\x2e\x34\x33\x20\x33\x30\x2e\x31\x39\x2c\x2d\x31\x37\x2e\
+\x35\x32\x20\x63\x20\x30\x2e\x33\x39\x2c\x2d\x30\x2e\x33\x32\x20\
+\x30\x2e\x33\x38\x2c\x2d\x30\x2e\x35\x39\x20\x2d\x30\x2e\x33\x33\
+\x2c\x2d\x30\x2e\x37\x20\x2d\x31\x34\x2e\x35\x2c\x2d\x32\x2e\x34\
+\x35\x20\x2d\x32\x39\x2e\x32\x36\x2c\x2d\x37\x2e\x33\x36\x20\x2d\
+\x34\x34\x2e\x36\x36\x2c\x2d\x31\x37\x2e\x39\x33\x20\x2d\x35\x2e\
+\x39\x2c\x2d\x34\x2e\x31\x37\x20\x2d\x32\x30\x2e\x30\x33\x2c\x2d\
+\x31\x36\x2e\x33\x35\x20\x2d\x32\x36\x2e\x38\x35\x2c\x2d\x32\x33\
+\x2e\x37\x34\x20\x2d\x37\x2e\x39\x33\x39\x39\x39\x38\x2c\x2d\x38\
+\x2e\x36\x31\x20\x2d\x31\x34\x2e\x36\x36\x39\x39\x39\x38\x2c\x2d\
+\x31\x38\x2e\x33\x32\x39\x39\x39\x38\x20\x2d\x32\x32\x2e\x33\x33\
+\x39\x39\x39\x38\x2c\x2d\x32\x39\x2e\x31\x33\x39\x39\x39\x38\x20\
+\x2d\x30\x2e\x35\x31\x2c\x2d\x30\x2e\x38\x36\x20\x2d\x30\x2e\x38\
+\x38\x2c\x2d\x31\x2e\x34\x20\x2d\x31\x2e\x33\x33\x2c\x2d\x31\x2e\
+\x36\x31\x20\x2d\x30\x2e\x34\x33\x2c\x2d\x30\x2e\x31\x39\x20\x2d\
+\x30\x2e\x39\x39\x2c\x2d\x30\x2e\x31\x20\x2d\x31\x2e\x38\x39\x2c\
+\x30\x2e\x33\x20\x6c\x20\x2d\x35\x35\x2e\x32\x35\x2c\x32\x32\x2e\
+\x38\x33\x39\x39\x39\x38\x20\x63\x20\x2d\x33\x2e\x34\x35\x2c\x31\
+\x2e\x34\x36\x20\x2d\x33\x2e\x33\x34\x2c\x32\x2e\x35\x32\x20\x2d\
+\x31\x2e\x35\x34\x2c\x35\x2e\x36\x34\x20\x38\x2e\x35\x35\x2c\x31\
+\x38\x2e\x30\x31\x20\x32\x33\x2e\x39\x35\x2c\x33\x33\x2e\x32\x39\
+\x20\x33\x39\x2e\x35\x37\x2c\x34\x33\x2e\x36\x37\x20\x32\x2e\x31\
+\x38\x2c\x34\x2e\x33\x36\x20\x35\x2e\x34\x38\x2c\x38\x2e\x36\x32\
+\x20\x31\x33\x2e\x31\x38\x2c\x31\x31\x2e\x38\x37\x20\x2d\x31\x37\
+\x2e\x33\x31\x2c\x2d\x36\x2e\x31\x39\x20\x2d\x33\x37\x2e\x37\x38\
+\x2c\x2d\x31\x34\x2e\x32\x39\x20\x2d\x36\x30\x2e\x38\x31\x2c\x2d\
+\x32\x35\x2e\x31\x32\x20\x6c\x20\x31\x32\x2e\x30\x33\x2c\x2d\x38\
+\x2e\x38\x33\x20\x2d\x31\x2e\x34\x38\x2c\x2d\x30\x2e\x39\x36\x20\
+\x2d\x31\x31\x2e\x39\x31\x2c\x38\x2e\x37\x38\x20\x63\x20\x2d\x31\
+\x2e\x37\x34\x30\x30\x30\x30\x36\x2c\x31\x2e\x37\x34\x20\x2d\x31\
+\x2e\x31\x32\x30\x30\x30\x30\x36\x2c\x32\x2e\x35\x31\x20\x30\x2e\
+\x32\x2c\x33\x2e\x31\x31\x20\x31\x33\x2e\x37\x31\x2c\x36\x2e\x38\
+\x39\x20\x36\x38\x2e\x32\x38\x2c\x32\x38\x2e\x38\x33\x20\x39\x34\
+\x2e\x34\x31\x39\x39\x39\x38\x2c\x33\x35\x2e\x35\x36\x20\x2d\x31\
+\x38\x2e\x31\x34\x39\x39\x39\x38\x2c\x2d\x33\x2e\x39\x36\x20\x2d\
+\x37\x36\x2e\x31\x35\x39\x39\x39\x38\x2c\x2d\x32\x33\x2e\x38\x31\
+\x20\x2d\x39\x33\x2e\x31\x39\x39\x39\x39\x38\x2c\x2d\x33\x31\x2e\
+\x31\x36\x20\x2d\x31\x2e\x30\x34\x2c\x31\x2e\x33\x33\x20\x2d\x30\
+\x2e\x33\x37\x2c\x32\x2e\x38\x34\x20\x31\x2e\x30\x35\x2c\x33\x2e\
+\x34\x35\x20\x6c\x20\x31\x2e\x33\x33\x2c\x30\x2e\x34\x32\x20\x63\
+\x20\x35\x2e\x34\x34\x2c\x31\x2e\x37\x31\x20\x34\x37\x2e\x39\x34\
+\x2c\x31\x36\x2e\x35\x33\x20\x35\x36\x2e\x32\x39\x2c\x31\x38\x2e\
+\x34\x36\x20\x2d\x39\x2e\x37\x31\x2c\x2d\x31\x2e\x34\x34\x20\x2d\
+\x35\x34\x2e\x37\x36\x2c\x2d\x31\x35\x2e\x32\x38\x20\x2d\x35\x39\
+\x2e\x31\x38\x2c\x2d\x31\x37\x2e\x30\x38\x20\x6c\x20\x30\x2e\x31\
+\x36\x2c\x32\x2e\x33\x35\x20\x36\x32\x2e\x31\x37\x2c\x31\x37\x2e\
+\x36\x39\x20\x36\x2e\x30\x31\x2c\x32\x2e\x32\x37\x20\x2d\x37\x30\
+\x2e\x37\x36\x30\x30\x30\x30\x36\x2c\x2d\x31\x37\x2e\x31\x38\x20\
+\x63\x20\x2d\x33\x2e\x30\x33\x2c\x2d\x30\x2e\x37\x38\x20\x2d\x35\
+\x2c\x2d\x30\x2e\x37\x34\x20\x2d\x32\x2e\x38\x35\x2c\x2d\x34\x2e\
+\x30\x34\x20\x6c\x20\x2d\x33\x2e\x37\x38\x2c\x32\x2e\x39\x38\x20\
+\x63\x20\x2d\x30\x2e\x33\x37\x2c\x30\x2e\x32\x34\x20\x2d\x30\x2e\
+\x33\x36\x2c\x30\x2e\x35\x39\x20\x30\x2e\x30\x39\x2c\x30\x2e\x36\
+\x39\x20\x6c\x20\x38\x31\x2e\x30\x37\x30\x30\x30\x30\x36\x2c\x32\
+\x30\x2e\x30\x34\x20\x33\x2e\x34\x31\x2c\x31\x2e\x35\x31\x20\x2d\
+\x37\x35\x2e\x33\x39\x2c\x2d\x31\x37\x2e\x35\x32\x20\x30\x2e\x30\
+\x35\x2c\x31\x2e\x36\x32\x20\x35\x38\x2e\x33\x38\x2c\x31\x33\x2e\
+\x34\x31\x20\x36\x2e\x30\x36\x2c\x32\x2e\x33\x35\x20\x2d\x36\x34\
+\x2e\x34\x34\x2c\x2d\x31\x33\x2e\x36\x38\x20\x2d\x30\x2e\x30\x33\
+\x2c\x31\x2e\x37\x38\x20\x31\x31\x36\x2e\x38\x30\x39\x39\x39\x38\
+\x2c\x32\x34\x2e\x31\x38\x30\x30\x31\x20\x63\x20\x31\x2e\x36\x35\
+\x2c\x30\x2e\x33\x35\x20\x33\x2e\x38\x39\x2c\x30\x2e\x33\x36\x20\
+\x35\x2e\x34\x39\x2c\x2d\x30\x2e\x39\x20\x6c\x20\x33\x39\x2e\x37\
+\x2c\x2d\x32\x32\x2e\x39\x39\x30\x30\x31\x20\x2d\x31\x32\x2e\x33\
+\x35\x2c\x35\x2e\x33\x20\x31\x32\x2e\x33\x37\x2c\x2d\x37\x2e\x32\
+\x37\x20\x2d\x32\x32\x2e\x32\x34\x2c\x39\x2e\x36\x38\x20\x32\x32\
+\x2e\x31\x38\x2c\x2d\x31\x31\x2e\x38\x35\x20\x2d\x31\x31\x2e\x35\
+\x31\x2c\x34\x2e\x35\x37\x20\x31\x31\x2e\x34\x35\x2c\x2d\x37\x2e\
+\x30\x35\x20\x2d\x31\x38\x2e\x38\x37\x2c\x38\x2e\x37\x32\x20\x31\
+\x38\x2e\x39\x32\x2c\x2d\x31\x31\x2e\x32\x37\x20\x7a\x22\x0a\x20\
+\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x34\x30\x30\x35\x22\x0a\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6e\x6e\
+\x65\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\x61\x74\x75\x72\x65\x3d\
+\x22\x30\x22\x0a\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\
+\x6c\x6c\x3a\x23\x66\x66\x66\x66\x66\x66\x22\x20\x2f\x3e\x0a\x3c\
+\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
+\x00\x00\x01\x13\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x10\x00\x00\x00\x0e\x08\x04\x00\x00\x00\x8c\x26\x54\x01\
+\x00\x00\x00\x02\x73\x42\x49\x54\x08\x08\x55\xec\x46\x04\x00\x00\
+\x00\x09\x70\x48\x59\x73\x00\x00\x07\x25\x00\x00\x07\x25\x01\x95\
+\x1f\x7a\xcd\x00\x00\x00\xb7\x49\x44\x41\x54\x18\xd3\x8d\xd1\xb1\
+\x4a\x82\x01\x10\xc0\xf1\x1f\xe8\xe0\xa0\x4b\x7c\x8b\x48\x3d\x40\
+\x43\x2f\x90\xc8\x37\x19\x62\xe2\x6b\x38\xfa\x02\xee\x51\xbb\xb3\
+\x14\x2a\xae\x41\xe0\xd4\x16\x08\xbe\x43\xa2\x34\x28\xf8\x0e\xd7\
+\xf2\x51\x69\x7c\x22\x37\x1d\xf7\x3f\xee\xee\x7f\xc2\x71\xb8\xf1\
+\xa1\x2f\xc9\xb2\x3f\x85\x92\x07\x9f\x12\x05\x77\x5e\x6c\xd4\x0f\
+\x00\x0d\x4b\x7d\x4b\x69\x96\x37\xed\xb4\x33\x40\xc5\xd0\x44\x35\
+\x58\x48\x5d\xa8\x85\xe0\xd6\x5a\x99\x57\x21\x4c\xb3\xbe\x85\xd4\
+\xa5\x95\x27\xc5\xe0\xd9\x80\x70\xed\xd1\xe8\x17\x08\x2a\xde\x75\
+\x83\xb6\x39\xa1\xa4\x77\x08\x04\x5d\x6f\xc1\x95\xed\x59\x40\xfe\
+\x88\x7b\xf3\xd3\x4b\x8e\x0d\x4e\x9d\xd9\xb0\x56\xce\x17\xd5\xb1\
+\xff\x11\xf5\x4f\x75\xcb\xcc\xd7\x91\xea\xbc\x67\x7d\x03\x0c\x69\
+\x9a\x84\x1c\x91\xce\x74\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x0d\xc9\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
+\x6e\x6f\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x43\x72\x65\x61\x74\
+\x65\x64\x20\x77\x69\x74\x68\x20\x49\x6e\x6b\x73\x63\x61\x70\x65\
+\x20\x28\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x2e\x6f\x72\x67\x2f\x29\x20\x2d\x2d\x3e\x0a\
+\x0a\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x64\
+\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\x2e\x6f\
+\x72\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\x6e\x74\x73\x2f\x31\
+\x2e\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x63\x63\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x63\x72\x65\x61\x74\x69\x76\
+\x65\x63\x6f\x6d\x6d\x6f\x6e\x73\x2e\x6f\x72\x67\x2f\x6e\x73\x23\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x72\x64\x66\x3d\x22\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x31\x39\x39\x39\x2f\x30\x32\x2f\x32\x32\x2d\x72\x64\x66\
+\x2d\x73\x79\x6e\x74\x61\x78\x2d\x6e\x73\x23\x22\x0a\x20\x20\x20\
+\x78\x6d\x6c\x6e\x73\x3a\x73\x76\x67\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\
+\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3d\
+\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\
+\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\
+\x78\x6d\x6c\x6e\x73\x3a\x73\x6f\x64\x69\x70\x6f\x64\x69\x3d\x22\
+\x68\x74\x74\x70\x3a\x2f\x2f\x73\x6f\x64\x69\x70\x6f\x64\x69\x2e\
+\x73\x6f\x75\x72\x63\x65\x66\x6f\x72\x67\x65\x2e\x6e\x65\x74\x2f\
+\x44\x54\x44\x2f\x73\x6f\x64\x69\x70\x6f\x64\x69\x2d\x30\x2e\x64\
+\x74\x64\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\x67\x2f\x6e\
+\x61\x6d\x65\x73\x70\x61\x63\x65\x73\x2f\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x73\x76\x67\x32\x22\
+\x0a\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x30\x30\x22\
+\x0a\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\x32\x30\x30\x22\x0a\
+\x20\x20\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x30\x22\
+\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x64\x6f\x63\
+\x6e\x61\x6d\x65\x3d\x22\x71\x75\x65\x73\x74\x69\x6f\x6e\x2d\x6d\
+\x61\x72\x6b\x2d\x64\x61\x72\x6b\x2e\x73\x76\x67\x22\x0a\x20\x20\
+\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x76\x65\x72\x73\x69\x6f\
+\x6e\x3d\x22\x30\x2e\x39\x32\x2e\x34\x20\x28\x35\x64\x61\x36\x38\
+\x39\x63\x33\x31\x33\x2c\x20\x32\x30\x31\x39\x2d\x30\x31\x2d\x31\
+\x34\x29\x22\x3e\x0a\x20\x20\x3c\x6d\x65\x74\x61\x64\x61\x74\x61\
+\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6d\x65\x74\x61\x64\x61\
+\x74\x61\x38\x38\x30\x22\x3e\x0a\x20\x20\x20\x20\x3c\x72\x64\x66\
+\x3a\x52\x44\x46\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x63\x63\x3a\
+\x57\x6f\x72\x6b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x64\
+\x66\x3a\x61\x62\x6f\x75\x74\x3d\x22\x22\x3e\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x3c\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x69\
+\x6d\x61\x67\x65\x2f\x73\x76\x67\x2b\x78\x6d\x6c\x3c\x2f\x64\x63\
+\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x20\x3c\x64\x63\x3a\x74\x79\x70\x65\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x72\x64\x66\x3a\x72\x65\x73\x6f\x75\x72\x63\
+\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\x2e\x6f\
+\x72\x67\x2f\x64\x63\x2f\x64\x63\x6d\x69\x74\x79\x70\x65\x2f\x53\
+\x74\x69\x6c\x6c\x49\x6d\x61\x67\x65\x22\x20\x2f\x3e\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x20\x3c\x64\x63\x3a\x74\x69\x74\x6c\x65\x3e\
+\x3c\x2f\x64\x63\x3a\x74\x69\x74\x6c\x65\x3e\x0a\x20\x20\x20\x20\
+\x20\x20\x3c\x2f\x63\x63\x3a\x57\x6f\x72\x6b\x3e\x0a\x20\x20\x20\
+\x20\x3c\x2f\x72\x64\x66\x3a\x52\x44\x46\x3e\x0a\x20\x20\x3c\x2f\
+\x6d\x65\x74\x61\x64\x61\x74\x61\x3e\x0a\x20\x20\x3c\x64\x65\x66\
+\x73\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x64\x65\x66\x73\x38\
+\x37\x38\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x73\x6f\x64\x69\x70\x6f\
+\x64\x69\x3a\x6e\x61\x6d\x65\x64\x76\x69\x65\x77\x0a\x20\x20\x20\
+\x20\x20\x70\x61\x67\x65\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x66\x66\
+\x66\x66\x66\x66\x22\x0a\x20\x20\x20\x20\x20\x62\x6f\x72\x64\x65\
+\x72\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x36\x36\x36\x36\x36\x36\x22\
+\x0a\x20\x20\x20\x20\x20\x62\x6f\x72\x64\x65\x72\x6f\x70\x61\x63\
+\x69\x74\x79\x3d\x22\x31\x22\x0a\x20\x20\x20\x20\x20\x6f\x62\x6a\
+\x65\x63\x74\x74\x6f\x6c\x65\x72\x61\x6e\x63\x65\x3d\x22\x31\x30\
+\x22\x0a\x20\x20\x20\x20\x20\x67\x72\x69\x64\x74\x6f\x6c\x65\x72\
+\x61\x6e\x63\x65\x3d\x22\x31\x30\x22\x0a\x20\x20\x20\x20\x20\x67\
+\x75\x69\x64\x65\x74\x6f\x6c\x65\x72\x61\x6e\x63\x65\x3d\x22\x31\
+\x30\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x70\x61\x67\x65\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x30\x22\
+\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x70\
+\x61\x67\x65\x73\x68\x61\x64\x6f\x77\x3d\x22\x32\x22\x0a\x20\x20\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\
+\x6f\x77\x2d\x77\x69\x64\x74\x68\x3d\x22\x31\x32\x39\x37\x22\x0a\
+\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\
+\x6e\x64\x6f\x77\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x38\x31\x32\
+\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6e\x61\x6d\x65\x64\
+\x76\x69\x65\x77\x38\x37\x36\x22\x0a\x20\x20\x20\x20\x20\x73\x68\
+\x6f\x77\x67\x72\x69\x64\x3d\x22\x66\x61\x6c\x73\x65\x22\x0a\x20\
+\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x7a\x6f\x6f\
+\x6d\x3d\x22\x33\x2e\x30\x35\x35\x22\x0a\x20\x20\x20\x20\x20\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x78\x3d\x22\x31\x30\x30\x22\
+\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\
+\x79\x3d\x22\x31\x30\x30\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x78\x3d\x22\
+\x30\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x79\x3d\x22\x30\x22\x0a\x20\x20\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\
+\x6f\x77\x2d\x6d\x61\x78\x69\x6d\x69\x7a\x65\x64\x3d\x22\x30\x22\
+\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\
+\x75\x72\x72\x65\x6e\x74\x2d\x6c\x61\x79\x65\x72\x3d\x22\x73\x76\
+\x67\x32\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x70\x61\x74\x68\x0a\x20\
+\x20\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x32\x33\x38\x32\
+\x22\x0a\x20\x20\x20\x20\x20\x64\x3d\x22\x6d\x20\x31\x36\x35\x2e\
+\x33\x33\x2c\x31\x31\x33\x2e\x34\x34\x20\x61\x20\x31\x30\x33\x2e\
+\x36\x31\x2c\x31\x30\x33\x2e\x36\x31\x20\x30\x20\x31\x20\x31\x20\
+\x2d\x32\x30\x37\x2e\x32\x32\x2c\x30\x20\x31\x30\x33\x2e\x36\x31\
+\x2c\x31\x30\x33\x2e\x36\x31\x20\x30\x20\x31\x20\x31\x20\x32\x30\
+\x37\x2e\x32\x32\x2c\x30\x20\x7a\x22\x0a\x20\x20\x20\x20\x20\x74\
+\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\
+\x28\x30\x2e\x39\x33\x37\x33\x39\x2c\x30\x2c\x30\x2c\x30\x2e\x39\
+\x33\x37\x33\x39\x2c\x34\x32\x2e\x31\x34\x33\x2c\x2d\x36\x2e\x33\
+\x33\x39\x32\x29\x22\x0a\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\
+\x3d\x22\x64\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\x69\x6e\x65\
+\x3b\x66\x69\x6c\x6c\x3a\x23\x31\x39\x31\x39\x32\x33\x3b\x66\x69\
+\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x73\x74\x72\
+\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x30\x22\x0a\x20\x20\x20\
+\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6e\x6e\x65\
+\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\x61\x74\x75\x72\x65\x3d\x22\
+\x30\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x67\x0a\x20\x20\x20\x20\x20\
+\x69\x64\x3d\x22\x6c\x61\x79\x65\x72\x31\x22\x0a\x20\x20\x20\x20\
+\x20\x73\x74\x79\x6c\x65\x3d\x22\x64\x69\x73\x70\x6c\x61\x79\x3a\
+\x69\x6e\x6c\x69\x6e\x65\x3b\x66\x69\x6c\x6c\x3a\x23\x66\x35\x66\
+\x35\x66\x35\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\
+\x3a\x31\x22\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x32\x34\
+\x31\x33\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x64\x3d\x22\x4d\x20\
+\x31\x30\x30\x2c\x30\x20\x43\x20\x34\x34\x2e\x38\x2c\x30\x20\x30\
+\x2c\x34\x34\x2e\x38\x20\x30\x2c\x31\x30\x30\x20\x30\x2c\x31\x35\
+\x35\x2e\x32\x20\x34\x34\x2e\x38\x2c\x32\x30\x30\x20\x31\x30\x30\
+\x2c\x32\x30\x30\x20\x31\x35\x35\x2e\x32\x2c\x32\x30\x30\x20\x32\
+\x30\x30\x2c\x31\x35\x35\x2e\x32\x20\x32\x30\x30\x2c\x31\x30\x30\
+\x20\x32\x30\x30\x2c\x34\x34\x2e\x38\x20\x31\x35\x35\x2e\x32\x2c\
+\x30\x20\x31\x30\x30\x2c\x30\x20\x5a\x20\x6d\x20\x30\x2c\x31\x32\
+\x2e\x38\x31\x32\x20\x63\x20\x34\x38\x2e\x31\x33\x2c\x30\x20\x38\
+\x37\x2e\x31\x39\x2c\x33\x39\x2e\x30\x35\x38\x20\x38\x37\x2e\x31\
+\x39\x2c\x38\x37\x2e\x31\x38\x38\x20\x30\x2c\x34\x38\x2e\x31\x33\
+\x20\x2d\x33\x39\x2e\x30\x36\x2c\x38\x37\x2e\x31\x39\x20\x2d\x38\
+\x37\x2e\x31\x39\x2c\x38\x37\x2e\x31\x39\x20\x43\x20\x35\x31\x2e\
+\x38\x37\x2c\x31\x38\x37\x2e\x31\x39\x20\x31\x32\x2e\x38\x31\x32\
+\x2c\x31\x34\x38\x2e\x31\x33\x20\x31\x32\x2e\x38\x31\x32\x2c\x31\
+\x30\x30\x20\x31\x32\x2e\x38\x31\x32\x2c\x35\x31\x2e\x38\x37\x20\
+\x35\x31\x2e\x38\x37\x2c\x31\x32\x2e\x38\x31\x32\x20\x31\x30\x30\
+\x2c\x31\x32\x2e\x38\x31\x32\x20\x5a\x20\x6d\x20\x31\x2e\x34\x37\
+\x2c\x32\x31\x2e\x32\x35\x20\x63\x20\x2d\x35\x2e\x34\x35\x2c\x30\
+\x2e\x30\x33\x20\x2d\x31\x30\x2e\x36\x35\x33\x2c\x30\x2e\x37\x33\
+\x37\x20\x2d\x31\x35\x2e\x32\x38\x32\x2c\x32\x2e\x30\x36\x33\x20\
+\x2d\x34\x2e\x36\x39\x39\x2c\x31\x2e\x33\x34\x36\x20\x2d\x39\x2e\
+\x31\x32\x36\x2c\x33\x2e\x34\x38\x34\x20\x2d\x31\x32\x2e\x38\x37\
+\x36\x2c\x36\x2e\x32\x31\x39\x20\x2d\x33\x2e\x32\x33\x38\x2c\x32\
+\x2e\x33\x36\x32\x20\x2d\x36\x2e\x33\x33\x33\x2c\x35\x2e\x33\x39\
+\x31\x20\x2d\x38\x2e\x36\x38\x37\x2c\x38\x2e\x35\x33\x31\x20\x2d\
+\x34\x2e\x31\x35\x39\x2c\x35\x2e\x35\x34\x39\x20\x2d\x36\x2e\x34\
+\x36\x31\x2c\x31\x31\x2e\x36\x35\x31\x20\x2d\x37\x2e\x30\x36\x33\
+\x2c\x31\x38\x2e\x36\x38\x37\x20\x2d\x30\x2e\x30\x34\x2c\x30\x2e\
+\x34\x36\x38\x20\x2d\x30\x2e\x30\x37\x2c\x30\x2e\x38\x36\x38\x20\
+\x2d\x30\x2e\x30\x36\x32\x2c\x30\x2e\x38\x37\x36\x20\x30\x2e\x30\
+\x31\x36\x2c\x30\x2e\x30\x31\x36\x20\x32\x31\x2e\x37\x30\x32\x2c\
+\x32\x2e\x36\x38\x37\x20\x32\x31\x2e\x38\x31\x32\x2c\x32\x2e\x36\
+\x38\x37\x20\x30\x2e\x30\x35\x33\x2c\x30\x20\x30\x2e\x31\x31\x33\
+\x2c\x2d\x30\x2e\x32\x33\x34\x20\x30\x2e\x32\x38\x32\x2c\x2d\x30\
+\x2e\x39\x33\x37\x20\x31\x2e\x39\x34\x31\x2c\x2d\x38\x2e\x30\x38\
+\x35\x20\x35\x2e\x34\x38\x36\x2c\x2d\x31\x33\x2e\x35\x32\x31\x20\
+\x31\x30\x2e\x39\x36\x38\x2c\x2d\x31\x36\x2e\x38\x31\x33\x20\x34\
+\x2e\x33\x32\x2c\x2d\x32\x2e\x35\x39\x34\x20\x39\x2e\x38\x30\x38\
+\x2c\x2d\x33\x2e\x36\x31\x32\x20\x31\x35\x2e\x37\x37\x38\x2c\x2d\
+\x32\x2e\x39\x36\x39\x20\x32\x2e\x37\x34\x2c\x30\x2e\x32\x39\x35\
+\x20\x35\x2e\x32\x31\x2c\x30\x2e\x39\x36\x20\x37\x2e\x33\x38\x2c\
+\x32\x20\x32\x2e\x37\x31\x2c\x31\x2e\x33\x30\x31\x20\x35\x2e\x31\
+\x38\x2c\x33\x2e\x33\x36\x31\x20\x36\x2e\x39\x34\x2c\x35\x2e\x38\
+\x31\x33\x20\x31\x2e\x35\x34\x2c\x32\x2e\x31\x35\x36\x20\x32\x2e\
+\x34\x36\x2c\x34\x2e\x35\x38\x34\x20\x32\x2e\x37\x35\x2c\x37\x2e\
+\x33\x31\x32\x20\x30\x2e\x30\x38\x2c\x30\x2e\x37\x35\x39\x20\x30\
+\x2e\x30\x35\x2c\x32\x2e\x34\x38\x20\x2d\x30\x2e\x30\x33\x2c\x33\
+\x2e\x32\x31\x39\x20\x2d\x30\x2e\x32\x33\x2c\x31\x2e\x38\x32\x36\
+\x20\x2d\x30\x2e\x37\x2c\x33\x2e\x33\x37\x38\x20\x2d\x31\x2e\x35\
+\x2c\x34\x2e\x39\x36\x39\x20\x2d\x30\x2e\x38\x31\x2c\x31\x2e\x35\
+\x39\x37\x20\x2d\x31\x2e\x34\x38\x2c\x32\x2e\x35\x31\x34\x20\x2d\
+\x32\x2e\x37\x36\x2c\x33\x2e\x38\x31\x32\x20\x2d\x32\x2e\x30\x33\
+\x2c\x32\x2e\x30\x37\x37\x20\x2d\x35\x2e\x31\x38\x2c\x34\x2e\x38\
+\x32\x39\x20\x2d\x31\x30\x2e\x37\x38\x2c\x39\x2e\x34\x30\x37\x20\
+\x2d\x33\x2e\x36\x2c\x32\x2e\x39\x34\x34\x20\x2d\x36\x2e\x30\x34\
+\x2c\x35\x2e\x31\x35\x36\x20\x2d\x38\x2e\x31\x32\x2c\x37\x2e\x33\
+\x34\x33\x20\x2d\x34\x2e\x39\x34\x33\x2c\x35\x2e\x31\x37\x39\x20\
+\x2d\x37\x2e\x31\x39\x31\x2c\x39\x2e\x30\x36\x39\x20\x2d\x38\x2e\
+\x35\x36\x34\x2c\x31\x34\x2e\x37\x31\x39\x20\x2d\x30\x2e\x39\x30\
+\x35\x2c\x33\x2e\x37\x32\x20\x2d\x31\x2e\x32\x35\x36\x2c\x37\x2e\
+\x35\x35\x20\x2d\x31\x2e\x31\x35\x36\x2c\x31\x33\x2e\x31\x39\x20\
+\x30\x2e\x30\x32\x35\x2c\x31\x2e\x34\x20\x30\x2e\x30\x36\x32\x2c\
+\x32\x2e\x37\x33\x20\x30\x2e\x30\x36\x32\x2c\x32\x2e\x39\x37\x20\
+\x76\x20\x30\x2e\x34\x33\x20\x68\x20\x32\x31\x2e\x35\x39\x38\x20\
+\x6c\x20\x30\x2e\x30\x33\x2c\x2d\x32\x2e\x34\x20\x63\x20\x30\x2e\
+\x30\x33\x2c\x2d\x33\x2e\x32\x37\x20\x30\x2e\x32\x31\x2c\x2d\x35\
+\x2e\x33\x37\x20\x30\x2e\x35\x36\x2c\x2d\x37\x2e\x34\x31\x20\x30\
+\x2e\x35\x37\x2c\x2d\x33\x2e\x32\x37\x20\x31\x2e\x34\x33\x2c\x2d\
+\x35\x20\x33\x2e\x39\x34\x2c\x2d\x37\x2e\x38\x31\x20\x31\x2e\x36\
+\x2c\x2d\x31\x2e\x38\x20\x33\x2e\x37\x2c\x2d\x33\x2e\x37\x36\x20\
+\x36\x2e\x39\x33\x2c\x2d\x36\x2e\x34\x37\x20\x34\x2e\x37\x37\x2c\
+\x2d\x33\x2e\x39\x39\x31\x20\x38\x2e\x31\x31\x2c\x2d\x36\x2e\x39\
+\x39\x20\x31\x31\x2e\x32\x36\x2c\x2d\x31\x30\x2e\x31\x32\x35\x20\
+\x34\x2e\x39\x31\x2c\x2d\x34\x2e\x39\x30\x37\x20\x37\x2e\x34\x36\
+\x2c\x2d\x38\x2e\x32\x36\x20\x39\x2e\x32\x38\x2c\x2d\x31\x32\x2e\
+\x31\x38\x37\x20\x31\x2e\x34\x33\x2c\x2d\x33\x2e\x30\x39\x32\x20\
+\x32\x2e\x32\x32\x2c\x2d\x36\x2e\x31\x36\x36\x20\x32\x2e\x34\x36\
+\x2c\x2d\x39\x2e\x35\x33\x32\x20\x30\x2e\x30\x36\x2c\x2d\x30\x2e\
+\x38\x31\x36\x20\x30\x2e\x30\x37\x2c\x2d\x33\x2e\x30\x33\x20\x30\
+\x2c\x2d\x33\x2e\x39\x36\x38\x20\x2d\x30\x2e\x34\x35\x2c\x2d\x37\
+\x2e\x30\x34\x33\x20\x2d\x33\x2e\x31\x2c\x2d\x31\x33\x2e\x32\x35\
+\x33\x20\x2d\x38\x2e\x31\x35\x2c\x2d\x31\x39\x2e\x30\x33\x32\x20\
+\x2d\x30\x2e\x38\x2c\x2d\x30\x2e\x39\x30\x39\x20\x2d\x32\x2e\x37\
+\x38\x2c\x2d\x32\x2e\x38\x38\x37\x20\x2d\x33\x2e\x37\x32\x2c\x2d\
+\x33\x2e\x37\x31\x38\x20\x2d\x34\x2e\x39\x36\x2c\x2d\x34\x2e\x33\
+\x39\x34\x20\x2d\x31\x30\x2e\x36\x39\x2c\x2d\x37\x2e\x33\x35\x33\
+\x20\x2d\x31\x37\x2e\x35\x36\x2c\x2d\x39\x2e\x30\x39\x34\x20\x2d\
+\x34\x2e\x31\x39\x2c\x2d\x31\x2e\x30\x36\x32\x20\x2d\x38\x2e\x32\
+\x33\x2c\x2d\x31\x2e\x36\x20\x2d\x31\x33\x2e\x33\x35\x2c\x2d\x31\
+\x2e\x37\x35\x20\x2d\x30\x2e\x37\x38\x2c\x2d\x30\x2e\x30\x32\x33\
+\x20\x2d\x31\x2e\x35\x39\x2c\x2d\x30\x2e\x30\x33\x36\x20\x2d\x32\
+\x2e\x33\x37\x2c\x2d\x30\x2e\x30\x33\x32\x20\x7a\x20\x6d\x20\x2d\
+\x31\x30\x2e\x39\x30\x38\x2c\x31\x30\x33\x2e\x36\x20\x76\x20\x32\
+\x32\x20\x68\x20\x32\x31\x2e\x39\x39\x38\x20\x76\x20\x2d\x32\x32\
+\x20\x7a\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\
+\x61\x70\x65\x3a\x63\x6f\x6e\x6e\x65\x63\x74\x6f\x72\x2d\x63\x75\
+\x72\x76\x61\x74\x75\x72\x65\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\x6c\x6c\x3a\x23\
+\x66\x35\x66\x35\x66\x35\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\
+\x69\x74\x79\x3a\x31\x22\x20\x2f\x3e\x0a\x20\x20\x3c\x2f\x67\x3e\
+\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\
+\x00\x00\x0d\x20\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\
+\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xd2\x00\xd2\x00\xd2\xec\xa6\
+\xc5\xe0\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\
+\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x0c\xc0\x49\x44\x41\x54\x78\
+\xda\xe5\x9b\x59\x73\x1b\xd7\x99\x86\x9f\xde\x37\x00\x8d\x8d\x04\
+\xc0\x05\xa4\x48\x6a\xa3\x6c\xc5\x72\xe4\xcc\xd8\x59\xa6\x52\xa3\
+\x9a\x49\xe5\x32\x17\x49\xe5\x2e\x3f\x21\x3f\xc5\x3f\xc1\x37\x53\
+\xae\x99\x9a\xf2\x5d\xa6\x2a\x15\x4d\x65\x2c\xcf\xb8\x2c\xc7\xa5\
+\x68\xb1\x2c\x6b\x97\x29\x73\x13\x37\x10\x04\xd0\x7b\xf7\x5c\x34\
+\x09\x8b\xe2\x06\x50\xb4\x2c\x5b\xdf\x25\xd9\xdd\xe8\xef\x3d\xdf\
+\x79\xdf\xf7\x7c\xa7\x8f\xc0\x33\xf1\x87\x8b\x7f\xfc\x2d\xf0\x1b\
+\xe0\x97\xc0\x20\x3f\x8c\x78\x02\xfc\x15\xf8\xe0\xbd\x0b\xef\xfe\
+\xc7\xd3\xff\x10\x9e\x4a\x7c\x18\x78\x1f\xf8\x39\x3f\xec\xf8\x08\
+\xf8\xfd\x7b\x17\xde\x9d\xed\x02\xb0\x99\xfc\x7f\x01\x67\x79\x35\
+\xe2\x3a\xf0\xeb\xf7\x2e\xbc\x3b\x2b\x6e\xfe\xe1\xfd\x57\x28\x79\
+\x36\x73\x7d\x1f\x40\xd8\x9c\xf3\xff\xce\xab\x19\xbf\x13\x37\x09\
+\xef\x55\x8d\xdf\xc8\x9b\x6c\xff\xd2\xc6\xc6\x52\x83\xa5\xfb\xb3\
+\x04\xbe\x8b\xdb\x6c\x23\x69\x12\x82\x20\x62\xda\x59\x86\xa7\xa7\
+\x50\x4c\x0d\x41\x10\x0e\xfb\xf8\x5f\xca\x2f\xab\xd4\xad\xcd\x2e\
+\x71\xff\xe3\xeb\x34\x17\xd7\xf6\xbc\xe6\xe1\xe5\x2f\xd1\x6c\x8d\
+\xc2\xc8\x20\xc5\xa1\x0a\x83\x53\x75\x44\x49\xec\xe7\x67\x06\x85\
+\x3f\x5c\xfc\x63\xf2\x32\x25\xee\x36\xdb\xdc\xbe\xf4\x77\x56\x1e\
+\x2d\xf4\x7d\xaf\x28\x0b\xe8\x79\x83\xf2\xf8\x10\xb5\xe3\x13\x98\
+\xc5\xec\x81\xd5\x21\xbf\x2c\x89\x87\x5e\xc0\xcc\xd5\x3b\x3c\xfa\
+\xdb\xad\x43\x3f\x23\x0e\x13\x3a\xcb\x1d\x66\x96\xef\x31\xf3\xd9\
+\x3d\x24\x4d\xc2\x2a\x65\xa9\x4c\xd5\x19\x9e\x9e\x4c\xab\xe3\x19\
+\x40\x5e\x0a\x00\xe6\x6f\x3d\xe2\xfe\x27\x9f\xe3\xb7\xdd\x23\x7d\
+\x6e\xe4\x45\x34\xe7\x1a\x34\xe7\x1a\xdc\xbd\x74\x1d\xa3\x64\x30\
+\x7a\x76\x8a\xa1\x93\xc7\x11\x65\xf1\xbb\x07\x60\x63\xa9\xc1\x9d\
+\x0f\xaf\xb0\xbe\xb0\xfa\x42\x7e\xcf\x59\x71\xb8\xfb\xd1\xe7\xb4\
+\xd7\x9a\x4c\xfd\xc3\x9b\x48\x8a\xf4\xdd\x00\x10\x7a\x01\xb7\x2f\
+\x5d\x61\xf1\xf6\xe3\x17\xfe\xdb\x49\x98\xb0\x32\x3f\x4b\xe1\x41\
+\x95\xc1\x13\x23\x2f\x1e\x80\xc7\x57\xef\xf2\xe0\xf2\xe7\x44\x41\
+\xf4\xdd\x11\xed\x62\xc8\xca\xe2\x0c\xa5\xf1\xda\x8b\x03\x60\x6d\
+\x76\x89\xdb\xff\x73\x85\xce\xda\xc6\x91\x3e\x57\x90\x05\xb4\x92\
+\x84\x28\x88\x84\x6e\x8c\xdf\x08\x7b\xab\xc2\xd8\x23\xf4\xc3\x6f\
+\x1f\x00\xb7\xd9\xe6\xe6\xc5\x4f\x59\x9f\x5b\x39\xf2\x67\xcb\x96\
+\x48\x6e\xdc\x22\x2b\x0c\x53\xac\x57\x91\x75\x85\xf5\xf9\x65\x1e\
+\x5c\xbd\x41\xe8\x84\xfb\xde\x47\x28\x21\x08\xc2\xb7\x07\xc0\x61\
+\x64\xcd\x3e\x95\xc3\x99\x77\xf0\xd7\x83\x9e\x46\x3e\x37\x6e\x51\
+\x2d\x9e\x61\x60\xba\x86\xa4\x48\x00\x64\x6b\x39\x72\xc3\x45\x3e\
+\xfb\xcf\xff\xde\xf3\x5e\xd5\x96\x50\x65\x0b\x59\x93\xbf\x1d\x00\
+\x96\x1e\xcc\x72\xfb\xc3\xbf\xf7\x2c\x6b\xe6\xb0\x49\x12\x27\x44\
+\x6e\x84\x31\x64\x20\x67\x14\x9c\x79\x87\x24\xde\xdb\xa3\x19\x83\
+\x32\x7a\x5c\xa0\x7c\xb2\xd2\x4d\x3e\x45\x46\x20\x57\x2d\x60\xe6\
+\x33\x74\x1a\xad\xbd\x2b\x27\x5f\x41\x90\xc5\xa3\x05\x60\x63\xa9\
+\xc1\xfd\x4f\x6e\xb0\xfa\xd5\x62\x7f\x06\x26\x88\x31\x2a\x3a\xfe\
+\x9a\x8f\x56\xd2\x10\x24\x01\x6f\xd9\x25\xf2\x92\x7d\x2a\x00\xb2\
+\x85\x41\x24\x6d\xf7\x14\x72\x83\xc5\xbd\x01\x90\x34\xac\x81\xec\
+\xd1\x4d\x81\xd0\x0b\xb8\xff\xc9\x0d\x66\x6f\x3c\x38\x9c\x83\xf3\
+\x22\x14\x5b\x41\x54\x45\x62\x37\xc2\x5d\x74\x91\xb3\x0a\x91\xe7\
+\xed\x23\x67\x20\xc8\x09\x7b\x19\x5d\xb7\xd5\xd9\x73\xf4\x65\x34\
+\x74\xdb\x38\x1a\x23\x94\xca\xda\x4d\xa2\xe0\x60\xf6\x95\x34\x89\
+\x38\x8a\x49\xc2\x64\x9b\x7f\xb7\x4f\xdb\xc4\x6e\x84\xb3\xe0\x22\
+\x9b\x12\xb9\x93\x39\x82\xf5\x00\x7f\xd5\xdf\x73\x1a\x78\xab\x21\
+\x1b\x8d\x25\xe2\xa8\x8e\x28\x4b\x3b\x88\xb7\x31\xb7\xbc\xe7\xfc\
+\xd7\x95\x02\xb2\xae\x3c\x1f\x00\x1b\x4b\x0d\xae\xff\xe9\xff\xf0\
+\x5a\x4e\x4f\xd7\x4b\x86\x44\xf1\x8d\x02\x9d\xaf\x3b\xb4\x1f\x77\
+\xb6\xf9\xf7\xe5\xbf\xad\xa0\x0f\x68\x64\xa7\xb2\x24\x61\x42\x12\
+\x26\xac\xdd\x68\xec\x6f\x73\xdd\x84\x95\xf9\x39\x2a\x73\x13\xd8\
+\xa3\xa5\xee\xa2\x27\xf4\x02\xae\xff\xe9\xe3\x3d\xef\x53\xb2\x12\
+\xb9\x72\x19\x51\x12\x0e\x07\x40\xe8\x05\xdc\xfc\xcb\xe5\xbe\x57\
+\x6b\x91\x13\x11\xb6\x42\xac\x51\x13\xf7\x89\x47\xe4\x7d\x63\x84\
+\x94\x8c\x4c\x76\x32\x0b\xc0\xea\xb5\x35\xf2\xd3\x36\x7a\x59\xc3\
+\x5d\xf6\xf6\x97\xd8\xa5\x90\x6b\x7f\xbe\x84\x3d\x54\xc4\xca\xe5\
+\x89\xc2\x88\xc5\x3b\x33\xfb\x9a\x2c\x45\x57\x31\xcb\x99\xee\xa2\
+\xa8\x2f\x00\x1e\x5e\xbe\xc9\xcc\xd5\x3b\x3d\xb9\x38\x51\x11\xc9\
+\x9d\xcc\xe2\x2d\x7b\x38\x0b\xa9\x1a\x6c\x3c\x6c\x51\x7c\xa3\x80\
+\x35\x6a\xd2\xbc\xf7\x8d\x21\xf2\xd7\x03\x56\x3e\x5b\x25\x33\x6e\
+\xa1\x97\x35\xda\x33\x6d\xc2\x76\x6f\x86\x26\xf2\x62\x56\x1f\x2e\
+\xb3\xca\xf2\x81\xd7\xaa\xb6\x84\xe8\x1a\x68\x39\xbd\xbf\xd5\x60\
+\xbf\xb2\x26\x19\x12\x91\x13\x21\x88\x02\x99\xf1\x0c\xde\xb2\x0f\
+\x12\x58\x23\x26\x00\x7a\x55\xa7\x33\xef\x6c\x4b\x32\xf2\x22\x9c\
+\x05\x27\x55\x80\x55\xff\x5b\xf1\x26\xb2\x25\x62\x18\x05\x64\x55\
+\xee\x0d\x00\xb7\xd9\xe6\xcb\x0f\xaf\xf4\x2c\x6b\x56\xdd\xc4\xac\
+\x19\xe9\xa8\x5c\x5d\xa3\x3d\xd3\x21\xff\x9a\x8d\x7d\x2a\x87\x9c\
+\x91\x89\x83\x98\x8d\xbb\x1b\x64\x8e\x65\xc8\x4e\x65\x58\xbb\xb6\
+\x7d\x9e\xf7\x62\x80\x9e\x27\xb4\x82\x82\x3d\x30\x80\xf0\x54\xd7\
+\x48\xde\xcf\xc5\x3d\xee\xb1\xdc\xd3\xe4\x2d\xcc\x21\x83\xce\x5c\
+\x07\x7f\x2d\x1d\x41\xbf\xe1\xe3\xaf\xf9\xa8\x05\x15\x67\xce\xa1\
+\xf5\xa8\x4d\x12\x27\x88\x9a\x88\x55\xb7\x50\x0b\x6a\xf7\xda\x5e\
+\x9a\x1d\x82\x08\x82\x78\xb8\xfe\x9f\x20\x0b\x48\x82\x8a\x59\xb2\
+\xf6\x6f\x88\xcc\xdf\x7a\xc4\x9d\x4b\x57\x7b\x92\xb5\x6d\xf3\x2b\
+\xaf\x10\xb4\x02\xda\x33\xdb\xf5\x77\xe3\x7e\x8b\xe2\xb9\x02\x92\
+\x2e\x75\x25\xad\xfd\xb8\x83\x56\xd0\xf6\x4f\xd8\x8f\x09\x5a\x21\
+\x5a\x51\x4d\xd7\xf2\xf3\x0e\x4a\x46\x46\x2d\xa8\x87\x02\x40\xb5\
+\x45\xe4\xd8\x40\xcd\xe8\xbb\x03\xb0\xb1\xd4\xe0\x8b\xbf\x7c\x4a\
+\x7b\xb5\x79\x30\x9a\xa2\x80\x5e\xd1\x71\x97\xdc\xae\xa6\x07\xcd\
+\x00\x73\xc4\x64\xf0\xed\x32\x6c\x8e\x92\xb3\xe0\xb0\x71\xbf\x85\
+\xbb\xe8\x62\x0c\x19\xa8\x79\x05\xbf\x11\x40\x92\xb2\xfd\x7e\xe1\
+\x37\x7c\xc2\x4e\x84\x6c\x48\x48\x86\x84\x3e\xa0\x75\xbb\x38\x87\
+\x09\xc5\x96\xb0\x8c\x32\x92\x2a\xed\x04\xe0\xf1\xd5\xbb\xdc\xfd\
+\xdf\x6b\x3d\x3f\xac\x74\xbe\x88\xa8\x8a\x18\x55\x9d\xc6\xcd\x75\
+\x62\x3f\xa6\xf5\x55\x9b\x38\x88\x51\x72\x0a\xb1\x17\x23\x6a\x22\
+\x46\xcd\x20\xd8\x08\x69\x7d\xd5\x46\x2b\x6b\xa8\x79\x35\x05\x60\
+\x4f\x7b\x07\x08\x69\xb9\x47\x4e\x84\x6c\x4a\x78\x6b\x3e\xa6\x61\
+\x20\xe9\xd2\xf3\x2d\x99\x33\x2a\xf6\xd0\xc0\x8e\x29\x24\x2f\x3d\
+\x98\xed\x2b\xf9\xd4\x84\xa4\x9a\x2e\x6a\x22\xa5\x73\x05\xd6\x3e\
+\x5f\x27\x6c\x87\x74\x66\x1d\x98\x4d\x8d\x91\x20\x09\x0c\xbc\xad\
+\x21\x69\x22\x49\x94\xb0\x76\x6d\x8d\xc8\x8b\xf7\x2c\x77\xe7\x49\
+\x5a\x4d\x4a\x46\x46\x2d\xaa\xa8\xa5\xf4\xde\xce\xac\x43\xb0\x11\
+\xa0\x64\x53\xe7\xe6\xaf\xf9\xc8\x96\x8c\xa8\xf6\x5e\x0d\xe6\x90\
+\x8c\xea\x15\xb0\x06\xb3\x3b\xe5\xfa\xe1\xe5\x9b\xfb\xeb\xb9\x2a\
+\x62\xd5\x4d\x32\x63\xdf\x90\x47\xd8\x0e\x11\x15\x81\xc6\x8d\x75\
+\x22\x3f\xa6\xf0\x7a\x1e\xad\xa4\x6e\x4a\x8d\x8c\x39\x6c\x50\x38\
+\x9b\x27\x09\x63\xdc\x27\x5e\x57\xaf\xf7\x2b\x77\xd9\x90\x30\x6b\
+\x06\x61\x27\xc4\x6f\x04\x28\x19\x19\x51\x11\x51\xb2\x32\x7e\x23\
+\xe8\xf2\x47\xe4\xc7\x84\x4e\xd4\x9f\xf4\xe5\x4c\xaa\x53\x93\x28\
+\xfa\x4e\xce\x17\x5b\x2b\xcd\x7d\x88\x4d\xa5\xf4\x66\x11\xa3\x6a\
+\x20\xc8\xdf\x94\x4e\xd8\x0a\x91\xb3\x0a\x88\xe9\xdc\x17\x36\xfd\
+\xbc\x51\xd1\x51\x72\x0a\x99\x31\x8b\xb0\x15\xb2\x7a\xb5\xb1\xcd\
+\xf1\x75\x2b\x3d\x4e\xba\x0a\x91\x44\x09\x08\x02\x71\x98\xaa\x83\
+\x5a\x50\x09\x36\x82\x2e\xb7\xa8\x79\x15\x12\x08\x36\x52\x52\x96\
+\x0d\x09\x51\x16\x7a\x2e\xfd\xcc\xa8\x4e\xd1\x9a\xc4\x1e\x2d\xee\
+\x68\x89\x03\xc8\xaa\xa5\xe1\xb7\x77\xb1\x9c\x02\xe4\x8e\x67\x09\
+\x9a\x01\x8d\x5b\xeb\xe9\xfc\x7c\x6a\x0a\x00\x94\xcf\x17\x49\x62\
+\x68\x3f\x6a\xa3\x16\x55\xb2\xc7\xb3\x34\x6f\x37\x79\xf2\xf1\xf2\
+\x01\x16\xd6\xeb\x36\x28\xc3\x76\x88\x5a\x54\x37\xed\x71\x8c\x92\
+\x49\x89\x32\x68\x87\xa8\xb6\x82\x20\xa5\x84\x2b\x2a\xe9\xcb\x2b\
+\x39\xa5\x37\x33\xa6\x0b\xe4\x26\x0d\x0a\xf2\x24\xd5\xd7\x47\xf7\
+\x24\x50\xb9\x3c\x56\x63\xee\x8b\x47\xbb\x2c\x1a\x14\x44\x4d\xa4\
+\x73\xa7\xb3\x2d\x79\x80\xa0\x95\x8e\x86\xdf\x0c\x58\xff\xb2\x49\
+\x12\x26\x74\xe6\x1d\x54\x5b\xd9\xdb\xc5\x6d\x12\xdc\x16\x80\xfa\
+\x80\x8e\xa4\x8b\x74\xbe\x76\x88\x3a\x11\x92\x2e\xe2\x2d\x7b\x18\
+\x35\x1d\x51\x11\xe1\xa9\x55\xa0\xa4\xf5\xc7\xfe\x56\x5d\x41\xd3\
+\x4d\x4a\xe6\x04\xb5\x1f\xd5\xbb\x2b\xbf\x5d\x01\x98\x7c\xe7\x2c\
+\x0b\x77\x66\x88\xc3\xf8\x99\xf5\x76\xdc\x45\xfc\x59\x87\x96\x44\
+\x29\x4b\x0b\x82\xd0\x2d\xd5\x24\x4a\xf6\x4c\xde\x5b\xf6\x08\x5a\
+\x61\x2a\x9f\x03\x1a\x92\x2e\x11\x34\x03\x64\x53\x47\x2d\xaa\x78\
+\xcb\x1e\xe6\xb0\x81\xfb\xc4\xa3\x3d\xd3\x41\x10\x85\x2e\xa7\xf4\
+\xa7\xf5\x12\x99\x11\x1d\x23\xaa\x32\x34\x7d\x0c\xab\x92\x3b\x70\
+\xaf\x50\x56\x74\x95\x89\x9f\x9c\xe1\xde\xc7\x37\xb6\xbb\xc1\x4e\
+\x44\xd4\x09\x31\x87\x4d\x3a\xf3\x4e\x37\xd1\x2d\x06\x0e\xdb\x61\
+\x3a\x7f\x0f\x72\x70\x9b\x86\xc6\x1c\x31\x09\x1a\x3e\xee\x92\xd7\
+\x4d\x3a\x72\x22\x94\x8c\x8c\xb7\xec\x91\x44\x09\xe6\x90\x41\xe4\
+\x45\x88\xaa\xd8\x97\xe3\x93\x74\x81\xcc\x98\x86\x16\x17\xa8\xd6\
+\x26\xc9\x8f\x97\xf6\x1d\xf5\x1d\x3e\xa0\x7e\xee\x04\xb3\xb7\x1e\
+\xe0\xac\xb5\xb7\xbb\xb8\x87\x6d\xf2\x67\x6c\x0a\xaf\xe5\x69\x3d\
+\x6a\x23\x5b\x12\xd6\xa8\x85\xb3\xe8\xd2\xbc\xb7\xb1\xad\xb1\xb1\
+\x1d\xbc\x90\x60\x23\x44\xb1\xe4\xae\x7e\x27\x61\x8c\x56\xd2\x88\
+\xdc\x0e\x91\x9b\x26\xee\x2e\x79\x28\x59\x79\x93\xb0\x44\x10\xe8\
+\x4b\xef\x05\x59\x48\xcb\x9d\x0c\xa5\xfc\x38\x03\x27\x87\x50\xb3\
+\xfd\x6d\x97\x8b\x5b\x8d\xc4\xe3\xef\xbc\xb1\x53\x9e\xd6\x7c\x5a\
+\x0f\x5b\xc8\x19\x99\xfc\x6b\x36\x99\xf1\x0c\x9d\x39\x87\xd6\xc3\
+\xd6\x9e\xc9\x47\x4e\x84\xb7\xec\x21\x2a\x22\xee\x8a\x47\xd8\x09\
+\x91\x74\x31\x35\x40\x02\x28\x79\x95\xb0\x15\xa2\x95\x35\x14\x5b\
+\x21\x0e\x62\xf4\x41\xbd\x67\x66\xdf\x0a\xbd\x22\x93\x9f\xc8\x50\
+\x34\xc7\x99\xfc\xf1\x79\x86\xde\x1c\x47\xcb\xe9\x7d\x7f\x2b\xd0\
+\x15\xc6\xf2\xb1\x1a\x56\x29\x4b\x7b\x65\xfb\xc6\x45\x67\xd6\xc1\
+\x5d\xf2\x90\x0d\x89\xb0\x1d\x12\xef\x92\x78\x12\xa7\x5d\x1c\x51\
+\x15\x89\xbc\x08\x41\x12\xd1\x8a\x6a\x77\x69\xbb\xd5\xdc\x08\x9a\
+\x41\x4a\x70\xdd\x39\xab\x00\x4a\x5f\x2f\x9c\x96\xbb\x8e\x11\x97\
+\xa8\x4e\x4c\x62\xd7\x0b\x48\xea\xe1\x3b\x7b\xdb\xee\x7c\xfd\x57\
+\xef\xf0\xc9\xbf\xfd\x79\xd7\x79\xec\xfb\xfb\xb8\xb8\x05\x97\x24\
+\x4e\x90\x4d\x09\x25\x9b\xca\x58\xe4\x46\xa8\xb6\x42\xd8\x0a\x88\
+\xbc\x08\xad\xa4\xe1\xad\x7a\x90\xf4\x2e\x65\xcf\x26\x6e\x54\x14\
+\x0c\x2d\x47\x69\x60\x9c\xf2\x54\x0d\xd5\x52\x77\xd5\xf6\x43\x03\
+\x60\x16\xb2\x94\xc6\xab\x7d\xb5\xbb\xfc\xf5\x00\xc9\x94\x50\x6d\
+\x05\x67\xde\x45\x90\x42\x24\x7d\xd3\xc3\xd7\x0c\x64\x4b\x26\xec\
+\xa4\x00\xc8\xa6\x04\x09\xdb\x4c\x55\x6f\x56\x56\x41\xb7\x0d\x72\
+\xea\x08\xd5\xd3\x75\x8c\xa2\x75\xe8\x65\xf1\xee\x1c\xf0\x54\x4c\
+\xff\xf3\x5b\xfb\xae\xba\x92\x38\xc1\x5b\xf1\x70\x97\x3c\x92\xcd\
+\x35\x7a\xec\xc7\x88\x8a\x88\x5a\x54\x53\xf2\xcb\xca\x24\x41\x82\
+\xb3\xe8\x12\x76\xa2\x6e\xd9\x0b\x92\xd0\x57\xf2\xaa\x2d\x91\x3f\
+\x65\x92\xcf\x0e\x73\xec\xf8\x79\xc6\xdf\x3e\x89\x59\xce\x1c\x59\
+\xf2\xbb\xf6\x03\x14\x43\x63\x68\x7a\x82\xaf\xaf\xdf\xdb\xdd\xc5\
+\x3d\x71\xd3\xb2\x4b\xa0\x33\xe7\xa0\x95\xd3\xa4\xb7\x24\x2d\x58\
+\xf7\xd3\x8d\x8e\x9a\x9e\x56\x87\x26\xf6\x5d\xf2\x82\x2c\x90\x19\
+\x53\xd1\x45\x9b\x4a\x6d\x8a\xc2\xb1\x32\x8a\xa1\x3c\x77\xb9\xf7\
+\x04\x00\xc0\xf1\x9f\xff\x88\x85\x3b\x5f\x11\xba\xc1\xae\x4d\x48\
+\xbd\xa4\x21\x99\x12\xce\x9c\x43\xd8\x8e\x90\x2d\x09\x6f\xc5\xc3\
+\xa8\x19\xa9\x9c\x25\x69\x53\x54\x2f\x6b\x7d\xbf\x90\x55\x57\xd0\
+\x0d\x0b\x3b\x33\x42\xe5\xe4\x28\x7a\xde\x3c\xd2\x11\x3f\x70\x0a\
+\xa4\xaa\x28\x70\xe2\x67\xe7\x76\x47\xcc\x94\x09\x5a\x01\x82\x28\
+\xa0\x16\xd4\xd4\xcb\xdb\x2a\x82\x2c\xd2\x7e\xdc\x21\x09\x62\x64\
+\xab\x7f\x56\xd6\x4a\x12\x85\x53\x19\x0a\xd9\x51\x8e\x4d\x9f\xa7\
+\xfe\xd6\x89\x23\x9d\xeb\x7d\x55\x00\x40\xf5\x54\x9d\x47\x57\xbe\
+\xa0\xb3\xba\x7d\x7f\x4d\xcd\x29\x74\xe6\x1d\x82\x56\x88\x92\x91\
+\x61\xd9\x23\xf6\x63\x8c\xaa\x9e\x72\x81\x2a\xf6\xcd\xee\x99\x31\
+\x1d\x3d\x2c\x52\xa9\x4f\x90\xaf\x97\x90\xf5\x17\xf7\xdd\xc6\xbe\
+\x6f\x7b\xf6\x57\x3f\xdd\x79\xc3\xe6\x9c\xf6\x57\xfd\xd4\xfb\x27\
+\x74\x93\xee\x37\x79\xab\xae\x50\x18\x2b\x50\xc9\x9f\x66\xea\x67\
+\xe7\x28\x1f\x1f\x7c\xa1\xc9\x1f\xd8\x16\x37\x8b\x59\x4a\x63\x55\
+\x56\xbe\xda\x2e\x8b\x5a\x51\x45\x94\x05\x22\x2f\xdd\xd5\xed\x37\
+\x71\xad\x24\x91\xa9\x9a\x58\x0c\x53\x3b\x33\x86\x59\xb2\xb6\xb5\
+\xaa\x5f\x64\x1c\xf8\xab\xd3\x17\xde\xda\xd5\xa6\x2a\x39\x25\x5d\
+\xd9\x19\xbd\x7b\x77\xd9\x12\xb1\x4f\x1a\x14\x4a\x35\xea\x63\x3f\
+\xe6\xd8\x4f\x4f\x61\x0d\x66\xbf\xb3\xe4\x7b\xda\x19\x52\x0c\x8d\
+\xa1\xd3\x13\x7c\x7d\xe3\xfe\x73\x35\x25\x33\x63\x2a\xba\x60\x53\
+\x1e\x1c\xa3\x34\x59\x3d\x12\x17\xf7\x42\x00\x00\x38\xfe\x8b\x37\
+\x58\xb8\x3b\xb3\xab\x2c\xf6\x24\x6b\x96\x41\x4e\x1f\xa5\x72\x72\
+\xf4\x85\x30\xfb\x91\x03\xb0\x25\x8b\x5f\x5c\xfc\xb4\x2f\x17\x67\
+\x8d\x68\x98\x51\x85\xea\x89\x09\xb2\xb5\xdc\x8e\x7d\xfc\xef\x0d\
+\x00\x5b\xb2\xf8\xe0\xf2\x0d\xdc\x0d\xe7\x40\x59\xb3\x46\x34\x74\
+\xc9\xa6\x52\x99\xa2\x30\x51\xee\xb9\x39\xf1\x52\x92\xe0\xd3\x71\
+\xe6\x5f\xde\x3e\xb0\x39\x91\xaf\x17\x18\xcc\x9f\x62\xea\x27\xe7\
+\x29\x9f\xae\xbe\xd4\xc9\xf7\x55\x01\x00\x76\xad\xc8\x6b\xff\xfa\
+\x8f\xdc\xbc\x78\x79\x5b\x3b\x4c\x2b\x49\x98\x03\x06\x19\xa9\x46\
+\x6d\xfa\x18\x66\x39\xd3\xef\x77\xfb\xdf\x0f\x00\x00\x06\xa7\x86\
+\xd1\xcc\x7f\xe2\xf1\xcd\xdb\xf8\x61\x1b\x41\x00\x43\xcd\x33\x30\
+\x36\x8e\x3d\x5a\x44\xd6\x64\xbe\x4f\x21\x93\x1e\x2a\xec\xfd\xd4\
+\x88\x20\x60\x0f\x97\xc9\x56\x8a\x84\x6e\x40\x12\xc5\x48\xba\x82\
+\xac\x4a\x2f\x85\xac\xf5\x19\x4f\x44\xd2\x13\x95\xfd\x93\x87\x2c\
+\xa2\x66\x34\x34\xdb\x48\x47\xfd\xfb\x97\x3c\xc0\x5f\x45\xe0\x03\
+\x5e\xdd\xf8\x60\xeb\xe4\xe8\x25\x7e\xf8\x47\x66\x9f\x8d\x8f\xde\
+\xbb\xf0\xee\x2f\xb6\xa8\xfa\xf7\xa4\xc7\x49\x5f\x95\xb8\xbe\x99\
+\x73\xea\x03\x36\x0f\x12\xff\x9a\xf4\x60\xf1\x0f\x7e\xe4\xd9\x3c\
+\x37\x0c\xec\xfc\xd4\xf6\x55\x3b\x3e\xff\xff\x93\xbb\x3b\x4d\xe4\
+\xd6\x78\x6f\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x13\x80\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x35\x2e\x31\x2e\x30\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x34\x30\x2e\x34\x36\x70\x78\x22\x20\x68\x65\x69\x67\
+\x68\x74\x3d\x22\x34\x30\x2e\x34\x36\x70\x78\x22\x20\x76\x69\x65\
+\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x34\x30\x2e\x34\x36\x20\
+\x34\x30\x2e\x34\x36\x22\x20\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\
+\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\x77\x20\x30\x20\
+\x30\x20\x34\x30\x2e\x34\x36\x20\x34\x30\x2e\x34\x36\x22\x20\x78\
+\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\
+\x76\x65\x22\x3e\x0d\x0a\x3c\x72\x61\x64\x69\x61\x6c\x47\x72\x61\
+\x64\x69\x65\x6e\x74\x20\x69\x64\x3d\x22\x53\x56\x47\x49\x44\x5f\
+\x31\x5f\x22\x20\x63\x78\x3d\x22\x33\x30\x35\x2e\x38\x30\x38\x31\
+\x22\x20\x63\x79\x3d\x22\x2d\x33\x35\x34\x2e\x39\x38\x31\x34\x22\
+\x20\x72\x3d\x22\x32\x30\x2e\x31\x32\x36\x33\x22\x20\x66\x78\x3d\
+\x22\x32\x39\x32\x2e\x39\x38\x30\x39\x22\x20\x66\x79\x3d\x22\x2d\
+\x33\x35\x34\x2e\x38\x39\x34\x22\x20\x67\x72\x61\x64\x69\x65\x6e\
+\x74\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\
+\x69\x78\x28\x31\x20\x30\x20\x30\x20\x2d\x31\x20\x2d\x32\x38\x35\
+\x2e\x37\x36\x39\x35\x20\x2d\x33\x33\x34\x2e\x37\x37\x30\x35\x29\
+\x22\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\x3d\
+\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\x22\
+\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\x65\
+\x74\x3d\x22\x30\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\
+\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x46\x46\x46\x46\x46\x46\x22\
+\x2f\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\
+\x65\x74\x3d\x22\x30\x2e\x36\x35\x22\x20\x73\x74\x79\x6c\x65\x3d\
+\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x44\x30\x44\
+\x32\x44\x33\x22\x2f\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\
+\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\x22\x20\x73\x74\x79\x6c\x65\
+\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x44\x30\
+\x44\x32\x44\x33\x22\x2f\x3e\x0d\x0a\x3c\x2f\x72\x61\x64\x69\x61\
+\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\x0d\x0a\x3c\x63\x69\x72\
+\x63\x6c\x65\x20\x66\x69\x6c\x6c\x3d\x22\x75\x72\x6c\x28\x23\x53\
+\x56\x47\x49\x44\x5f\x31\x5f\x29\x22\x20\x63\x78\x3d\x22\x32\x30\
+\x2e\x30\x33\x38\x22\x20\x63\x79\x3d\x22\x32\x30\x2e\x32\x31\x31\
+\x22\x20\x72\x3d\x22\x31\x39\x2e\x37\x32\x39\x22\x2f\x3e\x0d\x0a\
+\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x39\x45\
+\x43\x33\x31\x22\x20\x64\x3d\x22\x4d\x32\x30\x2e\x32\x31\x34\x2c\
+\x30\x2e\x37\x31\x38\x6c\x2d\x30\x2e\x30\x37\x31\x2c\x31\x39\x2e\
+\x36\x31\x39\x4c\x32\x2e\x37\x35\x32\x2c\x32\x39\x2e\x34\x31\x43\
+\x36\x2e\x30\x32\x38\x2c\x33\x35\x2e\x36\x37\x37\x2c\x31\x32\x2e\
+\x35\x38\x2c\x33\x39\x2e\x39\x36\x2c\x32\x30\x2e\x31\x34\x33\x2c\
+\x33\x39\x2e\x39\x36\x0d\x0a\x09\x63\x31\x30\x2e\x38\x33\x37\x2c\
+\x30\x2c\x31\x39\x2e\x36\x32\x32\x2d\x38\x2e\x37\x38\x35\x2c\x31\
+\x39\x2e\x36\x32\x32\x2d\x31\x39\x2e\x36\x32\x33\x43\x33\x39\x2e\
+\x37\x36\x35\x2c\x39\x2e\x35\x32\x34\x2c\x33\x31\x2e\x30\x31\x38\
+\x2c\x30\x2e\x37\x35\x37\x2c\x32\x30\x2e\x32\x31\x34\x2c\x30\x2e\
+\x37\x31\x38\x7a\x22\x2f\x3e\x0d\x0a\x3c\x72\x61\x64\x69\x61\x6c\
+\x47\x72\x61\x64\x69\x65\x6e\x74\x20\x69\x64\x3d\x22\x53\x56\x47\
+\x49\x44\x5f\x32\x5f\x22\x20\x63\x78\x3d\x22\x33\x30\x35\x2e\x38\
+\x30\x38\x31\x22\x20\x63\x79\x3d\x22\x2d\x33\x35\x34\x2e\x39\x38\
+\x31\x39\x22\x20\x72\x3d\x22\x31\x39\x2e\x37\x35\x30\x32\x22\x20\
+\x67\x72\x61\x64\x69\x65\x6e\x74\x54\x72\x61\x6e\x73\x66\x6f\x72\
+\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\x28\x31\x20\x30\x20\x30\x20\
+\x2d\x31\x20\x2d\x32\x38\x35\x2e\x37\x36\x39\x35\x20\x2d\x33\x33\
+\x34\x2e\x37\x37\x30\x35\x29\x22\x20\x67\x72\x61\x64\x69\x65\x6e\
+\x74\x55\x6e\x69\x74\x73\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\
+\x65\x4f\x6e\x55\x73\x65\x22\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\
+\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x30\x22\x20\x73\x74\x79\
+\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\
+\x46\x39\x45\x43\x33\x31\x22\x2f\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\
+\x70\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\x22\x20\x73\x74\
+\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\
+\x23\x46\x46\x46\x46\x46\x46\x22\x2f\x3e\x0d\x0a\x3c\x2f\x72\x61\
+\x64\x69\x61\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\x0d\x0a\x3c\
+\x63\x69\x72\x63\x6c\x65\x20\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\
+\x30\x2e\x34\x22\x20\x66\x69\x6c\x6c\x3d\x22\x75\x72\x6c\x28\x23\
+\x53\x56\x47\x49\x44\x5f\x32\x5f\x29\x22\x20\x65\x6e\x61\x62\x6c\
+\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\
+\x77\x20\x20\x20\x20\x22\x20\x63\x78\x3d\x22\x32\x30\x2e\x30\x33\
+\x38\x22\x20\x63\x79\x3d\x22\x32\x30\x2e\x32\x31\x32\x22\x20\x72\
+\x3d\x22\x31\x39\x2e\x37\x35\x31\x22\x2f\x3e\x0d\x0a\x3c\x70\x61\
+\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\x35\x38\x35\x39\x35\x42\
+\x22\x20\x64\x3d\x22\x4d\x32\x30\x2e\x32\x33\x31\x2c\x34\x30\x2e\
+\x34\x35\x38\x63\x2d\x31\x31\x2e\x31\x35\x34\x2c\x30\x2d\x32\x30\
+\x2e\x32\x32\x39\x2d\x39\x2e\x30\x37\x33\x2d\x32\x30\x2e\x32\x32\
+\x39\x2d\x32\x30\x2e\x32\x32\x39\x63\x30\x2d\x31\x31\x2e\x31\x35\
+\x35\x2c\x39\x2e\x30\x37\x35\x2d\x32\x30\x2e\x32\x32\x39\x2c\x32\
+\x30\x2e\x32\x32\x39\x2d\x32\x30\x2e\x32\x32\x39\x0d\x0a\x09\x63\
+\x31\x31\x2e\x31\x35\x34\x2c\x30\x2c\x32\x30\x2e\x32\x32\x39\x2c\
+\x39\x2e\x30\x37\x35\x2c\x32\x30\x2e\x32\x32\x39\x2c\x32\x30\x2e\
+\x32\x32\x39\x43\x34\x30\x2e\x34\x36\x2c\x33\x31\x2e\x33\x38\x34\
+\x2c\x33\x31\x2e\x33\x38\x34\x2c\x34\x30\x2e\x34\x35\x38\x2c\x32\
+\x30\x2e\x32\x33\x31\x2c\x34\x30\x2e\x34\x35\x38\x7a\x20\x4d\x32\
+\x30\x2e\x32\x33\x31\x2c\x31\x2e\x30\x30\x31\x0d\x0a\x09\x43\x39\
+\x2e\x36\x32\x37\x2c\x31\x2e\x30\x30\x31\x2c\x31\x2e\x30\x30\x32\
+\x2c\x39\x2e\x36\x32\x37\x2c\x31\x2e\x30\x30\x32\x2c\x32\x30\x2e\
+\x32\x33\x63\x30\x2c\x31\x30\x2e\x36\x30\x34\x2c\x38\x2e\x36\x32\
+\x36\x2c\x31\x39\x2e\x32\x32\x39\x2c\x31\x39\x2e\x32\x32\x39\x2c\
+\x31\x39\x2e\x32\x32\x39\x63\x31\x30\x2e\x36\x30\x33\x2c\x30\x2c\
+\x31\x39\x2e\x32\x32\x39\x2d\x38\x2e\x36\x32\x35\x2c\x31\x39\x2e\
+\x32\x32\x39\x2d\x31\x39\x2e\x32\x32\x39\x0d\x0a\x09\x43\x33\x39\
+\x2e\x34\x35\x38\x2c\x39\x2e\x36\x32\x37\x2c\x33\x30\x2e\x38\x33\
+\x33\x2c\x31\x2e\x30\x30\x31\x2c\x32\x30\x2e\x32\x33\x31\x2c\x31\
+\x2e\x30\x30\x31\x7a\x22\x2f\x3e\x0d\x0a\x3c\x72\x61\x64\x69\x61\
+\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\x20\x69\x64\x3d\x22\x53\x56\
+\x47\x49\x44\x5f\x33\x5f\x22\x20\x63\x78\x3d\x22\x2d\x33\x37\x2e\
+\x36\x31\x31\x38\x22\x20\x63\x79\x3d\x22\x33\x39\x2e\x39\x31\x35\
+\x35\x22\x20\x72\x3d\x22\x37\x2e\x34\x33\x33\x36\x22\x20\x67\x72\
+\x61\x64\x69\x65\x6e\x74\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\
+\x22\x6d\x61\x74\x72\x69\x78\x28\x31\x2e\x36\x34\x20\x2d\x30\x2e\
+\x31\x36\x31\x32\x20\x30\x2e\x30\x38\x39\x37\x20\x30\x2e\x39\x31\
+\x33\x32\x20\x37\x37\x2e\x32\x37\x37\x31\x20\x2d\x33\x34\x2e\x35\
+\x30\x33\x34\x29\x22\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\
+\x69\x74\x73\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\
+\x55\x73\x65\x22\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\
+\x66\x66\x73\x65\x74\x3d\x22\x30\x2e\x32\x35\x22\x20\x73\x74\x79\
+\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\
+\x46\x46\x46\x46\x46\x46\x22\x2f\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\
+\x70\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\x22\x20\x73\x74\
+\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\
+\x23\x46\x46\x46\x46\x46\x46\x3b\x73\x74\x6f\x70\x2d\x6f\x70\x61\
+\x63\x69\x74\x79\x3a\x30\x22\x2f\x3e\x0d\x0a\x3c\x2f\x72\x61\x64\
+\x69\x61\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\x0d\x0a\x3c\x70\
+\x61\x74\x68\x20\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x30\x2e\x37\
+\x22\x20\x66\x69\x6c\x6c\x3d\x22\x75\x72\x6c\x28\x23\x53\x56\x47\
+\x49\x44\x5f\x33\x5f\x29\x22\x20\x64\x3d\x22\x4d\x33\x31\x2e\x33\
+\x36\x34\x2c\x36\x2e\x38\x31\x31\x63\x30\x2e\x33\x36\x38\x2c\x33\
+\x2e\x37\x35\x2d\x34\x2e\x37\x39\x31\x2c\x37\x2e\x33\x32\x35\x2d\
+\x31\x31\x2e\x35\x32\x34\x2c\x37\x2e\x39\x38\x37\x53\x37\x2e\x33\
+\x34\x39\x2c\x31\x32\x2e\x39\x35\x37\x2c\x36\x2e\x39\x38\x2c\x39\
+\x2e\x32\x30\x37\x0d\x0a\x09\x63\x2d\x30\x2e\x33\x36\x38\x2d\x33\
+\x2e\x37\x34\x39\x2c\x34\x2e\x37\x39\x32\x2d\x37\x2e\x33\x32\x34\
+\x2c\x31\x31\x2e\x35\x32\x35\x2d\x37\x2e\x39\x38\x36\x53\x33\x30\
+\x2e\x39\x39\x35\x2c\x33\x2e\x30\x36\x32\x2c\x33\x31\x2e\x33\x36\
+\x34\x2c\x36\x2e\x38\x31\x31\x7a\x22\x2f\x3e\x0d\x0a\x3c\x70\x61\
+\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\x32\x33\x31\x46\x32\x30\
+\x22\x20\x64\x3d\x22\x4d\x38\x2e\x30\x34\x33\x2c\x32\x37\x2e\x36\
+\x35\x63\x2d\x30\x2e\x33\x35\x39\x2c\x30\x2d\x30\x2e\x37\x30\x37\
+\x2d\x30\x2e\x31\x39\x33\x2d\x30\x2e\x38\x38\x36\x2d\x30\x2e\x35\
+\x33\x33\x63\x2d\x30\x2e\x32\x35\x37\x2d\x30\x2e\x34\x38\x38\x2d\
+\x30\x2e\x30\x36\x39\x2d\x31\x2e\x30\x39\x35\x2c\x30\x2e\x34\x31\
+\x39\x2d\x31\x2e\x33\x35\x32\x6c\x31\x31\x2e\x36\x35\x34\x2d\x36\
+\x2e\x31\x33\x38\x76\x2d\x39\x2e\x33\x31\x33\x0d\x0a\x09\x63\x30\
+\x2d\x30\x2e\x35\x35\x32\x2c\x30\x2e\x34\x34\x37\x2d\x31\x2c\x31\
+\x2d\x31\x73\x31\x2c\x30\x2e\x34\x34\x38\x2c\x31\x2c\x31\x76\x39\
+\x2e\x39\x31\x36\x63\x30\x2c\x30\x2e\x33\x37\x31\x2d\x30\x2e\x32\
+\x30\x35\x2c\x30\x2e\x37\x31\x31\x2d\x30\x2e\x35\x33\x34\x2c\x30\
+\x2e\x38\x38\x35\x6c\x2d\x31\x32\x2e\x31\x38\x38\x2c\x36\x2e\x34\
+\x32\x43\x38\x2e\x33\x36\x2c\x32\x37\x2e\x36\x31\x33\x2c\x38\x2e\
+\x32\x2c\x32\x37\x2e\x36\x35\x2c\x38\x2e\x30\x34\x33\x2c\x32\x37\
+\x2e\x36\x35\x7a\x22\x2f\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x66\
+\x69\x6c\x6c\x3d\x22\x23\x32\x33\x31\x46\x32\x30\x22\x20\x64\x3d\
+\x22\x4d\x32\x30\x2e\x33\x32\x35\x2c\x33\x37\x2e\x38\x32\x31\x48\
+\x32\x30\x2e\x32\x63\x2d\x30\x2e\x36\x38\x39\x2c\x30\x2d\x31\x2e\
+\x32\x35\x2d\x30\x2e\x35\x35\x39\x2d\x31\x2e\x32\x35\x2d\x31\x2e\
+\x32\x35\x63\x30\x2d\x30\x2e\x36\x38\x38\x2c\x30\x2e\x35\x36\x31\
+\x2d\x31\x2e\x32\x35\x2c\x31\x2e\x32\x35\x2d\x31\x2e\x32\x35\x68\
+\x30\x2e\x31\x30\x37\x0d\x0a\x09\x63\x30\x2e\x36\x39\x2c\x30\x2c\
+\x31\x2e\x32\x35\x39\x2c\x30\x2e\x35\x36\x32\x2c\x31\x2e\x32\x35\
+\x39\x2c\x31\x2e\x32\x35\x43\x32\x31\x2e\x35\x36\x36\x2c\x33\x37\
+\x2e\x32\x36\x32\x2c\x32\x31\x2e\x30\x31\x34\x2c\x33\x37\x2e\x38\
+\x32\x31\x2c\x32\x30\x2e\x33\x32\x35\x2c\x33\x37\x2e\x38\x32\x31\
+\x7a\x20\x4d\x31\x32\x2e\x31\x33\x34\x2c\x33\x35\x2e\x36\x38\x32\
+\x63\x2d\x30\x2e\x32\x31\x2c\x30\x2d\x30\x2e\x34\x32\x31\x2d\x30\
+\x2e\x30\x35\x34\x2d\x30\x2e\x36\x31\x36\x2d\x30\x2e\x31\x36\x33\
+\x0d\x0a\x09\x6c\x2d\x30\x2e\x31\x32\x35\x2d\x30\x2e\x30\x37\x31\
+\x63\x2d\x30\x2e\x35\x39\x36\x2d\x30\x2e\x33\x35\x32\x2d\x30\x2e\
+\x37\x39\x33\x2d\x31\x2e\x31\x31\x36\x2d\x30\x2e\x34\x34\x33\x2d\
+\x31\x2e\x37\x31\x32\x63\x30\x2e\x33\x35\x31\x2d\x30\x2e\x35\x39\
+\x35\x2c\x31\x2e\x31\x31\x37\x2d\x30\x2e\x37\x39\x32\x2c\x31\x2e\
+\x37\x31\x32\x2d\x30\x2e\x34\x34\x31\x6c\x30\x2e\x30\x39\x31\x2c\
+\x30\x2e\x30\x35\x32\x0d\x0a\x09\x63\x30\x2e\x36\x2c\x30\x2e\x33\
+\x34\x31\x2c\x30\x2e\x38\x31\x31\x2c\x31\x2e\x31\x30\x34\x2c\x30\
+\x2e\x34\x37\x2c\x31\x2e\x37\x30\x34\x43\x31\x32\x2e\x39\x39\x33\
+\x2c\x33\x35\x2e\x34\x35\x35\x2c\x31\x32\x2e\x35\x36\x39\x2c\x33\
+\x35\x2e\x36\x38\x32\x2c\x31\x32\x2e\x31\x33\x34\x2c\x33\x35\x2e\
+\x36\x38\x32\x7a\x20\x4d\x32\x38\x2e\x33\x38\x2c\x33\x35\x2e\x36\
+\x35\x31\x63\x2d\x30\x2e\x34\x33\x37\x2c\x30\x2d\x30\x2e\x38\x35\
+\x37\x2d\x30\x2e\x32\x32\x39\x2d\x31\x2e\x30\x38\x38\x2d\x30\x2e\
+\x36\x33\x33\x0d\x0a\x09\x63\x2d\x30\x2e\x33\x34\x32\x2d\x30\x2e\
+\x36\x30\x33\x2d\x30\x2e\x31\x33\x31\x2d\x31\x2e\x33\x36\x34\x2c\
+\x30\x2e\x34\x37\x2d\x31\x2e\x37\x30\x35\x63\x30\x2e\x35\x39\x32\
+\x2d\x30\x2e\x33\x35\x34\x2c\x31\x2e\x34\x30\x33\x2d\x30\x2e\x31\
+\x38\x35\x2c\x31\x2e\x37\x35\x36\x2c\x30\x2e\x34\x30\x38\x63\x30\
+\x2e\x33\x35\x34\x2c\x30\x2e\x35\x39\x33\x2c\x30\x2e\x32\x30\x32\
+\x2c\x31\x2e\x33\x33\x36\x2d\x30\x2e\x33\x39\x32\x2c\x31\x2e\x36\
+\x39\x6c\x2d\x30\x2e\x31\x33\x31\x2c\x30\x2e\x30\x37\x34\x0d\x0a\
+\x09\x43\x32\x38\x2e\x38\x2c\x33\x35\x2e\x35\x39\x38\x2c\x32\x38\
+\x2e\x35\x38\x39\x2c\x33\x35\x2e\x36\x35\x31\x2c\x32\x38\x2e\x33\
+\x38\x2c\x33\x35\x2e\x36\x35\x31\x7a\x20\x4d\x36\x2e\x31\x31\x34\
+\x2c\x32\x39\x2e\x37\x33\x34\x63\x2d\x30\x2e\x34\x32\x38\x2c\x30\
+\x2d\x30\x2e\x38\x34\x36\x2d\x30\x2e\x32\x32\x2d\x31\x2e\x30\x37\
+\x38\x2d\x30\x2e\x36\x31\x35\x4c\x34\x2e\x39\x36\x37\x2c\x32\x39\
+\x0d\x0a\x09\x63\x2d\x30\x2e\x33\x34\x35\x2d\x30\x2e\x35\x39\x39\
+\x2d\x30\x2e\x31\x33\x39\x2d\x31\x2e\x33\x36\x32\x2c\x30\x2e\x34\
+\x35\x39\x2d\x31\x2e\x37\x30\x37\x63\x30\x2e\x36\x30\x32\x2d\x30\
+\x2e\x33\x34\x32\x2c\x31\x2e\x33\x36\x33\x2d\x30\x2e\x31\x33\x39\
+\x2c\x31\x2e\x37\x30\x37\x2c\x30\x2e\x34\x36\x31\x4c\x37\x2e\x31\
+\x39\x2c\x32\x37\x2e\x38\x35\x63\x30\x2e\x33\x35\x2c\x30\x2e\x35\
+\x39\x34\x2c\x30\x2e\x31\x35\x32\x2c\x31\x2e\x33\x36\x2d\x30\x2e\
+\x34\x34\x33\x2c\x31\x2e\x37\x31\x31\x0d\x0a\x09\x43\x36\x2e\x35\
+\x34\x37\x2c\x32\x39\x2e\x36\x37\x38\x2c\x36\x2e\x33\x32\x39\x2c\
+\x32\x39\x2e\x37\x33\x34\x2c\x36\x2e\x31\x31\x34\x2c\x32\x39\x2e\
+\x37\x33\x34\x7a\x20\x4d\x33\x34\x2e\x33\x37\x38\x2c\x32\x39\x2e\
+\x36\x38\x63\x2d\x30\x2e\x32\x32\x31\x2c\x30\x2d\x30\x2e\x34\x34\
+\x32\x2d\x30\x2e\x30\x36\x2d\x30\x2e\x36\x34\x36\x2d\x30\x2e\x31\
+\x38\x31\x63\x2d\x30\x2e\x35\x39\x31\x2d\x30\x2e\x33\x35\x35\x2d\
+\x30\x2e\x37\x38\x2d\x31\x2e\x31\x32\x35\x2d\x30\x2e\x34\x32\x35\
+\x2d\x31\x2e\x37\x31\x37\x0d\x0a\x09\x63\x30\x2e\x33\x34\x2d\x30\
+\x2e\x36\x2c\x31\x2e\x31\x32\x36\x2d\x30\x2e\x38\x35\x2c\x31\x2e\
+\x37\x32\x37\x2d\x30\x2e\x35\x31\x63\x30\x2e\x36\x30\x32\x2c\x30\
+\x2e\x33\x34\x32\x2c\x30\x2e\x38\x33\x34\x2c\x31\x2e\x30\x36\x34\
+\x2c\x30\x2e\x34\x39\x33\x2c\x31\x2e\x36\x36\x35\x6c\x2d\x30\x2e\
+\x30\x37\x39\x2c\x30\x2e\x31\x33\x36\x43\x33\x35\x2e\x32\x31\x34\
+\x2c\x32\x39\x2e\x34\x36\x34\x2c\x33\x34\x2e\x38\x30\x32\x2c\x32\
+\x39\x2e\x36\x38\x2c\x33\x34\x2e\x33\x37\x38\x2c\x32\x39\x2e\x36\
+\x38\x7a\x0d\x0a\x09\x20\x4d\x33\x2e\x38\x37\x32\x2c\x32\x31\x2e\
+\x35\x37\x33\x63\x2d\x30\x2e\x36\x39\x31\x2c\x30\x2d\x31\x2e\x32\
+\x35\x2d\x30\x2e\x35\x35\x39\x2d\x31\x2e\x32\x35\x2d\x31\x2e\x32\
+\x35\x76\x2d\x30\x2e\x30\x33\x34\x63\x30\x2d\x30\x2e\x36\x39\x2c\
+\x30\x2e\x35\x35\x39\x2d\x31\x2e\x32\x39\x35\x2c\x31\x2e\x32\x35\
+\x2d\x31\x2e\x32\x39\x35\x63\x30\x2e\x36\x38\x39\x2c\x30\x2c\x31\
+\x2e\x32\x35\x2c\x30\x2e\x35\x31\x35\x2c\x31\x2e\x32\x35\x2c\x31\
+\x2e\x32\x30\x36\x76\x30\x2e\x31\x32\x33\x0d\x0a\x09\x43\x35\x2e\
+\x31\x32\x32\x2c\x32\x31\x2e\x30\x31\x34\x2c\x34\x2e\x35\x36\x31\
+\x2c\x32\x31\x2e\x35\x37\x33\x2c\x33\x2e\x38\x37\x32\x2c\x32\x31\
+\x2e\x35\x37\x33\x7a\x20\x4d\x33\x36\x2e\x35\x38\x39\x2c\x32\x31\
+\x2e\x35\x30\x39\x63\x2d\x30\x2e\x36\x39\x2c\x30\x2d\x31\x2e\x32\
+\x35\x2d\x30\x2e\x35\x36\x31\x2d\x31\x2e\x32\x35\x2d\x31\x2e\x32\
+\x35\x76\x2d\x30\x2e\x31\x32\x34\x63\x30\x2d\x30\x2e\x36\x39\x2c\
+\x30\x2e\x35\x36\x2d\x31\x2e\x32\x38\x34\x2c\x31\x2e\x32\x35\x2d\
+\x31\x2e\x32\x38\x34\x0d\x0a\x09\x63\x30\x2e\x36\x38\x39\x2c\x30\
+\x2c\x31\x2e\x32\x35\x2c\x30\x2e\x35\x32\x34\x2c\x31\x2e\x32\x35\
+\x2c\x31\x2e\x32\x31\x36\x76\x30\x2e\x31\x39\x32\x43\x33\x37\x2e\
+\x38\x33\x39\x2c\x32\x30\x2e\x39\x35\x31\x2c\x33\x37\x2e\x32\x38\
+\x2c\x32\x31\x2e\x35\x30\x39\x2c\x33\x36\x2e\x35\x38\x39\x2c\x32\
+\x31\x2e\x35\x30\x39\x7a\x20\x4d\x36\x2c\x31\x33\x2e\x33\x38\x31\
+\x63\x2d\x30\x2e\x32\x30\x39\x2c\x30\x2d\x30\x2e\x34\x32\x32\x2d\
+\x30\x2e\x30\x35\x32\x2d\x30\x2e\x36\x31\x36\x2d\x30\x2e\x31\x36\
+\x32\x0d\x0a\x09\x63\x2d\x30\x2e\x36\x30\x31\x2d\x30\x2e\x33\x34\
+\x31\x2d\x30\x2e\x38\x31\x31\x2d\x31\x2e\x31\x30\x34\x2d\x30\x2e\
+\x34\x37\x2d\x31\x2e\x37\x30\x35\x6c\x30\x2e\x30\x37\x32\x2d\x30\
+\x2e\x31\x32\x35\x63\x30\x2e\x33\x35\x2d\x30\x2e\x35\x39\x35\x2c\
+\x31\x2e\x31\x31\x37\x2d\x30\x2e\x37\x39\x33\x2c\x31\x2e\x37\x31\
+\x31\x2d\x30\x2e\x34\x34\x32\x63\x30\x2e\x35\x39\x36\x2c\x30\x2e\
+\x33\x35\x31\x2c\x30\x2e\x37\x39\x33\x2c\x31\x2e\x31\x31\x36\x2c\
+\x30\x2e\x34\x34\x33\x2c\x31\x2e\x37\x31\x32\x0d\x0a\x09\x6c\x2d\
+\x30\x2e\x30\x35\x33\x2c\x30\x2e\x30\x39\x43\x36\x2e\x38\x35\x38\
+\x2c\x31\x33\x2e\x31\x35\x35\x2c\x36\x2e\x34\x33\x36\x2c\x31\x33\
+\x2e\x33\x38\x31\x2c\x36\x2c\x31\x33\x2e\x33\x38\x31\x7a\x20\x4d\
+\x33\x34\x2e\x33\x39\x34\x2c\x31\x33\x2e\x32\x36\x38\x63\x2d\x30\
+\x2e\x34\x32\x34\x2c\x30\x2d\x30\x2e\x38\x33\x37\x2d\x30\x2e\x32\
+\x31\x35\x2d\x31\x2e\x30\x37\x31\x2d\x30\x2e\x36\x30\x34\x6c\x2d\
+\x30\x2e\x30\x37\x35\x2d\x30\x2e\x31\x32\x39\x0d\x0a\x09\x63\x2d\
+\x30\x2e\x33\x34\x35\x2d\x30\x2e\x35\x39\x39\x2d\x30\x2e\x31\x33\
+\x39\x2d\x31\x2e\x33\x36\x32\x2c\x30\x2e\x34\x36\x31\x2d\x31\x2e\
+\x37\x30\x37\x63\x30\x2e\x35\x39\x36\x2d\x30\x2e\x33\x34\x35\x2c\
+\x31\x2e\x33\x36\x31\x2d\x30\x2e\x31\x33\x39\x2c\x31\x2e\x37\x30\
+\x35\x2c\x30\x2e\x34\x36\x6c\x30\x2e\x30\x35\x31\x2c\x30\x2e\x30\
+\x38\x35\x63\x30\x2e\x33\x35\x35\x2c\x30\x2e\x35\x39\x31\x2c\x30\
+\x2e\x31\x36\x36\x2c\x31\x2e\x33\x36\x2d\x30\x2e\x34\x32\x36\x2c\
+\x31\x2e\x37\x31\x36\x0d\x0a\x09\x43\x33\x34\x2e\x38\x33\x35\x2c\
+\x31\x33\x2e\x32\x31\x2c\x33\x34\x2e\x36\x31\x34\x2c\x31\x33\x2e\
+\x32\x36\x38\x2c\x33\x34\x2e\x33\x39\x34\x2c\x31\x33\x2e\x32\x36\
+\x38\x7a\x20\x4d\x31\x31\x2e\x39\x34\x34\x2c\x37\x2e\x33\x35\x32\
+\x63\x2d\x30\x2e\x34\x32\x38\x2c\x30\x2d\x30\x2e\x38\x34\x34\x2d\
+\x30\x2e\x32\x32\x2d\x31\x2e\x30\x37\x38\x2d\x30\x2e\x36\x31\x35\
+\x63\x2d\x30\x2e\x33\x35\x2d\x30\x2e\x35\x39\x35\x2d\x30\x2e\x31\
+\x35\x32\x2d\x31\x2e\x33\x36\x31\x2c\x30\x2e\x34\x34\x33\x2d\x31\
+\x2e\x37\x31\x32\x0d\x0a\x09\x6c\x30\x2e\x31\x31\x37\x2d\x30\x2e\
+\x30\x36\x38\x63\x30\x2e\x36\x2d\x30\x2e\x33\x34\x34\x2c\x31\x2e\
+\x33\x36\x33\x2d\x30\x2e\x31\x33\x38\x2c\x31\x2e\x37\x30\x37\x2c\
+\x30\x2e\x34\x36\x63\x30\x2e\x33\x34\x35\x2c\x30\x2e\x35\x39\x39\
+\x2c\x30\x2e\x31\x33\x39\x2c\x31\x2e\x33\x36\x32\x2d\x30\x2e\x34\
+\x35\x39\x2c\x31\x2e\x37\x30\x37\x4c\x31\x32\x2e\x35\x37\x37\x2c\
+\x37\x2e\x31\x38\x0d\x0a\x09\x43\x31\x32\x2e\x33\x37\x38\x2c\x37\
+\x2e\x32\x39\x36\x2c\x31\x32\x2e\x31\x36\x31\x2c\x37\x2e\x33\x35\
+\x32\x2c\x31\x31\x2e\x39\x34\x34\x2c\x37\x2e\x33\x35\x32\x7a\x20\
+\x4d\x32\x38\x2e\x34\x30\x32\x2c\x37\x2e\x32\x38\x38\x63\x2d\x30\
+\x2e\x32\x31\x39\x2c\x30\x2d\x30\x2e\x34\x33\x39\x2d\x30\x2e\x30\
+\x35\x37\x2d\x30\x2e\x36\x34\x2d\x30\x2e\x31\x37\x37\x43\x32\x37\
+\x2e\x31\x36\x32\x2c\x36\x2e\x37\x37\x2c\x32\x36\x2e\x39\x31\x2c\
+\x35\x2e\x39\x38\x33\x2c\x32\x37\x2e\x32\x35\x2c\x35\x2e\x33\x38\
+\x32\x0d\x0a\x09\x63\x30\x2e\x33\x34\x2d\x30\x2e\x36\x2c\x31\x2e\
+\x30\x36\x31\x2d\x30\x2e\x38\x33\x37\x2c\x31\x2e\x36\x36\x32\x2d\
+\x30\x2e\x34\x39\x34\x6c\x30\x2e\x31\x33\x31\x2c\x30\x2e\x30\x37\
+\x36\x63\x30\x2e\x35\x39\x34\x2c\x30\x2e\x33\x35\x34\x2c\x30\x2e\
+\x37\x38\x37\x2c\x31\x2e\x31\x32\x31\x2c\x30\x2e\x34\x33\x34\x2c\
+\x31\x2e\x37\x31\x34\x43\x32\x39\x2e\x32\x34\x32\x2c\x37\x2e\x30\
+\x37\x2c\x32\x38\x2e\x38\x32\x38\x2c\x37\x2e\x32\x38\x38\x2c\x32\
+\x38\x2e\x34\x30\x32\x2c\x37\x2e\x32\x38\x38\x7a\x0d\x0a\x09\x20\
+\x4d\x32\x30\x2e\x31\x33\x2c\x32\x2e\x36\x30\x33\x68\x30\x2e\x30\
+\x39\x35\x63\x30\x2e\x36\x39\x2c\x30\x2c\x31\x2e\x32\x35\x31\x2c\
+\x30\x2e\x35\x36\x2c\x31\x2e\x32\x35\x31\x2c\x31\x2e\x32\x35\x73\
+\x2d\x30\x2e\x35\x36\x31\x2c\x31\x2e\x32\x35\x2d\x31\x2e\x32\x35\
+\x31\x2c\x31\x2e\x32\x35\x68\x2d\x30\x2e\x31\x32\x33\x63\x2d\x30\
+\x2e\x36\x39\x31\x2c\x30\x2d\x31\x2e\x32\x35\x2d\x30\x2e\x35\x36\
+\x2d\x31\x2e\x32\x35\x2d\x31\x2e\x32\x35\x0d\x0a\x09\x73\x30\x2e\
+\x35\x35\x39\x2d\x31\x2e\x32\x35\x2c\x31\x2e\x32\x35\x2d\x31\x2e\
+\x32\x35\x22\x2f\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x0e\x9c\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x50\x00\x00\x00\x50\x08\x06\x00\x00\x00\x8e\x11\xf2\xad\
+\x00\x00\x0e\x63\x49\x44\x41\x54\x78\x5e\xed\x5c\x79\x78\x55\xd5\
+\xb5\xff\xdd\x79\x4a\x48\x42\xe6\x01\x14\x10\x5b\xbf\x2a\x61\x08\
+\xa3\xc8\x54\x9a\x86\x0a\xc1\x00\x31\x08\xd6\xe7\x03\xb5\xbc\x42\
+\xeb\x44\x05\xab\x8c\xb6\xf2\x68\xb5\x38\x55\xc0\xa1\xf6\xf1\xbe\
+\x4a\xf2\xc2\xd0\x94\x49\x0c\xc6\x88\x61\x0c\x82\xa0\x40\x0b\x5a\
+\x04\x32\xcf\xc3\xbd\x37\xe7\x9e\x7b\xce\x59\xfd\xf6\x25\x89\x09\
+\xb9\x49\xce\x9d\xce\xcd\xeb\xe7\xfd\xeb\xde\x7b\xf6\x5e\xeb\xb7\
+\x7e\x7b\xed\x61\xed\xbd\xf6\x51\xa1\x0f\x7e\xee\x3f\xbc\x84\xce\
+\x35\x5d\x85\x01\x82\x0b\x9d\xa8\x36\x21\x5c\x6b\x41\xb4\x21\x1c\
+\x89\xa6\x18\xdc\x62\x8e\xc7\x1d\xfd\x6e\xc5\xcc\x81\x69\xaa\x60\
+\xc3\x57\x1c\x40\x41\xe9\x47\x94\x57\x5a\x84\x57\xc7\xac\x71\xab\
+\xfb\xe3\xb2\xc3\x34\xed\xd3\xe5\x88\x37\x45\x02\x68\x2b\x42\x90\
+\x40\x10\x49\x82\x20\x49\x90\x20\xc2\x21\x8a\x10\xc8\x09\x51\xe4\
+\x30\x22\x7c\x08\x32\x13\xee\xc1\xb3\xc3\x1e\x57\xdc\x1e\x45\x14\
+\x1e\xab\x38\x42\xaf\x5d\xca\x46\x4e\x59\x11\x34\x1a\x0b\x0c\x1a\
+\x2d\xac\x5c\x35\xb0\xe0\x7c\x17\xfd\x85\x25\x1f\x52\xea\xb1\xf5\
+\x88\x35\xf6\x93\xe5\x5c\x12\x01\x3c\x09\xe0\x44\x1e\x36\x91\x43\
+\xa8\x0a\xf8\xe5\xe0\xd9\x78\x61\xe4\xb3\x8a\xd8\x16\x50\x25\x5b\
+\x2f\xbe\x43\xcf\x5d\xfc\x33\x1a\x44\x11\xa1\x5a\x0b\xcc\x1a\x1d\
+\xd4\xaa\x1b\x2a\x2b\xb8\x26\xec\x1b\xb7\x1a\xa9\x03\x52\x3b\x61\
+\xd8\x79\x2d\x9f\x16\x9e\x5c\x87\x68\x83\x3c\x02\x6f\x66\x59\x20\
+\x09\x76\xd1\x81\x46\x47\x33\xc6\x85\x0f\xc4\xc6\x61\xcb\x30\x39\
+\x61\x5a\xc0\xec\x0c\x88\xe0\x97\xbf\x78\x83\x56\x5c\x78\x0f\x5a\
+\x4d\x08\x22\xf4\x26\x68\x55\xea\x2e\xde\x64\x15\x78\xa4\x45\x0e\
+\xc5\xf6\x49\x9b\x3b\x13\x78\xf5\x20\x2d\x2c\x7e\xc1\x6b\x02\x3b\
+\x2a\xe2\x24\x01\x75\x7c\x33\x12\xf5\x16\x6c\x1a\xb1\x12\x73\x07\
+\x4e\xf7\xbb\xbd\x7e\x15\xf8\xd7\x2b\xbb\x69\xe1\xa9\x0d\x90\x54\
+\x26\x44\xe8\xcd\xd0\xb4\x7a\x9b\xbb\xbe\x28\x11\xa1\xdc\x5e\x01\
+\x69\xfe\x99\x4e\x18\x76\x5c\xcd\xa7\x07\x8b\xbd\xf7\x40\x77\xba\
+\x9c\x92\x88\x1a\xbe\x11\xf1\xc6\xfe\xb8\x3e\x6b\xbf\x5f\x6d\xf6\
+\x9b\xb0\xd1\x07\x66\xd3\x69\x6b\x15\x62\x0c\x61\x6e\x3d\xce\x9d\
+\x61\xac\x1b\x1f\x9c\xb0\x1e\xd3\x12\xbf\xed\x62\x05\x25\x07\x29\
+\xed\xf8\x0b\x88\xf5\xb2\x0b\xf7\x34\x70\x3a\x25\x01\x15\xf6\x2a\
+\x2c\x19\x72\x3f\xb6\x8c\xf9\xb5\x5f\x6c\xf7\x59\xc8\x5f\x2e\x6f\
+\xa3\x85\xa7\x5e\x46\x94\x31\x16\x26\xad\x56\xd6\xc0\xdf\x56\xa8\
+\x59\x70\x20\x2b\x6e\x34\xb6\x8e\xff\xef\x76\x1c\x05\x65\x85\x94\
+\x76\xe4\x79\xd9\x93\x88\x47\x0a\x5b\x0b\xd7\x3b\x6d\xae\x6f\xd6\
+\x39\x9f\xf8\x6c\xbf\x4f\x02\x32\x0a\x17\x51\x5e\xf5\x05\xc4\x1b\
+\x22\xda\x27\x07\x4f\x0c\x12\x89\xd0\xe4\xa8\x85\x35\xf3\x64\x3b\
+\x8e\x4f\x2b\x8e\xd1\x0f\x3f\x5d\x8e\x58\x63\x98\x27\xa2\x3c\x2e\
+\xcb\xba\x75\x85\xbd\x02\xef\x8e\x59\x8f\xc5\x43\x66\x7b\xcd\x83\
+\xd7\x15\x07\xe6\x4d\xa5\x7a\x49\x85\x70\xad\xd1\x63\xf0\x1d\x2b\
+\x94\x72\x75\x90\x32\x8f\x77\xc2\xa1\xcd\x1d\x4f\xf1\xc6\x08\x9f\
+\xe4\xca\xa9\xcc\xc6\xe1\x8a\x96\x5a\xa4\xc5\x8f\xc7\xbe\x49\xaf\
+\x7a\xc5\x85\x57\x95\xf4\xb9\xa3\xa8\x9f\x3e\x12\x26\xb5\x67\x5d\
+\xd6\x9d\x51\xf5\x4e\x3b\xd6\x0e\xcd\xc4\xf2\xbb\x96\xb6\x63\xd1\
+\xe6\x8e\x23\x36\xe0\x2b\xf5\x69\x70\xda\xd0\x5f\x17\x8a\xab\xb3\
+\xf6\x7a\xcc\x87\xe7\x15\xb6\x8f\xa0\x58\x4b\x2c\x74\x6e\x96\x26\
+\xde\x18\xcc\x96\x1a\x83\x0d\x21\x38\x91\xb6\xab\x1d\x8b\x26\x77\
+\x2c\x25\x18\x59\x24\xa2\xdc\xa7\x59\xe0\x10\xad\x33\xe2\xf2\x4c\
+\xcf\x66\x69\xcf\x08\xdc\x3e\x9c\x12\x2c\x71\xd0\xf8\x89\x3c\x46\
+\x0f\x8b\x24\x4a\x6d\xe5\xc0\x03\xdf\x2e\x67\xd4\x39\x63\x28\xd1\
+\x1c\xa5\x1c\x7b\xad\x9a\x9a\x04\x07\x06\xe8\x4d\xf8\xf2\x5e\xf9\
+\x9e\x28\x9f\xc0\xec\x91\x94\x60\x8e\xf1\x2b\x79\x6d\x0c\x55\x72\
+\x4d\xf8\xa0\xc3\x72\x46\x95\x33\x9a\x92\xcc\xd1\x8a\x13\xc8\x14\
+\x36\x08\x1c\x86\x5b\xa2\xf0\x69\xea\xff\xc9\xe2\x46\x56\xa1\xf0\
+\xdd\xd3\xc8\xa0\xd6\x42\xef\x87\x31\xcf\x1d\x2b\x4d\x02\x87\x47\
+\x93\xa6\xe2\xa5\xd1\xab\x6e\xe0\xc9\x4e\xa1\x01\x96\x98\xa0\x10\
+\xc8\x94\x56\x39\xac\x58\x14\x3f\x12\x9b\xef\x7e\xa5\x57\x7e\x7a\
+\x2d\x70\xfb\xbe\x0c\xaa\xe5\x9b\x60\xd6\x1a\x02\x66\x90\x53\x92\
+\xd0\x4f\xc5\xe3\x52\x7a\x81\x0b\x8f\x21\x67\x04\x45\x9a\xe2\xa1\
+\xe9\x15\x5d\xc0\x20\xa1\xc4\x5e\x8b\xf7\x47\x2e\xc3\x03\x43\x7f\
+\xda\x23\x8a\x1e\x1f\xce\x3f\xb2\x92\xf6\x56\x1e\x45\x84\x2e\x24\
+\x70\x48\x5b\x25\x5f\xb7\x55\x01\xf3\x4f\xb9\xf0\x0c\xdc\x3d\x85\
+\x9c\x1a\xa3\xec\x88\xa6\x27\x70\x6c\x8c\x55\x7b\xd1\x10\x6c\x89\
+\x53\x6a\x2d\x03\x16\x9c\xf5\x8e\xc0\x82\x8a\x62\xfa\x61\xe1\x12\
+\x24\x59\x62\x03\x4e\xde\x8d\x6e\xd3\x8c\x9d\x63\x9e\xc7\xcc\x81\
+\x3f\x56\xa5\x1c\xc8\xa0\xeb\xbc\x1d\x7a\xb5\xc6\x27\xdd\x8c\x3c\
+\xad\x8a\x20\x90\xca\x2b\x12\xd9\x62\x9b\x13\x39\x34\xf4\x10\xb1\
+\x74\xcb\x6e\xc8\xae\xc9\x14\xaa\x65\x5e\xe0\x9b\x11\x72\x19\x60\
+\xe3\xe0\xe2\xa4\x7b\xf0\x87\xd1\xeb\x54\x33\x0a\x16\x53\x71\xe3\
+\x35\x98\xb4\x3a\xb9\xd5\xbb\x2d\xe7\xad\x07\xb6\x09\xac\x71\xda\
+\xb0\xe2\xd6\x1f\x63\xed\x48\xf7\xb1\xb3\x5b\x02\x5f\xbe\xf0\x1e\
+\x3d\x77\xe1\x4f\x88\x36\x84\xfa\x6c\x80\x5c\x01\x37\xc6\x41\x27\
+\x2e\xa5\x7f\xa4\x7a\xe8\xc8\x72\xda\x53\x75\x06\x21\x01\x1c\x77\
+\xe5\xe2\x72\x75\x65\xd7\x32\xeb\x73\xb7\x5c\xb9\xfd\x53\x93\x3d\
+\x82\x62\xcd\x6c\xbd\xe7\xc5\xe0\x21\x17\x99\x9b\x72\x6d\xe3\xe0\
+\x73\xa7\x7f\x47\x6f\x5c\x3d\x80\x7e\x5a\x93\x0f\xd2\xfc\x57\xd5\
+\x2e\x38\x71\x97\x25\x1c\x85\xa9\xb9\x5d\x08\xe9\xf2\xc7\x33\xc5\
+\x6b\x69\x73\xc9\x27\x08\x0f\x02\x78\xb6\x1e\xe4\x33\x8b\x54\x5b\
+\xfe\xbe\x8d\x96\x5f\xf8\x13\x22\x74\x66\xff\xb1\xe0\xa3\xa4\x12\
+\x7b\x0d\x28\xeb\xdb\x4d\x8f\x36\x71\x5d\x19\xdd\x9e\x4c\x09\x96\
+\x04\xaf\x76\x57\x7c\xc4\x88\x26\xa1\x05\xcf\x0e\x99\x8b\xe4\x88\
+\xef\x63\xce\x89\xf5\x88\x32\x04\x7e\xf6\x97\x8b\x99\x85\x9c\x03\
+\x75\x06\x7c\xf6\x93\x3d\x9d\x38\xeb\xf4\x63\xd5\x67\x2f\xd2\x2b\
+\xd7\xf2\x83\xe2\x7d\xcc\x10\x06\xf2\x4e\x4b\x14\x3e\x9e\xfe\xbe\
+\x4a\x9f\x3b\x91\xe4\x1e\x2c\xc9\x25\xc1\xd7\x72\xee\xbc\xb0\x13\
+\x81\x9a\x9c\x91\x14\x6b\x8a\x55\x7c\xec\x6b\x33\x8c\xcd\x98\x95\
+\x8e\x5a\x08\x99\x27\x54\xba\xdc\x89\x14\x27\xf3\x64\xce\x57\x62\
+\xe4\xd6\x67\xe7\x38\x53\x22\x06\x61\xf7\x94\xb7\xdb\x79\x6b\xff\
+\x92\xf3\xcf\x5c\x7a\xe8\xf4\x6b\x88\x51\x70\xe6\x75\x07\xbc\xda\
+\x61\x45\xe1\x84\x35\x98\x72\x94\x9d\x8b\xf4\x9d\x2e\xcc\xb0\xba\
+\x36\x3e\x9a\xbe\x01\x1e\xbc\xd0\x95\xc0\xf1\x1f\x64\xd0\x57\x0e\
+\x1b\x8c\x01\x8a\x77\xe5\xb6\x72\xbd\xb3\x05\x6f\xdf\xf9\x10\x1e\
+\xf9\x72\x1b\xfa\xeb\x82\x3f\x0b\xb3\x65\x0c\x27\x0a\xe0\x88\x87\
+\x8d\xb7\x61\x72\x78\x12\x3e\x49\xfb\x6b\x57\x02\x91\x3d\x8a\x06\
+\x28\x14\x75\xf4\x44\x26\xeb\x26\x8b\x92\x26\x61\x67\x79\x11\x78\
+\x68\x82\x32\x9c\x30\x4f\xe3\x44\x27\xac\x22\x07\x5e\xb0\x62\x46\
+\xcc\x5d\xc8\x48\xfc\x11\x1e\xfd\x5e\xd7\xb8\xd8\xc5\xe4\x7b\x97\
+\xdf\xa7\x9f\x9f\xdd\xd2\x27\x66\x3d\x81\x08\xd1\x5a\x1d\x6e\x35\
+\x46\xe3\x44\x73\x89\xcf\xe1\x9c\x5c\xcf\x67\xe5\x5c\x67\x34\x02\
+\x07\xab\xa3\x01\x69\x31\x77\x61\xd9\x6d\x59\x98\x79\xcb\xbd\xbd\
+\xc7\xc2\xe9\x85\x8f\xd0\x91\xfa\xab\x30\xfb\x21\x74\xf2\x04\x70\
+\x77\x65\x39\x49\xc2\x70\xa3\x01\x5f\x38\x78\xe8\x14\x58\xcc\xb3\
+\x6c\x86\x3a\xde\x0e\x35\xb5\x60\xf5\xed\x0b\xf0\x6c\xf2\x93\xb2\
+\x23\x08\x57\x41\x36\xfb\xc6\x99\x62\x83\xb2\xf6\x73\x47\x22\xeb\
+\x42\x2c\x99\x48\x0d\xef\x36\x01\xe4\x36\x22\xf3\xb8\x5a\xde\x06\
+\x13\x9c\x78\x25\xf9\x17\x78\x78\xe8\x02\xd9\xc4\x75\x5a\x48\x6b\
+\x72\xc7\x51\x82\x82\x87\x38\x72\x0c\xf4\x75\x13\xa0\x27\x1d\x4c\
+\x76\x93\xc8\x81\xe3\x1b\xb1\x25\x79\x29\x16\x7f\x7f\x91\xc7\xc4\
+\xb5\x13\xb8\xef\xda\x01\x9a\x7b\x72\x43\x9f\x5b\x32\xc8\x21\xd9\
+\x9b\x32\xbc\x24\xa2\xd2\x5e\x8d\x65\x83\x7e\x84\x37\xc6\x6d\xf4\
+\x9a\xb8\x76\x02\x5f\x3c\xf7\x06\x6d\xfc\x7a\x67\x9f\x09\xdc\xbd\
+\x21\x45\x6e\x9d\x1a\xa7\x1d\x51\x2a\xc2\xf5\x0c\xdf\x33\x12\xda\
+\x09\x7c\xd8\xb5\x75\x74\xb6\xcf\x4c\x20\x72\xc9\xf0\xa4\x1c\x1b\
+\xeb\xca\xec\xd5\x78\x72\xf0\x74\x6c\x1a\xf3\x6d\x1a\x89\x27\x32\
+\xba\x2b\xab\x9a\x9c\xbf\x90\xfe\x61\xaf\x85\x4e\xdd\x35\x05\xcd\
+\x1f\x0a\x82\x2d\x83\x93\x44\xd4\xb6\x54\xe1\xe8\xa4\x97\x31\x2e\
+\x00\x79\x82\xaa\xdb\xff\x36\x95\xac\x30\xb9\x0e\x70\xd8\x74\xee\
+\x14\x45\x38\x21\x42\x22\x96\x4a\x4b\x90\x24\x02\xb5\x26\xdb\xaa\
+\xd5\xaa\xd6\x99\x51\x0d\x1d\x34\xd0\x69\x34\x7e\x39\xb7\x08\x14\
+\xc9\xcd\x02\x0f\x23\x78\x54\x64\x1c\xf6\x79\xac\xeb\xd6\x03\xe7\
+\x14\x2e\xa6\x5d\x15\x67\x5d\xcf\x13\x0d\x26\x0c\x0b\x1b\x8a\xdb\
+\x42\x92\x10\x6b\x8c\x71\xc5\xc5\x7a\x8d\x19\x61\x6a\xa0\x51\x02\
+\x1c\x82\x1d\xd5\x7c\x23\xca\xb9\x6a\x7c\x6d\x2d\xc1\xe7\x0d\x97\
+\x50\xc9\x3b\xa0\xd5\x18\x60\xd0\xe8\x60\xd2\xe8\xa1\x57\x69\xbd\
+\x3a\x7f\xf0\x37\x89\x0d\x42\x0b\x6e\x33\x84\xe0\xcc\x4d\xdb\x4f\
+\xfe\xd6\xe3\xb7\x96\xf9\xfd\x97\x9b\x69\x4f\xd9\xc7\x38\x5c\x7b\
+\x19\x46\x5d\x08\x42\x34\x46\x17\xa9\xde\x9c\x88\xf9\x6a\x24\xcb\
+\xb7\x19\x16\x12\x87\xa3\xa9\xd9\x7e\xb3\xaf\x5b\x0f\xf4\x15\xac\
+\xbb\xfa\xbb\xae\xe4\xd1\x9b\x5f\x65\xe3\x50\xed\x25\x84\x19\xc2\
+\x10\xa2\x31\x28\xb6\x48\x67\x9e\x97\x6c\x89\x41\x51\x6a\x4e\xc0\
+\xc9\x63\xb6\x07\x5c\xc9\x53\x27\x57\xd1\xa6\x7f\xee\x41\xb8\x21\
+\x0a\x21\x5a\x7d\x20\xda\xab\x5d\x26\xdb\x88\x18\x64\x30\xe1\x74\
+\x80\xbb\x6d\x47\x23\x02\x4e\x60\x9b\xb2\xf4\xfc\x9f\xd1\x9e\xba\
+\xd3\x88\x33\x45\x06\x64\xe2\xe1\x49\x04\xe7\xb0\xa1\x31\xb3\x48\
+\x31\x9b\x14\xf1\xc0\x8e\xad\x75\xb4\xe4\x38\x4d\x2d\x7a\x1c\x66\
+\x53\x28\x42\xd4\xfe\xf3\x46\xb6\xce\x2b\xb7\x95\x83\xba\x39\x7a\
+\x0c\xa4\xdb\x2b\xda\x5a\x6d\x86\xa4\xec\x9d\x47\x17\x9d\xd5\xe8\
+\xaf\xb5\xf8\x6c\x1b\x8b\x6b\xcb\x5a\x2a\x71\x70\xf4\xef\x91\x3a\
+\x38\x70\xf7\x41\x7a\x9c\x44\x3e\xbc\x7e\x80\xfe\xf3\xd4\x06\x94\
+\xb6\x34\xe2\xf1\xc1\x69\x78\xd5\x0f\x31\x62\x6f\xcc\xcc\xfb\x68\
+\x29\xfd\xad\xfe\x1c\x62\x7d\x3c\x42\xa8\x13\x6c\x78\x38\x7a\x32\
+\xfe\x38\x71\x7d\x50\x9c\x41\x75\x5f\xe1\x63\x94\x57\x79\x16\xb1\
+\xc6\x08\xb0\x5c\x90\xb1\x61\x49\xd8\x3f\xed\x3d\x45\xc0\x3c\x7a\
+\xe4\x71\xda\x56\x7e\x06\x31\x5e\x9e\x7d\xb0\x71\x4f\x2f\x88\xb8\
+\x3e\xe7\x90\x22\x78\xdd\x39\x85\x6a\xd3\xf9\xad\xb4\xfa\x52\xb6\
+\xeb\x28\xb3\x45\x70\x62\x7c\x58\x12\xf6\x28\x44\x20\x03\x34\x35\
+\x3f\x8b\xce\x58\x6b\x11\xea\xe1\x0c\xcd\xa2\xa4\x52\x6b\xf7\x29\
+\x17\xbd\xf5\x00\x7f\x3d\x57\xe5\x97\x16\xd0\xac\x63\x6b\x5c\x79\
+\x30\x6c\xab\x67\x80\xc1\x82\x53\x1d\xf2\x95\xfd\xa5\xa8\x27\x39\
+\xa1\xb9\xe3\x28\xc4\x10\xee\xd1\xec\x5c\x2f\xd8\xb0\x24\x6e\x06\
+\x5e\x1a\xbf\x32\x68\xde\xd7\x3e\x0b\xb7\xe5\x24\xb3\xf3\x08\x9e\
+\xaf\x45\xed\xbc\xae\x29\x0c\x81\x26\xd2\x93\xb4\x5e\x16\xb3\x37\
+\x3b\xac\xb0\x2a\xbc\x64\x71\xdb\x85\xd9\x9f\x96\xdc\x31\x14\x66\
+\x88\x74\x9d\x80\x95\xd8\xaa\x40\xad\x89\x8e\x81\x26\xad\xa3\xfc\
+\xfb\x0a\x17\xd3\x27\xf5\x57\x65\x2d\xb6\xcb\xb8\x3a\xec\x1d\xf5\
+\x1b\xcc\x18\xec\xff\xcb\x83\x9e\xda\xec\x72\xff\xff\x38\xf2\x04\
+\xe5\x55\x7d\x81\x50\xad\x01\xe5\x5c\x3d\x84\xcc\x63\xc1\xe9\x16\
+\xdb\x47\x50\xa2\x25\xbe\xc7\xf8\x99\xa5\x7f\xc4\xaa\x4c\xf8\x32\
+\x3d\x2f\x38\x18\x6f\x62\xd8\x05\x22\xef\x9b\xbd\x74\xff\xa9\x8d\
+\xae\xdd\x97\x1a\x87\x15\x6f\x0d\xff\x39\x7e\x7a\xdb\x7c\xc5\x01\
+\x66\x1d\xfe\x2f\xfa\xb0\xf6\x72\x8f\x5e\x58\xc2\x55\x83\x32\x8b\
+\x15\xc7\xd6\xfb\x66\x82\xab\xf5\xe3\x60\x17\x79\xa4\xc7\x0c\xc3\
+\xff\xdc\xbd\x29\x28\x20\x7b\x3a\xe0\xe2\x24\x27\x86\xe8\xa3\x70\
+\x7c\xc6\xf6\xa0\x60\xeb\x76\x0c\x64\x0f\xe6\x16\x3e\x42\x05\xf5\
+\xdf\xc0\xa4\xd1\xa1\xd9\x51\x83\xe6\x20\xb5\x72\xd4\xae\x89\xa4\
+\xd3\x86\xb8\x9d\x91\x4b\xb9\x5a\x48\x99\x27\xfa\x0c\x79\x9d\x62\
+\xe1\xc2\xb2\x02\x9a\x7e\x64\x15\xe2\x8d\x61\x60\x83\xb4\x78\xd3\
+\x05\x40\x4f\x07\x57\x6f\xcb\x3f\x53\xbc\x9e\xb6\x96\x14\xa2\xdf\
+\x4d\x97\x18\x79\x49\x40\x7f\x18\x70\x71\x76\xe7\xfc\x3c\x6f\xf5\
+\xf8\xab\x5e\xa7\xd6\x0c\xdf\x31\x9e\x4c\xfa\x30\x57\x37\x5e\x32\
+\x60\x0a\x36\xa6\xac\x56\xbc\xb5\x0f\x95\x7c\x44\xf7\x1e\x5f\x83\
+\x98\x9b\x2e\x5c\xb3\x2c\xfe\x6d\xc9\x2b\x90\x35\x74\xa6\xe2\x98\
+\x7a\x22\xbb\x13\x98\x2d\x17\xdf\xa2\x27\xcf\xff\xc5\x75\x5d\xbf\
+\xd6\x51\x03\x47\x90\xba\xb1\x3a\x77\x2c\x25\x76\xb8\x6c\xc8\x76\
+\x5b\xaa\xec\x55\x10\xe6\x7f\xd6\xa7\xc8\x73\xbb\x9d\xa5\xc9\x19\
+\x45\xb1\xa6\x18\xd4\xf0\x56\xe4\xa6\xfc\x0a\xb3\x6f\x4d\x57\x1c\
+\xb4\xca\x75\x2f\x2f\xae\x7d\x39\xc3\x6e\x52\x66\xc5\xdc\x83\xad\
+\x77\xaf\x53\x1c\x4b\x6f\x5d\xbd\x0b\xa0\xd7\xcf\xbf\x49\xbf\xba\
+\x98\x8d\x30\x9d\x09\x61\x6a\x09\x97\x66\xe5\x2b\x0e\x3a\x62\xc7\
+\x38\x32\xe9\x23\xda\x53\xdb\x4a\xb9\x1a\x48\x1d\x6e\xb5\xf7\x66\
+\x94\x92\xcf\xdd\x92\x13\x96\x3b\x96\xcc\x86\x08\x54\x39\x1a\x91\
+\x3f\xe1\xb7\x9d\x5e\x0a\xa1\x04\xb8\x8e\x57\xbd\x9c\x24\xc2\x28\
+\x12\xbe\xc9\xf8\x50\xf1\x86\x94\x63\xab\x5b\x50\x87\xae\x1f\xa0\
+\xd4\xe3\x6b\x11\xa3\x0f\x87\x5e\xe2\x71\x2d\xe3\x63\x45\xc1\x87\
+\xe7\x8e\x21\x73\x6b\x68\x59\xed\x6c\xc6\x9b\x77\x2c\xc3\xa2\x3b\
+\xb2\x14\xc5\x20\x87\x3c\xb7\x63\x60\x5b\x45\xb6\xcd\xf4\xb9\xb5\
+\x0e\x76\x91\xc3\x86\xa1\x0b\xf1\x54\xf2\x12\xe5\x0c\x68\xbd\xee\
+\xca\x26\x8f\x4a\x5b\x15\xc4\x07\xfa\xde\xe4\xd1\xc6\x53\x8f\xa4\
+\xa8\xb3\x87\x53\xac\x39\x1e\xe5\x6c\xdf\x6d\x81\xfb\xab\x4e\x72\
+\x5b\xca\x93\x72\x6d\xef\x4c\x60\xe7\xbb\xcf\xdc\x32\x0b\xab\x47\
+\x3d\xad\x5c\xe3\x79\x02\xb4\xb7\x63\xcd\x43\xd7\xf6\xd1\xf4\xa3\
+\x6b\x11\x6d\x8a\x40\x88\xa4\xc6\x95\x8c\x0f\x02\x6e\xc8\xdb\xff\
+\xf8\x5f\x7a\xe2\xfc\x3b\x08\xd3\x9a\x5d\x6f\x36\xa2\x9b\xde\x6c\
+\xe4\xa1\x7d\x01\x2f\xde\x2b\x21\x4b\x8f\x2d\xa7\x77\x4b\x8b\xa1\
+\xd1\xa8\x30\x37\x62\x24\xb6\x4d\xf9\x43\xaf\x75\x7c\x41\x3d\x7c\
+\xff\x2c\x2a\x75\xf2\xae\x04\xef\xb5\x43\x66\x63\x45\xf2\x53\x01\
+\xd5\xe7\x0b\xd6\x1e\xc7\xc0\x8e\x82\x53\x0e\xdc\x47\x97\xb9\x66\
+\x58\x05\x1b\x7e\x3b\xf8\x41\xac\x1c\xb5\x2c\x60\x46\xa9\x72\xc6\
+\x52\x9c\x29\x02\xf5\x8e\x3a\x70\x7d\x74\xe9\xd2\x91\x1b\xd9\x44\
+\x24\xec\x9e\x44\x0e\x18\x51\x27\xd4\x61\xf3\xed\x8f\x61\x49\xf2\
+\x63\xb2\xeb\xca\x6d\xe5\x3b\xf7\xa6\x51\xa5\x48\xa8\xe3\x9b\xb0\
+\x33\xe5\x69\xdc\x37\x68\x9e\xdf\x75\xc8\xc5\x22\xb7\x9c\x47\x00\
+\x23\x77\x8c\x25\xe8\xc2\x50\xc7\x37\xe0\xe9\xc4\x74\xbc\x34\xe1\
+\x79\x8f\xea\xf7\x04\x6a\xed\x67\x2f\xd0\x86\x2b\xf9\xae\x3c\x9a\
+\xa1\x46\x33\x8e\xcf\xe8\x1b\x1b\xa6\xbd\x11\xe9\x31\x01\x51\xbb\
+\xee\x21\x41\x65\x40\x0b\x39\x90\x6c\x48\xc0\xc9\x7b\x7d\x4f\xe2\
+\x79\xe7\xe2\x3b\xf4\xe8\xb9\xb7\x5c\xaf\xfd\x0c\x56\x86\x41\x6f\
+\x44\x75\xf7\xdc\x63\x02\x99\xa0\x94\xfd\xe9\x74\xce\xde\x80\x50\
+\x9d\x1e\xf5\xf6\x7a\xbc\x35\xec\x69\x3c\xf2\x03\xcf\xaf\x08\x30\
+\x59\x2b\x4e\xae\xa2\xdf\x5d\x39\xe8\x22\xaf\xcc\x5a\x0a\x2c\x38\
+\xe7\x15\x26\x6f\x09\xf0\xb5\x9e\xd7\x60\x7f\x5d\xbc\x96\x5e\xfc\
+\x3a\x0f\x6c\xe3\x81\xbd\x4e\x6e\xa0\xde\x8c\x77\x53\x56\xca\x7e\
+\xdd\xe6\xc9\x8a\xc3\x94\x75\x62\x1d\x2a\x44\x01\x61\x1a\x13\x2a\
+\x6c\x65\x28\x9a\xf2\x0a\x26\x06\x20\x0d\xd7\x57\x92\x7a\xaa\xef\
+\x35\x81\x6d\x42\x13\x76\x4d\xa5\x1a\xc9\x89\x50\x9d\x09\x8d\xbc\
+\x1d\x91\x5a\x35\x96\x0e\xca\xc0\xea\xe1\xee\x97\x1f\x1b\xce\xbd\
+\x46\x9b\xbf\xde\x8d\x52\x81\x43\x94\xbe\x9f\xeb\xbe\x86\x41\xe2\
+\xd1\x30\x2f\x48\x07\x59\x3e\xb2\xeb\x33\x81\x4c\xff\xdb\xe7\x73\
+\x68\xe5\x85\xd7\xd1\x08\x11\x16\xad\xc9\xf5\xba\x62\x87\xe8\x84\
+\x28\x39\x59\x96\xb5\x0b\x22\xcb\xae\xd6\xa8\x75\x30\x6a\x74\xd0\
+\xab\x74\x37\x6e\x3f\x3a\x1a\xb1\xe6\x7b\xf7\x63\x5d\x37\x6f\xc4\
+\xf0\xd1\x36\x45\xaa\xfb\x85\xc0\x36\xa4\x05\xd7\x0e\xd3\xeb\x5f\
+\xed\x40\x5e\x65\x11\xd4\x5a\x3d\xb4\x2a\x1d\xb4\xad\xd9\xff\x2c\
+\x55\x9d\x67\x09\xec\x22\x87\x3b\x2c\x91\xf8\xd9\xe0\x39\x78\xe2\
+\x07\x0a\xc6\xd7\x01\xa2\xd3\xaf\x04\xde\x8c\x31\xe7\xab\xfd\x54\
+\xd6\x52\x03\xb5\x4a\x80\x5e\x6d\xc1\xf0\xfe\x03\x30\x3e\x6e\x42\
+\x40\x75\x06\x88\xa7\x6e\xc5\xfe\x5b\x19\xa3\x34\x79\xb2\x43\xb9\
+\x60\x00\xfb\xff\xa2\xf3\x3b\x0f\xf4\xb1\xa5\xbe\x23\xf0\x3b\x02\
+\x7d\x64\xc0\xc7\xea\xff\x02\x31\x2c\x60\x9c\x87\x80\xc6\x01\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x2e\xa0\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
+\x6e\x6f\x22\x3f\x3e\x0a\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x64\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\
+\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\
+\x6e\x74\x73\x2f\x31\x2e\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\
+\x6e\x73\x3a\x63\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x63\x72\
+\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\x6e\x73\x2e\x6f\x72\
+\x67\x2f\x6e\x73\x23\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
+\x72\x64\x66\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\
+\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x30\x32\x2f\x32\
+\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\x74\x61\x78\x2d\x6e\x73\x23\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x76\x67\x3d\x22\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\
+\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\
+\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\
+\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\
+\x22\x0a\x20\x20\x20\x64\x61\x74\x61\x2d\x6e\x61\x6d\x65\x3d\x22\
+\x4c\x61\x79\x65\x72\x20\x31\x22\x0a\x20\x20\x20\x76\x69\x65\x77\
+\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\
+\x22\x0a\x20\x20\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x31\x22\x0a\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\x35\x31\x32\
+\x22\x0a\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x35\x31\x32\
+\x22\x3e\x0a\x20\x20\x3c\x6d\x65\x74\x61\x64\x61\x74\x61\x0a\x20\
+\x20\x20\x20\x20\x69\x64\x3d\x22\x6d\x65\x74\x61\x64\x61\x74\x61\
+\x31\x31\x35\x22\x3e\x0a\x20\x20\x20\x20\x3c\x72\x64\x66\x3a\x52\
+\x44\x46\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x63\x63\x3a\x57\x6f\
+\x72\x6b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x64\x66\x3a\
+\x61\x62\x6f\x75\x74\x3d\x22\x22\x3e\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x20\x3c\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x69\x6d\x61\
+\x67\x65\x2f\x73\x76\x67\x2b\x78\x6d\x6c\x3c\x2f\x64\x63\x3a\x66\
+\x6f\x72\x6d\x61\x74\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\
+\x64\x63\x3a\x74\x79\x70\x65\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x72\x64\x66\x3a\x72\x65\x73\x6f\x75\x72\x63\x65\x3d\
+\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\x2e\x6f\x72\x67\
+\x2f\x64\x63\x2f\x64\x63\x6d\x69\x74\x79\x70\x65\x2f\x53\x74\x69\
+\x6c\x6c\x49\x6d\x61\x67\x65\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x3c\x64\x63\x3a\x74\x69\x74\x6c\x65\x3e\x34\x2d\
+\x62\x69\x74\x63\x6f\x69\x6e\x2d\x63\x61\x73\x68\x2d\x6c\x6f\x67\
+\x6f\x2d\x66\x6c\x61\x67\x3c\x2f\x64\x63\x3a\x74\x69\x74\x6c\x65\
+\x3e\x0a\x20\x20\x20\x20\x20\x20\x3c\x2f\x63\x63\x3a\x57\x6f\x72\
+\x6b\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x72\x64\x66\x3a\x52\x44\x46\
+\x3e\x0a\x20\x20\x3c\x2f\x6d\x65\x74\x61\x64\x61\x74\x61\x3e\x0a\
+\x20\x20\x3c\x64\x65\x66\x73\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\
+\x22\x64\x65\x66\x73\x31\x30\x30\x22\x3e\x0a\x20\x20\x20\x20\x3c\
+\x73\x74\x79\x6c\x65\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\
+\x22\x73\x74\x79\x6c\x65\x39\x38\x22\x3e\x2e\x63\x6c\x73\x2d\x31\
+\x7b\x66\x69\x6c\x6c\x3a\x23\x30\x30\x35\x36\x43\x30\x3b\x7d\x2e\
+\x63\x6c\x73\x2d\x32\x7b\x66\x69\x6c\x6c\x3a\x23\x66\x66\x66\x3b\
+\x7d\x3c\x2f\x73\x74\x79\x6c\x65\x3e\x0a\x20\x20\x3c\x2f\x64\x65\
+\x66\x73\x3e\x0a\x20\x20\x3c\x74\x69\x74\x6c\x65\x0a\x20\x20\x20\
+\x20\x20\x69\x64\x3d\x22\x74\x69\x74\x6c\x65\x31\x30\x32\x22\x3e\
+\x34\x2d\x62\x69\x74\x63\x6f\x69\x6e\x2d\x63\x61\x73\x68\x2d\x6c\
+\x6f\x67\x6f\x2d\x66\x6c\x61\x67\x3c\x2f\x74\x69\x74\x6c\x65\x3e\
+\x0a\x20\x20\x3c\x67\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x67\
+\x32\x35\x36\x30\x22\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x64\
+\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\x69\x6e\x65\x3b\x66\x69\
+\x6c\x6c\x3a\x23\x34\x64\x34\x64\x34\x64\x3b\x73\x74\x72\x6f\x6b\
+\x65\x2d\x77\x69\x64\x74\x68\x3a\x30\x2e\x36\x37\x38\x32\x34\x32\
+\x39\x38\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x64\x3d\x22\x6d\x20\
+\x34\x33\x33\x2e\x39\x35\x33\x31\x32\x2c\x31\x31\x36\x2e\x38\x35\
+\x31\x35\x36\x20\x63\x20\x32\x37\x2e\x32\x33\x39\x38\x33\x2c\x33\
+\x39\x2e\x36\x31\x35\x31\x32\x20\x34\x33\x2e\x31\x38\x35\x35\x35\
+\x2c\x38\x37\x2e\x36\x31\x30\x34\x31\x20\x34\x33\x2e\x31\x38\x35\
+\x35\x35\x2c\x31\x33\x39\x2e\x33\x31\x34\x34\x36\x20\x30\x2c\x35\
+\x31\x2e\x35\x38\x30\x36\x33\x20\x2d\x31\x35\x2e\x38\x37\x31\x31\
+\x35\x2c\x39\x39\x2e\x34\x34\x32\x33\x31\x20\x2d\x34\x32\x2e\x39\
+\x39\x32\x31\x39\x2c\x31\x33\x38\x2e\x39\x38\x32\x34\x32\x20\x48\
+\x20\x35\x31\x32\x20\x56\x20\x31\x31\x36\x2e\x38\x35\x31\x35\x36\
+\x20\x5a\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x70\
+\x61\x74\x68\x31\x30\x34\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\
+\x70\x61\x74\x68\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\
+\x65\x3d\x22\x64\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\x69\x6e\
+\x65\x3b\x66\x69\x6c\x6c\x3a\x23\x34\x64\x34\x64\x34\x64\x3b\x73\
+\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x30\x2e\x36\x37\
+\x38\x32\x34\x32\x39\x38\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x64\
+\x3d\x22\x4d\x20\x30\x2c\x31\x31\x36\x2e\x38\x35\x31\x35\x36\x20\
+\x56\x20\x33\x39\x35\x2e\x31\x34\x38\x34\x34\x20\x48\x20\x37\x38\
+\x2e\x31\x30\x35\x34\x36\x39\x20\x43\x20\x35\x30\x2e\x39\x35\x33\
+\x39\x35\x31\x2c\x33\x35\x35\x2e\x35\x39\x34\x37\x35\x20\x33\x35\
+\x2e\x30\x36\x32\x35\x2c\x33\x30\x37\x2e\x37\x30\x38\x36\x33\x20\
+\x33\x35\x2e\x30\x36\x32\x35\x2c\x32\x35\x36\x2e\x30\x39\x39\x36\
+\x31\x20\x63\x20\x30\x2c\x2d\x35\x31\x2e\x36\x39\x35\x30\x37\x20\
+\x31\x35\x2e\x39\x34\x32\x39\x38\x32\x2c\x2d\x39\x39\x2e\x36\x35\
+\x36\x38\x36\x20\x34\x33\x2e\x31\x37\x35\x37\x38\x31\x2c\x2d\x31\
+\x33\x39\x2e\x32\x34\x38\x30\x35\x20\x7a\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x31\x30\x36\x22\x20\
+\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x63\x69\x72\x63\x6c\x65\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x63\x6c\x61\x73\x73\x3d\x22\x63\x6c\x73\
+\x2d\x31\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x63\x78\x3d\x22\x32\
+\x35\x36\x2e\x30\x30\x31\x37\x31\x22\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x63\x79\x3d\x22\x32\x35\x36\x22\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x72\x3d\x22\x31\x39\x34\x2e\x38\x32\x32\x34\x32\x22\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x63\x69\x72\x63\x6c\x65\
+\x31\x30\x38\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\
+\x65\x3d\x22\x64\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\x69\x6e\
+\x65\x3b\x66\x69\x6c\x6c\x3a\x23\x34\x64\x34\x64\x34\x64\x3b\x73\
+\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x30\x2e\x36\x35\
+\x36\x31\x37\x37\x37\x22\x20\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x70\
+\x61\x74\x68\x0a\x20\x20\x20\x20\x20\x20\x20\x63\x6c\x61\x73\x73\
+\x3d\x22\x63\x6c\x73\x2d\x32\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x64\x3d\x22\x6d\x20\x33\x36\x34\x2e\x32\x32\x32\x32\x38\x2c\x32\
+\x36\x35\x2e\x36\x32\x33\x38\x31\x20\x2d\x30\x2e\x31\x32\x38\x30\
+\x37\x2c\x2d\x30\x2e\x32\x33\x38\x32\x34\x20\x2d\x30\x2e\x30\x32\
+\x31\x39\x2c\x2d\x30\x2e\x30\x33\x39\x32\x20\x63\x20\x2d\x30\x2e\
+\x30\x37\x37\x36\x2c\x2d\x30\x2e\x32\x33\x39\x38\x20\x2d\x30\x2e\
+\x31\x33\x35\x37\x39\x2c\x2d\x30\x2e\x34\x39\x30\x34\x33\x20\x2d\
+\x30\x2e\x32\x32\x34\x32\x36\x2c\x2d\x30\x2e\x37\x34\x39\x36\x32\
+\x20\x6c\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\
+\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x35\
+\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\
+\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x35\x20\x2d\
+\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\
+\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x33\x20\x2d\x30\x2e\
+\x30\x32\x31\x38\x2c\x2d\x30\x2e\x30\x33\x39\x36\x20\x61\x20\x34\
+\x37\x2e\x30\x36\x35\x38\x37\x39\x2c\x34\x37\x2e\x30\x36\x35\x38\
+\x37\x39\x20\x30\x20\x30\x20\x30\x20\x2d\x31\x35\x2e\x33\x38\x37\
+\x39\x35\x2c\x2d\x32\x33\x2e\x30\x32\x35\x32\x20\x6c\x20\x2d\x30\
+\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x33\x20\x63\x20\x2d\
+\x30\x2e\x32\x31\x36\x35\x33\x2c\x2d\x30\x2e\x31\x36\x35\x33\x31\
+\x20\x2d\x30\x2e\x34\x34\x33\x38\x39\x2c\x2d\x30\x2e\x33\x34\x39\
+\x39\x37\x20\x2d\x30\x2e\x36\x36\x31\x32\x31\x2c\x2d\x30\x2e\x35\
+\x31\x34\x35\x31\x20\x6c\x20\x2d\x30\x2e\x32\x39\x39\x35\x36\x2c\
+\x2d\x30\x2e\x32\x32\x32\x37\x31\x20\x2d\x30\x2e\x32\x31\x36\x34\
+\x36\x2c\x2d\x30\x2e\x31\x36\x34\x35\x31\x20\x2d\x30\x2e\x30\x39\
+\x33\x32\x2c\x2d\x30\x2e\x30\x37\x37\x37\x20\x2d\x30\x2e\x32\x30\
+\x36\x33\x38\x2c\x2d\x30\x2e\x31\x34\x35\x30\x38\x20\x2d\x30\x2e\
+\x30\x39\x33\x34\x2c\x2d\x30\x2e\x30\x37\x37\x36\x20\x2d\x30\x2e\
+\x32\x30\x36\x34\x2c\x2d\x30\x2e\x31\x34\x35\x30\x34\x20\x2d\x30\
+\x2e\x30\x39\x33\x32\x2c\x2d\x30\x2e\x30\x37\x37\x38\x20\x2d\x30\
+\x2e\x32\x31\x36\x34\x38\x2c\x2d\x30\x2e\x31\x36\x34\x35\x33\x20\
+\x2d\x30\x2e\x31\x31\x33\x33\x32\x2c\x2d\x30\x2e\x30\x36\x37\x37\
+\x20\x2d\x30\x2e\x32\x31\x36\x35\x33\x2c\x2d\x30\x2e\x31\x36\x34\
+\x34\x38\x20\x2d\x30\x2e\x31\x31\x33\x33\x34\x2c\x2d\x30\x2e\x30\
+\x36\x37\x37\x20\x2d\x30\x2e\x32\x33\x32\x38\x31\x2c\x2d\x30\x2e\
+\x31\x35\x35\x32\x31\x20\x2d\x30\x2e\x31\x31\x33\x33\x33\x2c\x2d\
+\x30\x2e\x30\x36\x37\x37\x20\x2d\x30\x2e\x31\x33\x37\x33\x34\x2c\
+\x2d\x30\x2e\x32\x30\x37\x39\x38\x20\x2d\x30\x2e\x31\x32\x33\x33\
+\x31\x2c\x2d\x30\x2e\x30\x38\x36\x38\x20\x2d\x30\x2e\x32\x33\x32\
+\x38\x32\x2c\x2d\x30\x2e\x31\x35\x35\x31\x38\x20\x2d\x30\x2e\x31\
+\x32\x33\x32\x39\x2c\x2d\x30\x2e\x30\x38\x36\x36\x20\x2d\x30\x2e\
+\x32\x33\x36\x36\x34\x2c\x2d\x30\x2e\x31\x35\x35\x32\x33\x20\x2d\
+\x30\x2e\x31\x32\x33\x33\x32\x2c\x2d\x30\x2e\x30\x38\x36\x36\x20\
+\x2d\x30\x2e\x32\x33\x32\x37\x38\x2c\x2d\x30\x2e\x31\x35\x35\x32\
+\x35\x20\x2d\x30\x2e\x31\x32\x33\x33\x35\x2c\x2d\x30\x2e\x30\x38\
+\x36\x38\x20\x2d\x30\x2e\x32\x34\x37\x35\x34\x2c\x2d\x30\x2e\x31\
+\x37\x33\x38\x38\x20\x2d\x30\x2e\x31\x32\x33\x32\x38\x2c\x2d\x30\
+\x2e\x30\x38\x36\x38\x20\x2d\x30\x2e\x32\x36\x37\x2c\x2d\x30\x2e\
+\x31\x36\x33\x37\x32\x20\x2d\x30\x2e\x31\x32\x33\x33\x31\x2c\x2d\
+\x30\x2e\x30\x38\x36\x39\x20\x2d\x30\x2e\x32\x36\x36\x39\x32\x2c\
+\x2d\x30\x2e\x31\x36\x33\x37\x32\x20\x2d\x30\x2e\x31\x32\x33\x33\
+\x34\x2c\x2d\x30\x2e\x30\x38\x36\x38\x20\x2d\x30\x2e\x32\x36\x36\
+\x39\x34\x2c\x2d\x30\x2e\x31\x36\x33\x37\x36\x20\x2d\x30\x2e\x31\
+\x32\x33\x33\x31\x2c\x2d\x30\x2e\x30\x38\x36\x37\x20\x2d\x30\x2e\
+\x32\x36\x36\x39\x32\x2c\x2d\x30\x2e\x31\x36\x33\x37\x34\x20\x2d\
+\x30\x2e\x31\x34\x33\x37\x2c\x2d\x30\x2e\x30\x37\x37\x36\x20\x2d\
+\x30\x2e\x32\x36\x36\x38\x39\x2c\x2d\x30\x2e\x31\x36\x33\x37\x36\
+\x20\x2d\x30\x2e\x31\x34\x33\x36\x32\x2c\x2d\x30\x2e\x30\x37\x37\
+\x34\x20\x2d\x30\x2e\x32\x38\x37\x31\x35\x2c\x2d\x30\x2e\x31\x35\
+\x35\x31\x38\x20\x2d\x30\x2e\x31\x34\x33\x36\x33\x2c\x2d\x30\x2e\
+\x30\x37\x37\x35\x20\x2d\x30\x2e\x32\x39\x38\x2c\x2d\x30\x2e\x31\
+\x37\x32\x32\x38\x20\x2d\x30\x2e\x31\x34\x33\x36\x33\x2c\x2d\x30\
+\x2e\x30\x37\x37\x38\x20\x2d\x30\x2e\x32\x39\x38\x30\x31\x2c\x2d\
+\x30\x2e\x31\x37\x32\x32\x39\x20\x2d\x30\x2e\x31\x34\x33\x35\x35\
+\x2c\x2d\x30\x2e\x30\x37\x37\x35\x20\x2d\x30\x2e\x32\x39\x38\x30\
+\x35\x2c\x2d\x30\x2e\x31\x37\x32\x32\x38\x20\x2d\x30\x2e\x31\x35\
+\x35\x32\x2c\x2d\x30\x2e\x30\x39\x36\x32\x20\x2d\x30\x2e\x32\x39\
+\x37\x39\x36\x2c\x2d\x30\x2e\x31\x37\x32\x33\x35\x20\x2d\x30\x2e\
+\x31\x35\x35\x32\x31\x2c\x2d\x30\x2e\x30\x39\x36\x31\x20\x2d\x30\
+\x2e\x33\x31\x37\x34\x2c\x2d\x30\x2e\x31\x36\x32\x31\x39\x20\x2d\
+\x30\x2e\x31\x35\x35\x32\x32\x2c\x2d\x30\x2e\x30\x39\x36\x32\x20\
+\x2d\x30\x2e\x33\x31\x37\x34\x32\x2c\x2d\x30\x2e\x31\x36\x32\x31\
+\x39\x20\x2d\x30\x2e\x32\x31\x34\x39\x32\x2c\x2d\x30\x2e\x31\x31\
+\x34\x37\x32\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\
+\x30\x35\x20\x63\x20\x2d\x30\x2e\x31\x35\x35\x32\x32\x2c\x2d\x30\
+\x2e\x30\x39\x35\x39\x20\x2d\x30\x2e\x33\x31\x37\x34\x32\x2c\x2d\
+\x30\x2e\x31\x36\x32\x31\x38\x20\x2d\x30\x2e\x34\x37\x31\x38\x31\
+\x2c\x2d\x30\x2e\x32\x35\x38\x34\x34\x20\x61\x20\x36\x35\x2e\x36\
+\x39\x37\x34\x34\x35\x2c\x36\x35\x2e\x36\x39\x37\x34\x34\x35\x20\
+\x30\x20\x30\x20\x30\x20\x2d\x32\x31\x2e\x30\x33\x38\x30\x34\x2c\
+\x2d\x36\x2e\x36\x34\x37\x33\x39\x20\x35\x38\x2e\x38\x32\x32\x36\
+\x35\x31\x2c\x35\x38\x2e\x38\x32\x32\x36\x35\x31\x20\x30\x20\x30\
+\x20\x30\x20\x35\x2e\x36\x33\x36\x32\x36\x2c\x2d\x37\x2e\x30\x37\
+\x38\x38\x39\x20\x6c\x20\x30\x2e\x32\x37\x30\x30\x38\x2c\x2d\x30\
+\x2e\x34\x30\x31\x32\x20\x30\x2e\x30\x32\x30\x34\x2c\x2d\x30\x2e\
+\x30\x30\x39\x20\x30\x2e\x31\x32\x34\x39\x34\x2c\x2d\x30\x2e\x31\
+\x39\x35\x36\x31\x20\x30\x2e\x31\x36\x33\x37\x37\x2c\x2d\x30\x2e\
+\x32\x36\x36\x39\x31\x20\x30\x2e\x30\x38\x36\x38\x2c\x2d\x30\x2e\
+\x31\x32\x33\x33\x33\x20\x30\x2e\x31\x36\x33\x37\x38\x2c\x2d\x30\
+\x2e\x32\x36\x36\x39\x35\x20\x30\x2e\x30\x38\x37\x2c\x2d\x30\x2e\
+\x31\x32\x33\x33\x33\x20\x30\x2e\x31\x36\x33\x37\x34\x2c\x2d\x30\
+\x2e\x32\x36\x36\x39\x32\x20\x30\x2e\x30\x38\x36\x38\x2c\x2d\x30\
+\x2e\x31\x32\x33\x33\x34\x20\x30\x2e\x31\x36\x33\x37\x35\x2c\x2d\
+\x30\x2e\x32\x36\x36\x39\x20\x30\x2e\x30\x38\x36\x38\x2c\x2d\x30\
+\x2e\x31\x32\x33\x33\x36\x20\x30\x2e\x31\x36\x33\x37\x2c\x2d\x30\
+\x2e\x32\x36\x36\x39\x35\x20\x30\x2e\x30\x38\x36\x35\x2c\x2d\x30\
+\x2e\x31\x32\x33\x33\x33\x20\x30\x2e\x31\x34\x33\x35\x39\x2c\x2d\
+\x30\x2e\x32\x35\x36\x37\x39\x20\x30\x2e\x30\x38\x36\x37\x2c\x2d\
+\x30\x2e\x31\x32\x33\x33\x32\x20\x30\x2e\x31\x34\x33\x36\x31\x2c\
+\x2d\x30\x2e\x32\x35\x36\x38\x39\x20\x30\x2e\x30\x36\x37\x37\x2c\
+\x2d\x30\x2e\x31\x31\x33\x33\x33\x20\x30\x2e\x31\x34\x33\x36\x33\
+\x2c\x2d\x30\x2e\x32\x35\x36\x38\x35\x20\x30\x2e\x30\x36\x37\x38\
+\x2c\x2d\x30\x2e\x31\x31\x33\x33\x33\x20\x30\x2e\x31\x34\x33\x36\
+\x35\x2c\x2d\x30\x2e\x32\x35\x36\x38\x36\x20\x30\x2e\x30\x36\x37\
+\x33\x2c\x2d\x30\x2e\x31\x31\x33\x33\x33\x20\x30\x2e\x31\x32\x33\
+\x33\x2c\x2d\x30\x2e\x32\x34\x35\x39\x39\x20\x30\x2e\x30\x36\x37\
+\x33\x2c\x2d\x30\x2e\x31\x31\x33\x33\x34\x20\x30\x2e\x31\x32\x33\
+\x32\x36\x2c\x2d\x30\x2e\x32\x34\x35\x39\x36\x20\x30\x2e\x30\x36\
+\x37\x37\x2c\x2d\x30\x2e\x31\x31\x33\x33\x33\x20\x30\x2e\x31\x32\
+\x33\x33\x31\x2c\x2d\x30\x2e\x32\x34\x36\x20\x30\x2e\x30\x36\x37\
+\x33\x2c\x2d\x30\x2e\x31\x31\x33\x33\x34\x20\x30\x2e\x31\x33\x33\
+\x34\x32\x2c\x2d\x30\x2e\x32\x32\x35\x38\x32\x20\x30\x2e\x30\x36\
+\x37\x37\x2c\x2d\x30\x2e\x31\x31\x33\x33\x34\x20\x30\x2e\x31\x33\
+\x34\x32\x33\x2c\x2d\x30\x2e\x32\x32\x35\x38\x33\x20\x30\x2e\x30\
+\x36\x37\x35\x2c\x2d\x30\x2e\x31\x31\x33\x33\x34\x20\x30\x2e\x31\
+\x31\x34\x38\x33\x2c\x2d\x30\x2e\x32\x31\x35\x20\x30\x2e\x30\x36\
+\x37\x36\x2c\x2d\x30\x2e\x31\x31\x33\x33\x33\x20\x30\x2e\x31\x31\
+\x34\x38\x34\x2c\x2d\x30\x2e\x32\x31\x34\x39\x33\x20\x30\x2e\x30\
+\x34\x37\x35\x2c\x2d\x30\x2e\x31\x30\x32\x34\x38\x20\x30\x2e\x31\
+\x31\x34\x36\x2c\x2d\x30\x2e\x32\x31\x34\x39\x39\x20\x30\x2e\x30\
+\x34\x37\x39\x2c\x2d\x30\x2e\x31\x30\x32\x35\x39\x20\x30\x2e\x31\
+\x31\x34\x38\x34\x2c\x2d\x30\x2e\x32\x31\x34\x39\x36\x20\x30\x2e\
+\x30\x34\x37\x35\x2c\x2d\x30\x2e\x31\x30\x32\x35\x38\x20\x30\x2e\
+\x31\x31\x34\x37\x31\x2c\x2d\x30\x2e\x32\x31\x34\x39\x38\x20\x30\
+\x2e\x30\x34\x37\x38\x2c\x2d\x30\x2e\x31\x30\x32\x35\x38\x20\x30\
+\x2e\x30\x39\x34\x37\x2c\x2d\x30\x2e\x32\x30\x34\x38\x36\x20\x30\
+\x2e\x30\x34\x37\x33\x2c\x2d\x30\x2e\x31\x30\x32\x36\x39\x20\x30\
+\x2e\x30\x39\x34\x35\x2c\x2d\x30\x2e\x32\x30\x34\x38\x37\x20\x30\
+\x2e\x30\x34\x37\x37\x2c\x2d\x30\x2e\x31\x30\x32\x34\x38\x20\x30\
+\x2e\x30\x39\x34\x37\x2c\x2d\x30\x2e\x32\x30\x34\x38\x33\x20\x30\
+\x2e\x30\x34\x37\x36\x2c\x2d\x30\x2e\x31\x30\x32\x34\x38\x20\x30\
+\x2e\x31\x30\x33\x38\x34\x2c\x2d\x30\x2e\x32\x33\x32\x38\x36\x20\
+\x30\x2e\x31\x34\x32\x30\x32\x2c\x2d\x30\x2e\x33\x31\x30\x34\x31\
+\x20\x63\x20\x30\x2e\x31\x30\x33\x38\x34\x2c\x2d\x30\x2e\x32\x33\
+\x32\x37\x37\x20\x30\x2e\x31\x38\x37\x38\x33\x2c\x2d\x30\x2e\x34\
+\x35\x39\x34\x32\x20\x30\x2e\x32\x39\x31\x37\x38\x2c\x2d\x30\x2e\
+\x36\x39\x34\x35\x20\x6c\x20\x30\x2e\x30\x32\x30\x34\x2c\x2d\x30\
+\x2e\x30\x30\x39\x20\x61\x20\x34\x31\x2e\x38\x30\x32\x31\x30\x33\
+\x2c\x34\x31\x2e\x38\x30\x32\x31\x30\x33\x20\x30\x20\x30\x20\x30\
+\x20\x32\x2e\x31\x32\x33\x39\x35\x2c\x2d\x32\x34\x2e\x35\x34\x32\
+\x35\x36\x20\x6c\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\
+\x32\x30\x33\x20\x2d\x30\x2e\x30\x32\x31\x36\x2c\x2d\x30\x2e\x30\
+\x33\x39\x36\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\
+\x30\x33\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\
+\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x33\
+\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\
+\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\
+\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x35\x20\x63\x20\
+\x2d\x30\x2e\x30\x34\x37\x37\x2c\x2d\x30\x2e\x32\x33\x32\x38\x20\
+\x2d\x30\x2e\x30\x39\x34\x39\x2c\x2d\x30\x2e\x34\x36\x30\x39\x33\
+\x20\x2d\x30\x2e\x31\x36\x31\x33\x36\x2c\x2d\x30\x2e\x36\x38\x31\
+\x33\x33\x20\x76\x20\x2d\x30\x2e\x30\x35\x30\x34\x20\x6c\x20\x2d\
+\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\
+\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\
+\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x35\x20\x30\x2e\x30\x30\
+\x39\x2c\x30\x2e\x30\x32\x30\x35\x20\x2d\x30\x2e\x30\x39\x36\x33\
+\x2c\x2d\x30\x2e\x31\x37\x38\x34\x35\x20\x63\x20\x2d\x30\x2e\x30\
+\x37\x2c\x2d\x30\x2e\x33\x32\x30\x34\x37\x20\x2d\x30\x2e\x31\x34\
+\x30\x33\x38\x2c\x2d\x30\x2e\x36\x34\x31\x20\x2d\x30\x2e\x32\x34\
+\x31\x33\x2c\x2d\x30\x2e\x39\x37\x30\x38\x35\x20\x2d\x30\x2e\x30\
+\x37\x2c\x2d\x30\x2e\x33\x32\x30\x34\x38\x20\x2d\x30\x2e\x31\x37\
+\x30\x37\x37\x2c\x2d\x30\x2e\x36\x35\x30\x32\x39\x20\x2d\x30\x2e\
+\x32\x36\x30\x37\x34\x2c\x2d\x30\x2e\x39\x36\x30\x36\x38\x20\x6c\
+\x20\x2d\x30\x2e\x31\x31\x37\x30\x38\x2c\x2d\x30\x2e\x32\x31\x38\
+\x30\x39\x20\x2d\x30\x2e\x30\x32\x31\x38\x2c\x2d\x30\x2e\x30\x33\
+\x39\x34\x20\x63\x20\x2d\x30\x2e\x30\x36\x37\x38\x2c\x2d\x30\x2e\
+\x32\x31\x39\x35\x38\x20\x2d\x30\x2e\x31\x33\x34\x32\x35\x2c\x2d\
+\x30\x2e\x34\x34\x20\x2d\x30\x2e\x32\x30\x31\x37\x36\x2c\x2d\x30\
+\x2e\x36\x35\x39\x36\x33\x20\x6c\x20\x2d\x30\x2e\x30\x30\x39\x2c\
+\x2d\x30\x2e\x30\x32\x30\x32\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\
+\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\
+\x2e\x30\x32\x30\x33\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\
+\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\
+\x32\x30\x33\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\
+\x30\x35\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\
+\x33\x20\x41\x20\x34\x31\x2e\x38\x31\x32\x31\x39\x33\x2c\x34\x31\
+\x2e\x38\x31\x32\x31\x39\x33\x20\x30\x20\x30\x20\x30\x20\x33\x31\
+\x35\x2e\x31\x38\x36\x36\x2c\x31\x36\x32\x2e\x32\x33\x30\x35\x38\
+\x20\x6c\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\
+\x35\x20\x63\x20\x2d\x30\x2e\x31\x38\x36\x32\x35\x2c\x2d\x30\x2e\
+\x31\x35\x35\x31\x39\x20\x2d\x30\x2e\x33\x39\x32\x37\x31\x2c\x2d\
+\x30\x2e\x33\x30\x31\x31\x32\x20\x2d\x30\x2e\x35\x37\x38\x39\x34\
+\x2c\x2d\x30\x2e\x34\x35\x36\x32\x38\x20\x6c\x20\x2d\x30\x2e\x32\
+\x35\x37\x36\x36\x2c\x2d\x30\x2e\x31\x39\x34\x30\x33\x20\x2d\x30\
+\x2e\x32\x30\x36\x34\x32\x2c\x2d\x30\x2e\x31\x34\x35\x30\x37\x20\
+\x2d\x30\x2e\x30\x39\x33\x32\x2c\x2d\x30\x2e\x30\x37\x37\x35\x20\
+\x2d\x30\x2e\x31\x37\x35\x33\x39\x2c\x2d\x30\x2e\x31\x33\x35\x36\
+\x36\x20\x2d\x30\x2e\x30\x39\x33\x31\x2c\x2d\x30\x2e\x30\x37\x37\
+\x38\x20\x2d\x30\x2e\x31\x37\x35\x33\x39\x2c\x2d\x30\x2e\x31\x33\
+\x35\x38\x31\x20\x2d\x30\x2e\x30\x39\x33\x32\x2c\x2d\x30\x2e\x30\
+\x37\x37\x37\x20\x2d\x30\x2e\x31\x39\x35\x35\x33\x2c\x2d\x30\x2e\
+\x31\x32\x34\x39\x37\x20\x2d\x30\x2e\x30\x39\x33\x31\x2c\x2d\x30\
+\x2e\x30\x37\x37\x38\x20\x2d\x30\x2e\x32\x30\x36\x34\x33\x2c\x2d\
+\x30\x2e\x31\x34\x35\x30\x33\x20\x2d\x30\x2e\x30\x39\x33\x31\x2c\
+\x2d\x30\x2e\x30\x37\x37\x38\x20\x2d\x30\x2e\x32\x30\x36\x34\x31\
+\x2c\x2d\x30\x2e\x31\x34\x35\x30\x37\x20\x2d\x30\x2e\x30\x39\x33\
+\x2c\x2d\x30\x2e\x30\x37\x37\x36\x20\x2d\x30\x2e\x32\x30\x36\x34\
+\x32\x2c\x2d\x30\x2e\x31\x34\x35\x30\x36\x20\x2d\x30\x2e\x31\x31\
+\x33\x33\x32\x2c\x2d\x30\x2e\x30\x36\x37\x36\x20\x2d\x30\x2e\x32\
+\x30\x36\x33\x39\x2c\x2d\x30\x2e\x31\x34\x35\x30\x38\x20\x2d\x30\
+\x2e\x31\x31\x33\x33\x33\x2c\x2d\x30\x2e\x30\x36\x37\x37\x20\x2d\
+\x30\x2e\x32\x30\x36\x34\x36\x2c\x2d\x30\x2e\x31\x34\x35\x31\x36\
+\x20\x2d\x30\x2e\x31\x31\x33\x33\x33\x2c\x2d\x30\x2e\x30\x36\x37\
+\x35\x20\x2d\x30\x2e\x32\x32\x35\x38\x31\x2c\x2d\x30\x2e\x31\x33\
+\x34\x32\x38\x20\x2d\x30\x2e\x31\x31\x33\x33\x33\x2c\x2d\x30\x2e\
+\x30\x36\x37\x38\x20\x2d\x30\x2e\x32\x32\x35\x38\x36\x2c\x2d\x30\
+\x2e\x31\x33\x34\x33\x33\x20\x2d\x30\x2e\x31\x31\x33\x33\x32\x2c\
+\x2d\x30\x2e\x30\x36\x37\x35\x20\x2d\x30\x2e\x32\x32\x35\x38\x38\
+\x2c\x2d\x30\x2e\x31\x33\x34\x32\x38\x20\x2d\x30\x2e\x31\x31\x33\
+\x33\x33\x2c\x2d\x30\x2e\x30\x36\x37\x37\x20\x2d\x30\x2e\x32\x32\
+\x35\x38\x33\x2c\x2d\x30\x2e\x31\x33\x34\x33\x32\x20\x2d\x30\x2e\
+\x31\x31\x33\x33\x33\x2c\x2d\x30\x2e\x30\x36\x37\x36\x20\x2d\x30\
+\x2e\x32\x33\x36\x36\x38\x2c\x2d\x30\x2e\x31\x35\x35\x31\x39\x20\
+\x2d\x30\x2e\x31\x31\x33\x33\x34\x2c\x2d\x30\x2e\x30\x36\x37\x37\
+\x20\x2d\x30\x2e\x32\x33\x36\x36\x39\x2c\x2d\x30\x2e\x31\x35\x35\
+\x31\x38\x20\x2d\x30\x2e\x31\x31\x33\x33\x34\x2c\x2d\x30\x2e\x30\
+\x36\x37\x35\x20\x2d\x30\x2e\x32\x35\x36\x38\x35\x2c\x2d\x30\x2e\
+\x31\x34\x33\x36\x37\x20\x2d\x30\x2e\x31\x31\x33\x33\x33\x2c\x2d\
+\x30\x2e\x30\x36\x37\x37\x20\x2d\x30\x2e\x32\x35\x36\x30\x38\x2c\
+\x2d\x30\x2e\x31\x34\x33\x36\x32\x20\x2d\x30\x2e\x31\x32\x33\x33\
+\x34\x2c\x2d\x30\x2e\x30\x38\x36\x39\x20\x2d\x30\x2e\x32\x35\x36\
+\x38\x31\x2c\x2d\x30\x2e\x31\x34\x33\x35\x38\x20\x2d\x30\x2e\x31\
+\x32\x33\x33\x33\x2c\x2d\x30\x2e\x30\x38\x36\x37\x20\x2d\x30\x2e\
+\x32\x35\x36\x30\x39\x2c\x2d\x30\x2e\x31\x34\x33\x36\x20\x2d\x30\
+\x2e\x31\x32\x33\x33\x33\x2c\x2d\x30\x2e\x30\x38\x36\x37\x20\x2d\
+\x30\x2e\x32\x36\x36\x39\x34\x2c\x2d\x30\x2e\x31\x36\x33\x37\x33\
+\x20\x2d\x30\x2e\x31\x34\x33\x36\x2c\x2d\x30\x2e\x30\x37\x37\x35\
+\x20\x2d\x30\x2e\x32\x36\x36\x39\x36\x2c\x2d\x30\x2e\x31\x36\x33\
+\x37\x32\x20\x2d\x30\x2e\x31\x34\x33\x36\x32\x2c\x2d\x30\x2e\x30\
+\x37\x37\x36\x20\x2d\x30\x2e\x32\x38\x37\x31\x31\x2c\x2d\x30\x2e\
+\x31\x35\x35\x32\x31\x20\x2d\x30\x2e\x31\x34\x33\x36\x36\x2c\x2d\
+\x30\x2e\x30\x37\x37\x36\x20\x2d\x30\x2e\x32\x38\x37\x31\x33\x2c\
+\x2d\x30\x2e\x31\x35\x35\x31\x37\x20\x2d\x30\x2e\x32\x30\x34\x38\
+\x35\x2c\x2d\x30\x2e\x30\x39\x34\x36\x20\x2d\x30\x2e\x30\x30\x39\
+\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x34\x33\x30\x37\
+\x2c\x2d\x30\x2e\x32\x33\x32\x38\x20\x63\x20\x2d\x31\x32\x2e\x35\
+\x38\x32\x35\x2c\x2d\x36\x2e\x35\x33\x39\x35\x36\x20\x2d\x32\x38\
+\x2e\x35\x36\x37\x37\x39\x2c\x2d\x38\x2e\x35\x30\x38\x33\x34\x20\
+\x2d\x34\x34\x2e\x36\x35\x30\x39\x33\x2c\x2d\x34\x2e\x33\x38\x32\
+\x32\x20\x6c\x20\x2d\x34\x2e\x31\x38\x33\x35\x36\x2c\x31\x2e\x30\
+\x37\x34\x30\x31\x20\x2d\x31\x30\x2e\x35\x38\x31\x38\x36\x2c\x2d\
+\x34\x31\x2e\x32\x30\x36\x39\x20\x2d\x32\x34\x2e\x35\x32\x32\x33\
+\x31\x2c\x36\x2e\x32\x38\x35\x37\x39\x20\x31\x30\x2e\x35\x34\x36\
+\x39\x34\x2c\x34\x31\x2e\x30\x34\x33\x39\x20\x2d\x31\x39\x2e\x36\
+\x32\x32\x36\x2c\x35\x2e\x30\x35\x38\x31\x34\x20\x2d\x31\x30\x2e\
+\x35\x35\x33\x39\x31\x2c\x2d\x34\x30\x2e\x39\x31\x32\x37\x38\x20\
+\x2d\x32\x34\x2e\x35\x32\x32\x33\x36\x2c\x36\x2e\x32\x38\x35\x38\
+\x31\x20\x31\x30\x2e\x35\x34\x36\x39\x34\x2c\x34\x31\x2e\x30\x34\
+\x33\x39\x37\x20\x2d\x35\x30\x2e\x35\x37\x31\x31\x37\x2c\x31\x33\
+\x2e\x30\x31\x33\x31\x33\x20\x36\x2e\x37\x32\x38\x39\x2c\x32\x36\
+\x2e\x31\x35\x32\x30\x32\x20\x32\x30\x2e\x33\x37\x36\x38\x34\x2c\
+\x2d\x35\x2e\x32\x33\x33\x35\x20\x61\x20\x31\x32\x2e\x36\x31\x30\
+\x33\x39\x36\x2c\x31\x32\x2e\x36\x31\x30\x33\x39\x36\x20\x30\x20\
+\x30\x20\x31\x20\x31\x35\x2e\x33\x36\x35\x33\x32\x2c\x39\x2e\x30\
+\x38\x37\x39\x39\x20\x76\x20\x30\x20\x6c\x20\x32\x38\x2e\x32\x38\
+\x33\x37\x33\x2c\x31\x31\x30\x2e\x30\x35\x33\x34\x35\x20\x61\x20\
+\x38\x2e\x34\x32\x35\x32\x39\x38\x2c\x38\x2e\x34\x32\x35\x32\x39\
+\x38\x20\x30\x20\x30\x20\x31\x20\x2d\x36\x2e\x30\x35\x32\x39\x39\
+\x2c\x31\x30\x2e\x32\x34\x38\x32\x33\x20\x6c\x20\x2d\x31\x37\x2e\
+\x38\x35\x34\x37\x39\x2c\x34\x2e\x35\x39\x33\x32\x34\x20\x31\x2e\
+\x30\x34\x39\x32\x32\x2c\x33\x31\x2e\x31\x30\x33\x30\x37\x20\x35\
+\x30\x2e\x35\x31\x31\x34\x2c\x2d\x31\x32\x2e\x39\x38\x30\x35\x34\
+\x20\x31\x30\x2e\x36\x38\x32\x37\x35\x2c\x34\x30\x2e\x39\x36\x39\
+\x34\x31\x20\x32\x34\x2e\x35\x30\x39\x39\x35\x2c\x2d\x36\x2e\x33\
+\x30\x36\x37\x35\x20\x2d\x31\x30\x2e\x35\x35\x33\x39\x32\x2c\x2d\
+\x34\x31\x2e\x30\x36\x34\x31\x35\x20\x31\x39\x2e\x36\x31\x36\x33\
+\x34\x2c\x2d\x35\x2e\x30\x32\x39\x33\x37\x20\x31\x30\x2e\x35\x35\
+\x37\x38\x31\x2c\x34\x31\x2e\x30\x36\x33\x33\x33\x20\x32\x34\x2e\
+\x35\x30\x39\x39\x36\x2c\x2d\x36\x2e\x33\x30\x36\x37\x33\x20\x2d\
+\x31\x30\x2e\x35\x39\x33\x35\x33\x2c\x2d\x34\x31\x2e\x32\x32\x33\
+\x39\x36\x20\x63\x20\x34\x2e\x31\x35\x33\x33\x31\x2c\x2d\x31\x2e\
+\x30\x38\x36\x34\x37\x20\x37\x2e\x37\x32\x36\x31\x36\x2c\x2d\x32\
+\x2e\x30\x30\x38\x33\x37\x20\x31\x30\x2e\x31\x39\x37\x37\x36\x2c\
+\x2d\x32\x2e\x36\x34\x37\x38\x32\x20\x31\x38\x2e\x31\x32\x34\x38\
+\x33\x2c\x2d\x34\x2e\x36\x36\x31\x35\x38\x20\x33\x32\x2e\x37\x38\
+\x31\x36\x32\x2c\x2d\x31\x35\x2e\x32\x38\x37\x37\x31\x20\x34\x31\
+\x2e\x36\x35\x30\x38\x31\x2c\x2d\x32\x38\x2e\x35\x33\x38\x33\x20\
+\x6c\x20\x30\x2e\x32\x39\x39\x35\x31\x2c\x2d\x30\x2e\x34\x34\x32\
+\x33\x34\x20\x30\x2e\x30\x32\x30\x35\x2c\x2d\x30\x2e\x30\x30\x39\
+\x20\x30\x2e\x31\x34\x35\x30\x36\x2c\x2d\x30\x2e\x32\x30\x36\x34\
+\x32\x20\x30\x2e\x31\x39\x32\x34\x38\x2c\x2d\x30\x2e\x33\x31\x30\
+\x34\x33\x20\x30\x2e\x30\x39\x36\x32\x2c\x2d\x30\x2e\x31\x35\x35\
+\x32\x20\x30\x2e\x31\x39\x32\x34\x32\x2c\x2d\x30\x2e\x33\x31\x30\
+\x33\x39\x20\x30\x2e\x30\x39\x35\x39\x2c\x2d\x30\x2e\x31\x35\x35\
+\x32\x31\x20\x30\x2e\x31\x37\x32\x33\x2c\x2d\x30\x2e\x32\x39\x37\
+\x39\x37\x20\x30\x2e\x30\x39\x36\x2c\x2d\x30\x2e\x31\x35\x35\x32\
+\x34\x20\x30\x2e\x31\x37\x32\x33\x33\x2c\x2d\x30\x2e\x32\x39\x38\
+\x30\x31\x20\x30\x2e\x30\x37\x37\x35\x2c\x2d\x30\x2e\x31\x34\x33\
+\x35\x39\x20\x30\x2e\x31\x37\x32\x33\x31\x2c\x2d\x30\x2e\x32\x39\
+\x37\x39\x38\x20\x30\x2e\x30\x37\x37\x37\x2c\x2d\x30\x2e\x31\x34\
+\x33\x36\x35\x20\x30\x2e\x31\x37\x32\x32\x37\x2c\x2d\x30\x2e\x32\
+\x39\x38\x20\x30\x2e\x30\x37\x37\x35\x2c\x2d\x30\x2e\x31\x34\x33\
+\x36\x20\x30\x2e\x31\x35\x35\x32\x34\x2c\x2d\x30\x2e\x32\x38\x37\
+\x31\x35\x20\x30\x2e\x30\x37\x37\x36\x2c\x2d\x30\x2e\x31\x34\x33\
+\x36\x20\x30\x2e\x31\x35\x35\x32\x2c\x2d\x30\x2e\x32\x38\x37\x30\
+\x39\x20\x30\x2e\x30\x37\x37\x34\x2c\x2d\x30\x2e\x31\x34\x33\x36\
+\x37\x20\x30\x2e\x31\x36\x33\x37\x37\x2c\x2d\x30\x2e\x32\x36\x36\
+\x39\x35\x20\x30\x2e\x30\x37\x37\x39\x2c\x2d\x30\x2e\x31\x34\x33\
+\x36\x20\x30\x2e\x31\x36\x33\x37\x36\x2c\x2d\x30\x2e\x32\x36\x36\
+\x39\x38\x20\x30\x2e\x30\x37\x37\x37\x2c\x2d\x30\x2e\x31\x34\x33\
+\x35\x39\x20\x30\x2e\x31\x34\x33\x36\x34\x2c\x2d\x30\x2e\x32\x35\
+\x36\x39\x32\x20\x30\x2e\x30\x37\x37\x37\x2c\x2d\x30\x2e\x31\x34\
+\x33\x36\x33\x20\x30\x2e\x31\x34\x33\x36\x32\x2c\x2d\x30\x2e\x32\
+\x35\x36\x30\x35\x20\x30\x2e\x30\x37\x37\x36\x2c\x2d\x30\x2e\x31\
+\x34\x33\x36\x33\x20\x30\x2e\x31\x34\x33\x36\x33\x2c\x2d\x30\x2e\
+\x32\x35\x36\x31\x31\x20\x30\x2e\x30\x35\x36\x38\x2c\x2d\x30\x2e\
+\x31\x33\x32\x37\x37\x20\x30\x2e\x31\x34\x33\x36\x35\x2c\x2d\x30\
+\x2e\x32\x35\x36\x30\x36\x20\x30\x2e\x30\x35\x36\x38\x2c\x2d\x30\
+\x2e\x31\x33\x32\x37\x37\x20\x30\x2e\x31\x32\x33\x32\x37\x2c\x2d\
+\x30\x2e\x32\x34\x35\x39\x37\x20\x30\x2e\x30\x36\x37\x35\x2c\x2d\
+\x30\x2e\x31\x31\x33\x33\x32\x20\x30\x2e\x31\x32\x33\x33\x39\x2c\
+\x2d\x30\x2e\x32\x34\x35\x39\x38\x20\x30\x2e\x30\x36\x37\x33\x2c\
+\x2d\x30\x2e\x31\x31\x33\x33\x32\x20\x30\x2e\x31\x32\x33\x33\x2c\
+\x2d\x30\x2e\x32\x34\x36\x30\x37\x20\x30\x2e\x30\x36\x37\x35\x2c\
+\x2d\x30\x2e\x31\x31\x33\x32\x31\x20\x30\x2e\x31\x32\x33\x33\x32\
+\x2c\x2d\x30\x2e\x32\x34\x35\x39\x39\x20\x30\x2e\x30\x36\x37\x33\
+\x2c\x2d\x30\x2e\x31\x31\x33\x33\x33\x20\x30\x2e\x31\x32\x33\x33\
+\x36\x2c\x2d\x30\x2e\x32\x34\x35\x39\x38\x20\x30\x2e\x30\x36\x37\
+\x37\x2c\x2d\x30\x2e\x31\x31\x33\x33\x32\x20\x30\x2e\x31\x32\x33\
+\x33\x32\x2c\x2d\x30\x2e\x32\x34\x36\x30\x32\x20\x30\x2e\x30\x36\
+\x37\x37\x2c\x2d\x30\x2e\x31\x31\x33\x33\x32\x20\x30\x2e\x31\x30\
+\x33\x38\x35\x2c\x2d\x30\x2e\x32\x33\x32\x38\x35\x20\x30\x2e\x30\
+\x36\x37\x37\x2c\x2d\x30\x2e\x31\x31\x33\x33\x33\x20\x30\x2e\x31\
+\x30\x34\x30\x36\x2c\x2d\x30\x2e\x32\x33\x32\x38\x32\x20\x30\x2e\
+\x30\x34\x37\x37\x2c\x2d\x30\x2e\x31\x30\x32\x34\x38\x20\x30\x2e\
+\x31\x31\x33\x33\x32\x2c\x2d\x30\x2e\x32\x36\x35\x33\x39\x20\x30\
+\x2e\x31\x35\x35\x32\x33\x2c\x2d\x30\x2e\x33\x33\x37\x35\x33\x20\
+\x63\x20\x30\x2e\x31\x31\x33\x33\x33\x2c\x2d\x30\x2e\x32\x36\x35\
+\x34\x20\x30\x2e\x32\x33\x32\x37\x38\x2c\x2d\x30\x2e\x35\x31\x31\
+\x34\x33\x20\x30\x2e\x33\x32\x39\x37\x39\x2c\x2d\x30\x2e\x37\x36\
+\x36\x37\x20\x6c\x20\x30\x2e\x30\x30\x38\x2c\x2d\x30\x2e\x30\x33\
+\x30\x31\x20\x61\x20\x34\x37\x2e\x31\x31\x37\x30\x39\x37\x2c\x34\
+\x37\x2e\x31\x31\x37\x30\x39\x37\x20\x30\x20\x30\x20\x30\x20\x32\
+\x2e\x33\x39\x36\x33\x37\x2c\x2d\x32\x37\x2e\x36\x30\x35\x35\x38\
+\x20\x6c\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\
+\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x32\
+\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\
+\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\
+\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x33\x20\x2d\x30\
+\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\
+\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x33\x20\x2d\x30\x2e\x30\
+\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x32\x20\x63\x20\x2d\x30\x2e\
+\x30\x35\x38\x33\x2c\x2d\x30\x2e\x32\x35\x30\x36\x36\x20\x2d\x30\
+\x2e\x31\x31\x35\x37\x36\x2c\x2d\x30\x2e\x35\x30\x30\x35\x35\x20\
+\x2d\x30\x2e\x31\x37\x33\x38\x34\x2c\x2d\x30\x2e\x37\x35\x31\x31\
+\x36\x20\x76\x20\x2d\x30\x2e\x30\x35\x30\x35\x20\x6c\x20\x2d\x30\
+\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x35\x20\x2d\x30\x2e\
+\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\
+\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x35\x20\x2d\x30\x2e\x30\x30\
+\x39\x2c\x2d\x30\x2e\x30\x32\x30\x32\x20\x2d\x30\x2e\x30\x30\x39\
+\x2c\x2d\x30\x2e\x30\x32\x30\x35\x20\x2d\x30\x2e\x30\x30\x39\x2c\
+\x2d\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\
+\x30\x2e\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\
+\x2e\x30\x32\x30\x35\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\
+\x30\x32\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\
+\x32\x30\x35\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\
+\x30\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\
+\x34\x20\x2d\x30\x2e\x30\x30\x39\x2c\x2d\x30\x2e\x30\x32\x30\x34\
+\x20\x2d\x30\x2e\x30\x34\x33\x2c\x2d\x30\x2e\x30\x37\x37\x36\x20\
+\x63\x20\x2d\x30\x2e\x30\x39\x31\x36\x2c\x2d\x30\x2e\x33\x36\x30\
+\x30\x38\x20\x2d\x30\x2e\x31\x36\x32\x39\x39\x2c\x2d\x30\x2e\x37\
+\x33\x31\x30\x33\x20\x2d\x30\x2e\x32\x37\x34\x37\x34\x2c\x2d\x31\
+\x2e\x30\x38\x31\x30\x31\x20\x2d\x30\x2e\x30\x33\x37\x32\x2c\x2d\
+\x30\x2e\x32\x30\x38\x37\x35\x20\x2d\x30\x2e\x30\x38\x39\x32\x2c\
+\x2d\x30\x2e\x35\x39\x30\x35\x38\x20\x2d\x30\x2e\x31\x31\x31\x35\
+\x39\x2c\x2d\x31\x2e\x30\x30\x39\x36\x20\x7a\x20\x6d\x20\x2d\x31\
+\x34\x34\x2e\x30\x37\x37\x35\x2c\x2d\x37\x33\x2e\x36\x32\x32\x31\
+\x37\x20\x63\x20\x34\x2e\x31\x38\x33\x35\x38\x2c\x2d\x31\x2e\x30\
+\x37\x34\x30\x31\x20\x32\x31\x2e\x34\x38\x31\x31\x38\x2c\x2d\x35\
+\x2e\x34\x31\x38\x32\x32\x20\x32\x37\x2e\x31\x38\x34\x39\x34\x2c\
+\x2d\x36\x2e\x39\x30\x31\x31\x36\x20\x39\x2e\x30\x36\x37\x38\x35\
+\x2c\x2d\x32\x2e\x33\x32\x31\x31\x32\x20\x31\x38\x2e\x30\x30\x33\
+\x37\x37\x2c\x2d\x31\x2e\x34\x32\x30\x31\x36\x20\x32\x34\x2e\x39\
+\x38\x30\x32\x33\x2c\x31\x2e\x39\x34\x20\x6c\x20\x30\x2e\x32\x33\
+\x32\x38\x2c\x30\x2e\x31\x30\x33\x39\x35\x20\x76\x20\x30\x20\x6c\
+\x20\x30\x2e\x31\x30\x32\x34\x38\x2c\x30\x2e\x30\x34\x37\x36\x20\
+\x30\x2e\x31\x34\x33\x36\x32\x2c\x30\x2e\x30\x37\x37\x38\x20\x30\
+\x2e\x30\x37\x31\x32\x2c\x30\x2e\x30\x33\x38\x31\x20\x30\x2e\x31\
+\x34\x33\x35\x38\x2c\x30\x2e\x30\x37\x37\x35\x20\x30\x2e\x30\x37\
+\x31\x34\x2c\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x34\x33\x36\
+\x36\x2c\x30\x2e\x30\x37\x37\x35\x20\x30\x2e\x30\x37\x31\x35\x2c\
+\x30\x2e\x30\x33\x37\x38\x20\x30\x2e\x31\x34\x33\x36\x2c\x30\x2e\
+\x30\x37\x37\x35\x20\x30\x2e\x30\x37\x31\x35\x2c\x30\x2e\x30\x33\
+\x37\x39\x20\x30\x2e\x31\x34\x33\x35\x39\x2c\x30\x2e\x30\x37\x37\
+\x36\x20\x30\x2e\x30\x37\x31\x36\x2c\x30\x2e\x30\x33\x37\x39\x20\
+\x30\x2e\x31\x34\x33\x36\x31\x2c\x30\x2e\x30\x37\x37\x35\x20\x30\
+\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\
+\x34\x33\x36\x32\x2c\x30\x2e\x30\x37\x37\x34\x20\x30\x2e\x30\x37\
+\x31\x34\x2c\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x34\x33\x35\
+\x37\x2c\x30\x2e\x30\x37\x37\x35\x20\x30\x2e\x30\x37\x31\x36\x2c\
+\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x34\x33\x36\x2c\x30\x2e\
+\x30\x37\x37\x38\x20\x30\x2e\x30\x37\x31\x35\x2c\x30\x2e\x30\x33\
+\x38\x31\x20\x30\x2e\x31\x32\x33\x32\x36\x2c\x30\x2e\x30\x38\x36\
+\x37\x20\x30\x2e\x30\x37\x31\x32\x2c\x30\x2e\x30\x33\x38\x31\x20\
+\x30\x2e\x31\x32\x33\x33\x32\x2c\x30\x2e\x30\x38\x36\x36\x20\x30\
+\x2e\x30\x37\x31\x35\x2c\x30\x2e\x30\x33\x38\x31\x20\x30\x2e\x31\
+\x32\x33\x33\x31\x2c\x30\x2e\x30\x38\x36\x36\x20\x30\x2e\x30\x37\
+\x31\x34\x2c\x30\x2e\x30\x33\x38\x31\x20\x30\x2e\x31\x31\x33\x33\
+\x34\x2c\x30\x2e\x30\x36\x37\x37\x20\x30\x2e\x30\x37\x31\x33\x2c\
+\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x31\x33\x33\x33\x2c\x30\
+\x2e\x30\x36\x37\x35\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\
+\x33\x37\x39\x20\x30\x2e\x31\x31\x33\x33\x33\x2c\x30\x2e\x30\x36\
+\x37\x35\x20\x30\x2e\x30\x37\x31\x33\x2c\x30\x2e\x30\x33\x38\x20\
+\x30\x2e\x31\x31\x33\x33\x34\x2c\x30\x2e\x30\x36\x37\x35\x20\x30\
+\x2e\x30\x37\x31\x33\x2c\x30\x2e\x30\x33\x38\x20\x30\x2e\x31\x31\
+\x33\x33\x33\x2c\x30\x2e\x30\x36\x37\x36\x20\x30\x2e\x30\x35\x31\
+\x39\x2c\x30\x2e\x30\x34\x38\x38\x20\x30\x2e\x31\x31\x33\x33\x34\
+\x2c\x30\x2e\x30\x36\x37\x36\x20\x30\x2e\x30\x34\x31\x2c\x30\x2e\
+\x30\x32\x38\x36\x20\x30\x2e\x31\x31\x33\x33\x33\x2c\x30\x2e\x30\
+\x36\x37\x37\x20\x30\x2e\x30\x34\x31\x32\x2c\x30\x2e\x30\x32\x38\
+\x37\x20\x30\x2e\x31\x31\x33\x33\x33\x2c\x30\x2e\x30\x36\x37\x34\
+\x20\x30\x2e\x30\x34\x31\x33\x2c\x30\x2e\x30\x32\x38\x34\x20\x30\
+\x2e\x31\x31\x33\x33\x34\x2c\x30\x2e\x30\x36\x37\x37\x20\x30\x2e\
+\x30\x34\x31\x2c\x30\x2e\x30\x32\x38\x36\x20\x30\x2e\x30\x39\x33\
+\x31\x2c\x30\x2e\x30\x37\x37\x35\x20\x30\x2e\x30\x34\x31\x2c\x30\
+\x2e\x30\x32\x38\x34\x20\x30\x2e\x31\x31\x33\x33\x34\x2c\x30\x2e\
+\x30\x36\x37\x34\x20\x30\x2e\x31\x35\x35\x31\x36\x2c\x30\x2e\x30\
+\x39\x36\x32\x20\x63\x20\x30\x2e\x31\x31\x33\x33\x34\x2c\x30\x2e\
+\x30\x36\x37\x37\x20\x30\x2e\x32\x31\x36\x34\x39\x2c\x30\x2e\x31\
+\x36\x35\x33\x20\x30\x2e\x33\x32\x39\x38\x34\x2c\x30\x2e\x32\x33\
+\x32\x38\x32\x20\x76\x20\x30\x20\x61\x20\x32\x31\x2e\x31\x34\x37\
+\x34\x33\x39\x2c\x32\x31\x2e\x31\x34\x37\x34\x33\x39\x20\x30\x20\
+\x30\x20\x31\x20\x37\x2e\x34\x39\x34\x38\x31\x2c\x31\x30\x2e\x37\
+\x33\x37\x30\x34\x20\x76\x20\x30\x20\x6c\x20\x30\x2e\x30\x33\x31\
+\x37\x2c\x30\x2e\x30\x35\x39\x38\x20\x63\x20\x30\x2e\x30\x33\x33\
+\x36\x2c\x30\x2e\x31\x31\x30\x32\x35\x20\x30\x2e\x30\x37\x37\x36\
+\x2c\x30\x2e\x32\x33\x39\x37\x36\x20\x30\x2e\x31\x31\x30\x39\x2c\
+\x30\x2e\x33\x34\x39\x39\x37\x20\x6c\x20\x30\x2e\x30\x30\x39\x2c\
+\x30\x2e\x30\x32\x30\x34\x20\x30\x2e\x30\x36\x34\x35\x2c\x30\x2e\
+\x31\x31\x38\x37\x20\x63\x20\x30\x2e\x30\x34\x35\x38\x2c\x30\x2e\
+\x31\x38\x30\x30\x39\x20\x30\x2e\x31\x30\x30\x39\x31\x2c\x30\x2e\
+\x33\x32\x39\x38\x35\x20\x30\x2e\x31\x34\x36\x36\x38\x2c\x30\x2e\
+\x35\x30\x39\x38\x36\x20\x61\x20\x33\x2e\x30\x36\x37\x36\x32\x34\
+\x37\x2c\x33\x2e\x30\x36\x37\x36\x32\x34\x37\x20\x30\x20\x30\x20\
+\x31\x20\x30\x2e\x30\x39\x37\x37\x2c\x30\x2e\x35\x36\x31\x39\x31\
+\x20\x6c\x20\x30\x2e\x30\x36\x34\x33\x2c\x30\x2e\x31\x31\x38\x36\
+\x39\x20\x30\x2e\x30\x30\x39\x2c\x30\x2e\x30\x32\x30\x35\x20\x61\
+\x20\x31\x2e\x37\x30\x37\x32\x35\x33\x34\x2c\x31\x2e\x37\x30\x37\
+\x32\x35\x33\x37\x20\x30\x20\x30\x20\x30\x20\x30\x2e\x30\x39\x31\
+\x36\x2c\x30\x2e\x33\x36\x30\x30\x34\x20\x6c\x20\x30\x2e\x30\x33\
+\x31\x38\x2c\x30\x2e\x30\x36\x20\x76\x20\x30\x20\x61\x20\x32\x31\
+\x2e\x32\x31\x37\x32\x38\x33\x2c\x32\x31\x2e\x32\x31\x37\x32\x38\
+\x33\x20\x30\x20\x30\x20\x31\x20\x2d\x31\x2e\x33\x39\x36\x38\x37\
+\x2c\x31\x33\x2e\x30\x31\x32\x33\x34\x20\x76\x20\x30\x20\x6c\x20\
+\x2d\x30\x2e\x31\x36\x30\x36\x36\x2c\x30\x2e\x33\x36\x37\x38\x36\
+\x20\x2d\x30\x2e\x30\x38\x35\x33\x2c\x30\x2e\x31\x37\x33\x38\x38\
+\x20\x2d\x30\x2e\x30\x36\x37\x34\x2c\x30\x2e\x31\x31\x33\x33\x34\
+\x20\x2d\x30\x2e\x30\x31\x38\x36\x2c\x30\x2e\x30\x36\x31\x31\x20\
+\x2d\x30\x2e\x30\x34\x37\x33\x2c\x30\x2e\x31\x30\x32\x35\x38\x20\
+\x2d\x30\x2e\x30\x31\x38\x36\x2c\x30\x2e\x30\x36\x31\x34\x20\x2d\
+\x30\x2e\x30\x36\x37\x36\x2c\x30\x2e\x31\x31\x33\x33\x32\x20\x2d\
+\x30\x2e\x30\x31\x38\x36\x2c\x30\x2e\x30\x36\x31\x20\x2d\x30\x2e\
+\x30\x36\x37\x35\x2c\x30\x2e\x31\x31\x33\x33\x32\x20\x2d\x30\x2e\
+\x30\x31\x38\x36\x2c\x30\x2e\x30\x36\x31\x33\x20\x2d\x30\x2e\x30\
+\x36\x37\x35\x2c\x30\x2e\x31\x31\x33\x33\x34\x20\x2d\x30\x2e\x30\
+\x31\x38\x35\x2c\x30\x2e\x30\x36\x31\x32\x20\x2d\x30\x2e\x30\x36\
+\x37\x37\x2c\x30\x2e\x31\x31\x33\x33\x33\x20\x2d\x30\x2e\x30\x31\
+\x38\x36\x2c\x30\x2e\x30\x36\x31\x33\x20\x2d\x30\x2e\x30\x36\x37\
+\x33\x2c\x30\x2e\x31\x31\x33\x33\x33\x20\x2d\x30\x2e\x30\x31\x38\
+\x35\x2c\x30\x2e\x30\x36\x31\x33\x20\x2d\x30\x2e\x30\x36\x37\x37\
+\x2c\x30\x2e\x31\x31\x33\x33\x34\x20\x2d\x30\x2e\x30\x33\x37\x39\
+\x2c\x30\x2e\x30\x37\x31\x37\x20\x2d\x30\x2e\x30\x36\x37\x35\x2c\
+\x30\x2e\x31\x31\x33\x33\x34\x20\x2d\x30\x2e\x30\x33\x37\x39\x2c\
+\x30\x2e\x30\x37\x31\x37\x20\x2d\x30\x2e\x30\x36\x37\x37\x2c\x30\
+\x2e\x31\x31\x33\x33\x34\x20\x2d\x30\x2e\x30\x33\x37\x39\x2c\x30\
+\x2e\x30\x37\x31\x34\x20\x2d\x30\x2e\x30\x36\x37\x37\x2c\x30\x2e\
+\x31\x31\x33\x33\x34\x20\x2d\x30\x2e\x30\x33\x37\x38\x2c\x30\x2e\
+\x30\x37\x31\x33\x20\x2d\x30\x2e\x30\x38\x36\x38\x2c\x30\x2e\x31\
+\x32\x33\x33\x31\x20\x2d\x30\x2e\x30\x33\x38\x31\x2c\x30\x2e\x30\
+\x37\x31\x34\x20\x2d\x30\x2e\x30\x38\x36\x36\x2c\x30\x2e\x31\x32\
+\x33\x33\x33\x20\x2d\x30\x2e\x30\x33\x38\x31\x2c\x30\x2e\x30\x37\
+\x31\x34\x20\x2d\x30\x2e\x30\x38\x36\x38\x2c\x30\x2e\x31\x32\x33\
+\x32\x37\x20\x2d\x30\x2e\x30\x33\x37\x38\x2c\x30\x2e\x30\x37\x31\
+\x35\x20\x2d\x30\x2e\x30\x38\x37\x31\x2c\x30\x2e\x31\x32\x33\x33\
+\x33\x20\x2d\x30\x2e\x30\x33\x38\x31\x2c\x30\x2e\x30\x37\x31\x36\
+\x20\x2d\x30\x2e\x30\x38\x36\x38\x2c\x30\x2e\x31\x32\x33\x33\x33\
+\x20\x2d\x30\x2e\x30\x33\x37\x39\x2c\x30\x2e\x30\x37\x31\x34\x20\
+\x2d\x30\x2e\x30\x38\x36\x36\x2c\x30\x2e\x31\x32\x33\x32\x35\x20\
+\x2d\x30\x2e\x30\x33\x38\x33\x2c\x30\x2e\x30\x37\x31\x37\x20\x2d\
+\x30\x2e\x30\x38\x36\x36\x2c\x30\x2e\x31\x32\x33\x33\x20\x2d\x30\
+\x2e\x30\x33\x37\x38\x2c\x30\x2e\x30\x37\x31\x34\x20\x2d\x30\x2e\
+\x30\x38\x36\x37\x2c\x30\x2e\x31\x32\x33\x32\x39\x20\x2d\x30\x2e\
+\x30\x33\x37\x39\x2c\x30\x2e\x30\x37\x31\x36\x20\x2d\x30\x2e\x31\
+\x30\x37\x31\x36\x2c\x30\x2e\x31\x33\x34\x32\x37\x20\x2d\x30\x2e\
+\x30\x33\x38\x31\x2c\x30\x2e\x30\x37\x31\x39\x20\x2d\x30\x2e\x31\
+\x30\x36\x39\x34\x2c\x30\x2e\x31\x33\x34\x32\x38\x20\x2d\x30\x2e\
+\x30\x33\x38\x2c\x30\x2e\x30\x37\x31\x37\x20\x2d\x30\x2e\x31\x30\
+\x36\x39\x34\x2c\x30\x2e\x31\x33\x34\x32\x33\x20\x2d\x30\x2e\x30\
+\x33\x37\x39\x2c\x30\x2e\x30\x37\x31\x37\x20\x2d\x30\x2e\x31\x30\
+\x37\x31\x36\x2c\x30\x2e\x31\x33\x34\x33\x20\x2d\x30\x2e\x30\x37\
+\x37\x34\x2c\x30\x2e\x30\x39\x33\x32\x20\x76\x20\x30\x20\x6c\x20\
+\x2d\x30\x2e\x31\x34\x35\x30\x37\x2c\x30\x2e\x32\x30\x36\x34\x20\
+\x63\x20\x2d\x34\x2e\x35\x30\x39\x34\x37\x2c\x36\x2e\x33\x31\x38\
+\x34\x32\x20\x2d\x31\x31\x2e\x38\x39\x39\x35\x34\x2c\x31\x31\x2e\
+\x34\x32\x33\x31\x32\x20\x2d\x32\x30\x2e\x39\x36\x37\x34\x2c\x31\
+\x33\x2e\x37\x34\x34\x32\x31\x20\x2d\x35\x2e\x37\x31\x34\x36\x35\
+\x2c\x31\x2e\x34\x36\x33\x35\x33\x20\x2d\x32\x32\x2e\x39\x37\x30\
+\x33\x35\x2c\x35\x2e\x39\x38\x37\x37\x36\x20\x2d\x32\x37\x2e\x31\
+\x34\x39\x39\x37\x2c\x37\x2e\x30\x36\x31\x38\x20\x7a\x20\x6d\x20\
+\x39\x35\x2e\x38\x34\x38\x33\x33\x2c\x38\x34\x2e\x33\x37\x31\x36\
+\x39\x20\x30\x2e\x30\x36\x34\x35\x2c\x30\x2e\x31\x31\x38\x37\x36\
+\x20\x30\x2e\x30\x30\x39\x2c\x30\x2e\x30\x32\x30\x32\x20\x63\x20\
+\x30\x2e\x30\x32\x34\x34\x2c\x30\x2e\x31\x34\x30\x34\x34\x20\x30\
+\x2e\x30\x35\x38\x32\x2c\x30\x2e\x32\x35\x30\x36\x37\x20\x30\x2e\
+\x30\x38\x32\x2c\x30\x2e\x33\x38\x38\x30\x35\x20\x76\x20\x30\x20\
+\x6c\x20\x30\x2e\x30\x30\x39\x2c\x30\x2e\x30\x32\x30\x32\x20\x76\
+\x20\x30\x20\x6c\x20\x30\x2e\x30\x30\x39\x2c\x30\x2e\x30\x32\x30\
+\x34\x20\x30\x2e\x30\x30\x39\x2c\x30\x2e\x30\x32\x30\x33\x20\x30\
+\x2e\x30\x30\x39\x2c\x30\x2e\x30\x32\x30\x34\x20\x76\x20\x30\x20\
+\x61\x20\x32\x31\x2e\x37\x39\x36\x31\x39\x36\x2c\x32\x31\x2e\x37\
+\x39\x36\x31\x39\x36\x20\x30\x20\x30\x20\x31\x20\x2d\x31\x2e\x39\
+\x37\x31\x38\x33\x2c\x31\x34\x2e\x32\x31\x39\x38\x39\x20\x76\x20\
+\x30\x20\x6c\x20\x2d\x30\x2e\x32\x31\x39\x36\x33\x2c\x30\x2e\x33\
+\x39\x39\x36\x35\x20\x2d\x30\x2e\x31\x30\x35\x35\x32\x2c\x30\x2e\
+\x31\x38\x34\x36\x38\x20\x2d\x30\x2e\x30\x37\x37\x36\x2c\x30\x2e\
+\x31\x34\x33\x36\x33\x20\x2d\x30\x2e\x30\x33\x38\x2c\x30\x2e\x30\
+\x37\x31\x37\x20\x2d\x30\x2e\x30\x36\x37\x35\x2c\x30\x2e\x31\x31\
+\x33\x33\x33\x20\x2d\x30\x2e\x30\x33\x37\x38\x2c\x30\x2e\x30\x37\
+\x31\x33\x20\x2d\x30\x2e\x30\x36\x37\x37\x2c\x30\x2e\x31\x31\x33\
+\x33\x34\x20\x2d\x30\x2e\x30\x33\x37\x39\x2c\x30\x2e\x30\x37\x31\
+\x36\x20\x2d\x30\x2e\x30\x38\x36\x38\x2c\x30\x2e\x31\x32\x33\x32\
+\x34\x20\x2d\x30\x2e\x30\x33\x38\x2c\x30\x2e\x30\x37\x31\x33\x20\
+\x2d\x30\x2e\x30\x38\x36\x38\x2c\x30\x2e\x31\x32\x33\x33\x33\x20\
+\x2d\x30\x2e\x30\x33\x38\x2c\x30\x2e\x30\x37\x31\x34\x20\x2d\x30\
+\x2e\x30\x38\x36\x38\x2c\x30\x2e\x31\x32\x33\x33\x33\x20\x2d\x30\
+\x2e\x30\x33\x38\x2c\x30\x2e\x30\x37\x31\x34\x20\x2d\x30\x2e\x30\
+\x38\x36\x38\x2c\x30\x2e\x31\x32\x33\x33\x31\x20\x2d\x30\x2e\x30\
+\x33\x37\x38\x2c\x30\x2e\x30\x37\x31\x33\x20\x2d\x30\x2e\x30\x38\
+\x36\x35\x2c\x30\x2e\x31\x32\x33\x33\x32\x20\x2d\x30\x2e\x30\x33\
+\x37\x38\x2c\x30\x2e\x30\x37\x31\x34\x20\x2d\x30\x2e\x30\x38\x36\
+\x37\x2c\x30\x2e\x31\x32\x33\x32\x39\x20\x2d\x30\x2e\x30\x33\x37\
+\x39\x2c\x30\x2e\x30\x37\x31\x34\x20\x2d\x30\x2e\x30\x38\x36\x36\
+\x2c\x30\x2e\x31\x32\x33\x33\x20\x2d\x30\x2e\x30\x33\x37\x39\x2c\
+\x30\x2e\x30\x37\x31\x36\x20\x2d\x30\x2e\x30\x38\x37\x31\x2c\x30\
+\x2e\x31\x32\x33\x33\x20\x2d\x30\x2e\x30\x33\x38\x2c\x30\x2e\x30\
+\x37\x31\x35\x20\x2d\x30\x2e\x30\x38\x36\x37\x2c\x30\x2e\x31\x32\
+\x33\x32\x35\x20\x2d\x30\x2e\x30\x33\x38\x31\x2c\x30\x2e\x30\x37\
+\x31\x37\x20\x2d\x30\x2e\x31\x30\x37\x30\x35\x2c\x30\x2e\x31\x33\
+\x34\x33\x35\x20\x2d\x30\x2e\x30\x33\x37\x38\x2c\x30\x2e\x30\x37\
+\x31\x34\x20\x2d\x30\x2e\x31\x30\x37\x31\x36\x2c\x30\x2e\x31\x33\
+\x34\x32\x31\x20\x2d\x30\x2e\x30\x33\x38\x2c\x30\x2e\x30\x37\x31\
+\x34\x20\x2d\x30\x2e\x30\x39\x36\x32\x2c\x30\x2e\x31\x35\x35\x31\
+\x37\x20\x2d\x30\x2e\x30\x33\x38\x2c\x30\x2e\x30\x37\x31\x35\x20\
+\x2d\x30\x2e\x30\x39\x36\x32\x2c\x30\x2e\x31\x35\x35\x32\x31\x20\
+\x2d\x30\x2e\x30\x33\x37\x39\x2c\x30\x2e\x30\x37\x31\x36\x20\x2d\
+\x30\x2e\x30\x39\x36\x32\x2c\x30\x2e\x31\x35\x35\x31\x37\x20\x2d\
+\x30\x2e\x30\x35\x38\x33\x2c\x30\x2e\x30\x38\x32\x34\x20\x2d\x30\
+\x2e\x30\x39\x36\x32\x2c\x30\x2e\x31\x35\x35\x32\x20\x2d\x30\x2e\
+\x30\x35\x38\x34\x2c\x30\x2e\x30\x38\x32\x34\x20\x2d\x30\x2e\x31\
+\x31\x36\x33\x35\x2c\x30\x2e\x31\x36\x34\x35\x34\x20\x2d\x30\x2e\
+\x30\x35\x38\x33\x2c\x30\x2e\x30\x38\x32\x32\x20\x2d\x30\x2e\x31\
+\x31\x36\x33\x36\x2c\x30\x2e\x31\x36\x34\x35\x31\x20\x2d\x30\x2e\
+\x30\x35\x38\x33\x2c\x30\x2e\x30\x38\x32\x31\x20\x2d\x30\x2e\x31\
+\x31\x36\x33\x39\x2c\x30\x2e\x31\x36\x34\x35\x20\x2d\x30\x2e\x30\
+\x35\x38\x32\x2c\x30\x2e\x30\x38\x32\x34\x20\x2d\x30\x2e\x31\x31\
+\x37\x30\x36\x2c\x30\x2e\x31\x36\x34\x35\x36\x20\x2d\x30\x2e\x30\
+\x35\x38\x32\x2c\x30\x2e\x30\x38\x32\x34\x20\x2d\x30\x2e\x31\x31\
+\x36\x33\x2c\x30\x2e\x31\x36\x34\x34\x37\x20\x2d\x30\x2e\x30\x39\
+\x37\x37\x2c\x30\x2e\x31\x30\x33\x37\x34\x20\x76\x20\x30\x20\x6c\
+\x20\x2d\x30\x2e\x31\x38\x34\x37\x32\x2c\x30\x2e\x32\x32\x37\x33\
+\x36\x20\x63\x20\x2d\x35\x2e\x34\x37\x36\x33\x39\x2c\x36\x2e\x39\
+\x39\x33\x35\x37\x20\x2d\x31\x34\x2e\x33\x30\x39\x38\x37\x2c\x31\
+\x32\x2e\x37\x34\x36\x31\x39\x20\x2d\x32\x35\x2e\x30\x33\x38\x34\
+\x31\x2c\x31\x35\x2e\x35\x30\x30\x33\x34\x20\x2d\x36\x2e\x37\x36\
+\x36\x31\x31\x2c\x31\x2e\x37\x34\x36\x38\x31\x20\x2d\x32\x37\x2e\
+\x32\x30\x39\x37\x2c\x37\x2e\x30\x39\x33\x36\x33\x20\x2d\x33\x32\
+\x2e\x31\x38\x34\x30\x38\x2c\x38\x2e\x33\x36\x33\x32\x32\x20\x6c\
+\x20\x2d\x31\x33\x2e\x39\x32\x30\x33\x2c\x2d\x35\x34\x2e\x31\x35\
+\x37\x32\x20\x63\x20\x34\x2e\x39\x36\x36\x36\x2c\x2d\x31\x2e\x32\
+\x38\x39\x37\x32\x20\x32\x35\x2e\x34\x36\x34\x35\x33\x2c\x2d\x36\
+\x2e\x34\x33\x36\x33\x36\x20\x33\x32\x2e\x32\x32\x39\x38\x35\x2c\
+\x2d\x38\x2e\x31\x38\x33\x31\x36\x20\x31\x30\x2e\x37\x32\x39\x33\
+\x36\x2c\x2d\x32\x2e\x37\x35\x34\x31\x20\x32\x31\x2e\x32\x36\x33\
+\x31\x2c\x2d\x31\x2e\x39\x37\x32\x36\x38\x20\x32\x39\x2e\x34\x30\
+\x34\x33\x36\x2c\x31\x2e\x35\x30\x33\x39\x34\x20\x6c\x20\x30\x2e\
+\x32\x36\x35\x34\x32\x2c\x30\x2e\x31\x31\x33\x33\x33\x20\x76\x20\
+\x30\x20\x6c\x20\x30\x2e\x31\x33\x32\x37\x31\x2c\x30\x2e\x30\x35\
+\x36\x37\x20\x30\x2e\x31\x39\x34\x2c\x30\x2e\x30\x37\x37\x33\x20\
+\x30\x2e\x30\x39\x31\x37\x2c\x30\x2e\x30\x32\x37\x33\x20\x30\x2e\
+\x31\x37\x33\x38\x34\x2c\x30\x2e\x30\x38\x35\x32\x20\x30\x2e\x30\
+\x39\x31\x33\x2c\x30\x2e\x30\x32\x37\x20\x30\x2e\x31\x37\x33\x37\
+\x38\x2c\x30\x2e\x30\x38\x35\x33\x20\x30\x2e\x30\x39\x31\x38\x2c\
+\x30\x2e\x30\x32\x37\x31\x20\x30\x2e\x31\x37\x33\x38\x33\x2c\x30\
+\x2e\x30\x38\x35\x33\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\
+\x33\x38\x31\x20\x30\x2e\x31\x37\x33\x39\x2c\x30\x2e\x30\x38\x35\
+\x33\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\x33\x37\x38\x20\
+\x30\x2e\x31\x37\x33\x38\x34\x2c\x30\x2e\x30\x38\x35\x33\x20\x30\
+\x2e\x30\x37\x31\x33\x2c\x30\x2e\x30\x33\x37\x38\x20\x30\x2e\x31\
+\x37\x33\x38\x38\x2c\x30\x2e\x30\x38\x35\x33\x20\x30\x2e\x30\x37\
+\x31\x34\x2c\x30\x2e\x30\x33\x38\x20\x30\x2e\x31\x34\x33\x35\x39\
+\x2c\x30\x2e\x30\x37\x37\x38\x20\x30\x2e\x30\x37\x31\x32\x2c\x30\
+\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x34\x33\x36\x32\x2c\x30\x2e\
+\x30\x37\x37\x37\x20\x30\x2e\x30\x37\x31\x32\x2c\x30\x2e\x30\x33\
+\x37\x39\x20\x30\x2e\x31\x34\x33\x36\x34\x2c\x30\x2e\x30\x37\x37\
+\x34\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\x33\x38\x31\x20\
+\x30\x2e\x31\x34\x33\x36\x31\x2c\x30\x2e\x30\x37\x37\x36\x20\x30\
+\x2e\x30\x37\x31\x33\x2c\x30\x2e\x30\x33\x38\x33\x20\x30\x2e\x31\
+\x34\x33\x36\x37\x2c\x30\x2e\x30\x37\x37\x36\x20\x30\x2e\x30\x37\
+\x31\x34\x2c\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x34\x33\x36\
+\x2c\x30\x2e\x30\x37\x37\x35\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\
+\x2e\x30\x33\x37\x36\x20\x30\x2e\x31\x34\x33\x36\x35\x2c\x30\x2e\
+\x30\x37\x37\x36\x20\x30\x2e\x30\x37\x31\x33\x2c\x30\x2e\x30\x33\
+\x38\x33\x20\x30\x2e\x31\x34\x33\x36\x36\x2c\x30\x2e\x30\x37\x37\
+\x36\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\x33\x38\x33\x20\
+\x30\x2e\x31\x34\x33\x36\x39\x2c\x30\x2e\x30\x37\x37\x35\x20\x30\
+\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\x33\x38\x31\x20\x30\x2e\x31\
+\x32\x33\x33\x33\x2c\x30\x2e\x30\x38\x36\x39\x20\x30\x2e\x30\x37\
+\x31\x34\x2c\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x32\x33\x33\
+\x32\x2c\x30\x2e\x30\x38\x36\x36\x20\x30\x2e\x30\x37\x31\x34\x2c\
+\x30\x2e\x30\x33\x38\x31\x20\x30\x2e\x31\x32\x33\x32\x38\x2c\x30\
+\x2e\x30\x38\x36\x36\x20\x30\x2e\x30\x37\x31\x34\x2c\x30\x2e\x30\
+\x33\x37\x39\x20\x30\x2e\x31\x32\x33\x32\x38\x2c\x30\x2e\x30\x38\
+\x36\x36\x20\x30\x2e\x30\x37\x31\x36\x2c\x30\x2e\x30\x33\x38\x20\
+\x30\x2e\x31\x32\x33\x33\x2c\x30\x2e\x30\x38\x36\x38\x20\x30\x2e\
+\x30\x37\x31\x34\x2c\x30\x2e\x30\x33\x37\x39\x20\x30\x2e\x31\x31\
+\x33\x33\x34\x2c\x30\x2e\x30\x36\x37\x35\x20\x30\x2e\x30\x37\x31\
+\x34\x2c\x30\x2e\x30\x33\x38\x20\x30\x2e\x31\x32\x33\x33\x2c\x30\
+\x2e\x30\x38\x36\x38\x20\x30\x2e\x31\x36\x34\x35\x36\x2c\x30\x2e\
+\x31\x31\x36\x34\x20\x63\x20\x30\x2e\x31\x32\x33\x33\x32\x2c\x30\
+\x2e\x30\x38\x36\x36\x20\x30\x2e\x32\x36\x36\x39\x32\x2c\x30\x2e\
+\x31\x36\x33\x37\x36\x20\x30\x2e\x33\x38\x37\x39\x38\x2c\x30\x2e\
+\x32\x35\x30\x37\x20\x76\x20\x30\x20\x61\x20\x32\x31\x2e\x38\x36\
+\x32\x31\x36\x32\x2c\x32\x31\x2e\x38\x36\x32\x31\x36\x20\x30\x20\
+\x30\x20\x31\x20\x38\x2e\x35\x37\x37\x34\x31\x2c\x31\x31\x2e\x35\
+\x31\x31\x35\x31\x20\x76\x20\x30\x20\x6c\x20\x30\x2e\x30\x34\x32\
+\x37\x2c\x30\x2e\x30\x37\x37\x36\x20\x63\x20\x30\x2e\x30\x34\x34\
+\x32\x2c\x30\x2e\x31\x32\x39\x36\x34\x20\x30\x2e\x30\x37\x37\x36\
+\x2c\x30\x2e\x32\x33\x39\x38\x31\x20\x30\x2e\x31\x32\x31\x39\x33\
+\x2c\x30\x2e\x33\x36\x39\x34\x33\x20\x6c\x20\x30\x2e\x30\x30\x39\
+\x2c\x30\x2e\x30\x32\x30\x35\x20\x30\x2e\x30\x36\x34\x35\x2c\x30\
+\x2e\x31\x31\x38\x37\x33\x20\x63\x20\x30\x2e\x30\x34\x35\x39\x2c\
+\x30\x2e\x31\x38\x30\x30\x36\x20\x30\x2e\x30\x39\x31\x38\x2c\x30\
+\x2e\x33\x36\x30\x30\x38\x20\x30\x2e\x31\x34\x38\x32\x34\x2c\x30\
+\x2e\x35\x36\x30\x32\x37\x20\x30\x2e\x31\x30\x30\x30\x37\x2c\x30\
+\x2e\x30\x34\x34\x33\x20\x30\x2e\x31\x31\x36\x33\x37\x2c\x30\x2e\
+\x32\x36\x35\x34\x33\x20\x30\x2e\x30\x38\x34\x36\x2c\x30\x2e\x35\
+\x33\x38\x35\x38\x20\x7a\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\
+\x64\x3d\x22\x70\x61\x74\x68\x31\x31\x30\x22\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x64\x69\x73\x70\x6c\x61\
+\x79\x3a\x69\x6e\x6c\x69\x6e\x65\x3b\x66\x69\x6c\x6c\x3a\x23\x66\
+\x66\x66\x66\x66\x66\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\
+\x74\x68\x3a\x30\x2e\x37\x37\x36\x30\x32\x34\x34\x22\x20\x2f\x3e\
+\x0a\x20\x20\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\
+\x00\x00\x1b\xe8\
+\x00\
+\x00\x8e\xfe\x78\x9c\xed\x5d\x59\x6f\x5b\x47\x96\x7e\xcf\xaf\xe0\
+\x28\x2f\x09\x86\xbc\xaa\x7d\x51\xdb\x6e\x64\x14\x74\xa3\x01\xcd\
+\x4c\xa3\xd3\x8d\x79\x1c\xd0\xe4\x95\xc4\x0e\x45\x6a\x48\x2a\x96\
+\xf2\xeb\xe7\x2c\xb5\x71\xb1\x6c\xd9\x92\xec\xa4\xa5\x20\x30\x79\
+\x6e\xd5\xa9\xaa\x53\xdf\xd9\xea\x94\xae\x5e\xfd\xf1\xf6\x6a\x3e\
+\xf8\xa5\x5f\xad\x67\xcb\xc5\xeb\x23\xd9\x89\xa3\x41\xbf\x98\x2c\
+\xa7\xb3\xc5\xc5\xeb\xa3\x7f\xfc\xfd\x4f\xa3\x70\x34\x58\x6f\xc6\
+\x8b\xe9\x78\xbe\x5c\xf4\xaf\x8f\x16\xcb\xa3\x3f\xbe\xf9\xe6\xd5\
+\xbf\x8d\x46\x83\xd3\x55\x3f\xde\xf4\xd3\xc1\xbb\xd9\xe6\x72\xf0\
+\x97\xc5\xcf\xeb\xc9\xf8\xba\x1f\x7c\x77\xb9\xd9\x5c\x9f\x1c\x1f\
+\xbf\x7b\xf7\xae\x9b\x25\x62\xb7\x5c\x5d\x1c\x7f\x3f\x18\x8d\xa0\
+\xe7\xfa\x97\x8b\x6f\x06\x83\x01\x0c\xbb\x58\x9f\x4c\x27\xaf\x8f\
+\x52\xfb\xeb\x9b\xd5\x9c\xda\x4d\x27\xc7\xfd\xbc\xbf\xea\x17\x9b\
+\xf5\xb1\xec\xe4\xf1\x51\x6d\x3e\xa9\xcd\xdf\xf5\x6f\xbb\x55\xbf\
+\x5e\xde\xac\x26\xcc\x7e\x32\x69\x5b\xae\xa6\xe7\xb5\x29\xcc\xe4\
+\x9d\xa6\x46\x32\xc6\x78\x2c\xd4\xb1\x52\x23\x68\x31\x5a\xdf\x2d\
+\x36\xe3\xdb\xd1\x62\xfd\x6d\xd3\x15\x26\x78\xa8\xab\x12\x42\x1c\
+\xc3\xb3\xda\xf2\xe3\x5a\x9d\xdc\xce\x41\x0c\xef\x9d\x0c\x3d\x6d\
+\x47\x07\xd1\x5f\xc3\xff\xa5\x43\x26\x74\xbc\xd6\x73\xe8\xd9\x77\
+\x8b\x7e\x73\xfc\xe3\xdf\x7f\x2c\x0f\x47\xa2\x9b\x6e\xa6\x0d\x9b\
+\x2c\xf9\xad\x71\xb7\xb6\x63\x31\xbe\xea\xd7\xd7\xe3\x49\xbf\x3e\
+\xce\x74\xea\xff\x6e\x36\xdd\x5c\xbe\x3e\x32\x81\xbe\x5d\xf6\xb3\
+\x8b\xcb\x4d\xf9\x3a\x9b\xbe\x3e\x82\xd5\x29\xfa\x92\x07\x3f\x29\
+\xf0\x11\x9d\xe6\x47\x99\x63\xfb\xc8\x58\x7a\xb4\x85\xb5\x2d\x36\
+\xd3\xe5\xe4\xed\x78\x0d\x53\x3e\xbe\x5c\x5e\xf5\xc7\xd3\xe5\xdb\
+\xfe\xee\xf8\xaf\xab\xe5\x3f\xfb\x09\x40\xe1\x62\x01\xc4\xd1\x6c\
+\xb2\x5c\x8c\x36\x97\x00\x8f\x63\x18\x60\x3e\x7e\x3b\xef\x8f\xc7\
+\x93\x0d\x30\x5c\xef\x31\xc3\x15\xc2\x74\xef\xd6\x9b\xfe\x6a\xb4\
+\xba\x59\x74\x79\x5f\xca\xec\x96\x37\x9b\xeb\x9b\xcd\xff\xf6\xb7\
+\x9b\x7e\xc1\x93\x02\xc9\x34\x62\xa2\xc7\xd8\xad\xd0\x8e\xde\x00\
+\x83\x57\xd3\xfe\x7c\x8d\x8c\x58\x20\xf8\xcd\xd0\x03\x78\x04\xdb\
+\xd9\x8f\x57\x7f\x5e\x8d\xa7\x33\x40\x30\x37\x6a\x46\x9c\x2c\xe7\
+\x73\x58\xce\xeb\xa3\xf1\xfc\xdd\xf8\x8e\xe7\x9c\xf9\x6c\x77\xd5\
+\x32\x86\xc4\x14\xd8\xae\x37\xcb\xeb\xdc\x16\x56\xb9\xb9\x9b\xe3\
+\xd2\x80\x38\x02\x8e\xcb\xd5\xc9\xdb\xf9\x78\xf2\xf3\x1f\x88\xb0\
+\x84\x4d\x9d\x6d\xee\x4e\xe4\x1f\x8e\x6a\x8f\xe5\xf9\xf9\xba\x87\
+\x61\x45\x43\xa3\xcd\x84\x1e\x1a\x40\x7b\x34\x38\xfe\x9c\xb1\xc4\
+\xa1\xb1\xe4\xe1\xb1\x54\x19\xeb\xd5\xf1\xf6\x92\x1f\x5d\x84\xc2\
+\xcb\x8f\x17\xe1\xb7\x3d\xfe\x4c\x3e\x55\x88\xc2\xeb\x87\x08\xf1\
+\xe0\x68\x1f\x2f\x46\xe1\xed\x33\x8a\xd1\xd9\xe7\x13\xa3\xf3\xcf\
+\x29\x46\x17\x9f\x51\x8c\xea\x01\x62\xfc\x2c\x85\x16\xea\x41\x42\
+\xfc\x2c\x85\x16\xea\xf9\x44\xa8\x42\x54\x1f\x2f\xc2\x77\x97\xb3\
+\x4d\xff\x89\x22\x84\x91\xcc\x43\x44\x78\x60\xac\x8f\x16\x21\x8c\
+\xe5\x9e\x51\x84\xe1\x01\x36\xf1\x73\x50\x08\x23\x3d\xc8\x22\x7e\
+\x0e\x0a\x61\xac\xe7\xb3\x87\x2a\xd8\xf8\x5c\x28\x74\xf2\xf9\x50\
+\xe8\xf4\xf3\x89\x30\xca\x07\xa0\xf0\xb3\x44\x18\xe5\x83\x50\xf8\
+\x59\x22\x8c\xf2\x19\x51\x18\x85\x7e\x80\x57\x0e\x21\x8c\x83\xdd\
+\x11\xe2\x47\xcb\x50\xd8\x07\x39\xe5\xa9\x9e\xfa\xc9\xf9\x87\x07\
+\x3b\x2c\x44\xe1\x9f\xd3\xa1\x3c\x24\xb4\x39\xb8\xae\x07\xb8\x94\
+\x87\x85\x36\x1f\xbb\x65\xef\xf1\x29\x4f\xe5\x96\x29\x63\x3d\xb9\
+\x5c\xf5\x90\x61\x7f\x7b\x00\x93\xf7\xa5\x34\x52\x95\xc7\x17\x89\
+\xf8\x8f\xc5\x6c\x03\xa9\xf4\xcd\xba\x5f\xfd\x84\xe9\xe8\x7f\x2f\
+\xfe\xb1\xee\xf7\x5a\xfd\x7d\x35\x5e\xac\x21\xf7\xbd\x7a\x7d\x74\
+\x35\xde\xac\x66\xb7\xdf\x89\x2e\x3a\x1b\x95\x1b\x42\xee\xab\x2c\
+\x78\xb5\x38\x6c\x3e\xa4\x67\xbe\x53\x41\x5a\x07\x04\x6f\xad\x33\
+\xea\xfb\xba\x0a\xf9\xfa\x48\x29\x6c\xa7\x43\x21\xde\x01\x51\xdb\
+\x4e\x4b\x61\x9d\xab\x4d\x15\xc8\x58\x75\xce\x48\x19\xab\xac\xef\
+\x90\x2a\x3b\xa3\xb4\x6d\x63\xf1\xa7\x10\xaa\x94\xf7\x0b\xd5\x7c\
+\x4d\x42\x95\xbe\x33\x52\x4b\xed\xb6\xa4\xea\xbb\xe0\x45\xd0\xda\
+\x6c\x4b\xd5\x77\x10\xaa\x7a\x88\x20\x5b\xa9\x5a\xd5\x59\x61\x42\
+\x83\x5f\x9c\xef\x78\xfe\xa8\x42\xc5\x30\xa8\x15\xea\xf6\x10\x20\
+\x54\xf7\x98\x42\xf5\xde\x38\x16\xaa\x03\x0c\xc9\x61\xf3\x21\x3f\
+\x53\x9d\x31\x46\x7b\x3b\x0c\x9d\x86\x80\xd0\xfa\x2a\xd6\xc9\x2d\
+\xc0\xb2\x4e\x77\x72\x87\x78\x2c\x5f\xcf\xb7\x9f\x9e\x6f\x3f\x5d\
+\x11\x4a\xa5\x7a\x5a\x88\xa2\x19\xbd\x17\xa2\xe1\x31\xa5\x29\xa2\
+\x14\x2c\x4d\xa3\x6d\x34\xc3\xe6\x43\x7a\x16\x3a\xe7\xe1\x3f\x39\
+\x04\x05\x95\x1e\x52\xf3\x1d\xc5\x97\x9d\x07\x00\x34\x68\xbc\x63\
+\x6a\xf0\x2e\x3a\xb9\x8d\x51\xe0\x2e\xa5\x8e\x6e\x0b\xa3\x1a\x15\
+\x5f\xf9\xe0\x9e\x56\xac\x36\xde\x2b\x56\x25\x9e\x57\xf3\x47\xa6\
+\x03\xc5\x08\x6a\xe8\x3a\x50\x5a\x67\xdd\x8e\xea\xbb\xce\x04\x6f\
+\x85\xdc\x12\xab\xd4\x80\x71\x11\x1a\x25\x47\xb1\x6a\x50\x72\xe7\
+\x9c\x35\xdb\x62\x45\x9b\x12\xb4\xf1\x4f\x8c\x56\x75\xbf\x58\x9f\
+\xd9\x4b\x65\xb1\x9a\x24\x57\xe3\x77\xe0\x0a\x26\xc1\x7a\x11\x77\
+\xe0\xaa\x3a\x1f\xc1\x74\xec\xc0\xd5\x77\x5e\x2b\xa9\xb6\xe5\x6a\
+\x3b\x09\x1b\x23\x83\x7c\x5a\x47\xf5\x01\xef\xaf\xbe\x2a\x47\xf5\
+\x3b\xf1\xfe\xea\x51\x1d\xd5\x8b\xf7\x67\xa1\x3e\xaa\xbf\xfa\x57\
+\xf7\xfe\xfa\x51\xdd\xd4\x8b\xf7\xcf\x62\xfd\x42\x6e\xea\x77\xee\
+\xfd\xf5\x33\x7b\xa9\xdf\x8b\xf7\xff\x90\x5c\xbd\x7c\xa0\x5c\x09\
+\x54\xa6\x03\xab\xb8\xed\xa2\x65\x27\x9c\xb2\xdb\x78\x12\x9d\xd9\
+\x6a\x07\x34\x63\xb8\xdd\x13\xae\x99\x0a\x8c\xf7\xae\xd9\x7f\xc2\
+\x9a\x95\xe8\x82\x70\x5e\xfa\xed\x65\xbb\x2e\x28\xab\x85\xda\xdd\
+\x70\x63\xa2\xd6\x76\x57\x91\xa2\x10\x56\x3f\xa9\x7d\xa2\xb2\xe0\
+\xbd\x8b\x8f\x9f\xb2\xe1\xbe\x03\xb5\x88\x3b\x68\x87\xc5\xbb\x40\
+\x51\x41\xbb\x78\xa5\x3b\x81\xc3\xec\x58\x11\x70\x78\xf0\x13\x9f\
+\x38\x2c\xfb\x40\xac\x1b\x1e\xc1\x8a\x6c\xf0\xe3\x7c\xbc\xe9\xbf\
+\x1b\xe9\xa1\xdc\xb3\xb6\x3e\x6a\x1f\x76\x40\x22\xc0\xf5\x81\x7d\
+\xd9\x0e\xb4\xc0\x56\x08\x0b\xfa\xa9\xb7\xe5\xe4\x21\x30\x08\x10\
+\xc0\x3e\x65\xa4\x45\x45\xcf\xfb\x22\xad\xf0\x50\x0d\x79\xbf\xb5\
+\x85\x78\x0a\xff\xeb\x22\xd8\x50\xa1\x21\xa6\x72\x43\x8c\x7d\x8c\
+\xdc\x8e\xa5\x0c\xf8\x9e\xad\x68\x4a\x9b\x86\x70\xbe\xdb\xe2\x7c\
+\xb7\x05\xc4\x54\x10\x60\x84\x27\x0e\xfb\x3f\x14\x53\xc5\x87\x5a\
+\xd3\x87\xe2\xcb\x74\x26\x5a\x17\xb6\xd3\x23\x15\xbb\x10\x84\xde\
+\x51\x43\x80\xa2\xf6\xc6\x6f\xc7\x48\x28\x44\x4c\x9a\xfc\x93\xc2\
+\x0b\x2f\xc9\xdc\x03\x2f\x25\xcc\xd6\xde\x4b\x4c\xef\xd4\xde\xf6\
+\x43\x2c\xa3\xb6\x21\xb0\xdb\xf0\xfc\x50\x43\x40\x42\x6c\x80\xf1\
+\x21\x64\x82\xdf\x12\x1a\x36\x16\x3e\x42\x3c\x20\xa5\x11\xa2\x11\
+\xfa\xfd\xbb\xf8\x45\x65\xf8\x78\xc9\xd0\xc7\x08\xe2\xc9\xf6\x89\
+\x65\xf8\xea\x18\xef\x6b\xd1\xa7\x72\x59\x0c\x6f\x8a\x4d\x7f\x99\
+\xf5\xef\xbe\x29\x42\xc0\x9b\x68\x89\xc1\xf5\xf8\xa2\xa7\x92\x0c\
+\x88\xee\x9c\x7e\xd2\x83\xb7\xcb\xd5\xb4\x5f\xe5\x47\x8e\x7e\xb6\
+\x1e\xa5\xaa\x4d\xbd\xeb\xd6\xec\x14\x72\x2d\xcf\xc5\xe1\xe7\xeb\
+\xcb\xf1\x74\xf9\x0e\x34\x6c\xf7\xe1\xaf\xcb\xe5\x55\x2d\xfc\xd4\
+\xdd\xa7\x64\xb0\xf3\xde\xd7\xf3\xeb\xfa\x10\xc6\x71\x9d\x02\x4d\
+\xb5\x46\xef\x3e\x9c\x2e\x27\x37\x78\xe5\x72\x74\xc3\x3b\x7b\x7d\
+\xbb\xd7\xfd\x66\xb5\xc2\x06\xf3\xf1\x5d\x0f\xcb\xa5\x7f\xf2\x04\
+\xd6\x97\xcb\x77\x17\x2b\x14\xdb\xf9\x78\x5e\xe4\x86\x94\xfe\xea\
+\x1a\x2f\x19\xd2\x6d\x52\xd5\xd0\x13\xf1\x16\x97\x6e\xcb\x60\xcd\
+\x93\xbb\xed\x27\x65\x1a\xef\x66\x0b\x10\xc9\x28\xdd\x52\x94\xc2\
+\xee\x09\x21\xb5\xc8\x37\x17\x7d\x39\xe1\xd9\x6d\x71\x8b\xa6\x6b\
+\x4f\x12\xe9\xe1\x1d\x66\x84\x7b\x72\xc7\x85\xb6\x1b\xd3\x2e\xb7\
+\x5c\x9c\x2c\x93\xae\x97\x27\xb7\x56\xb8\x59\xce\x7b\xd0\x8c\x49\
+\x8f\xf3\x87\x9f\xdd\x41\xb0\xcd\xe8\x7a\x39\x5b\xe0\x46\xb4\x23\
+\x6c\xb7\x78\xfb\x76\x79\x8b\x36\xfc\xa6\x6f\x76\x81\x71\xb7\xdd\
+\x8d\x69\x69\xdf\x9a\xf6\x95\xdd\x0d\x6c\x54\xe2\x77\x70\xbc\xe5\
+\x5b\xbc\x83\x39\xba\x1e\x6f\x2e\xcb\x94\x92\x36\x5d\xf5\x9b\xf1\
+\x74\xbc\x19\x57\xcd\xc9\x14\x9f\xaf\x44\xae\xa6\xe7\x27\x7f\xfb\
+\xf1\x4f\xa5\xf0\x39\x99\x9c\xfc\xcf\x72\xf5\x73\xd6\x4e\xd0\x4f\
+\x68\x30\x7e\xbb\xbc\x01\x51\x95\x62\x2c\xde\xb2\x9c\x9c\xa0\xf1\
+\x18\x6f\xde\xcc\xae\x40\xe6\x78\xad\xf6\xdf\x6f\xaf\xe6\xa0\xc0\
+\xe5\xc1\x56\xe3\xcd\xdd\x75\x5f\x99\x32\xdb\x7c\x45\xf8\xe0\x35\
+\xe3\xe9\xe4\x6a\x86\x9d\x8e\x7f\xda\xcc\xe6\xf3\xbf\xe0\x20\x4d\
+\x81\x96\x99\x4e\xf0\x92\xf3\x72\xf5\xa6\x61\x8c\x0b\xf8\xe1\xa2\
+\xd4\x51\xb7\xa6\x30\xdb\xcc\xfb\x37\x67\xe3\xeb\xe5\xe0\x74\x3c\
+\x1f\x5f\x8d\x17\xd3\x55\x3f\xa3\x19\xf3\xa3\x96\xcd\xf1\x3e\x1f\
+\x6a\xb9\x37\x64\xe5\xfc\x13\x5d\x66\x1d\xfc\xed\x66\x71\x88\x27\
+\x4e\x6c\x3e\x9b\xf4\x8b\xf5\x87\xe5\x40\x83\xcc\x7e\x01\xc3\x76\
+\x75\xb5\x5c\xac\x49\x24\xa9\xef\xfa\xf8\xcf\x7f\x3d\x3b\x86\x98\
+\xf1\x78\x4f\x1a\xeb\x1b\x42\xc2\xd6\x32\x90\xfd\x7f\x8c\x2f\x76\
+\x84\x81\xd4\xf9\xec\xcd\x0a\x67\x9a\x3e\x1f\x6c\x30\x1f\xdf\x2c\
+\x26\x97\xf7\xb7\xe9\x6f\xfb\xc9\xa1\x16\x4c\xdb\x1a\x9b\xc4\xb2\
+\x33\x4b\x12\x34\x22\xae\x45\xe0\xd9\xae\x9c\x1a\x10\x3e\x48\x44\
+\xdb\xe2\xbf\xee\x57\x80\xa9\xf5\x07\xc5\x7f\xe8\xfa\xfa\xdf\xfa\
+\xeb\xd5\x72\x7a\x43\xb7\x99\xb7\x25\xff\x99\x8c\x7f\x9c\xad\xc1\
+\xfb\xbe\xbd\x39\xc8\x78\xd5\xff\xdf\xcd\x0c\x7a\x7c\x12\xe7\xff\
+\x5a\x6e\x40\x20\x8f\x3b\xd9\x7e\x35\xfb\x85\xe4\x8e\x5b\xb6\x7e\
+\xdc\xf9\xfe\x74\x39\x5e\xf5\x3f\xcc\x67\x3f\xef\xcf\xf9\xf3\xf8\
+\xd2\xb7\xd3\xe5\xb4\xe5\x4b\xb8\x4b\x38\xcb\x17\x31\x1a\x5b\xf8\
+\xea\x38\x5b\x4a\xfa\x76\xb1\x63\x73\xe7\xe3\xb7\xfd\xfc\xf5\xd1\
+\x19\x08\x62\x3e\x5f\x0e\xf6\xdc\xdc\xc5\x6a\x79\x73\x7d\x05\x23\
+\x26\x5f\x9c\x9f\x4f\x8b\x6f\x4e\x63\xa2\xd5\xce\x8b\x2a\x11\x0f\
+\x9a\x3d\x08\x12\x57\x93\x12\x24\xa5\x0b\x28\xe5\xd2\x13\x84\xff\
+\x42\x46\x27\xc2\x1f\xce\xc1\x38\x9e\x80\xd9\xfc\xee\xdb\xfd\xe8\
+\xfa\x7b\x7a\xda\x5c\x86\x01\xa4\x2d\x7f\xee\x4f\x16\xcb\x45\x9f\
+\x3e\xb3\xaf\x2e\x8f\x46\x18\x7d\xc2\x0a\x4e\x60\xfe\x8b\x69\x4b\
+\xfc\x27\xb8\xbc\x13\xc0\x4d\xbf\xca\x54\xfa\x32\x9f\xc1\x3f\x27\
+\x26\xd3\xa6\x63\x70\xbe\xab\xd5\xf8\x6e\x6b\x8c\xfd\xfb\x31\x28\
+\x08\x5c\xba\x96\xb2\x1e\x3f\x97\xf5\x1f\x0a\x32\xeb\xc3\x43\x41\
+\x64\x79\xba\xba\xdd\x0e\xfb\xeb\x83\x3b\x7a\xb0\xc5\x13\x26\xf1\
+\x9f\x03\x65\xba\x00\xc4\x41\xe6\x39\xf8\x61\x00\xed\x06\xa9\xed\
+\x40\x0c\x24\xfc\x37\xb0\xd4\x68\x78\x7f\xa3\x3d\x56\xbf\x96\xa1\
+\x36\xfb\xd1\x76\xa7\x43\x90\xd6\xa7\xbc\xd8\xc4\xa0\x9d\xc4\xf3\
+\x46\x6f\x9d\x74\x6a\xa8\x6c\x67\x7c\x70\xe1\xfb\x9a\x5e\x7c\x2a\
+\x58\x94\xf1\xc2\x86\xa0\xee\x03\x4b\xf8\x0d\x80\x45\x09\xf7\x2f\
+\x0b\x16\xe3\xb5\x0b\x3a\x81\xc5\x59\x0b\x91\xf3\x50\xe2\xc1\xaa\
+\x81\x91\x60\xfd\x56\x19\xdb\x62\xe5\xa2\x95\xde\x85\x8a\x4d\xae\
+\xbd\xcf\xbe\x1c\x77\x97\x03\xf0\xd1\xfe\x51\xb8\xeb\x00\x96\x52\
+\x53\x11\xcc\xda\xef\xeb\xcd\xbc\x16\x96\x75\xb7\x94\x6f\x8e\x18\
+\x93\xf8\x34\x56\xd5\xec\xe0\x74\x40\x47\xc2\x41\x38\xac\x0b\x59\
+\x41\x3f\x6a\x40\xe7\x17\x46\x21\x09\x00\x2b\x24\x12\x34\xd5\xdd\
+\x60\xc5\x20\xa0\x33\x24\x90\x60\x3b\x8f\x67\xe6\xc0\x47\x05\x98\
+\x94\xd5\x0e\x48\x51\x1b\x13\x8d\x1f\x28\xdf\x29\x6f\x4d\x70\x43\
+\xd3\x69\xa1\xb0\x1e\x3a\x50\xae\x33\x78\x28\x34\x4c\x32\x3f\x43\
+\xe9\x23\x27\xd5\x79\x22\x00\x27\xd5\x45\xfa\x01\x56\x3c\xa3\x88\
+\x34\xe8\x32\xa0\x92\x14\xb6\xb6\x5d\xea\xac\x79\x83\x3d\x73\xc5\
+\xde\x3a\x8d\x05\xd2\xa1\xd1\x2d\xf5\xa6\x39\xd9\x61\xa4\x49\xda\
+\x68\x91\x46\x53\xc7\xad\x63\x5e\x32\xe2\xda\xf0\x3b\x2d\x15\x78\
+\x01\x05\xd6\x8f\x14\x94\x06\x7d\x1d\x62\x35\x1b\xe5\x95\xbf\x2a\
+\x6e\x67\x78\xc6\x12\x4f\x73\x64\xd4\x31\xf5\x05\xd9\x0d\xa5\x86\
+\xdc\xdd\x06\x90\x62\x1e\x41\x27\x9c\x9d\x35\xb3\x80\x85\xf8\xbc\
+\x7a\x9e\xab\x04\x11\x69\xe3\x8c\x6c\xd6\x04\xf0\xf2\x00\x2f\x69\
+\xca\xca\xa5\x4b\x60\x3e\xab\xd2\x91\xa1\x32\x83\x6f\x31\xc9\x13\
+\xfa\x0c\x15\xee\x7a\x16\xb9\xec\x14\xed\xde\x59\xdd\x16\x68\x9c\
+\x37\xb4\xec\x1e\x4e\x3b\x42\xae\x1c\xf3\x26\xdb\x88\x7c\x04\x60\
+\x5f\xd8\x8c\x04\x20\xa8\xbc\xa3\x19\x2c\x38\x6f\xe6\x95\xf0\x04\
+\x04\x63\x15\x4e\x25\xc3\x4e\x23\xcd\x22\x1c\xe9\x5f\xc0\xa3\x64\
+\x09\xba\xf4\x40\x25\xe1\xb5\x7d\x15\xcb\x2f\xf3\x3f\x43\x0a\x4e\
+\xbe\xcc\x01\xd8\xe8\x24\xbc\x66\xa6\xa0\xdf\x2c\xbc\x66\x45\xda\
+\xb2\xf8\xca\xc2\x81\x99\x67\x66\x59\x3a\xc0\x2c\x76\xac\x18\xc8\
+\x8c\x77\x1a\x69\x38\xe0\xc0\x08\x6e\x96\x85\x0e\xfd\x43\xc7\x84\
+\xbc\x33\xa7\x48\xe2\xf1\x9a\x0d\x44\xa6\x34\xaf\x66\xa3\x81\xa6\
+\x78\x07\x75\x62\x66\x14\x2e\xb1\x42\xe6\x14\x29\x2c\x87\x06\x58\
+\x48\xdb\x05\xa0\x51\x19\x9e\xfc\x29\xe1\x56\xb7\x0c\x08\xd8\x32\
+\xc6\x32\x4c\xc6\xfe\x59\x33\x15\xd6\x8f\xd3\x66\xc2\x55\x8b\xea\
+\xc2\xaa\xb6\xe5\xf5\x67\x9d\x3c\xab\x32\xb2\x95\x95\x75\x60\xc9\
+\x24\x98\x01\x21\xbd\x96\x56\x01\x6d\x48\x1b\x9e\xa4\x9f\xcc\xc1\
+\x59\xdd\xa1\x64\x31\x4e\x9b\x7d\xac\x76\xa5\xee\x77\xb5\x3f\x09\
+\x15\xd9\x46\x9d\x55\xe0\xb0\x15\x3b\xcd\xe8\x2a\x76\x0e\x4c\x5f\
+\xc6\x1f\x11\xb3\x99\xfc\x75\x40\x16\x33\x76\xa9\x13\x08\x12\x35\
+\x3b\x26\xfb\xa4\x71\xf8\xbc\x01\xc0\x1b\x7f\x63\x35\x20\x2d\x6d\
+\x80\x4e\x86\x8c\x6c\x01\xf5\xd5\x85\x8b\xc6\xed\xa7\x81\xe8\x5f\
+\xd2\x15\x66\xc0\x04\x50\x39\xdb\x74\xe3\xaf\x8a\x0d\xae\x6d\x46\
+\xab\xdd\x22\xb3\x8b\x34\xef\xc6\xee\xa7\x60\xa4\x46\x1e\xfb\xb7\
+\x8e\xdf\x17\x79\x7c\xab\x7a\xc0\x85\xdb\x09\x3e\x40\x29\xac\xd1\
+\x16\xa2\x99\x9d\x28\x64\xfd\x7f\x37\x90\x3f\x3c\x7e\x18\xd2\xe4\
+\x0c\xef\xf1\x74\xe0\x26\xf7\x3d\x1d\x2b\xaf\xc7\x6b\x0e\x80\x6d\
+\x10\x22\x79\x3d\xaf\x23\x00\xa5\x12\xd1\x22\x79\x1f\xbc\x46\x12\
+\xd6\x8c\x91\x42\xb0\xc5\x9e\x96\xf7\xf9\x0c\x89\x89\x1d\xec\x0e\
+\xa0\x48\x18\xde\x0b\x17\x14\x28\x02\x10\xbd\xf6\x10\xc3\xa1\xf9\
+\x84\xa0\x51\x45\x07\xa0\x57\xce\x58\x13\x8b\x91\xb5\xe0\xc0\x05\
+\x42\x3a\xbb\x3f\xe4\x83\xf8\x16\x85\x1f\x60\xd6\x59\x25\x15\x10\
+\xf1\xd4\x97\xcc\x3d\x7e\x00\x25\x31\xfc\x48\x23\x89\x3b\xa0\x5a\
+\x11\x0b\x64\x67\x13\xeb\xac\x7e\x0e\xd9\x99\x34\x05\xd0\x52\x9a\
+\x94\xa5\x11\x70\xa2\x1e\x70\xc2\x53\x47\x12\x2f\x08\x6d\x05\xad\
+\xd1\x21\xc3\x14\x16\x10\x95\xc5\x81\x1c\x05\xcb\x88\xcc\x0a\x49\
+\x8d\x48\x28\x49\x6a\x48\xc2\xdd\xa2\xa9\x24\xb6\xd4\xb9\x50\x95\
+\x13\x28\xad\xc2\x0f\x6c\x95\x52\xb8\xe0\x34\xae\x46\x12\xd9\x02\
+\xcf\xfe\x3e\xcf\x51\x37\x0c\xd3\x62\x48\x65\xb4\xf4\x42\xbb\x66\
+\xcd\x14\x92\x49\xb0\x01\x8d\x70\xb2\x6d\x0e\xcc\x33\xc9\x11\x4d\
+\x38\xce\x2c\x32\xcf\x24\x70\xf0\x0c\x4a\x1b\x34\xb3\x75\x5b\xd0\
+\xbb\x83\xae\x79\xd3\xec\x1f\xfa\x59\x5c\x56\x6c\xfc\x29\x2c\xc8\
+\x43\xd4\x06\x9f\x02\xbb\x54\x16\x3f\x8e\xe4\xb5\x05\x7b\xd5\x40\
+\x07\xc7\x71\x0a\x4c\x74\xc1\x18\xb9\x5e\x93\x79\x56\x38\xa2\x5b\
+\x47\x73\x92\xc2\x37\x46\x2d\x12\x95\xb0\xd6\x34\xe0\x46\x1a\xcc\
+\x4d\x36\x4a\x50\x48\xe4\x6a\x51\xfa\x3e\x6e\xb5\x23\xf1\xcb\x96\
+\x5d\x0a\x2b\x9a\x71\xc9\x94\x66\xad\x2a\x53\x24\x43\xc7\xe2\x2f\
+\x8b\x21\xaf\xcb\xe2\x6f\x16\x9d\x6d\x7a\x68\xc4\xc3\x8e\x97\xc4\
+\xdf\x88\x92\x7c\x27\x89\xbf\x15\x3a\xd0\xf8\x53\xb3\x39\x40\xe3\
+\x3e\x65\x1b\x89\xa7\x4b\xfc\x9b\x2d\x3f\xc5\x91\x78\x26\x0d\x38\
+\x70\x1c\x12\x7f\x03\x22\xa0\x99\xc4\xb3\xc0\x0d\xdc\x19\x9b\x03\
+\xd9\x20\xf3\x94\x88\x24\xaf\x02\x61\x49\x34\x14\x6b\xc5\x79\x4b\
+\x49\x2a\x76\x5a\x88\xb2\x68\x8e\x69\xd9\x15\x0d\xab\xe3\x16\x4d\
+\x3c\x6b\xa7\x28\xab\x46\xd4\xc5\x14\xf5\xae\x6b\x4e\x46\xc0\x35\
+\xc2\x49\xc6\x22\x85\x2f\x49\x8e\xc9\xac\x18\xe6\x47\x02\xb7\xd5\
+\xfc\xd4\x7d\x31\x49\x53\x9a\x0d\x2c\xb6\xec\xac\xd9\xeb\x62\xf5\
+\x4e\x0b\x28\x62\xb5\x8e\x19\x3b\xc5\x86\xfa\x02\xb2\x50\x6d\xed\
+\x59\x03\xc7\x62\x95\x4f\x1b\xdc\x16\xe3\xcd\xe0\x0e\xd9\xc0\x9b\
+\x43\x8e\xe0\xbd\xfe\x91\xfc\xcf\x61\x5f\x78\xd8\x75\x9a\xef\x77\
+\x9d\xa3\xd4\xf8\x63\xdd\x57\xe4\x1c\x9b\x9b\x3f\x6d\x1a\x98\x82\
+\x5c\xbc\x13\x11\x62\x60\x02\xe7\x81\x68\x5d\xa4\x13\x14\x31\x45\
+\x0c\x8a\x94\x96\x48\xa4\x60\x4e\x10\x4e\x38\xde\x77\x89\x90\x02\
+\x3e\xa4\x50\xa0\x25\x4b\x0c\x08\xa4\x9c\xf8\xa5\x34\x0f\x60\x28\
+\x82\xb3\xb8\xb9\x5a\x1b\xc0\x7a\x24\x03\xa9\xbc\xf0\x86\x61\x66\
+\x95\xa3\x8c\x91\x58\xd9\x12\x9a\x66\x93\x3b\xd4\x5d\xce\x7c\x14\
+\x7d\xca\x88\xe5\x36\x9c\x83\xf8\x2e\xc5\xcd\x6c\xbc\x81\x25\xe2\
+\x1f\x07\x21\x0f\xca\x23\x83\x96\xf0\x5c\x90\x94\x82\xde\x32\x71\
+\x91\x53\x23\x51\xd2\x36\xb4\x4f\x85\xc6\xcd\x92\xc9\x42\x2d\x4c\
+\x59\x03\x52\x50\x66\xa4\xaf\x24\xc6\x80\xb4\xc0\x8d\x48\xd6\xaa\
+\x10\x52\x1a\xc9\x9f\x3b\xad\x24\x84\xc5\x85\x83\x22\x9b\x12\x74\
+\x84\x39\x97\x71\x54\x4e\xa0\xeb\x64\xaa\x3c\xca\x9c\x75\x95\x5a\
+\x5a\x99\x2e\x59\x49\x5e\x3e\x59\x3c\x1b\xa5\x86\x1c\xb7\x4a\x09\
+\x2d\xa3\x57\x10\xa4\x57\x59\xe2\xd5\xc5\xc4\x4c\x71\x26\x1b\xaa\
+\x98\xd2\x16\x64\xe3\xdb\x34\x8a\x25\x91\xc2\xe4\x16\xef\x6c\x51\
+\x02\x86\xef\x30\x88\x34\x09\x17\xb5\xe4\x94\x52\x52\xd4\xa0\x53\
+\x1e\x0b\x94\x9d\x1d\x57\x45\xde\x40\xe2\xb4\xa0\x36\x4a\x40\x81\
+\x19\xe4\x5c\x29\xe3\x49\x27\x3f\x61\xbc\x69\x70\x87\x93\x70\x36\
+\x1a\x5b\xc1\xc9\x5b\xd0\x22\x18\x7d\x5e\x96\x6a\xc2\x39\xdf\xa7\
+\xe2\xe4\x24\xe9\x42\x8a\x21\x92\x43\xa6\xbd\x26\x1a\x2c\x56\xc6\
+\xa2\x5a\x94\x00\xd3\x49\x93\xcc\x9f\xc8\x74\xd1\x76\x87\x44\x42\
+\xff\x8a\xe6\x8c\xb6\xbb\x65\x22\x39\xe1\xcf\x43\x91\x0f\xd6\x99\
+\x92\xe7\xa3\x72\xea\x5d\xa7\xad\x55\x4d\x71\x93\xaa\x6b\xde\x6e\
+\x59\x44\x60\xc8\x22\xd3\x76\x37\xa2\x02\xd3\xcd\xfb\x1e\x0a\xf2\
+\x75\xf2\x14\x55\xec\xd9\xe8\x37\x7b\x83\xae\x41\x36\x8d\x38\x01\
+\x86\xfd\x0e\x3a\xef\xb2\xa2\x0c\x9a\xf6\x3b\x83\x21\x20\x45\xfb\
+\x06\x30\x94\x85\xba\x9c\x5c\xd7\xc4\x34\xcd\x29\x43\x4f\xfb\x6c\
+\x6d\x12\x3e\x73\xd0\x60\xbc\x29\x30\xf6\x34\x07\xda\xee\x06\xee\
+\x3a\x74\x49\x4d\xb2\xb4\xd0\xc9\xea\xa4\x28\x59\x75\x20\x3b\x16\
+\x85\x96\x9a\x29\xda\x85\xa2\x86\x94\x65\xd3\x4e\xf9\xa2\xac\x16\
+\x69\x52\x55\x8d\x0e\x95\xc0\x1d\xa4\x32\x94\x33\x26\x73\x60\x0b\
+\x93\xd8\xd8\x8c\x32\x94\xcc\x27\x14\x75\x3e\x45\xe4\x75\xda\xd5\
+\x4a\xe5\xc5\x89\x72\x38\x56\x45\x90\x0c\x9e\xb7\x8d\xa8\xb2\x5d\
+\x0c\x55\xa2\xc9\x7a\x16\xa9\xdb\x8a\xaa\xb4\x33\xd5\xe4\xa6\x26\
+\xa6\x1c\xe4\xe5\x0d\xc6\x08\x01\x75\x3c\x45\x0d\xb4\xd7\x94\xa7\
+\xa3\x29\x10\xa6\xc2\x45\x77\x05\x64\x0c\xa9\x22\xee\x02\xbb\xd2\
+\x24\x41\xd3\x96\xc3\xba\x0c\x60\x5f\x7c\x87\x2e\x40\x57\xc5\xc7\
+\x98\xaa\x0e\xa6\xdb\xd1\x99\xea\xac\xb2\x66\x55\x8f\x96\xb5\x2f\
+\x39\xbd\xd3\x46\x45\xb3\x6b\x54\xb2\xe8\xb2\xcb\x4e\x54\x2a\x5d\
+\x7d\x6c\x3a\x45\x08\xf9\x14\x21\xe2\x1b\x85\xf0\x3b\x1d\x1d\x78\
+\x87\x4b\xa0\x8f\x74\x9e\x8c\xd6\x11\xcf\x99\x4c\x39\x45\x30\x1c\
+\xef\x28\x84\x21\xf5\x55\x0d\x17\xc0\x39\xf7\xa5\xa3\x04\x9b\x8f\
+\x12\x88\x4b\x20\x42\x3a\xda\xf5\xbb\x5c\x24\xd1\xd2\xa1\x82\x6f\
+\xce\x31\xb8\x6f\xe1\x82\xd9\x23\x77\x55\x79\x19\x87\xe2\xa7\x5a\
+\xec\xb8\xa7\x24\x26\xa5\x7b\x40\x95\xe3\x6b\x8c\xa5\x9c\x3f\x10\
+\x4b\x51\xee\x0e\x6e\x28\x18\x4c\x5c\x31\x6b\x47\x0d\x0a\xf4\x81\
+\xe5\xab\xc9\x48\x81\x62\xa3\xd8\x53\x4b\x3e\xa3\xa4\x03\x22\xf2\
+\x0c\x02\x37\x1b\xb6\x53\xe2\x05\x5f\xfc\x8a\x49\x68\xe9\x85\x5f\
+\x14\xeb\x72\x3a\x26\xe7\x21\xa8\x87\x1b\x1a\x9e\x47\x3e\xb1\x62\
+\xa4\x81\x3a\xf0\xfe\x51\x07\x08\x3b\x40\x31\x62\x41\x1a\x68\x3f\
+\x26\x22\x78\x18\x92\x70\x26\x0a\x42\xa8\xa7\x69\x78\x80\xed\x8c\
+\x0d\xce\x18\x65\xc0\x01\x21\x96\xab\x07\x61\x9f\x01\xf8\xc3\x0c\
+\xb0\x58\x00\x96\x06\x66\x06\x7c\xa0\xc6\x62\x88\x3c\xf7\x07\x1e\
+\x5f\x3d\xa4\x70\xd6\xa5\x52\x87\xf9\xe2\x90\x3a\x54\x03\x0a\x78\
+\xdf\x58\x0f\x47\x30\x4d\xc8\x8e\x74\x3f\xc2\x2b\xba\xe5\x63\x79\
+\x8e\xbf\x75\xe3\x8c\x8b\x54\xab\x84\x0f\xa1\xf9\x55\x93\x0c\x4a\
+\x0c\x31\x07\x3f\x0c\x50\x5b\xf1\xff\x54\xf2\x92\xe8\x65\xf7\xc9\
+\xdc\xfa\xd7\x56\xea\x6d\x21\x2e\x74\xf6\xe0\xa3\xdb\xf7\x3e\xa2\
+\xdf\xc2\x8a\x07\x9f\xdc\xd2\xc5\xf4\xb6\x57\x55\x2e\x13\x1f\x29\
+\x2f\x53\xe2\x3d\x79\x99\xda\x2b\x9d\x3e\xd5\xc6\x1f\x58\x7b\x2d\
+\x14\x3f\x08\x15\x78\x4b\xd8\x59\xda\xec\x88\x79\x6f\x3f\x22\x5f\
+\x57\x3e\x97\x16\x0a\xdd\x10\x02\x04\x5c\x9c\xdf\xfa\x45\x99\xdf\
+\x34\x2a\xb4\x7d\x2c\x54\xa8\x1d\x54\x28\x88\x7c\x82\xf5\xf0\xe0\
+\xab\x42\xc5\xab\xe3\x8b\xf7\xd4\x90\xd5\x67\xd7\x90\x47\xae\x0b\
+\xf8\x7b\x11\xf8\xc1\x49\xf3\x11\x55\xe4\xd8\xfc\x0a\xed\x4b\x15\
+\xf9\xa5\x8a\xfc\x52\x45\x7e\xa9\x22\xbf\x54\x91\x5f\xaa\xc8\x7b\
+\x6f\xaf\xf8\xcd\x57\x91\x63\xf3\x5e\x83\x97\x2a\xf2\x4b\x15\xf9\
+\xa5\x8a\xfc\x52\x45\x7e\xa9\x22\xbf\x54\x91\x9f\xba\x8a\xac\xdc\
+\x6f\xa0\x8a\x1c\xb5\x78\xa9\x22\xbf\x54\x91\x5f\xaa\xc8\x2f\x55\
+\xe4\x97\x2a\xf2\x4b\x15\xf9\xa5\x8a\xfc\x52\x45\xfe\x62\x55\x64\
+\xf5\xa0\x92\xdf\xd7\x18\x4b\xa9\x97\x2a\xf2\xd7\x55\x45\xd6\xe2\
+\xa5\x8a\xfc\xfb\xa8\x17\xc6\xe6\x0d\x85\x9f\x97\x97\xe9\xdd\x7a\
+\xe1\x4b\x15\xf9\x37\x8c\x0a\xf7\x58\xa8\xd8\xbd\xf3\xfd\xd5\x57\
+\x91\xb7\x7e\x6b\xfd\x43\x86\x30\xca\x07\x9f\xe3\x93\xd5\xdd\x5b\
+\xfc\x13\xff\x4e\x3a\x41\x11\x1c\x5b\x4a\xed\x1c\xc5\x2c\xe0\x46\
+\x1c\x04\xc3\xd6\x10\x01\xc2\x42\x08\x9c\x24\xbe\xdf\xd3\x28\xc3\
+\x8d\x20\x00\x8b\x90\x07\x9b\x54\x39\x55\xae\xa4\xe0\x26\xe5\x67\
+\x89\x72\x8a\x14\xad\x83\x20\x5e\xde\x46\x01\x29\x35\x86\x9d\xd1\
+\xe3\x41\xa8\xeb\x60\xcb\x23\xb8\xb0\x5c\x5c\x43\x52\xcc\x3d\x21\
+\x17\xf3\x3a\x4a\x48\xd9\xf0\x2d\x82\xd4\x55\x75\x1e\xb5\x8a\x48\
+\x5a\x39\x87\x14\xae\x91\xa9\x12\x27\x4b\xc5\xe9\xb9\x16\x65\x0e\
+\x00\x2e\x07\x8d\xdc\x10\x0f\xa0\x8c\xc0\xc3\x6d\x3c\xfd\xc3\xb0\
+\x34\x22\xcd\x40\xa8\x1a\x60\x41\x32\xcd\x02\x48\xe9\x60\x25\x74\
+\x99\x90\x32\xf6\xd0\x41\xec\x2c\xc1\x11\x20\xcd\xc3\x5c\x03\x2a\
+\xaa\xf0\x12\x26\x06\x11\x35\x4e\x47\xc0\xa2\x06\xe0\x64\x29\x65\
+\xd0\x25\x3b\xf1\xf8\xc6\x60\x0d\xf9\x17\x86\xc4\x56\x0a\xd0\x69\
+\x98\xb3\x16\x31\x3a\x87\xbf\x64\xaf\x21\xec\xd3\x12\x69\x43\x5d\
+\x43\x7a\x70\x30\x3c\x03\x57\x0e\x35\x60\x5d\x18\xc8\x7b\xa4\x79\
+\x88\x0a\x21\x6d\x03\x1a\x58\x19\x03\xa1\x30\x84\xe9\x1a\x62\xfb\
+\x08\x66\x43\xe2\x97\x98\x32\x55\x4e\x44\x4c\x2d\xcf\x46\x18\x02\
+\x56\x1d\x25\x12\xbd\x02\xe9\xf8\x01\xe6\xe0\xc6\x2b\x03\x46\x0d\
+\xac\xb4\xb1\x21\x3a\xa0\x91\x7c\x73\x76\xc3\x53\xa2\x60\x9d\x33\
+\x29\x9e\x51\x50\x10\xf9\x4b\x24\x19\xd8\x6c\x2c\xb4\xcb\x4e\x19\
+\x69\x94\x42\x5a\x80\x80\x1c\xb2\x0c\x94\x2f\xcd\x02\xb2\xe5\x24\
+\x5f\xc9\xc7\x94\x38\x87\xd8\x20\xc6\xf8\x88\x77\x16\x60\xb7\x22\
+\x24\x60\x04\x35\xa7\x1c\x1e\x13\xe1\xc4\x22\xae\x1a\x69\xb4\xcf\
+\x40\xc9\x6b\x02\x94\x2a\x0d\x59\x00\x75\xd5\xd0\x13\x8c\x26\xc6\
+\xdd\x26\x1a\x48\x72\x0d\x1e\x3a\x5a\x63\x25\xd2\x38\xbb\x31\x35\
+\xe1\x00\x2d\x48\x34\x2e\x02\x4a\x10\x24\x88\xd9\x38\x24\x18\x18\
+\x00\x46\x00\x1a\xbe\xeb\xc2\x52\x23\x03\x13\x47\x4c\x86\x84\x40\
+\x63\x72\xaa\x04\x24\xdd\x52\x4e\x91\xe2\x20\xa5\x24\x5e\xca\x88\
+\x48\x87\x48\x58\xec\x8c\x1a\x49\x20\x27\x00\x0d\xd2\x74\x9e\x82\
+\xc8\x3d\x41\xfe\xb0\xf2\x10\x50\x6a\xc1\x63\x57\xac\xb1\x53\xac\
+\x81\x24\xe7\x35\x55\x6a\x58\x13\x81\x90\x4f\x7e\x44\x11\x6c\x3e\
+\x6b\x02\x24\xe9\xe0\x21\x4e\x84\xac\x30\xda\xe8\x83\x47\x5a\xc4\
+\x1c\x54\x22\xcd\x02\x7e\xa4\xc7\x3b\x0c\x3c\x0b\xaa\x36\xe7\xa3\
+\xbc\x4c\xc9\x77\x3c\x60\x43\x20\xe3\x8a\x1e\x69\x0a\x26\x2b\xe9\
+\x4e\x43\x54\x41\x79\xa0\x05\x98\x4f\x94\x46\x53\xbd\x87\xb5\x31\
+\x94\x5b\x0d\x16\x5d\x23\x66\xe9\x98\x52\x9a\x80\xf8\xc5\xb7\x84\
+\xb8\x88\x11\x3b\xbe\x85\x15\x52\x1c\x17\x91\x46\x9a\xd0\x9c\x65\
+\xf1\x24\x4a\x15\x1a\x0f\xbc\xc0\x50\x39\x8d\x34\xa5\xf0\x85\x7f\
+\x48\x03\x0b\x61\x21\x07\x05\x35\x73\x5a\x06\xba\xba\x82\x5f\x32\
+\xe4\xd2\xd5\x0b\x2d\xea\xc5\x19\x90\x2c\xae\x5d\x22\x11\xe6\x6f\
+\xf8\x04\xcc\x6a\x60\x03\x96\x05\x76\xc0\x1a\xc4\x2f\x9e\x0e\x05\
+\xa6\x34\x67\x6e\x6c\xb7\x9a\xfb\x1e\xd2\x43\x12\x1f\x91\x64\x25\
+\xc8\x39\xd2\xad\x10\x0b\x46\x21\x20\x4d\x86\x88\x6a\xa5\x64\x3a\
+\x39\xaa\x2a\x2a\x43\x31\x5c\xa2\xc1\x8d\x55\x60\xa8\x70\xcc\x28\
+\x34\x56\x11\x10\x5d\x60\x17\x0d\xcf\x0c\x52\x41\xd4\xb6\xc0\xbb\
+\x0d\x94\xbc\x28\x7c\x4d\xb3\xf3\x3e\x18\x24\x3a\xe8\x19\x24\xd2\
+\x8c\x15\xa0\xe9\x48\xb3\x7c\xe8\x0f\xb4\x64\xfd\x63\xd5\xf0\x2d\
+\x8f\x80\x89\x0c\x50\x18\xe5\x9a\xef\x88\xc0\x77\x98\x02\xd6\x19\
+\xb0\xee\x1e\x3c\x9e\x26\x61\x79\x47\x84\x68\x49\xf4\x26\x6a\x61\
+\x35\xd2\xdc\x56\x2f\x6f\xbd\xa3\xed\xb0\xc2\xd3\x25\x1d\x50\xbb\
+\xe8\xa3\x65\x9a\x82\xed\xd4\x38\x25\x3e\x5c\xd1\x3a\x1f\x1d\xe3\
+\x02\x21\x3f\x47\x13\x8b\x9b\x05\xc1\xb7\x46\x1a\x18\x5d\x85\x86\
+\x10\x90\xe7\x4c\x40\x7f\x10\x12\x48\x5c\x2b\x43\x69\x31\x08\x43\
+\xbc\x11\x93\xc0\x23\x58\xa9\xc9\x44\x12\x13\x72\x71\x7c\x88\x8b\
+\xb0\xd4\xd9\x14\x45\x30\x3f\x10\xde\xe3\x8b\x6c\x91\x89\x47\x9a\
+\xc2\x37\xbf\x1b\x1e\x03\x98\x58\xa4\xb1\x91\x36\xad\x15\xc3\x43\
+\x18\x50\x52\x8d\x27\xa7\x68\xc3\x00\xe3\x30\x45\xb0\x6b\xb8\xac\
+\x10\x1c\xe4\x64\xdb\x62\x6d\x92\xad\x1a\x72\xf9\xf0\x51\x6f\xce\
+\xa9\xef\xd1\xa3\xbf\xd8\x55\x19\x65\x3a\xc6\x26\x37\xeb\xd7\x47\
+\x23\xb6\xb4\x60\x08\xe2\x7e\xa3\xe5\x6a\x76\x31\x5b\x8c\xe7\x14\
+\x16\xc4\xa4\x32\xca\x16\xc3\x06\xf6\x95\xca\x01\xf9\x58\x2e\xcf\
+\x9f\x6a\x3d\xf9\x30\x3c\xf9\x4a\xd4\xa5\xe4\x2e\x54\x7e\x45\x4c\
+\x31\xfb\xc9\x2c\x60\xca\x9c\xed\x2f\x2a\x09\x1e\x58\x99\xe2\x19\
+\x18\x8e\xe0\x3f\x5a\xab\x9a\xce\xd4\xd2\xa9\x3b\xa9\x0e\x9a\xc1\
+\x90\x4f\xd8\xf9\xcc\x6f\xf7\x76\x17\xd5\xde\xf2\x4d\x2b\xcf\xcd\
+\xd1\x4a\xd1\xf7\x90\xdb\x98\xa2\x8b\xc0\x88\x3f\xea\x7a\xa2\xef\
+\x69\xf1\xb1\xab\xf5\x0d\xb6\x02\x14\xd9\xb0\xc9\x65\xbe\xcd\x75\
+\xb6\x6d\x09\x36\x1b\xfc\x39\xc1\xb3\x97\x7b\x29\xd5\x17\x8a\x1f\
+\x2b\x4c\xe3\xce\x2b\x86\xf2\xe1\xf0\x30\xd7\xe1\x19\x2d\x74\x4a\
+\xed\xb3\x5f\x01\x35\x4c\xc7\x8e\x32\x49\x8a\xec\x96\xf2\x60\x51\
+\x24\x05\x66\x02\xed\x27\x9a\x28\x6f\xc0\x70\x50\xcc\xa5\xf0\x0a\
+\x26\xf2\x8a\x56\x60\x1d\x17\x83\x35\xfa\x94\x0c\x0c\x3d\xc7\xb8\
+\x8b\xfb\x20\x8d\xd8\x50\x70\x46\x9c\x91\x94\xbc\x92\x2a\xe7\xdc\
+\x32\x9f\xe8\x62\xac\x97\x11\xc9\xb6\x44\xd7\x15\x58\x72\xfb\xa4\
+\xe9\xbe\x06\x1d\x5e\x62\xf5\x04\x1d\x13\x68\x35\xc7\x17\xd1\x38\
+\x88\x0e\x29\x92\xd3\x90\x4c\x7b\x1a\x53\x81\xe5\x32\x48\x33\x16\
+\xa3\x58\x9e\xb0\xc4\x42\x93\x42\x2a\xda\x6b\xe9\xb8\x65\x84\x80\
+\x80\x82\x3e\x3a\xaa\xa7\x88\x45\x72\x18\x58\x74\x4f\xe7\x45\x44\
+\x9e\x54\x52\x9a\x1c\x4e\x55\x19\xa7\xa0\x36\xa4\xa0\x92\x64\x1c\
+\xf0\xe8\x37\x50\x84\xa8\x21\x00\xb5\x14\xc7\x40\xec\x14\xc8\x4c\
+\x06\x72\x57\x48\xc3\x72\x75\x6a\x07\x81\xb3\x73\x6c\x50\x83\x13\
+\x0e\x92\x5b\x60\x89\x31\x96\x35\x08\x75\x29\xb5\x30\x11\x69\xca\
+\x5a\xeb\x06\xb9\x86\x80\x94\xac\x32\x22\x1f\xfc\x36\x25\x1d\x2e\
+\x51\x99\x12\x72\x97\x3b\x94\x25\x7a\x3d\x25\x1a\xec\xb0\x22\x43\
+\x6c\x23\x06\x98\xf8\xb7\x34\x94\x85\x94\x04\x49\xb0\xaf\x02\x0b\
+\x4b\xb0\x87\x26\x7a\x43\xcd\xf8\x13\xbb\x64\x7e\x3e\xe4\xf7\xdb\
+\x43\x1f\xf2\xdb\xc8\x86\x62\x68\xe2\x4c\x95\x31\x91\x42\xed\x7c\
+\xf3\x2d\xa7\x23\xc8\xcf\x65\x2b\xc0\xd2\xac\xe7\xf0\x18\x2a\xc4\
+\x14\x99\xa8\x1a\x52\xa8\x40\x67\xec\x26\x09\x86\x2e\xb9\x58\x7c\
+\x9f\x1d\xb9\x30\x12\x20\x8d\xe9\xc1\xb1\xb0\x4f\x20\x51\xf3\x84\
+\x03\xd6\xaa\x02\x52\x79\x53\xb8\xa5\x80\x5c\x89\x32\x0a\xda\xbc\
+\x12\x8f\xe8\xc6\xde\xd9\xb4\x08\xb4\x53\x35\xe0\xe1\xea\x50\xa8\
+\x31\x50\x89\xf1\x44\x8a\xaf\x48\xc6\x0c\x36\xd2\x46\x27\x34\x38\
+\x36\x0c\x2c\x09\x94\x48\x93\x14\xcf\x53\x65\x93\xe0\x4b\xed\x20\
+\x8e\xd4\x86\xa3\x4b\x06\x3a\xb2\x04\xa7\x25\x0c\x21\x80\x15\x82\
+\x82\x2d\x03\x3f\x48\x4a\x9b\x2b\x8a\xa1\xdf\xb3\x14\x8d\x99\xdc\
+\xbc\xff\x4d\xe2\x87\xbd\xe2\xee\x09\x38\x2c\x18\x76\x3c\xde\x73\
+\x0e\x1e\xfc\xc3\x0f\x2d\xbf\x50\xa2\x6e\x73\x55\xd6\x95\xa8\x38\
+\x5f\x80\x41\xab\x9a\x1d\x9c\x4c\xf7\x2d\xc9\x08\x96\x64\xda\x1b\
+\x47\x01\x36\x04\xcd\x98\x55\x07\xa2\x81\x4a\x07\x6a\x07\x86\x29\
+\x70\x22\x6e\xb3\x65\xb4\xd9\x22\x6b\x7e\x4a\x46\x95\x7b\x20\x8d\
+\xb9\x10\x8d\x38\x53\xc2\x9e\x46\xcd\x33\xe1\x97\xd8\x0f\xf3\x85\
+\x11\xa0\xf8\xf2\x52\xb9\x4c\xc1\x14\x9e\x94\x4e\xa5\x5c\x5d\xc7\
+\x48\x7a\xa9\x31\x41\xa7\x14\xdf\x00\xee\x31\x08\x03\x80\x18\xd0\
+\x26\x89\x34\x36\x24\xda\xd5\x69\x02\x0d\xf3\x23\xd2\x5f\xe3\xb4\
+\xa3\xf3\x02\x8b\x05\xb5\x40\x9a\x8f\x7f\xda\xc2\x12\x3b\x5a\x20\
+\x5e\xdd\x49\x96\x13\xed\xa5\x29\x46\xbf\x9a\xa8\x12\xad\x50\x7a\
+\xa4\x8b\xbd\x97\x92\xfe\xa2\x12\x1a\x5e\xc8\xcd\x8c\xe4\xc0\x48\
+\x53\x78\x0a\x39\x1c\xc6\xda\xb1\xf1\x15\xb1\xc4\x93\x60\x34\x28\
+\xf2\x23\x1a\xe8\x55\xa0\xae\x0e\x73\x30\x4a\xcb\x60\x95\x8e\x22\
+\x51\x36\xeb\x65\x43\xb3\x9f\x34\xa6\x5e\xaf\xc8\x37\x7a\x8d\xae\
+\xa1\x57\xbe\x31\x8c\x31\x52\xc9\x1f\x61\x66\x31\x52\x52\xe6\x20\
+\x91\xf4\x74\xe3\x01\xe2\x4a\x2d\xd9\x34\x83\xf9\xe1\xdc\x33\xcd\
+\x36\x24\x6f\xc2\x97\xef\xe9\x29\x19\x75\xea\x41\x17\xe8\x91\x8b\
+\x61\x43\x8f\x9c\x49\xcf\xd3\xa8\xe5\x02\x3a\xa7\xbe\x94\x1d\xe6\
+\xb0\xcb\x26\x78\xb8\x4a\x12\x1d\x9b\x4d\x9f\x12\x54\xc0\x11\xf9\
+\x51\x96\x08\xdf\x40\x04\xa4\x93\x19\x65\xc9\xd5\x8b\x15\xda\x94\
+\x89\x22\x0d\x0f\x88\xc8\x02\xe3\x3e\xf0\xbd\x47\x2a\x46\xb2\x05\
+\x86\xfd\x22\x6b\x96\xc2\xf4\x2d\xab\x2d\x8a\x7b\x92\xd9\x12\x85\
+\xea\x51\x03\xc5\x21\x39\xaa\xf7\x0c\x23\x83\x44\x0b\x59\x98\xa5\
+\xe8\x84\xe0\x46\x27\x49\x78\xe6\xc0\x89\x56\x62\x2e\xbb\xea\x73\
+\x19\xbc\x43\xbe\x29\x45\x10\xf1\x09\xe4\x34\x86\x16\x9a\x8e\x18\
+\x38\x06\x29\x7b\xba\xa7\xf4\x29\x1f\x63\x1d\xcd\x09\x0e\xde\x0d\
+\x23\x3d\xe6\xbb\xf1\xf4\x9b\x11\x94\x2a\x99\xf4\x99\xeb\x91\x32\
+\xe6\x7b\xd0\x94\xd1\x50\x39\xab\xe9\x8f\x47\xce\xcc\x9a\x4b\xa4\
+\x78\x2f\x1e\xeb\x42\x8a\x08\x5c\x1f\x43\x13\x91\x7a\xa7\xcf\x89\
+\xb5\x2e\x43\x52\xb3\xda\x55\x15\xae\xea\x7d\x59\x4e\xfb\x97\x84\
+\x1f\x74\xd2\x1a\xbe\xe2\xd7\xc3\xe6\xd3\x55\xc4\x58\xb2\xa3\x98\
+\x36\x0a\x3a\x9a\xc3\x33\x49\x14\x0f\x7d\x49\x12\x94\x24\x66\xed\
+\x72\x53\x0c\xe3\xb8\xd2\x47\x5c\x8c\x4c\x3b\xa8\xf1\x80\x8b\x8e\
+\x35\xa8\x39\x55\xfc\x54\xe6\xa2\x54\x62\x9e\x9b\xe2\x80\x69\x12\
+\x15\x3a\x3a\xa1\x19\xab\xca\x98\xb0\xd3\xe9\x43\xfa\x9d\x1f\x3c\
+\x20\xe1\xad\x8e\x15\x37\x64\x42\x3d\x4f\x26\xf5\x23\xc0\xa4\xaa\
+\x69\x42\x4d\xb2\x8f\x8a\xae\x0d\x63\xa2\x9d\x2a\x99\xb2\xed\x6e\
+\x0a\x57\x53\x06\x53\x6d\x3f\xbd\xcd\x55\x1f\xc2\x8c\x86\x3e\x9f\
+\xfa\x4e\xd9\x4f\xcb\xba\xfc\x7e\xd6\x05\x51\x50\xc4\xe8\xe2\x0b\
+\xbd\x49\x16\x62\xb4\xf7\xbc\x49\x16\x76\x1e\x54\xba\xf9\x23\xa3\
+\xbb\xef\x92\xb5\xc1\x8b\xe6\xd7\xb0\xb7\x6a\x46\xe0\xc7\x6d\x0c\
+\xed\xaf\x0c\x6e\x55\x9b\xf6\x1f\xf3\x4b\x65\xd1\xed\xdb\x7c\xdf\
+\x98\xd8\x0f\x7e\x18\x94\xc6\xcd\xa7\x5c\xeb\xc2\x33\x24\x88\x33\
+\xe9\x88\xe4\x63\x3a\x1c\x1a\xe1\xbe\xd7\xcd\x82\xf6\x18\x0a\xf2\
+\xd3\xdf\xec\xc1\x2f\x0a\xff\x0e\xa2\x70\xce\x48\x3f\x84\xb0\xd9\
+\xa9\x88\x25\xdb\x67\xc5\x51\xdc\xc1\x11\x9e\xe7\xe3\x99\xb6\xf8\
+\x52\xd9\x3b\xe0\xe8\x00\x12\x5e\x70\x54\x5f\x5b\x6c\xf1\xc0\xd1\
+\x10\x8e\x46\xe9\x5b\x84\x4f\x06\xff\xa2\x26\x5e\x9a\x80\x58\x0c\
+\x92\x34\xff\x7d\xf9\xfb\x2f\x17\x6f\xbe\x79\x85\x7f\x4c\xe2\xcd\
+\x37\xff\x0f\x50\x20\xe1\xaf\
+\x00\x00\x09\x6a\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
+\x6e\x6f\x22\x3f\x3e\x0a\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x64\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\
+\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\
+\x6e\x74\x73\x2f\x31\x2e\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\
+\x6e\x73\x3a\x63\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x63\x72\
+\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\x6e\x73\x2e\x6f\x72\
+\x67\x2f\x6e\x73\x23\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
+\x72\x64\x66\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\
+\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x30\x32\x2f\x32\
+\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\x74\x61\x78\x2d\x6e\x73\x23\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x76\x67\x3d\x22\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\
+\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\
+\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x6f\x64\x69\x70\
+\x6f\x64\x69\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x73\x6f\x64\x69\
+\x70\x6f\x64\x69\x2e\x73\x6f\x75\x72\x63\x65\x66\x6f\x72\x67\x65\
+\x2e\x6e\x65\x74\x2f\x44\x54\x44\x2f\x73\x6f\x64\x69\x70\x6f\x64\
+\x69\x2d\x30\x2e\x64\x74\x64\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x69\x6e\x6b\x73\x63\x61\x70\x65\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\
+\x6f\x72\x67\x2f\x6e\x61\x6d\x65\x73\x70\x61\x63\x65\x73\x2f\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\x20\x76\x65\x72\x73\
+\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x0a\x20\x20\x20\x78\x3d\x22\
+\x30\x70\x78\x22\x0a\x20\x20\x20\x79\x3d\x22\x30\x70\x78\x22\x0a\
+\x20\x20\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\
+\x31\x32\x38\x20\x31\x32\x38\x22\x0a\x20\x20\x20\x65\x6e\x61\x62\
+\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\
+\x65\x77\x20\x30\x20\x30\x20\x31\x30\x30\x20\x31\x30\x30\x22\x0a\
+\x20\x20\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x73\
+\x76\x67\x38\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\
+\x3a\x64\x6f\x63\x6e\x61\x6d\x65\x3d\x22\x69\x6d\x70\x6f\x72\x74\
+\x5f\x64\x61\x72\x6b\x5f\x74\x68\x65\x6d\x65\x2e\x73\x76\x67\x22\
+\x0a\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\x31\x32\x38\x22\x0a\
+\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x32\x38\x22\x0a\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x76\x65\x72\x73\
+\x69\x6f\x6e\x3d\x22\x30\x2e\x39\x32\x2e\x34\x20\x28\x35\x64\x61\
+\x36\x38\x39\x63\x33\x31\x33\x2c\x20\x32\x30\x31\x39\x2d\x30\x31\
+\x2d\x31\x34\x29\x22\x3e\x3c\x6d\x65\x74\x61\x64\x61\x74\x61\x0a\
+\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6d\x65\x74\x61\x64\x61\x74\
+\x61\x31\x34\x22\x3e\x3c\x72\x64\x66\x3a\x52\x44\x46\x3e\x3c\x63\
+\x63\x3a\x57\x6f\x72\x6b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x72\x64\x66\x3a\x61\x62\x6f\x75\x74\x3d\x22\x22\x3e\x3c\x64\x63\
+\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x69\x6d\x61\x67\x65\x2f\x73\x76\
+\x67\x2b\x78\x6d\x6c\x3c\x2f\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\
+\x3e\x3c\x64\x63\x3a\x74\x79\x70\x65\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x72\x64\x66\x3a\x72\x65\x73\x6f\x75\x72\x63\
+\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\x2e\x6f\
+\x72\x67\x2f\x64\x63\x2f\x64\x63\x6d\x69\x74\x79\x70\x65\x2f\x53\
+\x74\x69\x6c\x6c\x49\x6d\x61\x67\x65\x22\x20\x2f\x3e\x3c\x64\x63\
+\x3a\x74\x69\x74\x6c\x65\x3e\x3c\x2f\x64\x63\x3a\x74\x69\x74\x6c\
+\x65\x3e\x3c\x2f\x63\x63\x3a\x57\x6f\x72\x6b\x3e\x3c\x2f\x72\x64\
+\x66\x3a\x52\x44\x46\x3e\x3c\x2f\x6d\x65\x74\x61\x64\x61\x74\x61\
+\x3e\x3c\x64\x65\x66\x73\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\
+\x64\x65\x66\x73\x31\x32\x22\x20\x2f\x3e\x3c\x73\x6f\x64\x69\x70\
+\x6f\x64\x69\x3a\x6e\x61\x6d\x65\x64\x76\x69\x65\x77\x0a\x20\x20\
+\x20\x20\x20\x70\x61\x67\x65\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x66\
+\x66\x66\x66\x66\x66\x22\x0a\x20\x20\x20\x20\x20\x62\x6f\x72\x64\
+\x65\x72\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x36\x36\x36\x36\x36\x36\
+\x22\x0a\x20\x20\x20\x20\x20\x62\x6f\x72\x64\x65\x72\x6f\x70\x61\
+\x63\x69\x74\x79\x3d\x22\x31\x22\x0a\x20\x20\x20\x20\x20\x6f\x62\
+\x6a\x65\x63\x74\x74\x6f\x6c\x65\x72\x61\x6e\x63\x65\x3d\x22\x31\
+\x30\x22\x0a\x20\x20\x20\x20\x20\x67\x72\x69\x64\x74\x6f\x6c\x65\
+\x72\x61\x6e\x63\x65\x3d\x22\x31\x30\x22\x0a\x20\x20\x20\x20\x20\
+\x67\x75\x69\x64\x65\x74\x6f\x6c\x65\x72\x61\x6e\x63\x65\x3d\x22\
+\x31\x30\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\
+\x65\x3a\x70\x61\x67\x65\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x30\
+\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\
+\x70\x61\x67\x65\x73\x68\x61\x64\x6f\x77\x3d\x22\x32\x22\x0a\x20\
+\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\
+\x64\x6f\x77\x2d\x77\x69\x64\x74\x68\x3d\x22\x31\x32\x37\x34\x22\
+\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\
+\x69\x6e\x64\x6f\x77\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x37\x36\
+\x37\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6e\x61\x6d\x65\
+\x64\x76\x69\x65\x77\x31\x30\x22\x0a\x20\x20\x20\x20\x20\x73\x68\
+\x6f\x77\x67\x72\x69\x64\x3d\x22\x66\x61\x6c\x73\x65\x22\x0a\x20\
+\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x7a\x6f\x6f\
+\x6d\x3d\x22\x33\x2e\x37\x37\x36\x22\x0a\x20\x20\x20\x20\x20\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x78\x3d\x22\x38\x2e\x30\x33\
+\x37\x34\x36\x37\x36\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\
+\x63\x61\x70\x65\x3a\x63\x79\x3d\x22\x36\x30\x2e\x34\x39\x35\x31\
+\x33\x35\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\
+\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x78\x3d\x22\x30\x22\x0a\x20\
+\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\
+\x64\x6f\x77\x2d\x79\x3d\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x6d\
+\x61\x78\x69\x6d\x69\x7a\x65\x64\x3d\x22\x30\x22\x0a\x20\x20\x20\
+\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x75\x72\x72\x65\
+\x6e\x74\x2d\x6c\x61\x79\x65\x72\x3d\x22\x73\x76\x67\x38\x22\x20\
+\x2f\x3e\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\x20\x20\x64\x3d\x22\
+\x4d\x20\x31\x32\x30\x2c\x31\x31\x35\x2e\x37\x30\x32\x39\x37\x20\
+\x43\x20\x31\x32\x30\x2c\x31\x31\x38\x2e\x30\x35\x39\x34\x31\x20\
+\x31\x31\x37\x2e\x37\x34\x37\x31\x33\x2c\x31\x32\x30\x20\x31\x31\
+\x35\x2e\x30\x31\x31\x35\x2c\x31\x32\x30\x20\x48\x20\x31\x32\x2e\
+\x39\x38\x38\x35\x30\x36\x20\x43\x20\x31\x30\x2e\x32\x35\x32\x38\
+\x37\x33\x2c\x31\x32\x30\x20\x38\x2c\x31\x31\x38\x2e\x30\x35\x39\
+\x34\x31\x20\x38\x2c\x31\x31\x35\x2e\x37\x30\x32\x39\x37\x20\x63\
+\x20\x30\x2c\x2d\x32\x2e\x33\x35\x36\x34\x33\x20\x32\x2e\x32\x35\
+\x32\x38\x37\x33\x2c\x2d\x34\x2e\x32\x39\x37\x30\x33\x20\x34\x2e\
+\x39\x38\x38\x35\x30\x36\x2c\x2d\x34\x2e\x32\x39\x37\x30\x33\x20\
+\x48\x20\x31\x31\x35\x2e\x30\x31\x31\x35\x20\x63\x20\x32\x2e\x37\
+\x33\x35\x36\x33\x2c\x2d\x30\x2e\x31\x33\x38\x36\x31\x20\x34\x2e\
+\x39\x38\x38\x35\x2c\x31\x2e\x38\x30\x31\x39\x38\x20\x34\x2e\x39\
+\x38\x38\x35\x2c\x34\x2e\x32\x39\x37\x30\x33\x20\x7a\x20\x4d\x20\
+\x36\x34\x2c\x38\x20\x63\x20\x2d\x32\x2e\x37\x33\x35\x36\x33\x32\
+\x2c\x30\x20\x2d\x34\x2e\x39\x38\x38\x35\x30\x36\x2c\x31\x2e\x39\
+\x34\x30\x35\x39\x33\x38\x20\x2d\x34\x2e\x39\x38\x38\x35\x30\x36\
+\x2c\x34\x2e\x32\x39\x37\x30\x33\x20\x56\x20\x38\x32\x2e\x30\x31\
+\x39\x38\x30\x32\x20\x4c\x20\x33\x39\x2e\x33\x37\x39\x33\x31\x2c\
+\x36\x35\x2e\x32\x34\x37\x35\x32\x35\x20\x63\x20\x2d\x31\x2e\x39\
+\x33\x31\x30\x33\x34\x2c\x2d\x31\x2e\x36\x36\x33\x33\x36\x36\x20\
+\x2d\x35\x2e\x31\x34\x39\x34\x32\x34\x2c\x2d\x31\x2e\x36\x36\x33\
+\x33\x36\x36\x20\x2d\x37\x2e\x30\x38\x30\x34\x36\x2c\x30\x20\x2d\
+\x31\x2e\x39\x33\x31\x30\x33\x33\x2c\x31\x2e\x36\x36\x33\x33\x36\
+\x36\x20\x2d\x31\x2e\x39\x33\x31\x30\x33\x33\x2c\x34\x2e\x34\x33\
+\x35\x36\x34\x34\x20\x30\x2c\x36\x2e\x30\x39\x39\x30\x31\x20\x6c\
+\x20\x32\x38\x2e\x31\x36\x30\x39\x32\x2c\x32\x34\x2e\x32\x35\x37\
+\x34\x32\x33\x20\x63\x20\x30\x2e\x39\x36\x35\x35\x31\x38\x2c\x30\
+\x2e\x38\x33\x31\x36\x39\x20\x32\x2e\x32\x35\x32\x38\x37\x32\x2c\
+\x31\x2e\x32\x34\x37\x35\x32\x34\x20\x33\x2e\x35\x34\x30\x32\x33\
+\x2c\x31\x2e\x32\x34\x37\x35\x32\x34\x20\x31\x2e\x32\x38\x37\x33\
+\x35\x38\x2c\x30\x20\x32\x2e\x35\x37\x34\x37\x31\x32\x2c\x2d\x30\
+\x2e\x34\x31\x35\x38\x33\x34\x20\x33\x2e\x35\x34\x30\x32\x33\x2c\
+\x2d\x31\x2e\x32\x34\x37\x35\x32\x34\x20\x4c\x20\x39\x35\x2e\x37\
+\x30\x31\x31\x35\x2c\x37\x31\x2e\x33\x34\x36\x35\x33\x35\x20\x63\
+\x20\x31\x2e\x39\x33\x31\x30\x33\x2c\x2d\x31\x2e\x36\x36\x33\x33\
+\x36\x36\x20\x31\x2e\x39\x33\x31\x30\x33\x2c\x2d\x34\x2e\x34\x33\
+\x35\x36\x34\x34\x20\x30\x2c\x2d\x36\x2e\x30\x39\x39\x30\x31\x20\
+\x2d\x31\x2e\x39\x33\x31\x30\x33\x36\x2c\x2d\x31\x2e\x36\x36\x33\
+\x33\x36\x36\x20\x2d\x35\x2e\x31\x34\x39\x34\x32\x36\x2c\x2d\x31\
+\x2e\x36\x36\x33\x33\x36\x36\x20\x2d\x37\x2e\x30\x38\x30\x34\x36\
+\x2c\x30\x20\x4c\x20\x36\x38\x2e\x39\x38\x38\x35\x30\x36\x2c\x38\
+\x32\x2e\x31\x35\x38\x34\x31\x36\x20\x56\x20\x31\x32\x2e\x32\x39\
+\x37\x30\x33\x20\x43\x20\x36\x38\x2e\x39\x38\x38\x35\x30\x36\x2c\
+\x39\x2e\x39\x34\x30\x35\x39\x33\x38\x20\x36\x36\x2e\x37\x33\x35\
+\x36\x33\x32\x2c\x38\x20\x36\x34\x2c\x38\x20\x5a\x22\x0a\x20\x20\
+\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x32\x22\x0a\x20\x20\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6e\x6e\
+\x65\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\x61\x74\x75\x72\x65\x3d\
+\x22\x30\x22\x0a\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\
+\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x31\x2e\x34\
+\x39\x33\x35\x30\x38\x35\x38\x3b\x66\x69\x6c\x6c\x3a\x23\x63\x63\
+\x63\x63\x63\x63\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\
+\x79\x3a\x31\x22\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x3a\x6c\x61\x62\x65\x6c\x3d\x22\x70\x61\x74\x68\x32\x22\
+\x20\x2f\x3e\x3c\x2f\x73\x76\x67\x3e\
+\x00\x00\x03\x0a\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\
+\x00\x00\x00\xc3\x50\x4c\x54\x45\x00\x00\x00\x00\x00\x80\x60\x40\
+\xbf\x33\x1a\x99\x68\x3a\xb9\x2c\x16\x90\x2b\x15\x95\x6a\x35\xb5\
+\x2f\x1a\x92\x68\x39\xb6\x31\x1a\x93\x65\x38\xb7\x30\x1b\x92\x68\
+\x38\xb7\x67\x39\xb8\x2f\x1b\x93\x2f\x1a\x92\x66\x38\xb6\x31\x19\
+\x91\x67\x3a\xb7\x31\x1a\x91\x67\x39\xb7\x30\x1b\x91\x66\x3a\xb7\
+\x30\x1b\x92\x66\x39\xb6\x30\x1b\x91\x67\x39\xb7\x30\x1a\x91\x66\
+\x3a\xb6\x31\x1b\x91\x66\x39\xb6\x31\x1b\x92\x66\x3a\xb6\x31\x1a\
+\x92\x67\x39\xb7\x30\x1b\x92\x67\x3a\xb6\x31\x1b\x92\x67\x3a\xb7\
+\x70\x46\xbb\x7a\x52\xc0\x83\x5f\xc4\x8c\x6a\xc8\x8d\x6b\xc9\x96\
+\x77\xcd\x9f\x83\xd2\xa0\x84\xd2\xa9\x90\xd6\xb2\x9c\xdb\xb3\x9d\
+\xdb\xbc\xa8\xdf\xbd\xa9\xe0\xc6\xb4\xe4\xc6\xb5\xe4\xd0\xc2\xe9\
+\xd9\xcd\xed\xd9\xce\xed\xe2\xda\xf2\xe3\xda\xf2\xec\xe6\xf6\xec\
+\xe7\xf6\xf5\xf2\xfb\xf6\xf3\xfb\xff\xff\xff\x73\xd3\x66\x67\x00\
+\x00\x00\x26\x74\x52\x4e\x53\x00\x02\x08\x0a\x16\x17\x18\x18\x31\
+\x31\x4e\x4e\x60\x60\x6f\x71\x8c\x8c\x8d\x8d\xbc\xbc\xbe\xbe\xc0\
+\xc0\xc8\xc9\xcf\xcf\xd1\xd2\xdc\xdc\xec\xec\xf8\xf8\x0f\x29\xc5\
+\x5a\x00\x00\x01\xd0\x49\x44\x41\x54\x58\xc3\xed\x97\xc9\x72\xc2\
+\x30\x0c\x86\xbb\xef\xfb\x4a\x5b\xe8\xde\x24\x4e\x9d\x06\x9c\x0d\
+\x03\x21\x7e\xff\xa7\xaa\x1c\x8b\x21\x6d\x98\xc1\x02\x2e\xcc\x44\
+\x17\xe5\x10\x7d\xf9\x2d\x4b\x56\xbc\xb1\xd1\xd8\x2a\x6d\xf3\xe4\
+\xa6\xd5\x6a\x3d\xcc\xb7\xdb\xd3\x99\xf1\x07\x6d\x47\x9b\x6b\x63\
+\x9d\xc3\x7a\xfc\xde\xbb\x63\x0f\x70\x3f\xf6\x6b\x80\x0b\x87\x02\
+\x70\x2f\x6b\x80\x57\x1a\xe0\xad\x06\xf8\xa4\x01\xbe\x6a\x00\x87\
+\x06\x70\x1b\xc0\x7a\x01\xf8\x37\xd8\xa2\x00\x16\x0d\x94\xb1\x51\
+\xc4\xe8\x00\x2f\x51\x55\x4b\x3c\x22\xc0\x1f\xeb\x30\x19\x0b\x2e\
+\x84\x2c\x55\xf8\x24\x80\x8e\x2f\xd2\x89\x70\x16\x03\x61\xcc\x08\
+\x80\x32\xbe\xfa\xc9\xa0\x50\xaa\x4f\x00\x0c\xff\xc5\xbb\x6e\x08\
+\x1a\x42\x6b\x80\x7e\x3b\x30\xe2\x83\x5e\x2f\x28\xf3\x97\x41\x1a\
+\xac\x01\xa0\x37\xab\xee\x44\x02\xcb\xf7\xc1\xfb\x96\x80\x10\xdf\
+\xf5\x26\x75\xa0\xa4\x59\x56\xd7\x12\x20\x4d\x84\x56\xad\x52\xce\
+\x11\x10\xa3\xac\xf9\x00\x4f\x99\x6f\x71\xf4\xe0\x62\x70\x5d\xa5\
+\x06\x76\x00\xbd\x02\x66\x84\xe4\xae\x59\xbc\x40\x9e\x1d\x00\xb4\
+\x16\x7a\x03\x2a\x81\x34\x00\xa6\x00\x24\x2b\x8e\x81\x9c\x04\x28\
+\x0c\x20\xc3\x40\x31\xf5\xb9\x1d\x00\xb3\x2e\x31\x15\x02\x37\x35\
+\xc6\xbd\x21\x01\x74\x0d\xa6\x28\x7d\x68\x52\x61\x01\x18\x4e\x01\
+\x20\xdd\x1b\x1b\x00\xb7\xaf\x44\x69\xaa\x5e\x4b\xef\x63\x35\xb3\
+\xb2\x2a\xa5\x65\x2f\x08\xa3\x9d\x55\xce\xa3\x51\x7f\x04\x7b\xcb\
+\x2c\x01\x1c\x3b\x57\x98\xe0\x34\x35\xbe\xda\xdf\x73\x7a\xa1\xc0\
+\xce\xed\xc2\x43\x0e\xc5\x2c\xc0\xab\x8c\xd9\x1f\x69\x42\x4d\x1a\
+\xcf\xc7\x28\xc6\x49\xa7\xb2\x57\xfc\x39\x7e\x16\x18\x2c\xba\x9d\
+\x54\xe4\x2d\x31\x99\x4a\xc2\x38\xf9\x81\xa1\xc4\x83\x68\x10\xd3\
+\x27\x53\x58\x54\xa7\x8a\x5c\x60\xb4\xb1\x74\x49\x00\xa4\x32\x4c\
+\x75\x35\xe7\x52\xf8\xcd\x1f\xca\x7a\x00\xda\x34\x40\xa7\x06\x38\
+\xa7\x01\xce\x6a\x80\xed\x67\x0a\xe0\x65\xab\x7e\x65\xd9\x7d\xb4\
+\x07\x3c\xed\xcc\xbc\x74\x1d\x5d\xdd\xd9\x5c\xba\xee\xaf\x8f\x9b\
+\x1b\xea\x6a\xed\x17\xbd\x80\xa2\x89\x0e\x1a\xbc\xf8\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x18\xb3\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
+\x6e\x6f\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\
+\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\
+\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x37\x2e\x31\x2e\x30\x2c\x20\
+\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\
+\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\
+\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\
+\x20\x2d\x2d\x3e\x0a\x0a\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x64\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\
+\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\
+\x6e\x74\x73\x2f\x31\x2e\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\
+\x6e\x73\x3a\x63\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x63\x72\
+\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\x6e\x73\x2e\x6f\x72\
+\x67\x2f\x6e\x73\x23\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
+\x72\x64\x66\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\
+\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x30\x32\x2f\x32\
+\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\x74\x61\x78\x2d\x6e\x73\x23\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x76\x67\x3d\x22\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\
+\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\
+\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x6f\x64\x69\x70\
+\x6f\x64\x69\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x73\x6f\x64\x69\
+\x70\x6f\x64\x69\x2e\x73\x6f\x75\x72\x63\x65\x66\x6f\x72\x67\x65\
+\x2e\x6e\x65\x74\x2f\x44\x54\x44\x2f\x73\x6f\x64\x69\x70\x6f\x64\
+\x69\x2d\x30\x2e\x64\x74\x64\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x69\x6e\x6b\x73\x63\x61\x70\x65\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\
+\x6f\x72\x67\x2f\x6e\x61\x6d\x65\x73\x70\x61\x63\x65\x73\x2f\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\x20\x76\x65\x72\x73\
+\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x0a\x20\x20\x20\x69\x64\x3d\
+\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x0a\x20\x20\x20\x78\x3d\x22\
+\x30\x70\x78\x22\x0a\x20\x20\x20\x79\x3d\x22\x30\x70\x78\x22\x0a\
+\x20\x20\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\
+\x36\x34\x20\x36\x34\x22\x0a\x20\x20\x20\x65\x6e\x61\x62\x6c\x65\
+\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\x77\
+\x20\x30\x20\x30\x20\x36\x39\x2e\x39\x20\x31\x30\x37\x2e\x33\x22\
+\x0a\x20\x20\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\
+\x72\x65\x73\x65\x72\x76\x65\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\
+\x70\x6f\x64\x69\x3a\x64\x6f\x63\x6e\x61\x6d\x65\x3d\x22\x74\x6f\
+\x72\x5f\x6c\x6f\x67\x6f\x2e\x73\x76\x67\x22\x0a\x20\x20\x20\x77\
+\x69\x64\x74\x68\x3d\x22\x36\x34\x22\x0a\x20\x20\x20\x68\x65\x69\
+\x67\x68\x74\x3d\x22\x36\x34\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\
+\x63\x61\x70\x65\x3a\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x30\x2e\
+\x39\x32\x2e\x34\x20\x28\x35\x64\x61\x36\x38\x39\x63\x33\x31\x33\
+\x2c\x20\x32\x30\x31\x39\x2d\x30\x31\x2d\x31\x34\x29\x22\x0a\x20\
+\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x65\x78\x70\x6f\x72\
+\x74\x2d\x66\x69\x6c\x65\x6e\x61\x6d\x65\x3d\x22\x46\x3a\x5c\x64\
+\x65\x76\x5c\x45\x6c\x65\x63\x74\x72\x6f\x6e\x2d\x43\x61\x73\x68\
+\x5c\x69\x63\x6f\x6e\x73\x5c\x74\x6f\x72\x5f\x6c\x6f\x67\x6f\x2e\
+\x70\x6e\x67\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x65\x78\x70\x6f\x72\x74\x2d\x78\x64\x70\x69\x3d\x22\x39\x36\
+\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x65\x78\
+\x70\x6f\x72\x74\x2d\x79\x64\x70\x69\x3d\x22\x39\x36\x22\x3e\x3c\
+\x6d\x65\x74\x61\x64\x61\x74\x61\x0a\x20\x20\x20\x69\x64\x3d\x22\
+\x6d\x65\x74\x61\x64\x61\x74\x61\x38\x39\x37\x22\x3e\x3c\x72\x64\
+\x66\x3a\x52\x44\x46\x3e\x3c\x63\x63\x3a\x57\x6f\x72\x6b\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x72\x64\x66\x3a\x61\x62\x6f\x75\x74\x3d\
+\x22\x22\x3e\x3c\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x69\x6d\
+\x61\x67\x65\x2f\x73\x76\x67\x2b\x78\x6d\x6c\x3c\x2f\x64\x63\x3a\
+\x66\x6f\x72\x6d\x61\x74\x3e\x3c\x64\x63\x3a\x74\x79\x70\x65\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x64\x66\x3a\x72\x65\x73\
+\x6f\x75\x72\x63\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\
+\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x64\x63\x6d\x69\x74\x79\
+\x70\x65\x2f\x53\x74\x69\x6c\x6c\x49\x6d\x61\x67\x65\x22\x20\x2f\
+\x3e\x3c\x64\x63\x3a\x74\x69\x74\x6c\x65\x3e\x3c\x2f\x64\x63\x3a\
+\x74\x69\x74\x6c\x65\x3e\x3c\x2f\x63\x63\x3a\x57\x6f\x72\x6b\x3e\
+\x3c\x2f\x72\x64\x66\x3a\x52\x44\x46\x3e\x3c\x2f\x6d\x65\x74\x61\
+\x64\x61\x74\x61\x3e\x3c\x64\x65\x66\x73\x0a\x20\x20\x20\x69\x64\
+\x3d\x22\x64\x65\x66\x73\x38\x39\x35\x22\x20\x2f\x3e\x3c\x73\x6f\
+\x64\x69\x70\x6f\x64\x69\x3a\x6e\x61\x6d\x65\x64\x76\x69\x65\x77\
+\x0a\x20\x20\x20\x70\x61\x67\x65\x63\x6f\x6c\x6f\x72\x3d\x22\x23\
+\x66\x66\x66\x66\x66\x66\x22\x0a\x20\x20\x20\x62\x6f\x72\x64\x65\
+\x72\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x36\x36\x36\x36\x36\x36\x22\
+\x0a\x20\x20\x20\x62\x6f\x72\x64\x65\x72\x6f\x70\x61\x63\x69\x74\
+\x79\x3d\x22\x31\x22\x0a\x20\x20\x20\x6f\x62\x6a\x65\x63\x74\x74\
+\x6f\x6c\x65\x72\x61\x6e\x63\x65\x3d\x22\x31\x30\x22\x0a\x20\x20\
+\x20\x67\x72\x69\x64\x74\x6f\x6c\x65\x72\x61\x6e\x63\x65\x3d\x22\
+\x31\x30\x22\x0a\x20\x20\x20\x67\x75\x69\x64\x65\x74\x6f\x6c\x65\
+\x72\x61\x6e\x63\x65\x3d\x22\x31\x30\x22\x0a\x20\x20\x20\x69\x6e\
+\x6b\x73\x63\x61\x70\x65\x3a\x70\x61\x67\x65\x6f\x70\x61\x63\x69\
+\x74\x79\x3d\x22\x30\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x3a\x70\x61\x67\x65\x73\x68\x61\x64\x6f\x77\x3d\x22\x32\
+\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\
+\x6e\x64\x6f\x77\x2d\x77\x69\x64\x74\x68\x3d\x22\x32\x31\x32\x33\
+\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\
+\x6e\x64\x6f\x77\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x33\x37\
+\x34\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x6e\x61\x6d\x65\x64\x76\
+\x69\x65\x77\x38\x39\x33\x22\x0a\x20\x20\x20\x73\x68\x6f\x77\x67\
+\x72\x69\x64\x3d\x22\x66\x61\x6c\x73\x65\x22\x0a\x20\x20\x20\x75\
+\x6e\x69\x74\x73\x3d\x22\x70\x78\x22\x0a\x20\x20\x20\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3a\x7a\x6f\x6f\x6d\x3d\x22\x36\x2e\x32\x36\
+\x30\x34\x39\x37\x39\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x3a\x63\x78\x3d\x22\x37\x32\x2e\x39\x31\x39\x36\x30\x32\
+\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x79\
+\x3d\x22\x36\x33\x2e\x35\x30\x39\x38\x36\x37\x22\x0a\x20\x20\x20\
+\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\
+\x78\x3d\x22\x32\x37\x34\x38\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\
+\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x79\x3d\x22\x33\
+\x33\x37\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\
+\x77\x69\x6e\x64\x6f\x77\x2d\x6d\x61\x78\x69\x6d\x69\x7a\x65\x64\
+\x3d\x22\x30\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x63\x75\x72\x72\x65\x6e\x74\x2d\x6c\x61\x79\x65\x72\x3d\x22\
+\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x2f\x3e\x0a\x3c\x67\x0a\x20\
+\x20\x20\x69\x64\x3d\x22\x67\x38\x39\x30\x22\x0a\x20\x20\x20\x74\
+\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\
+\x28\x30\x2e\x35\x39\x36\x34\x35\x39\x37\x38\x2c\x30\x2c\x30\x2c\
+\x30\x2e\x35\x39\x36\x34\x35\x39\x37\x38\x2c\x31\x31\x2e\x31\x36\
+\x31\x38\x30\x34\x2c\x2d\x31\x2e\x33\x34\x33\x39\x34\x65\x2d\x34\
+\x29\x22\x3e\x0a\x09\x3c\x67\x0a\x20\x20\x20\x69\x64\x3d\x22\x67\
+\x38\x38\x34\x22\x3e\x0a\x09\x09\x3c\x67\x0a\x20\x20\x20\x69\x64\
+\x3d\x22\x6c\x61\x79\x65\x72\x33\x5f\x31\x36\x5f\x22\x0a\x20\x20\
+\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x74\x72\x61\x6e\
+\x73\x6c\x61\x74\x65\x28\x2d\x39\x32\x2c\x2d\x36\x33\x2e\x39\x39\
+\x39\x37\x37\x34\x29\x22\x3e\x0a\x09\x09\x09\x3c\x67\x0a\x20\x20\
+\x20\x69\x64\x3d\x22\x6c\x61\x79\x65\x72\x35\x5f\x31\x36\x5f\x22\
+\x3e\x0a\x09\x09\x09\x09\x3c\x67\x0a\x20\x20\x20\x69\x64\x3d\x22\
+\x70\x61\x74\x68\x32\x35\x35\x34\x5f\x32\x37\x5f\x22\x3e\x0a\x09\
+\x09\x09\x09\x09\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\x64\x3d\x22\
+\x6d\x20\x31\x33\x32\x2e\x31\x2c\x37\x32\x20\x2d\x32\x2e\x39\x2c\
+\x31\x31\x2e\x33\x20\x63\x20\x34\x2c\x2d\x38\x20\x31\x30\x2e\x35\
+\x2c\x2d\x31\x34\x20\x31\x37\x2e\x38\x2c\x2d\x31\x39\x2e\x33\x20\
+\x2d\x35\x2e\x34\x2c\x36\x2e\x33\x20\x2d\x31\x30\x2e\x33\x2c\x31\
+\x32\x2e\x35\x20\x2d\x31\x33\x2e\x33\x2c\x31\x38\x2e\x38\x20\x35\
+\x2e\x31\x2c\x2d\x37\x2e\x31\x20\x31\x31\x2e\x39\x2c\x2d\x31\x31\
+\x2e\x31\x20\x31\x39\x2e\x36\x2c\x2d\x31\x33\x2e\x37\x20\x43\x20\
+\x31\x34\x33\x2e\x32\x2c\x37\x38\x2e\x32\x20\x31\x33\x35\x2c\x38\
+\x38\x20\x31\x32\x38\x2e\x39\x2c\x39\x37\x2e\x38\x20\x4c\x20\x31\
+\x32\x34\x2c\x39\x35\x2e\x37\x20\x63\x20\x30\x2e\x38\x2c\x2d\x37\
+\x2e\x39\x20\x33\x2e\x38\x2c\x2d\x31\x35\x2e\x39\x20\x38\x2e\x31\
+\x2c\x2d\x32\x33\x2e\x37\x20\x7a\x22\x0a\x20\x20\x20\x69\x64\x3d\
+\x22\x70\x61\x74\x68\x38\x35\x37\x22\x0a\x20\x20\x20\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3a\x63\x6f\x6e\x6e\x65\x63\x74\x6f\x72\x2d\
+\x63\x75\x72\x76\x61\x74\x75\x72\x65\x3d\x22\x30\x22\x0a\x20\x20\
+\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\x6c\x6c\x3a\x23\x36\x38\
+\x62\x30\x34\x34\x22\x20\x2f\x3e\x0a\x09\x09\x09\x09\x3c\x2f\x67\
+\x3e\x0a\x09\x09\x09\x09\x3c\x67\x0a\x20\x20\x20\x69\x64\x3d\x22\
+\x70\x61\x74\x68\x32\x35\x33\x34\x5f\x31\x30\x5f\x22\x3e\x0a\x09\
+\x09\x09\x09\x09\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\x64\x3d\x22\
+\x6d\x20\x31\x31\x39\x2c\x39\x33\x2e\x36\x20\x39\x2e\x34\x2c\x33\
+\x2e\x39\x20\x63\x20\x30\x2c\x32\x2e\x34\x20\x2d\x30\x2e\x32\x2c\
+\x39\x2e\x36\x20\x31\x2e\x33\x2c\x31\x31\x2e\x38\x20\x31\x35\x2e\
+\x36\x2c\x32\x30\x20\x31\x32\x2e\x39\x2c\x36\x30\x2e\x32\x20\x2d\
+\x33\x2e\x32\x2c\x36\x31\x2e\x32\x20\x2d\x32\x34\x2e\x35\x2c\x30\
+\x20\x2d\x33\x33\x2e\x38\x2c\x2d\x31\x36\x2e\x36\x20\x2d\x33\x33\
+\x2e\x38\x2c\x2d\x33\x31\x2e\x39\x20\x30\x2c\x2d\x31\x34\x20\x31\
+\x36\x2e\x37\x2c\x2d\x32\x33\x2e\x32\x20\x32\x36\x2e\x37\x2c\x2d\
+\x33\x31\x2e\x35\x20\x32\x2e\x35\x2c\x2d\x32\x2e\x33\x20\x32\x2e\
+\x31\x2c\x2d\x37\x2e\x32\x20\x2d\x30\x2e\x34\x2c\x2d\x31\x33\x2e\
+\x35\x20\x7a\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\
+\x38\x36\x30\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x63\x6f\x6e\x6e\x65\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\x61\
+\x74\x75\x72\x65\x3d\x22\x30\x22\x0a\x20\x20\x20\x73\x74\x79\x6c\
+\x65\x3d\x22\x66\x69\x6c\x6c\x3a\x23\x66\x35\x66\x38\x64\x65\x22\
+\x20\x2f\x3e\x0a\x09\x09\x09\x09\x3c\x2f\x67\x3e\x0a\x09\x09\x09\
+\x09\x3c\x67\x0a\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x32\
+\x35\x33\x36\x5f\x31\x37\x5f\x22\x3e\x0a\x09\x09\x09\x09\x09\x3c\
+\x70\x61\x74\x68\x0a\x20\x20\x20\x64\x3d\x22\x6d\x20\x31\x32\x38\
+\x2e\x34\x2c\x39\x37\x2e\x33\x20\x33\x2e\x34\x2c\x31\x2e\x37\x20\
+\x63\x20\x2d\x30\x2e\x33\x2c\x32\x2e\x32\x20\x30\x2e\x32\x2c\x37\
+\x2e\x31\x20\x32\x2e\x34\x2c\x38\x2e\x34\x20\x39\x2e\x38\x2c\x36\
+\x2e\x31\x20\x31\x39\x2e\x31\x2c\x31\x32\x2e\x38\x20\x32\x32\x2e\
+\x38\x2c\x31\x39\x2e\x34\x20\x31\x33\x2c\x32\x33\x2e\x35\x20\x2d\
+\x39\x2e\x31\x2c\x34\x35\x2e\x32\x20\x2d\x32\x38\x2e\x32\x2c\x34\
+\x33\x2e\x31\x20\x31\x30\x2e\x34\x2c\x2d\x37\x2e\x37\x20\x31\x33\
+\x2e\x34\x2c\x2d\x32\x33\x2e\x35\x20\x39\x2e\x35\x2c\x2d\x34\x30\
+\x2e\x37\x20\x2d\x31\x2e\x36\x2c\x2d\x36\x2e\x37\x20\x2d\x34\x2c\
+\x2d\x31\x32\x2e\x38\x20\x2d\x38\x2e\x34\x2c\x2d\x31\x39\x2e\x37\
+\x20\x2d\x32\x2c\x2d\x33\x2e\x33\x20\x2d\x31\x2e\x34\x2c\x2d\x37\
+\x2e\x35\x20\x2d\x31\x2e\x35\x2c\x2d\x31\x32\x2e\x32\x20\x7a\x22\
+\x0a\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x38\x36\x33\x22\
+\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6e\
+\x6e\x65\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\x61\x74\x75\x72\x65\
+\x3d\x22\x30\x22\x0a\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\
+\x69\x6c\x6c\x3a\x23\x37\x65\x34\x37\x39\x38\x22\x20\x2f\x3e\x0a\
+\x09\x09\x09\x09\x3c\x2f\x67\x3e\x0a\x09\x09\x09\x3c\x2f\x67\x3e\
+\x0a\x09\x09\x09\x3c\x67\x0a\x20\x20\x20\x69\x64\x3d\x22\x6c\x61\
+\x79\x65\x72\x34\x5f\x31\x36\x5f\x22\x3e\x0a\x09\x09\x09\x09\x3c\
+\x67\x0a\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x32\x35\x34\
+\x30\x5f\x31\x37\x5f\x22\x3e\x0a\x09\x09\x09\x09\x09\x3c\x70\x61\
+\x74\x68\x0a\x20\x20\x20\x64\x3d\x22\x6d\x20\x31\x32\x34\x2e\x36\
+\x2c\x31\x30\x38\x2e\x35\x20\x63\x20\x2d\x30\x2e\x37\x2c\x33\x2e\
+\x36\x20\x2d\x31\x2e\x35\x2c\x31\x30\x2e\x32\x20\x2d\x34\x2e\x37\
+\x2c\x31\x32\x2e\x37\x20\x2d\x31\x2e\x33\x2c\x31\x20\x2d\x32\x2e\
+\x37\x2c\x31\x2e\x39\x20\x2d\x34\x2e\x31\x2c\x32\x2e\x39\x20\x2d\
+\x35\x2e\x37\x2c\x33\x2e\x39\x20\x2d\x31\x31\x2e\x34\x2c\x37\x2e\
+\x35\x20\x2d\x31\x34\x2c\x31\x36\x2e\x39\x20\x2d\x30\x2e\x36\x2c\
+\x32\x20\x2d\x30\x2e\x31\x2c\x34\x2e\x31\x20\x30\x2e\x34\x2c\x36\
+\x2e\x31\x20\x31\x2e\x34\x2c\x35\x2e\x37\x20\x35\x2e\x35\x2c\x31\
+\x31\x2e\x39\x20\x38\x2e\x36\x2c\x31\x35\x2e\x35\x20\x30\x2c\x30\
+\x2e\x32\x20\x30\x2e\x36\x2c\x30\x2e\x36\x20\x30\x2e\x36\x2c\x30\
+\x2e\x37\x20\x32\x2e\x36\x2c\x33\x2e\x31\x20\x33\x2e\x34\x2c\x34\
+\x20\x31\x33\x2e\x33\x2c\x36\x2e\x32\x20\x6c\x20\x2d\x30\x2e\x32\
+\x2c\x31\x2e\x31\x20\x63\x20\x2d\x35\x2e\x39\x2c\x2d\x31\x2e\x36\
+\x20\x2d\x31\x30\x2e\x39\x2c\x2d\x33\x20\x2d\x31\x34\x2c\x2d\x36\
+\x2e\x36\x20\x30\x2c\x2d\x30\x2e\x31\x20\x2d\x30\x2e\x36\x2c\x2d\
+\x30\x2e\x36\x20\x2d\x30\x2e\x36\x2c\x2d\x30\x2e\x36\x20\x2d\x33\
+\x2e\x33\x2c\x2d\x33\x2e\x38\x20\x2d\x37\x2e\x34\x2c\x2d\x31\x30\
+\x2e\x31\x20\x2d\x38\x2e\x39\x2c\x2d\x31\x36\x2e\x31\x20\x2d\x30\
+\x2e\x36\x2c\x2d\x32\x2e\x34\x20\x2d\x31\x2c\x2d\x34\x2e\x32\x20\
+\x2d\x30\x2e\x34\x2c\x2d\x36\x2e\x37\x20\x32\x2e\x37\x2c\x2d\x39\
+\x2e\x37\x20\x38\x2e\x36\x2c\x2d\x31\x33\x2e\x35\x20\x31\x34\x2e\
+\x35\x2c\x2d\x31\x37\x2e\x35\x20\x31\x2e\x33\x2c\x2d\x30\x2e\x39\
+\x20\x32\x2e\x39\x2c\x2d\x31\x2e\x37\x20\x34\x2e\x32\x2c\x2d\x32\
+\x2e\x37\x20\x32\x2e\x36\x2c\x2d\x31\x2e\x39\x20\x34\x2c\x2d\x37\
+\x2e\x34\x20\x35\x2e\x33\x2c\x2d\x31\x31\x2e\x39\x20\x7a\x22\x0a\
+\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x38\x36\x37\x22\x0a\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6e\x6e\
+\x65\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\x61\x74\x75\x72\x65\x3d\
+\x22\x30\x22\x0a\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\
+\x6c\x6c\x3a\x23\x30\x31\x30\x31\x30\x31\x22\x20\x2f\x3e\x0a\x09\
+\x09\x09\x09\x3c\x2f\x67\x3e\x0a\x09\x09\x09\x09\x3c\x67\x0a\x20\
+\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x32\x35\x34\x32\x5f\x31\
+\x37\x5f\x22\x3e\x0a\x09\x09\x09\x09\x09\x3c\x70\x61\x74\x68\x0a\
+\x20\x20\x20\x64\x3d\x22\x6d\x20\x31\x32\x37\x2e\x31\x2c\x31\x32\
+\x33\x2e\x37\x20\x63\x20\x30\x2e\x31\x2c\x34\x2e\x31\x20\x2d\x30\
+\x2e\x33\x2c\x36\x2e\x32\x20\x30\x2e\x37\x2c\x39\x2e\x31\x20\x30\
+\x2e\x36\x2c\x31\x2e\x37\x20\x32\x2e\x38\x2c\x34\x2e\x31\x20\x33\
+\x2e\x34\x2c\x36\x2e\x34\x20\x30\x2e\x39\x2c\x33\x2e\x31\x20\x31\
+\x2e\x38\x2c\x36\x2e\x35\x20\x31\x2e\x37\x2c\x38\x2e\x36\x20\x30\
+\x2c\x32\x2e\x34\x20\x2d\x30\x2e\x31\x2c\x36\x2e\x38\x20\x2d\x31\
+\x2e\x32\x2c\x31\x31\x2e\x36\x20\x2d\x30\x2e\x38\x2c\x33\x2e\x39\
+\x20\x2d\x32\x2e\x36\x2c\x37\x2e\x33\x20\x2d\x35\x2e\x36\x2c\x39\
+\x2e\x32\x20\x2d\x33\x2e\x31\x2c\x2d\x30\x2e\x36\x20\x2d\x36\x2e\
+\x38\x2c\x2d\x31\x2e\x37\x20\x2d\x38\x2e\x39\x2c\x2d\x33\x2e\x36\
+\x20\x2d\x34\x2e\x32\x2c\x2d\x33\x2e\x36\x20\x2d\x37\x2e\x39\x2c\
+\x2d\x39\x2e\x37\x20\x2d\x38\x2e\x34\x2c\x2d\x31\x35\x2e\x31\x20\
+\x2d\x30\x2e\x34\x2c\x2d\x34\x2e\x34\x20\x33\x2e\x36\x2c\x2d\x31\
+\x30\x2e\x38\x20\x39\x2e\x33\x2c\x2d\x31\x34\x20\x34\x2e\x38\x2c\
+\x2d\x32\x2e\x38\x20\x35\x2e\x39\x2c\x2d\x35\x2e\x39\x20\x36\x2e\
+\x39\x2c\x2d\x31\x31\x20\x2d\x31\x2e\x34\x2c\x34\x2e\x34\x20\x2d\
+\x32\x2e\x38\x2c\x38\x2e\x32\x20\x2d\x37\x2e\x34\x2c\x31\x30\x2e\
+\x35\x20\x2d\x36\x2e\x37\x2c\x33\x2e\x35\x20\x2d\x31\x30\x2e\x31\
+\x2c\x39\x2e\x33\x20\x2d\x39\x2e\x38\x2c\x31\x34\x2e\x39\x20\x30\
+\x2e\x35\x2c\x37\x2e\x31\x20\x33\x2e\x33\x2c\x31\x32\x20\x39\x2c\
+\x31\x35\x2e\x39\x20\x32\x2e\x34\x2c\x31\x2e\x37\x20\x36\x2e\x38\
+\x2c\x33\x2e\x34\x20\x39\x2e\x36\x2c\x33\x2e\x39\x20\x76\x20\x2d\
+\x30\x2e\x34\x20\x63\x20\x32\x2e\x31\x2c\x2d\x30\x2e\x34\x20\x34\
+\x2e\x38\x2c\x2d\x33\x2e\x38\x20\x36\x2e\x32\x2c\x2d\x38\x2e\x35\
+\x20\x31\x2e\x32\x2c\x2d\x34\x2e\x32\x20\x31\x2e\x37\x2c\x2d\x39\
+\x2e\x36\x20\x31\x2e\x36\x2c\x2d\x31\x33\x20\x2d\x30\x2e\x31\x2c\
+\x2d\x32\x20\x2d\x31\x2c\x2d\x36\x2e\x33\x20\x2d\x32\x2e\x35\x2c\
+\x2d\x31\x30\x2e\x32\x20\x2d\x30\x2e\x39\x2c\x2d\x32\x2e\x31\x20\
+\x2d\x32\x2e\x32\x2c\x2d\x34\x2e\x33\x20\x2d\x33\x2e\x31\x2c\x2d\
+\x35\x2e\x38\x20\x2d\x31\x2c\x2d\x31\x2e\x34\x20\x2d\x31\x2c\x2d\
+\x34\x2e\x37\x20\x2d\x31\x2e\x35\x2c\x2d\x38\x2e\x35\x20\x7a\x22\
+\x0a\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x38\x37\x30\x22\
+\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6e\
+\x6e\x65\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\x61\x74\x75\x72\x65\
+\x3d\x22\x30\x22\x0a\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\
+\x69\x6c\x6c\x3a\x23\x30\x31\x30\x31\x30\x31\x22\x20\x2f\x3e\x0a\
+\x09\x09\x09\x09\x3c\x2f\x67\x3e\x0a\x09\x09\x09\x09\x3c\x67\x0a\
+\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x32\x35\x34\x34\x5f\
+\x31\x37\x5f\x22\x3e\x0a\x09\x09\x09\x09\x09\x3c\x70\x61\x74\x68\
+\x0a\x20\x20\x20\x64\x3d\x22\x6d\x20\x31\x32\x36\x2e\x34\x2c\x31\
+\x34\x30\x20\x63\x20\x30\x2e\x31\x2c\x32\x2e\x38\x20\x31\x2e\x32\
+\x2c\x36\x2e\x33\x20\x31\x2e\x37\x2c\x31\x30\x20\x30\x2e\x34\x2c\
+\x32\x2e\x37\x20\x30\x2e\x32\x2c\x35\x2e\x34\x20\x30\x2e\x31\x2c\
+\x37\x2e\x38\x20\x2d\x30\x2e\x31\x2c\x32\x2e\x38\x20\x2d\x31\x2c\
+\x37\x2e\x37\x20\x2d\x32\x2e\x32\x2c\x31\x30\x2e\x31\x20\x2d\x31\
+\x2e\x32\x2c\x2d\x30\x2e\x35\x20\x2d\x31\x2e\x36\x2c\x2d\x31\x2e\
+\x32\x20\x2d\x32\x2e\x34\x2c\x2d\x32\x2e\x32\x20\x2d\x31\x2c\x2d\
+\x31\x2e\x33\x20\x2d\x31\x2e\x36\x2c\x2d\x32\x2e\x37\x20\x2d\x32\
+\x2e\x32\x2c\x2d\x34\x2e\x33\x20\x2d\x30\x2e\x35\x2c\x2d\x31\x2e\
+\x32\x20\x2d\x31\x2c\x2d\x32\x2e\x36\x20\x2d\x31\x2e\x33\x2c\x2d\
+\x34\x2e\x31\x20\x2d\x30\x2e\x33\x2c\x2d\x32\x2e\x34\x20\x2d\x30\
+\x2e\x32\x2c\x2d\x36\x2e\x31\x20\x32\x2e\x35\x2c\x2d\x39\x2e\x39\
+\x20\x32\x2e\x31\x2c\x2d\x33\x20\x32\x2e\x35\x2c\x2d\x33\x2e\x32\
+\x20\x33\x2e\x32\x2c\x2d\x36\x2e\x37\x20\x2d\x31\x2c\x33\x2e\x31\
+\x20\x2d\x31\x2e\x37\x2c\x33\x2e\x34\x20\x2d\x33\x2e\x39\x2c\x36\
+\x20\x2d\x32\x2e\x35\x2c\x32\x2e\x39\x20\x2d\x32\x2e\x39\x2c\x37\
+\x2e\x31\x20\x2d\x32\x2e\x39\x2c\x31\x30\x2e\x35\x20\x30\x2c\x31\
+\x2e\x34\x20\x30\x2e\x36\x2c\x33\x20\x31\x2e\x31\x2c\x34\x2e\x35\
+\x20\x30\x2e\x36\x2c\x31\x2e\x36\x20\x31\x2e\x32\x2c\x33\x2e\x32\
+\x20\x32\x2c\x34\x2e\x34\x20\x31\x2e\x33\x2c\x31\x2e\x39\x20\x33\
+\x2c\x33\x20\x33\x2e\x38\x2c\x33\x2e\x32\x20\x30\x2c\x30\x20\x30\
+\x2c\x30\x20\x30\x2c\x30\x20\x30\x2c\x30\x20\x30\x2c\x30\x20\x30\
+\x2e\x31\x2c\x30\x20\x76\x20\x2d\x30\x2e\x31\x20\x63\x20\x31\x2e\
+\x35\x2c\x2d\x31\x2e\x37\x20\x32\x2e\x35\x2c\x2d\x33\x2e\x34\x20\
+\x32\x2e\x38\x2c\x2d\x35\x2e\x31\x20\x30\x2e\x34\x2c\x2d\x32\x2e\
+\x31\x20\x30\x2e\x35\x2c\x2d\x34\x2e\x31\x20\x30\x2e\x37\x2c\x2d\
+\x36\x2e\x36\x20\x30\x2e\x32\x2c\x2d\x32\x2e\x31\x20\x30\x2e\x31\
+\x2c\x2d\x34\x2e\x38\x20\x2d\x30\x2e\x35\x2c\x2d\x37\x2e\x37\x20\
+\x2d\x30\x2e\x37\x2c\x2d\x33\x2e\x37\x20\x2d\x32\x2c\x2d\x37\x2e\
+\x33\x20\x2d\x32\x2e\x36\x2c\x2d\x39\x2e\x38\x20\x7a\x22\x0a\x20\
+\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x38\x37\x33\x22\x0a\x20\
+\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6e\x6e\x65\
+\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\x61\x74\x75\x72\x65\x3d\x22\
+\x30\x22\x0a\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\x6c\
+\x6c\x3a\x23\x30\x31\x30\x31\x30\x31\x22\x20\x2f\x3e\x0a\x09\x09\
+\x09\x09\x3c\x2f\x67\x3e\x0a\x09\x09\x09\x09\x3c\x67\x0a\x20\x20\
+\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x32\x35\x35\x30\x5f\x31\x37\
+\x5f\x22\x3e\x0a\x09\x09\x09\x09\x09\x3c\x70\x61\x74\x68\x0a\x20\
+\x20\x20\x64\x3d\x22\x6d\x20\x31\x32\x36\x2e\x39\x2c\x31\x30\x35\
+\x2e\x31\x20\x63\x20\x30\x2e\x31\x2c\x34\x2e\x31\x20\x30\x2e\x34\
+\x2c\x31\x31\x2e\x38\x20\x31\x2e\x35\x2c\x31\x34\x2e\x38\x20\x30\
+\x2e\x33\x2c\x31\x20\x33\x2e\x32\x2c\x35\x2e\x35\x20\x35\x2e\x33\
+\x2c\x31\x31\x20\x31\x2e\x34\x2c\x33\x2e\x38\x20\x31\x2e\x37\x2c\
+\x37\x2e\x33\x20\x32\x2c\x38\x2e\x33\x20\x31\x2c\x34\x2e\x35\x20\
+\x2d\x30\x2e\x32\x2c\x31\x32\x2e\x31\x20\x2d\x31\x2e\x38\x2c\x31\
+\x39\x2e\x33\x20\x2d\x30\x2e\x38\x2c\x33\x2e\x39\x20\x2d\x33\x2e\
+\x35\x2c\x38\x2e\x37\x20\x2d\x36\x2e\x36\x2c\x31\x30\x2e\x36\x20\
+\x6c\x20\x2d\x30\x2e\x36\x2c\x31\x2e\x31\x20\x63\x20\x31\x2e\x37\
+\x2c\x2d\x30\x2e\x31\x20\x36\x2c\x2d\x34\x2e\x33\x20\x37\x2e\x35\
+\x2c\x2d\x39\x2e\x35\x20\x32\x2e\x35\x2c\x2d\x38\x2e\x39\x20\x33\
+\x2e\x36\x2c\x2d\x31\x33\x20\x32\x2e\x34\x2c\x2d\x32\x32\x2e\x38\
+\x20\x2d\x30\x2e\x32\x2c\x2d\x31\x20\x2d\x30\x2e\x36\x2c\x2d\x34\
+\x2e\x32\x20\x2d\x32\x2e\x31\x2c\x2d\x37\x2e\x37\x20\x2d\x32\x2e\
+\x32\x2c\x2d\x35\x2e\x33\x20\x2d\x35\x2e\x34\x2c\x2d\x31\x30\x2e\
+\x34\x20\x2d\x35\x2e\x38\x2c\x2d\x31\x31\x2e\x34\x20\x2d\x30\x2e\
+\x37\x2c\x2d\x31\x2e\x35\x20\x2d\x31\x2e\x36\x2c\x2d\x38\x2e\x37\
+\x20\x2d\x31\x2e\x38\x2c\x2d\x31\x33\x2e\x37\x20\x7a\x22\x0a\x20\
+\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x38\x37\x36\x22\x0a\x20\
+\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6e\x6e\x65\
+\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\x61\x74\x75\x72\x65\x3d\x22\
+\x30\x22\x0a\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\x6c\
+\x6c\x3a\x23\x30\x31\x30\x31\x30\x31\x22\x20\x2f\x3e\x0a\x09\x09\
+\x09\x09\x3c\x2f\x67\x3e\x0a\x09\x09\x09\x09\x3c\x67\x0a\x20\x20\
+\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x32\x35\x35\x32\x5f\x31\x37\
+\x5f\x22\x3e\x0a\x09\x09\x09\x09\x09\x3c\x70\x61\x74\x68\x0a\x20\
+\x20\x20\x64\x3d\x22\x6d\x20\x31\x32\x38\x2e\x34\x2c\x39\x37\x2e\
+\x37\x20\x63\x20\x2d\x30\x2e\x32\x2c\x34\x2e\x32\x20\x2d\x30\x2e\
+\x33\x2c\x37\x2e\x36\x20\x30\x2e\x35\x2c\x31\x30\x2e\x37\x20\x30\
+\x2e\x39\x2c\x33\x2e\x34\x20\x35\x2e\x33\x2c\x38\x2e\x33\x20\x37\
+\x2e\x31\x2c\x31\x34\x20\x33\x2e\x35\x2c\x31\x30\x2e\x38\x20\x32\
+\x2e\x36\x2c\x32\x34\x2e\x39\x20\x30\x2e\x31\x2c\x33\x35\x2e\x39\
+\x20\x2d\x31\x2c\x33\x2e\x39\x20\x2d\x35\x2e\x35\x2c\x39\x2e\x35\
+\x20\x2d\x31\x30\x2c\x31\x31\x2e\x33\x20\x6c\x20\x33\x2e\x33\x2c\
+\x30\x2e\x38\x20\x63\x20\x31\x2e\x38\x2c\x2d\x30\x2e\x31\x20\x36\
+\x2e\x35\x2c\x2d\x34\x2e\x34\x20\x38\x2e\x33\x2c\x2d\x39\x2e\x34\
+\x20\x32\x2e\x39\x2c\x2d\x37\x2e\x38\x20\x33\x2e\x35\x2c\x2d\x31\
+\x37\x2e\x32\x20\x32\x2e\x33\x2c\x2d\x32\x37\x20\x2d\x30\x2e\x31\
+\x2c\x2d\x31\x20\x2d\x31\x2e\x37\x2c\x2d\x39\x2e\x34\x20\x2d\x33\
+\x2e\x32\x2c\x2d\x31\x33\x20\x2d\x32\x2e\x31\x2c\x2d\x35\x2e\x33\
+\x20\x2d\x35\x2e\x35\x2c\x2d\x39\x20\x2d\x36\x2e\x37\x2c\x2d\x31\
+\x32\x2e\x33\x20\x2d\x30\x2e\x39\x2c\x2d\x32\x2e\x34\x20\x2d\x31\
+\x2e\x33\x2c\x2d\x39\x20\x2d\x30\x2e\x37\x2c\x2d\x31\x30\x2e\x34\
+\x20\x7a\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x38\
+\x37\x39\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\
+\x63\x6f\x6e\x6e\x65\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\x61\x74\
+\x75\x72\x65\x3d\x22\x30\x22\x0a\x20\x20\x20\x73\x74\x79\x6c\x65\
+\x3d\x22\x66\x69\x6c\x6c\x3a\x23\x30\x31\x30\x31\x30\x31\x22\x20\
+\x2f\x3e\x0a\x09\x09\x09\x09\x3c\x2f\x67\x3e\x0a\x09\x09\x09\x3c\
+\x2f\x67\x3e\x0a\x09\x09\x3c\x2f\x67\x3e\x0a\x09\x3c\x2f\x67\x3e\
+\x0a\x09\x3c\x67\x0a\x20\x20\x20\x69\x64\x3d\x22\x67\x38\x38\x38\
+\x22\x3e\x0a\x09\x09\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\x64\x3d\
+\x22\x6d\x20\x35\x39\x2e\x39\x2c\x35\x34\x2e\x35\x20\x63\x20\x2d\
+\x33\x2e\x34\x2c\x2d\x33\x2e\x31\x20\x2d\x37\x2e\x37\x2c\x2d\x35\
+\x2e\x36\x20\x2d\x31\x32\x2e\x31\x2c\x2d\x38\x2e\x31\x20\x2d\x32\
+\x2c\x2d\x31\x2e\x31\x20\x2d\x38\x2e\x31\x2c\x2d\x35\x2e\x39\x20\
+\x2d\x36\x2c\x2d\x31\x32\x2e\x37\x20\x6c\x20\x2d\x31\x35\x2e\x35\
+\x2c\x2d\x36\x2e\x33\x20\x2d\x31\x2c\x30\x2e\x38\x20\x63\x20\x35\
+\x2e\x32\x2c\x39\x2e\x33\x20\x32\x2e\x35\x2c\x31\x34\x2e\x32\x20\
+\x2d\x30\x2e\x31\x2c\x31\x35\x2e\x39\x20\x2d\x35\x2e\x32\x2c\x33\
+\x2e\x35\x20\x2d\x31\x32\x2e\x37\x2c\x38\x20\x2d\x31\x36\x2e\x35\
+\x2c\x31\x31\x2e\x39\x20\x2d\x37\x2e\x32\x2c\x37\x2e\x34\x20\x2d\
+\x39\x2e\x33\x2c\x31\x34\x2e\x34\x20\x2d\x38\x2e\x36\x2c\x32\x33\
+\x2e\x37\x20\x30\x2e\x37\x2c\x31\x31\x2e\x39\x20\x39\x2e\x34\x2c\
+\x32\x31\x2e\x38\x20\x32\x30\x2e\x39\x2c\x32\x35\x2e\x37\x20\x35\
+\x2e\x31\x2c\x31\x2e\x37\x20\x39\x2e\x38\x2c\x31\x2e\x39\x20\x31\
+\x35\x2c\x31\x2e\x39\x20\x38\x2e\x34\x2c\x30\x20\x31\x37\x2c\x2d\
+\x32\x2e\x32\x20\x32\x33\x2e\x33\x2c\x2d\x37\x2e\x35\x20\x36\x2e\
+\x37\x2c\x2d\x35\x2e\x35\x20\x31\x30\x2e\x36\x2c\x2d\x31\x33\x2e\
+\x39\x20\x31\x30\x2e\x36\x2c\x2d\x32\x32\x2e\x35\x20\x30\x2c\x2d\
+\x38\x2e\x37\x20\x2d\x33\x2e\x36\x2c\x2d\x31\x37\x20\x2d\x31\x30\
+\x2c\x2d\x32\x32\x2e\x38\x20\x7a\x20\x6d\x20\x2d\x32\x2e\x33\x2c\
+\x34\x33\x2e\x34\x20\x63\x20\x2d\x35\x2e\x37\x2c\x34\x2e\x38\x20\
+\x2d\x31\x36\x2e\x32\x2c\x38\x20\x2d\x32\x31\x2e\x36\x2c\x37\x2e\
+\x38\x20\x2d\x36\x2e\x31\x2c\x2d\x30\x2e\x33\x20\x2d\x31\x32\x2e\
+\x31\x2c\x2d\x31\x2e\x33\x20\x2d\x31\x37\x2e\x34\x2c\x2d\x33\x2e\
+\x39\x20\x43\x20\x39\x2e\x33\x2c\x39\x37\x2e\x33\x20\x33\x2e\x31\
+\x2c\x38\x37\x2e\x36\x20\x32\x2e\x37\x2c\x37\x39\x2e\x37\x20\x31\
+\x2e\x39\x2c\x36\x33\x2e\x36\x20\x39\x2e\x36\x2c\x35\x38\x2e\x39\
+\x20\x31\x36\x2e\x38\x2c\x35\x33\x20\x63\x20\x34\x2c\x2d\x33\x2e\
+\x33\x20\x39\x2e\x36\x2c\x2d\x34\x2e\x39\x20\x31\x32\x2e\x38\x2c\
+\x2d\x31\x30\x2e\x38\x20\x30\x2e\x36\x2c\x2d\x31\x2e\x33\x20\x31\
+\x2c\x2d\x34\x2e\x31\x20\x30\x2e\x32\x2c\x2d\x37\x2e\x31\x20\x2d\
+\x30\x2e\x33\x2c\x2d\x31\x20\x2d\x31\x2e\x38\x2c\x2d\x34\x2e\x36\
+\x20\x2d\x32\x2e\x34\x2c\x2d\x35\x2e\x34\x20\x4c\x20\x33\x39\x2c\
+\x33\x34\x2e\x39\x20\x63\x20\x2d\x31\x2e\x34\x2c\x35\x2e\x33\x20\
+\x32\x2e\x39\x2c\x31\x30\x2e\x39\x20\x36\x2e\x34\x2c\x31\x32\x2e\
+\x38\x20\x33\x2e\x35\x2c\x32\x20\x39\x2e\x31\x2c\x35\x2e\x37\x20\
+\x31\x32\x2e\x35\x2c\x38\x2e\x38\x20\x35\x2e\x39\x2c\x35\x2e\x33\
+\x20\x39\x2e\x31\x2c\x31\x32\x2e\x38\x20\x39\x2e\x31\x2c\x32\x30\
+\x2e\x38\x20\x30\x2e\x31\x2c\x37\x2e\x38\x20\x2d\x33\x2e\x33\x2c\
+\x31\x35\x2e\x35\x20\x2d\x39\x2e\x34\x2c\x32\x30\x2e\x36\x20\x7a\
+\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x70\x61\x74\x68\x38\x38\x36\
+\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\
+\x6e\x6e\x65\x63\x74\x6f\x72\x2d\x63\x75\x72\x76\x61\x74\x75\x72\
+\x65\x3d\x22\x30\x22\x0a\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\
+\x66\x69\x6c\x6c\x3a\x23\x30\x31\x30\x31\x30\x31\x22\x20\x2f\x3e\
+\x0a\x09\x3c\x2f\x67\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\
+\x67\x3e\
+\x00\x00\x07\xb1\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x50\x00\x00\x00\x50\x08\x06\x00\x00\x00\x8e\x11\xf2\xad\
+\x00\x00\x00\x06\x62\x4b\x47\x44\x00\x00\x00\x00\x00\x00\xf9\x43\
+\xbb\x7f\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x2e\x23\x00\x00\
+\x2e\x23\x01\x78\xa5\x3f\x76\x00\x00\x07\x51\x49\x44\x41\x54\x78\
+\xda\xed\x9c\x79\x6c\x14\x55\x1c\xc7\x1f\xd4\x13\x10\xb0\x46\xd4\
+\x70\x04\x0f\x42\x88\x07\x86\x8a\x88\x85\x5a\x0d\x44\x51\x8b\x0d\
+\x4d\x14\x44\xa3\x06\x9b\xfa\x07\x10\xb5\x89\xc1\x14\x6b\x54\x8c\
+\x9a\xd4\x44\x45\x40\x2a\x6a\x84\xd0\x78\xc4\x8a\x36\x01\x35\x8a\
+\x09\xc1\xb3\xa5\xad\x94\xd2\x52\x8e\x46\xda\x5d\x01\x2d\xad\xdb\
+\x6e\x0f\xdc\xee\xf3\xf7\xed\xbe\x4d\x9b\xdd\x99\x9d\xb7\x3b\x77\
+\x3b\x2f\xf9\xfc\xd3\x34\x33\x9d\x4f\x7f\xbf\x77\xce\xfc\x18\xf3\
+\x9a\x6b\xdb\x45\xc4\x4c\xe2\x41\xe2\x15\xe2\x53\x62\x1f\x51\x4b\
+\x34\x10\x75\xc4\x2f\xc4\xd7\xc4\x46\xe2\x29\xe2\x36\x62\xc2\x48\
+\x17\x77\x29\x91\x4b\x6c\x13\xa2\xba\x89\x7e\x82\x27\x20\x4c\xf4\
+\x11\x7e\x62\x17\xb1\x9a\xb8\x96\x18\x35\x92\xc4\x5d\x4c\xe4\x11\
+\x5f\x10\x67\x85\x14\x9e\x02\x51\x99\xbf\x12\x85\xc4\xe4\x91\x20\
+\x0f\xa9\xfa\x16\x71\x46\x87\x38\x25\x7a\x88\xaf\x88\x7b\x89\xb4\
+\xe1\x2a\xef\x6e\xe2\x1b\x89\x34\xe5\x3a\x22\xf2\x28\xb1\x86\xb8\
+\x70\x38\x89\x1b\x25\x52\xb6\xc6\xe0\xa8\x53\x03\xdd\x42\x31\x31\
+\x76\xb8\x08\xcc\x15\x23\xaa\x15\xf2\xa2\x74\x12\xcf\x13\x17\xb8\
+\x5d\xde\xad\xc4\x7e\x8b\xe5\x45\xf9\x9b\xc8\x77\xf3\x08\x7d\x19\
+\xb1\xdd\x26\x79\x51\x10\xf9\x0b\xdc\xda\xef\x61\x8e\x16\x4c\xe1\
+\xa1\x31\x35\xf9\x87\x38\x46\x1c\x22\x1a\x89\xbf\xc4\xb5\x92\xfd\
+\x67\xe0\xf7\x3f\x22\xc6\xbb\x4d\xe0\x75\xc4\xcf\x49\x3c\x30\x7e\
+\xaf\x83\xa8\x20\xd6\x12\xd9\x62\xca\x33\x5d\x4c\x94\xd1\x15\x3c\
+\x42\x7c\x40\x34\x27\x29\xb2\x9d\x58\xee\x36\x81\x6b\x45\x24\xc9\
+\xca\xdb\x4b\xac\x24\xd2\x35\xae\x8b\xe9\xc9\x42\x21\xb2\x3b\x89\
+\xeb\x7f\xe6\xa6\x28\xbc\x9c\xf8\x4e\x32\x4a\x30\x27\xdc\x49\xdc\
+\x98\xc2\x32\xb0\x48\x44\xad\x8c\x44\x2c\xfd\xb2\xdc\x22\x30\x4b\
+\xac\x34\x64\x22\x03\x1b\x04\xb3\x74\x2c\x09\x5f\x25\xce\x49\xdc\
+\x2b\x44\xac\x27\x46\xbb\x61\xf0\x78\x86\xf8\x4f\xe2\xa1\x7c\xc4\
+\x7d\x3a\xef\x37\x55\xac\x6e\xc2\x12\xff\xac\x2f\x89\x71\x4e\x17\
+\x78\xbe\xe8\x9f\x64\x96\x6b\x1f\x13\x63\x0c\xb8\x67\xbe\x58\x0b\
+\x6b\xdd\x0f\x23\xfa\xd5\x4e\x17\x38\x5e\xb2\xff\xc3\x00\xf0\xb8\
+\x81\x1b\x14\x47\x24\x04\xa2\x5b\x99\xeb\x74\x81\x93\xc4\xf6\x92\
+\xd6\xc3\x9c\x26\xe6\x19\x74\xcf\x89\x62\x14\xd7\xba\x67\x80\xb8\
+\xcb\xe9\x02\xa7\x88\x4d\x03\xad\x87\x69\xd5\x31\x78\xc4\xb6\x31\
+\x62\x30\xd2\xba\x67\x97\xd8\xee\x72\x74\x9b\x2a\x96\x4f\x5a\x0f\
+\xd3\x22\x52\xcf\x28\x81\xbb\x24\x05\xe6\x78\x02\x3d\x81\x9e\x40\
+\x4f\xa0\xce\x96\x96\x80\xe9\x49\x08\xbc\x5e\xe3\x5a\xb2\x5c\xc2\
+\x22\xe7\x21\xae\x11\xf8\x1c\xf1\xba\x0a\x9b\xc4\x14\x45\x66\x4a\
+\xb1\x35\xc1\x75\x92\xa1\x84\x68\x62\x72\x07\x4f\xef\x12\xab\x54\
+\x78\x42\xec\xfc\x98\xde\x4e\x88\x89\xb2\x1a\xb2\x3b\x24\x46\x23\
+\x73\xdf\x73\x62\x97\x48\x89\x7f\xc5\x8e\x90\xe9\xad\xd9\xc6\x1d\
+\x66\x33\x41\x84\x3e\xea\x09\xf4\x04\x7a\x02\x3d\x81\x9e\x40\x4f\
+\xa0\x27\xd0\x13\x38\x78\x68\x64\x37\x61\xb7\x0a\xc4\x41\xf8\x0e\
+\xe2\x0d\x1b\x79\x9b\xf8\xd3\xad\x02\xb1\xa4\x5b\x60\xd0\x7a\x37\
+\x55\x70\xc4\xfa\x83\x9b\x05\xce\xb7\x79\xdd\x9e\xee\x09\xf4\x04\
+\x7a\x02\x5d\x2d\x30\x3b\x3b\xfb\xf7\xc2\xc2\x42\x5e\x51\x51\xc1\
+\x03\x81\x00\x8f\x6d\x95\x95\x95\xbc\xa4\xa4\x84\xe7\xe4\xe4\xf4\
+\x4d\x9b\x36\x2d\xdf\x13\x88\x9b\x73\x9e\x41\x94\xf5\xf7\xf7\x77\
+\xf2\xe4\x5b\x25\xb1\x82\x18\x37\xe2\x04\x46\xc5\x11\x01\xae\xbf\
+\x99\x26\xd2\x91\x02\xe9\x41\x0b\x08\x3f\x37\xbe\x6d\x25\xae\x1a\
+\xb6\x02\x93\x8d\xba\x86\x9e\x66\x5e\xd5\x75\x78\x80\xae\x50\xb7\
+\x2d\xd1\xe8\x18\x81\x42\x5e\x53\xa2\x27\x2f\x3f\xbb\x97\x3f\x7d\
+\xb2\x84\x2f\x6c\x5c\xc5\xe7\x1c\x5e\xc9\x67\xd6\x2d\xe3\x33\xea\
+\x72\x07\xb8\xb9\x7e\xc5\xc0\xcf\x1e\x3e\x51\xc4\xdf\x3c\xb5\x83\
+\x9f\x3e\xd7\xa6\x25\x32\xdf\x08\x89\x8e\x10\xa8\x25\x0f\xe2\xee\
+\x69\x5a\xcd\xa7\xfc\xb1\x84\x8f\xaf\xce\xe2\xa3\xab\x6e\xe1\xac\
+\x2a\x43\x91\xb1\xd5\x99\xfc\x8a\xda\xc5\x7c\x76\xfd\x72\xfe\xb2\
+\xff\x7d\x2d\x91\xba\x25\x3a\x45\x60\xa9\x52\xda\x22\x45\x8b\x5a\
+\x37\x0d\x44\x5a\x5a\xd5\x5c\x55\x69\x6a\x4c\xaa\x5d\xc4\x1f\x3a\
+\xbe\x8e\xef\xee\xd8\xaf\x96\xe2\x48\xe7\x19\xae\x16\xa8\x36\x60\
+\x20\xea\x90\xaa\x13\x6a\xee\x48\x18\x71\x5a\x20\x22\xaf\x39\xb8\
+\x94\xbf\xe4\x2b\x55\x8b\x46\x5d\x03\x8b\xad\x02\xd5\x52\x17\xf2\
+\xd0\x9f\xa5\x12\x75\x89\xa2\xf1\x45\xdf\x7b\x6a\x12\x53\x4e\x65\
+\xbb\x05\xc6\xa5\x2e\xd2\x16\x91\x67\xa4\xbc\xa1\x12\x3f\x69\xfb\
+\x56\x29\x9d\x53\x4e\x65\xdb\x04\xaa\x45\x1f\xfa\x3c\xa4\xad\xd1\
+\xf2\xa2\x2c\x69\x5a\xc3\x8f\xf7\xb6\x18\x16\x85\x76\x0a\x8c\x8b\
+\x3e\xa4\x2e\x06\x0c\x3d\x7d\x9e\x4c\x9f\x58\xec\xdb\xa2\x94\xca\
+\x29\x45\xa1\x9d\x02\x0f\xc4\x3e\x01\xa6\x2a\x66\xa4\xae\x52\x2a\
+\xd7\x06\x8f\x28\x45\xe1\x1c\x57\x08\x54\x4a\x5f\x44\x1f\xe6\x79\
+\x66\xcb\x8b\xb2\xbe\x75\xb3\x52\x14\x26\x9d\xc6\x76\x09\x8c\x9b\
+\xba\x60\x85\x81\x49\xb2\x55\x02\xb3\x1a\x9f\xe4\x47\x7b\x4e\xea\
+\x9e\xd2\xd8\x25\x30\xae\xff\xc3\xc8\x6b\x66\xdf\xa7\xd4\x17\xd6\
+\x04\x1b\x75\xf7\x83\x76\x09\x8c\xeb\xff\x30\xef\xb3\x4a\x5e\x94\
+\x03\xc1\x06\xdd\xfd\xa0\x23\x04\x62\xee\x87\xd1\xd7\x6a\x81\x3b\
+\xdb\xf6\x28\xcd\x09\xdd\x27\x10\xdb\x51\xd8\x51\xb1\x5a\x60\xe9\
+\x99\x72\xde\x19\x0a\x5a\x26\xf0\x4e\x4f\x60\xea\x02\xf1\xc5\x26\
+\xea\x60\xe5\x31\xed\x0f\xa9\x93\x16\x88\x34\xc2\x7e\x9e\xd5\x02\
+\xf7\x05\xaa\x79\x38\x1c\xb6\x44\x60\xf4\x5d\x68\x7c\x72\x8f\xb7\
+\xe8\xf1\x12\xf7\x64\x23\x47\x61\x87\x0c\x22\xa6\x8d\xc2\xb1\x22\
+\xf1\x85\xe6\x8f\x6c\xb0\x60\xd8\x68\xbd\xf3\x40\xec\x24\x63\x6a\
+\x61\x95\xbc\x59\x87\xf2\x78\x23\x0d\x5e\x56\xcd\x03\xd5\xe8\x25\
+\x7e\x63\x91\x2f\xc8\x6f\x62\x92\xb5\xae\x94\x56\x22\xd8\x86\xc7\
+\x4e\xb2\x55\x02\x57\xd2\x3f\xcc\xd7\x77\xc6\xb2\x95\x88\x56\x44\
+\xa2\x8f\xc4\x47\xd0\xaf\x11\xb7\x33\x89\x7a\x57\xb1\xfd\x20\x96\
+\x55\xd8\x86\xb7\x4a\xe0\x9e\x8e\x9f\x78\x28\x1c\xb2\x6c\x2d\x9c\
+\xcc\x3b\x84\xb8\xe6\x66\x62\x11\x53\xff\x8a\x3d\xcd\xe7\xf3\x7d\
+\xde\x4b\x6d\xe8\x5f\x8f\x33\x0c\x2c\xf4\xcd\x96\x97\x7b\xac\x90\
+\xb7\xf4\x9d\x32\x64\x37\xc6\xac\x22\x62\xb8\x26\xaa\x6b\xa0\x14\
+\xc0\x32\x16\xa9\xcc\x81\x86\xfa\x57\xa8\x1b\xb3\x21\x33\x33\xb3\
+\x89\x1a\x8f\x8d\x42\x9c\x61\x98\xd9\x17\xa2\xef\xc3\xe8\xab\x10\
+\x7d\x29\xed\x07\x3e\x20\x1e\xd2\xcf\xcc\x29\x65\x07\x91\xa8\xc0\
+\x56\x4e\x3c\xcb\x22\x9f\x67\x1d\x67\x91\xca\x1b\xbc\xb4\xb4\x34\
+\xee\x1d\x17\x1c\x00\xe1\x0c\xc3\x2c\x81\x1b\xfc\xdb\x78\x47\xa8\
+\xd3\xd0\xc3\x25\x94\x96\xc3\xe7\xf3\xef\xb0\x48\x89\x26\xb3\x6a\
+\x02\x76\xc7\x46\x7b\x46\x46\x06\x8f\x8d\x42\xcc\x09\x71\x00\x64\
+\x46\x2a\x23\x75\x31\xf2\x2a\xcc\xfd\x0c\x39\x23\x46\x7a\xcd\x13\
+\x03\xc1\x41\x26\x57\xc3\x45\x37\x05\x05\x05\xdc\xef\xf7\xc7\xa5\
+\x32\x0e\x80\x8c\x94\x08\x79\x98\xf7\x29\xa4\xae\xe1\xaf\x7b\x60\
+\x2a\x82\xcf\x57\xd7\xb1\x48\xc5\xdd\x1e\x66\x72\xd5\x36\xa5\x54\
+\x86\x44\x1c\x00\xe1\x0c\x43\x4f\x9f\x88\x3e\x0f\x69\x8b\xc8\x53\
+\x90\xa7\xfb\x5c\x38\x51\xc3\xe4\x18\xb5\x59\x50\xaa\x78\x37\x8b\
+\x14\x42\x34\x45\xa0\x52\x2a\x47\xd3\x19\x07\x40\x38\xc3\x48\x25\
+\x1a\x11\x75\x18\x30\xd0\xe7\x29\xa4\xad\x61\xa9\x2b\xd3\x50\x02\
+\x05\x6f\x7c\xa2\x5a\x6f\x9b\x19\x11\xa9\x26\x31\x1a\x8d\x38\xc3\
+\xc0\x36\x3c\x76\x92\x13\x45\x24\x22\x0e\x93\x64\xcc\xf3\x30\x55\
+\x51\x88\x3a\xcb\xe5\x0d\x6d\x13\x89\xa5\xc4\x87\x62\xe4\x0e\x1b\
+\x2d\xb1\xac\xac\x4c\xf1\xed\xd3\xa8\x48\x6c\xc3\x63\x27\x19\xfd\
+\x19\xf6\xf3\xb0\xa3\x02\x10\x69\xf8\x19\x52\x15\x2b\x8c\x04\xe2\
+\x4c\x7f\xe9\x52\xa6\x8d\x11\x13\xe5\x8d\x43\xa7\x25\x06\x4d\x7b\
+\xda\x8b\x8b\x8b\x6b\x83\xc1\x60\xbb\xd6\xeb\x55\x48\xf1\x40\xa8\
+\x6b\x80\xfe\x70\xbf\x2d\xef\x07\x1a\x31\x72\xa3\x04\x13\x2a\xaf\
+\xd5\x31\xb9\x42\x65\x6a\xe2\x50\xd9\x72\xbb\x98\x78\xa7\xbb\xe5\
+\x0d\x55\xa3\xda\x79\xc4\x0d\x43\x46\xee\x5e\x49\x71\x21\xb1\xf4\
+\xdb\x42\x2c\x66\x0a\xe5\x8e\x75\x8a\x74\xbc\xb8\xd8\x36\x4a\x8c\
+\xdc\xd8\xe6\xfa\x9e\x45\xaa\x6b\x84\x15\xa2\x0d\xe2\xea\x59\xa4\
+\xd0\xc4\x7c\x26\x59\x6c\x5b\xc8\x2c\x24\x2a\x54\x84\x42\x58\x09\
+\x71\xbf\x9b\xa4\xa9\x89\xbc\x92\x78\x4c\x2c\xe3\xda\xd9\x60\xbd\
+\x7c\x6c\x7f\xbd\x40\xcc\x16\x91\xeb\xb8\xf6\x3f\xfa\x3e\x32\x0d\
+\x9b\xcc\x76\xc6\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x01\xa1\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\
+\x00\x00\x00\x7b\x50\x4c\x54\x45\x00\x00\x00\xe3\xe3\xe3\xd7\xd7\
+\xe4\xcf\xd7\xdc\xce\xd7\xdb\xcf\xd7\xdc\x18\xf2\xf2\x18\xf3\xf3\
+\x18\xff\xff\x19\xe5\xe6\x19\xe6\xe6\x1a\xd8\xd9\x1b\xbf\xc1\x1b\
+\xcb\xcc\x1b\xcc\xcd\x1c\xbe\xc0\x1f\x8a\x8e\x1f\x8b\x8e\x1f\x97\
+\x9a\x1f\x98\x9b\x20\x7e\x82\x22\x63\x68\x22\x64\x69\x24\x3d\x43\
+\x24\x4a\x50\x26\x31\x37\x50\x5a\x60\x8f\xa3\xad\x95\x9e\xa4\x96\
+\x9f\xa4\x9b\xad\xb6\x9e\xaf\xb9\xa4\xad\xb2\xaa\xba\xc1\xb3\xbf\
+\xc7\xbf\xca\xd0\xc1\xc9\xce\xc3\xcd\xd3\xc7\xd1\xd6\xcb\xd3\xd9\
+\xcf\xd7\xdc\xf4\x9a\xd3\x96\x00\x00\x00\x06\x74\x52\x4e\x53\x00\
+\x09\x13\xb4\xb8\xfd\x0c\x5d\x61\x4c\x00\x00\x00\xcf\x49\x44\x41\
+\x54\x58\xc3\xed\xd6\xd9\x0e\xc2\x20\x10\x85\xe1\xba\xd4\x1e\xf7\
+\xa5\x5a\x8a\xa3\xb6\x74\x9d\xf7\x7f\x42\x6f\x8c\x92\xea\x05\x85\
+\x98\x68\xca\x7f\xcf\x97\x4c\x86\x10\x82\xc0\xe7\xd3\x9a\x72\xaf\
+\x26\xdd\xf3\xe3\xb0\x1f\x10\x8e\xba\x02\x33\xb7\x65\xc3\xcc\x75\
+\x6d\x24\x04\xef\x40\x7b\x23\x2a\x59\x11\x29\x4b\xa0\x24\x22\xc5\
+\x44\x44\x96\x40\x43\x44\x05\x67\x44\x99\x25\xc0\xa5\x2a\x98\x5b\
+\xa5\x5a\x5b\xa0\x57\xdf\x00\xf2\xb3\x71\xf9\x47\xe0\x22\x8d\xbb\
+\x7a\xc0\x03\x7f\x01\x1c\x5d\x01\x2c\x13\x47\x00\xd8\xa6\x2e\x40\
+\x04\x00\x07\x61\x0f\x88\x18\x00\x66\x3b\x87\x2d\xa4\x2b\x00\x70\
+\x59\xa3\x58\xbb\x01\xfb\x19\x80\xc8\x1a\x48\xe6\x00\x10\x0b\x97\
+\x35\x62\x93\x4a\x29\xa5\x38\xe9\xf5\x00\x16\x8f\x9b\x94\x40\xcf\
+\xfc\x1e\xc4\xcf\x61\xec\x80\xd7\xf0\x22\xd1\xf3\x0f\x8a\x07\x86\
+\x01\x54\xb9\x71\xd5\x4f\x7e\xf3\x7c\x83\xee\x0e\x31\x5b\x04\x0a\
+\x19\xbd\x6b\x51\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x0e\xd2\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x96\x00\x00\x00\x8a\x08\x06\x00\x00\x00\x48\x15\xb3\x02\
+\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\
+\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x80\x44\x00\x00\
+\x80\x44\x01\x83\x9a\x25\xad\x00\x00\x0e\x72\x49\x44\x41\x54\x78\
+\xda\xed\x5d\x69\x74\x54\x45\x16\xee\x25\x1b\x09\x64\x5f\x3a\x24\
+\x84\x24\x64\xa1\xd3\x8d\x2b\x22\x22\xcb\x20\x0a\x88\x0e\x0e\x32\
+\xac\x22\xb2\xe8\xc0\x91\x23\x08\x0a\x08\x82\xe2\x32\x07\x07\x47\
+\x54\xf6\x45\x60\x46\x90\x11\x94\x7d\x07\x81\x71\x00\x11\x11\x85\
+\x08\x84\x10\xd6\x91\x71\x46\x67\x5c\x50\x41\x14\xb4\xe6\x55\x9b\
+\xd6\x26\xa4\xeb\xd6\x7b\xaf\xde\xda\xf7\x9e\xf3\xfd\xeb\xbc\xae\
+\xba\xf7\xcb\xeb\xaa\xef\xde\xba\xe5\x70\xa0\xb1\x2c\x46\xc2\x03\
+\x12\xb6\x48\x38\x2d\xe1\xa2\x84\xb3\x12\x2a\x24\xcc\x96\xd0\x1a\
+\x5d\x84\x26\xd7\x46\x4a\x20\x1c\xa8\x94\xd0\x04\xdd\x85\x06\x99\
+\x4b\xc2\x41\x4e\x52\x85\x62\x30\xba\x0e\x2d\x9c\xc5\x4a\xf8\x44\
+\x01\xa9\x82\x18\x87\x2e\x44\xab\xcd\xe6\xab\x20\x55\x10\xf9\xe8\
+\x46\xb4\x50\xcb\x13\x40\x2a\x8a\x9d\xe8\x4a\xb4\x50\xdb\x25\x88\
+\x58\x14\x6d\xd0\x9d\x68\xd4\xda\x41\x64\x19\x78\x77\x32\xd9\x3a\
+\xaf\x21\x59\xf4\x5c\x0e\x69\xd4\x20\x06\x22\xd6\x69\x74\x29\x9a\
+\x03\x5a\xb0\x4f\x7d\xdc\x43\xc8\x11\x1f\x21\x07\xcb\x7e\xc6\x49\
+\x3f\xc9\xce\x88\x82\xc8\xd5\x0f\xdd\x1a\xd9\x36\x84\x45\x10\x4f\
+\x7a\x14\x21\x27\xfc\xbf\x92\xaa\x1a\x5b\xe6\x36\x84\x88\xf5\x1d\
+\xba\x36\xb2\xed\x27\x16\x41\xb6\xcd\x6f\x78\x05\xa9\x02\x38\xee\
+\x27\xcd\x9a\xd4\x81\xc8\xf5\x14\xba\x37\x32\x6d\x2a\x8b\x18\x2d\
+\xaf\x8b\x27\xe4\x98\xbf\x76\x62\x49\xa8\x5c\x57\xc4\xb3\x90\x8f\
+\x43\x37\x47\x96\x65\x42\xa4\x38\xb5\xb9\x38\x2c\xa9\x02\xa8\xf4\
+\x91\x9e\xb7\x27\x42\xc4\x7a\x15\x5d\x1d\x59\xb6\x99\x45\x88\xfb\
+\xbb\xa6\x5c\xbe\x60\x0f\x83\xb3\x7b\x1a\xf3\xbc\xb5\x1a\xa2\xbb\
+\x23\xc3\x6e\x82\xc8\xf0\xc3\x7e\x2f\x48\xaa\x00\x0e\x97\x91\xc7\
+\xee\x4f\x87\x88\xb5\x03\x5d\x1e\x19\x76\x82\x45\x84\xe7\x1f\xcd\
+\x22\xe4\x50\x19\x1f\xb1\x28\x2a\x7c\x24\xca\xed\x84\xc8\x85\x25\
+\x36\x36\xb7\xfe\x2c\x02\x24\xd7\x73\x07\x76\x7c\xdc\xa4\xaa\xc6\
+\xec\x27\xb3\x21\x62\x9d\x44\xd7\xdb\xdb\x2e\xb0\x08\xb0\x66\x7a\
+\x03\xd9\xa4\x0a\xe0\x84\x9f\x64\xa5\x81\xa2\xe9\x7d\xe8\x7e\x7b\
+\xda\x73\xac\xc0\x5f\xeb\x8d\xab\x55\x0c\xe5\xc5\x66\x58\x34\x3d\
+\x8f\x21\xb0\x9f\x25\x42\x0b\xf6\x8a\x35\x8d\x14\x93\x2a\x28\x9a\
+\xde\xe0\x07\x45\xd3\x09\x18\x0a\x7b\xd9\x0a\x56\xc0\x7b\xdd\x91\
+\x14\xd0\xa5\x54\x11\x4b\xc2\x91\xb5\x5c\xa2\x69\x2c\x86\xc3\x1e\
+\x76\x15\x14\xec\x6f\xf7\x36\x56\x4d\xaa\xa0\x68\xda\xa3\x23\x28\
+\x9a\xfe\x05\x43\x62\x0f\x63\xd6\xb0\x3f\x35\x24\x43\x9e\xbc\x00\
+\x89\xa6\xef\x72\x89\xa6\x0d\x30\x2c\xd6\xb6\xee\xac\x00\xd7\x89\
+\x75\x12\x52\xe5\x13\x46\xaa\x5f\x44\xd3\x81\xa0\x68\xfa\x36\x86\
+\xc6\xda\xf6\x35\x2b\xc0\xaf\xff\x39\x57\x2c\xa9\x82\x38\xe2\x23\
+\x2e\x97\x03\x45\x53\x9b\xda\x78\x56\x60\x4b\xf2\x63\x02\x45\x7b\
+\x9a\x10\x4b\xc2\xac\x27\x40\xd1\xf4\x04\x86\xc8\x7a\x16\x03\xad\
+\x73\xf6\x2d\x2d\xd4\x8c\x54\xc1\x4a\xd3\xcc\x54\x37\x8a\xa6\x36\
+\xb3\x45\xac\x80\xde\xd5\xb6\x1e\x21\x47\x7d\xda\x12\x4b\xc2\xa6\
+\x39\x79\x28\x9a\xda\xc8\x1a\x41\x6f\xab\xcf\x77\x95\x6a\x4e\x2a\
+\x14\x4d\xed\x67\xef\xb1\x02\x39\x6a\x40\x5a\x60\xe7\xa6\x0b\xb1\
+\x24\x1c\x5e\xdd\x88\x47\x7e\x88\xc1\xb0\x99\xdb\xee\x60\x05\x90\
+\xee\xd4\x44\x28\xec\x72\x45\xd3\xee\xb0\x68\xba\x00\x43\x67\x6e\
+\xfb\x8c\x15\xc0\x79\x4f\xd7\xd7\x97\x54\xd5\xf8\x8a\x4f\x34\xcd\
+\xc5\xf0\x99\xd3\x46\xb0\x02\x97\xeb\x89\xd6\x54\x5e\x80\x44\xd3\
+\xd1\x03\xd3\x20\x62\x6d\xc7\x10\x9a\xcf\x9c\xd0\x1b\x61\xc7\xab\
+\xf9\xc6\x90\x2a\x44\x34\x75\xc2\x6f\xad\x56\x18\x4a\x73\xd9\x6c\
+\x56\xc0\x6e\x6d\x9e\x20\x3e\x75\xa3\x00\x33\xc7\x83\xa2\xe9\x71\
+\x0c\xa5\x79\x2c\x1b\x7a\x5b\x9d\xd9\x56\x62\x38\xa9\x82\xa2\x69\
+\x46\x0a\x58\x69\xda\x17\x43\x6a\x0e\xdb\xce\x0a\xd4\x90\x5e\xa9\
+\x84\x54\x94\x99\x83\x58\x12\x36\xcc\x42\xd1\xd4\x0a\xd6\x16\x7a\
+\x5b\x91\x43\x3e\xd3\x90\x2a\x80\x63\x7e\xd2\x14\x16\x4d\x9f\xc4\
+\xd0\x1a\x6b\xa7\x59\x01\x9a\x32\xc6\x23\x64\x47\x47\x71\x7e\x9f\
+\x37\x20\x1b\x7c\xf7\x81\x37\x70\xe4\x4b\x8d\xc8\x7a\x68\x15\x97\
+\x68\x1a\x85\xe1\x35\xc6\x06\xb3\x02\x93\x96\xec\x56\x2e\x2f\x1c\
+\x2a\x23\x97\xca\xa9\x6a\x5e\x44\xfa\x76\x4e\xbe\xe2\xd9\x51\x51\
+\x4e\x32\xb2\x7f\x1a\x39\xb3\xb5\x44\x59\x91\x20\x15\x4d\x3b\x80\
+\xa2\xe9\x7c\x0c\xb1\x31\xc6\x0c\xcc\xc6\xd9\x79\x8a\x48\x75\xe9\
+\x80\x97\x2c\x7d\x21\x97\xbb\x83\x1f\x25\x30\xad\x75\x97\xfb\x06\
+\xe3\x14\x4d\x73\x30\xcc\xfa\xda\x8b\xac\x80\xdc\x74\x4d\x1d\x66\
+\xa7\x98\x70\x6f\xa9\x8f\xb7\x16\x93\xb8\x58\xa7\xa2\x16\x91\xbd\
+\x3a\x25\x91\x1f\x3f\x92\xf7\x13\x4b\xf3\x96\xc0\x73\xb7\x61\xa8\
+\xf5\xb3\x64\x28\xc8\x55\x1b\x8a\x64\x93\x8a\xa3\x99\x1a\x88\x92\
+\xfc\x58\x79\x6f\x2e\xe9\x27\x91\xe3\xb9\x2d\x31\xe4\xfa\xd8\x3a\
+\x56\x20\xfa\x77\x49\xfe\x79\x71\x2d\x7e\x31\xcd\x85\x4e\xad\xea\
+\xca\x4a\x74\xcf\x80\x45\xd3\x2a\x0c\xb9\xf6\xd6\x0c\x0a\xec\xc5\
+\x03\x5e\xd9\xdb\x7f\xfa\xa6\x71\x88\xeb\x9a\x4c\x3e\x78\x43\x46\
+\x75\xea\x29\x3f\x49\x4f\x06\x45\xd3\x7b\x31\xf4\xda\xda\x11\x56\
+\x00\x26\x0e\xcf\x94\xbd\x4b\xa3\x45\x7f\x22\x49\x45\x31\xf6\x81\
+\x74\x59\x63\x58\x3f\x33\x0f\x7b\x9a\x1a\x68\xf7\xb2\x9c\x9f\x10\
+\xef\x52\xd4\x7b\xe1\xd3\xb7\x4b\x84\x13\x8b\x4a\x11\xb2\x08\x4e\
+\x45\x53\x5f\x1c\xf4\xdc\xf1\x48\x01\x6d\xec\x7b\x96\xe3\x97\xbf\
+\xac\xb0\x53\xcc\x61\x9f\x70\x62\x4d\x1a\x91\x29\x7b\x1c\x07\x57\
+\x72\xad\xf3\xdc\x48\x03\xb1\xf6\x2c\xcb\xe1\x57\x97\xc6\x29\xea\
+\x6b\x15\x5c\xe3\x88\x26\xd6\xfc\x67\xeb\x2b\x2a\xab\xe9\x86\xa2\
+\xa9\xae\x56\x07\x0a\x64\xf9\x0a\x15\x9d\x62\xa4\x9f\xcf\xd4\x64\
+\xb7\x50\x62\xad\x99\x9e\xa7\xe5\xf1\x7c\x14\x4d\x05\xd9\x52\x96\
+\xa3\x69\x3d\x39\x4f\x23\x5a\xd6\xfa\xc6\x57\x24\x76\x57\xf8\xee\
+\xe2\x02\xc5\x79\x49\xba\x3e\x03\x9e\xbf\x15\x29\xa1\xde\x7c\x50\
+\x10\xcf\xed\xf5\xaa\x4b\x32\x1f\xf5\x91\x76\xcd\x13\x84\x12\xeb\
+\xf8\xc6\x22\x55\x87\x2f\x50\x34\xd5\xde\x3e\x64\x39\x78\xfc\x60\
+\x01\x9d\x62\x2a\x7c\xe4\x9e\x3b\x93\x84\x12\x8b\xb6\xe9\x56\x33\
+\xa6\xe9\xe3\x50\x34\xd5\xd2\xba\xb2\x9c\x4b\x2b\x0c\x14\x2f\xd8\
+\x6b\xa4\x73\x1e\xe9\x97\x26\x94\x58\xaa\x4f\x59\x9f\xf4\x93\x34\
+\x58\x34\xed\x83\x14\x51\x66\xcc\x4e\x31\x0b\x27\xe6\x08\x2b\xbe\
+\xa3\x2d\xb8\x85\x12\xeb\x94\x7a\xc2\xaf\x9d\x01\x8a\xa6\x17\x90\
+\x22\xf2\x6d\x0c\xcb\xa9\xc5\x79\x31\xaa\x1a\xd1\xd6\x04\xbd\x87\
+\x50\x14\xa9\x52\x12\xdd\x62\xc6\x16\x10\x4d\xc1\x4a\x53\xbc\x87\
+\x5a\x86\xb9\x34\xdb\x75\x85\xc1\x5b\xaf\x34\x14\x46\xac\xe2\x86\
+\x31\xf2\x4b\x76\xc2\xe0\xa3\x15\x5c\xa2\xa9\x0b\x29\xc3\x67\x0b\
+\x58\x8e\xbc\xb3\x4d\x3d\xe1\xc7\xe4\x39\x55\x6f\x2e\xb4\xa0\xb5\
+\x60\xa2\x3a\xd9\x50\xd1\xb4\x3d\x28\x9a\xce\x43\xca\xc0\x56\xe0\
+\x30\xa0\x53\xcc\xff\x76\x8a\x4b\x44\xdf\x75\x4b\x3d\x75\xba\x1a\
+\x8a\xa6\x9a\x18\xf3\xd2\xef\x11\xf7\x69\xd4\x29\xe6\x88\xb8\x7c\
+\x61\xe0\xe6\xb0\x0a\xb1\xc7\xf3\x1f\x85\x45\xd3\x2d\x48\x9d\xf0\
+\x76\xbb\xe6\xdb\x78\x1d\xf2\x85\xf4\x36\x30\x91\x5d\x98\x83\x22\
+\x2e\x8a\xa6\xca\x8d\xd9\x29\x86\x5e\x84\xa4\xd9\x59\xbf\x13\xb4\
+\xad\x63\x94\x10\x62\xbd\x30\x32\x4b\x93\x31\x4e\x7b\x1c\x45\x53\
+\x25\x36\x8c\xe5\xb4\x9c\xcc\x68\xa1\xf2\xc2\x95\x5b\x7b\x1f\xb9\
+\xaa\x24\x4e\x08\xb1\x5e\x15\xa8\xaf\x5d\x29\x9a\xba\x51\x34\x95\
+\x69\x4c\x87\x6d\x9b\x9f\xaf\x79\x73\xb4\xf6\x37\xd7\x15\x42\xac\
+\xf5\xb3\xf2\x34\x1b\x27\xbd\x9d\x0c\x45\x53\x7e\x9b\xce\x72\xd6\
+\x2d\x37\x26\x68\xdf\x88\xb6\xc2\x47\xfa\x76\x16\x93\x2f\xdc\xbb\
+\xa4\x40\xbb\x71\x56\xf9\x78\x2a\x4d\x1f\x47\x4a\x39\x1c\x1e\x28\
+\x50\x1f\x6f\xd5\xa1\x53\x8c\xb4\xd8\x1e\x3d\x40\x4c\xbe\x10\xbc\
+\xa4\x1c\x45\x53\x5d\x6c\x0b\xcb\x41\x83\xbb\xa7\xe8\xd6\x88\xf6\
+\xc5\xd1\x1e\x21\xc4\x3a\x27\xea\xc2\x27\x86\x34\xd2\xf5\x36\x50\
+\x34\x9d\x1b\xc9\xa4\x6a\x0d\xca\x0b\x3a\x76\x37\xfe\xdb\xf3\xb9\
+\x62\x12\xd0\xc7\xb5\x6f\x47\xf9\xf5\x1e\x14\x4d\x59\x76\x8a\xe5\
+\x98\xc9\xa3\xb2\x74\x6d\x2f\xb4\x7d\x41\xbe\x69\x2a\x1b\x78\x44\
+\x53\x8e\x52\x9f\x88\x14\x4d\xef\x67\x39\x25\x35\xc9\xad\xad\xbc\
+\x50\x0b\x2a\xd6\x14\xa9\x26\x55\x7a\x4a\x94\x7e\xe3\xe6\xab\x34\
+\xbd\x19\xe5\x85\x10\xd0\x5a\x24\xbd\x1b\xa2\x7d\xb9\xbb\xb1\x6a\
+\x62\x79\x0b\x63\x85\x55\x36\xf0\x60\xea\x58\x0f\x8a\xa6\x21\x36\
+\x89\xe5\x8c\x1b\xaf\x8a\x37\xa6\x11\x6d\x95\xfa\x7c\x61\xeb\xeb\
+\xe3\x75\xb9\xa3\x27\x34\x63\x90\x0e\x8b\xa6\xf7\x44\x02\xa9\x92\
+\xa0\xe0\x1c\x5d\x5f\xa4\x3f\xa9\xaa\xf3\x85\x4e\xa7\x3a\x62\xdd\
+\x7d\x6b\xa2\xd0\xca\x06\x1e\xac\x9e\x86\x95\xa6\xd4\x56\xb2\x9c\
+\x70\x6f\xe7\x24\xd9\x9d\x62\x44\x5e\xa8\x94\x9d\xa1\x2e\x5f\x38\
+\xa8\x5b\x8a\xae\x3b\xd9\xe0\x9b\xf6\xfa\xb2\xc8\x16\x4d\x9b\x42\
+\x81\xb9\x74\xc0\x6b\x0c\xa9\xaa\x03\x74\xad\x57\x5d\xbe\x70\xdc\
+\xa0\x74\x43\xc6\x5e\xce\x27\x9a\x3a\xed\x4a\xac\x0a\xd6\xc4\x9f\
+\x7d\x28\x53\x7c\xb9\x89\xcc\x5d\xd6\xed\xad\xd4\xe5\x0b\x5f\x7a\
+\xcc\x63\xcc\xd8\xf9\x44\xd3\x39\x76\x24\x55\x6f\xd6\xa4\xe3\xe3\
+\x9c\xba\x08\x8b\x50\xbe\x70\x40\x97\x64\x55\xc4\x7a\x6d\x52\x8e\
+\x61\xe3\x3f\xbb\x27\x32\x2f\x82\xfa\x81\x35\xe1\x25\x2f\xe4\x1a\
+\x4b\xaa\x6a\xd0\xbe\x56\x6a\x88\xb5\x79\x4e\x9e\x71\xe3\x97\xd6\
+\x76\xb4\xc2\x16\x18\xe3\x66\x3b\x91\x6a\x02\x6b\xb2\xb4\x0e\xca\
+\x0c\xf7\xdc\x50\xd0\xbe\xf0\x6a\x88\xf5\xe1\x9b\x85\xc6\xce\x21\
+\x82\x44\xd3\x38\x68\xa2\xfb\x97\x15\x9a\x82\x54\x14\x4b\x27\xab\
+\xcb\x17\xd2\xae\xcb\x16\xf8\xe7\xb0\x85\x68\xba\x98\x35\x49\xba\
+\xe0\xd4\x5b\xf7\x61\x61\xc7\x5f\xd5\xe5\x0b\x2f\x7c\xe8\x35\x7e\
+\x1e\xc7\xfc\x24\x3d\x05\x14\x4d\x7b\x5b\x99\x54\x65\x60\x89\xc9\
+\xfb\x8d\x4d\x43\x2a\x8a\xaa\xf5\xea\xf2\x85\xe4\x64\x13\x53\xcc\
+\x63\xf5\x34\x7b\x57\x9a\xee\x63\x4d\x6e\x8c\x16\xa7\x59\x54\xe2\
+\x9b\xf7\x94\xe7\x0b\xdd\x2e\xa7\x3e\x95\x0d\xdc\xa2\x29\x78\x3c\
+\x7f\xac\x15\x49\x75\x17\x33\x08\x6e\xa7\x69\x16\xec\x35\x73\x6f\
+\x4a\x89\x95\x95\x1e\xa5\x7b\x45\x06\x5b\x34\x2d\xb4\xa5\x68\xca\
+\xec\x14\xb3\x40\x49\x8f\x4e\x9d\x2e\xaa\xa4\xed\x91\x94\x10\xcb\
+\x5f\xac\x6f\x65\x03\x8f\x68\xda\xa5\x5d\x3d\x68\xdc\xb3\xad\x44\
+\xaa\x51\xac\xc9\x14\xd1\x4e\x31\x66\x7c\x5b\x55\xe7\x0b\x73\x3d\
+\xca\xf2\x85\x6d\x9b\x25\xe8\x5b\xd9\x20\xae\xd2\xd4\x12\xa2\x29\
+\x78\xe9\xf7\x3b\xaf\xe5\x9b\x93\x54\xd5\x6b\x93\x1b\xe0\x4b\x2a\
+\x6b\xef\x85\xda\xc1\x5c\x3b\xdc\xa0\x68\x3a\xbc\xaf\x3d\x44\xd3\
+\xb9\xac\x49\x74\x6c\x59\x57\x78\xa7\x18\xd1\x3f\x1f\xb4\xa9\x87\
+\x12\x62\x0d\xeb\x93\xaa\x7f\x65\x83\xb8\xbe\x14\x2d\xcc\x4c\x2a\
+\xb8\x53\xcc\xce\x52\xf3\x92\x4a\x65\xdb\x48\x21\xb7\xb9\x6a\x84\
+\x97\x2d\x2e\x9a\xee\x60\x0d\x7e\xa8\x59\xff\xa3\x6b\x80\x36\x75\
+\x53\x42\xac\x4f\xff\x61\xe2\x7f\x9a\x2a\x2e\xd1\xb4\x97\x19\x49\
+\x75\x1b\x28\x1e\x56\xf8\x4c\x4f\xaa\x60\x67\x17\x8e\xd3\xc6\x97\
+\x81\xee\xbe\x4c\xb7\xbe\xaa\x81\x55\x53\x41\xd1\xd4\x94\x17\x41\
+\x31\x3b\xc5\x4c\x1f\xe7\xb1\x06\xa9\x82\xbb\x29\x19\x42\x69\x6c\
+\x8c\xd3\x1a\xf3\x92\x36\x26\xd7\xc1\x85\x8c\x63\xcc\x44\xaa\x21\
+\xac\xc1\xe6\x64\x45\x9b\x57\x5e\x60\xe0\xbf\x3b\x4a\xc1\x1a\xf8\
+\x94\x24\x37\xf9\x6e\x9f\xd7\x32\x73\x2a\xb7\xd8\xf1\x7c\xe6\x40\
+\x69\xe3\x58\xab\x91\x2a\x88\x8b\xfb\xbd\x64\xde\x33\xf5\x89\xcb\
+\x75\xb9\x68\x9a\x50\xc7\x15\xb8\x6d\xec\xc7\x72\x8b\xcd\xa9\xd2\
+\x3a\xa2\xe9\xcb\xac\x41\xb6\x6e\x1a\x6f\x3a\xd1\x50\xc9\x4e\x91\
+\x82\xe6\x11\xbf\x78\xa7\x94\x7c\x4b\x7b\x33\x1c\x2e\x33\x5d\x9e\
+\x53\x70\x4f\x53\x43\x45\x53\x73\x74\x8a\x41\xc8\x16\x4d\x1f\xee\
+\x9b\x0a\x11\x6b\x93\x91\xc4\xda\xe8\x00\x9b\xbc\xfa\x30\x90\x66\
+\x44\x05\x97\x68\xda\xdc\x08\x52\xb5\x80\x06\xf6\xd3\x47\x18\x40\
+\x33\xff\xbc\xd3\x13\x45\x66\x14\x4d\x4f\xb3\x06\x35\xe9\x91\x2c\
+\xcb\xae\x41\x98\x6b\x2d\xfa\x06\xb6\xcb\xbc\xa4\x9d\x7a\x06\x2c\
+\x9a\xf6\xd4\x93\x54\xfd\x58\x83\xa1\x0d\x58\x2d\xbf\x60\x0f\xa9\
+\x76\xa0\x55\xa5\x3d\x3a\x26\x92\xb2\x46\xb1\xa4\x30\x37\x86\x94\
+\x15\xc6\x92\xdf\xb7\x4f\x24\x95\x6b\x8b\x8c\x3f\xb2\xa6\x12\x2b\
+\x61\xd1\xf4\xbc\x9e\xc4\xba\xc4\x1a\xcc\xaa\x69\x0d\x6c\xf1\xdf\
+\x4c\x6f\x17\x4b\xaa\xeb\x62\x3a\x3e\x31\xc1\x15\x90\x23\xac\xa8\
+\xd3\x05\xe7\x79\x4d\x63\x50\x34\x7d\x4c\x0f\x52\x4d\x64\x0d\x82\
+\xa6\x42\x2c\xeb\xe4\x90\xd6\xdc\xd7\xc9\x3c\x6a\xdf\xa4\xc4\xba\
+\xf3\xe6\x14\x4d\xdd\x5a\x92\x2a\x19\x1a\x40\xe5\xba\x22\x8b\x93\
+\xca\x4f\x3c\xe9\xca\x0a\xfd\x2c\xbb\x04\xa8\xf4\x91\xce\x6d\x41\
+\xd1\x74\x96\x96\xc4\x5a\xc6\xfa\xf2\x5e\x9d\x92\x4c\x9f\x88\x85\
+\x7e\x16\xda\xb7\x50\xd7\xbb\xa1\x15\xed\x8f\x75\xcc\x7a\xeb\xae\
+\xaf\x76\x97\x1a\xd6\xd3\xf4\x1a\xf0\x4c\xdd\x07\x5e\x4b\xbf\xad\
+\xde\x9a\x27\xe6\xce\xc2\x75\x33\xf2\x2c\x29\x9a\x0e\xeb\x93\x66\
+\x88\x68\x7a\x98\xf5\xa5\x13\x1e\xcc\xb0\xf6\x36\x5c\x7a\xcb\x94\
+\x16\xc4\x0a\x21\x56\x7e\x4e\xb4\x35\x77\x8b\x12\xb9\x38\xe6\x77\
+\xa3\x48\x52\x75\x63\x7d\x19\x4d\xc8\x9a\xba\xdc\x98\x03\x9f\xed\
+\x10\x77\x5f\x21\xc5\x99\x6d\x25\x96\xd4\xe9\x38\x7a\xdd\x0b\x15\
+\x4d\xcf\xb1\xbe\x6c\xb1\x81\xad\x7b\x44\x61\xfe\x33\xf5\x85\x12\
+\x6b\xe6\x13\xd9\xd6\xf4\x85\xb4\xf9\xe0\xa8\x34\xed\x2e\x82\x54\
+\xe3\x58\x5f\x42\x45\x43\xcb\xcb\x0b\x12\xe8\x4f\xb9\x48\x62\x8d\
+\x79\x20\xdd\xb2\x4b\x83\x95\x53\x40\xd1\xf4\x9c\x5a\x52\x81\x9d\
+\x62\x0c\x6f\xdb\x23\x68\x6d\xf1\x50\xef\x54\xa1\xc4\xfa\x83\x11\
+\xbd\x48\x05\xae\x37\xaf\x2e\x05\x75\xbc\xd1\x6a\x88\xb5\x90\xf5\
+\x70\xaa\x7d\x58\x7d\x6d\x15\xc4\xc4\x87\x33\x85\x12\x6b\xc2\x90\
+\x0c\x4b\xfb\xa3\x7c\xb9\x76\xa2\x69\x29\xf4\x60\x5a\x30\x66\x97\
+\x04\xf3\x9b\x2f\xe6\x0a\x25\xd6\x6b\x7f\xb2\xf8\xba\x93\x8a\xa6\
+\xbf\x01\x45\xd3\x99\x4a\x88\xb5\x97\xf5\xd0\x91\xfd\xd3\xad\xfb\
+\xaa\x0f\xb3\x23\x12\x49\xac\x8b\x07\xac\xef\x13\x5a\x2d\x2b\x5a\
+\x34\xed\xc4\x7a\x58\x74\x94\xd3\x7e\x05\x7c\x02\x3a\x26\x3b\xf4\
+\xbc\xb8\x53\xa7\x62\xc0\xa1\xf7\x80\x6b\xcf\x8d\x72\x88\xf5\x05\
+\xeb\x61\xaf\x3c\x5d\xdf\x5e\xa4\xaa\xc6\x27\xdb\x4b\x84\x10\xeb\
+\xc4\xa6\x62\x5b\xf9\x85\x63\xce\xcd\x78\x48\x35\x1c\x54\x95\xab\
+\x6c\x5a\x6e\x2c\xfd\xb4\xff\x71\xa8\xba\x45\x7c\xe0\x02\x01\x3b\
+\xbd\xcd\xa5\x25\xc2\xe4\xd1\x59\xd0\xbc\x8f\x42\xa4\x72\x43\x8e\
+\xdb\xb9\xb0\xc0\x9e\xa4\x0a\x11\x08\x7b\xdf\xa1\xec\x6e\xe8\x40\
+\x3f\xd5\xa3\x3e\x5b\xfa\x24\x0d\xbe\x08\xaa\x1b\x8b\x58\xb3\x58\
+\x7f\xdc\xae\x79\x82\x7d\xdf\x56\x35\xd6\x5b\x93\x47\xc9\x6b\xcb\
+\xfd\xdc\xf0\x2c\xdb\x48\x2f\xb5\x61\x05\x2c\x9a\x7e\x13\x8e\x54\
+\x79\x70\xd3\x8b\x08\x3a\xca\x25\xfd\x9c\xfd\xfb\xef\x25\xa4\x5b\
+\x87\x44\xb0\x67\xc3\xbf\xa4\xb5\x99\xed\x4f\x23\x1d\xf3\x93\x26\
+\xc5\xca\x8e\xe7\x33\x8f\x72\x3d\xd8\x33\x42\x8f\x72\x1d\xf1\x91\
+\x8b\x07\xbc\x64\xd7\xc2\x7c\xb2\xfc\xa5\x06\x64\xea\xd8\x6c\xb2\
+\xec\xa5\x5c\x69\x49\x90\x4f\x7e\xd8\xef\xb5\x76\xfd\x99\x4c\x1c\
+\x58\xce\xd5\xd3\x34\x3e\x94\x54\x5e\x3c\xca\x25\xe3\xa4\x4e\xa4\
+\xce\x5d\x5a\x6b\xfd\xb6\x0d\x28\x9a\x4e\x09\x25\xd6\x76\xd6\x87\
+\x69\xd3\xae\x88\x76\x28\xe2\x17\x7c\xbe\x8b\x4b\x34\x8d\x02\xd7\
+\x56\x99\xa9\x51\x81\xa6\x5d\xe8\x54\x44\x50\x92\xe1\xb8\x08\xaa\
+\x2f\x25\xd6\x33\xac\x0f\xbd\xfe\x7c\x2e\x3a\x13\x51\x83\x5c\xe0\
+\xf1\xfc\x55\x94\x58\xef\x86\xfb\x40\x03\x4f\xb4\xe5\x0f\x64\x22\
+\x0c\xe9\xc4\x7c\x90\x12\xeb\x3f\xe1\x3e\x30\x63\x7c\x36\x3a\x11\
+\x51\x2b\x36\xcc\x62\x5e\x70\x7e\x96\xd9\x34\x6d\xdf\xd2\x42\x74\
+\x22\xa2\x56\xec\x7b\x83\x29\x3d\xfc\x44\x89\x75\x31\x6c\xa3\xff\
+\x45\x05\xe8\x44\x44\xad\x58\x33\x9d\xf9\xc6\xfa\x92\x12\xeb\x4c\
+\xb8\x0f\x4c\x1d\xeb\x41\x27\x22\x6a\x4d\x79\xf5\xe8\xc8\xcc\xa7\
+\xd2\x4b\xe5\x1d\xbb\xc3\x7d\x20\xbe\x8e\x8b\x9c\xa7\xf7\x09\xa2\
+\x86\x85\x08\xc9\x44\x6c\x9a\x03\x1e\xec\xa5\x25\xed\x8e\xf1\x50\
+\x51\xdf\xa8\x01\x69\x64\xcb\xdc\x3c\xf2\xbe\xb4\xe6\x7a\x7f\x49\
+\x01\x22\x12\x21\xc5\x7e\xfd\xcc\x3c\xd2\xe7\x4e\xae\xca\x8f\xdf\
+\x71\x25\x9f\x11\x08\x19\xb8\xac\x9f\xd6\x4a\x74\x08\x42\x10\x06\
+\x85\x12\x2b\x09\x1d\x82\x10\x80\xbd\xb5\x95\xcd\x5c\x8b\x8e\x41\
+\xa8\xc0\x97\xc1\xe4\x73\x6d\x46\x3b\x89\x7c\x8f\x4e\x42\xc8\x44\
+\xb9\x84\x68\xa8\xee\x3d\x56\xc2\x22\x74\x16\x82\x13\x23\x94\xb4\
+\x85\x7c\x44\xc2\x06\x09\xff\x74\xfc\x7c\xe5\x18\x3a\x32\xb2\x41\
+\x39\x70\x4c\xc2\xea\xea\xd2\x98\xb0\x97\x39\xfd\x1f\x6a\xbe\x17\
+\x24\x95\xa2\x89\xdd\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x0c\xad\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x78\x00\x00\x00\x78\x08\x06\x00\x00\x00\x39\x64\x36\xd2\
+\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\
+\xa7\x93\x00\x00\x0c\x62\x49\x44\x41\x54\x78\xda\xed\x9d\x59\x6f\
+\x1b\xd7\x15\xc7\xff\x77\x66\x48\x91\xa2\x28\x6a\xa5\xac\xc5\xd6\
+\x62\xcb\x4e\x64\x37\xa9\xe2\x24\x2e\x8a\xa6\x41\x13\xa3\x68\x03\
+\xa4\x05\xec\x30\x29\x50\x04\x28\xd0\xd7\x02\x7d\x0a\xfa\x01\x0a\
+\xe4\x21\x9f\xc2\x4f\x49\x13\x39\x29\x92\xa2\x2d\xfa\x50\xb4\x48\
+\x90\xa6\xb1\x03\xd8\x6a\x6c\xc7\x71\xbc\xc8\xb6\xe4\x44\x32\x25\
+\x6b\xe5\x32\xcb\x3d\x7d\x98\x3b\x8b\x56\x4b\xb2\x38\xa4\xe5\xf3\
+\x07\x08\x92\xa3\xe1\xa5\xe6\xfe\x78\xce\x3d\xe7\xdc\x99\x3b\x00\
+\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\
+\x62\xb1\x58\x95\x95\xd8\xca\xce\xaf\xbf\xfe\x7a\xaa\x64\x15\x7e\
+\x2d\x88\x9e\x24\x08\xa3\xa6\x0e\x44\x88\x6f\x05\x39\xa7\xdf\x7d\
+\xf7\xcf\x17\x18\xeb\x36\x00\xe7\x72\xb9\x3d\x10\xf2\x2c\x04\x7a\
+\x6a\xfc\x98\xde\x4d\x25\xd3\xbf\x39\x75\xea\x54\x89\xf1\x02\x9b\
+\xb7\x42\x4d\xfe\x0e\x70\xe1\x26\x12\x75\xd0\x35\x51\x33\x07\x41\
+\x04\x94\xca\x26\xa4\x94\x00\xf0\xda\x52\x71\x21\x06\xe0\x15\x00\
+\xc4\x80\x37\xaf\x63\x00\xd0\x94\x49\xe3\xb9\x1f\x0f\xd7\xdc\x81\
+\xd8\xb6\x83\x33\x67\x2f\x62\x3a\x3f\x0b\x00\x27\x5e\x79\xf5\xc4\
+\x1b\xa7\xdf\xfb\xe0\xad\x47\x1d\xb0\xb6\x79\x67\x4e\x09\x00\xd0\
+\x0c\x51\x9b\xbf\x54\x43\xc7\xd3\x47\x87\x50\x9f\x4a\x7a\x63\xf2\
+\x9b\xaf\xbe\x7a\xf2\x25\xb6\xe0\x6d\x28\x1e\xaf\x43\x6b\x4b\x16\
+\x75\xf1\x3a\x08\x4d\xab\xfa\x41\x38\x8e\x83\xf9\xf9\x7b\x98\x9d\
+\x9b\xc1\x33\x4f\x0f\xe1\xd3\x4f\xcf\xc3\xb6\x1d\x9d\x04\xde\xce\
+\xe5\x72\xc7\x46\x46\x46\xbe\x66\xc0\x9b\x54\x22\x51\x87\xfd\xfd\
+\x8f\xa1\xb9\xb9\x15\xe9\x74\x13\x66\x66\xa6\x50\x2a\x15\xab\x7e\
+\x20\x99\xc6\x26\x64\x32\xcd\xb8\x3d\x7e\x03\xc3\xc3\x87\xf0\xc5\
+\x17\x5f\x81\x88\x32\xd0\xe4\x47\xb9\x5c\xee\xd9\x91\x91\x91\x39\
+\x76\xd1\x9b\x50\x47\x36\x8b\x44\x22\x89\x81\x81\xc7\x91\xcd\x76\
+\xa1\xb7\x77\xb0\x66\x0e\xa6\x31\xdd\x84\xfe\xde\x41\x74\x75\x75\
+\x60\x70\x70\x9f\xb7\xf9\x20\x34\xf9\x4e\x2e\x97\xd3\xd9\x82\x37\
+\xe3\x9e\x63\x71\x10\x11\x88\x24\x84\xd0\xe1\x38\x36\xae\xdf\xb8\
+\x82\x52\xa9\x08\x29\x9d\xa8\x73\x5f\xc4\x62\x71\xb4\xb6\x76\xa0\
+\xb5\xa5\x0d\x00\x50\x5f\xdf\x80\xbe\x7d\xfb\xe1\xd8\x36\xe6\xe7\
+\x16\xf1\xdd\xe4\x34\x00\xfc\x5c\x68\xf4\x26\x80\x3f\x30\xe0\xfb\
+\xa6\x24\x04\xc7\xb1\x71\xf5\xea\x25\xd4\xd7\x37\xe0\xbf\x67\x3e\
+\xc6\xfc\xfc\x4c\xd5\x0e\xa0\x6c\x96\xb1\xb8\xb4\x80\x99\x99\x29\
+\xf4\xf7\x1d\x84\x61\x18\x48\xa5\xd2\xe8\xeb\x3b\x00\xd3\xb2\xb0\
+\xf4\x59\x11\x0b\x0b\x05\x10\xe8\x8d\xdc\xaf\x4e\x8c\x8e\xfc\xe9\
+\x83\xb7\x19\xf0\x46\x80\x55\x6a\x59\x28\x2c\xe2\xce\x9d\xdb\x98\
+\x9d\xcd\xd7\xc4\x81\xcc\xcd\xcf\xe2\xf2\x95\x2f\x71\xf0\xc0\x61\
+\xc4\xe3\x71\x34\xa6\x9b\x70\x60\xe0\x10\xca\xa5\x12\xfe\xf3\xd9\
+\x05\x58\x96\x2d\x40\xe2\x54\xee\xb5\x93\xdd\x82\x70\xee\x61\x86\
+\xe6\xe8\x18\x7f\xff\x9d\xf7\x2f\x57\x2c\x8a\xf6\x73\x4f\xc7\xf2\
+\x8a\x0b\x35\xa1\x42\x61\x09\x97\x2e\x8f\xe2\xe0\xe0\x10\xea\x93\
+\x29\x34\x35\xb5\xe0\x89\xef\x1d\x45\xa9\x6c\xe3\xf3\xcf\x2f\x00\
+\x40\x0c\xc0\x5b\x24\x1e\x6e\xab\xd4\x24\x90\x7b\xed\xe4\x59\x48\
+\xed\xb7\x23\x23\x23\x5f\x56\x0c\xb0\xe3\xd8\x90\x8e\xac\xa9\x83\
+\x2f\x15\x8b\xb8\x74\x69\x14\x07\x07\x0f\xa3\xb1\x31\x83\x74\xba\
+\x11\xcf\x3f\xf7\x13\x74\x75\x76\xe1\xe3\x4f\xce\x60\x7a\x7a\x76\
+\xb7\x78\xdf\x67\xa0\xc9\xb7\x01\x3c\x81\x0d\x2a\x76\x5b\x07\x4c\
+\xcb\xc7\xe3\x5a\xb2\x60\x4f\xa6\x69\xe2\xe2\xa5\x51\x0c\x1e\x78\
+\x0c\x6d\x6d\x59\x18\x86\x81\xc7\x1f\x3b\x8c\x43\x07\x87\x50\x2e\
+\x97\xfc\x38\x82\x36\x51\xc8\x94\xd2\x81\xb3\xd6\x31\x12\x41\x12\
+\x81\x24\x41\x92\x04\x49\x09\xd3\x34\xd5\x6b\x72\xfb\x46\x05\xa3\
+\x24\xe1\x6e\x57\x7f\x73\xa4\x03\xe9\x38\xea\xef\x04\x92\x12\x04\
+\xd5\x96\x94\xc1\x76\x92\x90\x52\xb5\x07\xf2\xfb\x7b\x72\x32\x8f\
+\xb1\x9b\xdf\x01\xc0\x91\x5c\x2e\xf7\xe4\xc8\xc8\xc8\xf9\x1d\x1c\
+\x83\x97\x1d\xe3\xda\x07\x5f\x13\x92\xf8\xea\xeb\x0b\xd8\x33\xdb\
+\x89\x81\xfe\x41\xe8\xba\x01\x4d\x13\x48\x26\x93\x3b\xf6\x0d\x44\
+\x12\x8e\xa3\x20\x28\x18\x2e\x20\x09\x29\x5d\x70\x92\x9c\xe0\xb5\
+\x74\xa1\xae\xda\x5f\x86\xdb\x20\x38\x52\x82\xbc\xcf\x79\xfb\x39\
+\xee\xdf\x1d\xd5\xa6\x02\x0c\xe8\x4e\x37\x80\xf3\x3b\x68\xc1\x54\
+\xf3\x16\x1c\xd6\x9d\x6f\x27\x30\x75\x77\x12\xdd\x5d\x7b\x91\x6d\
+\xdf\x83\xfa\xfa\x54\xc5\xbe\x8b\x3c\x03\x20\xb7\x9f\x5c\xab\x73\
+\xfb\x89\x54\x78\x4a\xbe\x75\xae\xf7\x70\xbd\x81\x6f\xd9\xca\xea\
+\x3d\x0f\xe0\x5a\xf4\xe6\xfb\xfc\x01\x2d\xb8\xf6\x01\x7b\x2e\xfb\
+\xc6\xd8\x35\xdc\x18\xbb\x06\x21\x04\x0c\xdd\xd8\x31\xa0\xba\xae\
+\x43\x40\xf8\xd9\x85\xbb\x55\x28\xc0\xca\x20\x84\x70\xf3\x0f\x45\
+\x9f\x48\x40\x08\x02\xc8\xcb\x4a\x04\x88\x08\x42\xb8\x7d\xea\xbd\
+\x87\xfb\x0a\x04\xe1\x82\x56\x4d\x99\x96\x53\x39\xc0\x2b\x5d\x54\
+\xb5\x01\x13\x11\x8a\xc5\x32\x6c\xcb\xc1\xae\x97\x10\x48\x26\xeb\
+\x40\x24\x2b\x09\x38\xb0\x61\xdb\xb2\x21\x9d\xea\x74\xac\x94\x84\
+\xc9\xc9\x7b\x98\xba\x3b\x0b\xd3\xb4\x1f\xa9\xea\x54\x7d\xb2\xae\
+\x82\x80\x6b\x20\x8a\x26\x22\x7c\x73\x75\x02\x0b\x0b\x8f\xe6\x49\
+\x1b\x85\x62\x39\x22\x17\x8d\xea\x00\x1e\x9f\x98\xf6\xe1\x76\x77\
+\x77\xe0\xa9\xa7\x8e\x20\x1e\x8b\xed\x7a\xb0\x44\x84\xa9\xbb\xd3\
+\x38\x73\x66\x14\xa6\x69\xb9\x45\x0f\xd2\x8c\x9d\x0d\xb2\xc2\x51\
+\xb4\x24\x38\x11\x17\x3a\x4a\x25\x0b\xf9\xfc\x3c\x00\xa0\xab\x33\
+\x8b\x93\x27\x7e\x06\x5d\xd7\x1e\x19\xeb\xed\xed\xed\x42\xa6\xb1\
+\x01\x7f\xfd\xdb\xbf\x55\x32\x48\x47\x00\x7c\xb8\x2b\xa2\x68\x22\
+\x60\x62\x22\x0f\x22\x82\xa6\x69\x38\x7e\xfc\x87\xd0\x75\x0d\xe9\
+\x86\x34\x5a\x5a\xda\xa1\x1b\xc6\xba\x1f\x24\xff\x59\x00\x24\x61\
+\x3b\xf6\x1a\xdb\xbd\x58\x58\x02\x24\x40\x90\x2a\xd2\x85\x9f\xd3\
+\x12\xb9\x11\xb1\x97\x0f\x79\x69\x51\xf0\xb9\x20\x55\x72\xfc\xd9\
+\x35\x0a\xbe\x63\xd9\x6b\xef\x7b\xdc\x7d\xdc\xbe\xa4\x50\x7b\xe1\
+\xcc\x34\x88\xd2\xf7\xef\xef\x0d\xe2\x2e\x50\x5f\xc5\x5c\xb4\x23\
+\xa3\x8d\xa2\xe7\xe6\x0a\x58\x2a\xb8\xe3\xcf\xf0\xf0\x10\x5a\x5b\
+\x9b\xd1\xd3\xdd\x8b\xbd\x7b\xfb\xd6\x1f\x44\x08\x7e\x8a\xe1\x45\
+\xfe\xde\x36\x84\xf3\x54\x82\x02\x1a\xce\x49\xbd\x36\x28\xc8\x65\
+\x49\x01\x58\xf6\x9e\x42\x6d\xd0\xf2\x36\xb0\x7a\xff\xe0\x33\x58\
+\xdd\x86\x97\x4e\xad\xf8\x4e\x7f\x9f\xe5\xa5\x08\x48\x21\x62\x15\
+\x03\x6c\x59\xd1\x4d\x36\x38\x8e\xc4\xe4\xd4\x2c\x00\xa0\xa1\xa1\
+\x1e\xc7\x9e\xfd\x3e\x5a\x5b\xb3\x3e\x5c\x22\x82\x69\x9a\xa1\x21\
+\x44\xba\x79\xaa\xa6\xfb\x10\x5d\x58\x1e\xe0\xe5\xf0\x3c\xf8\x42\
+\x68\xf0\xce\x26\x5e\x17\xec\x9a\x20\xd5\x8f\xc6\xfb\x41\xa9\x7c\
+\x37\xf8\x9c\x5c\x01\xd3\xf5\x10\xcb\x81\x07\xc5\x10\xac\x80\x4b\
+\xcb\x8a\x27\x9b\x3f\x59\xf4\xa1\xa9\x64\xe5\xf3\x0b\xb0\x6d\xf7\
+\xbb\x9e\xfb\xd1\x33\x68\x68\x48\x61\xa0\xdf\x3d\x9b\xa4\x58\x2c\
+\xe0\xe2\xa5\x51\x98\x66\x39\xf2\x31\x51\x08\xa1\x7e\x14\xe4\x3b\
+\xcd\xb5\x07\xb4\xe0\x7d\xf0\x23\xa2\xd0\x33\x82\xd7\xbe\xfb\x77\
+\xdf\x0b\x21\x96\xed\x27\x2b\x5a\xc9\x0a\xa7\x49\x11\x05\x59\xf3\
+\xf3\x45\xcc\xce\x15\x00\x00\x3d\x3d\x9d\x38\x74\xa8\x1f\x03\xfd\
+\x83\x30\x0c\x03\x44\x84\xaf\xaf\x5c\xac\x0a\xdc\xc0\xca\xb7\x5a\
+\x0b\x88\xae\x76\xf0\x40\x85\x0e\x49\x04\xcb\x72\x50\x2a\x99\xb0\
+\x1d\x09\xe9\x50\xa8\x64\xb7\x33\x41\x95\x69\x5a\x28\x95\xdc\x42\
+\x46\x22\x51\x87\xe3\x2f\xfc\x00\x99\x4c\x33\x5a\xd4\x29\x3a\x13\
+\x13\xb7\x50\x28\x2c\x81\xb5\xc3\x63\xf0\xad\xdb\x13\x38\x73\x76\
+\x14\xf9\xfc\xbd\x48\xfe\xd1\xc6\x74\x03\x5e\x7a\xe9\x79\x34\x35\
+\x37\xa1\xaf\x77\x00\x00\x60\x9a\x65\x4c\xdc\xb9\xc5\x14\x77\x3a\
+\x0f\xfe\xfb\x3f\xfe\x89\x73\xe7\xfe\x57\xf1\x7f\xae\xae\x2e\x8e\
+\xb6\xb6\x16\x1c\x1e\x3a\x80\xc1\xc1\x7e\x18\x86\x8e\xf6\xb6\x0e\
+\xa4\x52\x0d\x20\x92\xb8\x3d\x7e\x13\xb6\xed\x30\xc5\x9d\x04\x3c\
+\x71\x67\x12\xf9\xbc\x7b\x92\x5d\xaa\x3e\x89\xa3\x4f\x1f\x41\xef\
+\xbe\x6e\xa4\xd3\x29\xc4\x62\x95\xbd\xe0\x50\xd7\x35\xec\xdd\xdb\
+\x07\x29\x09\xa5\x52\x11\x93\x93\x77\xc0\x97\x1f\xed\x30\x60\x0f\
+\x6e\x36\xdb\x8a\x5f\xbe\xfc\xa2\x7f\xa9\x48\x14\xda\xb7\xaf\x1f\
+\xf1\x78\x0c\x44\x84\x5b\xb7\x6f\x6c\x29\x5d\x60\xc0\x5b\x50\x32\
+\x99\xc0\x2f\x5e\x7e\x21\x52\xb8\xd9\xec\x1e\x74\x64\xbb\x20\x25\
+\x61\x6e\xee\x1e\xa6\xa7\xef\x32\xbd\x1d\x05\x4c\xc1\xbe\x47\x9f\
+\x1a\x42\x2a\x95\x44\xa6\x31\x83\xf6\xf6\x3d\xeb\x97\x08\x1f\x28\
+\x84\xf6\x72\x41\x42\x3c\x56\x87\x54\x2a\x0d\x22\x09\xdb\xb6\x71\
+\x63\xec\x0a\xbb\xe6\x1d\x07\x2c\x90\xf1\xfa\xb4\xb7\xaf\x07\x7d\
+\x7d\x07\xd0\xdd\xb5\xaf\x82\xb9\xa5\x57\x79\x0a\xde\xdb\xb6\x89\
+\x2b\xdf\x5c\x46\xa9\x54\x66\x72\x3b\x0d\x58\x40\x24\x3d\x9b\x19\
+\x7e\x72\xd8\x87\x2b\xa5\x83\x42\xa1\xb0\x63\x16\x15\xd4\x84\x83\
+\xb2\xa0\x94\x0e\x16\x17\x17\xf0\xdd\xe4\x04\x4c\xd3\x64\x6a\x95\
+\x00\x4c\x6a\xdf\xe6\xe6\x0c\x7a\x7a\xdc\xd9\x8c\x42\x71\x09\x17\
+\x2f\x8e\xa2\x5c\xe6\xd5\x12\x6a\x55\x5b\x9e\x48\xdd\xbb\xb7\x07\
+\x9a\xba\x26\xf8\xe6\xd8\x35\x86\xbb\xdb\xa2\xe8\x44\x22\x38\x1f\
+\xc8\xb2\x2d\x0e\x76\x76\x63\x9a\xb4\x6c\xbc\x64\xbe\xbb\xcb\x45\
+\xb3\x18\x30\x6b\xb7\xb8\xe8\xd0\xc5\x1a\x2c\xb6\x60\xd6\xc3\x67\
+\xc1\x1c\x64\xb1\x05\xb3\x78\x0c\x66\xd5\xaa\x05\x33\xda\x5d\x6b\
+\xc1\xc1\x6c\x0f\x6b\xb7\x01\xf6\x97\x20\x80\x3a\xb1\x9b\x3b\x31\
+\x3a\x09\xf7\x5a\xf2\x4a\x02\x96\xa1\x69\x3c\xa8\xcb\x3f\x58\x11\
+\xe1\x15\x2e\xe4\x8a\x02\x76\x57\x82\x09\x5d\x77\xc3\x8a\x18\x72\
+\xa5\x01\x43\x2d\x0c\x42\xb4\xe5\x5f\x13\xeb\xc1\x5d\xf4\x56\x21\
+\x6f\xeb\xd2\x15\x6f\x0c\xe6\x01\x38\x7a\x17\x5d\x79\x0b\x96\x2b\
+\x96\xfc\x61\xc8\x91\xc9\x5f\xb0\xa7\xb2\x2e\x5a\x59\xb0\x7f\xf5\
+\x1b\xab\x1a\x6e\xba\xa2\x69\x52\x60\xb9\x6c\xbd\x51\x07\x58\x95\
+\x77\xd1\x44\x2a\x55\x62\xbe\xb5\x6f\xbf\xdb\x5d\xa3\x83\xd4\x52\
+\x07\xe0\x3c\x38\xe2\x51\x78\xcb\x84\xb7\xb5\x4e\x96\x54\x80\x59\
+\x51\x5b\x6f\x24\x2e\xda\x5b\x2e\x17\x90\x52\x63\xce\xd1\xda\xaf\
+\x5a\xe5\xa7\x92\x16\x2c\x84\x5b\xc9\x72\xe3\x69\xee\xf5\x2a\xe4\
+\xc2\x5b\xf1\xd3\xdb\xc8\x83\xc3\x11\x34\x47\x5a\xd1\x17\x3a\xb0\
+\xa5\x3e\xdf\x86\x05\x23\xb4\xfc\x0f\x77\xfa\xae\xcb\x83\x49\x92\
+\x3f\x06\x0b\xc1\x84\x23\x0f\xb3\xa2\xc8\x83\xc3\x8b\x73\xb1\x15\
+\x47\x1d\x69\x45\x11\x64\x79\x64\xb9\xda\x51\xf3\x95\x8e\x6d\xba\
+\x68\xb5\xce\x23\x77\x77\x15\x02\xad\x8a\xcf\x07\x87\x17\xc4\xe4\
+\x34\xa9\xd6\x65\x6c\xc7\x43\x90\x54\xae\x99\x78\x36\x29\x6a\xeb\
+\xad\xb8\x05\xfb\x37\x7b\x82\x77\xab\x17\x76\xd4\x91\xc5\x57\x14\
+\x81\x05\xfb\x91\x34\xf7\x77\x15\x2c\x78\x75\x94\x45\x44\xe1\xa5\
+\x6b\x57\x69\xb3\x27\xbe\x6b\xde\xec\x3e\xf9\x2b\xa0\xb3\x8b\xae\
+\x16\xe4\xb0\x97\x96\x8e\x13\x03\x50\x0f\x40\xdf\xae\x05\x6b\x00\
+\x52\x2e\x4d\xef\x06\x4f\xde\x19\x1d\x6c\xc7\xd5\x2e\x74\x48\x49\
+\x06\x80\x06\xc5\xa9\x80\x15\x6b\x15\x1b\xf7\x6d\x11\x48\x01\x48\
+\x11\x41\xf3\xda\xf6\x83\x2c\xae\x45\x47\x6c\xbd\xab\xfb\x5a\x4a\
+\x27\xa6\x00\x7b\xe4\x17\xc3\x50\xee\x07\xb8\x4e\x99\x7f\x32\xc8\
+\x83\x43\xcb\xda\x73\x3d\x3a\xe2\x20\x4b\xac\x1e\x83\x25\xe9\x8a\
+\x11\x14\x58\x1b\x40\x71\x33\x80\x75\x05\x36\xee\x3e\x2b\x17\x2d\
+\x02\xf7\xcc\x70\xab\x5f\xe8\x90\x24\x0d\x00\x09\x55\x94\xb0\x14\
+\x33\xd3\x73\xd5\x1b\x05\x59\x31\x65\xc1\x49\x00\x09\xf2\x4f\xa1\
+\x14\x41\xa4\xc5\xee\xb9\x0a\x70\x97\x5b\xb1\xb2\xe0\x84\x62\x95\
+\x50\x06\x19\xbf\x9f\x05\x0b\xb5\x73\x4c\xed\x5c\xe7\xb5\x2a\x25\
+\xfc\x5a\xb4\xe0\x31\x38\x6a\x27\xbd\xea\xbc\x68\x22\xd2\x15\x1f\
+\x5b\x59\xae\x67\x98\x25\x00\xa4\x6d\x10\x39\xeb\x6a\xe7\x18\x80\
+\x18\xa9\x9c\x48\x08\x19\xba\xb5\x0c\x2b\xea\x28\x7a\x35\x72\x88\
+\x30\x27\x05\x57\xf7\xd2\x26\x63\x83\xf1\xd7\x50\x0f\x6d\xd9\x7e\
+\xea\x92\x51\x9e\x2e\xac\x8a\x01\xaf\x67\x55\x31\xc5\x48\x0f\x19\
+\xa6\xb6\xd1\x18\x2c\xd4\xdf\x34\x1f\xb2\x1a\x83\xa5\x37\x45\xc8\
+\x74\x6b\x49\x5a\xc8\xeb\x86\xd9\x6d\x38\x06\x6b\xab\x46\xf4\xc0\
+\xef\x87\x0a\x1d\x0c\x39\x5a\x13\x5e\x97\xd7\x4a\x66\xda\xfd\xa2\
+\xe8\x75\x2a\x19\xe1\xc1\x97\x4b\x95\x35\x2c\xb9\x91\x05\x7b\xe7\
+\xc4\x06\x80\xfd\x9b\x64\x0a\x65\xc1\x72\x4b\xb7\x1a\x67\x55\x1c\
+\x26\xad\xf1\xbc\x2e\x60\x19\x7a\x38\x00\x1c\xaf\xf0\x5c\x36\x2d\
+\x38\x52\x42\x00\x68\x6c\x6c\x85\xe3\xd8\xdc\xbd\x11\xc9\x30\xe2\
+\x20\xb8\x37\x05\x0d\x0d\x97\xb6\xcf\xc8\x4d\x95\x3c\x66\x1b\x02\
+\xf6\x76\xb6\xbc\x67\xdb\xb1\xa7\x74\x5d\x6f\x9f\x9a\x9a\xc4\xad\
+\x9b\xe3\xe8\xec\x6c\x87\x10\x02\x86\x11\xe3\x9e\x8f\x78\x0c\xbe\
+\x7a\xf5\xba\xbf\xa5\x58\x28\x8e\x87\x58\x39\x21\x66\xce\xfd\x2c\
+\xd8\x0a\x25\xcf\xd6\xec\xbd\xf9\x7f\x75\x74\xb4\x1f\xb6\x6d\x1b\
+\xef\x9d\xfe\x08\xc7\x9e\x1d\x46\x5b\x5b\x0b\x84\xc6\xe3\x70\x64\
+\x78\xa5\xc4\xf8\xf8\xb7\x38\x73\xf6\xbc\xcf\xfb\xda\xf5\xeb\x9f\
+\x78\x8c\x42\xcf\x3e\xe0\x8d\xe8\xc4\x01\x34\x01\x48\x03\x68\xc8\
+\x64\x32\xad\xc7\x7f\xfa\xc2\x69\x4d\xd3\x9a\xb9\xab\x6b\x43\xe5\
+\x92\x79\xe9\xa3\x0f\xff\xf2\x7b\xb8\x93\x0b\x8b\x00\x96\x00\x2c\
+\x00\x98\x05\x50\xf6\x0a\x1a\x1b\x0d\xdc\x5e\xf2\xac\x95\xcb\x65\
+\x69\x5b\xce\xe7\x2d\x6d\xcd\x87\x75\x5d\x6f\xe3\xee\xad\xae\x2c\
+\xcb\xfa\xe6\xfc\xb9\x73\x7f\x9c\x9b\x9b\xcf\x2b\xc0\x25\xb8\xf3\
+\xc1\x45\xf5\xa0\xcd\xe4\x39\x31\x00\x8d\x70\xe7\x84\xbd\x69\xc3\
+\xba\x9e\xde\x9e\xce\x8e\x6c\xfb\x40\x22\x9e\x68\x85\xe0\x5c\x29\
+\x3a\x1f\x4d\xb2\x5c\x36\xe7\xf2\xf9\x99\xdb\x63\x63\x63\xb7\x95\
+\x2b\x2e\x2b\xb8\x4b\x0a\xf0\xbc\x72\xd5\x9b\x4e\x64\x93\x70\x27\
+\x94\x93\x70\x27\x20\x12\x9e\x55\x83\x57\xab\xad\x66\x5a\xe4\x45\
+\xcb\x25\xf5\xf0\xdc\x74\x71\x59\xe4\xbd\x89\xc6\x4a\xa1\x46\xbd\
+\x28\x2d\x16\xaa\x9a\xb0\xaa\x13\x4e\xcb\x50\x10\xec\x59\xf0\xaa\
+\x7b\x1c\x6d\x05\x50\x78\xbe\x31\xc6\xd6\x5b\x13\x56\x6c\x85\x00\
+\x9b\x58\xa3\x96\xb9\x55\x0b\xd4\x10\x4c\x4b\xe9\x6c\xc1\x55\xb5\
+\x60\xcf\x9b\x5a\xd8\xe0\x12\x93\x07\x01\x24\x18\x70\x55\x01\xf3\
+\x2c\x0f\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\
+\x8b\xc5\x62\xb1\x6a\x42\xff\x07\xe6\x06\x8d\x65\x54\x37\x70\x1f\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x21\x87\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3\x3e\x61\xcb\
+\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x00\x48\x00\x00\x00\x48\
+\x00\x46\xc9\x6b\x3e\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\
+\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\x21\x27\x49\x44\x41\x54\x78\
+\xda\xed\x9d\x09\x74\xcd\x59\x9e\xc7\xff\x49\x44\x22\x82\x44\x92\
+\xca\x52\x89\x22\x86\xa4\x30\x96\xa2\xda\x52\x54\x07\xa5\x8c\xa5\
+\x2d\x4d\x35\xa9\xc6\xb1\x0c\x3a\x61\x24\xa3\x64\x84\x46\x23\x4d\
+\xda\x32\x49\x0e\xd2\x61\x22\x69\x4c\xa8\xb6\x4c\xa8\x90\xc1\x58\
+\x26\x32\x22\x83\x21\x0e\xd1\x28\xe2\x44\x3a\x68\xd2\x44\x49\x3a\
+\x38\x45\xdd\xf9\x7d\xef\xbb\xf7\xe5\xff\xde\xfb\xbf\xac\x2f\x51\
+\xf8\xbf\x73\x7e\xe7\xc5\xdb\xf2\xe4\xf7\xb9\xbf\xfd\xde\xbf\xc2\
+\x18\x53\x1a\x52\x1a\xe0\x66\x47\xd2\x84\xc4\x79\xda\x0a\xb7\x61\
+\x33\x57\xb9\x87\xd2\xcf\x2e\x24\x8e\xe2\xb9\x37\xfe\xd6\xd0\x3a\
+\x31\xd1\xcf\x1b\x06\x80\xc3\x84\x05\xcd\x83\x22\x37\xfa\xec\x8c\
+\xda\xe2\xfb\xdd\xc2\x64\x3f\x36\x65\x69\xab\x95\xf4\xf8\x7b\x02\
+\x02\x07\x15\x24\xf6\xe2\xdf\x52\xec\xdf\x14\x40\x74\x00\xb4\x6f\
+\x4d\xe6\xac\xf7\x9a\x0d\xc5\x6f\x3c\x1e\xcc\xd6\x1e\x68\xcf\xc2\
+\xd6\x7a\xe6\xd1\xe3\xbd\x49\x3a\x08\x08\x5a\x92\xb4\x98\xbc\xa4\
+\xe5\x88\xd0\x85\xae\x3f\x83\x10\x30\xa3\x46\xce\x6e\xfa\x53\x7a\
+\xdc\x5d\x3e\x4f\xd2\x9c\xa4\x19\x89\x93\xb0\x1c\x0e\x3f\x26\x38\
+\x74\x00\x34\x56\x3e\x94\xbf\x64\x5b\x00\xdb\x5f\xd0\x9b\x0b\x56\
+\xff\xa0\x49\x76\xdb\xc6\xcc\x75\x4e\xa3\xe7\x2e\x7c\x95\xe8\x53\
+\x8c\xc7\x20\xab\xf6\xb6\xe3\x80\x48\xc1\xfb\xe4\x73\x00\x28\x62\
+\x83\xf7\xff\xce\x8e\xf5\x48\x99\xb4\xb8\xe5\x3f\x7f\x3e\xd5\x61\
+\x90\x80\xc3\x55\x00\xd1\xe4\x75\xc3\xa0\x03\x60\xe6\xf3\x61\xf6\
+\xa1\xb8\x83\x45\x7d\xd9\xf1\xc7\x03\xd8\xf2\x5d\x6d\x8d\x8a\xde\
+\x9a\xdb\x95\xed\xb9\xd6\x8b\xe1\xb9\x53\x65\x21\xd5\x0a\x5e\x07\
+\x80\xf0\xbe\xb8\xc3\x1d\x39\x1c\xf3\x37\xf9\xdc\xa5\x58\xe2\x0f\
+\x21\x13\x95\xcf\xe9\xf7\xb5\x16\x16\xc2\x51\xb8\x0d\x1d\x80\xd7\
+\x08\x00\x56\xa2\x63\xd8\x1a\xcf\xc5\x30\xfb\x50\xe0\x91\xfb\xfd\
+\x18\x7e\x06\x08\xd6\x94\x8c\xe7\x0e\xdf\xeb\xc7\x0e\xdc\xee\xc3\
+\xd2\x6f\xf6\x66\xbb\xaf\xf6\xd2\x94\x3d\xd7\x3e\xe6\x30\x7c\x9d\
+\xdf\x93\xad\x3b\xd8\x81\xc3\x30\x37\xce\xeb\x3c\x59\x85\x89\xf4\
+\x7b\x3d\x45\x5c\xd1\xe8\x16\x41\x07\xc0\x70\xb3\x1f\x18\x6a\xe7\
+\x1d\xbe\xd6\x33\x89\x56\x28\x5f\xb1\x55\x29\xfd\x64\xe9\xa7\x7c\
+\x75\xef\xbd\xf1\x31\x4b\x3e\xd3\x95\xc5\xec\x69\xc7\x56\xef\x0b\
+\x64\x49\xa7\x3a\xb3\xcd\xd9\x5d\x8c\x62\x0d\x06\xc8\xae\xcb\x3d\
+\x59\x5c\x66\x47\xb6\x28\xc5\x9f\x4d\x5d\xde\x2a\x8d\xbe\x43\x00\
+\x49\xab\xc6\xce\x30\xde\x75\x00\x78\x9a\x47\x3e\x7a\x62\x54\x62\
+\xe0\x77\x5b\x0e\x8f\x66\x39\x25\xd3\x58\x76\xd9\x60\x4d\xc5\x1f\
+\x7d\xd8\x9f\xa5\x10\x1c\xcb\xd2\xda\xb2\x05\x9b\xfd\x58\xf8\x7a\
+\x2f\xf6\x55\x92\x2f\x57\x3c\xa0\x89\xda\xe2\xc7\xe6\x26\x78\x55\
+\x84\x46\xb7\xfc\x76\xf2\xd2\x56\x7f\x9e\x13\xe7\xc5\x22\x09\xa8\
+\xc5\xa9\x01\x2c\xfe\x48\x10\xdb\x79\xa9\x87\x05\x08\xdb\xce\x77\
+\x67\x8b\xe8\xf9\xb9\xf1\xde\xdf\x92\x0d\xf8\x48\xb8\x85\xa6\x8d\
+\x05\xc1\xbb\x0c\x80\xc1\xe4\xaf\xf5\xfc\x3d\xfd\xf1\xd9\xa1\x6b\
+\x93\xd8\xd5\x17\x0b\xb9\x9c\x7f\x36\xc9\x44\xf1\xe9\xb7\x3e\x66\
+\x6b\x0e\x74\xe0\x0a\xa7\x7a\x40\xd1\xe0\xc9\xf6\x07\x02\xba\x2a\
+\x31\xf4\xfe\x09\x88\x0f\xa4\xb5\xd8\x79\xb9\x07\x8f\x17\x9a\x7a\
+\xf2\xe7\xbe\x24\x19\xeb\xde\x4e\x89\x1c\xf4\xa5\x5d\xea\x17\x5f\
+\x35\x3f\x8f\xf7\x03\x1e\x28\xdd\x1c\x84\x15\xbb\xda\xb1\x99\xab\
+\x3c\x90\x69\x74\x14\x10\x34\x8a\x25\x78\x57\x01\xb0\x83\xc9\x9f\
+\x17\xef\x7d\x19\x2b\xf8\x50\x71\x5f\x76\xf1\xd9\x74\x23\x00\x67\
+\x2b\xc6\x73\x85\xc2\x67\xf3\x14\x70\xbd\x67\xc5\xa0\x49\xf6\xdf\
+\x50\x02\x17\x41\xef\x1d\x43\x32\x84\xe4\x13\xa4\x85\x64\xbe\x0f\
+\x23\xc0\x53\x43\x40\x59\xc2\xdf\x3c\x02\xf9\x6b\xfb\x93\xf4\x10\
+\xd2\xc7\xd1\x5d\xf9\xe5\xd8\xb9\xce\x19\x00\x61\xe5\xee\x76\x26\
+\x16\x01\x3f\xe3\xbb\x8c\x8d\x70\xfe\x03\xbd\xb6\xbd\x48\x23\x1d\
+\x74\x00\x6c\x0f\x00\x57\x3e\x99\xe7\x2b\x58\x8d\x99\x77\xfb\x19\
+\x57\x3a\x14\x7f\xa6\x7c\x14\x57\x26\x82\x3f\x8a\x07\x2a\x86\x4c\
+\xb1\xcf\xa0\xf7\x4c\x27\x19\x2e\x14\xda\x55\x28\xe8\x7d\x12\x3f\
+\x98\xed\x99\xab\x3d\xb2\x11\xd4\xc9\xd8\x01\x2e\x81\xd2\xc5\xdb\
+\xf4\xfc\x67\xe2\xb5\xbe\xfc\xb5\x8a\x12\x88\xf7\x3b\x7b\x29\x5f\
+\x4c\x5d\xe6\x76\x05\x0a\x57\x43\x80\xb8\x61\xf6\x1a\xcf\x72\x7a\
+\xcd\x60\xf1\x7a\xe7\x86\xb6\x02\xef\x1a\x00\x26\xca\xcf\xb8\xd3\
+\xc7\x18\xc9\x1f\x2b\x19\xc0\x83\x3b\xac\x7a\xa4\x7e\x94\xb7\xc3\
+\x1c\xcf\x24\x19\x41\xd2\x8f\xa4\x13\x89\xbf\x30\xcf\x32\x8f\x77\
+\x12\x81\x5b\xfb\xfe\xe3\x95\x68\x28\x1d\x2e\x00\xf0\x00\x88\xd0\
+\x68\xd7\xbd\xf4\x5c\x10\x89\x87\x88\xf2\x9b\x8b\x9f\x3f\x20\xe9\
+\x46\xc5\xa3\xa3\x80\x40\xed\x0a\xa2\x92\xfd\xd9\xb0\xe9\x8e\x9b\
+\xc5\xfb\x1a\xdc\x0a\xbc\x4b\x00\xd8\x51\xca\xf5\x9e\x54\x3e\x52\
+\xb6\xac\xa7\x9f\x9a\xf8\x7a\xe9\xc3\x7b\x0c\x55\x52\xe9\xf5\xe3\
+\x48\x42\x48\xba\x08\xc5\xbb\x89\x8a\x9e\x3a\x55\xb3\x13\xbe\xba\
+\x95\x50\x6a\x0f\xdf\x4e\xca\xac\xd1\xe1\x4e\xbb\x24\x0c\x14\x2f\
+\x44\xd2\xe3\xde\x62\x35\xdb\x8b\xf7\x03\x06\x2f\x92\x60\x8a\x29\
+\xf2\x62\xd3\xdb\x1b\x01\x40\xb0\x48\x6e\xe5\x2c\x3d\xd7\x4b\xbc\
+\xcf\x51\x07\xa0\xfe\x00\x70\x45\xcd\x89\xf7\x3a\x8d\x88\x1c\x39\
+\xb9\x79\x9a\x07\xf3\x0d\x93\x4f\xe6\xf9\x37\xf4\xda\x51\xa2\xec\
+\xdb\x5e\xac\xf8\x66\x55\x94\x70\x25\x04\xcd\x45\x89\xb8\x1d\xc9\
+\xdf\x93\xfc\x04\xd2\x65\x20\x07\xc9\x57\x7c\x86\xbd\xea\x3d\x88\
+\xf4\x5b\x0f\x9b\xe1\x38\x17\x19\x85\x04\x60\x2b\xa5\x95\xf3\x12\
+\xbc\x4b\xe8\xb9\x9f\x8a\xd4\xd0\x59\x07\xa0\xfe\x00\x34\x09\x5f\
+\xe7\x15\x2b\x7d\x2e\x0a\x37\x5a\xca\x77\xf1\x51\x96\x0a\x5f\xff\
+\x91\x58\xf5\x2d\x6a\x11\x8d\xdb\xab\x40\x68\x2d\x94\xee\x2f\xee\
+\xdd\x84\xbb\xb0\x37\x03\x07\x8f\xf9\xd1\x77\x33\x02\x80\xfa\x02\
+\x2c\x07\x3d\xfe\xb9\x88\x19\x5c\x74\x00\xea\x07\x80\x3d\xe5\xe5\
+\x43\xa7\xad\x70\x67\x71\x87\x82\xd8\x3e\x2a\xde\x98\x9b\x7d\x33\
+\xe5\x77\x17\x01\x98\x4b\x1d\xfd\xaf\x9d\x78\x5f\x53\xb1\xea\x65\
+\x23\x48\xcb\x82\x34\x19\x3e\xd3\x31\x04\xb5\x02\x28\x1f\x6e\x29\
+\xed\x52\x0f\x09\xc0\x70\xd1\x78\x72\xd5\x01\xa8\x3b\x00\xdc\xd4\
+\x52\x1b\xb7\x28\x7a\x6b\x00\xdb\x78\xac\x13\x3b\x50\xd8\xc7\xa4\
+\x56\x8f\x3f\xb6\x30\xfb\x23\x84\xf2\xcd\xcd\xb5\xad\xe6\x0a\xb4\
+\x1e\x73\x5a\x98\xd4\x31\x67\x7b\xd6\x38\x76\xb8\x70\x24\x8f\x49\
+\x90\x52\xce\x8d\xf7\xfa\xab\x0e\x80\x6d\x00\x70\xa0\xa0\x2f\x76\
+\x76\xac\x27\x57\xfe\xe6\x53\x5d\xa8\xbe\xdf\xdf\x18\xf9\x23\xda\
+\xa7\xe8\xfd\x8f\xc2\xe7\xf7\x14\x2b\xdf\xd6\xca\xb7\x76\x73\xa4\
+\x40\x71\xe7\xea\x9d\x7d\x59\x76\x71\x04\xcb\x7b\x16\xc6\xbf\x17\
+\xea\x0e\xd4\x62\xbe\xa0\xbb\x80\xfa\x03\xc0\x53\x3e\xf2\xaf\xdf\
+\x25\x65\x75\x66\xdb\xce\x75\x67\x07\xef\x54\x76\xf1\xb0\xd2\xbe\
+\x5c\xd4\xf2\x12\xbd\x6e\x3c\x8a\x34\x22\xe0\x6a\xde\x48\xca\x6f\
+\x42\x15\xc8\x68\x14\x84\x36\x9f\xea\xc6\x8e\x14\x8e\x63\x59\xa5\
+\x43\x8d\x00\xf4\x1a\xa1\xfc\x9b\x1e\x04\xd6\x1f\x00\x07\xea\xec\
+\xfd\x0e\x79\x35\xfc\xeb\x5e\x95\xef\x47\xae\x0f\xbf\x2f\xf2\xfc\
+\x90\xc6\xac\xbc\x41\xf9\xb3\x56\x7b\xfc\x0a\xe5\x67\x58\xa5\x9d\
+\x97\x7a\xf2\xef\x87\x6e\xa2\x04\x40\x94\x99\xfb\x08\x77\xd4\x54\
+\x07\xa0\xf6\x00\x18\x0a\x3e\xeb\xbd\xbe\x93\x5d\x39\x69\xfa\x21\
+\x2a\xd3\x3f\x5c\xe4\xf9\xad\x1b\x3a\xdf\x56\x41\x39\x1b\xca\x47\
+\xba\x07\xa5\xcb\xe8\x5f\x16\xa5\x00\x40\xef\x51\xca\xef\x45\x1a\
+\xa9\xd7\x01\xea\x08\x80\x03\x0d\x5d\x84\xc9\x2a\x1b\xf2\x7e\x59\
+\xf4\x41\xd4\x2f\x82\xac\x5f\x88\x55\xf6\x7e\x63\x94\x5c\xf1\x9d\
+\xd0\x75\x94\xca\x97\x40\x22\x25\x85\xc8\xef\xb7\xfd\x42\x37\x36\
+\x23\xc6\xfd\x4f\xa2\xd7\xe0\xaf\xbb\x80\xba\x01\xd0\x94\x82\xbf\
+\x22\x54\xd5\xd4\xe6\x55\xae\xfe\x9e\xc3\x94\xad\x22\xc8\x0a\x6a\
+\x24\xd3\x6f\x3f\x6d\xb9\x5b\x6f\xc4\x23\xf8\x4e\xea\xef\x03\x41\
+\xef\x00\x60\xaa\x83\x53\x51\x0e\xfe\x50\xd5\x1e\xb6\xd7\x01\xa8\
+\x19\x00\x76\x13\xa3\x5c\xfb\x45\x6c\xf4\x31\x9a\x57\xb9\xda\xe0\
+\xfb\xc5\xea\xff\x42\x98\x58\x5f\x91\xa3\x37\xe4\xcd\x10\x8c\xae\
+\xf7\x2a\x5a\x77\xb0\x23\xff\x3e\x98\x2b\x90\x83\x25\x89\x59\x9d\
+\x18\xcd\x0d\x56\x20\x26\x91\x10\x20\x3d\x45\x2f\x81\xac\xd8\xff\
+\x50\x9d\x60\x0e\x7d\x86\x8f\x28\x26\xb9\x8a\x2c\xa5\xa9\xad\x86\
+\x4b\xdf\x46\x00\x9a\x60\xb2\x07\xed\x56\x09\x80\x2c\xfb\xa2\x49\
+\x33\x2a\xdc\xe9\xbf\xe8\x35\xc3\x54\xab\xbf\xa1\xa3\x7e\x07\x32\
+\xfb\x3b\x51\x82\x56\x37\x7d\x10\x9b\x2c\xdc\xea\x4f\xa3\xe6\x6e\
+\x7f\x76\xf6\x56\x96\xb9\xfa\x29\xd1\x68\x23\xab\x2d\x01\x2a\x94\
+\x72\x26\x11\x83\xa8\x18\x30\x25\xf7\x10\xdf\xfd\x73\xe5\x63\x55\
+\x6f\xa2\x5e\x20\xbc\x8d\x00\x38\x85\xad\xf5\xca\x57\x8f\x64\xa9\
+\xcd\x7f\x73\x5f\x65\xb1\x68\xeb\x36\xb8\x7f\x95\xee\x68\x6e\x9c\
+\xf7\x13\x98\x7e\x7c\x27\x34\x7e\x10\x9b\xcc\x8a\xf5\xa8\xc0\x60\
+\x09\x3d\x3f\x55\xce\x17\x50\xf4\x3f\x9d\x9e\x2b\x97\x10\xe4\x94\
+\x0f\xa7\xfa\xc0\x2c\xde\xa6\x86\x55\xc0\x40\x2a\x20\x06\x10\x53\
+\x97\xb5\xda\x24\x2c\x98\xab\x68\x30\xe9\x00\x88\x9b\x0b\x46\xb1\
+\xd4\xab\x4d\xae\x28\x51\x62\x1d\x27\x06\x34\x3c\xeb\xf3\x87\xab\
+\xc5\xcd\x89\x2a\x91\xcb\xa6\xaf\x74\xff\xbf\x29\xcb\x5a\x5d\x1e\
+\x31\xbb\xe9\xe1\x4e\x9f\x2a\xff\x4a\x8f\x4f\x21\x19\x2a\x9a\x4e\
+\x41\x02\xc8\xb6\x1d\xfb\x2a\x13\x01\x01\x56\x3f\x26\x93\x30\xa0\
+\x72\xe9\x79\x98\xc5\xb4\x31\x5c\x44\xef\x91\x3c\x8d\x95\xc5\x2b\
+\x3b\x1d\x00\xfa\x23\xd0\xe8\xd5\x27\xf3\x13\x7d\x2d\x00\x80\xff\
+\x9f\xbe\xc2\xed\x3a\xbd\x66\x24\xda\xb0\xc2\xfc\x37\xc6\xdc\x9d\
+\xa3\x08\xe4\x82\x84\xb2\x07\x88\xf9\x82\x1e\x62\xfc\xcb\x4f\xb4\
+\x93\x9b\x89\x42\x94\x6f\x70\x7f\xe5\x17\xe1\xeb\x3c\xff\xb2\x66\
+\x7f\x10\x3b\x56\x34\x8e\x1d\xbd\x3b\x84\xc7\x0d\x98\x59\x80\xc8\
+\x06\x16\xed\x53\xf8\x77\x11\x28\xba\xd5\x35\x90\x7d\xdb\x00\xb0\
+\xa7\xea\xde\xc8\xe8\x14\xff\xca\xee\xda\x2d\x83\x19\xcd\x28\x18\
+\x20\x01\x18\x2a\x0a\x3f\xcd\x1b\x69\xf0\xd6\x41\x28\xb7\xb5\x50\
+\x76\x80\xb8\xf7\x14\x10\x3a\xab\xfc\xb8\x7c\x2d\x82\xbe\x4f\x50\
+\xa9\xa4\xd6\xb0\xe6\x84\x31\xdc\x19\x8d\xa9\xfd\xa1\xbe\xd6\xec\
+\x6d\x03\xc0\x01\x5b\xb4\x64\xf5\x0f\x72\xe2\xce\x34\x6e\x46\x8f\
+\x14\x8e\x46\x7e\x7d\x4d\xf8\xdb\x76\x0d\x5d\x63\xb7\xd2\x2a\x76\
+\x12\x0a\x97\xbb\x82\xec\xad\xbc\xb6\x99\x98\x2d\xf8\xf0\xd3\x89\
+\xca\x26\xea\x64\x56\x60\x88\x65\xe3\x89\x4e\x1c\x86\xc5\xdb\xda\
+\x30\x72\x73\xc8\x66\x42\xc5\x88\x9a\x87\x0e\x80\x00\x00\xfb\xf3\
+\xd4\x00\x64\xdc\xfc\x9c\xe5\x3e\x0d\x65\x27\x1e\x0f\xe4\xc3\x9a\
+\x22\xff\x6f\x4c\x0b\x50\x57\x60\x9c\x84\xd5\x40\x43\xe8\xb3\x90\
+\x50\xfb\x5d\xe3\x22\x5c\xae\x8f\x8b\x74\xb9\x4e\x13\x47\xd9\xf4\
+\xd8\x64\x11\xcc\xb6\x13\x73\x0b\xf6\x3a\x00\xc2\x02\x2c\xde\x66\
+\x9a\x72\xc9\x3a\x00\xcc\xa6\x67\x7b\xe5\x9f\x1a\x39\x06\xa8\x4f\
+\x0b\xd9\x51\x28\xd7\x57\x7c\x67\xa4\x7f\x9f\x0a\xc1\xc8\xd8\xdf\
+\x29\xf5\xdc\x47\xf0\xd6\xc5\x00\x6d\xba\x2b\x6d\xd5\x13\x36\xea\
+\x3a\x3b\xca\xac\x34\xa8\x79\x52\x4c\xfc\x78\x35\x52\xfd\xdf\x16\
+\x31\x84\xb3\x08\x14\xbd\x45\xb6\xe0\x2f\x7e\x6e\x59\xdf\x2a\xe1\
+\x5b\x97\x05\xe0\x8f\x42\x75\x80\x62\xd4\xdb\x25\x00\x69\x79\x3d\
+\x78\xf9\x15\x11\x34\xd2\xa7\xce\x21\x4a\xa4\x30\xad\xae\xca\x6b\
+\xda\x94\x59\x8f\x29\x23\x67\x21\x36\xa9\x06\xbe\x8d\x75\x80\xe6\
+\xd3\x63\xdc\xf7\xc9\xb2\x2b\xaf\xba\xd1\x20\xc8\x76\xda\x8d\x83\
+\x3d\x00\x28\xa6\x20\xcf\xa6\xd7\x0d\x14\xa6\xd5\x59\x79\x4b\x4e\
+\xfb\xd0\x01\x30\xdc\x9c\xb1\x17\x5f\x3d\x6f\xbf\xe3\x42\x0f\x0e\
+\x80\xec\xb8\xf1\x8d\x1b\x71\x5e\x05\xa4\xf6\x7e\x22\xda\x76\x7e\
+\x43\x2c\x81\x0e\x40\x0d\x00\x80\x5f\xf7\xa2\x42\xca\x53\xf3\xfc\
+\x59\xbd\x0b\x08\x25\xd5\xc8\x0d\xde\x7f\x21\x77\x30\x5e\xf8\xd3\
+\xba\x0e\x81\xea\x00\xfc\xc8\x00\xc0\x4a\x6e\x39\x79\x71\xab\x8d\
+\xea\x74\x50\xce\x05\xa8\xf7\x03\x20\x28\x5c\x90\xe4\x5b\x36\x3e\
+\xd2\x65\x9d\x08\xac\xea\x1d\x54\xe9\x00\xfc\x38\xe6\x01\x9c\xa9\
+\xbb\x16\x4c\x13\x41\x65\xe6\x56\xc0\x7c\x47\x10\xea\xea\x48\x0f\
+\x71\xf4\x0b\xb5\x6d\x27\x09\x97\x20\x4f\xed\xb0\xd3\x01\x78\x43\
+\x27\x82\x90\x36\x0d\x9d\xee\x38\x07\x73\x01\xe6\xfb\xf2\x91\x11\
+\x60\x13\x28\x9a\x2d\x90\xd3\xe5\x9f\xf3\xda\xba\xe8\xc1\x7f\xd3\
+\xa1\x0f\x2f\xb0\xc8\xfd\x7c\x8e\x6f\xb3\x45\x78\x6b\x67\x02\x45\
+\x25\xcd\x87\xba\x70\xff\x6d\xde\x8b\x47\x75\xf0\xdc\xa3\xf9\xc6\
+\xed\xe0\xf9\x2f\xbe\xe2\x87\x42\xc8\x5d\xc1\xe8\x1a\x52\x0c\x71\
+\x42\x1c\xdf\xe2\x25\xd2\x45\x9b\x0d\x61\xe8\x00\x34\xce\x54\x30\
+\x56\xad\xab\x83\x9b\xd2\x95\x7a\xef\xdf\xa2\x96\xae\xee\x0f\x9c\
+\xbe\x1b\xc1\xce\x96\xcc\x67\xf9\xcf\x0d\x10\x9c\xab\x98\x68\x74\
+\x0b\x38\x1b\x48\x5a\x04\x1a\xc2\xb8\x4e\x1d\xc6\x7f\x71\x6b\xcb\
+\x3b\x77\xb2\x6b\xd7\x44\xd1\x0f\x8a\x7c\x23\x36\x86\xc0\x7c\xbb\
+\xd3\xda\xfd\x98\xa6\x72\xca\x24\x04\x12\x00\x48\xee\x83\x48\x76\
+\xe5\x59\x94\xc5\xa9\x20\x72\x86\x00\xc3\x19\x38\x21\x6c\xc1\x66\
+\xdf\xa7\xb3\xd7\x78\xa4\xd3\x34\xf1\x3f\x88\xee\x5b\x0b\xc5\xfa\
+\x96\x2f\x1d\x80\x1f\xd3\xd6\x30\x28\x0c\xbb\x74\x67\xae\x76\xbf\
+\x05\x08\xd0\x22\x96\x00\x9c\xba\x33\x8f\x65\x15\x86\xb3\xc3\xc5\
+\x21\xc6\x33\x02\xac\x1d\xf9\x86\xfa\x81\x3c\xea\x8d\xb6\x75\x6f\
+\xa0\xcf\xec\xad\x54\x1e\xf5\xf6\x46\xba\x88\x77\x61\x73\xa8\x9d\
+\x28\xf4\xbc\x47\x4e\xa1\x2f\x20\xc0\x2c\xde\xfe\x6b\xc3\xb8\x25\
+\x38\x5a\x18\xca\xd2\xaf\x87\x18\x83\x43\xf3\x33\x03\xb4\x44\x8e\
+\x66\x01\x06\x3a\x4a\xf6\x1a\x6d\xe5\x8a\xe9\x36\x98\x0f\x99\xba\
+\xbf\x69\x30\xbc\x2b\xdb\xc3\xed\x8d\x10\x38\x28\xbd\xbf\x8c\x76\
+\x3d\x82\xf9\x7c\xad\x41\x0b\xd4\x0a\xcc\xb7\x8f\x57\x75\x46\x20\
+\x5c\x04\xb6\x99\x21\x70\x7c\x13\x61\x78\x97\x4e\x08\x91\x10\x20\
+\xbd\xeb\xd8\x67\x8c\xb2\x88\xf6\xe7\x95\xc3\x25\x68\x1d\xdf\x86\
+\xad\x64\xea\xdd\x44\xd6\x24\xb7\x62\x0c\x8f\x1f\xb2\x4b\x47\x6b\
+\xc2\x20\x82\x47\x37\xb3\x94\x52\x3f\x2b\xf8\x75\x9d\x11\x24\x56\
+\x24\x14\xd2\x16\x0d\x21\xea\x1b\x9c\x81\x35\x50\x37\x8f\xaa\x03\
+\x01\x2b\x1f\x65\xe5\xdc\xb2\xf1\xc6\x54\x12\x02\x18\xb4\x2c\x03\
+\xa5\x94\xc7\x69\xaf\xc2\x02\xb3\x4c\xe2\x47\x51\x5f\x78\x27\x4f\
+\x09\x13\x7f\x7c\x57\xd1\x0d\xec\x44\xc1\xdc\x3c\x9a\xdc\xbd\x82\
+\xa2\x91\xdc\x4d\xa4\xe5\x1a\x10\x08\x22\x48\x94\x7b\xfa\xce\x94\
+\xcc\x34\x01\xa0\xaa\x4c\x42\xc2\x80\x4c\x62\xec\x3c\xe7\x99\xa2\
+\xbe\xf0\xda\x33\x89\x77\xf9\xa0\x48\xe9\x12\x5a\x0b\x6b\xd0\x83\
+\x4a\xc1\x6b\x49\x41\x0f\x00\x02\x2c\x82\x96\x6b\x80\x7c\x9d\x6f\
+\x38\xea\xf5\x4c\xe9\x44\x13\x00\xd4\xb5\x04\x2d\x41\x7d\x01\xfd\
+\x07\x94\x9e\x65\x26\x41\xcd\xa8\x3e\x22\x5e\x78\x2d\x55\x47\xfd\
+\xa8\xd8\xca\x73\x7d\xbc\xc4\x88\x55\xaf\xa0\xfe\xca\x02\x3a\xea\
+\x35\x1f\x13\xb9\x88\x11\xd4\xc3\x25\xe6\x72\xbc\x78\x3c\x3b\xfb\
+\x78\x26\x3b\x5b\x16\x5a\x6d\xbc\x80\x0c\x03\xae\x03\x56\x01\xd6\
+\x44\x66\x12\x56\xaa\x8e\xf6\x3a\x00\x8d\x78\x58\xb4\xf8\xa3\xb7\
+\x10\xad\x61\x80\xf0\x51\x53\x0f\x25\x74\xec\x3c\x97\x6f\x68\x4b\
+\xf7\xdf\xa4\x55\xd0\x3a\xe6\x55\xdd\x68\x82\x62\xe5\xec\xbe\xb9\
+\x40\xf9\xe6\x9b\x55\x01\x83\xb4\x0a\xb2\xea\xa8\x1a\xf7\x72\x6a\
+\x68\x10\x74\x00\xac\x83\xe0\x25\x5c\x03\x8e\x7c\xfb\xa4\xd7\x70\
+\x65\xc5\xd8\x08\x97\x93\x74\xdc\xcc\xdf\x70\xac\x1b\xb6\x78\x55\
+\x65\x19\x20\xd8\x8c\x02\xa5\x63\x53\x07\x56\x3f\x94\x8d\xc7\xe4\
+\xe6\x50\x73\x41\xac\x20\xdc\xc3\xbd\xf1\xf3\x5d\x16\x2a\x86\xfd\
+\x01\x2d\x14\x7d\x77\x70\xa3\x5f\x32\x46\xce\xf1\xbb\x88\x18\x01\
+\xb3\x02\x88\xe0\x31\x4c\xfa\x69\x8f\x61\x4a\xcc\x17\xf3\x5d\x4e\
+\xce\x58\xe5\x51\x82\x0c\x02\x6e\x02\xc1\x63\x55\xd6\x41\x66\x14\
+\x58\xfd\x80\xa2\xaa\xaa\xa3\x04\x21\x22\xc1\xfb\x06\x5d\xa9\xe4\
+\x97\x02\xc6\x06\xb9\x9e\x80\x0e\x40\xf5\x31\x42\x13\x11\x2c\xb6\
+\x14\x8a\xc0\xce\x9e\x20\x01\xc3\x00\xaf\x8e\x4a\x38\x29\x29\x65\
+\xe2\x42\xd7\x73\x70\x15\xf2\x78\x78\xb8\x8b\xea\xae\x19\xa0\xb6\
+\x14\xea\x43\x22\xd4\x03\x2b\x88\x11\x70\x3d\x01\x3a\x81\xbc\x8b\
+\x48\x5f\x6d\x6a\x0d\x74\x00\x6a\x6f\x15\x9a\xa9\x60\x80\x65\xc0\
+\x51\x6e\xd8\x9d\x83\xbe\x40\x88\x57\x07\x65\x0e\xed\xfa\x4d\x21\
+\x77\x91\x45\x9b\x41\x0b\x71\x10\x14\x5c\x06\xac\x04\xdc\x06\xa0\
+\xb0\x66\x29\x90\x6a\x9a\xd7\x1c\x90\x39\xe0\xd8\x18\x0a\x48\xbf\
+\xa5\x23\x6c\x47\x8b\xdf\x6b\xb3\x93\xcc\x74\x00\xea\x07\x83\xb3\
+\xf0\xd1\xad\x85\xbf\xfe\x40\xb8\x0a\x00\x81\x72\x30\x36\x70\x0c\
+\x69\xdf\x5b\x59\x44\x50\xa4\x8e\x98\xd5\x34\x93\x0a\x4f\x7f\x0a\
+\x5f\xeb\xc5\x83\x4a\x00\xa1\x95\x6a\xc2\x22\x98\x5b\x03\xb4\xa7\
+\x31\xbe\x46\x3b\x8b\xbf\x10\xbf\xcb\x26\x10\xe8\x00\xd8\xc6\x4d\
+\xa8\x4f\x06\x95\x40\xc8\x4d\x1c\xd8\x7f\x80\x5d\x3d\xdd\x04\x14\
+\xd8\x1d\xfc\x19\x4d\x1d\x45\x4f\x5d\xee\x96\x8f\xad\xec\x5a\x55\
+\x48\xad\xf3\x8c\xf9\xb5\x08\x68\xa4\x9d\xd2\xd4\x09\x8a\xe1\x6c\
+\xa3\x16\xf5\xed\x35\xe8\x00\x34\x1c\x10\xd2\x42\x34\x17\x2e\xc3\
+\x43\x05\x05\xf6\xf3\x61\x5b\x77\x2f\xda\xe3\xbf\x8c\xae\x37\xf0\
+\x00\x71\x83\xb9\x35\x40\xd0\xa8\x75\xa2\x39\x20\x48\x8d\xf5\xcb\
+\x4a\x5c\xec\xf5\xdb\x50\xd3\xd3\x42\x6a\x1d\x24\xea\x00\xbc\x3e\
+\x28\xdc\x05\x0c\x9d\x49\x46\x90\x6b\x38\x6b\x7e\x01\x09\x79\x78\
+\xb4\x79\x96\x80\xb2\x72\xc2\xb6\xf6\xec\x52\x06\xcd\x30\x24\xb7\
+\x67\xbb\xd6\xf8\xa7\xb7\xf7\xe6\xd7\x33\x70\xab\x6d\xed\x40\x07\
+\xa0\xf1\x6f\x7c\xe7\x2f\x29\x2d\xec\xc0\x86\xb6\x87\x33\x13\xdb\
+\x15\x43\x89\x7b\xe3\x02\x0a\x12\x93\x02\xd8\xe2\xad\xfe\xc6\x72\
+\x33\x36\xb3\xe0\x84\xd3\x13\x66\xae\x00\xae\x01\xd9\x41\xc1\xe5\
+\x19\xec\xe5\xed\x85\x1c\x84\xc3\x49\x81\x65\x64\x0d\xc6\x88\x20\
+\xb1\xc6\x1b\x5d\x74\x00\x1a\xd7\x0a\x38\xee\x8c\xf5\x9b\x78\x64\
+\x73\x60\xd1\xb9\x3d\x1f\xb3\xc7\x79\x53\xd9\xab\xc2\xf9\x8c\x95\
+\xc6\xb0\xb2\xfc\x59\x2c\xef\x40\x7f\xb6\x27\xa9\x1d\xdb\x78\x38\
+\x98\x25\x65\x75\xe1\x27\x89\xca\xd3\x44\xb5\xae\x6f\xb0\x27\x33\
+\x84\xb1\xe2\x25\x5c\xee\x9c\xfe\x82\x65\x6c\x6c\x7b\x5f\x31\x5c\
+\xd9\xc4\x43\xa9\xe1\x09\xa3\x3a\x00\x8d\xa4\xfc\xe8\xa9\x2e\xef\
+\x91\x82\x76\x66\x6d\xeb\xc4\x95\x0d\xa5\x6b\xc9\x8d\x63\x43\x59\
+\x5a\x62\x5b\xa3\xf2\x21\xa9\x67\xbb\x59\x9c\x2d\x88\xf4\x10\xdd\
+\x45\x09\x00\xe4\xc2\xbe\xbe\x6c\xfe\x24\xa7\x35\x8a\xe1\xfc\x83\
+\x1a\x9d\x19\xa0\x03\xd0\x08\xca\x8f\x0c\x75\xf2\xce\x4c\x0a\xbc\
+\x82\x15\xce\x1e\x2e\xad\x54\xf8\xd3\xf5\x8c\x3d\xfb\x9a\xb1\x27\
+\x6b\x4c\x20\x38\x9a\xdc\x99\x25\xa5\x77\x34\x02\x80\xbd\x8d\x48\
+\x0d\xcd\x63\x01\x0c\xab\xc2\x0d\xb0\xbb\x2b\x18\xbb\xbf\x9a\xdd\
+\x3b\xfb\x25\x23\xb7\xf2\x40\x31\x9c\x23\xe0\x5d\x13\x2b\xa0\x03\
+\xd0\x48\xca\xc7\xca\x36\x59\xed\x50\xfa\xab\x5c\xc6\x7e\x38\xcf\
+\xd8\x8b\x4c\x93\xe7\x8a\x72\x26\xb0\x94\x2d\xed\x8c\x00\xa0\xf5\
+\xac\xde\xd7\xa8\x0e\x06\x2f\x9c\x9d\x48\x20\xa5\xd1\x67\x1c\xe7\
+\x56\xe0\x74\x5a\x37\x36\x6d\xa4\xdd\x6f\x44\x43\xab\x5a\x2b\xa0\
+\x03\xd0\xc0\x66\x5f\x53\xf9\x90\x17\x07\x0c\xca\x97\xa2\xb2\x02\
+\x88\x0b\x32\x92\x03\xf9\xb6\xf6\x2d\xa7\xbb\xf2\x53\xc2\xb0\x93\
+\xc9\x1c\x80\xc4\x93\xc1\xec\xd8\x89\xe1\x8c\x55\x1c\x34\x7c\xc6\
+\xc3\x04\x1e\x0b\x24\x2f\xf7\xc1\x45\xa7\x7a\x2a\x86\x6d\x6e\x8e\
+\x3a\x00\xaf\x29\xe0\x3b\xb4\xa9\xdd\x21\x6e\xf6\xcd\x95\x0f\x65\
+\xab\x95\x0f\x29\x4b\x34\x79\x0d\x32\x03\x64\x03\x59\x25\xa3\x8c\
+\x03\x27\xb8\xb8\x65\xe5\x6c\x41\x08\x4b\x38\xd2\x81\x65\x1c\x1c\
+\xcc\xd8\xf3\x23\x86\xcf\x28\x4f\xe7\x59\xc1\xc9\x6d\xc1\xac\xad\
+\xa7\x32\x51\x74\x33\x5d\xaa\xaa\x0d\xe8\x00\x34\xcc\xad\xc9\xbe\
+\xf8\x80\xd8\x9c\x5d\x3d\x2b\x7d\x7e\x79\xb2\x41\xf0\x73\x45\xaa\
+\x25\x00\x15\x69\x16\x00\x20\xf0\x93\x87\x45\x9a\x1f\x18\x79\xac\
+\xa4\x3f\x8b\x4a\xf2\x62\xb9\xc7\xc7\x54\x02\xf0\xea\x0c\x77\x03\
+\xf9\x99\x43\xd8\xba\xf9\xee\xdf\x88\x56\x76\x6b\xa5\x8a\x13\xc4\
+\x74\x00\x1a\x20\xcf\xdf\xb1\xda\x6f\xe8\xe1\xa4\x0e\xb4\x1a\x0d\
+\x29\x1e\x0f\xf4\xd4\x66\x1e\x3e\xdf\x1c\x00\xbc\xc6\x0c\x00\x54\
+\x01\xb1\x67\x11\x8a\xbf\xf2\x3c\xd2\x38\x74\x0a\xd9\x77\xbd\x3b\
+\x8b\x88\x73\x67\xd7\x72\x26\xd1\xe7\xa6\x57\x7e\xce\xa3\x4d\xac\
+\xec\xea\x1c\x46\xf5\x05\x9c\x88\x56\xed\x91\xf3\x3a\x00\x0d\x10\
+\xf4\x1d\x48\x68\x53\x54\x44\xbe\xd8\xc4\xd7\xab\x03\x3d\x73\xe5\
+\x5b\x01\xc0\xfa\x6c\x61\x5f\xb6\x39\xab\x03\x9b\xbb\xde\x83\x95\
+\x5e\x9e\xcb\x5e\xde\x4d\xac\xfc\x1c\x72\x03\xb0\x02\xb9\xbb\x7b\
+\xb1\xc9\x34\xc4\x22\x9a\x53\x56\x0f\xc5\xd6\x01\xb0\xb5\xe9\x8f\
+\x6b\xf3\xfb\xec\x1d\x64\xfa\x1f\xaf\x34\x0d\xf4\x60\xf6\xa1\x5c\
+\xf8\xfa\x17\x64\xaa\x9f\xe5\x98\x02\xf0\x7c\x9f\x09\x00\x28\x14\
+\x65\x15\xf4\xd5\x9c\x2b\xdc\x71\xbe\x13\x5b\x9f\xd1\x96\x25\x51\
+\xc4\x0f\x00\xca\x6f\x2e\xab\xfc\x1c\xe1\x06\x6a\x1a\x0c\xea\x00\
+\xd8\xd0\xf4\x6f\x5e\xea\xdd\x27\x33\xb1\x3d\x7b\x71\x33\xc2\xe0\
+\xef\x8d\x4a\xc9\xad\x54\x6e\x49\x2a\x7b\x54\x98\xc1\xe5\x55\xe9\
+\xc9\xca\xd7\x7c\x7f\x54\xf5\x9a\x15\xec\xe2\xfe\x7e\x16\x00\x40\
+\xf9\x7b\xaf\x76\x63\xbb\xf2\x3a\xb3\x45\x5b\x7d\xd9\x89\xc3\xc3\
+\x39\x00\x10\xf6\x52\x05\xd4\x83\x75\xec\xd9\xcd\x48\x6e\x45\x14\
+\xc3\xd9\xc8\x1f\x28\x56\x0e\x94\xd6\x01\xb0\xdd\xcd\x71\x7f\x42\
+\x9b\xd3\xf9\x99\x94\xf2\x3d\x5a\x61\x50\xa8\x54\x08\x2c\x81\x4c\
+\xf1\x1e\xee\x36\x02\x50\x7e\xff\x88\x36\x00\xf4\xfe\xb3\x7b\x7a\
+\x5b\x00\x90\x71\x9b\xfa\x03\x67\x83\xd8\xa6\x63\x81\x2c\x3c\xa6\
+\x15\x7b\x78\x21\xac\x12\x00\x75\x1c\x50\x9a\xca\xad\x00\x7a\x04\
+\xe1\xe3\x1d\xe3\x45\xe7\xb1\x95\x96\x1b\xd0\x01\xb0\xd1\xea\xff\
+\x7a\xad\xff\xaf\x8e\x6e\x09\x62\xac\x28\xda\xa0\x44\x98\x74\xa9\
+\x90\xa7\x1b\x2a\x95\x5b\x71\x94\x3d\x29\xce\x64\xa5\x45\x07\x0d\
+\xae\x40\x0b\x00\x92\xec\xb4\x9e\x26\x00\x1c\xba\xd3\x9b\xed\x38\
+\x17\xcc\xb6\xe5\x06\xb1\xf0\xd5\xae\x6c\x6b\x72\x77\xa3\xf2\x2d\
+\xe2\x00\x64\x05\x04\x00\x2a\x83\xc9\xcb\xbc\xcf\xa9\x2a\x83\x8e\
+\x3a\x00\x0d\x73\x73\x42\xe0\x77\x9b\xae\x00\xca\x1e\x2e\x33\x28\
+\x11\x31\xc0\xfd\x65\x86\x7b\x75\x0d\x40\x2b\x00\xd4\x00\x20\x67\
+\x27\x9d\x64\x42\x3d\x00\x98\xfd\x03\x05\x74\xd8\xe5\x85\x4e\x5c\
+\xf9\xab\x76\xf9\xb0\x69\xf3\x9d\x59\xfe\xb1\x09\x26\x00\x98\xc4\
+\x01\x10\x02\x00\x35\x01\xe1\x06\x7e\x66\xad\x26\xa0\x03\x60\x83\
+\xd5\x9f\xb6\xda\x2f\xec\xc8\xe6\x20\xaa\xe0\x45\x55\x9a\xfa\x3b\
+\x8b\xd9\xa3\xcb\x91\xec\x79\x41\xb4\xaa\xf6\xbf\xc1\x3a\x00\x66\
+\x41\xe0\x8d\x63\x23\x58\x6a\x5a\x00\x99\x7c\xc3\xaa\x87\x24\x1d\
+\x0f\x64\x13\x22\xec\x58\xea\x86\xae\xec\xd6\xc9\x49\x26\x00\x58\
+\xc4\x01\x54\x15\xd4\x70\x03\x6e\xe6\x6e\x40\x07\xc0\x96\xab\xff\
+\xde\x92\x4a\x25\xde\x5b\xca\x01\xf8\xa1\x68\x71\xe5\x63\x65\x89\
+\xd6\x01\x30\x4b\x03\x6f\x9d\x18\xcd\x52\x76\xf8\x1b\x95\xbf\x35\
+\xbb\x03\x9b\xb5\xd2\x99\xcd\x98\x63\xcf\x4e\xed\x18\xcc\x6e\x9e\
+\xf8\xd2\x12\x00\x75\x1c\x80\xfe\x80\xcc\x06\xaa\x70\x03\x3a\x00\
+\x36\x5a\xfd\xdf\x17\x7c\x65\x08\xfe\xac\xb4\x79\xad\x56\x00\xad\
+\x00\x50\x70\x72\x8c\x11\x80\xd4\x33\x1d\xd9\xe2\x64\x0f\x36\x61\
+\x8e\xc2\x12\xa2\xdc\x39\x00\x5a\x16\xe0\xd5\xbd\x24\x55\xe0\x69\
+\x68\x0e\x21\x1b\x10\x45\xa1\x10\x92\x36\x22\x1b\xd0\x01\xb0\xd1\
+\xad\xe9\xc1\x8d\x86\xd5\xff\xc3\x9d\xa8\xaa\x95\xaf\xae\x08\xd6\
+\x00\x80\xdb\x59\x04\x40\x8a\x1f\x07\x60\xed\x5e\x3f\x36\x8e\x94\
+\x1f\xbf\xdc\x97\x25\x2f\xf1\xe5\x00\x14\x64\x59\x02\xf0\xfc\xd6\
+\x22\x43\x1d\x40\x95\x0e\xca\x0e\xe1\xf0\x3e\xca\x42\x55\x51\xc8\
+\x4e\x07\xc0\x06\xab\x9f\x4c\xeb\x70\x44\xfe\x7c\xf5\xdf\x5f\x62\
+\x53\x00\x2a\xae\x85\xb3\x64\x9a\x18\x5e\xf5\xb5\x1f\x1b\x1b\xae\
+\xb0\x94\x4d\x5d\xd9\xce\x58\x1a\x23\x8f\xed\xc0\xce\xec\x1e\xc6\
+\xae\x1f\x9b\x68\x09\xc0\xcd\x05\x06\xd3\x6f\x56\x15\x44\x6f\x60\
+\xf9\x6c\xd7\xdd\xf4\x9d\xbb\x2b\x66\x57\x17\xd1\x01\xa8\x47\xde\
+\xbf\x77\xbd\xff\x7f\x22\xef\xaf\x91\xf9\xaf\x0e\x00\x59\x29\x54\
+\x01\x90\xb0\xc2\x8d\x8d\x9c\xa9\xb0\x55\xab\xdb\xb2\x73\xfb\x86\
+\xb1\x2d\x4b\xbc\xd9\xc1\x4d\xbd\xd8\x85\xf4\x51\xec\xda\xd1\x09\
+\x16\x00\x7c\x4f\x51\x3f\x1f\x0e\x91\x56\x40\x54\x05\x91\x0e\xee\
+\x58\xe5\x77\x95\xbe\x73\x5f\xc5\xec\x82\xd4\x3a\x00\x75\xac\xf9\
+\xaf\x9a\xdb\xea\xc3\x8c\x0d\x6d\x58\xc5\xf5\x79\x22\xfa\x5f\x6d\
+\x98\xf0\xc1\x7d\x5d\x00\x30\x6b\x07\x3f\xbf\x39\x87\xad\x8d\x6a\
+\xc9\x62\x56\xb5\xe1\xca\x87\xac\x99\xd3\x94\x9d\x48\x0d\x61\x97\
+\x0f\x8d\xe5\x00\x3c\x38\x3f\x9b\x95\xe4\x85\xb3\xfb\xe7\xc3\xd8\
+\x93\x2b\xf3\x0c\x01\x27\xc6\xc3\xca\x4d\x9b\x43\xaa\x38\x60\x90\
+\x48\x07\x9b\xe9\x00\xd4\xef\xe6\xb0\x67\x5d\xc0\xef\xce\xef\x1d\
+\x60\x58\xfd\x77\x97\x93\x72\x77\x91\xec\x36\xdc\x3f\x59\x6b\x13\
+\x00\x76\xae\x0e\x30\x2a\xff\xc4\xb6\xfe\x2c\x61\x7e\x4b\xee\xff\
+\xa1\x7c\xc8\xdd\xb3\x33\xd9\xe5\x23\x93\xb8\xdc\xbf\x30\xa7\x72\
+\x3e\x10\xbe\xdf\xcc\x0d\x60\x46\xa0\x67\x07\x65\xae\x88\x03\x5a\
+\xc8\x38\x40\x07\xa0\x1e\xa9\xdf\xfd\x73\x93\x85\xf9\xdf\x24\x94\
+\x2f\xa4\x6c\x73\xbd\x01\xc0\x1c\x41\x52\x74\x4b\x23\x00\xe9\x09\
+\x9d\x79\x00\x98\xbb\x67\xb8\x11\x80\xfc\xa3\xa1\x5c\xf9\xd7\x4f\
+\x4e\x63\x0f\xf2\x22\x4c\x06\x44\x79\x16\xc0\x0b\x4c\xa7\x8c\x03\
+\xa3\x13\x06\x2b\xb1\x62\x46\xc0\x5d\xd6\x03\x74\x00\xea\xd2\xef\
+\x5f\xe5\x17\x2a\x83\x3f\x0e\x40\x69\x92\x19\x00\x49\xb5\x07\x40\
+\xe3\xf5\x5b\x97\xba\x1b\x01\xd8\x1e\x43\xa7\x9c\xae\x0d\xa6\xd1\
+\xf1\xd1\x46\x00\x0a\xb3\xa7\xb2\x9b\xa7\x66\xb0\x3b\xb9\xe1\xac\
+\xfc\x46\x94\x29\x00\xea\x60\x90\x06\x46\x0b\x28\xab\x58\x36\xcb\
+\x75\x8f\xe8\x0e\x1a\xaf\x97\xa4\x03\x50\xa7\xe0\x2f\xe0\x6b\x19\
+\xfc\x19\x00\x88\x35\x4c\xf4\x40\xf9\x15\x3b\xac\xc7\x01\xb5\x04\
+\x20\x65\x99\x3b\xbb\xb0\x7f\x04\x07\x20\x31\xda\x83\x07\x80\x57\
+\x8f\x7c\xa1\x02\x60\x4a\xa5\xdf\x37\x17\xb5\x1b\x20\x0b\x85\x40\
+\x70\x7b\x8c\xef\x9f\x14\xc3\x55\x4b\xfd\xc4\x0e\x22\x1d\x80\x3a\
+\xdc\x9a\x65\x6c\x08\xf8\xee\xe9\x95\x30\x15\x00\x31\x35\x13\x6b\
+\x95\x40\x75\xbb\xd8\x0c\x80\x2b\x99\x63\x28\xed\x1b\xc2\x03\x40\
+\xb5\xf9\xbf\x71\x3c\x94\x02\x40\xf2\xfb\xf7\x62\xb4\x01\x80\xc8\
+\x6c\x80\xac\x41\xe9\xe5\x59\x8c\x1a\x56\x77\xcc\x0b\x42\x3a\x00\
+\xb5\x34\xff\xdb\x62\x7c\xbf\x3c\x99\xda\xb5\x52\xf9\x45\x0b\x6b\
+\x0e\x80\xd6\x30\xa8\xc6\x58\xb8\x1a\x80\x6b\x47\xc7\xb1\xcc\xcd\
+\xbd\x58\xd2\x22\x2f\x82\x61\x9c\x51\xf9\xf7\xce\x85\xb1\xb2\x02\
+\x74\x19\xc9\xf2\x3c\xdc\xa0\x0d\x80\x9c\x15\xa4\xa9\x61\x55\x63\
+\x08\x17\xce\x0c\x14\x8d\x21\x1d\x80\xda\x4e\xfc\xec\x5e\xeb\xbf\
+\x39\xef\xc0\xa0\xaa\x01\xb8\xbf\xcc\x3a\x04\xe6\xf3\x80\x2f\x4f\
+\x5a\x6c\x0c\x91\x92\xb1\x31\x88\xe5\x65\x0c\x63\x47\x92\x7b\xb2\
+\xfd\x1b\xba\x18\x95\x7f\x37\x77\x3a\x2b\xb9\xbc\x98\x3d\xb9\x29\
+\x00\x78\xb4\x45\x1b\x00\x19\x07\x88\xf6\xb0\x00\x60\xb8\x62\x38\
+\xd4\xa2\x85\x0e\x40\x1d\xa2\xff\xfd\xf1\x01\xf9\x32\xfa\xb7\x00\
+\xe0\xe1\x72\x56\x7a\x65\x3e\x6f\x02\xe1\x1e\xff\xb6\x50\x2c\x6a\
+\x05\xaf\xb2\x2b\x07\x45\xac\x28\x1f\x72\x30\x31\x98\x03\xb0\x2f\
+\xae\x3d\x3b\xbd\x6b\xa0\x51\xf9\xf7\xce\xce\xa0\xdc\x3f\x9c\x3d\
+\xb9\x11\x6f\x00\xe0\x41\x9c\x36\x00\xa5\xa9\x26\x00\xa0\x24\xdc\
+\x2d\x50\x89\x10\x9d\x41\x5e\x12\xd6\x01\xa8\xc5\x6d\xf2\x30\xc5\
+\x0f\xc5\x1f\xa9\x7c\x73\x00\xbe\xbf\xbd\x88\x2b\x5f\x8a\x49\x2b\
+\xb8\x0e\x02\x00\xb2\x77\xf6\xa3\xf4\xcf\x8d\xe5\x1f\x1e\xc7\x8a\
+\xcf\x4c\xe3\xca\x57\x0b\x14\x8b\x40\xf0\xfb\xdb\xd1\x96\x00\xa0\
+\x25\xac\x02\x00\xa9\xe0\x90\x5e\xca\x12\xfa\xaf\x74\x91\xa9\xa0\
+\x0e\x40\x2d\xfc\x7f\xd2\x12\xaf\x11\x6a\xff\x6f\x0e\x00\x14\xae\
+\x06\x00\x40\x54\xeb\x12\xaa\x01\x60\x57\x6c\x00\xb9\x82\xce\xd4\
+\xd6\x9d\x6a\xa1\x7c\xc8\xcb\xc2\x45\xac\xf8\xec\x1c\x9e\x0a\x96\
+\xe6\xcf\xaf\x16\x80\xc1\x3d\x95\xa5\x8a\xe1\x08\x1b\xec\x17\x70\
+\xd0\x01\xa8\x45\xf5\x8f\xb6\x76\xff\x5a\x56\xff\x34\x5d\x00\x0d\
+\x73\x3e\xb9\xfa\x15\x57\x3e\xee\xa1\x78\xf9\x6f\xab\x2e\xa1\x1a\
+\x00\x72\xf7\x0c\xe1\xbd\x7f\x2d\xe5\x43\xf0\xf9\x50\x3e\xc4\xa2\
+\x18\xa4\x01\xc0\xa0\x9e\xca\x32\x55\x53\x48\x07\xa0\x36\xf9\x3f\
+\xe5\xd1\xeb\xd4\xf9\x7f\x75\x69\xa0\x9c\x0a\xaa\xab\x4b\x90\x00\
+\x14\xe5\x4c\xd3\x54\x7e\xc9\xc5\x30\x13\x0b\x50\x72\x29\x82\xff\
+\x0e\x29\x2f\x6e\x2f\xd1\x01\xb0\x65\x00\x98\x1e\x1f\x70\xa6\x28\
+\x67\xa2\x25\x00\xe6\x73\x7f\x36\x04\x00\xc1\x9f\xb5\xd5\xff\x88\
+\x1a\x41\x56\x6b\x00\x6a\x0b\x80\xcd\xa3\x3a\x00\xf5\x2f\x00\xed\
+\x5e\xeb\x97\xab\xce\x00\x8c\x00\x94\x58\x31\xed\x2a\x97\x50\x17\
+\x17\x70\x66\xf7\xa7\x74\x56\x40\x2f\xeb\xe6\xff\xca\xdc\x9a\x01\
+\x20\xc6\xc3\x74\x00\x1a\x0a\x80\x7b\xd5\x0c\x83\x54\xa1\x78\x75\
+\xe6\xc0\xeb\xf9\x2a\x6b\x22\x01\xb8\x73\x7a\x8a\x26\x00\xe5\xd7\
+\xe7\xd7\x0c\x00\x34\xab\x44\x1a\x28\x00\xe8\xa6\x07\x81\xb6\x04\
+\xa0\xa8\x96\xe9\x1e\x3f\x19\x64\x17\xcf\xe1\x4b\xaf\x2d\xb5\xea\
+\x26\x24\x00\x98\xfe\xd1\x4a\x01\xf9\x00\x48\x55\x00\xc8\x42\x10\
+\x35\x83\x54\x85\xa0\xb1\xea\x8e\xa0\x0e\x80\x0d\x00\xa8\x2a\x0e\
+\xd0\xee\x09\x88\xee\xe1\xa3\x1d\x54\xce\x4d\x30\x01\x80\x5b\x01\
+\xb9\x37\xe0\xeb\x01\x1c\x00\x54\x00\x01\x81\x2c\x02\x41\x1e\x5e\
+\x98\x65\xa2\x6c\x04\x83\xea\x00\x90\x83\x84\x59\x00\xd1\x0e\x56\
+\x95\x82\x47\xe9\x85\xa0\x86\x00\xe0\x81\x38\x07\xe0\x69\x7c\x65\
+\x5b\x18\x3f\x6b\x5a\x00\xf1\x1a\xb2\x00\x4f\xae\x2f\xb7\x6a\x01\
+\xb2\xd3\xfa\x19\x01\x90\xdd\x3f\x09\x40\xd9\xb5\xc8\xaa\x57\xbf\
+\x9c\x09\x10\x03\x21\x68\x06\xa5\xae\xf0\xb9\xae\x2a\x05\xbb\xea\
+\xa5\xe0\x5a\x02\xb0\x67\x9d\xbf\x75\x00\x64\x3d\x00\x9b\x42\x25\
+\x00\xe5\x29\x55\x37\x86\x48\xd4\xc5\xa3\xb2\x6b\x0b\x4c\x2c\x89\
+\x39\x00\xb2\x1e\x70\xff\xdc\x4c\xeb\x6d\x60\x29\x98\x0d\x54\xf9\
+\x7f\xec\x0f\x58\xff\x95\xfb\x69\xfa\x7f\x7c\xa6\xda\x25\xa4\x03\
+\x50\x3b\x0b\xe0\x7f\x14\x23\xe0\x52\xe9\x4f\xf3\xe7\x51\x0e\x3e\
+\x8b\xdd\xa3\xd9\xbc\xb2\x6b\x11\x86\xc1\xd0\x9a\x58\x00\x8d\x6c\
+\x41\x2b\x50\x34\x07\x00\x02\x00\xf8\xf4\x6f\x75\xab\xff\xf1\x16\
+\xa3\xf9\x97\x3b\x84\xe6\x4e\x68\x9a\xa6\x18\xce\x2a\x36\x1e\x1a\
+\xa1\x03\x50\xf3\x9b\x33\x99\xd0\x38\x59\x08\x7a\x76\x23\x92\xdd\
+\xca\x9e\x6e\x94\xdb\xa7\x67\x50\xde\xbf\xd0\x64\x75\x57\x15\xf1\
+\x3f\xbb\xb9\xb0\xda\xb8\x01\x00\x1c\x4f\xed\x63\x54\x3e\x86\x41\
+\x0a\xb2\x0d\x13\x40\x28\xfe\x68\xd6\xff\xa5\x20\xf7\x17\xe9\x9f\
+\x9c\x09\x0c\xf6\xe7\x7b\x03\x7e\xa2\xde\x21\xa4\x03\x50\x8b\x4d\
+\x20\xf1\x51\x1e\xd3\x4e\xed\xe8\xc1\x01\xc0\x8a\x57\x03\x00\xe1\
+\x56\xa0\xc4\xca\x78\x38\x29\x41\xed\xeb\x21\x28\x14\x55\x05\x40\
+\x7a\x7c\x07\x5e\x09\x84\xf2\xb1\x11\xe4\x76\xf6\x34\x56\x70\x7a\
+\x96\xf5\xd2\xaf\x14\x44\xfd\x18\x06\x81\x1b\xa0\x7f\xe3\xc8\x98\
+\xf4\xf8\x36\x7f\xa5\xff\xc3\x18\x75\x1f\x40\x07\xa0\x96\xb3\x00\
+\xd3\x47\xd9\x7f\x84\x03\x20\x00\x40\xc5\xf5\x48\x0b\x00\x60\x15\
+\xac\x0d\x88\x98\x57\x05\xcd\x23\x7e\x2d\x39\x9e\xd2\x95\x36\x89\
+\x8e\x67\x8f\x2f\xcd\xe1\x73\xff\x45\x67\x66\xb2\x1b\x59\x33\xac\
+\x03\x80\xe9\xa0\xc7\xd4\x02\x7e\x41\xa6\xff\xf9\x49\xe3\xa0\xc8\
+\x8d\x63\xc3\xa5\xff\x1f\xaa\x18\xce\x0f\x74\xd5\xa7\x82\xeb\xd0\
+\x0d\xc4\xee\xda\xf4\xb8\x80\xe2\x47\x17\xa7\x73\x08\x4a\xa9\x12\
+\x57\x48\x4a\x81\xe0\x67\x63\x40\xa8\xb1\x4b\x08\x41\x9b\x39\x00\
+\xc6\x6e\xa1\x15\x81\xb5\xb9\x7d\xaa\x72\x07\x10\x40\xb8\x9d\x53\
+\x69\x01\xb8\x1b\x31\x06\x7d\xd8\x8a\xbe\x9d\x5c\x0f\xe6\x0e\xaf\
+\x18\xee\xf9\xb4\x50\x02\x2f\x00\x75\xf4\x55\x16\xd3\xf7\xef\xaf\
+\x98\x1d\x1a\xa5\x03\x50\x8b\xcd\x20\x58\x39\x69\xab\x7d\xff\x43\
+\x3d\x11\xa4\x25\x2f\x6f\x2f\xb0\x74\x05\xe4\xef\xb1\xe2\xad\x45\
+\xfc\x5a\x81\xa1\x39\x00\x10\xa4\x7f\xc8\x1c\x90\xf7\x9b\x9a\xfd\
+\x75\x06\x85\x63\xf5\x57\x64\x1a\x7e\x26\x79\x74\x75\xa5\x34\xff\
+\x63\x45\x05\x50\xdf\x1a\x56\x9f\x40\x90\xce\xdf\x9b\xa1\x1e\x09\
+\xb7\x26\x7c\xb3\xa8\x96\x82\x11\xed\xd7\x64\x3e\x80\xfa\x0b\xd6\
+\x00\x30\xa6\x79\x30\xf7\x50\x34\x94\x8f\xa9\xa0\xa7\x7b\x29\xf2\
+\xcf\x35\x2a\x9f\x95\x6c\x63\xd7\xb3\xc2\x18\x0d\xb2\x6c\x15\xe9\
+\x5f\x7b\xb5\xf9\xd7\x01\xa8\x43\x4b\x98\xc4\x73\x5f\x5c\xc0\x5d\
+\x6b\xf5\x80\x5a\x97\x88\x65\xda\x88\x31\x31\xcc\x07\x96\x6f\x31\
+\x3c\x4e\x85\xa5\xf4\x38\x7f\x8b\xfd\x7f\xd8\x02\x66\xac\xf3\x4b\
+\x45\x63\x26\x10\x40\x60\xf5\x4b\xd3\xff\x78\x07\x2b\xbd\xb1\x9e\
+\x1d\x4f\x1b\x86\xd5\x3f\x5e\xb1\x72\x80\xb4\x0e\x40\xed\xe3\x80\
+\x16\x5b\x97\x7b\x6f\x90\xd9\x40\xb5\x10\x14\x2f\xaa\xba\x18\x04\
+\xe5\x7f\x7f\x98\x00\x38\x6d\x90\x97\x27\x0c\x50\x50\x83\x49\x0b\
+\x00\xd4\x1d\x90\x02\x16\x5f\x88\x62\xe5\x77\xb6\x70\x45\x1b\xa7\
+\x82\x01\x05\xe2\x00\x02\xe0\xe5\xfd\x14\x96\x97\x19\xca\xa6\x8c\
+\x6c\x8a\xd5\x3f\x44\x54\xff\x5a\xea\x27\x84\xd8\x60\x2e\x20\xc8\
+\x4f\x09\xa6\xd9\x80\xb2\x9a\x58\x81\x2a\x21\x90\x3d\x81\x17\x19\
+\x95\x00\x00\x06\xaa\x20\xbe\xa2\x38\xc2\x1c\x80\x87\x17\xc2\xf9\
+\x56\xb0\xc2\x33\x61\x3c\x08\x2c\x3a\x17\xc1\x4a\xaf\x9a\x55\x04\
+\x29\x18\x7c\x55\x1c\x43\x33\x84\xa3\x71\x29\x99\x3f\xd3\xf7\x1d\
+\x27\x56\xbf\x8f\xdc\x0c\xa2\x03\x50\xcf\xd1\x30\x92\x56\x5b\x96\
+\x7a\x6d\xca\xd6\xb0\x02\x48\x0f\x51\x14\x82\xe0\xe7\x2a\x21\x28\
+\x53\x6d\x29\x7b\x9e\x6e\x10\xbe\xbb\x68\x1b\x7b\x74\x71\x1a\x3b\
+\x99\x6a\x7a\x12\xd8\x9d\x1c\xc3\x66\xd0\xea\x6a\x01\xf7\xcf\x4e\
+\x63\x47\xb7\xb4\x47\xe4\xff\x6b\xb1\x23\xd8\xea\xd1\xf1\x3a\x00\
+\x75\xcb\x06\x90\x46\xbd\x4f\x5b\xc4\xee\xdd\x38\x36\xd2\x04\x80\
+\x87\x17\xc3\x8d\x75\x81\x7b\x34\xba\xfd\xc3\x7d\x32\xcf\x0f\xb7\
+\xf2\xfb\x1f\xee\x44\x9b\x06\x86\xbc\x2d\xbc\xdb\x52\xca\x36\x51\
+\xf0\x37\xce\x02\x00\x98\x7f\x00\x20\xf7\x03\xca\x31\x30\xb5\xf2\
+\xcb\xae\xce\x63\xa7\xb6\x77\x61\x61\xe3\x1d\xff\xa8\x18\x0e\x89\
+\x44\xe1\xc7\x53\xd1\x4f\x0a\xb5\xb9\x15\x68\x49\xe7\x02\x4f\xca\
+\x4c\x0c\x64\xea\x6d\x62\xa8\x07\x48\x00\xd0\xe9\x83\xf2\xa5\xfc\
+\x70\x77\xbd\x48\x11\x55\x75\x7f\xec\x24\x56\x2b\x1f\x0d\x24\x82\
+\x04\x25\xe7\xbc\x03\x43\x2c\x62\x80\x1b\x27\xa7\xf2\xdd\xc0\x5a\
+\xe5\x60\xcc\x07\x64\xef\xe8\xce\xd6\x45\xba\x9f\x11\xa6\xbf\xb7\
+\xc8\xfb\xad\x5e\x64\x52\x07\xa0\xee\x56\x00\xd1\xf4\x7b\x49\x8b\
+\xbd\x76\x9e\x48\xe9\x62\xe1\x06\x20\xaf\x8a\x63\x4d\x01\xb8\x17\
+\x6f\x7c\xcd\xab\xc2\x85\x7c\x8c\x9b\x8f\x8a\xdd\x5f\x69\xb0\x06\
+\xf2\x5c\x01\x02\xe4\xcc\xae\xde\xec\xda\x91\x51\x16\x00\x40\xb0\
+\x27\x10\xb5\x00\x75\x47\xf0\x15\xd5\x05\xf2\x0e\x84\x48\xbf\x3f\
+\x5d\x34\x7d\x02\x85\xe9\x77\xb0\xf6\x1f\xd1\x01\xa8\x5f\x46\x80\
+\x96\x6a\x1b\x9a\x13\xf8\xd6\x7c\x5c\x9c\x17\x84\x0a\x49\x41\x0f\
+\xb6\x18\x01\x78\x79\x67\xa9\xf1\xb9\x12\x5e\xd5\x9b\xc1\x1e\x5c\
+\x9c\x6b\x59\x12\xa6\x4a\x22\x4e\x1e\x2b\xca\x99\xac\x09\x00\x3f\
+\x19\xb4\xb0\x72\xe5\x3f\xbf\xb5\x40\xad\xfc\x7f\x24\x19\x28\x0e\
+\x82\x70\x57\xf4\x2b\x86\x34\x6c\x7f\x00\x01\xe1\xc0\xee\x4a\x08\
+\x6d\x19\x2b\x53\xb7\x8a\x2b\xab\x82\xd1\x5c\xf1\xb8\x57\x3f\x8e\
+\x56\xb2\x74\x15\xa5\xf9\x11\x95\x27\x8c\x92\x3c\xbb\x31\x8f\xed\
+\x5d\xe7\x67\x55\xf9\xb2\x1e\x00\x93\x5f\x4e\x0d\xa8\xd3\x69\xdd\
+\xa5\xf2\x67\x90\x0c\x16\x13\x3f\xf2\xd2\x71\x76\x3a\x00\x0d\xef\
+\x0a\x3c\xc7\x0d\x54\xc6\xa5\x5b\x81\xc0\x9a\xc0\x4d\xa0\x83\x68\
+\xfe\xf8\xa5\x83\xc3\x68\x24\xbc\x4b\x95\x00\xf0\xac\x20\x3b\x94\
+\x1d\xdf\x1a\x84\xab\x83\xe4\xd0\x77\x98\x20\x56\xfe\x87\x22\xe8\
+\x73\x52\x6a\x70\x19\x59\x1d\x00\xdb\x65\x05\xde\xa3\xfa\x2b\xbf\
+\xa0\x2a\x61\x79\x6d\x20\xd0\x92\x8c\x8d\xb4\x27\x30\x6d\x80\x55\
+\xc5\x97\x5c\x9c\xcd\xd0\x8f\x38\xb8\xb1\x5d\xc5\xa4\x61\x4a\x0a\
+\xfd\xee\x9f\x8b\x46\x4f\x07\xd1\xea\xad\x91\xf2\x75\x00\x6c\x1b\
+\x0f\x20\xd2\xf6\x91\x10\x54\xd7\x30\xb2\x26\x4f\xf3\xc3\xe9\x6c\
+\xa0\x56\x64\x05\x46\x6b\x2a\xff\xfa\xd1\xd1\x2c\x6b\x5b\x67\x96\
+\xb2\xc2\xe7\x86\xab\x83\x12\x29\x66\xfc\x3e\x16\x63\x5e\x6e\x35\
+\x31\xfb\x3a\x00\x0d\x0b\x81\x2f\x20\xa0\x7d\x84\x05\x88\xe4\x71\
+\x8c\x5c\x6d\x00\x38\xbf\x6f\x10\xdb\xb3\xbe\x83\xc5\x39\x80\xb7\
+\x4e\x8c\xe7\x27\x88\xd3\x15\x49\xfe\x2a\x9a\x3b\x3f\x17\xa7\x7d\
+\x74\x11\x47\xbe\xb8\x2a\xfa\xd5\xc3\x95\x1f\x0b\x04\x3e\xce\x76\
+\x4a\xbf\x94\x15\xde\xa7\xd1\x39\xac\x69\xc9\x18\xb0\xa4\xad\xf2\
+\x35\x4e\x01\x61\x0c\xfc\xca\xa1\xe1\x34\x18\xd2\x49\xad\xf8\xf1\
+\xa2\xb6\xdf\x4b\xa4\x79\x1e\xe2\x77\x3a\xd4\xe5\x0b\xeb\x00\x34\
+\x1c\x04\x38\x89\x2b\x98\x8e\x68\xdd\x28\x5d\x42\x75\xd6\x20\x87\
+\x2c\xc6\xfe\x84\x20\x96\xb5\xa3\x3f\x5d\x02\x36\x98\xe1\x2c\x82\
+\x4d\x8b\x3c\xf3\xe8\xe2\x4f\xc9\xa2\xb0\x33\x44\x98\xfb\x0e\xa2\
+\xb3\xd7\x42\xa4\x79\x76\x75\xfd\xb2\x3a\x00\x0d\x07\x81\x93\x08\
+\xc8\x02\x69\x18\x73\x34\xed\x2c\xbe\x7c\x68\x53\x20\xd3\x0a\x10\
+\x01\x06\xdc\xc5\xfe\x78\x7f\x96\xba\xdc\x83\xad\x9c\xed\x92\x47\
+\x67\xfc\xef\x6c\xe5\xc8\x0f\x76\xfc\x99\x30\xf5\x3d\x85\xe2\x7d\
+\x44\x57\xcf\x49\xa9\xe1\x25\xe2\x75\x00\x5e\x5f\x76\xe0\x28\x56\
+\xe9\xfb\xf0\xd5\x63\x43\x94\x48\x3a\x5f\xf8\xc1\xd1\xe4\x60\x86\
+\xc2\x11\xca\xbd\xb8\xc7\x9c\x61\xec\xbc\x56\x39\x5d\xdb\x2a\x31\
+\xf4\xba\x5f\x92\x8c\x10\x29\x1d\x26\x78\x3b\x8b\x00\xef\x3d\xf1\
+\x59\x36\x51\xbc\x0e\x40\xe3\xf6\x0d\x9a\x09\x5f\xdd\x8e\xe4\xa3\
+\xbe\x9d\x94\x59\x51\x53\x9c\xb7\xe2\xe0\x46\xea\x27\x6c\x77\x73\
+\x52\xc2\x84\xd2\x7f\x2a\x56\x7a\xb0\x62\xb8\xd2\x97\x8f\xa8\xe6\
+\xb9\x08\x98\xec\x6d\xfd\xe5\x74\x00\x1a\xd7\x1a\xb8\x8a\x95\xdc\
+\x4e\x44\xef\x3d\xc5\x2a\xff\x48\x14\x70\x3e\x10\xcf\xb7\x14\xd0\
+\x34\x15\x00\xd9\x35\xd4\x17\xd3\x01\x68\xfc\xd8\x00\x20\x34\x17\
+\x2b\xfb\x3d\x11\xcc\x79\x89\x1c\xbe\x59\x43\xad\xf4\x1f\x03\x00\
+\xff\x0f\xd3\x6f\xac\x3c\x76\x92\x4b\x90\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x06\xdf\
+\x00\
+\x00\x1a\x81\x78\x9c\xdd\x58\x59\x6f\xe3\x36\x10\x7e\xdf\x5f\x21\
+\x38\x2f\x1b\xd4\xa2\x78\x1f\xce\x51\xf4\x40\x8b\x16\x8b\xb6\xe8\
+\x76\xd1\x67\x45\xa2\x1d\x35\xb2\xe4\x52\x72\x8e\xfe\xfa\x0e\x29\
+\x1f\x52\xac\x6c\x9c\xdd\xb4\x40\x9b\x3c\x48\x1c\x0d\xe7\xe2\xc7\
+\x39\x7c\xfe\xe5\xfd\xb2\x8c\x6e\xad\x6b\x8a\xba\xba\x98\x10\x84\
+\x27\x91\xad\xb2\x3a\x2f\xaa\xc5\xc5\xe4\xc3\x6f\xdf\xc5\x7a\x12\
+\x35\x6d\x5a\xe5\x69\x59\x57\xf6\x62\x52\xd5\x93\x2f\x2f\xdf\x9c\
+\x37\xb7\x8b\x37\x51\x14\xc1\xe6\xaa\x99\xe5\xd9\xc5\xe4\xba\x6d\
+\x57\xb3\x24\x59\xad\x5d\x89\x6a\xb7\x48\xf2\x2c\xb1\xa5\x5d\xda\
+\xaa\x6d\x12\x82\x48\x32\xd9\xb3\x67\x7b\xf6\xcc\xd9\xb4\x2d\x6e\
+\x6d\x56\x2f\x97\x75\xd5\x84\x9d\x55\x73\xd2\x63\x76\xf9\x7c\xc7\
+\x7d\x77\x77\x87\xee\x58\x60\x22\xc6\x98\x04\xd3\x84\xd2\x18\x38\
+\xe2\xe6\xa1\x6a\xd3\xfb\x78\xb8\x15\x6c\x1c\xdb\x4a\x31\xc6\x09\
+\x7c\xdb\x73\x1e\xc7\x35\xbb\x2f\x8b\xea\xe6\x49\x63\xc2\xd7\xc0\
+\x3d\x88\xa6\x27\x14\xf9\xc5\x04\x44\x29\x2d\x78\x58\x5f\xdb\x62\
+\x71\xdd\x5e\x4c\xa8\x90\x61\x7d\x57\xe4\xed\x75\xb7\xbc\x84\xf5\
+\x79\x6e\xe7\x8d\xa7\x77\x3b\xfd\x0a\xb6\x76\xdf\xe0\x2b\xe8\xb1\
+\xa9\xfb\xde\xa5\x79\x01\xd1\xed\xf8\x3a\xce\xe1\x17\x25\x94\xda\
+\xec\x81\x5d\x4d\x5b\xaf\xb6\xbc\x1b\x8b\x80\x02\x3c\x66\xb2\x27\
+\xd7\xf3\x79\x63\xc1\x30\xdc\xa3\x35\xed\x43\x69\x3b\xee\x38\xab\
+\xcb\xda\xcd\x4e\x70\xf8\x3b\x0b\xa4\x7a\x95\x66\x45\xfb\x30\xc3\
+\x88\x11\xa6\xa8\x10\x67\x93\x28\x79\x56\xab\x26\x23\x5a\xc9\xc7\
+\xb5\xce\xc3\xdf\x50\x2b\xd9\x29\x3b\x4f\x86\xde\xbf\x30\x58\x82\
+\xc8\x27\x83\x35\x62\x8b\x92\xb9\x22\xea\x91\x2d\x67\xcf\x44\x72\
+\xeb\x3e\xe8\x32\x4f\x07\x69\x44\x9b\xc0\xc6\xe2\x63\xb4\x91\x51\
+\x6d\xea\x15\xa3\xa4\xf9\xf1\x51\xba\xbb\x2e\x5a\xfb\xc9\x31\xd2\
+\xf2\x25\x31\x1a\xd1\x85\x8f\x8f\x90\xd6\xaf\x17\x21\x45\xff\xad\
+\x08\x29\xfe\xef\x45\x48\xc9\x4f\x8b\xd0\x03\x05\x89\x0a\x61\xca\
+\x79\x2f\xd3\xdc\x7b\xaa\x44\x52\x28\x81\xc5\x8e\xfa\x40\x80\x8a\
+\x91\xd6\x4c\x6a\xb6\xe7\xf5\x54\x81\x30\x21\x4a\xed\xa9\x8b\x8d\
+\x9e\x0f\x55\xd1\x42\xfe\x5e\x37\xd6\xbd\x07\xaf\xec\xcf\xd5\x87\
+\xc6\x4e\x9e\x3e\x1f\xcd\x88\xda\x8b\xf6\x29\x7b\x76\xed\x2c\x94\
+\x98\x93\x91\xe4\xb9\xf3\xd8\x13\xd3\xf2\xb1\x6f\xee\x62\xa2\x90\
+\xd0\x46\x12\xc6\x77\x32\xe7\x0f\x90\xc8\x31\xe2\x04\x6f\xb3\x7d\
+\xa0\xde\x07\x27\x34\x78\x8c\xf5\x8e\x9a\x8d\xf2\x66\xa3\xbc\xc7\
+\x3b\x3c\x34\x16\x1c\x36\xc7\x38\x1c\x12\xe0\xf3\x0e\x0b\x64\xa4\
+\x56\x62\xe0\x2e\x21\x88\x81\x07\x42\x0f\xdd\xe5\x08\x0b\xa9\xc5\
+\xc0\xdb\x43\xd6\x6c\x8c\x75\xeb\xec\x6f\x2e\xad\x9a\x79\xed\x96\
+\x17\x93\x65\xda\xba\xe2\xfe\x6d\xcc\x11\x54\x66\xca\x88\x98\x62\
+\x24\x8c\x60\x1c\x33\x78\xa3\x46\x68\xce\xe9\x94\x22\x6c\xb4\x61\
+\x5a\x4e\x63\xaa\x38\x92\x5a\x6b\x3a\x8d\x89\x46\x8a\x51\x43\xf5\
+\xe9\x2b\x84\x93\x92\xe3\xc2\xa9\xf7\xb7\xf3\x23\x77\x83\x4a\xc4\
+\xc1\x19\xad\x86\x77\x83\x21\x2e\xe0\x1e\x98\xc1\xdd\x00\xe7\x88\
+\xd2\x7d\xb0\xf9\xbb\xa1\x91\x01\x4c\x53\xcd\x5f\xe1\x6e\x50\x76\
+\x9c\x6f\x90\xe3\x3a\xdf\xce\x13\xdf\x9d\x84\xb7\xa5\x6d\xd3\x3c\
+\x6d\xd3\x7d\xe3\xb2\xa5\x40\xf3\x62\xb6\xcd\x0b\x34\x6b\xb3\x5f\
+\xbf\xfd\x6e\x97\xb5\xb2\x6c\xf6\x7b\xed\x6e\xf6\x29\xc7\x33\xa4\
+\x57\xf5\x1a\x32\xd1\x2e\x8f\xfa\x96\x28\x9b\x79\x1c\xa4\xed\x65\
+\xb1\x4c\x17\xd6\x77\x66\x5f\x40\x57\x06\xfa\x77\x1f\x06\xcc\xed\
+\xc3\xca\xee\x85\x76\x62\x9d\x6d\xea\xb5\xcb\xec\x68\xb3\x9a\x67\
+\xcb\xc2\x6f\x4a\xde\xb7\x45\x59\xfe\xe0\x95\xf4\xb2\x6b\x27\x34\
+\x74\xab\xb5\xbb\xec\x09\xf6\x0e\x7c\xb5\xd8\x65\xc1\x81\x09\x45\
+\x5b\xda\xcb\x77\xe9\xaa\x8e\xbe\x49\xcb\x74\x09\x3d\xb4\xb3\x45\
+\xb0\xb8\xfb\xd4\x17\x93\x1c\xca\x09\x9c\x07\x2a\xbd\xe4\xce\x8d\
+\x81\x75\xb0\xbd\x2c\x32\x5b\x35\xcf\x7b\x3d\xd6\x73\x6f\xf6\x36\
+\xc9\xf7\xbf\xbc\x4b\x00\x67\xc9\x81\xef\x9d\xc9\x63\xd6\x07\x8b\
+\xd6\x57\x7f\xd8\x6c\x10\x84\x70\xd4\x5f\xa7\x8b\x47\x81\xf1\xd4\
+\xb2\xb8\x74\xa0\xde\xe5\xe7\xc9\x66\x39\xca\xb3\xb4\x70\xf3\xc6\
+\x58\x3a\xda\x40\x76\x30\xec\xc0\x8a\x70\x68\x75\x05\x99\xe3\x6a\
+\xfd\xd2\x83\xfb\x31\xbd\x59\x5f\x45\xef\x5b\x0b\xd8\x77\x2f\x3d\
+\xb5\x43\x9d\x81\xd7\x43\xbd\x0f\xfd\x77\x8f\x8f\xac\x87\xfe\x17\
+\x9d\xd6\x10\x09\x2b\xeb\x00\xcc\xcd\xb3\x48\xb8\xb3\x57\x68\x4b\
+\x0c\x82\xb3\x2c\xf9\xd5\xae\x5c\x9d\xaf\xb3\x16\x26\x98\xc9\x63\
+\x88\x7d\x8e\xe0\x6f\x8b\xa6\x8b\xc9\x98\x60\x67\xff\x5c\x17\xb0\
+\xe3\x93\x24\xff\x54\xb7\x10\x90\xd7\x35\xd6\xba\xe2\x36\xc4\xdd\
+\x1f\x59\xf3\xba\xf6\xbe\xbf\x4e\x9d\xfd\xaa\x2c\x6e\x0e\x6d\xfe\
+\x3c\xb9\x61\xf5\x4d\x9d\xf7\xe5\x06\xdc\x6d\x70\xb6\xed\xdf\x7a\
+\x49\xf8\x3c\xd9\x66\xe9\xb0\x5a\x74\xbb\xda\x7d\xdd\x0d\xaf\x65\
+\xda\xda\xb7\x04\x33\x04\x83\x2e\x91\xd3\xee\x4d\x19\xb5\xad\xa7\
+\xa1\x96\xa4\x0f\xd6\x91\x6d\x9e\x5f\x6c\x3d\x68\x0f\x4a\xb8\x46\
+\x82\x49\x28\xd3\x74\x8a\xe1\xdf\xaf\x38\xd7\x4a\x4e\xa9\xc6\x12\
+\x29\x09\x95\x1d\x0a\x36\xb4\x81\x9c\x1a\x73\x3a\x28\x57\x0b\x98\
+\xb9\xf0\xbe\xbb\xce\x0a\x97\x95\xfd\xcb\xe3\xfb\x31\x42\x04\x95\
+\xb4\xd7\xc3\x86\xb6\x43\x22\x28\x9b\xd4\xf4\x7b\xdb\xf1\x36\x6b\
+\xcc\x60\x8a\x08\x56\x5c\x82\xe3\xde\xe0\xb0\x82\x8a\xc6\xa6\x31\
+\x13\x06\xaa\xb7\x10\x04\x2c\xc6\x08\x63\xa9\xb4\x3c\xed\x89\xf2\
+\x36\xaf\xd2\xf6\x5a\x49\x33\x32\xdb\x0e\x87\xe9\xbc\x68\x56\x10\
+\xc2\x59\x51\xf9\x62\x7b\x56\xdf\x5a\x37\x2f\xeb\xbb\xd9\x6d\xd1\
+\x14\x57\xa5\x3d\x0b\xcf\xa2\xf4\x6d\xfb\x96\xb4\x1f\xbd\xf9\xd9\
+\x1c\x8a\xd6\x0c\xca\xd9\xdb\x93\xc3\x7e\xf7\x34\x7c\xed\x4d\x18\
+\x61\xe9\xd6\xa5\x9d\x55\x75\xf5\x97\x75\x35\x8c\x05\xae\xbe\x09\
+\x4b\xbb\x79\x8f\xc3\x8f\x12\x20\x5b\x50\x85\xa9\x82\xb9\x7e\x43\
+\xf7\xf2\xb3\x74\x35\x83\x9b\xdc\xf6\x69\x7f\xd4\x45\x35\x83\x0b\
+\x67\xdd\x96\x1a\x16\x65\x01\x8f\x19\xdf\xd2\xf2\xb4\x01\xf4\x3b\
+\x70\xb4\xaf\xcb\x53\xbb\xf9\x63\x86\xb7\xb4\xbd\xb9\xcb\xd4\xdd\
+\x58\xd7\x6d\xe8\xde\xe3\xa6\x4d\x5d\x3b\xa0\x2c\x8b\x7c\xb0\xb6\
+\x55\xb7\xee\x5f\x85\xc5\xf0\x68\x16\x4a\x48\x3e\x48\x9d\x8f\x00\
+\xf5\x14\xa4\x9e\x06\xd5\xd3\xb0\x1a\x03\x16\x41\xda\x28\x2a\x54\
+\xc0\x55\x58\x04\xf4\x33\x01\x92\x31\xe6\xd0\xc4\xc2\x8c\x44\xb8\
+\xe4\x8c\x9d\x0e\x44\xed\x80\x05\xcd\xf8\xe0\xc3\x6b\x41\x6b\x0f\
+\xa7\xc3\x69\xe2\x78\x38\x9d\x30\x26\x39\xa6\xff\x5f\x44\x01\x66\
+\xfc\x31\x8c\x1f\x8d\xc2\x83\xa3\xf1\x0d\x71\x14\x33\x0a\x53\x09\
+\x61\x66\xea\x5b\x7c\x2d\x30\x66\x51\x16\xc5\x30\xde\x4a\xc9\x20\
+\x8d\x60\x48\x80\x18\x2b\x15\xc5\x06\xda\x7a\x4e\x15\xa4\x1b\xe6\
+\x9b\x7b\x11\xc5\x7e\x76\xd2\x92\x4c\x15\xa2\xca\x08\xc2\x22\x82\
+\x88\xd6\x8a\x4c\x19\x3c\x31\x33\x11\x24\x65\xac\x09\x99\x0a\xa4\
+\xb0\x31\x2c\x52\x88\x4b\xa9\xd4\x14\x46\x0c\xa5\x28\x8f\x04\x8c\
+\x49\x5c\x80\x6a\x44\x38\x91\x98\x46\x90\xb4\x04\xcc\xd5\x00\x39\
+\x68\x22\xe0\x44\x38\xc8\xf4\x43\x06\x0c\xe5\xd3\x18\x70\xcf\x99\
+\x36\x5e\xb1\xd7\x23\x0d\x00\xd3\x2b\xe2\xa0\x39\xee\x54\xc1\x68\
+\xd5\xe9\x12\x34\x8a\x3b\x6d\xc2\x63\xd6\xab\x03\x7b\xc0\x1b\x4a\
+\x94\x77\x0a\xb0\xac\xb4\x5f\x73\x42\xb9\xf6\x14\x28\x21\xc4\xef\
+\xc2\x48\x52\xc0\x7d\x20\x01\xee\x89\x89\xfe\xfa\x47\x00\xbd\xcf\
+\x95\x80\x48\xce\x0d\x37\x1f\xc1\x38\x25\x9f\x93\x32\x09\xcc\xa0\
+\xdc\xff\xb4\xc1\xff\x17\x00\xff\x67\x93\xe2\xeb\x9f\xaf\xf0\xa7\
+\x0b\x20\xed\xce\x37\xf8\x77\xec\x59\x8e\xd6\x4f\xca\x4e\x0f\x12\
+\x98\xd4\x70\x5b\xa9\xf9\xaf\x9e\xef\x13\xf9\x8a\x3e\x5b\xae\x94\
+\x30\x04\x32\xd8\xa6\x5e\x29\xa1\xb1\xa1\x3e\x2f\x88\x90\x0f\x0c\
+\xbc\x72\x04\xb7\x98\x42\x5a\x3a\x1d\xf4\xa0\x8b\x6d\xeb\xb9\xe8\
+\x9a\x4e\x78\x9c\xfb\x19\xfe\xf2\xcd\xdf\x82\xef\x7d\xd6\
+\x00\x00\x12\xdb\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x35\x2e\x31\x2e\x30\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x34\x30\x2e\x34\x36\x70\x78\x22\x20\x68\x65\x69\x67\
+\x68\x74\x3d\x22\x34\x30\x2e\x34\x36\x70\x78\x22\x20\x76\x69\x65\
+\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x34\x30\x2e\x34\x36\x20\
+\x34\x30\x2e\x34\x36\x22\x20\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\
+\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\x77\x20\x30\x20\
+\x30\x20\x34\x30\x2e\x34\x36\x20\x34\x30\x2e\x34\x36\x22\x20\x78\
+\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\
+\x76\x65\x22\x3e\x0d\x0a\x3c\x72\x61\x64\x69\x61\x6c\x47\x72\x61\
+\x64\x69\x65\x6e\x74\x20\x69\x64\x3d\x22\x53\x56\x47\x49\x44\x5f\
+\x31\x5f\x22\x20\x63\x78\x3d\x22\x32\x30\x2e\x32\x33\x30\x35\x22\
+\x20\x63\x79\x3d\x22\x32\x30\x2e\x32\x31\x32\x34\x22\x20\x72\x3d\
+\x22\x32\x30\x2e\x31\x32\x37\x33\x22\x20\x66\x78\x3d\x22\x37\x2e\
+\x34\x30\x32\x37\x22\x20\x66\x79\x3d\x22\x32\x30\x2e\x32\x39\x39\
+\x38\x22\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\
+\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\
+\x22\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\
+\x65\x74\x3d\x22\x30\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\
+\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x46\x46\x46\x46\x46\x46\
+\x22\x2f\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\
+\x73\x65\x74\x3d\x22\x30\x2e\x36\x35\x22\x20\x73\x74\x79\x6c\x65\
+\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x44\x30\
+\x44\x32\x44\x33\x22\x2f\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\
+\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\x22\x20\x73\x74\x79\x6c\
+\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x44\
+\x30\x44\x32\x44\x33\x22\x2f\x3e\x0d\x0a\x3c\x2f\x72\x61\x64\x69\
+\x61\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\x0d\x0a\x3c\x63\x69\
+\x72\x63\x6c\x65\x20\x66\x69\x6c\x6c\x3d\x22\x75\x72\x6c\x28\x23\
+\x53\x56\x47\x49\x44\x5f\x31\x5f\x29\x22\x20\x63\x78\x3d\x22\x32\
+\x30\x2e\x32\x33\x22\x20\x63\x79\x3d\x22\x32\x30\x2e\x32\x31\x31\
+\x22\x20\x72\x3d\x22\x31\x39\x2e\x37\x32\x39\x22\x2f\x3e\x0d\x0a\
+\x3c\x72\x61\x64\x69\x61\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\x20\
+\x69\x64\x3d\x22\x53\x56\x47\x49\x44\x5f\x32\x5f\x22\x20\x63\x78\
+\x3d\x22\x32\x30\x2e\x32\x33\x31\x22\x20\x63\x79\x3d\x22\x32\x30\
+\x2e\x32\x31\x32\x34\x22\x20\x72\x3d\x22\x31\x39\x2e\x37\x32\x33\
+\x31\x22\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\
+\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\
+\x22\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\
+\x65\x74\x3d\x22\x30\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\
+\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x41\x35\x46\x45\x31\x45\
+\x22\x2f\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\
+\x73\x65\x74\x3d\x22\x31\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\
+\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x46\x46\x46\x46\x46\
+\x46\x22\x2f\x3e\x0d\x0a\x3c\x2f\x72\x61\x64\x69\x61\x6c\x47\x72\
+\x61\x64\x69\x65\x6e\x74\x3e\x0d\x0a\x3c\x63\x69\x72\x63\x6c\x65\
+\x20\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x30\x2e\x34\x22\x20\x66\
+\x69\x6c\x6c\x3d\x22\x75\x72\x6c\x28\x23\x53\x56\x47\x49\x44\x5f\
+\x32\x5f\x29\x22\x20\x63\x78\x3d\x22\x32\x30\x2e\x32\x33\x31\x22\
+\x20\x63\x79\x3d\x22\x32\x30\x2e\x32\x31\x32\x22\x20\x72\x3d\x22\
+\x31\x39\x2e\x37\x32\x33\x22\x2f\x3e\x0d\x0a\x3c\x70\x61\x74\x68\
+\x20\x66\x69\x6c\x6c\x3d\x22\x23\x41\x35\x46\x45\x31\x45\x22\x20\
+\x64\x3d\x22\x4d\x32\x30\x2e\x32\x33\x2c\x30\x2e\x35\x30\x31\x76\
+\x31\x39\x2e\x37\x30\x38\x6c\x30\x2e\x30\x30\x31\x2c\x30\x2e\x30\
+\x30\x32\x48\x32\x30\x2e\x32\x33\x76\x30\x2e\x30\x32\x6c\x2d\x30\
+\x2e\x30\x37\x34\x2d\x30\x2e\x30\x35\x39\x4c\x32\x2e\x38\x34\x32\
+\x2c\x31\x30\x2e\x39\x34\x38\x43\x31\x2e\x33\x35\x36\x2c\x31\x33\
+\x2e\x37\x31\x34\x2c\x30\x2e\x35\x2c\x31\x36\x2e\x38\x37\x2c\x30\
+\x2e\x35\x2c\x32\x30\x2e\x32\x33\x31\x0d\x0a\x09\x63\x30\x2c\x31\
+\x30\x2e\x38\x39\x36\x2c\x38\x2e\x38\x33\x34\x2c\x31\x39\x2e\x37\
+\x32\x39\x2c\x31\x39\x2e\x37\x32\x39\x2c\x31\x39\x2e\x37\x32\x39\
+\x73\x31\x39\x2e\x37\x32\x39\x2d\x38\x2e\x38\x33\x33\x2c\x31\x39\
+\x2e\x37\x32\x39\x2d\x31\x39\x2e\x37\x32\x39\x43\x33\x39\x2e\x39\
+\x35\x39\x2c\x39\x2e\x33\x33\x34\x2c\x33\x31\x2e\x31\x32\x35\x2c\
+\x30\x2e\x35\x30\x31\x2c\x32\x30\x2e\x32\x33\x2c\x30\x2e\x35\x30\
+\x31\x7a\x22\x2f\x3e\x0d\x0a\x3c\x72\x61\x64\x69\x61\x6c\x47\x72\
+\x61\x64\x69\x65\x6e\x74\x20\x69\x64\x3d\x22\x53\x56\x47\x49\x44\
+\x5f\x33\x5f\x22\x20\x63\x78\x3d\x22\x2d\x33\x37\x2e\x36\x31\x31\
+\x38\x22\x20\x63\x79\x3d\x22\x33\x39\x2e\x39\x31\x35\x35\x22\x20\
+\x72\x3d\x22\x37\x2e\x34\x33\x33\x36\x22\x20\x67\x72\x61\x64\x69\
+\x65\x6e\x74\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\
+\x74\x72\x69\x78\x28\x31\x2e\x36\x34\x20\x2d\x30\x2e\x31\x36\x31\
+\x32\x20\x30\x2e\x30\x38\x39\x37\x20\x30\x2e\x39\x31\x33\x32\x20\
+\x37\x37\x2e\x32\x37\x37\x31\x20\x2d\x33\x34\x2e\x35\x30\x33\x34\
+\x29\x22\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\
+\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\
+\x22\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\
+\x65\x74\x3d\x22\x30\x2e\x32\x35\x22\x20\x73\x74\x79\x6c\x65\x3d\
+\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x46\x46\x46\
+\x46\x46\x46\x22\x2f\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\
+\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\x22\x20\x73\x74\x79\x6c\x65\
+\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x46\x46\
+\x46\x46\x46\x46\x3b\x73\x74\x6f\x70\x2d\x6f\x70\x61\x63\x69\x74\
+\x79\x3a\x30\x22\x2f\x3e\x0d\x0a\x3c\x2f\x72\x61\x64\x69\x61\x6c\
+\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\x0d\x0a\x3c\x70\x61\x74\x68\
+\x20\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x30\x2e\x37\x22\x20\x66\
+\x69\x6c\x6c\x3d\x22\x75\x72\x6c\x28\x23\x53\x56\x47\x49\x44\x5f\
+\x33\x5f\x29\x22\x20\x64\x3d\x22\x4d\x33\x31\x2e\x33\x36\x34\x2c\
+\x36\x2e\x38\x31\x31\x63\x30\x2e\x33\x36\x38\x2c\x33\x2e\x37\x35\
+\x2d\x34\x2e\x37\x39\x31\x2c\x37\x2e\x33\x32\x35\x2d\x31\x31\x2e\
+\x35\x32\x34\x2c\x37\x2e\x39\x38\x37\x53\x37\x2e\x33\x34\x39\x2c\
+\x31\x32\x2e\x39\x35\x37\x2c\x36\x2e\x39\x38\x2c\x39\x2e\x32\x30\
+\x37\x0d\x0a\x09\x63\x2d\x30\x2e\x33\x36\x38\x2d\x33\x2e\x37\x34\
+\x39\x2c\x34\x2e\x37\x39\x32\x2d\x37\x2e\x33\x32\x34\x2c\x31\x31\
+\x2e\x35\x32\x35\x2d\x37\x2e\x39\x38\x36\x53\x33\x30\x2e\x39\x39\
+\x35\x2c\x33\x2e\x30\x36\x32\x2c\x33\x31\x2e\x33\x36\x34\x2c\x36\
+\x2e\x38\x31\x31\x7a\x22\x2f\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\
+\x66\x69\x6c\x6c\x3d\x22\x23\x35\x38\x35\x39\x35\x42\x22\x20\x64\
+\x3d\x22\x4d\x32\x30\x2e\x32\x33\x2c\x34\x30\x2e\x34\x35\x39\x43\
+\x39\x2e\x30\x37\x36\x2c\x34\x30\x2e\x34\x35\x39\x2c\x30\x2c\x33\
+\x31\x2e\x33\x38\x35\x2c\x30\x2c\x32\x30\x2e\x32\x33\x31\x53\x39\
+\x2e\x30\x37\x36\x2c\x30\x2e\x30\x30\x31\x2c\x32\x30\x2e\x32\x33\
+\x2c\x30\x2e\x30\x30\x31\x73\x32\x30\x2e\x32\x32\x39\x2c\x39\x2e\
+\x30\x37\x35\x2c\x32\x30\x2e\x32\x32\x39\x2c\x32\x30\x2e\x32\x32\
+\x39\x0d\x0a\x09\x53\x33\x31\x2e\x33\x38\x34\x2c\x34\x30\x2e\x34\
+\x35\x39\x2c\x32\x30\x2e\x32\x33\x2c\x34\x30\x2e\x34\x35\x39\x7a\
+\x20\x4d\x32\x30\x2e\x32\x33\x2c\x31\x2e\x30\x30\x31\x43\x39\x2e\
+\x36\x32\x36\x2c\x31\x2e\x30\x30\x31\x2c\x31\x2c\x39\x2e\x36\x32\
+\x37\x2c\x31\x2c\x32\x30\x2e\x32\x33\x31\x43\x31\x2c\x33\x30\x2e\
+\x38\x33\x33\x2c\x39\x2e\x36\x32\x36\x2c\x33\x39\x2e\x34\x35\x39\
+\x2c\x32\x30\x2e\x32\x33\x2c\x33\x39\x2e\x34\x35\x39\x0d\x0a\x09\
+\x73\x31\x39\x2e\x32\x32\x39\x2d\x38\x2e\x36\x32\x36\x2c\x31\x39\
+\x2e\x32\x32\x39\x2d\x31\x39\x2e\x32\x32\x39\x43\x33\x39\x2e\x34\
+\x35\x39\x2c\x39\x2e\x36\x32\x37\x2c\x33\x30\x2e\x38\x33\x33\x2c\
+\x31\x2e\x30\x30\x31\x2c\x32\x30\x2e\x32\x33\x2c\x31\x2e\x30\x30\
+\x31\x7a\x22\x2f\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\
+\x6c\x3d\x22\x23\x32\x33\x31\x46\x32\x30\x22\x20\x64\x3d\x22\x4d\
+\x32\x30\x2e\x32\x33\x2c\x32\x31\x2e\x32\x33\x31\x63\x2d\x30\x2e\
+\x31\x36\x32\x2c\x30\x2d\x30\x2e\x33\x32\x34\x2d\x30\x2e\x30\x33\
+\x39\x2d\x30\x2e\x34\x37\x32\x2d\x30\x2e\x31\x31\x39\x4c\x37\x2e\
+\x35\x37\x2c\x31\x34\x2e\x36\x63\x2d\x30\x2e\x34\x38\x36\x2d\x30\
+\x2e\x32\x36\x31\x2d\x30\x2e\x36\x37\x31\x2d\x30\x2e\x38\x36\x37\
+\x2d\x30\x2e\x34\x31\x2d\x31\x2e\x33\x35\x34\x0d\x0a\x09\x63\x30\
+\x2e\x32\x36\x2d\x30\x2e\x34\x38\x37\x2c\x30\x2e\x38\x36\x35\x2d\
+\x30\x2e\x36\x37\x32\x2c\x31\x2e\x33\x35\x34\x2d\x30\x2e\x34\x31\
+\x6c\x31\x30\x2e\x37\x31\x37\x2c\x35\x2e\x37\x32\x37\x76\x2d\x38\
+\x2e\x32\x34\x38\x63\x30\x2d\x30\x2e\x35\x35\x32\x2c\x30\x2e\x34\
+\x34\x37\x2d\x31\x2c\x31\x2d\x31\x73\x31\x2c\x30\x2e\x34\x34\x38\
+\x2c\x31\x2c\x31\x76\x39\x2e\x39\x31\x36\x63\x30\x2c\x30\x2e\x33\
+\x35\x32\x2d\x30\x2e\x31\x38\x35\x2c\x30\x2e\x36\x37\x37\x2d\x30\
+\x2e\x34\x38\x35\x2c\x30\x2e\x38\x35\x37\x0d\x0a\x09\x43\x32\x30\
+\x2e\x35\x38\x36\x2c\x32\x31\x2e\x31\x38\x33\x2c\x32\x30\x2e\x34\
+\x30\x38\x2c\x32\x31\x2e\x32\x33\x31\x2c\x32\x30\x2e\x32\x33\x2c\
+\x32\x31\x2e\x32\x33\x31\x7a\x22\x2f\x3e\x0d\x0a\x3c\x70\x61\x74\
+\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\x32\x33\x31\x46\x32\x30\x22\
+\x20\x64\x3d\x22\x4d\x32\x30\x2e\x33\x32\x35\x2c\x33\x37\x2e\x38\
+\x32\x31\x68\x2d\x30\x2e\x31\x32\x34\x63\x2d\x30\x2e\x36\x39\x2c\
+\x30\x2d\x31\x2e\x32\x35\x2d\x30\x2e\x35\x35\x39\x2d\x31\x2e\x32\
+\x35\x2d\x31\x2e\x32\x35\x63\x30\x2d\x30\x2e\x36\x38\x39\x2c\x30\
+\x2e\x35\x36\x2d\x31\x2e\x32\x35\x2c\x31\x2e\x32\x35\x2d\x31\x2e\
+\x32\x35\x68\x30\x2e\x31\x30\x36\x0d\x0a\x09\x63\x30\x2e\x36\x39\
+\x2c\x30\x2c\x31\x2e\x32\x35\x39\x2c\x30\x2e\x35\x36\x31\x2c\x31\
+\x2e\x32\x35\x39\x2c\x31\x2e\x32\x35\x43\x32\x31\x2e\x35\x36\x36\
+\x2c\x33\x37\x2e\x32\x36\x32\x2c\x32\x31\x2e\x30\x31\x35\x2c\x33\
+\x37\x2e\x38\x32\x31\x2c\x32\x30\x2e\x33\x32\x35\x2c\x33\x37\x2e\
+\x38\x32\x31\x7a\x20\x4d\x31\x32\x2e\x31\x30\x34\x2c\x33\x35\x2e\
+\x36\x37\x36\x63\x2d\x30\x2e\x31\x39\x36\x2c\x30\x2d\x30\x2e\x33\
+\x39\x37\x2d\x30\x2e\x30\x35\x31\x2d\x30\x2e\x35\x38\x36\x2d\x30\
+\x2e\x31\x35\x38\x0d\x0a\x09\x6c\x2d\x30\x2e\x31\x33\x31\x2d\x30\
+\x2e\x30\x37\x35\x63\x2d\x30\x2e\x35\x39\x33\x2d\x30\x2e\x33\x35\
+\x34\x2d\x30\x2e\x37\x38\x36\x2d\x31\x2e\x31\x32\x32\x2d\x30\x2e\
+\x34\x33\x33\x2d\x31\x2e\x37\x31\x34\x63\x30\x2e\x33\x35\x35\x2d\
+\x30\x2e\x35\x39\x34\x2c\x31\x2e\x31\x32\x35\x2d\x30\x2e\x37\x38\
+\x37\x2c\x31\x2e\x37\x31\x34\x2d\x30\x2e\x34\x33\x33\x63\x30\x2e\
+\x36\x30\x31\x2c\x30\x2e\x33\x34\x31\x2c\x30\x2e\x38\x35\x33\x2c\
+\x31\x2e\x31\x32\x38\x2c\x30\x2e\x35\x31\x32\x2c\x31\x2e\x37\x32\
+\x38\x0d\x0a\x09\x43\x31\x32\x2e\x39\x34\x37\x2c\x33\x35\x2e\x34\
+\x33\x36\x2c\x31\x32\x2e\x35\x33\x35\x2c\x33\x35\x2e\x36\x37\x36\
+\x2c\x31\x32\x2e\x31\x30\x34\x2c\x33\x35\x2e\x36\x37\x36\x7a\x20\
+\x4d\x32\x38\x2e\x33\x38\x2c\x33\x35\x2e\x36\x35\x31\x63\x2d\x30\
+\x2e\x34\x33\x36\x2c\x30\x2d\x30\x2e\x38\x35\x37\x2d\x30\x2e\x32\
+\x32\x39\x2d\x31\x2e\x30\x38\x38\x2d\x30\x2e\x36\x33\x33\x63\x2d\
+\x30\x2e\x33\x34\x31\x2d\x30\x2e\x36\x30\x32\x2d\x30\x2e\x31\x33\
+\x31\x2d\x31\x2e\x33\x36\x34\x2c\x30\x2e\x34\x37\x2d\x31\x2e\x37\
+\x30\x35\x0d\x0a\x09\x63\x30\x2e\x35\x39\x32\x2d\x30\x2e\x33\x35\
+\x34\x2c\x31\x2e\x34\x30\x33\x2d\x30\x2e\x31\x38\x34\x2c\x31\x2e\
+\x37\x35\x36\x2c\x30\x2e\x34\x30\x38\x63\x30\x2e\x33\x35\x34\x2c\
+\x30\x2e\x35\x39\x33\x2c\x30\x2e\x32\x30\x32\x2c\x31\x2e\x33\x33\
+\x36\x2d\x30\x2e\x33\x39\x31\x2c\x31\x2e\x36\x39\x6c\x2d\x30\x2e\
+\x31\x33\x31\x2c\x30\x2e\x30\x37\x35\x43\x32\x38\x2e\x38\x30\x31\
+\x2c\x33\x35\x2e\x35\x39\x38\x2c\x32\x38\x2e\x35\x38\x39\x2c\x33\
+\x35\x2e\x36\x35\x31\x2c\x32\x38\x2e\x33\x38\x2c\x33\x35\x2e\x36\
+\x35\x31\x7a\x0d\x0a\x09\x20\x4d\x36\x2e\x31\x31\x34\x2c\x32\x39\
+\x2e\x37\x33\x33\x63\x2d\x30\x2e\x34\x33\x33\x2c\x30\x2d\x30\x2e\
+\x38\x35\x34\x2d\x30\x2e\x32\x32\x35\x2d\x31\x2e\x30\x38\x34\x2d\
+\x30\x2e\x36\x32\x36\x6c\x2d\x30\x2e\x30\x35\x2d\x30\x2e\x30\x38\
+\x35\x63\x2d\x30\x2e\x33\x35\x36\x2d\x30\x2e\x35\x39\x32\x2d\x30\
+\x2e\x31\x36\x36\x2d\x31\x2e\x33\x35\x39\x2c\x30\x2e\x34\x32\x35\
+\x2d\x31\x2e\x37\x31\x37\x0d\x0a\x09\x63\x30\x2e\x35\x39\x32\x2d\
+\x30\x2e\x33\x35\x35\x2c\x31\x2e\x33\x36\x2d\x30\x2e\x31\x36\x35\
+\x2c\x31\x2e\x37\x31\x36\x2c\x30\x2e\x34\x32\x36\x6c\x30\x2e\x30\
+\x37\x35\x2c\x30\x2e\x31\x32\x39\x63\x30\x2e\x33\x34\x35\x2c\x30\
+\x2e\x35\x39\x39\x2c\x30\x2e\x31\x33\x39\x2c\x31\x2e\x33\x36\x33\
+\x2d\x30\x2e\x34\x36\x2c\x31\x2e\x37\x30\x37\x43\x36\x2e\x35\x34\
+\x2c\x32\x39\x2e\x36\x38\x2c\x36\x2e\x33\x32\x36\x2c\x32\x39\x2e\
+\x37\x33\x33\x2c\x36\x2e\x31\x31\x34\x2c\x32\x39\x2e\x37\x33\x33\
+\x7a\x0d\x0a\x09\x20\x4d\x33\x34\x2e\x33\x37\x38\x2c\x32\x39\x2e\
+\x36\x38\x63\x2d\x30\x2e\x32\x32\x2c\x30\x2d\x30\x2e\x34\x34\x32\
+\x2d\x30\x2e\x30\x35\x39\x2d\x30\x2e\x36\x34\x35\x2d\x30\x2e\x31\
+\x38\x63\x2d\x30\x2e\x35\x39\x31\x2d\x30\x2e\x33\x35\x36\x2d\x30\
+\x2e\x37\x38\x31\x2d\x31\x2e\x31\x32\x35\x2d\x30\x2e\x34\x32\x35\
+\x2d\x31\x2e\x37\x31\x37\x63\x30\x2e\x33\x34\x2d\x30\x2e\x36\x2c\
+\x31\x2e\x31\x32\x36\x2d\x30\x2e\x38\x35\x2c\x31\x2e\x37\x32\x37\
+\x2d\x30\x2e\x35\x31\x0d\x0a\x09\x63\x30\x2e\x36\x30\x31\x2c\x30\
+\x2e\x33\x34\x32\x2c\x30\x2e\x38\x33\x34\x2c\x31\x2e\x30\x36\x34\
+\x2c\x30\x2e\x34\x39\x33\x2c\x31\x2e\x36\x36\x35\x6c\x2d\x30\x2e\
+\x30\x37\x39\x2c\x30\x2e\x31\x33\x36\x43\x33\x35\x2e\x32\x31\x35\
+\x2c\x32\x39\x2e\x34\x36\x34\x2c\x33\x34\x2e\x38\x30\x32\x2c\x32\
+\x39\x2e\x36\x38\x2c\x33\x34\x2e\x33\x37\x38\x2c\x32\x39\x2e\x36\
+\x38\x7a\x20\x4d\x33\x2e\x38\x37\x32\x2c\x32\x31\x2e\x35\x37\x33\
+\x0d\x0a\x09\x63\x2d\x30\x2e\x36\x39\x2c\x30\x2d\x31\x2e\x32\x35\
+\x2d\x30\x2e\x35\x36\x2d\x31\x2e\x32\x35\x2d\x31\x2e\x32\x35\x76\
+\x2d\x30\x2e\x30\x33\x34\x63\x30\x2d\x30\x2e\x36\x39\x2c\x30\x2e\
+\x35\x36\x2d\x31\x2e\x32\x39\x35\x2c\x31\x2e\x32\x35\x2d\x31\x2e\
+\x32\x39\x35\x73\x31\x2e\x32\x35\x2c\x30\x2e\x35\x31\x35\x2c\x31\
+\x2e\x32\x35\x2c\x31\x2e\x32\x30\x35\x76\x30\x2e\x31\x32\x34\x0d\
+\x0a\x09\x43\x35\x2e\x31\x32\x32\x2c\x32\x31\x2e\x30\x31\x33\x2c\
+\x34\x2e\x35\x36\x32\x2c\x32\x31\x2e\x35\x37\x33\x2c\x33\x2e\x38\
+\x37\x32\x2c\x32\x31\x2e\x35\x37\x33\x7a\x20\x4d\x33\x36\x2e\x35\
+\x38\x39\x2c\x32\x31\x2e\x35\x30\x39\x63\x2d\x30\x2e\x36\x39\x2c\
+\x30\x2d\x31\x2e\x32\x35\x2d\x30\x2e\x35\x36\x2d\x31\x2e\x32\x35\
+\x2d\x31\x2e\x32\x35\x76\x2d\x30\x2e\x31\x32\x34\x63\x30\x2d\x30\
+\x2e\x36\x39\x2c\x30\x2e\x35\x36\x2d\x31\x2e\x32\x38\x34\x2c\x31\
+\x2e\x32\x35\x2d\x31\x2e\x32\x38\x34\x0d\x0a\x09\x73\x31\x2e\x32\
+\x35\x2c\x30\x2e\x35\x32\x35\x2c\x31\x2e\x32\x35\x2c\x31\x2e\x32\
+\x31\x36\x76\x30\x2e\x31\x39\x32\x43\x33\x37\x2e\x38\x33\x39\x2c\
+\x32\x30\x2e\x39\x35\x2c\x33\x37\x2e\x32\x38\x2c\x32\x31\x2e\x35\
+\x30\x39\x2c\x33\x36\x2e\x35\x38\x39\x2c\x32\x31\x2e\x35\x30\x39\
+\x7a\x20\x4d\x36\x2e\x30\x30\x31\x2c\x31\x33\x2e\x33\x38\x31\x63\
+\x2d\x30\x2e\x32\x30\x39\x2c\x30\x2d\x30\x2e\x34\x32\x31\x2d\x30\
+\x2e\x30\x35\x32\x2d\x30\x2e\x36\x31\x36\x2d\x30\x2e\x31\x36\x32\
+\x0d\x0a\x09\x63\x2d\x30\x2e\x36\x30\x31\x2d\x30\x2e\x33\x34\x31\
+\x2d\x30\x2e\x38\x31\x31\x2d\x31\x2e\x31\x30\x34\x2d\x30\x2e\x34\
+\x37\x2d\x31\x2e\x37\x30\x35\x6c\x30\x2e\x30\x36\x35\x2d\x30\x2e\
+\x31\x31\x33\x63\x30\x2e\x33\x34\x33\x2d\x30\x2e\x36\x2c\x31\x2e\
+\x31\x30\x38\x2d\x30\x2e\x38\x30\x35\x2c\x31\x2e\x37\x30\x36\x2d\
+\x30\x2e\x34\x36\x31\x63\x30\x2e\x35\x39\x39\x2c\x30\x2e\x33\x34\
+\x35\x2c\x30\x2e\x38\x30\x35\x2c\x31\x2e\x31\x30\x39\x2c\x30\x2e\
+\x34\x36\x2c\x31\x2e\x37\x30\x37\x0d\x0a\x09\x6c\x2d\x30\x2e\x30\
+\x35\x38\x2c\x30\x2e\x31\x30\x32\x43\x36\x2e\x38\x35\x39\x2c\x31\
+\x33\x2e\x31\x35\x35\x2c\x36\x2e\x34\x33\x36\x2c\x31\x33\x2e\x33\
+\x38\x31\x2c\x36\x2e\x30\x30\x31\x2c\x31\x33\x2e\x33\x38\x31\x7a\
+\x20\x4d\x33\x34\x2e\x33\x39\x34\x2c\x31\x33\x2e\x32\x36\x38\x63\
+\x2d\x30\x2e\x34\x32\x34\x2c\x30\x2d\x30\x2e\x38\x33\x37\x2d\x30\
+\x2e\x32\x31\x35\x2d\x31\x2e\x30\x37\x31\x2d\x30\x2e\x36\x30\x34\
+\x6c\x2d\x30\x2e\x30\x37\x35\x2d\x30\x2e\x31\x32\x39\x0d\x0a\x09\
+\x63\x2d\x30\x2e\x33\x34\x35\x2d\x30\x2e\x35\x39\x39\x2d\x30\x2e\
+\x31\x33\x39\x2d\x31\x2e\x33\x36\x32\x2c\x30\x2e\x34\x36\x2d\x31\
+\x2e\x37\x30\x37\x63\x30\x2e\x35\x39\x36\x2d\x30\x2e\x33\x34\x35\
+\x2c\x31\x2e\x33\x36\x32\x2d\x30\x2e\x31\x33\x39\x2c\x31\x2e\x37\
+\x30\x36\x2c\x30\x2e\x34\x36\x6c\x30\x2e\x30\x35\x2c\x30\x2e\x30\
+\x38\x35\x63\x30\x2e\x33\x35\x36\x2c\x30\x2e\x35\x39\x31\x2c\x30\
+\x2e\x31\x36\x36\x2c\x31\x2e\x33\x36\x2d\x30\x2e\x34\x32\x35\x2c\
+\x31\x2e\x37\x31\x36\x0d\x0a\x09\x43\x33\x34\x2e\x38\x33\x36\x2c\
+\x31\x33\x2e\x32\x31\x2c\x33\x34\x2e\x36\x31\x34\x2c\x31\x33\x2e\
+\x32\x36\x38\x2c\x33\x34\x2e\x33\x39\x34\x2c\x31\x33\x2e\x32\x36\
+\x38\x7a\x20\x4d\x31\x31\x2e\x39\x39\x35\x2c\x37\x2e\x33\x31\x31\
+\x63\x2d\x30\x2e\x34\x33\x31\x2c\x30\x2d\x30\x2e\x38\x35\x33\x2d\
+\x30\x2e\x32\x30\x37\x2d\x31\x2e\x30\x38\x33\x2d\x30\x2e\x35\x39\
+\x32\x63\x2d\x30\x2e\x33\x35\x34\x2d\x30\x2e\x35\x39\x33\x2d\x30\
+\x2e\x32\x30\x31\x2d\x31\x2e\x33\x33\x36\x2c\x30\x2e\x33\x39\x32\
+\x2d\x31\x2e\x36\x39\x0d\x0a\x09\x6c\x30\x2e\x31\x33\x2d\x30\x2e\
+\x30\x37\x36\x63\x30\x2e\x36\x30\x33\x2d\x30\x2e\x33\x34\x32\x2c\
+\x31\x2e\x33\x36\x32\x2d\x30\x2e\x31\x33\x2c\x31\x2e\x37\x30\x34\
+\x2c\x30\x2e\x34\x37\x63\x30\x2e\x33\x34\x31\x2c\x30\x2e\x36\x30\
+\x31\x2c\x30\x2e\x31\x33\x31\x2c\x31\x2e\x33\x36\x34\x2d\x30\x2e\
+\x34\x37\x2c\x31\x2e\x37\x30\x34\x43\x31\x32\x2e\x34\x35\x39\x2c\
+\x37\x2e\x32\x35\x2c\x31\x32\x2e\x32\x32\x36\x2c\x37\x2e\x33\x31\
+\x31\x2c\x31\x31\x2e\x39\x39\x35\x2c\x37\x2e\x33\x31\x31\x7a\x0d\
+\x0a\x09\x20\x4d\x32\x38\x2e\x34\x30\x32\x2c\x37\x2e\x32\x38\x38\
+\x63\x2d\x30\x2e\x32\x31\x39\x2c\x30\x2d\x30\x2e\x34\x33\x39\x2d\
+\x30\x2e\x30\x35\x37\x2d\x30\x2e\x36\x34\x2d\x30\x2e\x31\x37\x37\
+\x43\x32\x37\x2e\x31\x36\x32\x2c\x36\x2e\x37\x37\x2c\x32\x36\x2e\
+\x39\x31\x2c\x35\x2e\x39\x38\x33\x2c\x32\x37\x2e\x32\x35\x2c\x35\
+\x2e\x33\x38\x32\x63\x30\x2e\x33\x34\x2d\x30\x2e\x36\x2c\x31\x2e\
+\x30\x36\x31\x2d\x30\x2e\x38\x33\x37\x2c\x31\x2e\x36\x36\x32\x2d\
+\x30\x2e\x34\x39\x34\x6c\x30\x2e\x31\x33\x31\x2c\x30\x2e\x30\x37\
+\x36\x0d\x0a\x09\x63\x30\x2e\x35\x39\x33\x2c\x30\x2e\x33\x35\x34\
+\x2c\x30\x2e\x37\x38\x36\x2c\x31\x2e\x31\x32\x31\x2c\x30\x2e\x34\
+\x33\x33\x2c\x31\x2e\x37\x31\x34\x43\x32\x39\x2e\x32\x34\x32\x2c\
+\x37\x2e\x30\x37\x2c\x32\x38\x2e\x38\x32\x37\x2c\x37\x2e\x32\x38\
+\x38\x2c\x32\x38\x2e\x34\x30\x32\x2c\x37\x2e\x32\x38\x38\x7a\x20\
+\x4d\x32\x30\x2e\x31\x32\x39\x2c\x32\x2e\x36\x30\x33\x68\x30\x2e\
+\x30\x39\x37\x63\x30\x2e\x36\x39\x2c\x30\x2c\x31\x2e\x32\x35\x2c\
+\x30\x2e\x35\x36\x2c\x31\x2e\x32\x35\x2c\x31\x2e\x32\x35\x0d\x0a\
+\x09\x73\x2d\x30\x2e\x35\x36\x2c\x31\x2e\x32\x35\x2d\x31\x2e\x32\
+\x35\x2c\x31\x2e\x32\x35\x68\x2d\x30\x2e\x31\x32\x34\x63\x2d\x30\
+\x2e\x36\x39\x2c\x30\x2d\x31\x2e\x32\x35\x2d\x30\x2e\x35\x36\x2d\
+\x31\x2e\x32\x35\x2d\x31\x2e\x32\x35\x73\x30\x2e\x35\x36\x2d\x31\
+\x2e\x32\x35\x2c\x31\x2e\x32\x35\x2d\x31\x2e\x32\x35\x22\x2f\x3e\
+\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x01\xe6\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\
+\x00\x00\x00\x7e\x50\x4c\x54\x45\x00\x00\x00\x40\x9f\xff\x8a\xca\
+\xff\x40\xa7\xf7\x8d\xcb\xfa\x40\xa3\xf3\x8f\xcb\xfb\x41\xa5\xf5\
+\x8f\xca\xfa\x42\xa5\xf5\x42\xa3\xf3\x8e\xc8\xfa\x41\xa4\xf4\x41\
+\xa4\xf3\x8e\xc9\xf8\x41\xa4\xf4\x8e\xc9\xf8\x5b\xb1\xf6\x41\xa4\
+\xf4\x8f\xc9\xf9\x8f\xc9\xf8\x41\xa4\xf4\x42\xa4\xf4\x8f\xc9\xf9\
+\x42\xa4\xf3\x8f\xc9\xf9\x19\x76\xd1\x35\x8a\xdb\x36\x8b\xdb\x42\
+\xa4\xf4\x4c\x99\xe2\x56\xae\xf6\x5c\x92\xe4\x64\x8c\xdf\x71\xb3\
+\xef\x71\xb4\xef\x78\xb9\xf2\x8f\x6e\xc5\x8f\xc9\xf9\xa9\x5d\xb5\
+\xa9\x5d\xb6\xcc\x46\xa1\x0a\xe9\xd7\xb7\x00\x00\x00\x1a\x74\x52\
+\x4e\x53\x00\x10\x18\x20\x31\x40\x40\x4f\x60\x7f\x80\x8c\xa0\xb0\
+\xbc\xbf\xc0\xc4\xcf\xcf\xdc\xdf\xe0\xec\xf0\xf8\x97\xd3\xaf\xc3\
+\x00\x00\x00\xfd\x49\x44\x41\x54\x58\xc3\xed\x97\x6d\x4f\xc3\x20\
+\x14\x85\x51\x7c\xd7\x39\xdf\xa6\x15\x7a\x5a\x60\xf4\x16\xfe\xff\
+\x1f\xf4\x43\xb3\x5b\x97\x58\xe6\xc6\x16\x6b\xc2\xf3\xb9\x3c\xc9\
+\x3d\x90\x53\x10\xa2\x50\x38\x06\x4f\xd3\x3c\xde\x0c\x9f\x5c\xdf\
+\x2e\xa7\x11\x94\xe2\xf5\x42\x08\xf9\x82\x14\x69\x01\x7d\x9c\x9f\
+\xad\x90\x23\xa0\xfb\x3b\xe4\x09\xde\x56\x99\x82\x4f\x64\x0a\xa8\
+\x08\x7e\x2b\xd0\x8a\x21\x72\x4a\x39\x22\xa5\xf4\x28\x08\x91\x01\
+\x6c\x8c\x16\x88\x31\x1c\x53\xd0\x68\x86\xc8\x6b\xed\x89\xb4\x6e\
+\x46\x41\x17\x18\xc0\x84\x60\x80\x10\xba\x59\x85\xd8\xd4\x0c\x91\
+\xaf\x6b\x4f\xa4\xeb\xef\x23\xf4\x0c\x60\xfa\xde\x00\xa1\xef\x66\
+\xb5\x0b\x7f\x1f\xa2\x5f\x33\x9b\x85\x6e\xed\x47\x81\xb1\xcc\x66\
+\xa1\xb5\x66\x2a\x83\x81\xe9\x0c\x06\x12\x21\x1e\x22\xf0\x8e\xe1\
+\x11\xdc\x3e\x23\xcc\xbf\x0f\x4e\x2f\xd8\xd5\x07\xff\xa0\x54\xb7\
+\xfa\x60\x60\xab\x0f\xf6\x0b\xf1\x87\x93\x78\x7a\x41\xf9\x37\x16\
+\x41\xae\xe0\x2a\xc1\x73\xdb\xb6\x00\x16\x97\x09\x92\x17\x71\x59\
+\x01\x40\x25\x0f\xbf\xca\xcb\xc5\x7b\xf5\x20\xcb\x93\xa6\xb0\x93\
+\x2f\xf1\x21\x69\x53\xfa\x6d\x6e\x1c\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x13\x8d\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x35\x2e\x31\x2e\x30\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x34\x30\x2e\x34\x36\x70\x78\x22\x20\x68\x65\x69\x67\
+\x68\x74\x3d\x22\x34\x30\x2e\x34\x36\x70\x78\x22\x20\x76\x69\x65\
+\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x34\x30\x2e\x34\x36\x20\
+\x34\x30\x2e\x34\x36\x22\x20\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\
+\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\x77\x20\x30\x20\
+\x30\x20\x34\x30\x2e\x34\x36\x20\x34\x30\x2e\x34\x36\x22\x20\x78\
+\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\
+\x76\x65\x22\x3e\x0d\x0a\x3c\x72\x61\x64\x69\x61\x6c\x47\x72\x61\
+\x64\x69\x65\x6e\x74\x20\x69\x64\x3d\x22\x53\x56\x47\x49\x44\x5f\
+\x31\x5f\x22\x20\x63\x78\x3d\x22\x33\x30\x36\x2e\x30\x30\x31\x35\
+\x22\x20\x63\x79\x3d\x22\x2d\x33\x35\x35\x2e\x31\x30\x38\x34\x22\
+\x20\x72\x3d\x22\x32\x30\x2e\x31\x32\x36\x39\x22\x20\x66\x78\x3d\
+\x22\x32\x39\x33\x2e\x31\x37\x34\x22\x20\x66\x79\x3d\x22\x2d\x33\
+\x35\x35\x2e\x30\x32\x31\x31\x22\x20\x67\x72\x61\x64\x69\x65\x6e\
+\x74\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\
+\x69\x78\x28\x31\x20\x30\x20\x30\x20\x2d\x31\x20\x2d\x32\x38\x35\
+\x2e\x37\x36\x39\x35\x20\x2d\x33\x33\x34\x2e\x37\x37\x30\x35\x29\
+\x22\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\x3d\
+\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\x22\
+\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\x65\
+\x74\x3d\x22\x30\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\
+\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x46\x46\x46\x46\x46\x46\x22\
+\x2f\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\
+\x65\x74\x3d\x22\x30\x2e\x36\x35\x22\x20\x73\x74\x79\x6c\x65\x3d\
+\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x44\x30\x44\
+\x32\x44\x33\x22\x2f\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\
+\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\x22\x20\x73\x74\x79\x6c\x65\
+\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x44\x30\
+\x44\x32\x44\x33\x22\x2f\x3e\x0d\x0a\x3c\x2f\x72\x61\x64\x69\x61\
+\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\x0d\x0a\x3c\x63\x69\x72\
+\x63\x6c\x65\x20\x66\x69\x6c\x6c\x3d\x22\x75\x72\x6c\x28\x23\x53\
+\x56\x47\x49\x44\x5f\x31\x5f\x29\x22\x20\x63\x78\x3d\x22\x32\x30\
+\x2e\x32\x33\x31\x22\x20\x63\x79\x3d\x22\x32\x30\x2e\x33\x33\x38\
+\x22\x20\x72\x3d\x22\x31\x39\x2e\x37\x32\x39\x22\x2f\x3e\x0d\x0a\
+\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x30\x36\
+\x45\x32\x32\x22\x20\x64\x3d\x22\x4d\x32\x30\x2e\x32\x33\x2c\x32\
+\x30\x2e\x32\x31\x31\x6c\x31\x36\x2e\x37\x39\x34\x2c\x39\x2e\x34\
+\x39\x34\x63\x31\x2e\x35\x38\x38\x2d\x32\x2e\x38\x2c\x32\x2e\x35\
+\x31\x33\x2d\x36\x2e\x30\x32\x34\x2c\x32\x2e\x35\x31\x33\x2d\x39\
+\x2e\x34\x37\x35\x63\x30\x2d\x31\x30\x2e\x36\x36\x32\x2d\x38\x2e\
+\x36\x34\x36\x2d\x31\x39\x2e\x33\x30\x37\x2d\x31\x39\x2e\x33\x30\
+\x37\x2d\x31\x39\x2e\x33\x30\x37\x56\x32\x30\x2e\x32\x33\x0d\x0a\
+\x09\x6c\x30\x2c\x30\x6c\x30\x2e\x30\x32\x31\x2c\x30\x2e\x30\x31\
+\x35\x4c\x32\x30\x2e\x32\x33\x2c\x32\x30\x2e\x32\x31\x31\x7a\x22\
+\x2f\x3e\x0d\x0a\x3c\x72\x61\x64\x69\x61\x6c\x47\x72\x61\x64\x69\
+\x65\x6e\x74\x20\x69\x64\x3d\x22\x53\x56\x47\x49\x44\x5f\x32\x5f\
+\x22\x20\x63\x78\x3d\x22\x33\x30\x36\x2e\x30\x30\x30\x35\x22\x20\
+\x63\x79\x3d\x22\x2d\x33\x35\x35\x2e\x31\x30\x38\x39\x22\x20\x72\
+\x3d\x22\x31\x39\x2e\x36\x36\x34\x38\x22\x20\x67\x72\x61\x64\x69\
+\x65\x6e\x74\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\
+\x74\x72\x69\x78\x28\x31\x20\x30\x20\x30\x20\x2d\x31\x20\x2d\x32\
+\x38\x35\x2e\x37\x36\x39\x35\x20\x2d\x33\x33\x34\x2e\x37\x37\x30\
+\x35\x29\x22\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\
+\x73\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\
+\x65\x22\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\
+\x73\x65\x74\x3d\x22\x30\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\
+\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x46\x30\x35\x42\x32\
+\x32\x22\x2f\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\
+\x66\x73\x65\x74\x3d\x22\x31\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\
+\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x46\x46\x46\x46\
+\x46\x46\x22\x2f\x3e\x0d\x0a\x3c\x2f\x72\x61\x64\x69\x61\x6c\x47\
+\x72\x61\x64\x69\x65\x6e\x74\x3e\x0d\x0a\x3c\x63\x69\x72\x63\x6c\
+\x65\x20\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x30\x2e\x34\x22\x20\
+\x66\x69\x6c\x6c\x3d\x22\x75\x72\x6c\x28\x23\x53\x56\x47\x49\x44\
+\x5f\x32\x5f\x29\x22\x20\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\
+\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\x77\x20\x20\x20\x20\
+\x22\x20\x63\x78\x3d\x22\x32\x30\x2e\x32\x33\x31\x22\x20\x63\x79\
+\x3d\x22\x32\x30\x2e\x33\x33\x39\x22\x20\x72\x3d\x22\x31\x39\x2e\
+\x36\x36\x35\x22\x2f\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x66\x69\
+\x6c\x6c\x3d\x22\x23\x35\x38\x35\x39\x35\x42\x22\x20\x64\x3d\x22\
+\x4d\x32\x30\x2e\x32\x33\x2c\x34\x30\x2e\x34\x35\x38\x63\x2d\x31\
+\x31\x2e\x31\x35\x34\x2c\x30\x2d\x32\x30\x2e\x32\x32\x39\x2d\x39\
+\x2e\x30\x37\x33\x2d\x32\x30\x2e\x32\x32\x39\x2d\x32\x30\x2e\x32\
+\x32\x39\x63\x30\x2d\x31\x31\x2e\x31\x35\x35\x2c\x39\x2e\x30\x37\
+\x35\x2d\x32\x30\x2e\x32\x32\x39\x2c\x32\x30\x2e\x32\x32\x39\x2d\
+\x32\x30\x2e\x32\x32\x39\x0d\x0a\x09\x63\x31\x31\x2e\x31\x35\x34\
+\x2c\x30\x2c\x32\x30\x2e\x32\x32\x39\x2c\x39\x2e\x30\x37\x35\x2c\
+\x32\x30\x2e\x32\x32\x39\x2c\x32\x30\x2e\x32\x32\x39\x43\x34\x30\
+\x2e\x34\x35\x38\x2c\x33\x31\x2e\x33\x38\x34\x2c\x33\x31\x2e\x33\
+\x38\x34\x2c\x34\x30\x2e\x34\x35\x38\x2c\x32\x30\x2e\x32\x33\x2c\
+\x34\x30\x2e\x34\x35\x38\x7a\x20\x4d\x32\x30\x2e\x32\x33\x2c\x31\
+\x2e\x30\x30\x31\x43\x39\x2e\x36\x32\x36\x2c\x31\x2e\x30\x30\x31\
+\x2c\x31\x2e\x30\x30\x31\x2c\x39\x2e\x36\x32\x37\x2c\x31\x2e\x30\
+\x30\x31\x2c\x32\x30\x2e\x32\x33\x0d\x0a\x09\x63\x30\x2c\x31\x30\
+\x2e\x36\x30\x34\x2c\x38\x2e\x36\x32\x36\x2c\x31\x39\x2e\x32\x32\
+\x39\x2c\x31\x39\x2e\x32\x32\x39\x2c\x31\x39\x2e\x32\x32\x39\x63\
+\x31\x30\x2e\x36\x30\x34\x2c\x30\x2c\x31\x39\x2e\x32\x32\x39\x2d\
+\x38\x2e\x36\x32\x35\x2c\x31\x39\x2e\x32\x32\x39\x2d\x31\x39\x2e\
+\x32\x32\x39\x43\x33\x39\x2e\x34\x35\x38\x2c\x39\x2e\x36\x32\x37\
+\x2c\x33\x30\x2e\x38\x33\x33\x2c\x31\x2e\x30\x30\x31\x2c\x32\x30\
+\x2e\x32\x33\x2c\x31\x2e\x30\x30\x31\x7a\x22\x2f\x3e\x0d\x0a\x3c\
+\x72\x61\x64\x69\x61\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\x20\x69\
+\x64\x3d\x22\x53\x56\x47\x49\x44\x5f\x33\x5f\x22\x20\x63\x78\x3d\
+\x22\x2d\x33\x37\x2e\x36\x31\x31\x38\x22\x20\x63\x79\x3d\x22\x33\
+\x39\x2e\x39\x31\x35\x35\x22\x20\x72\x3d\x22\x37\x2e\x34\x33\x33\
+\x36\x22\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x54\x72\x61\x6e\x73\
+\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\x28\x31\x2e\x36\
+\x34\x20\x2d\x30\x2e\x31\x36\x31\x32\x20\x30\x2e\x30\x38\x39\x37\
+\x20\x30\x2e\x39\x31\x33\x32\x20\x37\x37\x2e\x32\x37\x37\x31\x20\
+\x2d\x33\x34\x2e\x35\x30\x33\x34\x29\x22\x20\x67\x72\x61\x64\x69\
+\x65\x6e\x74\x55\x6e\x69\x74\x73\x3d\x22\x75\x73\x65\x72\x53\x70\
+\x61\x63\x65\x4f\x6e\x55\x73\x65\x22\x3e\x0d\x0a\x09\x3c\x73\x74\
+\x6f\x70\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x30\x2e\x32\x35\
+\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\
+\x6c\x6f\x72\x3a\x23\x46\x46\x46\x46\x46\x46\x22\x2f\x3e\x0d\x0a\
+\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\
+\x31\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\
+\x6f\x6c\x6f\x72\x3a\x23\x46\x46\x46\x46\x46\x46\x3b\x73\x74\x6f\
+\x70\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x30\x22\x2f\x3e\x0d\x0a\
+\x3c\x2f\x72\x61\x64\x69\x61\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\
+\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x6f\x70\x61\x63\x69\x74\x79\
+\x3d\x22\x30\x2e\x37\x22\x20\x66\x69\x6c\x6c\x3d\x22\x75\x72\x6c\
+\x28\x23\x53\x56\x47\x49\x44\x5f\x33\x5f\x29\x22\x20\x64\x3d\x22\
+\x4d\x33\x31\x2e\x33\x36\x34\x2c\x36\x2e\x38\x31\x31\x63\x30\x2e\
+\x33\x36\x38\x2c\x33\x2e\x37\x35\x2d\x34\x2e\x37\x39\x31\x2c\x37\
+\x2e\x33\x32\x35\x2d\x31\x31\x2e\x35\x32\x34\x2c\x37\x2e\x39\x38\
+\x37\x53\x37\x2e\x33\x34\x39\x2c\x31\x32\x2e\x39\x35\x37\x2c\x36\
+\x2e\x39\x38\x2c\x39\x2e\x32\x30\x37\x0d\x0a\x09\x63\x2d\x30\x2e\
+\x33\x36\x38\x2d\x33\x2e\x37\x34\x39\x2c\x34\x2e\x37\x39\x32\x2d\
+\x37\x2e\x33\x32\x34\x2c\x31\x31\x2e\x35\x32\x35\x2d\x37\x2e\x39\
+\x38\x36\x53\x33\x30\x2e\x39\x39\x35\x2c\x33\x2e\x30\x36\x32\x2c\
+\x33\x31\x2e\x33\x36\x34\x2c\x36\x2e\x38\x31\x31\x7a\x22\x2f\x3e\
+\x0d\x0a\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\x32\
+\x33\x31\x46\x32\x30\x22\x20\x64\x3d\x22\x4d\x32\x30\x2e\x33\x32\
+\x34\x2c\x33\x37\x2e\x38\x32\x31\x48\x32\x30\x2e\x32\x63\x2d\x30\
+\x2e\x36\x39\x2c\x30\x2d\x31\x2e\x32\x35\x2d\x30\x2e\x35\x35\x39\
+\x2d\x31\x2e\x32\x35\x2d\x31\x2e\x32\x35\x63\x30\x2d\x30\x2e\x36\
+\x38\x38\x2c\x30\x2e\x35\x36\x2d\x31\x2e\x32\x35\x2c\x31\x2e\x32\
+\x35\x2d\x31\x2e\x32\x35\x68\x30\x2e\x31\x30\x36\x0d\x0a\x09\x63\
+\x30\x2e\x36\x39\x31\x2c\x30\x2c\x31\x2e\x32\x35\x39\x2c\x30\x2e\
+\x35\x36\x32\x2c\x31\x2e\x32\x35\x39\x2c\x31\x2e\x32\x35\x43\x32\
+\x31\x2e\x35\x36\x36\x2c\x33\x37\x2e\x32\x36\x32\x2c\x32\x31\x2e\
+\x30\x31\x35\x2c\x33\x37\x2e\x38\x32\x31\x2c\x32\x30\x2e\x33\x32\
+\x34\x2c\x33\x37\x2e\x38\x32\x31\x7a\x20\x4d\x31\x32\x2e\x31\x33\
+\x35\x2c\x33\x35\x2e\x36\x38\x32\x63\x2d\x30\x2e\x32\x30\x39\x2c\
+\x30\x2d\x30\x2e\x34\x32\x32\x2d\x30\x2e\x30\x35\x34\x2d\x30\x2e\
+\x36\x31\x36\x2d\x30\x2e\x31\x36\x33\x0d\x0a\x09\x6c\x2d\x30\x2e\
+\x31\x32\x35\x2d\x30\x2e\x30\x37\x31\x63\x2d\x30\x2e\x35\x39\x35\
+\x2d\x30\x2e\x33\x35\x32\x2d\x30\x2e\x37\x39\x33\x2d\x31\x2e\x31\
+\x31\x36\x2d\x30\x2e\x34\x34\x32\x2d\x31\x2e\x37\x31\x32\x63\x30\
+\x2e\x33\x35\x2d\x30\x2e\x35\x39\x35\x2c\x31\x2e\x31\x31\x37\x2d\
+\x30\x2e\x37\x39\x32\x2c\x31\x2e\x37\x31\x31\x2d\x30\x2e\x34\x34\
+\x31\x6c\x30\x2e\x30\x39\x31\x2c\x30\x2e\x30\x35\x32\x0d\x0a\x09\
+\x63\x30\x2e\x36\x30\x31\x2c\x30\x2e\x33\x34\x31\x2c\x30\x2e\x38\
+\x31\x31\x2c\x31\x2e\x31\x30\x34\x2c\x30\x2e\x34\x37\x2c\x31\x2e\
+\x37\x30\x34\x43\x31\x32\x2e\x39\x39\x32\x2c\x33\x35\x2e\x34\x35\
+\x35\x2c\x31\x32\x2e\x35\x37\x2c\x33\x35\x2e\x36\x38\x32\x2c\x31\
+\x32\x2e\x31\x33\x35\x2c\x33\x35\x2e\x36\x38\x32\x7a\x20\x4d\x32\
+\x38\x2e\x33\x38\x2c\x33\x35\x2e\x36\x35\x31\x63\x2d\x30\x2e\x34\
+\x33\x33\x2c\x30\x2d\x30\x2e\x38\x35\x33\x2d\x30\x2e\x32\x32\x36\
+\x2d\x31\x2e\x30\x38\x34\x2d\x30\x2e\x36\x32\x37\x0d\x0a\x09\x63\
+\x2d\x30\x2e\x33\x34\x34\x2d\x30\x2e\x35\x39\x39\x2d\x30\x2e\x31\
+\x33\x39\x2d\x31\x2e\x33\x36\x32\x2c\x30\x2e\x34\x36\x31\x2d\x31\
+\x2e\x37\x30\x37\x6c\x30\x2e\x30\x39\x36\x2d\x30\x2e\x30\x35\x35\
+\x63\x30\x2e\x35\x39\x34\x2d\x30\x2e\x33\x35\x31\x2c\x31\x2e\x33\
+\x36\x31\x2d\x30\x2e\x31\x35\x34\x2c\x31\x2e\x37\x31\x31\x2c\x30\
+\x2e\x34\x34\x32\x63\x30\x2e\x33\x35\x2c\x30\x2e\x35\x39\x34\x2c\
+\x30\x2e\x31\x35\x32\x2c\x31\x2e\x33\x35\x39\x2d\x30\x2e\x34\x34\
+\x33\x2c\x31\x2e\x37\x31\x31\x0d\x0a\x09\x6c\x2d\x30\x2e\x31\x31\
+\x37\x2c\x30\x2e\x30\x36\x38\x43\x32\x38\x2e\x38\x30\x36\x2c\x33\
+\x35\x2e\x35\x39\x37\x2c\x32\x38\x2e\x35\x39\x33\x2c\x33\x35\x2e\
+\x36\x35\x31\x2c\x32\x38\x2e\x33\x38\x2c\x33\x35\x2e\x36\x35\x31\
+\x7a\x20\x4d\x36\x2e\x31\x31\x33\x2c\x32\x39\x2e\x37\x33\x34\x63\
+\x2d\x30\x2e\x34\x32\x38\x2c\x30\x2d\x30\x2e\x38\x34\x36\x2d\x30\
+\x2e\x32\x32\x2d\x31\x2e\x30\x37\x38\x2d\x30\x2e\x36\x31\x35\x4c\
+\x34\x2e\x39\x36\x37\x2c\x32\x39\x0d\x0a\x09\x63\x2d\x30\x2e\x33\
+\x34\x34\x2d\x30\x2e\x35\x39\x39\x2d\x30\x2e\x31\x33\x39\x2d\x31\
+\x2e\x33\x36\x32\x2c\x30\x2e\x34\x36\x2d\x31\x2e\x37\x30\x37\x63\
+\x30\x2e\x36\x2d\x30\x2e\x33\x34\x32\x2c\x31\x2e\x33\x36\x33\x2d\
+\x30\x2e\x31\x33\x39\x2c\x31\x2e\x37\x30\x37\x2c\x30\x2e\x34\x36\
+\x31\x4c\x37\x2e\x31\x39\x2c\x32\x37\x2e\x38\x35\x63\x30\x2e\x33\
+\x35\x2c\x30\x2e\x35\x39\x34\x2c\x30\x2e\x31\x35\x32\x2c\x31\x2e\
+\x33\x36\x2d\x30\x2e\x34\x34\x33\x2c\x31\x2e\x37\x31\x31\x0d\x0a\
+\x09\x43\x36\x2e\x35\x34\x37\x2c\x32\x39\x2e\x36\x37\x38\x2c\x36\
+\x2e\x33\x32\x39\x2c\x32\x39\x2e\x37\x33\x34\x2c\x36\x2e\x31\x31\
+\x33\x2c\x32\x39\x2e\x37\x33\x34\x7a\x20\x4d\x33\x34\x2e\x33\x37\
+\x38\x2c\x32\x39\x2e\x36\x38\x63\x2d\x30\x2e\x32\x31\x35\x2c\x30\
+\x2d\x30\x2e\x34\x33\x35\x2d\x30\x2e\x30\x35\x38\x2d\x30\x2e\x36\
+\x33\x33\x2d\x30\x2e\x31\x37\x35\x63\x2d\x30\x2e\x35\x39\x37\x2d\
+\x30\x2e\x33\x35\x2d\x30\x2e\x37\x39\x33\x2d\x31\x2e\x31\x31\x35\
+\x2d\x30\x2e\x34\x34\x33\x2d\x31\x2e\x37\x31\x31\x0d\x0a\x09\x6c\
+\x30\x2e\x30\x35\x33\x2d\x30\x2e\x30\x39\x63\x30\x2e\x33\x34\x2d\
+\x30\x2e\x36\x30\x32\x2c\x31\x2e\x31\x30\x35\x2d\x30\x2e\x38\x31\
+\x32\x2c\x31\x2e\x37\x30\x33\x2d\x30\x2e\x34\x37\x31\x63\x30\x2e\
+\x36\x30\x32\x2c\x30\x2e\x33\x34\x2c\x30\x2e\x38\x31\x31\x2c\x31\
+\x2e\x31\x30\x34\x2c\x30\x2e\x34\x37\x31\x2c\x31\x2e\x37\x30\x34\
+\x6c\x2d\x30\x2e\x30\x37\x32\x2c\x30\x2e\x31\x32\x35\x0d\x0a\x09\
+\x43\x33\x35\x2e\x32\x32\x34\x2c\x32\x39\x2e\x34\x35\x38\x2c\x33\
+\x34\x2e\x38\x30\x36\x2c\x32\x39\x2e\x36\x38\x2c\x33\x34\x2e\x33\
+\x37\x38\x2c\x32\x39\x2e\x36\x38\x7a\x20\x4d\x33\x2e\x38\x37\x31\
+\x2c\x32\x31\x2e\x35\x37\x34\x63\x2d\x30\x2e\x36\x39\x2c\x30\x2d\
+\x31\x2e\x32\x35\x2d\x30\x2e\x35\x36\x2d\x31\x2e\x32\x35\x2d\x31\
+\x2e\x32\x35\x76\x2d\x30\x2e\x30\x33\x35\x63\x30\x2d\x30\x2e\x36\
+\x39\x2c\x30\x2e\x35\x36\x2d\x31\x2e\x32\x39\x35\x2c\x31\x2e\x32\
+\x35\x2d\x31\x2e\x32\x39\x35\x0d\x0a\x09\x73\x31\x2e\x32\x35\x2c\
+\x30\x2e\x35\x31\x35\x2c\x31\x2e\x32\x35\x2c\x31\x2e\x32\x30\x36\
+\x76\x30\x2e\x31\x32\x34\x43\x35\x2e\x31\x32\x31\x2c\x32\x31\x2e\
+\x30\x31\x34\x2c\x34\x2e\x35\x36\x32\x2c\x32\x31\x2e\x35\x37\x34\
+\x2c\x33\x2e\x38\x37\x31\x2c\x32\x31\x2e\x35\x37\x34\x7a\x20\x4d\
+\x33\x37\x2e\x38\x33\x39\x2c\x32\x30\x2e\x31\x32\x32\x76\x30\x2e\
+\x30\x39\x34\x63\x30\x2c\x30\x2e\x36\x39\x32\x2d\x30\x2e\x35\x36\
+\x32\x2c\x31\x2e\x32\x37\x32\x2d\x31\x2e\x32\x35\x2c\x31\x2e\x32\
+\x37\x32\x0d\x0a\x09\x63\x2d\x30\x2e\x36\x39\x31\x2c\x30\x2d\x31\
+\x2e\x32\x35\x2d\x30\x2e\x35\x33\x37\x2d\x31\x2e\x32\x35\x2d\x31\
+\x2e\x32\x32\x39\x76\x2d\x30\x2e\x31\x32\x34\x63\x30\x2d\x30\x2e\
+\x36\x39\x2c\x30\x2e\x35\x35\x39\x2d\x31\x2e\x32\x38\x35\x2c\x31\
+\x2e\x32\x35\x2d\x31\x2e\x32\x38\x35\x63\x30\x2e\x36\x38\x38\x2c\
+\x30\x2c\x31\x2e\x32\x35\x2c\x30\x2e\x35\x32\x35\x2c\x31\x2e\x32\
+\x35\x2c\x31\x2e\x32\x31\x36\x20\x4d\x36\x2c\x31\x33\x2e\x33\x38\
+\x32\x0d\x0a\x09\x63\x2d\x30\x2e\x32\x30\x39\x2c\x30\x2d\x30\x2e\
+\x34\x32\x31\x2d\x30\x2e\x30\x35\x32\x2d\x30\x2e\x36\x31\x35\x2d\
+\x30\x2e\x31\x36\x33\x63\x2d\x30\x2e\x36\x30\x31\x2d\x30\x2e\x33\
+\x34\x2d\x30\x2e\x38\x31\x31\x2d\x31\x2e\x31\x30\x34\x2d\x30\x2e\
+\x34\x37\x31\x2d\x31\x2e\x37\x30\x34\x6c\x30\x2e\x30\x37\x32\x2d\
+\x30\x2e\x31\x32\x35\x63\x30\x2e\x33\x35\x31\x2d\x30\x2e\x35\x39\
+\x36\x2c\x31\x2e\x31\x31\x38\x2d\x30\x2e\x37\x39\x32\x2c\x31\x2e\
+\x37\x31\x31\x2d\x30\x2e\x34\x34\x32\x0d\x0a\x09\x63\x30\x2e\x35\
+\x39\x36\x2c\x30\x2e\x33\x35\x2c\x30\x2e\x37\x39\x33\x2c\x31\x2e\
+\x31\x31\x36\x2c\x30\x2e\x34\x34\x33\x2c\x31\x2e\x37\x31\x31\x4c\
+\x37\x2e\x30\x38\x38\x2c\x31\x32\x2e\x37\x35\x43\x36\x2e\x38\x35\
+\x38\x2c\x31\x33\x2e\x31\x35\x35\x2c\x36\x2e\x34\x33\x36\x2c\x31\
+\x33\x2e\x33\x38\x32\x2c\x36\x2c\x31\x33\x2e\x33\x38\x32\x7a\x20\
+\x4d\x33\x34\x2e\x33\x39\x34\x2c\x31\x33\x2e\x32\x36\x37\x0d\x0a\
+\x09\x63\x2d\x30\x2e\x34\x33\x34\x2c\x30\x2d\x30\x2e\x38\x35\x34\
+\x2d\x30\x2e\x32\x32\x35\x2d\x31\x2e\x30\x38\x34\x2d\x30\x2e\x36\
+\x32\x36\x6c\x2d\x30\x2e\x30\x35\x37\x2d\x30\x2e\x30\x39\x37\x63\
+\x2d\x30\x2e\x33\x35\x31\x2d\x30\x2e\x35\x39\x35\x2d\x30\x2e\x31\
+\x35\x32\x2d\x31\x2e\x33\x36\x2c\x30\x2e\x34\x34\x32\x2d\x31\x2e\
+\x37\x31\x32\x63\x30\x2e\x35\x39\x35\x2d\x30\x2e\x33\x34\x38\x2c\
+\x31\x2e\x33\x36\x31\x2d\x30\x2e\x31\x35\x32\x2c\x31\x2e\x37\x31\
+\x32\x2c\x30\x2e\x34\x34\x33\x0d\x0a\x09\x6c\x30\x2e\x30\x36\x37\
+\x2c\x30\x2e\x31\x31\x37\x63\x30\x2e\x33\x34\x34\x2c\x30\x2e\x36\
+\x2c\x30\x2e\x31\x33\x39\x2c\x31\x2e\x33\x36\x33\x2d\x30\x2e\x34\
+\x35\x39\x2c\x31\x2e\x37\x30\x37\x43\x33\x34\x2e\x38\x32\x2c\x31\
+\x33\x2e\x32\x31\x33\x2c\x33\x34\x2e\x36\x30\x35\x2c\x31\x33\x2e\
+\x32\x36\x37\x2c\x33\x34\x2e\x33\x39\x34\x2c\x31\x33\x2e\x32\x36\
+\x37\x7a\x20\x4d\x31\x31\x2e\x39\x34\x34\x2c\x37\x2e\x33\x35\x33\
+\x0d\x0a\x09\x63\x2d\x30\x2e\x34\x32\x39\x2c\x30\x2d\x30\x2e\x38\
+\x34\x35\x2d\x30\x2e\x32\x32\x2d\x31\x2e\x30\x37\x38\x2d\x30\x2e\
+\x36\x31\x36\x63\x2d\x30\x2e\x33\x35\x31\x2d\x30\x2e\x35\x39\x35\
+\x2d\x30\x2e\x31\x35\x32\x2d\x31\x2e\x33\x36\x2c\x30\x2e\x34\x34\
+\x32\x2d\x31\x2e\x37\x31\x31\x6c\x30\x2e\x31\x31\x38\x2d\x30\x2e\
+\x30\x36\x39\x63\x30\x2e\x36\x2d\x30\x2e\x33\x34\x32\x2c\x31\x2e\
+\x33\x36\x33\x2d\x30\x2e\x31\x33\x38\x2c\x31\x2e\x37\x30\x37\x2c\
+\x30\x2e\x34\x36\x0d\x0a\x09\x63\x30\x2e\x33\x34\x35\x2c\x30\x2e\
+\x35\x39\x39\x2c\x30\x2e\x31\x33\x38\x2c\x31\x2e\x33\x36\x33\x2d\
+\x30\x2e\x34\x36\x2c\x31\x2e\x37\x30\x37\x4c\x31\x32\x2e\x35\x37\
+\x38\x2c\x37\x2e\x31\x38\x43\x31\x32\x2e\x33\x37\x39\x2c\x37\x2e\
+\x32\x39\x37\x2c\x31\x32\x2e\x31\x36\x2c\x37\x2e\x33\x35\x33\x2c\
+\x31\x31\x2e\x39\x34\x34\x2c\x37\x2e\x33\x35\x33\x7a\x20\x4d\x32\
+\x38\x2e\x34\x30\x32\x2c\x37\x2e\x32\x38\x37\x0d\x0a\x09\x63\x2d\
+\x30\x2e\x32\x31\x37\x2c\x30\x2d\x30\x2e\x34\x33\x34\x2d\x30\x2e\
+\x30\x35\x36\x2d\x30\x2e\x36\x33\x33\x2d\x30\x2e\x31\x37\x33\x6c\
+\x2d\x30\x2e\x30\x39\x32\x2d\x30\x2e\x30\x35\x32\x63\x2d\x30\x2e\
+\x36\x2d\x30\x2e\x33\x34\x31\x2d\x30\x2e\x38\x31\x31\x2d\x31\x2e\
+\x31\x30\x34\x2d\x30\x2e\x34\x36\x39\x2d\x31\x2e\x37\x30\x34\x63\
+\x30\x2e\x33\x34\x2d\x30\x2e\x36\x30\x31\x2c\x31\x2e\x31\x30\x34\
+\x2d\x30\x2e\x38\x31\x31\x2c\x31\x2e\x37\x30\x33\x2d\x30\x2e\x34\
+\x37\x6c\x30\x2e\x31\x32\x35\x2c\x30\x2e\x30\x37\x31\x0d\x0a\x09\
+\x63\x30\x2e\x35\x39\x36\x2c\x30\x2e\x33\x35\x31\x2c\x30\x2e\x37\
+\x39\x33\x2c\x31\x2e\x31\x31\x37\x2c\x30\x2e\x34\x34\x32\x2c\x31\
+\x2e\x37\x31\x32\x43\x32\x39\x2e\x32\x34\x38\x2c\x37\x2e\x30\x36\
+\x37\x2c\x32\x38\x2e\x38\x33\x2c\x37\x2e\x32\x38\x37\x2c\x32\x38\
+\x2e\x34\x30\x32\x2c\x37\x2e\x32\x38\x37\x7a\x20\x4d\x32\x30\x2e\
+\x31\x33\x31\x2c\x32\x2e\x36\x30\x33\x68\x30\x2e\x30\x39\x35\x63\
+\x30\x2e\x36\x38\x39\x2c\x30\x2c\x31\x2e\x32\x35\x2c\x30\x2e\x35\
+\x36\x2c\x31\x2e\x32\x35\x2c\x31\x2e\x32\x35\x0d\x0a\x09\x73\x2d\
+\x30\x2e\x35\x36\x31\x2c\x31\x2e\x32\x35\x2d\x31\x2e\x32\x35\x2c\
+\x31\x2e\x32\x35\x68\x2d\x30\x2e\x31\x32\x34\x63\x2d\x30\x2e\x36\
+\x39\x2c\x30\x2d\x31\x2e\x32\x35\x2d\x30\x2e\x35\x36\x2d\x31\x2e\
+\x32\x35\x2d\x31\x2e\x32\x35\x73\x30\x2e\x35\x36\x2d\x31\x2e\x32\
+\x35\x2c\x31\x2e\x32\x35\x2d\x31\x2e\x32\x35\x22\x2f\x3e\x0d\x0a\
+\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\x32\x33\x31\
+\x46\x32\x30\x22\x20\x64\x3d\x22\x4d\x33\x32\x2e\x31\x39\x31\x2c\
+\x32\x37\x2e\x39\x37\x33\x63\x2d\x30\x2e\x31\x36\x38\x2c\x30\x2d\
+\x30\x2e\x33\x33\x36\x2d\x30\x2e\x30\x34\x31\x2d\x30\x2e\x34\x39\
+\x2d\x30\x2e\x31\x32\x39\x4c\x31\x39\x2e\x37\x34\x2c\x32\x31\x2e\
+\x31\x30\x32\x63\x2d\x30\x2e\x33\x31\x34\x2d\x30\x2e\x31\x37\x39\
+\x2d\x30\x2e\x35\x30\x39\x2d\x30\x2e\x35\x31\x31\x2d\x30\x2e\x35\
+\x30\x39\x2d\x30\x2e\x38\x37\x31\x76\x2d\x39\x2e\x39\x31\x36\x0d\
+\x0a\x09\x63\x30\x2d\x30\x2e\x35\x35\x32\x2c\x30\x2e\x34\x34\x37\
+\x2d\x31\x2c\x31\x2d\x31\x63\x30\x2e\x35\x35\x32\x2c\x30\x2c\x31\
+\x2c\x30\x2e\x34\x34\x38\x2c\x31\x2c\x31\x76\x39\x2e\x33\x33\x32\
+\x6c\x31\x31\x2e\x34\x35\x33\x2c\x36\x2e\x34\x35\x35\x63\x30\x2e\
+\x34\x37\x39\x2c\x30\x2e\x32\x37\x31\x2c\x30\x2e\x36\x34\x39\x2c\
+\x30\x2e\x38\x38\x31\x2c\x30\x2e\x33\x37\x39\x2c\x31\x2e\x33\x36\
+\x32\x0d\x0a\x09\x43\x33\x32\x2e\x38\x37\x38\x2c\x32\x37\x2e\x37\
+\x39\x31\x2c\x33\x32\x2e\x35\x33\x39\x2c\x32\x37\x2e\x39\x37\x33\
+\x2c\x33\x32\x2e\x31\x39\x31\x2c\x32\x37\x2e\x39\x37\x33\x7a\x22\
+\x2f\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x06\xfe\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x50\x00\x00\x00\x50\x08\x03\x00\x00\x00\xb9\xcf\x02\x9f\
+\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\
+\x01\x00\x9a\x9c\x18\x00\x00\x02\x10\x50\x4c\x54\x45\x00\xcc\x33\
+\x06\xcd\x38\x07\xcd\x38\x0c\xce\x3c\x0d\xce\x3d\x14\xd0\x43\x15\
+\xd0\x43\x16\xd0\x45\x23\x1f\x20\x23\x1f\x21\x23\x20\x20\x23\x20\
+\x21\x23\xd2\x4f\x24\x20\x21\x24\xd3\x50\x25\x21\x22\x25\xd3\x51\
+\x26\x22\x23\x26\x23\x23\x27\x23\x24\x28\x24\x25\x29\x25\x26\x2a\
+\x26\x27\x2c\x29\x2a\x2d\x2a\x2a\x2e\x2a\x2b\x33\x2f\x30\x33\x30\
+\x30\x33\x31\x31\x33\x37\x45\x34\x31\x31\x34\xd5\x5c\x35\xd6\x5d\
+\x37\x33\x34\x37\x34\x34\x39\x36\x36\x39\xd6\x60\x3a\x37\x38\x3a\
+\xd6\x61\x3c\xd7\x62\x3d\x39\x3a\x3d\x3a\x3a\x3d\xd7\x63\x3e\x3a\
+\x3b\x3f\x3c\x3c\x40\x3d\x3e\x41\x3f\x3f\x42\x3f\x3f\x43\x40\x40\
+\x44\x40\x41\x47\x44\x45\x48\x45\x46\x4a\x47\x47\x4b\x48\x48\x4c\
+\x48\x49\x4d\x4a\x4b\x4e\x4b\x4c\x4e\x4c\x4c\x50\x4d\x4f\x51\x4e\
+\x4e\x52\x4f\x50\x57\x54\x54\x58\x55\x55\x59\x56\x57\x59\x57\x57\
+\x5c\x59\x5a\x5e\x5b\x5c\x5f\x5d\x5e\x60\x5e\x5e\x66\x64\x64\x69\
+\x66\x67\x69\x67\x67\x69\x67\x68\x6b\x69\x69\x6e\x6b\x6c\x6f\x6c\
+\x6d\x70\x6d\x6e\x72\xe1\x8e\x73\x71\x71\x73\xe1\x8f\x74\x72\x72\
+\x76\x73\x74\x78\x75\x76\x7b\x79\x79\x7e\x7b\x7c\x82\x80\x80\x86\
+\x84\x85\x87\x85\x85\x89\x87\x87\x8b\x88\x89\x8c\x8b\x8b\x90\x8e\
+\x8e\x91\x90\x91\x93\x91\x92\x94\x92\x93\x99\xe8\xad\x9a\x98\x99\
+\x9a\xe8\xae\x9b\xe8\xae\x9c\x9a\x9a\x9d\x9b\x9b\x9e\x9c\x9c\x9e\
+\x9d\x9d\x9f\x9d\x9e\xa4\xa3\xa3\xa8\xa6\xa7\xa9\xa7\xa8\xab\xaa\
+\xaa\xac\xab\xab\xae\xad\xad\xb0\xaf\xaf\xb2\xb1\xb1\xb3\xb2\xb2\
+\xb4\xb3\xb3\xb5\xed\xc3\xb7\xb6\xb6\xb7\xed\xc4\xb9\xed\xc6\xba\
+\xb9\xb9\xbb\xee\xc8\xbc\xba\xbb\xbc\xee\xc9\xbd\xbc\xbd\xbd\xee\
+\xca\xc1\xbf\xc0\xc3\xc2\xc3\xc4\xc3\xc4\xc6\xc5\xc5\xc8\xc7\xc7\
+\xca\xc9\xc9\xd0\xcf\xcf\xd1\xd0\xd1\xd3\xf2\xdb\xd4\xf2\xdb\xd5\
+\xf2\xdc\xd6\xd6\xd6\xd9\xd8\xd9\xd9\xf3\xdf\xda\xd9\xd9\xda\xf3\
+\xe0\xdd\xdc\xdc\xde\xde\xde\xdf\xde\xdf\xe0\xdf\xe0\xe4\xe4\xe4\
+\xe7\xe6\xe7\xe7\xe7\xe7\xec\xec\xec\xed\xed\xed\xee\xed\xee\xee\
+\xee\xee\xef\xee\xee\xef\xef\xef\xf1\xf1\xf1\xf3\xf3\xf3\xf5\xf4\
+\xf5\xf5\xf5\xf6\xf6\xf5\xf5\xf6\xf6\xf6\xf6\xf8\xf7\xf7\xf7\xf7\
+\xf7\xf7\xf8\xf7\xf9\xf7\xf8\xf8\xf8\xf8\xf8\xf9\xf8\xf9\xf8\xf9\
+\xf9\xf9\xf9\xfa\xfa\xfa\xfa\xfa\xfa\xfa\xfb\xfb\xfb\xfb\xfc\xfc\
+\xfc\xfd\xfd\xfd\xfd\xfe\xfe\xfe\xfe\xfe\xff\xff\xff\x2a\x71\x8e\
+\x7c\x00\x00\x00\x01\x62\x4b\x47\x44\x1d\xeb\x03\x71\x91\x00\x00\
+\x04\x87\x49\x44\x41\x54\x58\xc3\xed\x98\xf7\x7f\x14\x45\x14\xc0\
+\xf7\x14\xc9\xf0\x68\x62\x00\xf1\xce\x8f\x04\x43\x09\x20\x25\x02\
+\x56\x20\xa2\x52\x15\x62\x03\x54\x94\x10\x14\xb1\x61\xc1\x82\x11\
+\x41\x04\x91\x66\xaf\x20\x8a\x7a\x98\xf5\x98\x1d\xf6\xfe\x45\xe6\
+\x4d\xd9\x9b\x9d\x99\x0d\xb7\xe7\xfc\xc8\x4b\x72\x9f\xcb\x6e\xee\
+\x9b\xd7\xdf\x9b\x8d\x9a\x81\x25\xba\x01\x0c\x05\xfc\xe9\xbd\xe7\
+\xd7\xce\xab\xd6\xee\x7d\xfa\xdd\x4b\x61\x80\xfd\x40\xb8\xe0\xcb\
+\xaa\x23\x41\x80\x77\x00\x87\xe1\x0f\x81\xe9\x9f\x86\x00\xd6\x00\
+\xb4\x8e\x70\xf7\xcf\x21\x80\x84\x48\x1e\x72\xdf\x0c\x00\xac\x12\
+\x45\x44\x3d\xb7\x04\x02\xa2\xd5\xc2\xf2\x15\x49\x08\x20\x68\x83\
+\x81\xf4\xfd\xf9\xff\x81\xd3\x45\xca\x80\xc0\xc2\xc2\x00\xc0\x03\
+\xbb\x56\x92\x4c\x42\x68\xd8\x6c\x5e\x7e\x59\x07\x3a\x10\xb0\xd9\
+\x7c\x58\xbb\x31\x14\x70\x33\x46\x39\x24\x70\x83\x2e\x96\x60\x40\
+\x95\xd7\x01\x81\x92\x17\x52\x43\x69\xf2\xc2\x70\x1a\xca\xf2\x0b\
+\xaa\x21\x40\x48\x93\x27\xc8\xe6\x10\x0a\xb8\x51\xd6\x72\x38\xe0\
+\x26\xa2\x7a\x58\x48\x1f\x8a\xfe\x15\x14\x58\x68\xf2\xa9\x7d\xaf\
+\x09\xd9\xf7\x76\xfb\x3e\x04\xd5\x14\x7d\xc0\xb3\x73\xa4\xfe\x40\
+\xe6\x94\x08\x8a\x9c\x7a\x3e\x93\x7f\x5c\x0e\xf2\x26\x21\xcb\xca\
+\x46\xd9\x57\x29\x17\x57\x67\xcd\xb2\x0c\x50\x95\xb2\x0b\xa4\x8f\
+\xab\x04\x80\x92\x1a\xaa\x8f\x39\x26\x3f\xa7\xfc\x27\x72\xa0\x9c\
+\xc9\x5e\x0d\x77\x6b\x73\xa1\x9c\xc9\x1b\x40\xa5\x8d\x05\x7c\x03\
+\xd4\xd6\x23\xef\xcf\x2b\xd5\x60\xc5\xc7\xf2\xc0\x8f\xbb\xb3\x9d\
+\x02\xfa\xd7\xae\x59\xb3\xa5\x7c\x3f\xcc\xf9\xf0\xc4\x2c\x55\xe1\
+\xdc\x83\x0f\xfe\x52\xae\x52\xc0\x03\xfc\x6e\x89\xae\x1f\x42\xfa\
+\xbf\x2f\xdf\x60\xed\x11\xf0\xeb\xca\x2c\xff\xc8\x5d\xa7\x3b\xea\
+\xd8\xb9\x4a\xf9\x7b\x1d\xc9\x32\x7a\xc6\xd1\x0e\x9b\x83\xb1\xdb\
+\xb0\x27\x54\x30\xf0\xff\x1c\xe8\xa0\xc1\xaa\x9d\xb3\x4f\x2f\xee\
+\xdb\xf5\xc6\xc8\xe5\x05\xfb\x93\x71\x9c\xb0\x34\x4d\xd9\x95\x3f\
+\xfe\xbd\x4e\x3f\x24\x8b\x99\xbc\xb0\x5f\x79\x0f\x75\x7c\x2a\x4f\
+\x4b\xfe\x49\xe5\x9b\x54\x49\xb1\x86\x5c\x66\x0e\xac\x43\x19\xe8\
+\x26\xba\xe4\xc8\x63\x71\x8e\x77\x59\x91\x18\x4b\x50\x58\x42\x99\
+\xbf\x1f\x12\xb3\xc8\x5a\xdf\x70\xdf\x6f\x39\x63\x19\xf2\x92\x46\
+\x6c\x4a\x23\x2d\x00\x02\x18\x75\xab\x12\xa9\x37\x97\x80\x31\xea\
+\x96\xc4\x8e\xa4\x9e\xb4\x81\x56\x14\xa4\x8e\xe2\xfd\xed\x5f\x98\
+\xbc\x94\x7f\x31\x1a\xc7\xa3\x23\x83\xf3\xbb\x2a\x95\xae\xf9\x83\
+\x23\xa3\x06\xd1\x4d\xec\x16\x55\xfd\x3a\xf5\xfd\x1c\x0f\x5d\x47\
+\xe3\xfa\xde\x5b\xa3\x4c\xa6\x0c\xd7\x11\x48\x53\x4f\xc7\x06\x43\
+\x4b\xe9\xc1\xc9\xfb\x2d\x1e\x5a\xfb\x55\x4f\x94\x93\x9e\x73\xe8\
+\x46\x24\xda\x1a\x8a\x1c\xd6\x9d\x16\x81\x13\xc9\x1e\x13\xc8\x44\
+\x30\x0e\x8e\x8b\x2c\x19\x7f\x18\x75\x4c\x6c\x0d\xf5\x52\x0c\x1a\
+\x88\x32\xed\xa8\xe9\x40\xca\x79\x23\x95\xc8\x91\xca\x47\x5c\x45\
+\x1e\xea\x5c\xb7\x99\x68\x06\x17\x34\x12\x7a\xbf\x31\x2c\xe6\xbc\
+\x73\xe3\x23\x8f\x8c\x3b\xc9\xbd\xc8\x9c\xb9\x6c\x06\x3a\xcb\xc3\
+\xd5\x34\xe3\xb1\x38\xae\xf7\x44\x5e\xe9\xa9\x63\x5c\x7c\x33\x45\
+\x4d\xd3\xd6\xe1\x8f\xec\xcc\x80\x3c\x5f\x86\xa3\x02\x19\x42\x2f\
+\xba\x4b\x3b\x21\xd5\x3d\x62\xe9\x78\x75\x29\x64\xb3\xee\x03\x15\
+\x11\xae\xe0\xe8\xa4\x22\xe0\x24\x9e\x8f\xd4\x19\x52\xfc\xe5\x1e\
+\x75\xe1\xd8\x34\xad\x25\xd4\xce\xe2\x85\xff\x9a\x1c\x78\x28\x2a\
+\x94\x43\x96\x86\xce\xd1\xec\x15\x7d\x44\x25\xe4\x7e\xbc\x76\x05\
+\x81\x83\xc5\xc0\x41\xc7\x64\xb0\x8e\x66\x4f\x66\xf5\x42\x9e\xc1\
+\x0d\xa2\xc9\x93\x7a\x41\x31\x70\x51\x1e\xb8\x49\x9b\xdc\x1a\xa3\
+\xbf\x3f\x90\x1d\xf3\x81\xaf\x71\x57\xb1\x4a\xba\x8a\x81\x5d\xb6\
+\x86\xc4\xd9\xb1\xbf\xbd\x53\x47\x9d\xcc\x38\xde\x14\x65\x77\x53\
+\x31\xb0\x92\x07\x6e\xd4\xb9\x6c\x0e\xfa\x4f\x26\x67\x49\xb4\xfc\
+\x7c\x1b\x40\xea\x36\x58\x6b\xd0\xbf\x08\x59\x6a\x6e\x66\xd7\x37\
+\x99\x7a\xb6\xaf\x3c\x30\x1e\x68\x4d\xe6\x0b\x98\xd7\x63\x04\x65\
+\x81\x0d\x54\x65\x97\xdf\x6d\x7e\xe8\xcb\x7a\xcf\x11\x04\x8e\x9d\
+\x36\x56\x62\x7b\x1f\x62\x7c\xde\xad\xb6\x6b\xf2\x12\x02\xc7\x4e\
+\x6c\x6a\xe5\xa1\xf7\x14\xf0\x3a\x51\x6d\xe3\x21\x04\xb6\x5f\x7a\
+\x59\xc7\x76\x36\xd8\x67\x55\x09\xde\x26\xba\xf5\xd0\x58\xcd\xc1\
+\x09\x0a\x80\x67\x69\xbf\xb8\x42\xb5\x9d\xcf\x78\xe9\x15\xb6\xaf\
+\xd9\x7f\xc5\x4e\x2d\x0b\xd3\x3c\xe7\x94\x53\xb3\x64\xcb\x7d\x14\
+\x6d\x8e\xcf\xf8\x1b\xec\x97\x62\xf2\x39\x1b\x2c\x7f\xf1\x1c\xc0\
+\xdf\x51\xad\xf7\x6b\x31\x8f\xbd\x23\xe0\x43\x31\xee\xcd\x8e\xbd\
+\x5e\xf7\xd4\x5e\xcf\x49\x6a\x87\xdc\xc2\x1e\x61\x62\x02\x1f\xbc\
+\xd9\xe6\xdd\x72\x58\x8d\x66\x03\xb8\xad\x56\xad\x56\x6b\xd5\x5a\
+\x6d\x95\xe7\xb1\x69\xb2\x9e\xdf\xe3\x7f\xf0\x96\x9c\xe9\x27\x67\
+\x5b\xfe\x3b\x23\x2e\xb3\xf2\x0f\x75\x53\xb5\x77\xd4\x87\xa7\x18\
+\x83\x7e\xa8\x2e\x79\x69\x07\x4f\x89\x35\x91\xaf\x22\x5b\xe7\xe2\
+\x2a\x32\x77\xab\x5a\x45\x28\xb3\x36\x87\x36\x85\xc5\x5e\x69\xb0\
+\xd4\xde\x6d\x4a\xeb\x68\xd0\x28\x65\xcc\xd9\xbe\xda\x27\x36\x6c\
+\x5e\x83\xb2\xd4\x5d\x38\x3b\x35\x3b\x49\x68\x83\xf9\x56\xe2\x52\
+\x4a\x1a\x48\xda\xda\x87\xb9\x5c\x03\x7d\xd6\x49\x6c\x64\x26\x8a\
+\x9d\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x16\x6e\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
+\x6e\x6f\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x53\x76\x67\x20\x56\
+\x65\x63\x74\x6f\x72\x20\x49\x63\x6f\x6e\x73\x20\x3a\x20\x68\x74\
+\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x6f\x6e\x6c\x69\x6e\x65\x77\
+\x65\x62\x66\x6f\x6e\x74\x73\x2e\x63\x6f\x6d\x2f\x69\x63\x6f\x6e\
+\x20\x2d\x2d\x3e\x0a\x0a\x3c\x73\x76\x67\x0a\x20\x20\x20\x76\x65\
+\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x0a\x20\x20\x20\x78\
+\x3d\x22\x30\x70\x78\x22\x0a\x20\x20\x20\x79\x3d\x22\x30\x70\x78\
+\x22\x0a\x20\x20\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\
+\x30\x20\x32\x35\x31\x2e\x30\x30\x30\x31\x33\x20\x32\x33\x39\x2e\
+\x39\x39\x36\x32\x22\x0a\x20\x20\x20\x65\x6e\x61\x62\x6c\x65\x2d\
+\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\x77\x20\
+\x30\x20\x30\x20\x31\x30\x30\x30\x20\x31\x30\x30\x30\x22\x0a\x20\
+\x20\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\
+\x73\x65\x72\x76\x65\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x73\x76\
+\x67\x38\x38\x34\x22\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\
+\x69\x3a\x64\x6f\x63\x6e\x61\x6d\x65\x3d\x22\x74\x61\x62\x5f\x74\
+\x6f\x6b\x65\x6e\x2e\x73\x76\x67\x22\x0a\x20\x20\x20\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3a\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\
+\x2e\x32\x2e\x31\x20\x28\x39\x63\x36\x64\x34\x31\x65\x34\x31\x30\
+\x2c\x20\x32\x30\x32\x32\x2d\x30\x37\x2d\x31\x34\x29\x22\x0a\x20\
+\x20\x20\x77\x69\x64\x74\x68\x3d\x22\x32\x35\x31\x2e\x30\x30\x30\
+\x31\x32\x22\x0a\x20\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x32\
+\x33\x39\x2e\x39\x39\x36\x32\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x69\x6e\x6b\x73\x63\x61\x70\x65\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\
+\x6f\x72\x67\x2f\x6e\x61\x6d\x65\x73\x70\x61\x63\x65\x73\x2f\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x73\x6f\x64\x69\x70\x6f\x64\x69\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x73\x6f\x64\x69\x70\x6f\x64\x69\x2e\x73\x6f\x75\x72\
+\x63\x65\x66\x6f\x72\x67\x65\x2e\x6e\x65\x74\x2f\x44\x54\x44\x2f\
+\x73\x6f\x64\x69\x70\x6f\x64\x69\x2d\x30\x2e\x64\x74\x64\x22\x0a\
+\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x0a\x20\x20\
+\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\
+\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\
+\x76\x67\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x76\x67\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x3e\x3c\x64\
+\x65\x66\x73\x0a\x20\x20\x20\x69\x64\x3d\x22\x64\x65\x66\x73\x38\
+\x38\x38\x22\x3e\x3c\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\
+\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\
+\x65\x3a\x63\x6f\x6c\x6c\x65\x63\x74\x3d\x22\x61\x6c\x77\x61\x79\
+\x73\x22\x0a\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x6c\x69\x6e\x65\
+\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x31\x35\x39\x34\x22\x3e\
+\x3c\x73\x74\x6f\x70\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\
+\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\
+\x30\x30\x38\x30\x30\x30\x3b\x73\x74\x6f\x70\x2d\x6f\x70\x61\x63\
+\x69\x74\x79\x3a\x31\x3b\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x6f\
+\x66\x66\x73\x65\x74\x3d\x22\x30\x2e\x33\x31\x31\x38\x39\x37\x31\
+\x33\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x73\x74\
+\x6f\x70\x31\x35\x39\x30\x22\x20\x2f\x3e\x3c\x73\x74\x6f\x70\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\
+\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x30\x30\x63\x61\x30\x30\
+\x3b\x73\x74\x6f\x70\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\
+\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\
+\x22\x30\x2e\x36\x33\x36\x36\x35\x35\x39\x39\x22\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x69\x64\x3d\x22\x73\x74\x6f\x70\x31\x35\x39\x32\
+\x22\x20\x2f\x3e\x3c\x2f\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\
+\x69\x65\x6e\x74\x3e\x3c\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\
+\x69\x65\x6e\x74\x0a\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x3a\x63\x6f\x6c\x6c\x65\x63\x74\x3d\x22\x61\x6c\x77\x61\
+\x79\x73\x22\x0a\x20\x20\x20\x20\x20\x78\x6c\x69\x6e\x6b\x3a\x68\
+\x72\x65\x66\x3d\x22\x23\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\
+\x69\x65\x6e\x74\x31\x35\x39\x34\x22\x0a\x20\x20\x20\x20\x20\x69\
+\x64\x3d\x22\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\
+\x74\x31\x35\x39\x36\x22\x0a\x20\x20\x20\x20\x20\x78\x31\x3d\x22\
+\x39\x2e\x39\x39\x39\x31\x39\x36\x31\x22\x0a\x20\x20\x20\x20\x20\
+\x79\x31\x3d\x22\x34\x39\x39\x2e\x39\x39\x39\x37\x36\x22\x0a\x20\
+\x20\x20\x20\x20\x78\x32\x3d\x22\x39\x38\x39\x2e\x39\x39\x39\x36\
+\x33\x22\x0a\x20\x20\x20\x20\x20\x79\x32\x3d\x22\x34\x39\x39\x2e\
+\x39\x39\x39\x37\x36\x22\x0a\x20\x20\x20\x20\x20\x67\x72\x61\x64\
+\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\x3d\x22\x75\x73\x65\x72\x53\
+\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\x22\x0a\x20\x20\x20\x20\x20\
+\x73\x70\x72\x65\x61\x64\x4d\x65\x74\x68\x6f\x64\x3d\x22\x72\x65\
+\x66\x6c\x65\x63\x74\x22\x20\x2f\x3e\x3c\x2f\x64\x65\x66\x73\x3e\
+\x3c\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x6e\x61\x6d\x65\x64\x76\
+\x69\x65\x77\x0a\x20\x20\x20\x69\x64\x3d\x22\x6e\x61\x6d\x65\x64\
+\x76\x69\x65\x77\x38\x38\x36\x22\x0a\x20\x20\x20\x70\x61\x67\x65\
+\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x35\x30\x35\x30\x35\x30\x22\x0a\
+\x20\x20\x20\x62\x6f\x72\x64\x65\x72\x63\x6f\x6c\x6f\x72\x3d\x22\
+\x23\x65\x65\x65\x65\x65\x65\x22\x0a\x20\x20\x20\x62\x6f\x72\x64\
+\x65\x72\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x31\x22\x0a\x20\x20\
+\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x73\x68\x6f\x77\x70\x61\
+\x67\x65\x73\x68\x61\x64\x6f\x77\x3d\x22\x30\x22\x0a\x20\x20\x20\
+\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x70\x61\x67\x65\x6f\x70\x61\
+\x63\x69\x74\x79\x3d\x22\x30\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\
+\x63\x61\x70\x65\x3a\x70\x61\x67\x65\x63\x68\x65\x63\x6b\x65\x72\
+\x62\x6f\x61\x72\x64\x3d\x22\x30\x22\x0a\x20\x20\x20\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3a\x64\x65\x73\x6b\x63\x6f\x6c\x6f\x72\x3d\
+\x22\x23\x35\x30\x35\x30\x35\x30\x22\x0a\x20\x20\x20\x73\x68\x6f\
+\x77\x67\x72\x69\x64\x3d\x22\x66\x61\x6c\x73\x65\x22\x0a\x20\x20\
+\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x7a\x6f\x6f\x6d\x3d\x22\
+\x30\x2e\x39\x32\x31\x38\x37\x35\x22\x0a\x20\x20\x20\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3a\x63\x78\x3d\x22\x31\x33\x37\x2e\x32\x32\
+\x30\x33\x34\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x63\x79\x3d\x22\x31\x38\x33\x2e\x38\x36\x34\x34\x31\x22\x0a\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\
+\x6f\x77\x2d\x77\x69\x64\x74\x68\x3d\x22\x31\x34\x34\x30\x22\x0a\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\
+\x6f\x77\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x37\x39\x39\x22\x0a\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\
+\x6f\x77\x2d\x78\x3d\x22\x30\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\
+\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x79\x3d\x22\x32\
+\x35\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\
+\x69\x6e\x64\x6f\x77\x2d\x6d\x61\x78\x69\x6d\x69\x7a\x65\x64\x3d\
+\x22\x31\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\
+\x63\x75\x72\x72\x65\x6e\x74\x2d\x6c\x61\x79\x65\x72\x3d\x22\x67\
+\x38\x38\x32\x22\x20\x2f\x3e\x0a\x3c\x6d\x65\x74\x61\x64\x61\x74\
+\x61\x0a\x20\x20\x20\x69\x64\x3d\x22\x6d\x65\x74\x61\x64\x61\x74\
+\x61\x38\x37\x34\x22\x3e\x20\x53\x76\x67\x20\x56\x65\x63\x74\x6f\
+\x72\x20\x49\x63\x6f\x6e\x73\x20\x3a\x20\x68\x74\x74\x70\x3a\x2f\
+\x2f\x77\x77\x77\x2e\x6f\x6e\x6c\x69\x6e\x65\x77\x65\x62\x66\x6f\
+\x6e\x74\x73\x2e\x63\x6f\x6d\x2f\x69\x63\x6f\x6e\x20\x3c\x2f\x6d\
+\x65\x74\x61\x64\x61\x74\x61\x3e\x0a\x3c\x67\x0a\x20\x20\x20\x69\
+\x64\x3d\x22\x67\x38\x38\x32\x22\x0a\x20\x20\x20\x73\x74\x79\x6c\
+\x65\x3d\x22\x66\x69\x6c\x6c\x3a\x75\x72\x6c\x28\x23\x6c\x69\x6e\
+\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x31\x35\x39\x36\x29\
+\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x22\
+\x0a\x20\x20\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x74\
+\x72\x61\x6e\x73\x6c\x61\x74\x65\x28\x2d\x32\x2e\x32\x39\x39\x38\
+\x35\x30\x36\x2c\x2d\x37\x2e\x39\x39\x39\x39\x35\x38\x37\x29\x22\
+\x3e\x3c\x67\x0a\x20\x20\x20\x20\x20\x74\x72\x61\x6e\x73\x66\x6f\
+\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x30\x37\x38\
+\x34\x33\x37\x34\x36\x2c\x30\x2c\x30\x2c\x2d\x30\x2e\x30\x37\x34\
+\x39\x39\x38\x38\x31\x2c\x32\x2e\x32\x39\x39\x39\x36\x37\x38\x2c\
+\x33\x39\x31\x2e\x32\x34\x33\x39\x31\x29\x22\x0a\x20\x20\x20\x20\
+\x20\x69\x64\x3d\x22\x67\x38\x38\x30\x22\x0a\x20\x20\x20\x20\x20\
+\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\x6c\x6c\x3a\x23\x30\x61\x66\
+\x66\x30\x61\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\
+\x3a\x31\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x23\x30\x30\x30\x30\x30\
+\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\
+\x3a\x31\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\
+\x36\x36\x2e\x34\x39\x33\x38\x31\x31\x36\x36\x3b\x73\x74\x72\x6f\
+\x6b\x65\x2d\x64\x61\x73\x68\x61\x72\x72\x61\x79\x3a\x6e\x6f\x6e\
+\x65\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\
+\x3a\x72\x6f\x75\x6e\x64\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\
+\x6e\x65\x6a\x6f\x69\x6e\x3a\x62\x65\x76\x65\x6c\x3b\x70\x61\x69\
+\x6e\x74\x2d\x6f\x72\x64\x65\x72\x3a\x66\x69\x6c\x6c\x20\x6d\x61\
+\x72\x6b\x65\x72\x73\x20\x73\x74\x72\x6f\x6b\x65\x22\x0a\x20\x20\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x6c\x61\x62\x65\
+\x6c\x3d\x22\x67\x38\x38\x30\x22\x3e\x3c\x70\x61\x74\x68\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x64\x3d\x22\x4d\x20\x31\x34\x30\x38\x2e\
+\x37\x37\x32\x38\x2c\x35\x31\x30\x31\x2e\x32\x38\x37\x34\x20\x43\
+\x20\x38\x37\x32\x2e\x37\x32\x39\x32\x35\x2c\x35\x30\x33\x36\x2e\
+\x31\x36\x33\x35\x20\x34\x31\x31\x2e\x32\x39\x30\x33\x34\x2c\x34\
+\x37\x31\x30\x2e\x35\x34\x34\x34\x20\x31\x36\x38\x2e\x35\x37\x32\
+\x31\x31\x2c\x34\x32\x32\x36\x2e\x31\x39\x38\x20\x2d\x33\x33\x2e\
+\x30\x37\x32\x37\x34\x2c\x33\x38\x32\x34\x2e\x36\x37\x37\x32\x20\
+\x2d\x35\x34\x2e\x35\x38\x38\x39\x32\x35\x2c\x33\x33\x34\x32\x2e\
+\x32\x32\x35\x32\x20\x31\x30\x39\x2e\x31\x34\x39\x35\x36\x2c\x32\
+\x39\x32\x36\x2e\x37\x39\x31\x33\x20\x33\x32\x37\x2e\x38\x37\x30\
+\x32\x33\x2c\x32\x33\x37\x33\x2e\x35\x33\x32\x35\x20\x38\x32\x36\
+\x2e\x35\x39\x35\x31\x38\x2c\x31\x39\x38\x39\x2e\x37\x31\x33\x33\
+\x20\x31\x34\x31\x35\x2e\x37\x32\x37\x33\x2c\x31\x39\x32\x30\x2e\
+\x38\x30\x30\x39\x20\x63\x20\x34\x33\x31\x2e\x37\x32\x37\x35\x2c\
+\x2d\x35\x30\x2e\x35\x39\x30\x31\x20\x38\x37\x34\x2e\x38\x34\x39\
+\x39\x2c\x38\x30\x2e\x39\x33\x31\x33\x20\x31\x32\x30\x38\x2e\x35\
+\x39\x35\x37\x2c\x33\x35\x39\x2e\x31\x32\x38\x33\x20\x34\x39\x31\
+\x2e\x31\x35\x30\x32\x2c\x34\x31\x30\x2e\x33\x37\x31\x37\x20\x36\
+\x38\x39\x2e\x36\x32\x38\x2c\x31\x30\x36\x34\x2e\x38\x31\x30\x38\
+\x20\x35\x31\x30\x2e\x37\x34\x2c\x31\x36\x38\x35\x2e\x37\x34\x30\
+\x38\x20\x2d\x37\x38\x2e\x33\x39\x32\x31\x2c\x32\x37\x33\x2e\x31\
+\x36\x37\x34\x20\x2d\x32\x34\x37\x2e\x37\x37\x39\x2c\x35\x34\x33\
+\x2e\x31\x36\x36\x38\x20\x2d\x34\x36\x30\x2e\x31\x36\x35\x35\x2c\
+\x37\x33\x32\x2e\x32\x30\x32\x33\x20\x2d\x32\x35\x34\x2e\x37\x33\
+\x33\x34\x2c\x32\x32\x38\x2e\x32\x39\x32\x37\x20\x2d\x35\x35\x35\
+\x2e\x36\x33\x33\x35\x2c\x33\x36\x34\x2e\x32\x32\x33\x33\x20\x2d\
+\x38\x39\x30\x2e\x30\x33\x32\x32\x2c\x34\x30\x33\x2e\x34\x31\x35\
+\x31\x20\x2d\x39\x36\x2e\x37\x30\x38\x36\x2c\x31\x31\x2e\x33\x39\
+\x38\x33\x20\x2d\x32\x38\x31\x2e\x32\x37\x37\x35\x2c\x31\x31\x2e\
+\x33\x39\x38\x33\x20\x2d\x33\x37\x36\x2e\x30\x39\x32\x35\x2c\x30\
+\x20\x7a\x20\x6d\x20\x33\x35\x33\x2e\x39\x38\x38\x36\x2c\x2d\x33\
+\x32\x32\x2e\x34\x35\x31\x32\x20\x63\x20\x34\x38\x36\x2e\x30\x38\
+\x39\x35\x2c\x2d\x36\x33\x2e\x32\x32\x39\x36\x20\x38\x39\x38\x2e\
+\x38\x38\x30\x33\x2c\x2d\x34\x30\x33\x2e\x34\x31\x35\x31\x20\x31\
+\x30\x35\x30\x2e\x35\x37\x31\x2c\x2d\x38\x36\x36\x2e\x32\x37\x31\
+\x32\x20\x31\x39\x39\x2e\x30\x39\x38\x32\x2c\x2d\x36\x30\x39\x2e\
+\x35\x36\x34\x34\x20\x2d\x37\x38\x2e\x33\x39\x32\x31\x2c\x2d\x31\
+\x32\x36\x37\x2e\x37\x39\x32\x20\x2d\x36\x35\x33\x2e\x36\x31\x35\
+\x33\x2c\x2d\x31\x35\x34\x39\x2e\x37\x37\x37\x36\x20\x2d\x34\x33\
+\x31\x2e\x37\x32\x37\x37\x2c\x2d\x32\x31\x31\x2e\x31\x37\x38\x39\
+\x20\x2d\x39\x34\x30\x2e\x35\x37\x33\x39\x2c\x2d\x31\x36\x31\x2e\
+\x38\x36\x32\x35\x20\x2d\x31\x33\x32\x39\x2e\x33\x33\x34\x36\x2c\
+\x31\x32\x38\x2e\x33\x35\x33\x34\x20\x2d\x36\x35\x2e\x31\x30\x33\
+\x36\x2c\x34\x38\x2e\x36\x39\x35\x39\x20\x2d\x31\x37\x35\x2e\x37\
+\x32\x30\x39\x33\x2c\x31\x35\x36\x2e\x38\x30\x30\x32\x20\x2d\x32\
+\x32\x38\x2e\x38\x30\x39\x34\x33\x2c\x32\x32\x33\x2e\x31\x39\x37\
+\x38\x20\x2d\x33\x37\x31\x2e\x36\x38\x34\x37\x33\x2c\x34\x36\x36\
+\x2e\x36\x34\x34\x36\x20\x2d\x33\x37\x31\x2e\x36\x38\x34\x37\x33\
+\x2c\x31\x31\x32\x37\x2e\x34\x31\x39\x38\x20\x30\x2c\x31\x35\x39\
+\x33\x2e\x34\x31\x31\x32\x20\x34\x39\x2e\x33\x30\x31\x31\x32\x2c\
+\x36\x31\x2e\x33\x33\x35\x32\x20\x31\x35\x34\x2e\x32\x33\x37\x34\
+\x31\x2c\x31\x36\x35\x2e\x36\x35\x31\x20\x32\x31\x34\x2e\x39\x33\
+\x33\x33\x34\x2c\x32\x31\x33\x2e\x31\x30\x35\x39\x20\x31\x37\x33\
+\x2e\x32\x30\x36\x39\x2c\x31\x33\x35\x2e\x33\x30\x39\x39\x20\x33\
+\x39\x33\x2e\x37\x38\x38\x35\x39\x2c\x32\x32\x37\x2e\x36\x33\x39\
+\x35\x20\x36\x31\x33\x2e\x31\x36\x32\x32\x39\x2c\x32\x35\x37\x2e\
+\x33\x35\x39\x39\x20\x38\x39\x2e\x37\x32\x31\x35\x2c\x31\x31\x2e\
+\x39\x38\x36\x33\x20\x32\x34\x32\x2e\x30\x36\x35\x32\x2c\x31\x31\
+\x2e\x39\x38\x36\x33\x20\x33\x33\x33\x2e\x30\x39\x32\x37\x2c\x30\
+\x2e\x36\x32\x30\x36\x20\x7a\x22\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x69\x64\x3d\x22\x70\x61\x74\x68\x38\x37\x36\x22\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x64\x69\x73\x70\x6c\
+\x61\x79\x3a\x69\x6e\x6c\x69\x6e\x65\x3b\x66\x69\x6c\x6c\x3a\x23\
+\x30\x61\x66\x66\x30\x61\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\
+\x69\x74\x79\x3a\x31\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x23\x30\x30\
+\x30\x30\x30\x30\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\
+\x68\x3a\x36\x36\x2e\x34\x39\x33\x38\x31\x31\x36\x36\x3b\x73\x74\
+\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\x3a\x62\x65\
+\x76\x65\x6c\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\
+\x74\x79\x3a\x31\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\
+\x61\x72\x72\x61\x79\x3a\x6e\x6f\x6e\x65\x3b\x73\x74\x72\x6f\x6b\
+\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3a\x72\x6f\x75\x6e\x64\x3b\
+\x70\x61\x69\x6e\x74\x2d\x6f\x72\x64\x65\x72\x3a\x66\x69\x6c\x6c\
+\x20\x6d\x61\x72\x6b\x65\x72\x73\x20\x73\x74\x72\x6f\x6b\x65\x22\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\
+\x3a\x6c\x61\x62\x65\x6c\x3d\x22\x70\x61\x74\x68\x38\x37\x36\x22\
+\x20\x2f\x3e\x3c\x70\x61\x74\x68\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x64\x3d\x22\x6d\x20\x31\x38\x34\x34\x2e\x39\x34\x30\x38\x2c\x34\
+\x34\x35\x36\x2e\x39\x37\x32\x39\x20\x63\x20\x2d\x38\x2e\x38\x34\
+\x38\x31\x2c\x2d\x38\x2e\x38\x35\x30\x38\x20\x2d\x33\x31\x2e\x36\
+\x30\x35\x2c\x2d\x36\x38\x2e\x39\x31\x32\x34\x20\x2d\x39\x32\x2e\
+\x39\x32\x31\x31\x2c\x2d\x32\x34\x30\x2e\x38\x39\x39\x35\x20\x6c\
+\x20\x2d\x32\x37\x2e\x31\x36\x34\x37\x2c\x2d\x37\x35\x2e\x38\x36\
+\x39\x20\x2d\x38\x39\x2e\x31\x33\x33\x38\x2c\x2d\x30\x2e\x36\x32\
+\x30\x35\x20\x63\x20\x2d\x31\x30\x33\x2e\x30\x34\x32\x35\x2c\x2d\
+\x30\x2e\x36\x32\x30\x34\x20\x2d\x31\x37\x30\x2e\x30\x33\x39\x38\
+\x2c\x2d\x31\x33\x2e\x39\x31\x33\x20\x2d\x32\x34\x36\x2e\x35\x33\
+\x38\x32\x2c\x2d\x34\x39\x2e\x33\x31\x36\x34\x20\x2d\x32\x32\x35\
+\x2e\x36\x37\x35\x31\x2c\x2d\x31\x30\x33\x2e\x37\x32\x37\x39\x20\
+\x2d\x33\x34\x32\x2e\x36\x32\x36\x35\x2c\x2d\x33\x32\x31\x2e\x38\
+\x36\x33\x32\x20\x2d\x33\x33\x30\x2e\x36\x31\x31\x34\x2c\x2d\x36\
+\x31\x35\x2e\x32\x34\x37\x32\x20\x31\x2e\x38\x39\x33\x38\x2c\x2d\
+\x34\x38\x2e\x30\x34\x32\x36\x20\x37\x2e\x35\x37\x34\x37\x2c\x2d\
+\x31\x30\x36\x2e\x38\x36\x33\x32\x20\x31\x33\x2e\x32\x38\x38\x35\
+\x2c\x2d\x31\x33\x31\x2e\x35\x32\x31\x34\x20\x33\x30\x2e\x39\x38\
+\x34\x36\x2c\x2d\x31\x34\x30\x2e\x33\x37\x32\x32\x20\x39\x36\x2e\
+\x30\x38\x38\x33\x2c\x2d\x32\x35\x37\x2e\x39\x38\x30\x37\x20\x31\
+\x38\x37\x2e\x37\x33\x36\x2c\x2d\x33\x34\x30\x2e\x31\x38\x35\x35\
+\x20\x6c\x20\x33\x39\x2e\x31\x37\x39\x38\x2c\x2d\x33\x34\x2e\x37\
+\x38\x32\x39\x20\x2d\x35\x38\x2e\x31\x34\x39\x33\x2c\x2d\x31\x35\
+\x39\x2e\x39\x36\x38\x32\x20\x63\x20\x2d\x35\x37\x2e\x35\x32\x38\
+\x38\x2c\x2d\x31\x35\x39\x2e\x39\x36\x38\x31\x20\x2d\x36\x34\x2e\
+\x34\x38\x33\x32\x2c\x2d\x31\x38\x38\x2e\x34\x34\x37\x36\x20\x2d\
+\x34\x39\x2e\x33\x30\x31\x31\x2c\x2d\x31\x39\x39\x2e\x38\x31\x33\
+\x32\x20\x31\x32\x2e\x30\x31\x35\x32\x2c\x2d\x39\x2e\x34\x37\x31\
+\x33\x20\x31\x33\x33\x2e\x33\x37\x34\x33\x2c\x2d\x35\x32\x2e\x34\
+\x38\x34\x35\x20\x31\x34\x38\x2e\x35\x35\x36\x34\x2c\x2d\x35\x32\
+\x2e\x34\x38\x34\x35\x20\x37\x2e\x35\x37\x34\x37\x2c\x30\x20\x31\
+\x38\x2e\x33\x34\x39\x32\x2c\x36\x2e\x33\x33\x36\x31\x20\x32\x34\
+\x2e\x30\x33\x30\x32\x2c\x31\x33\x2e\x39\x31\x33\x31\x20\x35\x2e\
+\x36\x38\x31\x2c\x38\x2e\x32\x33\x30\x34\x20\x33\x35\x2e\x33\x39\
+\x32\x33\x2c\x38\x32\x2e\x38\x32\x35\x36\x20\x36\x35\x2e\x37\x32\
+\x33\x39\x2c\x31\x36\x36\x2e\x33\x30\x34\x34\x20\x6c\x20\x35\x34\
+\x2e\x39\x38\x32\x33\x2c\x31\x35\x31\x2e\x37\x37\x30\x34\x20\x32\
+\x31\x2e\x34\x38\x33\x35\x2c\x2d\x31\x2e\x38\x39\x34\x33\x20\x63\
+\x20\x31\x32\x2e\x30\x31\x35\x31\x2c\x2d\x30\x2e\x36\x32\x30\x34\
+\x20\x37\x31\x2e\x34\x33\x37\x37\x2c\x2d\x31\x2e\x38\x39\x34\x33\
+\x20\x31\x33\x32\x2e\x31\x30\x30\x38\x2c\x2d\x32\x2e\x35\x34\x37\
+\x35\x20\x31\x32\x38\x2e\x33\x31\x33\x36\x2c\x2d\x31\x2e\x32\x37\
+\x33\x37\x20\x31\x37\x33\x2e\x38\x32\x37\x32\x2c\x38\x2e\x32\x33\
+\x30\x33\x20\x32\x36\x35\x2e\x34\x37\x35\x32\x2c\x35\x33\x2e\x31\
+\x30\x35\x32\x20\x34\x32\x2e\x39\x39\x39\x37\x2c\x32\x31\x2e\x34\
+\x39\x20\x36\x35\x2e\x31\x30\x33\x36\x2c\x33\x37\x2e\x39\x35\x30\
+\x37\x20\x31\x31\x31\x2e\x32\x33\x37\x36\x2c\x38\x34\x2e\x30\x39\
+\x39\x31\x20\x36\x33\x2e\x38\x33\x30\x33\x2c\x36\x33\x2e\x32\x32\
+\x39\x35\x20\x39\x34\x2e\x31\x39\x34\x36\x2c\x31\x31\x31\x2e\x39\
+\x32\x35\x35\x20\x31\x31\x36\x2e\x32\x39\x38\x34\x2c\x31\x38\x35\
+\x2e\x32\x34\x37\x20\x33\x30\x2e\x33\x33\x31\x37\x2c\x39\x39\x2e\
+\x39\x30\x36\x36\x20\x30\x2e\x36\x32\x30\x33\x2c\x31\x37\x32\x2e\
+\x36\x30\x37\x36\x20\x2d\x37\x34\x2e\x36\x30\x34\x36\x2c\x31\x38\
+\x32\x2e\x37\x33\x32\x32\x20\x2d\x36\x36\x2e\x33\x31\x31\x37\x2c\
+\x38\x2e\x38\x35\x30\x37\x20\x2d\x39\x36\x2e\x36\x34\x33\x33\x2c\
+\x2d\x31\x34\x2e\x35\x33\x33\x38\x20\x2d\x31\x33\x31\x2e\x34\x31\
+\x35\x33\x2c\x2d\x31\x30\x33\x2e\x30\x34\x32\x32\x20\x2d\x33\x39\
+\x2e\x31\x37\x39\x37\x2c\x2d\x39\x38\x2e\x36\x33\x32\x37\x20\x2d\
+\x39\x36\x2e\x37\x30\x38\x35\x2c\x2d\x31\x36\x31\x2e\x32\x34\x31\
+\x37\x20\x2d\x31\x37\x38\x2e\x38\x38\x38\x2c\x2d\x31\x39\x33\x2e\
+\x34\x37\x37\x32\x20\x2d\x32\x39\x2e\x30\x35\x38\x32\x2c\x2d\x31\
+\x31\x2e\x33\x36\x35\x35\x20\x2d\x34\x38\x2e\x36\x38\x30\x37\x2c\
+\x2d\x31\x33\x2e\x39\x31\x33\x20\x2d\x31\x30\x39\x2e\x33\x34\x34\
+\x2c\x2d\x31\x33\x2e\x39\x31\x33\x20\x2d\x34\x30\x2e\x34\x35\x33\
+\x2c\x2d\x30\x2e\x36\x32\x30\x35\x20\x2d\x37\x35\x2e\x32\x32\x35\
+\x2c\x31\x2e\x32\x37\x33\x37\x20\x2d\x37\x37\x2e\x31\x31\x38\x36\
+\x2c\x33\x2e\x31\x36\x38\x20\x2d\x33\x2e\x31\x36\x37\x2c\x33\x2e\
+\x31\x36\x38\x20\x32\x34\x39\x2e\x36\x37\x32\x35\x2c\x37\x31\x31\
+\x2e\x39\x38\x35\x38\x20\x32\x37\x34\x2e\x39\x37\x36\x31\x2c\x37\
+\x37\x30\x2e\x31\x35\x33\x20\x6c\x20\x36\x2e\x33\x33\x34\x31\x2c\
+\x31\x35\x2e\x31\x38\x37\x20\x31\x37\x2e\x30\x37\x35\x38\x2c\x2d\
+\x31\x36\x2e\x34\x32\x38\x20\x63\x20\x39\x2e\x34\x36\x38\x34\x2c\
+\x2d\x39\x2e\x34\x37\x31\x33\x20\x33\x35\x2e\x33\x39\x32\x33\x2c\
+\x2d\x34\x37\x2e\x34\x32\x32\x32\x20\x35\x38\x2e\x31\x34\x39\x32\
+\x2c\x2d\x38\x34\x2e\x37\x31\x39\x37\x20\x34\x39\x2e\x33\x30\x31\
+\x31\x2c\x2d\x38\x30\x2e\x39\x33\x31\x33\x20\x36\x38\x2e\x32\x37\
+\x30\x36\x2c\x2d\x39\x36\x2e\x37\x33\x38\x37\x20\x31\x31\x38\x2e\
+\x38\x34\x35\x31\x2c\x2d\x39\x36\x2e\x37\x33\x38\x37\x20\x37\x35\
+\x2e\x32\x32\x35\x2c\x30\x20\x31\x31\x37\x2e\x35\x37\x31\x37\x2c\
+\x35\x38\x2e\x31\x36\x37\x32\x20\x31\x30\x32\x2e\x33\x38\x39\x36\
+\x2c\x31\x34\x30\x2e\x33\x37\x32\x32\x20\x2d\x31\x35\x2e\x31\x38\
+\x32\x32\x2c\x38\x32\x2e\x32\x30\x35\x31\x20\x2d\x38\x37\x2e\x32\
+\x34\x30\x32\x2c\x31\x38\x30\x2e\x38\x33\x37\x39\x20\x2d\x31\x37\
+\x32\x2e\x35\x35\x33\x39\x2c\x32\x33\x36\x2e\x34\x39\x30\x34\x20\
+\x2d\x32\x35\x2e\x32\x37\x31\x2c\x31\x36\x2e\x34\x32\x38\x20\x2d\
+\x34\x36\x2e\x31\x33\x34\x32\x2c\x33\x30\x2e\x33\x34\x31\x20\x2d\
+\x34\x37\x2e\x34\x30\x37\x36\x2c\x33\x30\x2e\x39\x39\x34\x33\x20\
+\x2d\x30\x2e\x36\x32\x30\x33\x2c\x30\x2e\x36\x32\x30\x34\x20\x32\
+\x32\x2e\x37\x35\x37\x2c\x36\x37\x2e\x36\x37\x31\x33\x20\x35\x32\
+\x2e\x34\x36\x38\x32\x2c\x31\x34\x39\x2e\x32\x32\x33\x20\x32\x39\
+\x2e\x37\x31\x31\x34\x2c\x38\x30\x2e\x39\x33\x31\x33\x20\x35\x33\
+\x2e\x37\x34\x31\x35\x2c\x31\x35\x33\x2e\x36\x33\x32\x32\x20\x35\
+\x33\x2e\x37\x34\x31\x35\x2c\x31\x36\x31\x2e\x32\x34\x32\x20\x30\
+\x2c\x31\x39\x2e\x35\x39\x35\x39\x20\x2d\x31\x35\x2e\x31\x38\x32\
+\x31\x2c\x32\x39\x2e\x37\x32\x30\x35\x20\x2d\x38\x35\x2e\x39\x36\
+\x36\x38\x2c\x35\x34\x2e\x39\x39\x39\x32\x20\x2d\x37\x30\x2e\x38\
+\x34\x39\x39\x2c\x32\x35\x2e\x38\x36\x36\x37\x20\x2d\x37\x39\x2e\
+\x36\x39\x38\x2c\x32\x37\x2e\x31\x30\x37\x37\x20\x2d\x39\x32\x2e\
+\x39\x35\x33\x38\x2c\x31\x34\x2e\x34\x36\x38\x34\x20\x7a\x20\x6d\
+\x20\x2d\x31\x39\x34\x2e\x30\x37\x30\x31\x2c\x2d\x35\x31\x34\x2e\
+\x30\x36\x36\x38\x20\x63\x20\x30\x2c\x2d\x31\x35\x2e\x31\x38\x37\
+\x20\x2d\x32\x36\x38\x2e\x36\x34\x32\x2c\x2d\x37\x34\x30\x2e\x34\
+\x33\x32\x36\x20\x2d\x32\x37\x33\x2e\x30\x38\x32\x34\x2c\x2d\x37\
+\x33\x37\x2e\x39\x31\x37\x38\x20\x2d\x33\x2e\x31\x36\x37\x31\x2c\
+\x31\x2e\x38\x39\x34\x33\x20\x2d\x31\x32\x2e\x30\x31\x35\x33\x2c\
+\x31\x36\x2e\x34\x36\x30\x35\x20\x2d\x32\x30\x2e\x32\x31\x30\x33\
+\x2c\x33\x32\x2e\x38\x38\x38\x35\x20\x2d\x34\x32\x2e\x33\x34\x36\
+\x37\x2c\x38\x34\x2e\x30\x39\x39\x32\x20\x2d\x36\x31\x2e\x33\x31\
+\x36\x32\x2c\x32\x31\x33\x2e\x30\x37\x33\x31\x20\x2d\x34\x39\x2e\
+\x33\x30\x31\x2c\x33\x33\x35\x2e\x37\x34\x33\x37\x20\x31\x33\x2e\
+\x39\x30\x38\x37\x2c\x31\x33\x37\x2e\x32\x30\x34\x32\x20\x34\x35\
+\x2e\x35\x31\x33\x37\x2c\x32\x31\x35\x2e\x36\x32\x30\x36\x20\x31\
+\x31\x33\x2e\x37\x38\x34\x33\x2c\x32\x38\x34\x2e\x35\x33\x33\x31\
+\x20\x34\x34\x2e\x32\x34\x30\x34\x2c\x34\x34\x2e\x32\x35\x34\x32\
+\x20\x38\x34\x2e\x30\x37\x33\x31\x2c\x36\x37\x2e\x36\x37\x31\x33\
+\x20\x31\x33\x37\x2e\x31\x36\x31\x36\x2c\x38\x30\x2e\x33\x31\x30\
+\x37\x20\x33\x36\x2e\x30\x31\x32\x37\x2c\x38\x2e\x38\x38\x33\x35\
+\x20\x39\x31\x2e\x36\x34\x37\x38\x2c\x31\x31\x2e\x33\x39\x38\x33\
+\x20\x39\x31\x2e\x36\x34\x37\x38\x2c\x34\x2e\x34\x34\x31\x38\x20\
+\x7a\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\x70\x61\
+\x74\x68\x38\x37\x38\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x73\x74\
+\x79\x6c\x65\x3d\x22\x64\x69\x73\x70\x6c\x61\x79\x3a\x69\x6e\x6c\
+\x69\x6e\x65\x3b\x66\x69\x6c\x6c\x3a\x23\x30\x61\x66\x66\x30\x61\
+\x3b\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\
+\x73\x74\x72\x6f\x6b\x65\x3a\x23\x30\x30\x30\x30\x30\x30\x3b\x73\
+\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x36\x36\x2e\x34\
+\x39\x33\x38\x31\x31\x36\x36\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6c\
+\x69\x6e\x65\x6a\x6f\x69\x6e\x3a\x62\x65\x76\x65\x6c\x3b\x73\x74\
+\x72\x6f\x6b\x65\x2d\x6f\x70\x61\x63\x69\x74\x79\x3a\x31\x3b\x73\
+\x74\x72\x6f\x6b\x65\x2d\x64\x61\x73\x68\x61\x72\x72\x61\x79\x3a\
+\x6e\x6f\x6e\x65\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\
+\x63\x61\x70\x3a\x72\x6f\x75\x6e\x64\x3b\x70\x61\x69\x6e\x74\x2d\
+\x6f\x72\x64\x65\x72\x3a\x66\x69\x6c\x6c\x20\x6d\x61\x72\x6b\x65\
+\x72\x73\x20\x73\x74\x72\x6f\x6b\x65\x22\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x6c\x61\x62\x65\x6c\
+\x3d\x22\x70\x61\x74\x68\x38\x37\x38\x22\x20\x2f\x3e\x3c\x2f\x67\
+\x3e\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\
+\x00\x00\x12\xd4\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x35\x2e\x31\x2e\x30\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x34\x30\x2e\x34\x36\x70\x78\x22\x20\x68\x65\x69\x67\
+\x68\x74\x3d\x22\x34\x30\x2e\x34\x36\x70\x78\x22\x20\x76\x69\x65\
+\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x34\x30\x2e\x34\x36\x20\
+\x34\x30\x2e\x34\x36\x22\x20\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\
+\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\x77\x20\x30\x20\
+\x30\x20\x34\x30\x2e\x34\x36\x20\x34\x30\x2e\x34\x36\x22\x20\x78\
+\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\
+\x76\x65\x22\x3e\x0d\x0a\x3c\x72\x61\x64\x69\x61\x6c\x47\x72\x61\
+\x64\x69\x65\x6e\x74\x20\x69\x64\x3d\x22\x53\x56\x47\x49\x44\x5f\
+\x31\x5f\x22\x20\x63\x78\x3d\x22\x33\x30\x36\x2e\x30\x30\x31\x35\
+\x22\x20\x63\x79\x3d\x22\x2d\x33\x35\x34\x2e\x39\x38\x31\x34\x22\
+\x20\x72\x3d\x22\x32\x30\x2e\x31\x32\x36\x39\x22\x20\x66\x78\x3d\
+\x22\x32\x39\x33\x2e\x31\x37\x34\x22\x20\x66\x79\x3d\x22\x2d\x33\
+\x35\x34\x2e\x38\x39\x34\x22\x20\x67\x72\x61\x64\x69\x65\x6e\x74\
+\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\
+\x78\x28\x31\x20\x30\x20\x30\x20\x2d\x31\x20\x2d\x32\x38\x35\x2e\
+\x37\x36\x39\x35\x20\x2d\x33\x33\x34\x2e\x37\x37\x30\x35\x29\x22\
+\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\x3d\x22\
+\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\x22\x3e\
+\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\x65\x74\
+\x3d\x22\x30\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\
+\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x46\x46\x46\x46\x46\x46\x22\x2f\
+\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\x65\
+\x74\x3d\x22\x30\x2e\x36\x35\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\
+\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x44\x30\x44\x32\
+\x44\x33\x22\x2f\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\
+\x66\x66\x73\x65\x74\x3d\x22\x31\x22\x20\x73\x74\x79\x6c\x65\x3d\
+\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x44\x30\x44\
+\x32\x44\x33\x22\x2f\x3e\x0d\x0a\x3c\x2f\x72\x61\x64\x69\x61\x6c\
+\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\x0d\x0a\x3c\x63\x69\x72\x63\
+\x6c\x65\x20\x66\x69\x6c\x6c\x3d\x22\x75\x72\x6c\x28\x23\x53\x56\
+\x47\x49\x44\x5f\x31\x5f\x29\x22\x20\x63\x78\x3d\x22\x32\x30\x2e\
+\x32\x33\x31\x22\x20\x63\x79\x3d\x22\x32\x30\x2e\x32\x31\x31\x22\
+\x20\x72\x3d\x22\x31\x39\x2e\x37\x32\x39\x22\x2f\x3e\x0d\x0a\x3c\
+\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x44\x42\x44\
+\x31\x30\x22\x20\x64\x3d\x22\x4d\x32\x30\x2e\x32\x33\x2c\x30\x2e\
+\x39\x32\x34\x76\x33\x38\x2e\x36\x31\x33\x63\x31\x30\x2e\x36\x36\
+\x32\x2c\x30\x2c\x31\x39\x2e\x33\x30\x37\x2d\x38\x2e\x36\x34\x35\
+\x2c\x31\x39\x2e\x33\x30\x37\x2d\x31\x39\x2e\x33\x30\x37\x53\x33\
+\x30\x2e\x38\x39\x32\x2c\x30\x2e\x39\x32\x34\x2c\x32\x30\x2e\x32\
+\x33\x2c\x30\x2e\x39\x32\x34\x7a\x22\x2f\x3e\x0d\x0a\x3c\x72\x61\
+\x64\x69\x61\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\x20\x69\x64\x3d\
+\x22\x53\x56\x47\x49\x44\x5f\x32\x5f\x22\x20\x63\x78\x3d\x22\x33\
+\x30\x36\x2e\x30\x30\x31\x35\x22\x20\x63\x79\x3d\x22\x2d\x33\x35\
+\x34\x2e\x39\x38\x32\x39\x22\x20\x72\x3d\x22\x31\x39\x2e\x36\x37\
+\x39\x39\x22\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x54\x72\x61\x6e\
+\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\x28\x31\x20\
+\x30\x20\x30\x20\x2d\x31\x20\x2d\x32\x38\x35\x2e\x37\x36\x39\x35\
+\x20\x2d\x33\x33\x34\x2e\x37\x37\x30\x35\x29\x22\x20\x67\x72\x61\
+\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\x3d\x22\x75\x73\x65\x72\
+\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\x22\x3e\x0d\x0a\x09\x3c\
+\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x30\x22\
+\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\
+\x6f\x72\x3a\x23\x46\x44\x42\x44\x31\x30\x22\x2f\x3e\x0d\x0a\x09\
+\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\
+\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\
+\x6c\x6f\x72\x3a\x23\x46\x46\x46\x46\x46\x46\x22\x2f\x3e\x0d\x0a\
+\x3c\x2f\x72\x61\x64\x69\x61\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\
+\x3e\x0d\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x6f\x70\x61\x63\x69\
+\x74\x79\x3d\x22\x30\x2e\x34\x22\x20\x66\x69\x6c\x6c\x3d\x22\x75\
+\x72\x6c\x28\x23\x53\x56\x47\x49\x44\x5f\x32\x5f\x29\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x20\x20\x20\x22\x20\x63\x78\x3d\x22\x32\
+\x30\x2e\x32\x33\x31\x22\x20\x63\x79\x3d\x22\x32\x30\x2e\x32\x31\
+\x32\x22\x20\x72\x3d\x22\x31\x39\x2e\x36\x38\x22\x2f\x3e\x0d\x0a\
+\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\x35\x38\x35\
+\x39\x35\x42\x22\x20\x64\x3d\x22\x4d\x32\x30\x2e\x32\x33\x2c\x34\
+\x30\x2e\x34\x35\x38\x63\x2d\x31\x31\x2e\x31\x35\x34\x2c\x30\x2d\
+\x32\x30\x2e\x32\x32\x39\x2d\x39\x2e\x30\x37\x33\x2d\x32\x30\x2e\
+\x32\x32\x39\x2d\x32\x30\x2e\x32\x32\x39\x63\x30\x2d\x31\x31\x2e\
+\x31\x35\x35\x2c\x39\x2e\x30\x37\x35\x2d\x32\x30\x2e\x32\x32\x39\
+\x2c\x32\x30\x2e\x32\x32\x39\x2d\x32\x30\x2e\x32\x32\x39\x0d\x0a\
+\x09\x63\x31\x31\x2e\x31\x35\x34\x2c\x30\x2c\x32\x30\x2e\x32\x32\
+\x39\x2c\x39\x2e\x30\x37\x35\x2c\x32\x30\x2e\x32\x32\x39\x2c\x32\
+\x30\x2e\x32\x32\x39\x43\x34\x30\x2e\x34\x35\x38\x2c\x33\x31\x2e\
+\x33\x38\x34\x2c\x33\x31\x2e\x33\x38\x34\x2c\x34\x30\x2e\x34\x35\
+\x38\x2c\x32\x30\x2e\x32\x33\x2c\x34\x30\x2e\x34\x35\x38\x7a\x20\
+\x4d\x32\x30\x2e\x32\x33\x2c\x31\x2e\x30\x30\x31\x43\x39\x2e\x36\
+\x32\x37\x2c\x31\x2e\x30\x30\x31\x2c\x31\x2e\x30\x30\x31\x2c\x39\
+\x2e\x36\x32\x37\x2c\x31\x2e\x30\x30\x31\x2c\x32\x30\x2e\x32\x33\
+\x0d\x0a\x09\x63\x30\x2c\x31\x30\x2e\x36\x30\x34\x2c\x38\x2e\x36\
+\x32\x36\x2c\x31\x39\x2e\x32\x32\x39\x2c\x31\x39\x2e\x32\x32\x39\
+\x2c\x31\x39\x2e\x32\x32\x39\x63\x31\x30\x2e\x36\x30\x34\x2c\x30\
+\x2c\x31\x39\x2e\x32\x32\x39\x2d\x38\x2e\x36\x32\x35\x2c\x31\x39\
+\x2e\x32\x32\x39\x2d\x31\x39\x2e\x32\x32\x39\x43\x33\x39\x2e\x34\
+\x35\x38\x2c\x39\x2e\x36\x32\x37\x2c\x33\x30\x2e\x38\x33\x33\x2c\
+\x31\x2e\x30\x30\x31\x2c\x32\x30\x2e\x32\x33\x2c\x31\x2e\x30\x30\
+\x31\x7a\x22\x2f\x3e\x0d\x0a\x3c\x72\x61\x64\x69\x61\x6c\x47\x72\
+\x61\x64\x69\x65\x6e\x74\x20\x69\x64\x3d\x22\x53\x56\x47\x49\x44\
+\x5f\x33\x5f\x22\x20\x63\x78\x3d\x22\x2d\x33\x37\x2e\x36\x31\x31\
+\x38\x22\x20\x63\x79\x3d\x22\x33\x39\x2e\x39\x31\x35\x35\x22\x20\
+\x72\x3d\x22\x37\x2e\x34\x33\x33\x36\x22\x20\x67\x72\x61\x64\x69\
+\x65\x6e\x74\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\
+\x74\x72\x69\x78\x28\x31\x2e\x36\x34\x20\x2d\x30\x2e\x31\x36\x31\
+\x32\x20\x30\x2e\x30\x38\x39\x37\x20\x30\x2e\x39\x31\x33\x32\x20\
+\x37\x37\x2e\x32\x37\x37\x31\x20\x2d\x33\x34\x2e\x35\x30\x33\x34\
+\x29\x22\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\
+\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\
+\x22\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\
+\x65\x74\x3d\x22\x30\x2e\x32\x35\x22\x20\x73\x74\x79\x6c\x65\x3d\
+\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x46\x46\x46\
+\x46\x46\x46\x22\x2f\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\
+\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\x22\x20\x73\x74\x79\x6c\x65\
+\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x46\x46\
+\x46\x46\x46\x46\x3b\x73\x74\x6f\x70\x2d\x6f\x70\x61\x63\x69\x74\
+\x79\x3a\x30\x22\x2f\x3e\x0d\x0a\x3c\x2f\x72\x61\x64\x69\x61\x6c\
+\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\x0d\x0a\x3c\x70\x61\x74\x68\
+\x20\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x30\x2e\x37\x22\x20\x66\
+\x69\x6c\x6c\x3d\x22\x75\x72\x6c\x28\x23\x53\x56\x47\x49\x44\x5f\
+\x33\x5f\x29\x22\x20\x64\x3d\x22\x4d\x33\x31\x2e\x33\x36\x34\x2c\
+\x36\x2e\x38\x31\x31\x63\x30\x2e\x33\x36\x38\x2c\x33\x2e\x37\x35\
+\x2d\x34\x2e\x37\x39\x31\x2c\x37\x2e\x33\x32\x35\x2d\x31\x31\x2e\
+\x35\x32\x34\x2c\x37\x2e\x39\x38\x37\x53\x37\x2e\x33\x34\x39\x2c\
+\x31\x32\x2e\x39\x35\x37\x2c\x36\x2e\x39\x38\x2c\x39\x2e\x32\x30\
+\x37\x0d\x0a\x09\x63\x2d\x30\x2e\x33\x36\x38\x2d\x33\x2e\x37\x34\
+\x39\x2c\x34\x2e\x37\x39\x32\x2d\x37\x2e\x33\x32\x34\x2c\x31\x31\
+\x2e\x35\x32\x35\x2d\x37\x2e\x39\x38\x36\x53\x33\x30\x2e\x39\x39\
+\x35\x2c\x33\x2e\x30\x36\x32\x2c\x33\x31\x2e\x33\x36\x34\x2c\x36\
+\x2e\x38\x31\x31\x7a\x22\x2f\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\
+\x66\x69\x6c\x6c\x3d\x22\x23\x32\x33\x31\x46\x32\x30\x22\x20\x64\
+\x3d\x22\x4d\x32\x30\x2e\x32\x33\x2c\x33\x34\x2e\x39\x33\x37\x63\
+\x2d\x30\x2e\x35\x35\x33\x2c\x30\x2d\x31\x2d\x30\x2e\x34\x34\x38\
+\x2d\x31\x2d\x31\x56\x31\x30\x2e\x33\x31\x35\x63\x30\x2d\x30\x2e\
+\x35\x35\x32\x2c\x30\x2e\x34\x34\x37\x2d\x31\x2c\x31\x2d\x31\x73\
+\x31\x2c\x30\x2e\x34\x34\x38\x2c\x31\x2c\x31\x76\x32\x33\x2e\x36\
+\x32\x32\x0d\x0a\x09\x43\x32\x31\x2e\x32\x33\x2c\x33\x34\x2e\x34\
+\x38\x39\x2c\x32\x30\x2e\x37\x38\x33\x2c\x33\x34\x2e\x39\x33\x37\
+\x2c\x32\x30\x2e\x32\x33\x2c\x33\x34\x2e\x39\x33\x37\x7a\x22\x2f\
+\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\
+\x32\x33\x31\x46\x32\x30\x22\x20\x64\x3d\x22\x4d\x32\x30\x2e\x33\
+\x32\x35\x2c\x33\x37\x2e\x38\x32\x31\x68\x2d\x30\x2e\x31\x32\x34\
+\x63\x2d\x30\x2e\x36\x39\x2c\x30\x2d\x31\x2e\x32\x35\x2d\x30\x2e\
+\x35\x35\x39\x2d\x31\x2e\x32\x35\x2d\x31\x2e\x32\x35\x63\x30\x2d\
+\x30\x2e\x36\x38\x38\x2c\x30\x2e\x35\x36\x2d\x31\x2e\x32\x35\x2c\
+\x31\x2e\x32\x35\x2d\x31\x2e\x32\x35\x68\x30\x2e\x31\x30\x37\x0d\
+\x0a\x09\x63\x30\x2e\x36\x38\x39\x2c\x30\x2c\x31\x2e\x32\x35\x38\
+\x2c\x30\x2e\x35\x36\x32\x2c\x31\x2e\x32\x35\x38\x2c\x31\x2e\x32\
+\x35\x43\x32\x31\x2e\x35\x36\x36\x2c\x33\x37\x2e\x32\x36\x32\x2c\
+\x32\x31\x2e\x30\x31\x35\x2c\x33\x37\x2e\x38\x32\x31\x2c\x32\x30\
+\x2e\x33\x32\x35\x2c\x33\x37\x2e\x38\x32\x31\x7a\x20\x4d\x31\x32\
+\x2e\x31\x33\x35\x2c\x33\x35\x2e\x36\x38\x32\x63\x2d\x30\x2e\x32\
+\x31\x2c\x30\x2d\x30\x2e\x34\x32\x31\x2d\x30\x2e\x30\x35\x34\x2d\
+\x30\x2e\x36\x31\x36\x2d\x30\x2e\x31\x36\x33\x0d\x0a\x09\x6c\x2d\
+\x30\x2e\x31\x32\x35\x2d\x30\x2e\x30\x37\x31\x63\x2d\x30\x2e\x35\
+\x39\x36\x2d\x30\x2e\x33\x35\x32\x2d\x30\x2e\x37\x39\x33\x2d\x31\
+\x2e\x31\x31\x36\x2d\x30\x2e\x34\x34\x33\x2d\x31\x2e\x37\x31\x32\
+\x63\x30\x2e\x33\x35\x32\x2d\x30\x2e\x35\x39\x35\x2c\x31\x2e\x31\
+\x31\x37\x2d\x30\x2e\x37\x39\x32\x2c\x31\x2e\x37\x31\x32\x2d\x30\
+\x2e\x34\x34\x31\x6c\x30\x2e\x30\x39\x31\x2c\x30\x2e\x30\x35\x32\
+\x0d\x0a\x09\x63\x30\x2e\x36\x2c\x30\x2e\x33\x34\x31\x2c\x30\x2e\
+\x38\x31\x31\x2c\x31\x2e\x31\x30\x34\x2c\x30\x2e\x34\x37\x2c\x31\
+\x2e\x37\x30\x34\x43\x31\x32\x2e\x39\x39\x34\x2c\x33\x35\x2e\x34\
+\x35\x35\x2c\x31\x32\x2e\x35\x37\x2c\x33\x35\x2e\x36\x38\x32\x2c\
+\x31\x32\x2e\x31\x33\x35\x2c\x33\x35\x2e\x36\x38\x32\x7a\x20\x4d\
+\x32\x38\x2e\x33\x38\x32\x2c\x33\x35\x2e\x36\x35\x31\x63\x2d\x30\
+\x2e\x34\x33\x35\x2c\x30\x2d\x30\x2e\x38\x35\x34\x2d\x30\x2e\x32\
+\x32\x36\x2d\x31\x2e\x30\x38\x36\x2d\x30\x2e\x36\x32\x37\x0d\x0a\
+\x09\x63\x2d\x30\x2e\x33\x34\x34\x2d\x30\x2e\x35\x39\x39\x2d\x30\
+\x2e\x31\x33\x37\x2d\x31\x2e\x33\x36\x32\x2c\x30\x2e\x34\x36\x31\
+\x2d\x31\x2e\x37\x30\x37\x6c\x30\x2e\x30\x39\x36\x2d\x30\x2e\x30\
+\x35\x35\x63\x30\x2e\x35\x39\x34\x2d\x30\x2e\x33\x35\x31\x2c\x31\
+\x2e\x33\x36\x31\x2d\x30\x2e\x31\x35\x34\x2c\x31\x2e\x37\x31\x32\
+\x2c\x30\x2e\x34\x34\x32\x63\x30\x2e\x33\x35\x31\x2c\x30\x2e\x35\
+\x39\x34\x2c\x30\x2e\x31\x35\x31\x2c\x31\x2e\x33\x35\x39\x2d\x30\
+\x2e\x34\x34\x32\x2c\x31\x2e\x37\x31\x31\x0d\x0a\x09\x6c\x2d\x30\
+\x2e\x31\x31\x37\x2c\x30\x2e\x30\x36\x38\x43\x32\x38\x2e\x38\x30\
+\x38\x2c\x33\x35\x2e\x35\x39\x37\x2c\x32\x38\x2e\x35\x39\x33\x2c\
+\x33\x35\x2e\x36\x35\x31\x2c\x32\x38\x2e\x33\x38\x32\x2c\x33\x35\
+\x2e\x36\x35\x31\x7a\x20\x4d\x36\x2e\x31\x31\x34\x2c\x32\x39\x2e\
+\x37\x33\x34\x63\x2d\x30\x2e\x34\x32\x39\x2c\x30\x2d\x30\x2e\x38\
+\x34\x35\x2d\x30\x2e\x32\x32\x2d\x31\x2e\x30\x37\x38\x2d\x30\x2e\
+\x36\x31\x35\x4c\x34\x2e\x39\x36\x37\x2c\x32\x39\x0d\x0a\x09\x63\
+\x2d\x30\x2e\x33\x34\x35\x2d\x30\x2e\x35\x39\x39\x2d\x30\x2e\x31\
+\x33\x38\x2d\x31\x2e\x33\x36\x32\x2c\x30\x2e\x34\x36\x2d\x31\x2e\
+\x37\x30\x37\x63\x30\x2e\x36\x2d\x30\x2e\x33\x34\x32\x2c\x31\x2e\
+\x33\x36\x33\x2d\x30\x2e\x31\x33\x39\x2c\x31\x2e\x37\x30\x37\x2c\
+\x30\x2e\x34\x36\x31\x4c\x37\x2e\x31\x39\x2c\x32\x37\x2e\x38\x35\
+\x63\x30\x2e\x33\x35\x31\x2c\x30\x2e\x35\x39\x34\x2c\x30\x2e\x31\
+\x35\x32\x2c\x31\x2e\x33\x36\x2d\x30\x2e\x34\x34\x32\x2c\x31\x2e\
+\x37\x31\x31\x0d\x0a\x09\x43\x36\x2e\x35\x34\x38\x2c\x32\x39\x2e\
+\x36\x37\x38\x2c\x36\x2e\x33\x33\x2c\x32\x39\x2e\x37\x33\x34\x2c\
+\x36\x2e\x31\x31\x34\x2c\x32\x39\x2e\x37\x33\x34\x7a\x20\x4d\x33\
+\x34\x2e\x33\x37\x38\x2c\x32\x39\x2e\x36\x38\x63\x2d\x30\x2e\x32\
+\x31\x35\x2c\x30\x2d\x30\x2e\x34\x33\x35\x2d\x30\x2e\x30\x35\x38\
+\x2d\x30\x2e\x36\x33\x33\x2d\x30\x2e\x31\x37\x35\x63\x2d\x30\x2e\
+\x35\x39\x36\x2d\x30\x2e\x33\x35\x2d\x30\x2e\x37\x39\x33\x2d\x31\
+\x2e\x31\x31\x35\x2d\x30\x2e\x34\x34\x32\x2d\x31\x2e\x37\x31\x31\
+\x0d\x0a\x09\x6c\x30\x2e\x30\x35\x32\x2d\x30\x2e\x30\x39\x63\x30\
+\x2e\x33\x34\x32\x2d\x30\x2e\x36\x30\x32\x2c\x31\x2e\x31\x30\x35\
+\x2d\x30\x2e\x38\x31\x32\x2c\x31\x2e\x37\x30\x35\x2d\x30\x2e\x34\
+\x37\x31\x63\x30\x2e\x36\x2c\x30\x2e\x33\x34\x2c\x30\x2e\x38\x31\
+\x31\x2c\x31\x2e\x31\x30\x34\x2c\x30\x2e\x34\x36\x39\x2c\x31\x2e\
+\x37\x30\x34\x6c\x2d\x30\x2e\x30\x37\x2c\x30\x2e\x31\x32\x35\x0d\
+\x0a\x09\x43\x33\x35\x2e\x32\x32\x34\x2c\x32\x39\x2e\x34\x35\x38\
+\x2c\x33\x34\x2e\x38\x30\x37\x2c\x32\x39\x2e\x36\x38\x2c\x33\x34\
+\x2e\x33\x37\x38\x2c\x32\x39\x2e\x36\x38\x7a\x20\x4d\x33\x2e\x38\
+\x37\x32\x2c\x32\x31\x2e\x35\x37\x34\x63\x2d\x30\x2e\x36\x39\x2c\
+\x30\x2d\x31\x2e\x32\x35\x2d\x30\x2e\x35\x36\x2d\x31\x2e\x32\x35\
+\x2d\x31\x2e\x32\x35\x76\x2d\x30\x2e\x30\x33\x35\x63\x30\x2d\x30\
+\x2e\x36\x39\x2c\x30\x2e\x35\x36\x2d\x31\x2e\x32\x39\x35\x2c\x31\
+\x2e\x32\x35\x2d\x31\x2e\x32\x39\x35\x0d\x0a\x09\x73\x31\x2e\x32\
+\x35\x2c\x30\x2e\x35\x31\x35\x2c\x31\x2e\x32\x35\x2c\x31\x2e\x32\
+\x30\x36\x76\x30\x2e\x31\x32\x34\x43\x35\x2e\x31\x32\x32\x2c\x32\
+\x31\x2e\x30\x31\x34\x2c\x34\x2e\x35\x36\x32\x2c\x32\x31\x2e\x35\
+\x37\x34\x2c\x33\x2e\x38\x37\x32\x2c\x32\x31\x2e\x35\x37\x34\x7a\
+\x20\x4d\x33\x37\x2e\x38\x33\x39\x2c\x32\x30\x2e\x31\x32\x32\x76\
+\x30\x2e\x30\x39\x34\x63\x30\x2c\x30\x2e\x36\x39\x32\x2d\x30\x2e\
+\x35\x36\x2c\x31\x2e\x32\x37\x32\x2d\x31\x2e\x32\x35\x2c\x31\x2e\
+\x32\x37\x32\x0d\x0a\x09\x63\x2d\x30\x2e\x36\x38\x39\x2c\x30\x2d\
+\x31\x2e\x32\x35\x2d\x30\x2e\x35\x33\x37\x2d\x31\x2e\x32\x35\x2d\
+\x31\x2e\x32\x32\x39\x76\x2d\x30\x2e\x31\x32\x34\x63\x30\x2d\x30\
+\x2e\x36\x39\x2c\x30\x2e\x35\x36\x31\x2d\x31\x2e\x32\x38\x35\x2c\
+\x31\x2e\x32\x35\x2d\x31\x2e\x32\x38\x35\x73\x31\x2e\x32\x35\x2c\
+\x30\x2e\x35\x32\x35\x2c\x31\x2e\x32\x35\x2c\x31\x2e\x32\x31\x36\
+\x20\x4d\x36\x2e\x30\x30\x31\x2c\x31\x33\x2e\x33\x38\x32\x0d\x0a\
+\x09\x63\x2d\x30\x2e\x32\x31\x2c\x30\x2d\x30\x2e\x34\x32\x32\x2d\
+\x30\x2e\x30\x35\x32\x2d\x30\x2e\x36\x31\x37\x2d\x30\x2e\x31\x36\
+\x33\x63\x2d\x30\x2e\x36\x2d\x30\x2e\x33\x34\x2d\x30\x2e\x38\x31\
+\x31\x2d\x31\x2e\x31\x30\x34\x2d\x30\x2e\x34\x36\x39\x2d\x31\x2e\
+\x37\x30\x34\x6c\x30\x2e\x30\x37\x31\x2d\x30\x2e\x31\x32\x35\x63\
+\x30\x2e\x33\x35\x31\x2d\x30\x2e\x35\x39\x36\x2c\x31\x2e\x31\x31\
+\x38\x2d\x30\x2e\x37\x39\x32\x2c\x31\x2e\x37\x31\x32\x2d\x30\x2e\
+\x34\x34\x32\x0d\x0a\x09\x63\x30\x2e\x35\x39\x35\x2c\x30\x2e\x33\
+\x35\x2c\x30\x2e\x37\x39\x33\x2c\x31\x2e\x31\x31\x36\x2c\x30\x2e\
+\x34\x34\x32\x2c\x31\x2e\x37\x31\x31\x4c\x37\x2e\x30\x38\x39\x2c\
+\x31\x32\x2e\x37\x35\x43\x36\x2e\x38\x35\x39\x2c\x31\x33\x2e\x31\
+\x35\x35\x2c\x36\x2e\x34\x33\x36\x2c\x31\x33\x2e\x33\x38\x32\x2c\
+\x36\x2e\x30\x30\x31\x2c\x31\x33\x2e\x33\x38\x32\x7a\x20\x4d\x33\
+\x34\x2e\x33\x39\x34\x2c\x31\x33\x2e\x32\x36\x37\x0d\x0a\x09\x63\
+\x2d\x30\x2e\x34\x33\x32\x2c\x30\x2d\x30\x2e\x38\x35\x34\x2d\x30\
+\x2e\x32\x32\x35\x2d\x31\x2e\x30\x38\x34\x2d\x30\x2e\x36\x32\x36\
+\x6c\x2d\x30\x2e\x30\x35\x37\x2d\x30\x2e\x30\x39\x37\x63\x2d\x30\
+\x2e\x33\x35\x31\x2d\x30\x2e\x35\x39\x35\x2d\x30\x2e\x31\x35\x31\
+\x2d\x31\x2e\x33\x36\x2c\x30\x2e\x34\x34\x32\x2d\x31\x2e\x37\x31\
+\x32\x63\x30\x2e\x35\x39\x35\x2d\x30\x2e\x33\x34\x38\x2c\x31\x2e\
+\x33\x36\x31\x2d\x30\x2e\x31\x35\x32\x2c\x31\x2e\x37\x31\x32\x2c\
+\x30\x2e\x34\x34\x33\x0d\x0a\x09\x6c\x30\x2e\x30\x36\x38\x2c\x30\
+\x2e\x31\x31\x37\x63\x30\x2e\x33\x34\x35\x2c\x30\x2e\x36\x2c\x30\
+\x2e\x31\x33\x38\x2c\x31\x2e\x33\x36\x33\x2d\x30\x2e\x34\x36\x2c\
+\x31\x2e\x37\x30\x37\x43\x33\x34\x2e\x38\x32\x2c\x31\x33\x2e\x32\
+\x31\x33\x2c\x33\x34\x2e\x36\x30\x36\x2c\x31\x33\x2e\x32\x36\x37\
+\x2c\x33\x34\x2e\x33\x39\x34\x2c\x31\x33\x2e\x32\x36\x37\x7a\x20\
+\x4d\x31\x31\x2e\x39\x34\x35\x2c\x37\x2e\x33\x35\x33\x0d\x0a\x09\
+\x63\x2d\x30\x2e\x34\x32\x38\x2c\x30\x2d\x30\x2e\x38\x34\x36\x2d\
+\x30\x2e\x32\x32\x2d\x31\x2e\x30\x37\x38\x2d\x30\x2e\x36\x31\x36\
+\x63\x2d\x30\x2e\x33\x35\x2d\x30\x2e\x35\x39\x35\x2d\x30\x2e\x31\
+\x35\x32\x2d\x31\x2e\x33\x36\x2c\x30\x2e\x34\x34\x33\x2d\x31\x2e\
+\x37\x31\x31\x6c\x30\x2e\x31\x31\x37\x2d\x30\x2e\x30\x36\x39\x63\
+\x30\x2e\x36\x2d\x30\x2e\x33\x34\x32\x2c\x31\x2e\x33\x36\x33\x2d\
+\x30\x2e\x31\x33\x38\x2c\x31\x2e\x37\x30\x37\x2c\x30\x2e\x34\x36\
+\x0d\x0a\x09\x63\x30\x2e\x33\x34\x34\x2c\x30\x2e\x35\x39\x39\x2c\
+\x30\x2e\x31\x33\x39\x2c\x31\x2e\x33\x36\x33\x2d\x30\x2e\x34\x36\
+\x2c\x31\x2e\x37\x30\x37\x4c\x31\x32\x2e\x35\x37\x38\x2c\x37\x2e\
+\x31\x38\x43\x31\x32\x2e\x33\x37\x38\x2c\x37\x2e\x32\x39\x37\x2c\
+\x31\x32\x2e\x31\x36\x31\x2c\x37\x2e\x33\x35\x33\x2c\x31\x31\x2e\
+\x39\x34\x35\x2c\x37\x2e\x33\x35\x33\x7a\x20\x4d\x32\x38\x2e\x34\
+\x30\x32\x2c\x37\x2e\x32\x38\x37\x0d\x0a\x09\x63\x2d\x30\x2e\x32\
+\x31\x35\x2c\x30\x2d\x30\x2e\x34\x33\x34\x2d\x30\x2e\x30\x35\x36\
+\x2d\x30\x2e\x36\x33\x33\x2d\x30\x2e\x31\x37\x33\x6c\x2d\x30\x2e\
+\x30\x39\x31\x2d\x30\x2e\x30\x35\x32\x63\x2d\x30\x2e\x36\x30\x31\
+\x2d\x30\x2e\x33\x34\x31\x2d\x30\x2e\x38\x31\x32\x2d\x31\x2e\x31\
+\x30\x34\x2d\x30\x2e\x34\x37\x2d\x31\x2e\x37\x30\x34\x63\x30\x2e\
+\x33\x34\x2d\x30\x2e\x36\x2c\x31\x2e\x31\x30\x34\x2d\x30\x2e\x38\
+\x31\x31\x2c\x31\x2e\x37\x30\x33\x2d\x30\x2e\x34\x37\x6c\x30\x2e\
+\x31\x32\x35\x2c\x30\x2e\x30\x37\x31\x0d\x0a\x09\x63\x30\x2e\x35\
+\x39\x36\x2c\x30\x2e\x33\x35\x31\x2c\x30\x2e\x37\x39\x33\x2c\x31\
+\x2e\x31\x31\x37\x2c\x30\x2e\x34\x34\x32\x2c\x31\x2e\x37\x31\x32\
+\x43\x32\x39\x2e\x32\x34\x38\x2c\x37\x2e\x30\x36\x37\x2c\x32\x38\
+\x2e\x38\x33\x2c\x37\x2e\x32\x38\x37\x2c\x32\x38\x2e\x34\x30\x32\
+\x2c\x37\x2e\x32\x38\x37\x7a\x20\x4d\x32\x30\x2e\x31\x33\x2c\x32\
+\x2e\x36\x30\x33\x68\x30\x2e\x30\x39\x36\x63\x30\x2e\x36\x38\x39\
+\x2c\x30\x2c\x31\x2e\x32\x35\x2c\x30\x2e\x35\x36\x2c\x31\x2e\x32\
+\x35\x2c\x31\x2e\x32\x35\x0d\x0a\x09\x73\x2d\x30\x2e\x35\x36\x31\
+\x2c\x31\x2e\x32\x35\x2d\x31\x2e\x32\x35\x2c\x31\x2e\x32\x35\x68\
+\x2d\x30\x2e\x31\x32\x34\x63\x2d\x30\x2e\x36\x39\x2c\x30\x2d\x31\
+\x2e\x32\x35\x2d\x30\x2e\x35\x36\x2d\x31\x2e\x32\x35\x2d\x31\x2e\
+\x32\x35\x73\x30\x2e\x35\x36\x2d\x31\x2e\x32\x35\x2c\x31\x2e\x32\
+\x35\x2d\x31\x2e\x32\x35\x22\x2f\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\
+\x3e\x0d\x0a\
+\x00\x00\x15\x21\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\
+\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\
+\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\
+\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x14\xc1\x49\x44\x41\x54\x78\
+\xda\xdd\x9a\x79\x7c\x14\xe5\xfd\xc7\xdf\xcf\x33\x33\x3b\xbb\x9b\
+\x84\x9c\x10\x0e\x39\x14\x5a\x14\x05\x29\x49\x90\x42\x2b\x9e\x94\
+\x6a\xad\x3f\xfd\x59\x6b\x6b\x6b\xab\x62\x10\xb5\xaf\x5e\xda\x7a\
+\xf5\xa7\xb6\x56\xdb\x6a\x6d\x6b\xbd\x08\x1e\xd5\x22\x5a\x0b\x5a\
+\xc1\x2a\x1e\x88\xa8\x08\x84\x84\x9b\x08\x84\x3b\x40\x8e\x4d\xb2\
+\xd9\xcd\x66\xcf\x99\xe7\xf9\xfd\xb1\x93\x10\xd4\x5a\x6d\x1b\xd0\
+\x3e\xaf\xd7\xbe\x66\x32\x9b\x64\xe6\x73\x7c\x8f\xe7\x99\x47\xf0\
+\x09\x1b\x95\x65\x4c\x10\x82\xe9\x4a\x31\x36\x93\xe1\xb8\x74\x9a\
+\x62\x34\x01\xc0\x35\x4d\x3a\x2d\x1f\x7b\x0c\x83\x0d\xc0\x1a\xe0\
+\xc9\xaa\x5a\x54\x65\x19\x54\xd5\xfe\x6b\xf7\x13\x47\x18\x2c\x55\
+\xb5\x50\x39\x81\x81\x42\x72\x73\x57\x8c\xab\x0b\xfa\xc1\xf8\x93\
+\xa7\x30\xfc\x84\xcf\x73\xd4\x88\x61\x94\x0c\xee\x8f\xcf\x2f\x51\
+\xe9\x2e\x22\x6d\x4d\x34\xee\xd9\x49\x43\x5d\x0d\x75\xab\xd7\xb1\
+\x7d\x07\xf8\x03\xac\x96\x92\xdf\x57\xd5\x32\xef\x5f\x21\xe2\x88\
+\x12\x70\xc5\x04\x0a\x84\xe4\x89\x64\x27\xe7\x4c\xbb\xf8\x3c\xa6\
+\x7d\x63\x26\xfd\x47\x7d\xa9\xe7\x7b\x27\xd1\x40\x2a\xba\x17\x95\
+\x8e\x81\xd0\x58\xfe\x7c\x7c\x79\xa5\x48\x5f\x2e\xb8\xed\xa4\x9b\
+\x96\xf0\xc6\x73\x4f\xf3\xea\x82\xb7\x69\x0b\x93\xb0\x2c\x2a\xab\
+\x6a\x99\xfb\x71\x88\x10\x47\x4a\xf5\x99\xe5\x5c\x1b\xef\xe4\xae\
+\xb3\xbe\xf3\x0d\x2e\xba\xa1\x0a\xc8\x45\x65\x9a\x69\xde\xf0\x34\
+\xe1\x5d\xcb\xe8\xd8\xbb\x11\x69\x80\x9d\xe3\xc7\xb0\x4c\xb4\x52\
+\x64\x12\x19\xd2\xc9\x0c\xfe\x7e\x03\x28\x18\x36\x9e\x82\xe1\x65\
+\xf4\x1b\x3c\x01\x99\xde\x49\xf5\x0b\x0f\x31\x6f\xf6\xab\x24\x53\
+\x6c\x12\x82\xa9\x40\xfb\x47\x21\x41\x1c\x11\xcb\x97\x89\x9a\x82\
+\xa2\xfc\xb2\x9b\xe6\x2e\xa3\xdf\x80\x71\xa4\x3a\xd6\xb1\xf7\xed\
+\x5f\xd3\xb2\x65\x35\xa5\xa3\xfb\x93\x3f\x50\x92\x57\x22\x31\x4c\
+\x8d\xeb\x28\x54\x46\xa3\x5c\x85\x56\xd9\xf3\x78\x44\xd3\x15\x16\
+\x44\x5b\x32\x68\x6c\x06\x8e\x9d\x4e\xf1\xc8\x93\x51\x9d\x1b\x79\
+\xe6\x0f\xbf\xe6\x8d\xa5\xcd\xd8\x36\xa7\x55\xd5\xb2\xf4\x13\x43\
+\x40\x65\x19\x68\x4d\xd0\x71\xd8\x59\x71\xca\x49\x03\x66\xfd\x61\
+\xa5\x80\x0c\xbb\x96\x5c\x43\xd3\x86\x65\x0c\x2f\x2f\x61\xe0\x68\
+\x1f\xca\x51\xa8\x8c\x42\x29\x17\xed\x7a\xc0\x1d\x85\x72\x34\x5a\
+\x65\x09\x71\x1d\x8d\x76\x34\x5a\x6b\x12\x51\x88\x84\x0c\x5c\xd7\
+\xc7\xd0\x8a\x0b\xb1\x73\x06\x50\xb7\xf4\x3e\xe6\xdc\xbf\x0a\xcb\
+\xe2\x8a\xd9\x35\x3c\xfc\x61\xcf\x65\x1c\x46\xf0\x86\x93\x61\xff\
+\x99\x5f\x3b\xbb\xff\xa5\x77\xbe\x2e\x32\x5d\x3b\x58\xf7\xa7\x33\
+\x30\xad\x30\xe3\xce\x29\x26\xa7\x50\xa0\x5d\x85\x72\x15\xa8\xac\
+\xda\x68\x8d\x76\x15\xda\xd5\x68\xa5\xb2\xe7\x0a\xb4\xab\x30\x04\
+\xa0\x01\xa5\xf0\xe7\xb8\x48\x1c\x9a\xb6\xac\x45\xa3\x18\x7a\xe2\
+\xb9\x8c\x1b\x1d\x67\xc5\x5b\x3b\xbf\x5a\x31\x84\xdd\xb5\x07\x58\
+\x7f\xc4\x1d\x70\xc5\x04\xf1\xee\xc4\x53\x27\x8d\x9e\x71\xf7\x3b\
+\x22\xd9\xb1\x96\x75\x8f\x5f\xc4\x31\x53\x06\x32\x60\x94\x0f\x37\
+\xe5\x80\x3a\x08\x5e\x39\xdd\x60\xb3\xca\x2b\xf7\xa0\x03\x92\x5d\
+\x2e\x4b\x17\xb7\xb0\x7b\x67\x0c\x27\xad\x18\x32\x34\x87\xb2\xf2\
+\x42\x0a\x0b\x7d\xa4\x13\x9a\x48\x87\x4d\xb0\x70\x38\x03\x8e\x3d\
+\x8d\xa6\xcd\xf3\xb9\xe7\x57\x6f\x61\x9a\x4c\x02\xaa\xab\x6a\xd1\
+\x47\x84\x80\x99\x15\xdc\x5b\x3a\xa8\xe4\x7b\xb7\x3d\x1f\x22\xdd\
+\x59\xcf\x9a\x47\xbe\xc2\x71\xd3\x07\xd3\xaf\xd4\x04\xc7\xc9\x5a\
+\x5d\xb9\xe0\x39\x20\xeb\x04\x8d\x72\xbd\x30\x70\x14\x96\x29\x78\
+\x65\x61\x33\x0b\x9e\x6c\x24\xaf\x20\x70\x6f\xc9\xa0\x51\xcb\x35\
+\x22\x15\x6b\x3f\x50\x11\x6e\x0b\xdf\x70\xe2\xb8\xa0\x38\xef\xbc\
+\xc1\x22\x93\x56\x44\xa3\xb9\x04\x8b\x86\x52\x32\x72\x22\x75\x6f\
+\xce\xe5\xd1\x87\xb7\xe0\xf3\x11\x10\x82\xe4\x7b\x13\xa3\xe8\x6b\
+\xeb\x03\x63\xd2\x09\x36\x57\x55\xd7\x63\xe5\x0c\xa3\xe6\xc1\x0a\
+\x46\x4c\x2e\xa4\x64\x98\x85\x76\x5d\xb4\x72\xd1\xae\x3a\x08\x5e\
+\x79\x31\xef\x59\x3f\xab\xbe\x62\xc5\x1b\xed\x2c\x98\xd7\xd6\x3a\
+\xed\x5b\xd7\x8c\xfc\xda\x0f\xef\x8e\xbe\xf7\x5e\x57\x7d\xde\xbf\
+\xfe\x98\x11\xc6\xd8\x0b\x2e\x18\x22\x32\x19\x45\xa4\x23\x97\xc2\
+\x61\xc7\xd3\xaf\x64\x00\x7f\xb9\x7f\x8e\xde\xb0\x29\xb6\xa4\xaa\
+\x96\x33\xdf\xfb\x77\xb2\x2f\x09\xa8\xaa\x05\xa5\x78\xee\x92\xeb\
+\xae\xc0\xca\x19\xc5\xf6\xbf\x57\x52\x38\x22\x8f\x92\x63\x7c\xa0\
+\x5c\xd0\x59\xcb\x67\x03\x3b\xfb\xd1\xca\x45\x6b\xe5\x7d\x5c\xb4\
+\x52\x18\x86\x66\xee\x9c\xfd\x1c\x5b\x36\x65\xcc\xfe\xfa\x0d\xef\
+\x03\xff\xe4\x9d\xdf\xe3\x81\x15\xc9\x13\x37\x6f\x4e\x3a\x4d\x4d\
+\x09\x04\x9a\xfc\x82\x18\x6d\xbb\x36\x93\x49\x26\xb8\xf0\xd2\xd3\
+\x84\xd6\x9c\x51\x59\xc6\x14\x4f\x94\xbe\x4f\x82\x95\x65\x50\x36\
+\x98\xe9\xb6\xc9\xf7\xaf\xba\x7f\x15\xb1\xc6\x95\xec\x59\xfe\x10\
+\x63\xbf\x5a\x02\x19\xc7\x03\xec\x66\x09\x50\x59\xc0\xb8\xae\x77\
+\xd4\x5e\x22\xcc\x3a\x60\xe5\xb2\x30\x0d\x0d\xbe\x05\xbf\x78\x76\
+\xf3\x9f\x16\xaf\xde\xf1\xbe\x7b\x3d\xbb\xa4\x1a\x80\xd3\xc7\x96\
+\x1a\x99\x64\xd7\x29\x9f\xf9\x6c\x2e\xd2\xb2\xb0\xec\x00\xd1\xb6\
+\x76\xf2\x06\x8c\xc4\x2f\xf6\x53\xbf\x2d\x56\x31\x67\x0d\x0f\x1e\
+\x16\x07\x54\xd5\x82\xd6\xdc\x72\xfe\x55\x33\x00\x93\x5d\x4b\x6f\
+\x67\xe4\x17\xfb\xa3\xd3\xce\x41\xc5\x95\xf2\x9c\xe0\x7a\xe0\x35\
+\x28\x9d\x75\x82\xf7\xbd\xd0\x8a\xc6\x7d\x49\xb4\x1b\xaf\xae\x5e\
+\xfc\xe7\x0f\xbd\x67\x6e\x61\xf1\xaa\x03\x07\x52\xd8\x41\x3f\x86\
+\x69\x93\x93\xe7\xa0\x15\x24\xa3\x2d\x4c\x9d\x76\x02\x5a\x31\xb6\
+\xb2\x8c\xe3\x0f\x0b\x01\x57\x4c\x20\x2f\x19\x63\xd2\xa9\xdf\xf9\
+\x1e\xf1\xd0\x46\x12\xed\xbb\x28\x19\x65\x67\x6b\x57\xb7\xfa\xbd\
+\x88\xd0\x28\x84\x77\x4d\x7b\xe1\xd1\x1d\x02\x42\x80\x52\xae\x51\
+\xfb\xda\x5f\x3f\xf4\x9e\xb6\x6d\x19\xd2\x34\x90\xa6\x8d\xb4\x6c\
+\x90\x01\xf2\x8a\x03\x74\xb6\x36\xe3\x90\xcf\xe4\x29\x79\x08\xc1\
+\x35\x7d\x4e\x40\x65\x19\x48\xc9\x8c\xb2\x2f\xf8\x80\x71\xb4\x6c\
+\x9e\xcf\xe0\x71\xfd\x51\x49\x07\xa1\xdc\x83\xaa\xf7\x8a\x7f\xd1\
+\xa3\xba\x8b\xe8\x56\x5f\x65\xeb\xff\x90\xa3\x4c\x0c\x2b\xef\xf4\
+\x59\x77\x2f\xfc\xd0\xfb\xb6\x35\xed\x9f\x34\x62\x64\x01\x4a\xf8\
+\x90\xa6\x0f\xd3\xb6\xb1\x6c\x87\x8c\xeb\x47\xbb\x09\x26\x4e\x1a\
+\x42\x22\xc9\x8c\x3e\x27\xc0\x4b\x7e\xd3\xc6\x4d\xfd\x1f\x00\x42\
+\x75\x2f\x52\x3c\xcc\x3c\x18\xeb\x3d\xc9\x2f\x4b\x84\x56\x87\xe6\
+\x02\xa5\xbd\x1e\xc0\x73\xc4\x49\x93\xf3\x88\x86\xdb\x4e\xbf\xe3\
+\x92\xc9\xc7\xfe\xe4\x4b\x83\xde\x57\xb9\x9e\xfa\xd5\x65\x68\xad\
+\x7d\xe1\x50\xdb\x4d\x15\x9f\x1f\x8c\x34\x6d\x0c\x9f\x1f\xc3\xf2\
+\x63\x98\x3e\x72\x8a\x0b\x88\x85\xc3\x8c\x18\x99\x87\x65\x62\x56\
+\x96\x31\xa4\xcf\x43\x20\x91\xe0\xb4\x13\x2a\x2a\x70\xd3\x51\x9c\
+\x64\x1b\x81\x42\x99\x55\xb6\x1b\xb4\x3e\xd4\x05\xba\xdb\x15\xda\
+\x45\x28\x75\x48\x85\x48\x25\x1c\x2e\x9f\x59\x4a\xfd\xba\x55\xeb\
+\x07\x1f\xf3\x99\x51\x00\xd5\xaf\x3c\x96\xcd\x19\xc0\xd9\x57\x5e\
+\x15\x9c\x75\x92\x5d\x7f\xda\xf4\x11\x7a\xe0\x90\x42\x0c\xcb\x46\
+\x9a\x7e\x84\x69\x63\x58\x7e\x4c\x7f\x0e\xae\x93\x21\x93\x91\x8c\
+\x1c\x69\x21\x04\x67\xf4\x79\x1f\x70\xf1\x67\xd0\x73\xdf\x7d\x9e\
+\xc8\xbe\x7c\xf6\xbd\xf3\x43\xc6\x9c\x99\x8f\xce\x64\x10\x38\x08\
+\x32\x68\x57\x83\xd7\x03\x74\x37\x3f\xdd\x0d\x90\x76\x7b\x77\x80\
+\xa0\x95\x81\x90\x06\xeb\xd7\xc4\xf9\xd3\xc3\xfb\x28\x28\x29\x59\
+\x64\x59\x2c\xf1\x05\x82\xc9\x64\x57\xb2\xa2\xad\xb9\xf5\xf2\x73\
+\x2e\x18\xad\xcf\x38\xeb\x68\x91\xce\x48\x10\x12\x29\x7d\x20\x25\
+\xae\x12\x74\x46\x25\x4e\x34\x44\x71\x51\x07\x8b\x16\xd4\xb1\x62\
+\x45\xfc\xce\xd9\x35\xdc\x08\x60\xf6\x51\x0e\x18\xa4\x32\x80\x51\
+\x4a\x32\x52\x8f\x3f\xcf\x87\x76\xb2\xf6\x16\xda\x05\x0e\xad\xfb\
+\x42\x29\xb4\xd6\xd9\xda\xef\xcd\x03\xb2\xe2\x1a\x20\x0d\x34\x06\
+\xca\x35\x38\x7e\x9c\x9f\xdf\x3f\x34\x90\xe5\x6f\x85\xcf\x09\x35\
+\xa7\xcf\x51\x08\x4a\x07\xf6\xa7\x7c\xca\x04\x0c\xc3\x10\x19\xd7\
+\x44\x9a\x16\x42\x18\x60\x18\x08\x69\x21\x10\x20\x53\x68\x99\x8b\
+\x10\x2d\x14\x16\x59\x28\xc5\xa0\xee\x67\x35\xfb\xc8\x00\xf9\xc1\
+\x20\x80\x1f\xe5\x24\x30\x2c\x91\x05\xaa\xd5\x21\xe0\xbb\x2b\x81\
+\x46\xf5\xe4\x00\x81\x00\x61\x22\x84\x04\x69\x00\x06\x42\x1b\x60\
+\x48\x50\x26\x19\xd7\xe4\xa4\x29\x83\x41\x5a\x08\x69\xa1\x31\x10\
+\xd2\x44\x48\x33\x7b\x4d\x98\x20\x3d\xf0\xd2\x00\x61\xa2\x45\x06\
+\x61\x06\x11\x3a\x89\xdf\x06\xad\xc9\xef\x6b\x02\xbc\xd0\x8a\x65\
+\x0f\x5a\xf7\x24\x38\x81\x0b\xb8\x87\x26\x42\x95\x8d\x65\x21\x2c\
+\x10\x12\x2d\x24\x42\x1a\x68\xd7\x40\x0a\x03\x25\x0d\xd0\xb2\x17\
+\x40\x13\x81\x95\x3d\x0a\xcb\x03\x6f\x1c\x42\x82\xe8\xfe\x59\x98\
+\x68\xe2\x48\x53\x83\x4e\x22\x84\x3a\xe4\x41\xfb\x8a\x80\x8e\x78\
+\x1c\xa0\x19\xc3\x17\xc4\x49\xb9\x1e\x11\x2e\x90\x9d\xc7\x0b\xed\
+\x7a\x21\x81\xa7\x92\xec\x01\x0f\x06\x78\x36\x46\x19\x08\x3c\x27\
+\x08\x1f\x88\x2c\x28\xa4\x09\xa2\x1b\xac\xd9\x43\x06\xd2\x04\x29\
+\x91\x86\x95\xfd\xbf\x4a\xa0\xf1\x61\x9a\x49\x24\x69\xd2\x69\x8d\
+\x10\x74\xf6\x75\x19\x6c\x4c\x24\x81\x58\x3d\xfe\xfc\x41\x24\xa2\
+\x19\xa4\xe8\xce\xec\xdd\x0e\xf0\xf8\x17\x3e\xc0\x07\xc2\x02\xe1\
+\x43\x08\x1b\xa4\xdd\x73\x2e\xa4\x0f\x61\xd8\x08\x23\x90\x3d\x9a\
+\x7e\xa4\xe9\x47\x1a\xde\xd1\xf4\x7b\xd7\x02\x08\xcb\x46\x58\x36\
+\x86\xe9\x47\x18\xd9\x4a\xe0\x68\x13\x64\x00\x9f\x11\x43\xe8\x34\
+\x91\x88\x8b\x94\x1c\xe8\xf3\x32\x28\x0c\x32\xcd\x5b\xdf\x21\x77\
+\xd0\x78\x3a\x5b\x62\x08\xe1\x95\x3c\xc8\xda\x57\xf8\x3c\x90\x1e\
+\x78\x6c\xef\xbc\x9b\x04\x7f\x16\xbc\xf4\x23\x3c\xb0\xc2\x0a\x20\
+\x3d\x12\x84\x19\xf0\xae\xf9\x91\xa6\x8d\x30\x3d\x72\x8c\x5e\x84\
+\x98\x36\x19\x47\x62\x05\x4b\x90\x99\x06\xa4\xe1\x72\xe0\x80\x0b\
+\xb0\xbd\xcf\x09\xf0\x07\x78\xfd\xdd\xea\xb7\x90\x66\x3f\xfc\xf9\
+\x83\xe8\x6c\x15\x80\x99\x05\x89\xd9\xa3\xb8\xee\x06\x2d\x7d\x68\
+\x61\x23\x84\x8d\x96\x9e\xf2\xd2\xee\x51\x5d\x98\xb6\x07\x3e\x70\
+\x88\xf2\xc2\xf0\xc8\x30\xec\x1e\x57\x08\xef\x63\xfa\x72\x48\x24\
+\x1c\xec\xdc\x22\x54\xd7\x36\x82\x41\xd8\xba\xd5\x41\x6b\x96\xf4\
+\x79\x2b\x6c\x48\x5e\xd9\x50\x1d\x87\xf8\xdf\x28\x19\x7d\x32\x1d\
+\xcd\x16\x42\x58\x68\xb2\x80\xd1\x36\xf4\x38\xc1\x0f\xbd\xc1\x0b\
+\x0b\x21\x6d\xf0\x00\x0b\x33\x90\x0d\x01\x33\x80\x30\xfd\xd0\xa3\
+\xf2\xc1\x70\xe8\x71\x84\x19\x40\x7a\xbf\xeb\x28\x83\x78\x97\x03\
+\xc9\x36\x72\xf3\x32\x34\x34\x28\x52\x29\xa5\xab\x6a\xd9\x7d\x38\
+\x5a\xe1\x47\x6a\x56\xa5\xa0\xf3\x19\x4a\xc7\x9e\x47\x53\x7d\x1c\
+\x69\x5a\xd9\x78\xc7\x07\xd2\x02\x61\xf7\x8a\x7f\x1b\xdd\xa3\xba\
+\x1f\xa4\x8d\x90\x81\xac\xfd\xbb\x5d\x60\xf8\x11\x86\xe7\x00\xc3\
+\xce\x12\x61\x04\xc0\x03\x9e\xfd\xd9\x06\x8f\x94\x48\x7b\x02\x3b\
+\xa7\x14\x33\xfe\x0e\x86\x25\x58\xb9\x22\x43\x30\xc8\x23\x87\x65\
+\x36\x38\x67\x0d\x11\xdb\x4f\xcd\x1b\x7f\x7d\x19\x5f\x20\x45\x5e\
+\xe9\x31\xb4\x1e\xc8\xf5\x14\xb7\x3d\xc5\x7d\xd9\x84\x27\xfd\xd0\
+\x1d\xef\xc2\xf6\xe2\xde\x03\x66\x04\x3c\xd0\xdd\xd6\xb7\xbd\xef\
+\x02\x9e\xf2\xbd\x42\xa4\xc7\x01\x7e\x5c\x6d\xd1\xd1\xd6\x49\x7e\
+\xff\x81\xd0\xb1\x94\x9c\x1c\xc1\x6b\x4b\xd2\x68\xcd\x03\xbd\x17\
+\x45\xfa\x8c\x80\xca\x32\x84\x94\xdc\xf7\xca\xf3\x51\x44\xf8\x57\
+\x8c\x38\xf9\x6a\x1a\x36\x86\x7b\x92\x1f\xc2\x97\x05\x2e\xec\x9e\
+\x30\xe8\xb6\x7d\x56\x49\x7f\x8f\x95\xe9\xb6\x7d\xaf\x30\x90\xdd\
+\xa1\xd1\x6d\x79\x23\x90\x6d\x76\x0c\x3f\x86\x2f\x97\xa6\x86\x10\
+\x76\xfe\x10\x74\xd3\x02\x82\x79\x06\x6f\x2c\x75\xd1\x5a\x6d\xab\
+\xaa\x65\x6d\xef\x75\xc1\x3e\xcb\x01\x55\xb5\xe8\x74\x9a\x3f\x9e\
+\x75\xc9\xc5\xe8\x92\x2a\x6c\x73\x1f\x05\xc3\x4e\x60\xdf\x8e\x7e\
+\x60\x58\x20\xfc\xd9\x04\x28\xfd\x59\xc5\x3d\xf5\xbb\xc1\x67\xc1\
+\x74\x87\x40\x10\xf9\x1e\x47\x88\xee\x3c\x60\x04\xbc\xf0\xc8\x5e\
+\x33\xac\x1c\x42\x8d\x61\x92\x09\x45\x71\x91\x8d\x19\x59\x48\x20\
+\x20\x78\xea\xe9\x14\x52\x72\xe5\x7b\x97\xc4\xfa\x6c\x32\x54\x59\
+\x2e\x56\x9d\x58\x3e\xa2\xe2\xaa\x07\x77\x0a\x15\x7b\x83\xcc\xae\
+\x8b\xb0\x47\x3d\xc1\xc6\xf9\xb7\x33\xf4\x73\xa3\x29\x28\x8e\xa1\
+\x95\x89\xd6\x06\x68\x13\xc8\xf6\xfc\xda\xcb\x09\x5a\x74\x57\x0a\
+\xef\x28\x2d\xaf\x45\xee\x6e\x7a\x7a\x35\x43\xd2\x02\x69\x20\x0d\
+\x1f\xed\x2d\x61\x42\xfb\x9b\x18\x36\xa6\x9c\xf8\xaa\x0b\xc9\xcb\
+\x8d\xf3\xf4\xd3\x5a\x2f\x5f\x9e\x7c\xb3\xaa\x96\x53\x0e\xcb\xb2\
+\xf8\xcc\x72\x6e\x09\x06\xb8\xf5\x9e\x37\x3b\xd0\x4e\x86\x64\xdd\
+\x04\x8c\xc0\xf1\xf8\xe4\x2e\x18\x78\x3b\x1b\x16\xdc\xcb\x31\x93\
+\x3f\x47\x6e\x6e\x0c\xad\xac\x2c\x09\xc2\x44\x6b\xd3\x2b\x8d\xbd\
+\xc0\x7b\xad\xad\xee\x45\x46\x77\x8b\xdb\x0d\x1c\x61\x22\x4d\x9b\
+\x96\x7d\xcd\x84\x43\xed\x0c\x3f\xbe\x8c\xd8\xaa\xab\xc9\xf1\xed\
+\x60\xcf\x1e\xc1\x1d\x77\xc4\x09\x04\xc8\x05\xba\xfa\x74\x59\xbc\
+\xb2\x0c\x01\x94\xa7\x13\x54\xff\xf1\xf5\xe5\xe4\x96\x4e\x26\xbe\
+\xf9\x24\x24\x8a\x44\xc9\x0b\xdc\x7b\xf9\x14\xfa\x0f\x35\x98\x75\
+\xe7\x4f\xd8\xfc\xe2\x93\x0c\x9f\x38\x99\xbc\xbc\x68\x96\x04\x4c\
+\xaf\x27\xf0\xba\x43\x61\x78\xc7\xde\x4a\x9b\x68\x71\xb0\xe5\xcd\
+\x4e\x82\x6c\xd2\xa9\x0c\x4d\x7b\x0f\xe0\xa4\x1d\x86\x8e\x99\x40\
+\x64\xe5\x2c\x72\xcd\xad\x24\x12\x82\x1f\xff\x38\x81\x65\xe9\xa9\
+\xc0\x9b\x1f\xf4\xb2\xd4\xfc\x4f\xc6\x3d\x90\x93\x4c\x50\x7d\xdd\
+\xef\x6e\x22\xb7\x74\x32\xc9\x9d\x33\x20\xd3\x8c\x6f\xcc\x6a\xe6\
+\x54\x9e\x4a\x57\xa2\x95\xce\xba\x24\x22\xf3\x2a\x63\xce\xfc\x0a\
+\xf5\xcb\xfe\x4e\xc9\x71\x27\x53\x50\xec\x22\xa4\x44\xf4\x56\x5f\
+\x5a\x08\x4c\x74\xf7\x04\x48\xf4\x9e\xe8\x58\x08\xd3\x26\xd9\x95\
+\x24\xd2\xde\x42\x67\x38\x4a\x5e\xf1\x00\x06\xf7\x2f\x26\xfa\xf6\
+\x05\xe4\xd8\xed\x24\x93\x82\x1b\x6e\x48\xe2\xf3\xe9\x6b\x66\xd7\
+\xf0\xe6\x3f\x7a\x6e\xf9\x9f\xac\xfd\x5a\x8b\x35\xd3\xce\x2b\xd7\
+\x27\x4c\xbb\x9d\x74\x68\x2e\x99\xf6\x45\x04\xc7\xbe\xc0\xd3\xb7\
+\x5e\x4e\x28\xd4\x4a\x67\x24\xca\x0f\xee\x7b\x16\x3a\x5d\xe4\x81\
+\x9b\x19\x3d\x65\x2c\xa9\x96\x0d\xec\xdd\xd8\x40\x4a\x1f\x85\x96\
+\x01\x34\x3e\x32\x19\x99\xfd\x38\x06\x8e\x23\x71\x5c\x13\xc7\x35\
+\x48\xa7\x20\x11\xcb\x10\x0e\x45\xd9\x57\xbf\x97\xa6\xbd\x8d\x48\
+\x23\xc0\xd1\xe3\xa7\x10\x4c\xac\xa4\x6b\xf9\x99\x04\xfd\xed\x84\
+\x42\x92\x6b\xaf\x4b\x02\xea\xda\xd9\x35\xdc\x7f\x58\xde\x0e\xcf\
+\x2c\xe7\xd1\x92\x92\x9c\x4b\x6f\x7f\x29\x8a\x9b\xd8\x49\x6c\xe3\
+\xa9\x04\x87\x7d\x9f\x15\xaf\x39\xbc\x39\xff\x7e\x9a\x9a\x43\x9c\
+\x77\xd9\xa5\x9c\x7e\xfe\x78\xf4\x9e\xab\x10\x52\x42\xda\x41\x05\
+\xc6\xa0\x73\x4f\xa7\xa9\x7e\x0b\xae\x3d\x8a\x01\x63\x26\x21\xad\
+\x20\xca\x89\xa3\x95\x8b\xe3\x68\x32\x0e\xb8\x0a\xd0\x12\x61\xd8\
+\x98\xbe\x20\x76\xde\x00\xfc\x01\xe8\xaa\xff\x1b\x99\xbd\x0f\xe1\
+\x0f\xa6\x09\x04\x24\x8b\x16\xc1\xfc\xbf\xc6\x09\xf8\x39\x77\x76\
+\x2d\x0b\xfb\xfc\xf5\x78\x65\x19\x08\x38\xc7\xcd\xb0\xf0\x81\xb7\
+\xb7\x61\xe5\x1e\x4d\x64\x4d\x39\xa6\xff\x68\xc2\xe2\x16\x1e\xbf\
+\xe1\x2c\x5a\xda\x3a\x38\x76\xec\x67\x99\xf5\xe0\xb3\x38\xd5\x23\
+\x31\x4c\x0b\x81\x93\x5d\x0f\x29\xfa\x06\x9d\xa1\xfd\x08\x3a\xc9\
+\x2d\xf9\x2c\xad\x0d\xad\x60\x06\xd0\xfe\x11\x98\xb9\x83\xf1\x17\
+\x94\xe2\xcb\x2d\x40\x4a\x93\x4c\x32\x86\xd3\xd5\x8a\xea\xda\x8e\
+\xea\x58\x09\xd1\x0d\xf8\x73\x25\xb6\x0d\xdb\xb6\x09\x1e\x79\x38\
+\x45\xb8\xc3\xd9\x23\x04\x93\xe7\xac\x39\x38\xe3\xfb\xb0\x61\xfe\
+\x07\xe2\x7e\x50\x3c\xce\xc2\x5f\x3c\x31\x07\x2b\xef\x33\x44\x37\
+\x9d\x07\x5a\x22\x87\xce\xe1\xe9\x19\x15\x84\xa3\x31\x72\x73\x4c\
+\xae\xbc\xf7\x55\xd2\xd5\xc7\x20\x65\x00\xa1\xd3\xd9\xf7\x03\xe6\
+\x60\x3a\xfb\xdd\xcd\x03\xd7\x9e\xc4\xf6\x5d\x61\xee\xba\x63\x0d\
+\xf9\x85\x85\x08\xdf\x40\xa4\xdd\x82\x4a\xfb\x48\xed\x4d\xd1\x95\
+\x4a\x20\x74\x12\xd3\x54\x98\x66\x06\x54\x0a\x43\x26\x30\x8a\x2c\
+\x56\xae\x70\x58\xfc\xb2\xc3\x9e\x3d\x19\x15\x08\x70\xf5\xc3\x6b\
+\x79\xe8\xbd\xb5\xbe\x4f\x08\xe8\xde\xed\x71\xd9\x78\xd6\x5f\x78\
+\xc5\x57\x19\x5e\x3e\x83\xae\xdd\x77\x92\x89\xae\xa7\x78\xd2\x0a\
+\xaa\xae\x39\x87\x8e\xce\x2e\x12\x9d\x9d\xdc\xb8\x70\x3b\xa9\xcd\
+\x67\x20\x90\x08\x95\x41\x0b\x85\x00\xc4\x89\xb5\xcc\x9b\x39\x8d\
+\x48\x2c\x46\x7e\x6e\x86\xe0\xc9\xed\x88\x75\x45\x6c\xd9\x10\xa7\
+\x23\xac\x18\x32\x18\x8a\x8a\x24\x96\x6d\xe0\xba\x82\x70\x87\xa2\
+\xa5\x59\xb3\xb7\x41\xb3\x6d\x9b\x66\xd3\xa6\x34\x3e\x1f\xef\x9a\
+\x26\xbf\x7f\x62\x33\x55\xbd\xf3\x51\x9f\x13\x50\x55\x0b\x33\x2b\
+\xc4\x4b\x23\x8e\x29\xed\xff\x95\x1f\x3e\x4f\x3a\xb2\x82\x78\xc3\
+\x43\x14\x9d\xf8\x30\x0b\xef\xb9\x89\xa6\x03\xfb\x68\x6b\x6d\x63\
+\xc6\x6d\xf7\x91\x9b\xf8\x3d\x6e\x62\x2f\x52\x38\x20\xbc\x25\xb0\
+\x09\x2b\x98\xff\xcb\x59\x34\x87\xda\x88\xb4\x87\xf9\xc9\x63\xab\
+\x90\x3b\xbe\x4c\x63\x8b\xcd\x5d\x77\xa5\xf0\xfb\x59\x94\x4e\x33\
+\xd1\x71\x28\xed\xc9\xd8\x92\xa4\xcf\x47\xbd\x69\xb2\x4a\x08\x6a\
+\x02\x01\x9e\xaa\xaa\x25\xfa\x71\x14\xff\x8f\x11\x30\xb3\x9c\x2b\
+\x0d\xf4\xf4\xeb\xe7\xae\x47\x65\xda\xe9\xd8\x54\x49\xa0\xf4\x42\
+\xea\xaa\x5b\xd9\xf4\xce\xcb\xb4\x86\x5a\x99\xf2\xa5\xb3\x28\x9b\
+\x7a\x1c\xb1\xb5\xd7\x62\x1a\x16\x08\x6f\x19\xec\xa8\x1f\x50\xfd\
+\xc2\x3b\x6c\x5d\xbf\x86\x50\x4b\x0b\xe7\xce\xf8\x29\x47\xf7\x7f\
+\x8d\xd4\xae\xd5\xdc\x7e\xbb\x22\x18\xe4\xcb\x55\xb5\x2c\xfe\x28\
+\x0e\xfc\xb8\x8a\xff\xdb\x49\xd0\x6b\x76\x46\x27\xbb\x78\xf7\xae\
+\x45\x2f\x31\x60\xd4\x74\x42\xd5\x67\x20\x84\xc4\x38\xea\x51\x66\
+\x5f\x3d\x89\x50\x7b\x84\xc2\xa2\x42\x6e\x5e\x50\x4b\x64\xd9\x08\
+\x4c\xcb\x87\x24\x8d\x14\x2e\x46\x70\x14\xed\x05\x0b\x78\xf4\x47\
+\xa7\xd3\x14\x6a\x67\xe4\xb1\x63\xf9\xde\xec\xc7\x60\xfd\xf1\xdc\
+\x7c\xa3\xa0\xb5\x55\x3f\x38\xbb\x86\xab\x0e\xd7\xce\x15\xf3\xe3\
+\xc6\xbd\xd6\xc8\x4c\x86\x35\x33\x6e\xbc\x8a\x01\xa3\xa6\xd3\x5e\
+\xf7\x03\xdc\x54\x1b\x25\x15\xaf\xf1\xe0\xcc\x93\xe9\xe8\x8c\xe3\
+\xa4\xe2\xfc\xe8\xb1\x5d\x44\x96\x4f\x44\xc8\x1c\xb4\x4a\xa1\x45\
+\x76\xe5\x57\x8f\x7e\x9d\xa7\xae\xf8\x02\xed\x91\x18\x01\xdb\xc7\
+\xac\x3f\x2e\x82\xb5\x83\x78\x72\x9e\xd4\x2d\x2d\x6a\xeb\x9c\x35\
+\x87\x0f\xfc\xc7\x6e\x84\xaa\x6a\x41\x48\xb1\xba\x7c\xf2\x71\xfe\
+\x2f\x7e\xfb\x7e\xba\x1a\xe7\x93\x68\x7a\x91\x81\x93\x16\xf0\x97\
+\x5b\xbf\x45\x5b\xb8\x83\x8e\xf6\x30\xdf\x7f\x70\x19\xce\x8e\x4b\
+\xd1\x6e\x2a\xfb\xaa\x4b\x2b\x70\x12\xd8\x93\x36\xf2\xf4\xff\x7d\
+\x9d\xb6\x70\x94\x58\x24\xc2\x0f\x1f\x5d\x87\xdc\x32\x99\x4d\x75\
+\x82\x57\x5e\x56\x0a\x98\xf0\xef\xc4\x73\x9f\x13\x30\xb3\x9c\x3b\
+\x73\x02\xc6\xe7\xae\x7e\x68\x8d\x70\xe2\xbb\x68\xaf\xbb\x85\x82\
+\xcf\xde\xc0\xb2\x79\x8f\xb3\xa7\xfe\x5d\xda\x5a\x5b\xf9\xea\x65\
+\x3f\x66\x48\xf1\x3a\x32\xe1\xd5\xa0\x32\xde\x0b\x10\x8d\x3d\xf8\
+\x02\x6a\x17\xdc\xcf\xf6\x2d\xbb\x09\x85\x42\x7c\xeb\x86\x07\x19\
+\xa0\x6f\xa7\x2b\xb6\x93\xdf\xde\xe5\xe2\xf7\x53\xf1\x41\x7b\x78\
+\x3e\x11\x21\xe0\xc5\xfd\xe4\x54\x9c\xeb\xef\x7a\xa1\x06\xad\x4d\
+\x9a\x6a\xbe\x8b\x5d\x38\x89\xf6\x8e\xd1\x2c\xff\xdb\xcf\x08\xb5\
+\x75\x30\xf2\xb8\xb1\x9c\x55\x79\x25\x2d\x4b\x2a\x30\x2c\x7f\xcf\
+\x36\x97\xdd\xfb\x5c\x6e\xfd\xee\x7c\x8a\x4b\xa0\x74\x00\xf4\x2f\
+\xb6\xf1\xfb\xd6\x91\x6c\x78\x84\x5b\x6e\x06\xdb\xe6\xfa\xd9\x35\
+\xac\xe5\x08\x0c\xf1\x51\xe2\x1e\xc8\x4f\x26\xe9\xf8\xd1\x5d\xbf\
+\xe1\xc4\x2f\x5f\x47\x63\xf5\x25\x38\x89\x7d\x94\x8c\x7f\x86\x07\
+\x2a\x2b\x68\x6e\x0d\x83\xd6\xdc\xf1\xe2\x4e\x5a\x97\x8d\x47\x4a\
+\x30\x44\x1a\x83\x34\x4a\x3b\x5c\x7b\x6d\x0c\xcb\xe2\x24\x60\xa7\
+\x10\x9c\xa6\x35\xe5\xae\xcb\xe4\x44\x82\x29\xfd\xfa\xf1\xda\x43\
+\xab\xdf\xbf\x79\xe9\x13\x35\xae\x98\xc0\xae\x27\x6e\x3c\x45\x6b\
+\xad\x75\xdb\x96\xdf\xe9\x9d\x8b\x3f\xa7\xb5\xd3\xaa\xe7\xcc\x9a\
+\xa8\x7f\x76\x56\xa9\xbe\x72\x02\xba\x75\xff\x1e\xdd\xf4\xfa\x24\
+\xdd\xf4\xf2\xd1\xba\xf9\xe5\x41\xba\xed\x95\x62\x1d\x7f\xbb\x40\
+\x5f\x7b\xaa\xd4\x33\xcb\xf9\xc5\x47\x20\xf9\x88\x0c\xf3\x23\xc4\
+\xfd\x93\xc5\x25\x85\x23\xbe\xfd\xcb\xa5\x24\xda\x6b\x68\xdf\xf1\
+\x30\xc3\x26\x3f\xc2\xc2\x7b\x7e\x44\x73\x53\x13\xa1\x96\x66\x2e\
+\xfb\xf9\xe3\x88\x96\xdf\xe2\x26\x43\x48\xe1\x20\x85\xc2\xf2\x69\
+\x1e\x7b\x34\xae\xa3\x51\x55\x5b\x55\xcb\xcf\xfe\x59\x72\x3d\x52\
+\x43\xfe\x13\x65\x2e\x70\xd3\x7c\xf3\x96\x67\xd6\xe1\xa6\x3b\x38\
+\x50\xfd\x7d\xf2\x87\x5f\xcc\x96\xea\xcd\xd4\xad\x7a\x93\x96\x50\
+\x88\x49\xd3\x2e\xe0\xc4\x89\xa5\xc4\xf6\x3e\xdb\xb3\xf5\x45\x2b\
+\xc5\x9a\xda\x0c\xab\x57\xa7\xe3\x8e\xc3\xc4\x23\xa9\xf0\xbf\xe4\
+\x00\xef\x81\x8f\x4a\xc6\xf9\xeb\xad\x4f\xcc\xc3\x97\x37\x8c\x3d\
+\x6f\x9c\x8f\x19\x18\x8a\x55\x74\x11\x8b\x6f\x99\x4a\x5b\x7b\x84\
+\xa2\xe2\xfe\x7c\xe7\xb6\xfb\xd9\xfd\x42\x19\x81\x80\x1f\xbf\x2f\
+\xbb\x2b\xab\xb9\xd9\xe5\xd1\x3f\x75\xe2\xb7\x99\x70\xa4\x15\xfe\
+\xd8\x04\xf4\x9e\xe4\x7c\xad\xf2\x9b\x1c\x5d\xfe\x0d\x9a\xd6\xde\
+\x40\x26\x19\x66\xf8\xd4\xf9\xcc\x9e\xf5\x45\x22\xb1\x04\xc9\xae\
+\x4e\x6e\x7b\x6e\x27\x0d\xaf\x9e\x41\xf5\xca\x14\x9b\x37\xb6\x10\
+\x6a\xcd\xd0\xd9\xa9\x91\x12\x02\x01\x2e\x9e\x5d\xc3\x36\x3e\x8d\
+\x63\x66\x85\x78\xfd\xce\x8b\x86\x6b\xad\xb5\x8e\x34\x3c\xaf\xb7\
+\x3e\x3f\x5e\xab\xf4\x7e\xfd\xe4\xf5\x67\xea\xdb\xce\x3d\x4a\x57\
+\x8e\x47\xef\xda\x58\xa3\xf7\x2e\xf9\x5f\xfd\xda\x6f\x86\xe9\xef\
+\x9c\x40\xa2\xb2\x8c\xb3\x2a\xcb\x18\xf9\x69\xc3\x6a\x7e\x40\xd2\
+\xfb\x81\x81\x3e\xf5\xfa\xb9\x6b\xc9\x74\xed\xa5\x79\xfd\x6d\x0c\
+\x1c\x7f\x33\x6f\xcd\xfb\x23\x7b\xb7\xef\x20\xd4\xdc\xcc\xb9\x33\
+\x6f\xa2\x9f\x5c\xce\x81\x03\x1b\x99\xfb\xe7\xbd\xd8\x36\x93\x80\
+\x0d\x1f\xb4\x1b\xfb\x53\x43\x80\xd7\xec\x9c\x90\x88\xf1\xbb\xbb\
+\x5f\x58\x8a\x96\xf9\xec\x5b\xf9\x75\x82\xfd\xa7\x12\x89\x14\xb2\
+\x62\xd1\x53\xb4\xb4\xb6\x31\xf2\xf8\x32\xa6\x7f\xfb\x12\xb6\x2d\
+\x3c\x9b\xda\xd5\x51\x7c\x3e\x66\x57\xd5\xfe\xe3\xfd\xf8\x9f\xf4\
+\x21\x7b\x25\x3d\x2b\x9d\xa6\xa6\xf2\x67\x3f\xa1\xff\xc8\x53\xd8\
+\xbf\xb2\x12\xb0\x29\x3a\xf6\x7a\xe6\xdf\x71\x39\x1d\xd1\x4e\x0c\
+\xc3\xe0\x9a\xfb\x5e\x64\xeb\xc2\xf3\xb1\x7c\x39\x34\x34\x74\x21\
+\x04\x35\x9f\xe4\x2c\xff\x91\x08\xf0\xb2\xf4\xa3\x27\x4d\xad\xb0\
+\xa6\x7c\xf3\xd7\xb4\x6d\xbb\x8f\x44\x78\x33\x47\x9f\xf2\x04\xf3\
+\x6e\x3c\x9b\x48\x2c\x45\x7b\xa8\x9d\x1b\xe7\xd5\xb1\xe3\xc5\xaf\
+\x81\xf4\xe3\xf3\xc1\x9e\xdd\x5d\x68\xcd\xe2\x4f\x72\x96\xff\xc8\
+\x21\x20\x04\x5b\xb4\x90\x22\xdd\xb9\x85\xb6\xad\x73\x18\x71\xf2\
+\x5c\x5e\xf8\xdd\xd5\xb4\x34\xb5\xd1\xd4\xd8\xc8\x95\xbf\x79\x86\
+\xe8\xd6\xdf\xe2\xa4\xa2\x48\x1c\xc2\x6d\x49\x52\x29\xf8\x73\x1d\
+\xfb\xe0\x53\xee\x00\x00\xad\x79\x69\xd3\xaa\xd5\x84\x37\x5f\x47\
+\xd1\xa8\xcb\xd8\x56\xfd\x16\x75\xd5\xd5\xb4\xb4\x34\x33\xe5\xec\
+\x8b\x19\x39\x3a\x87\xc8\xee\xa5\xd9\xcd\x8d\xca\x65\xf7\xee\x18\
+\xb6\xcd\x72\x3e\xe5\x43\xf6\x6a\x47\x6b\x3b\x3b\x15\x5d\x5d\x45\
+\x98\x85\xd3\x59\x3c\xe7\x37\xb4\xb6\xb7\x51\x50\x32\x90\x6f\xdd\
+\x74\x0f\x3b\x5f\xff\x69\xf6\x8d\x8d\x72\x31\x84\xa2\xf1\x40\x12\
+\xc3\xf8\xc7\x6f\x5c\x3e\x95\x65\xd0\x1f\xe0\x8d\xfa\x7a\xf3\x94\
+\x9d\xf3\xce\x27\x12\x4b\x90\x88\x45\xf9\xf9\x73\x3b\xd8\x34\xff\
+\x6c\xfc\xc1\x7c\x9c\x74\x8a\xed\xdb\x22\xec\xda\x15\x61\xeb\xd6\
+\x8e\x43\xf6\xda\xfc\x57\x10\x20\x25\xaf\xac\x7a\xe9\xf9\x53\x20\
+\x87\xe6\xc6\x16\xfe\xef\xf1\xe7\x59\x3b\xff\x52\x36\xaf\x3e\x40\
+\xfd\xb6\x10\x8d\x8d\x09\x6c\x9b\xb5\x86\xc1\x73\x5a\xb3\xa0\xaa\
+\x96\xba\x4f\x3b\x01\xe2\x3d\x6d\xf0\xb8\x60\xd0\x5c\x1f\x08\x04\
+\x30\x4d\x41\xc3\xee\x28\x18\xc4\x7c\x3e\x9e\x04\x5e\xae\xaa\xe5\
+\x39\xfe\xcb\x86\xf8\x80\xb9\xc0\x06\xa5\x68\x30\x0c\x5e\xd5\x9a\
+\xbf\x54\xd5\xd2\xf8\xde\x65\xe8\xff\xa6\xf1\xff\x5d\x51\x20\xfa\
+\x91\x10\xee\xb4\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x15\x67\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\
+\x6e\x6f\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\
+\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\
+\x73\x74\x72\x61\x74\x6f\x72\x20\x32\x33\x2e\x30\x2e\x32\x2c\x20\
+\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\
+\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\
+\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\
+\x20\x2d\x2d\x3e\x0a\x0a\x3c\x73\x76\x67\x0a\x20\x20\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x64\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\
+\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\
+\x6e\x74\x73\x2f\x31\x2e\x31\x2f\x22\x0a\x20\x20\x20\x78\x6d\x6c\
+\x6e\x73\x3a\x63\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x63\x72\
+\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\x6e\x73\x2e\x6f\x72\
+\x67\x2f\x6e\x73\x23\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\
+\x72\x64\x66\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\
+\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x30\x32\x2f\x32\
+\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\x74\x61\x78\x2d\x6e\x73\x23\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x76\x67\x3d\x22\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x0a\x20\x20\x20\x78\
+\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\
+\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\
+\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x6f\x64\x69\x70\
+\x6f\x64\x69\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x73\x6f\x64\x69\
+\x70\x6f\x64\x69\x2e\x73\x6f\x75\x72\x63\x65\x66\x6f\x72\x67\x65\
+\x2e\x6e\x65\x74\x2f\x44\x54\x44\x2f\x73\x6f\x64\x69\x70\x6f\x64\
+\x69\x2d\x30\x2e\x64\x74\x64\x22\x0a\x20\x20\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x69\x6e\x6b\x73\x63\x61\x70\x65\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\
+\x6f\x72\x67\x2f\x6e\x61\x6d\x65\x73\x70\x61\x63\x65\x73\x2f\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x22\x0a\x20\x20\x20\x76\x65\x72\x73\
+\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x0a\x20\x20\x20\x69\x64\x3d\
+\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x0a\x20\x20\x20\x78\x3d\x22\
+\x30\x70\x78\x22\x0a\x20\x20\x20\x79\x3d\x22\x30\x70\x78\x22\x0a\
+\x20\x20\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\
+\x31\x37\x36\x20\x31\x37\x36\x22\x0a\x20\x20\x20\x78\x6d\x6c\x3a\
+\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\
+\x0a\x20\x20\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x64\x6f\x63\
+\x6e\x61\x6d\x65\x3d\x22\x63\x61\x73\x68\x73\x68\x75\x66\x66\x6c\
+\x65\x5f\x6f\x6e\x2e\x73\x76\x67\x22\x0a\x20\x20\x20\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x3a\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x30\
+\x2e\x39\x32\x2e\x34\x20\x28\x35\x64\x61\x36\x38\x39\x63\x33\x31\
+\x33\x2c\x20\x32\x30\x31\x39\x2d\x30\x31\x2d\x31\x34\x29\x22\x0a\
+\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\x31\x37\x36\x22\x0a\x20\
+\x20\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x37\x36\x22\x3e\x3c\
+\x6d\x65\x74\x61\x64\x61\x74\x61\x0a\x20\x20\x20\x69\x64\x3d\x22\
+\x6d\x65\x74\x61\x64\x61\x74\x61\x34\x30\x31\x34\x22\x3e\x3c\x72\
+\x64\x66\x3a\x52\x44\x46\x3e\x3c\x63\x63\x3a\x57\x6f\x72\x6b\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x72\x64\x66\x3a\x61\x62\x6f\x75\x74\
+\x3d\x22\x22\x3e\x3c\x64\x63\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x69\
+\x6d\x61\x67\x65\x2f\x73\x76\x67\x2b\x78\x6d\x6c\x3c\x2f\x64\x63\
+\x3a\x66\x6f\x72\x6d\x61\x74\x3e\x3c\x64\x63\x3a\x74\x79\x70\x65\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x72\x64\x66\x3a\x72\x65\
+\x73\x6f\x75\x72\x63\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\
+\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x64\x63\x6d\x69\x74\
+\x79\x70\x65\x2f\x53\x74\x69\x6c\x6c\x49\x6d\x61\x67\x65\x22\x20\
+\x2f\x3e\x3c\x64\x63\x3a\x74\x69\x74\x6c\x65\x3e\x3c\x2f\x64\x63\
+\x3a\x74\x69\x74\x6c\x65\x3e\x3c\x2f\x63\x63\x3a\x57\x6f\x72\x6b\
+\x3e\x3c\x2f\x72\x64\x66\x3a\x52\x44\x46\x3e\x3c\x2f\x6d\x65\x74\
+\x61\x64\x61\x74\x61\x3e\x3c\x64\x65\x66\x73\x0a\x20\x20\x20\x69\
+\x64\x3d\x22\x64\x65\x66\x73\x34\x30\x31\x32\x22\x20\x2f\x3e\x3c\
+\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\x6e\x61\x6d\x65\x64\x76\x69\
+\x65\x77\x0a\x20\x20\x20\x70\x61\x67\x65\x63\x6f\x6c\x6f\x72\x3d\
+\x22\x23\x66\x66\x66\x66\x66\x66\x22\x0a\x20\x20\x20\x62\x6f\x72\
+\x64\x65\x72\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x36\x36\x36\x36\x36\
+\x36\x22\x0a\x20\x20\x20\x62\x6f\x72\x64\x65\x72\x6f\x70\x61\x63\
+\x69\x74\x79\x3d\x22\x31\x22\x0a\x20\x20\x20\x6f\x62\x6a\x65\x63\
+\x74\x74\x6f\x6c\x65\x72\x61\x6e\x63\x65\x3d\x22\x31\x30\x22\x0a\
+\x20\x20\x20\x67\x72\x69\x64\x74\x6f\x6c\x65\x72\x61\x6e\x63\x65\
+\x3d\x22\x31\x30\x22\x0a\x20\x20\x20\x67\x75\x69\x64\x65\x74\x6f\
+\x6c\x65\x72\x61\x6e\x63\x65\x3d\x22\x31\x30\x22\x0a\x20\x20\x20\
+\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x70\x61\x67\x65\x6f\x70\x61\
+\x63\x69\x74\x79\x3d\x22\x30\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\
+\x63\x61\x70\x65\x3a\x70\x61\x67\x65\x73\x68\x61\x64\x6f\x77\x3d\
+\x22\x32\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\
+\x77\x69\x6e\x64\x6f\x77\x2d\x77\x69\x64\x74\x68\x3d\x22\x39\x38\
+\x39\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\
+\x69\x6e\x64\x6f\x77\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x37\x32\
+\x35\x22\x0a\x20\x20\x20\x69\x64\x3d\x22\x6e\x61\x6d\x65\x64\x76\
+\x69\x65\x77\x34\x30\x31\x30\x22\x0a\x20\x20\x20\x73\x68\x6f\x77\
+\x67\x72\x69\x64\x3d\x22\x66\x61\x6c\x73\x65\x22\x0a\x20\x20\x20\
+\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x7a\x6f\x6f\x6d\x3d\x22\x31\
+\x2e\x35\x30\x35\x39\x30\x38\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\
+\x63\x61\x70\x65\x3a\x63\x78\x3d\x22\x31\x36\x30\x2e\x35\x37\x36\
+\x38\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\
+\x79\x3d\x22\x31\x35\x39\x2e\x33\x34\x38\x39\x22\x0a\x20\x20\x20\
+\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\
+\x78\x3d\x22\x30\x22\x0a\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\
+\x65\x3a\x77\x69\x6e\x64\x6f\x77\x2d\x79\x3d\x22\x30\x22\x0a\x20\
+\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x77\x69\x6e\x64\x6f\
+\x77\x2d\x6d\x61\x78\x69\x6d\x69\x7a\x65\x64\x3d\x22\x30\x22\x0a\
+\x20\x20\x20\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x75\x72\x72\
+\x65\x6e\x74\x2d\x6c\x61\x79\x65\x72\x3d\x22\x67\x34\x30\x30\x37\
+\x22\x20\x2f\x3e\x0a\x3c\x73\x74\x79\x6c\x65\x0a\x20\x20\x20\x74\
+\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x63\x73\x73\x22\x0a\x20\
+\x20\x20\x69\x64\x3d\x22\x73\x74\x79\x6c\x65\x33\x39\x37\x39\x22\
+\x3e\x0a\x09\x2e\x73\x74\x30\x7b\x66\x69\x6c\x6c\x2d\x72\x75\x6c\
+\x65\x3a\x65\x76\x65\x6e\x6f\x64\x64\x3b\x63\x6c\x69\x70\x2d\x72\
+\x75\x6c\x65\x3a\x65\x76\x65\x6e\x6f\x64\x64\x3b\x66\x69\x6c\x6c\
+\x3a\x23\x45\x31\x45\x31\x45\x31\x3b\x7d\x0a\x09\x2e\x73\x74\x31\
+\x7b\x66\x69\x6c\x6c\x3a\x23\x46\x46\x36\x36\x30\x30\x3b\x7d\x0a\
+\x09\x2e\x73\x74\x32\x7b\x66\x69\x6c\x6c\x3a\x23\x34\x43\x34\x43\
+\x34\x43\x3b\x7d\x0a\x09\x2e\x73\x74\x33\x7b\x66\x69\x6c\x6c\x3a\
+\x23\x46\x46\x46\x46\x46\x46\x3b\x7d\x0a\x3c\x2f\x73\x74\x79\x6c\
+\x65\x3e\x0a\x3c\x67\x0a\x20\x20\x20\x69\x64\x3d\x22\x67\x34\x30\
+\x30\x37\x22\x0a\x20\x20\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\
+\x3d\x22\x74\x72\x61\x6e\x73\x6c\x61\x74\x65\x28\x30\x2c\x2d\x34\
+\x35\x2e\x36\x33\x30\x30\x30\x35\x29\x22\x3e\x0a\x09\x0a\x09\x3c\
+\x70\x61\x74\x68\x0a\x20\x20\x20\x63\x6c\x61\x73\x73\x3d\x22\x73\
+\x74\x31\x22\x0a\x20\x20\x20\x64\x3d\x22\x6d\x20\x32\x37\x2e\x31\
+\x33\x33\x36\x36\x32\x2c\x31\x32\x32\x2e\x30\x32\x35\x39\x39\x20\
+\x63\x20\x2d\x32\x2e\x37\x33\x2c\x2d\x33\x2e\x37\x32\x20\x2d\x35\
+\x2e\x37\x35\x2c\x2d\x38\x2e\x36\x20\x2d\x39\x2e\x30\x36\x2c\x2d\
+\x31\x34\x2e\x37\x39\x20\x2d\x31\x2e\x38\x39\x2c\x2d\x33\x2e\x32\
+\x37\x20\x2d\x32\x2e\x30\x38\x2c\x2d\x34\x2e\x37\x39\x20\x31\x2e\
+\x30\x37\x2c\x2d\x36\x2e\x31\x33\x20\x6c\x20\x35\x36\x2e\x38\x33\
+\x2c\x2d\x32\x33\x2e\x35\x30\x39\x39\x39\x38\x20\x63\x20\x31\x2e\
+\x36\x2c\x2d\x30\x2e\x37\x20\x33\x2e\x37\x2c\x2d\x30\x2e\x37\x31\
+\x20\x35\x2e\x30\x36\x2c\x31\x2e\x37\x35\x20\x37\x2e\x36\x34\x2c\
+\x31\x31\x2e\x32\x39\x20\x31\x33\x2e\x32\x2c\x31\x39\x2e\x32\x33\
+\x20\x32\x31\x2e\x30\x39\x39\x39\x39\x38\x2c\x32\x37\x2e\x37\x39\
+\x39\x39\x39\x38\x20\x31\x32\x2e\x31\x35\x2c\x31\x32\x2e\x35\x38\
+\x20\x32\x35\x2e\x35\x33\x2c\x32\x36\x2e\x32\x32\x20\x34\x38\x2e\
+\x37\x33\x2c\x33\x36\x2e\x31\x32\x20\x37\x2e\x33\x32\x2c\x32\x2e\
+\x37\x20\x31\x34\x2e\x34\x38\x2c\x34\x2e\x39\x33\x20\x32\x32\x2e\
+\x39\x32\x2c\x36\x2e\x33\x36\x20\x30\x2e\x33\x32\x2c\x30\x2e\x30\
+\x35\x20\x31\x2e\x38\x38\x2c\x30\x2e\x38\x20\x31\x2e\x37\x37\x2c\
+\x32\x2e\x31\x34\x20\x6c\x20\x2d\x30\x2e\x32\x33\x2c\x31\x33\x2e\
+\x32\x36\x20\x2d\x33\x39\x2e\x34\x31\x2c\x32\x32\x2e\x36\x33\x30\
+\x30\x31\x20\x63\x20\x2d\x32\x2c\x31\x2e\x37\x36\x20\x2d\x33\x2e\
+\x39\x31\x2c\x33\x2e\x32\x38\x20\x2d\x38\x2e\x34\x2c\x31\x2e\x38\
+\x34\x20\x6c\x20\x2d\x31\x31\x37\x2e\x31\x39\x39\x39\x39\x39\x2c\
+\x2d\x32\x34\x2e\x33\x39\x30\x30\x31\x20\x2d\x30\x2e\x30\x32\x2c\
+\x2d\x37\x2e\x38\x36\x20\x2d\x39\x2e\x32\x38\x39\x39\x39\x39\x36\
+\x2c\x2d\x32\x2e\x34\x20\x63\x20\x2d\x30\x2e\x37\x32\x30\x30\x30\
+\x30\x30\x32\x2c\x2d\x30\x2e\x31\x38\x20\x2d\x30\x2e\x37\x33\x30\
+\x30\x30\x30\x30\x32\x2c\x2d\x31\x2e\x31\x33\x20\x2d\x30\x2e\x31\
+\x34\x30\x30\x30\x30\x30\x32\x2c\x2d\x31\x2e\x35\x33\x20\x6c\x20\
+\x39\x2e\x37\x35\x30\x30\x30\x30\x36\x32\x2c\x2d\x37\x2e\x39\x34\
+\x20\x63\x20\x2d\x30\x2e\x30\x34\x2c\x2d\x31\x2e\x35\x33\x20\x30\
+\x2e\x34\x2c\x2d\x32\x2e\x35\x20\x31\x2e\x31\x36\x2c\x2d\x33\x2e\
+\x34\x36\x20\x2d\x34\x2e\x32\x38\x30\x30\x30\x30\x36\x2c\x2d\x31\
+\x2e\x35\x20\x2d\x35\x2e\x39\x37\x30\x30\x30\x30\x36\x2c\x2d\x33\
+\x2e\x33\x39\x20\x2d\x33\x2e\x32\x32\x30\x30\x30\x30\x36\x2c\x2d\
+\x35\x2e\x39\x37\x20\x6c\x20\x31\x37\x2e\x32\x31\x30\x30\x30\x30\
+\x36\x2c\x2d\x31\x32\x2e\x37\x35\x20\x7a\x22\x0a\x20\x20\x20\x69\
+\x64\x3d\x22\x70\x61\x74\x68\x33\x39\x38\x33\x22\x0a\x20\x20\x20\
+\x69\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6e\x6e\x65\x63\x74\
+\x6f\x72\x2d\x63\x75\x72\x76\x61\x74\x75\x72\x65\x3d\x22\x30\x22\
+\x0a\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\x6c\x6c\x3a\
+\x23\x66\x66\x36\x36\x30\x30\x22\x20\x2f\x3e\x0a\x09\x0a\x09\x3c\
+\x70\x61\x74\x68\x0a\x20\x20\x20\x63\x6c\x61\x73\x73\x3d\x22\x73\
+\x74\x33\x22\x0a\x20\x20\x20\x64\x3d\x22\x6d\x20\x31\x37\x32\x2e\
+\x34\x35\x33\x36\x36\x2c\x31\x35\x31\x2e\x34\x35\x35\x39\x39\x20\
+\x2d\x34\x32\x2e\x39\x32\x2c\x32\x34\x2e\x32\x35\x20\x63\x20\x2d\
+\x31\x39\x2e\x37\x36\x2c\x2d\x34\x2e\x30\x36\x20\x2d\x33\x36\x2e\
+\x35\x30\x39\x39\x39\x38\x2c\x2d\x31\x30\x2e\x30\x36\x20\x2d\x35\
+\x30\x2e\x35\x36\x39\x39\x39\x38\x2c\x2d\x31\x37\x2e\x30\x38\x20\
+\x33\x2e\x36\x37\x2c\x30\x2e\x38\x36\x20\x37\x2e\x36\x33\x2c\x31\
+\x2e\x33\x33\x20\x31\x31\x2e\x37\x36\x2c\x31\x2e\x33\x33\x20\x31\
+\x38\x2e\x39\x36\x39\x39\x39\x38\x2c\x30\x20\x33\x34\x2e\x33\x34\
+\x39\x39\x39\x38\x2c\x2d\x39\x2e\x39\x34\x20\x33\x34\x2e\x33\x34\
+\x39\x39\x39\x38\x2c\x2d\x32\x32\x2e\x31\x39\x20\x30\x2c\x2d\x32\
+\x2e\x38\x36\x20\x2d\x30\x2e\x38\x34\x2c\x2d\x35\x2e\x36\x20\x2d\
+\x32\x2e\x33\x37\x2c\x2d\x38\x2e\x31\x31\x20\x31\x34\x2e\x37\x37\
+\x2c\x31\x31\x2e\x32\x32\x20\x33\x31\x2e\x37\x33\x2c\x31\x39\x2e\
+\x37\x36\x20\x34\x39\x2e\x37\x35\x2c\x32\x31\x2e\x38\x20\x7a\x20\
+\x6d\x20\x2d\x38\x32\x2e\x30\x34\x39\x39\x39\x38\x2c\x2d\x33\x34\
+\x2e\x33\x33\x20\x63\x20\x31\x37\x2e\x34\x31\x39\x39\x39\x38\x2c\
+\x30\x20\x33\x31\x2e\x35\x33\x39\x39\x39\x38\x2c\x38\x2e\x39\x39\
+\x20\x33\x31\x2e\x35\x33\x39\x39\x39\x38\x2c\x32\x30\x2e\x30\x39\
+\x20\x30\x2c\x31\x31\x2e\x31\x20\x2d\x31\x34\x2e\x31\x32\x2c\x32\
+\x30\x2e\x30\x39\x20\x2d\x33\x31\x2e\x35\x33\x39\x39\x39\x38\x2c\
+\x32\x30\x2e\x30\x39\x20\x2d\x31\x37\x2e\x34\x32\x2c\x30\x20\x2d\
+\x33\x31\x2e\x35\x34\x2c\x2d\x38\x2e\x39\x39\x20\x2d\x33\x31\x2e\
+\x35\x34\x2c\x2d\x32\x30\x2e\x30\x39\x20\x30\x2c\x2d\x31\x31\x2e\
+\x31\x20\x31\x34\x2e\x31\x32\x2c\x2d\x32\x30\x2e\x30\x39\x20\x33\
+\x31\x2e\x35\x34\x2c\x2d\x32\x30\x2e\x30\x39\x20\x7a\x20\x6d\x20\
+\x32\x30\x2e\x36\x31\x39\x39\x39\x38\x2c\x32\x2e\x37\x35\x20\x63\
+\x20\x2d\x35\x2e\x36\x39\x2c\x2d\x32\x2e\x37\x20\x2d\x31\x32\x2e\
+\x37\x30\x39\x39\x39\x38\x2c\x2d\x34\x2e\x32\x39\x20\x2d\x32\x30\
+\x2e\x33\x30\x39\x39\x39\x38\x2c\x2d\x34\x2e\x32\x39\x20\x2d\x31\
+\x38\x2e\x39\x37\x2c\x30\x20\x2d\x33\x34\x2e\x33\x35\x2c\x39\x2e\
+\x39\x34\x20\x2d\x33\x34\x2e\x33\x35\x2c\x32\x32\x2e\x31\x39\x20\
+\x30\x2c\x33\x2e\x34\x34\x20\x31\x2e\x32\x31\x2c\x36\x2e\x36\x39\
+\x20\x33\x2e\x33\x37\x2c\x39\x2e\x35\x39\x20\x2d\x32\x30\x2e\x36\
+\x37\x2c\x2d\x31\x34\x2e\x31\x36\x20\x2d\x33\x33\x2e\x30\x31\x2c\
+\x2d\x33\x30\x2e\x32\x20\x2d\x33\x38\x2e\x38\x33\x2c\x2d\x34\x32\
+\x2e\x37\x38\x20\x6c\x20\x35\x37\x2e\x32\x2c\x2d\x32\x34\x2e\x37\
+\x37\x39\x39\x39\x38\x20\x63\x20\x37\x2e\x33\x35\x2c\x31\x32\x2e\
+\x32\x32\x20\x31\x38\x2e\x37\x36\x2c\x32\x37\x2e\x30\x34\x39\x39\
+\x39\x38\x20\x33\x32\x2e\x39\x31\x39\x39\x39\x38\x2c\x34\x30\x2e\
+\x30\x36\x39\x39\x39\x38\x20\x7a\x20\x6d\x20\x2d\x32\x33\x2e\x36\
+\x32\x39\x39\x39\x38\x2c\x2d\x30\x2e\x35\x35\x20\x2d\x31\x2e\x34\
+\x35\x2c\x34\x2e\x34\x20\x2d\x34\x2e\x35\x33\x2c\x2d\x30\x2e\x33\
+\x32\x20\x2d\x31\x2e\x30\x33\x2c\x32\x2e\x37\x31\x20\x63\x20\x32\
+\x2e\x37\x35\x2c\x30\x2e\x32\x35\x20\x33\x2e\x39\x36\x2c\x2d\x30\
+\x2e\x30\x36\x20\x33\x2e\x33\x2c\x32\x2e\x30\x36\x20\x6c\x20\x2d\
+\x34\x2e\x32\x37\x2c\x31\x33\x2e\x38\x35\x20\x63\x20\x2d\x30\x2e\
+\x34\x36\x2c\x31\x2e\x34\x38\x20\x2d\x30\x2e\x38\x33\x2c\x31\x2e\
+\x32\x31\x20\x2d\x32\x2e\x37\x38\x2c\x30\x2e\x39\x33\x20\x6c\x20\
+\x2d\x32\x2e\x32\x38\x2c\x2d\x30\x2e\x33\x32\x20\x2d\x31\x2e\x32\
+\x39\x2c\x33\x2e\x38\x38\x20\x34\x2e\x37\x37\x2c\x30\x2e\x38\x20\
+\x2d\x31\x2e\x34\x31\x2c\x34\x2e\x39\x31\x20\x36\x2e\x32\x38\x2c\
+\x31\x2e\x30\x38\x20\x31\x2e\x34\x34\x2c\x2d\x35\x20\x35\x2e\x31\
+\x32\x2c\x30\x2e\x37\x20\x2d\x31\x2e\x32\x38\x2c\x35\x2e\x30\x38\
+\x20\x36\x2e\x31\x32\x2c\x30\x2e\x38\x20\x31\x2e\x32\x32\x2c\x2d\
+\x35\x2e\x31\x37\x20\x63\x20\x31\x2e\x37\x31\x2c\x30\x2e\x31\x32\
+\x20\x31\x2e\x36\x37\x2c\x30\x2e\x30\x32\x20\x32\x2e\x38\x36\x2c\
+\x2d\x30\x2e\x31\x34\x20\x32\x2e\x30\x36\x39\x39\x39\x38\x2c\x2d\
+\x30\x2e\x32\x36\x20\x33\x2e\x37\x38\x39\x39\x39\x38\x2c\x2d\x30\
+\x2e\x38\x35\x20\x35\x2e\x31\x34\x39\x39\x39\x38\x2c\x2d\x31\x2e\
+\x37\x35\x20\x31\x2e\x33\x35\x2c\x2d\x30\x2e\x39\x20\x32\x2e\x33\
+\x2c\x2d\x32\x2e\x34\x34\x20\x32\x2e\x36\x37\x2c\x2d\x33\x2e\x37\
+\x31\x20\x30\x2e\x33\x31\x2c\x2d\x31\x2e\x30\x36\x20\x30\x2e\x31\
+\x35\x2c\x2d\x32\x2e\x34\x39\x20\x2d\x30\x2e\x32\x39\x2c\x2d\x33\
+\x2e\x34\x35\x20\x2d\x30\x2e\x34\x34\x2c\x2d\x30\x2e\x39\x37\x20\
+\x2d\x31\x2e\x31\x38\x2c\x2d\x31\x2e\x37\x38\x20\x2d\x32\x2e\x32\
+\x32\x2c\x2d\x32\x2e\x34\x34\x20\x2d\x30\x2e\x37\x32\x2c\x2d\x30\
+\x2e\x34\x36\x20\x2d\x31\x2e\x38\x2c\x2d\x30\x2e\x39\x36\x20\x2d\
+\x33\x2e\x32\x35\x2c\x2d\x31\x2e\x34\x38\x20\x32\x2e\x35\x32\x2c\
+\x2d\x30\x2e\x32\x31\x20\x34\x2e\x30\x32\x2c\x2d\x30\x2e\x39\x36\
+\x20\x35\x2e\x36\x2c\x2d\x32\x2e\x34\x36\x20\x31\x2e\x36\x31\x2c\
+\x2d\x31\x2e\x35\x33\x20\x31\x2e\x39\x33\x2c\x2d\x33\x2e\x35\x34\
+\x20\x30\x2e\x38\x39\x2c\x2d\x35\x2e\x33\x31\x20\x2d\x31\x2e\x32\
+\x38\x2c\x2d\x32\x2e\x31\x36\x20\x2d\x33\x2e\x39\x31\x2c\x2d\x33\
+\x2e\x31\x37\x20\x2d\x36\x2e\x36\x35\x2c\x2d\x33\x2e\x37\x39\x20\
+\x6c\x20\x31\x2e\x30\x33\x2c\x2d\x34\x2e\x35\x39\x20\x2d\x34\x2e\
+\x30\x36\x39\x39\x39\x38\x2c\x2d\x30\x2e\x34\x20\x2d\x31\x2e\x33\
+\x31\x2c\x34\x2e\x35\x35\x20\x2d\x34\x2e\x37\x31\x2c\x2d\x30\x2e\
+\x34\x38\x20\x31\x2e\x32\x33\x2c\x2d\x34\x2e\x33\x39\x20\x7a\x20\
+\x6d\x20\x31\x2e\x30\x34\x2c\x31\x33\x2e\x39\x38\x20\x31\x2e\x38\
+\x31\x2c\x2d\x36\x2e\x32\x32\x20\x33\x2e\x36\x38\x2c\x30\x2e\x34\
+\x32\x20\x63\x20\x32\x2e\x31\x31\x2c\x30\x2e\x32\x34\x20\x33\x2e\
+\x35\x33\x2c\x30\x2e\x36\x34\x20\x34\x2e\x32\x38\x2c\x30\x2e\x39\
+\x35\x20\x33\x2e\x31\x39\x39\x39\x39\x38\x2c\x31\x2e\x33\x20\x32\
+\x2e\x31\x33\x39\x39\x39\x38\x2c\x35\x2e\x33\x31\x20\x2d\x31\x2e\
+\x39\x32\x2c\x35\x2e\x36\x39\x20\x2d\x30\x2e\x39\x36\x2c\x30\x2e\
+\x30\x39\x20\x2d\x32\x2e\x33\x39\x2c\x2d\x30\x2e\x30\x31\x20\x2d\
+\x34\x2e\x32\x36\x2c\x2d\x30\x2e\x32\x39\x20\x7a\x20\x6d\x20\x2d\
+\x31\x2c\x33\x2e\x34\x36\x20\x34\x2e\x32\x34\x2c\x30\x2e\x36\x35\
+\x20\x63\x20\x31\x2e\x38\x36\x2c\x30\x2e\x32\x38\x20\x33\x2e\x32\
+\x31\x2c\x30\x2e\x36\x32\x20\x34\x2e\x30\x34\x2c\x31\x2e\x30\x31\
+\x20\x30\x2e\x38\x33\x2c\x30\x2e\x33\x39\x20\x31\x2e\x34\x31\x2c\
+\x30\x2e\x38\x36\x20\x31\x2e\x37\x31\x2c\x31\x2e\x34\x32\x20\x30\
+\x2e\x33\x32\x2c\x30\x2e\x35\x36\x20\x30\x2e\x33\x37\x2c\x31\x2e\
+\x32\x20\x30\x2e\x31\x36\x2c\x31\x2e\x39\x31\x20\x2d\x30\x2e\x32\
+\x34\x2c\x30\x2e\x38\x33\x20\x2d\x30\x2e\x37\x36\x2c\x32\x2e\x33\
+\x37\x20\x2d\x31\x2e\x35\x38\x2c\x32\x2e\x38\x37\x20\x2d\x30\x2e\
+\x38\x31\x2c\x30\x2e\x35\x20\x2d\x31\x2e\x37\x2c\x30\x2e\x37\x37\
+\x20\x2d\x32\x2e\x36\x37\x2c\x30\x2e\x38\x32\x20\x2d\x30\x2e\x39\
+\x37\x2c\x30\x2e\x30\x35\x20\x2d\x32\x2e\x31\x35\x2c\x2d\x30\x2e\
+\x30\x37\x20\x2d\x33\x2e\x35\x33\x2c\x2d\x30\x2e\x32\x39\x20\x2d\
+\x30\x2e\x34\x35\x2c\x2d\x30\x2e\x30\x37\x20\x2d\x34\x2e\x35\x33\
+\x2c\x2d\x30\x2e\x36\x36\x20\x2d\x34\x2e\x35\x34\x2c\x2d\x30\x2e\
+\x37\x34\x20\x7a\x20\x6d\x20\x2d\x38\x2e\x39\x38\x2c\x32\x37\x2e\
+\x38\x38\x20\x63\x20\x36\x2e\x34\x39\x2c\x31\x2e\x33\x36\x20\x31\
+\x30\x2e\x33\x2c\x32\x2e\x31\x20\x31\x33\x2e\x38\x36\x2c\x32\x2e\
+\x35\x39\x20\x39\x2e\x38\x33\x39\x39\x39\x38\x2c\x33\x2e\x31\x36\
+\x20\x31\x38\x2e\x34\x33\x39\x39\x39\x38\x2c\x35\x2e\x37\x38\x20\
+\x32\x38\x2e\x32\x33\x39\x39\x39\x38\x2c\x38\x2e\x31\x36\x20\x2d\
+\x31\x33\x2e\x39\x37\x2c\x2d\x32\x2e\x30\x31\x20\x2d\x32\x37\x2e\
+\x37\x37\x39\x39\x39\x38\x2c\x2d\x36\x2e\x32\x34\x20\x2d\x34\x32\
+\x2e\x30\x39\x39\x39\x39\x38\x2c\x2d\x31\x30\x2e\x37\x35\x20\x7a\
+\x20\x6d\x20\x36\x35\x2e\x34\x31\x39\x39\x39\x38\x2c\x34\x2e\x34\
+\x33\x20\x33\x30\x2e\x31\x39\x2c\x2d\x31\x37\x2e\x35\x32\x20\x63\
+\x20\x30\x2e\x33\x39\x2c\x2d\x30\x2e\x33\x32\x20\x30\x2e\x33\x38\
+\x2c\x2d\x30\x2e\x35\x39\x20\x2d\x30\x2e\x33\x33\x2c\x2d\x30\x2e\
+\x37\x20\x2d\x31\x34\x2e\x35\x2c\x2d\x32\x2e\x34\x35\x20\x2d\x32\
+\x39\x2e\x32\x36\x2c\x2d\x37\x2e\x33\x36\x20\x2d\x34\x34\x2e\x36\
+\x36\x2c\x2d\x31\x37\x2e\x39\x33\x20\x2d\x35\x2e\x39\x2c\x2d\x34\
+\x2e\x31\x37\x20\x2d\x32\x30\x2e\x30\x33\x2c\x2d\x31\x36\x2e\x33\
+\x35\x20\x2d\x32\x36\x2e\x38\x35\x2c\x2d\x32\x33\x2e\x37\x34\x20\
+\x2d\x37\x2e\x39\x33\x39\x39\x39\x38\x2c\x2d\x38\x2e\x36\x31\x20\
+\x2d\x31\x34\x2e\x36\x36\x39\x39\x39\x38\x2c\x2d\x31\x38\x2e\x33\
+\x32\x39\x39\x39\x38\x20\x2d\x32\x32\x2e\x33\x33\x39\x39\x39\x38\
+\x2c\x2d\x32\x39\x2e\x31\x33\x39\x39\x39\x38\x20\x2d\x30\x2e\x35\
+\x31\x2c\x2d\x30\x2e\x38\x36\x20\x2d\x30\x2e\x38\x38\x2c\x2d\x31\
+\x2e\x34\x20\x2d\x31\x2e\x33\x33\x2c\x2d\x31\x2e\x36\x31\x20\x2d\
+\x30\x2e\x34\x33\x2c\x2d\x30\x2e\x31\x39\x20\x2d\x30\x2e\x39\x39\
+\x2c\x2d\x30\x2e\x31\x20\x2d\x31\x2e\x38\x39\x2c\x30\x2e\x33\x20\
+\x6c\x20\x2d\x35\x35\x2e\x32\x35\x2c\x32\x32\x2e\x38\x33\x39\x39\
+\x39\x38\x20\x63\x20\x2d\x33\x2e\x34\x35\x2c\x31\x2e\x34\x36\x20\
+\x2d\x33\x2e\x33\x34\x2c\x32\x2e\x35\x32\x20\x2d\x31\x2e\x35\x34\
+\x2c\x35\x2e\x36\x34\x20\x38\x2e\x35\x35\x2c\x31\x38\x2e\x30\x31\
+\x20\x32\x33\x2e\x39\x35\x2c\x33\x33\x2e\x32\x39\x20\x33\x39\x2e\
+\x35\x37\x2c\x34\x33\x2e\x36\x37\x20\x32\x2e\x31\x38\x2c\x34\x2e\
+\x33\x36\x20\x35\x2e\x34\x38\x2c\x38\x2e\x36\x32\x20\x31\x33\x2e\
+\x31\x38\x2c\x31\x31\x2e\x38\x37\x20\x2d\x31\x37\x2e\x33\x31\x2c\
+\x2d\x36\x2e\x31\x39\x20\x2d\x33\x37\x2e\x37\x38\x2c\x2d\x31\x34\
+\x2e\x32\x39\x20\x2d\x36\x30\x2e\x38\x31\x2c\x2d\x32\x35\x2e\x31\
+\x32\x20\x6c\x20\x31\x32\x2e\x30\x33\x2c\x2d\x38\x2e\x38\x33\x20\
+\x2d\x31\x2e\x34\x38\x2c\x2d\x30\x2e\x39\x36\x20\x2d\x31\x31\x2e\
+\x39\x31\x2c\x38\x2e\x37\x38\x20\x63\x20\x2d\x31\x2e\x37\x34\x30\
+\x30\x30\x30\x36\x2c\x31\x2e\x37\x34\x20\x2d\x31\x2e\x31\x32\x30\
+\x30\x30\x30\x36\x2c\x32\x2e\x35\x31\x20\x30\x2e\x32\x2c\x33\x2e\
+\x31\x31\x20\x31\x33\x2e\x37\x31\x2c\x36\x2e\x38\x39\x20\x36\x38\
+\x2e\x32\x38\x2c\x32\x38\x2e\x38\x33\x20\x39\x34\x2e\x34\x31\x39\
+\x39\x39\x38\x2c\x33\x35\x2e\x35\x36\x20\x2d\x31\x38\x2e\x31\x34\
+\x39\x39\x39\x38\x2c\x2d\x33\x2e\x39\x36\x20\x2d\x37\x36\x2e\x31\
+\x35\x39\x39\x39\x38\x2c\x2d\x32\x33\x2e\x38\x31\x20\x2d\x39\x33\
+\x2e\x31\x39\x39\x39\x39\x38\x2c\x2d\x33\x31\x2e\x31\x36\x20\x2d\
+\x31\x2e\x30\x34\x2c\x31\x2e\x33\x33\x20\x2d\x30\x2e\x33\x37\x2c\
+\x32\x2e\x38\x34\x20\x31\x2e\x30\x35\x2c\x33\x2e\x34\x35\x20\x6c\
+\x20\x31\x2e\x33\x33\x2c\x30\x2e\x34\x32\x20\x63\x20\x35\x2e\x34\
+\x34\x2c\x31\x2e\x37\x31\x20\x34\x37\x2e\x39\x34\x2c\x31\x36\x2e\
+\x35\x33\x20\x35\x36\x2e\x32\x39\x2c\x31\x38\x2e\x34\x36\x20\x2d\
+\x39\x2e\x37\x31\x2c\x2d\x31\x2e\x34\x34\x20\x2d\x35\x34\x2e\x37\
+\x36\x2c\x2d\x31\x35\x2e\x32\x38\x20\x2d\x35\x39\x2e\x31\x38\x2c\
+\x2d\x31\x37\x2e\x30\x38\x20\x6c\x20\x30\x2e\x31\x36\x2c\x32\x2e\
+\x33\x35\x20\x36\x32\x2e\x31\x37\x2c\x31\x37\x2e\x36\x39\x20\x36\
+\x2e\x30\x31\x2c\x32\x2e\x32\x37\x20\x2d\x37\x30\x2e\x37\x36\x30\
+\x30\x30\x30\x36\x2c\x2d\x31\x37\x2e\x31\x38\x20\x63\x20\x2d\x33\
+\x2e\x30\x33\x2c\x2d\x30\x2e\x37\x38\x20\x2d\x35\x2c\x2d\x30\x2e\
+\x37\x34\x20\x2d\x32\x2e\x38\x35\x2c\x2d\x34\x2e\x30\x34\x20\x6c\
+\x20\x2d\x33\x2e\x37\x38\x2c\x32\x2e\x39\x38\x20\x63\x20\x2d\x30\
+\x2e\x33\x37\x2c\x30\x2e\x32\x34\x20\x2d\x30\x2e\x33\x36\x2c\x30\
+\x2e\x35\x39\x20\x30\x2e\x30\x39\x2c\x30\x2e\x36\x39\x20\x6c\x20\
+\x38\x31\x2e\x30\x37\x30\x30\x30\x30\x36\x2c\x32\x30\x2e\x30\x34\
+\x20\x33\x2e\x34\x31\x2c\x31\x2e\x35\x31\x20\x2d\x37\x35\x2e\x33\
+\x39\x2c\x2d\x31\x37\x2e\x35\x32\x20\x30\x2e\x30\x35\x2c\x31\x2e\
+\x36\x32\x20\x35\x38\x2e\x33\x38\x2c\x31\x33\x2e\x34\x31\x20\x36\
+\x2e\x30\x36\x2c\x32\x2e\x33\x35\x20\x2d\x36\x34\x2e\x34\x34\x2c\
+\x2d\x31\x33\x2e\x36\x38\x20\x2d\x30\x2e\x30\x33\x2c\x31\x2e\x37\
+\x38\x20\x31\x31\x36\x2e\x38\x30\x39\x39\x39\x38\x2c\x32\x34\x2e\
+\x31\x38\x30\x30\x31\x20\x63\x20\x31\x2e\x36\x35\x2c\x30\x2e\x33\
+\x35\x20\x33\x2e\x38\x39\x2c\x30\x2e\x33\x36\x20\x35\x2e\x34\x39\
+\x2c\x2d\x30\x2e\x39\x20\x6c\x20\x33\x39\x2e\x37\x2c\x2d\x32\x32\
+\x2e\x39\x39\x30\x30\x31\x20\x2d\x31\x32\x2e\x33\x35\x2c\x35\x2e\
+\x33\x20\x31\x32\x2e\x33\x37\x2c\x2d\x37\x2e\x32\x37\x20\x2d\x32\
+\x32\x2e\x32\x34\x2c\x39\x2e\x36\x38\x20\x32\x32\x2e\x31\x38\x2c\
+\x2d\x31\x31\x2e\x38\x35\x20\x2d\x31\x31\x2e\x35\x31\x2c\x34\x2e\
+\x35\x37\x20\x31\x31\x2e\x34\x35\x2c\x2d\x37\x2e\x30\x35\x20\x2d\
+\x31\x38\x2e\x38\x37\x2c\x38\x2e\x37\x32\x20\x31\x38\x2e\x39\x32\
+\x2c\x2d\x31\x31\x2e\x32\x37\x20\x7a\x22\x0a\x20\x20\x20\x69\x64\
+\x3d\x22\x70\x61\x74\x68\x34\x30\x30\x35\x22\x0a\x20\x20\x20\x69\
+\x6e\x6b\x73\x63\x61\x70\x65\x3a\x63\x6f\x6e\x6e\x65\x63\x74\x6f\
+\x72\x2d\x63\x75\x72\x76\x61\x74\x75\x72\x65\x3d\x22\x30\x22\x0a\
+\x20\x20\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\x6c\x6c\x3a\x23\
+\x66\x66\x66\x66\x66\x66\x22\x20\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\
+\x3c\x2f\x73\x76\x67\x3e\
+\x00\x00\x0e\xa9\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x50\x00\x00\x00\x50\x08\x06\x00\x00\x00\x8e\x11\xf2\xad\
+\x00\x00\x0e\x70\x49\x44\x41\x54\x78\x5e\xed\x9c\x7b\x94\x55\xd5\
+\x7d\xc7\xbf\xfb\xdc\xf7\x9d\xfb\x9c\x7b\x67\x80\x99\x21\xa0\x58\
+\x90\xc1\xa9\xe0\xab\xb6\x5a\xab\x50\x04\x91\x60\x45\x91\x08\x31\
+\x1a\x22\x2f\xad\x68\x4b\xd4\x96\x54\x4a\xda\xb4\x11\x92\xd8\x0a\
+\x44\x50\x4c\x96\x94\xba\x02\x81\x95\x10\x21\x08\x0a\x04\x68\xc2\
+\xb2\xe0\x88\x08\x06\x1f\xb1\x5a\x66\x80\x61\xb8\xef\xf7\xb9\xe7\
+\xde\xf3\xeb\x3a\x67\x1e\x30\xcc\x9d\x3b\xe7\x9c\x7b\xef\x99\x59\
+\x5d\xde\xb5\xe6\x9f\x39\xfb\xf1\xfb\x7d\xce\x6f\xef\xfd\xdb\xbf\
+\xfd\x3b\x9b\x61\x10\xfe\x62\x33\xa6\x52\xee\xf8\x29\xc0\x24\xca\
+\xd2\x31\x66\x03\x73\xbb\xc0\x6a\xfc\x60\x0d\xf5\x30\x5c\x31\x12\
+\x86\xb1\xa3\x61\x6c\x6a\x82\xf1\xaa\x46\x36\x90\x2a\xe8\xde\x39\
+\xbf\xe7\x57\x94\xfd\xe5\xaf\x61\x7d\x62\x21\x4c\xe3\xae\xef\xd5\
+\x3f\xbf\x77\x17\xc5\xfe\x72\x06\x38\x5f\x9d\x84\xae\x93\x0d\x01\
+\x79\x11\xa0\x3c\x90\xcb\x03\xf9\x1c\x48\xc8\x01\x22\x0f\xa2\x2c\
+\x8c\x8d\xd7\xc0\x34\xfb\x1e\x58\x66\xdd\x0b\x53\x63\xef\x36\x2b\
+\x09\x58\x17\x80\xd9\x43\x6f\x51\xe6\xdf\xd7\x82\xff\xc5\x0e\x30\
+\xce\x06\x18\xcd\xa0\x6c\x04\x35\x17\x09\x75\xeb\xc8\xbf\xf5\x0b\
+\x8a\x4f\x7d\x08\x9c\xdf\xaf\x48\x6f\x12\x09\x10\x04\x50\x26\x0d\
+\xf0\x29\x30\x8b\x01\x96\x25\xf3\x61\x5b\xba\x04\x86\xa1\x57\x55\
+\x5c\xbf\x8a\x76\x90\x5a\xb3\x92\xd2\x7f\xf7\x2f\xa0\x14\x0f\x66\
+\x77\x03\x36\x2b\x18\xd7\xd1\xa5\x18\xb8\x00\xc7\x8e\xff\x84\xf5\
+\xee\x99\x3d\x64\xc8\x6c\xdd\x4a\x89\xaf\x3d\x02\xce\xa7\x0c\xe0\
+\xe5\x94\x29\x27\x02\xa9\x24\xc4\x4c\x14\xc6\xf1\x8d\xb0\xff\xe8\
+\xfb\xb0\x4c\x9a\x5e\x31\x3d\x2b\xd2\x70\xf2\x5f\xff\x91\xd2\xcb\
+\xbe\x07\x18\x1d\x60\x2e\x27\x98\xd1\xd0\xcb\x9a\x28\x99\x81\xe9\
+\xce\xeb\xe0\xfa\xe5\x9b\x3d\x01\x6e\xd9\x42\x89\x39\xf3\x34\x03\
+\xbc\xb4\x23\xe2\xb3\xa0\x58\x08\xcc\xe7\x45\xd5\xba\xb5\xb0\xce\
+\xba\xbf\xec\xfa\x96\xb5\xc1\xcc\x96\xd7\x28\x31\x67\x01\x20\x4f\
+\xfa\x6e\x30\x43\xdf\xcd\x4b\x43\x4f\x0c\xb4\xa0\x06\x74\x19\xc0\
+\xad\x94\x98\xa3\xdd\x02\x0b\x8d\x7b\xca\x0a\xa0\x68\x10\x5c\xcd\
+\x50\x38\xf7\xed\x82\xa9\x69\x5c\xd9\xf4\x2e\x4b\x43\x62\x32\x40\
+\xd1\x9b\xff\x1c\xf9\x93\xff\x03\xe6\xad\x05\x33\x72\x8a\xe6\x2f\
+\x69\x18\x3b\x77\x6f\x86\xe5\xce\x19\xdd\x72\xf0\xbb\xb7\x51\x7c\
+\xda\xc3\x8a\xe7\x40\x45\x1d\x75\x2d\x45\xbc\x00\x31\x7a\x0e\x96\
+\x47\x17\xc1\xf5\xea\xba\xb2\xe8\x5e\x72\x23\xe9\x9f\xae\xa6\xc4\
+\xbc\x27\xc1\xb9\x86\x80\x59\x2d\x6a\xf4\x01\x25\x92\x30\xcd\x9a\
+\x02\xd7\xc6\xd7\x2f\x02\x7c\x7b\x27\xc5\xa7\xcc\xae\x08\xc0\x2e\
+\xe1\xc4\x48\x04\x20\xc0\xf3\xd1\x31\x18\x47\x5d\x59\x12\x83\x92\
+\x2a\x47\xa7\xde\x41\xc2\xee\xc3\x60\xfe\x21\xdd\x8b\x83\x1a\x82\
+\x94\x17\x41\xd1\xf3\xf0\xe7\xb2\xdd\x72\x64\x0f\xec\xa3\xd8\xc4\
+\xaf\x82\xf3\xd7\xa8\x69\x4a\x75\x59\x69\x58\x8b\x91\x73\xa8\xda\
+\xf0\x13\xd8\xe7\xcf\xd3\xcc\x41\x73\xc5\xa0\xdf\x4f\x88\x8b\x60\
+\x6e\xa7\x6a\xe1\x2f\xad\x20\xb6\xb7\xc1\xfd\xc9\x3b\x30\x8d\x9e\
+\x20\xcb\x22\x34\x1f\xa6\xe8\x0d\x93\xc0\xd5\xd4\x96\xd4\xae\x92\
+\xca\xd2\x3c\x4c\x81\x73\x30\x4d\xb9\x0b\xee\x3d\x6f\x68\x62\xa1\
+\xba\x52\x3e\xf8\xbf\x14\xf6\x5f\x09\xe6\xac\x05\xb3\x9a\x95\xc8\
+\x59\xb4\x8c\x18\x89\xc2\xb6\xe2\x29\x54\x2d\x5b\xd1\x01\xf0\xf7\
+\xef\x53\x74\xdc\x9f\xc8\x13\xbe\x5e\x3f\x31\x1a\x01\xe7\xad\x46\
+\x75\xdb\xe7\xaa\x79\xa8\xaa\x20\x9c\xfa\x3d\x45\xc6\x8e\x03\xe7\
+\xa9\x07\x33\xf7\x76\x4d\xb4\x28\x2c\xb9\x1a\xdc\x48\x3f\xbc\xc7\
+\x4f\xc8\xb2\xe4\x4e\x7f\x46\x91\x11\x63\xc1\xd5\x0c\xd3\xd2\x9c\
+\xe6\x3a\xd2\x7c\xcc\x7c\x4e\x54\xb7\xa8\x83\xa8\x18\xa0\x70\xe2\
+\x24\x45\x9a\x9a\xc0\xf9\x1a\xc0\x0c\xca\x56\x59\x25\xda\x90\x28\
+\x39\xd5\xa7\xbb\xdd\x99\x7c\xbc\x9d\xc2\xce\x7a\x70\xb5\xd2\x56\
+\x4e\xdf\x1f\xc5\x93\x60\xf5\x6e\x54\xff\xe1\x33\xc5\x5c\x14\x15\
+\xcc\x87\xc2\x14\xaa\xf6\x81\xf3\xd5\x97\x15\x5e\xf7\xaa\x18\x08\
+\xc0\xb9\xfb\x67\xdd\xee\xcc\x05\x18\xc8\x50\xdb\xa0\x2f\xbd\x2e\
+\x57\x27\x1a\x87\xa1\x69\x04\x3c\xef\x1e\x53\xc4\x46\x51\xa1\xa0\
+\xcd\x47\x30\x9b\xc1\x2c\xa5\xcf\x79\x05\x1d\xdd\x58\x02\xe6\xf9\
+\x0f\xc0\xb9\xa6\xc3\x37\x1b\x48\x80\x52\xff\x62\x30\x0c\xf3\xd7\
+\xef\x84\x6b\xe3\xb6\x7e\xf9\xf4\x5b\x20\x34\xe2\x6a\xa2\x40\x08\
+\xac\xca\x56\x31\x8b\xa0\x6c\x1e\xcc\x9e\x43\xf5\xd9\x36\x59\x9e\
+\x00\xe3\x88\x49\x53\x45\xe7\xbe\xb9\x62\x1d\x17\x69\x38\xdf\x7e\
+\x16\x8e\xd7\xfe\x0d\xb6\x47\xfe\xba\x28\xa3\xa2\x0f\x63\xf7\x3d\
+\x48\xd9\x37\x76\x81\xf3\x7a\x2a\xae\x43\xbe\xbd\x15\x35\xc8\xcb\
+\xf2\xc8\x2e\x92\x68\x53\xbc\xa3\x29\x26\x9c\x34\xc7\x32\x0d\x53\
+\x76\xc7\x56\xf3\x34\xaa\xcf\x7e\x0e\x43\xdd\x15\x7d\x72\xea\xf3\
+\x01\xbf\xff\x00\xc5\x26\x4e\x84\xa1\x76\x78\xc5\xe1\x75\x0c\x9b\
+\x00\x1c\xdb\x5e\x83\xf5\xde\x59\x2c\x34\xae\x91\xa8\x35\x02\x66\
+\x31\x95\xd4\xb7\x0c\xcf\x48\xa0\x1c\xd3\x06\x31\x2b\x00\x7c\x12\
+\xbe\x74\x54\x3d\xc0\x80\xd9\x4d\xcc\x51\x38\x92\x52\x92\x56\x7d\
+\x54\xa6\x78\x02\xe6\x6f\xce\x84\xf3\xa5\x0d\x2c\x7a\xc7\xed\x94\
+\x6b\xfe\x48\xf5\xd6\xb0\xe0\xfc\xaa\xd1\x02\xbb\x17\xb8\x50\x04\
+\xd6\xa5\x0f\xc3\xb1\x72\x75\x41\x88\x05\xff\x99\x5c\xb9\x8a\xd2\
+\xcb\xfe\x09\x9c\xcf\x57\x09\x56\x05\xdb\x94\xe7\x41\x47\x0e\xd5\
+\xad\x6d\x2c\x36\xfb\x01\x12\x76\x1e\xa8\xe8\xbc\xab\x54\xb1\xae\
+\xa8\x51\x75\xa8\x05\x86\xea\x86\x5e\xbc\x0a\x02\xbc\x00\x8e\x3a\
+\xfc\xbd\x7e\xd7\x18\xa5\x72\x28\x2a\x97\x6f\x97\xc2\x5b\x22\x4b\
+\x3c\xfd\x37\xc4\xaf\xd9\x28\xc7\x12\x07\xc3\x4f\x0a\x08\x1b\x1a\
+\x87\xc1\x73\xa4\xb7\x6b\xd3\x8b\x50\x7c\xc9\x02\xca\xbe\xbc\xad\
+\xe4\x3d\xae\x16\xc5\xc5\x40\x00\xae\xc3\x6f\x42\x38\xda\x8c\xf4\
+\xd2\x15\xe0\x3c\x95\x5f\xbc\x94\xca\x99\x6f\x3f\x03\xf7\xd1\xbd\
+\x30\xdf\x78\x7b\x0f\x66\xbd\x00\x5e\x00\x23\xce\x3f\x7c\x40\x5c\
+\x08\x8a\xc5\x61\x59\xf6\x04\x8c\x13\xc6\x23\xf1\x57\x0f\x83\xf3\
+\x79\x95\xea\x57\xf1\x72\xf2\x96\xb3\xce\x09\xef\xa9\x4f\xfa\x06\
+\x18\x7f\xfa\x09\xca\xae\x7e\x7d\x40\xac\x4f\x22\x20\x09\x69\x68\
+\x1c\x8e\xaa\x57\xd6\x23\x7a\xed\xad\x15\x0f\x69\xa9\xa5\x2e\xf9\
+\x86\x9e\xe3\x07\x61\xba\xf6\xcf\xba\x21\xf6\xa0\x19\x40\xa7\x03\
+\xab\xf3\xdc\xd7\xa5\x88\x1c\x5e\x0a\x9e\x87\xf7\xdc\x71\x84\xeb\
+\xae\x1b\x74\x00\x29\x95\x81\xf1\xd6\x26\xb8\x77\xef\xed\x0d\x30\
+\xbd\xe9\x55\x4a\x3e\xf2\x94\xae\x2b\x6f\x21\x0b\x90\xb6\x51\xce\
+\xdf\xbc\x8e\xf8\x1d\x73\x07\xd5\x10\x96\x47\x88\x48\xc8\x07\x4e\
+\xa3\xf6\x92\xe3\xd8\x6e\x92\xe1\xf1\xe3\x48\xfc\x3c\x54\xb1\xfd\
+\xae\xd2\xe1\x22\x46\xe3\xa8\x5a\xf7\x1c\x92\x0b\xbf\x0b\xce\xeb\
+\x56\x5a\xad\x62\xe5\xe4\x73\xe7\x6c\x16\x94\x4e\x83\x84\x38\x4c\
+\x37\x8c\x85\xe7\xdd\x0f\x7b\x5b\xa0\xe4\xba\xe8\xb5\xeb\x28\xba\
+\xf5\x4a\x66\x60\xfe\xe6\xbd\x10\xb6\xbe\x01\xca\x19\x75\x77\xa5\
+\x3a\x2c\x0d\x40\x86\x07\xa5\x13\xa0\x7c\x12\xe6\x89\xb7\xc2\x74\
+\xff\x7d\x30\xcf\xb8\x0b\xc6\x86\x31\xbd\x17\x91\xd4\x2b\x6b\x29\
+\xf5\xd8\x77\xc0\x55\x0f\xbc\xdb\x20\x1d\x8c\x33\x9f\x0d\x86\x91\
+\xf5\xc8\x1d\xf9\x54\xce\x34\xd0\xeb\x27\x9f\xd1\xc4\xe3\xa0\x6c\
+\x14\xa6\xdb\x6f\x81\xf5\xc9\xc7\x60\xbd\x77\x4e\xff\xc1\x84\xe8\
+\x9d\x93\x28\x77\xf8\x24\x98\xdd\xaa\x97\xac\x45\xfb\x21\x3e\x0f\
+\x43\xa3\x1b\xf9\x53\x31\x30\xb3\x86\x48\x80\x4a\x2d\xa4\x97\x46\
+\xd1\x30\x00\x1e\xd6\xe7\x96\xc2\xb1\xe2\x79\xc5\x3b\x88\x8e\xf0\
+\x91\xb4\xfa\xfa\x07\x36\x7c\x74\xa9\xce\xf2\x10\xea\x0c\xa3\x68\
+\x89\xa4\x28\xe5\x27\x5b\x5c\x24\x0c\x66\x12\x61\x5f\xb3\x0a\xb6\
+\xf9\xc5\x43\x57\x85\xda\x65\xb9\x96\x4f\x29\xf2\x95\x6b\x74\x3d\
+\xc4\x51\xa2\xa0\xd6\x30\x94\xb2\xb6\x09\x88\x27\xe4\xa1\x6a\xff\
+\xf1\x4a\xd8\x1f\xfb\xb6\x62\x8b\xbb\xbc\x7d\x96\xf9\xd5\x16\x4a\
+\xcc\x9c\x3f\xe8\x5c\x06\x25\x20\xb4\x94\x91\x82\x16\x62\xe4\x0c\
+\x2c\x8f\xce\x81\xeb\xd5\x8b\x07\xfa\x5a\xda\x92\xea\xb0\xc4\x8a\
+\xe5\xc4\x3f\xbf\x76\xd0\x6c\xdc\xb5\x2a\xa2\xa4\x9e\x18\x8e\x80\
+\xb9\x8c\x70\x1f\xfd\x0d\x8c\x57\xfe\xb1\x66\xab\xbb\xb4\x2f\x16\
+\x7b\x70\x36\x09\x3b\x0e\x82\xd9\xd5\xa5\x65\x28\x11\x78\xb0\x94\
+\xa1\x3c\x41\x0c\x9e\x81\x75\xf1\x5c\x38\xd7\xfd\x47\x59\xc0\x75\
+\xe9\xc6\x22\x37\xdd\x44\xf9\x4f\xce\x96\xed\x9c\x77\xb0\x40\xeb\
+\xde\x1e\x76\x26\x14\xb9\x0e\xed\x80\xe5\xb6\xf2\xe7\x09\xb2\x50\
+\xc3\x10\xa2\xb4\x45\x76\x58\xe5\xe4\xc4\x9c\x00\x08\x39\x90\x28\
+\xa5\xd0\x12\x40\xd2\x5f\x67\xb6\x2d\x63\x00\x27\x85\xc7\x8d\x80\
+\xc9\x08\x18\x4d\x65\x39\xb7\xa8\x14\x74\x4a\xa4\x01\x13\x0f\x5f\
+\xb4\xef\x90\x7c\xa9\x7d\xb3\xe8\xd4\x89\x94\xdd\x7d\x50\x6e\x87\
+\xf3\x38\x60\xbc\x6e\x02\xd8\x55\xa3\xc0\x0d\xab\x03\x57\xe3\x05\
+\xb3\x3a\x00\x07\x03\x12\x24\x7b\xe6\x62\x20\x04\xf1\xcc\x19\xd0\
+\x1f\x3e\x43\xee\xbd\xf7\x21\xc6\x92\x60\x9c\x19\x30\x5a\xc0\x6c\
+\x36\xc0\x64\x1a\x90\x50\xd8\xe5\x20\x28\x1a\x07\x77\x85\x1f\xde\
+\x8f\x7a\x86\x9f\x4a\x05\xd6\x6b\x15\x96\xfe\x21\x1c\x3b\x42\xa6\
+\x09\x37\x69\x9e\x1b\xb2\x47\x0e\x91\xf0\xf6\x01\x08\xdb\xb7\x43\
+\x38\x7a\x0c\xcc\x50\x05\x56\xe5\x00\xcc\x16\x4d\x87\x39\xa5\x2a\
+\x29\xe5\xdb\x18\x9b\x46\xc1\xd3\xdc\xac\x59\x27\xa5\x32\x54\xa4\
+\x83\xcc\xe6\x8d\x94\x59\xb3\x16\xc2\xef\x9a\xc1\x59\xbd\x80\xa3\
+\x4a\x37\xab\x94\x2c\xcf\x70\xcd\x48\x78\x9a\xdf\xab\x88\x6e\x05\
+\x2d\x50\x29\x6d\xb5\xe5\xf2\xf1\x36\x4a\x3d\xfb\x1d\xf0\x2f\xfd\
+\x14\x9c\xbd\x06\x70\x54\xee\x70\x5e\x96\x2d\x99\x06\x1b\xee\x86\
+\xf7\xa3\x4f\x75\x81\x27\xfb\x81\x6a\xa1\x68\x2d\x7f\x7a\xfa\x54\
+\x72\xec\x7c\x1b\xa8\xae\x03\x14\xa6\x00\xab\xea\x8b\x17\x90\x16\
+\x12\xa8\x4f\xc5\x74\xd3\x49\x57\x80\x52\x67\xc1\x77\x0e\x11\x7f\
+\xcb\x64\xd8\xac\x6e\x50\x39\x53\x45\xf2\x04\x21\xd8\x02\x5b\xec\
+\x02\x5c\x2e\xff\xc0\x01\x14\xde\x3b\x4c\xa6\xeb\x2e\xc6\xfb\x55\
+\x59\x80\x8a\xc2\x2d\x13\xc6\x93\xe3\xc4\xe7\xa0\x72\x84\xcf\xa4\
+\xc0\x43\xa0\x05\xd9\x7d\x3b\x31\x74\xd2\x34\x5d\xe1\x75\x5b\x60\
+\x66\xe7\x56\x4a\x7e\x7d\x3e\xa4\xe4\x6b\xeb\xc2\x87\xe0\x7c\x79\
+\x53\xc5\x05\x69\x99\x39\x83\xec\xdb\xf7\x81\x29\xfc\x22\xa9\xaf\
+\xf7\xc3\x42\x11\x24\x16\x3c\x80\xe1\x2f\x6d\xa8\xb8\xcc\x85\x64\
+\x60\xd1\x29\x93\x29\xbb\xe7\x00\x38\xcf\x10\x20\x97\x83\xf1\xa6\
+\x31\x70\xef\x3f\xa8\x8b\x30\xb1\xb9\xf7\x51\x76\xf3\xdb\xda\x03\
+\x19\xbc\x80\x94\x15\x68\x38\x7f\x56\x17\x79\x0b\x02\x4c\xae\xfc\
+\x1e\x65\x96\xbf\x20\x1f\x65\x52\x86\x87\xf1\xc6\x31\x70\xef\xd3\
+\x07\xa0\x24\x50\xe4\xe6\xeb\x29\xff\x41\x0b\x98\xda\x15\x5a\x3e\
+\xe0\x69\x81\xf9\xec\x17\x70\xd7\x8d\x18\x38\x80\xfc\x9b\x3b\x28\
+\x3e\xfd\x41\xf9\x34\x8e\x78\x01\xdc\x57\xbc\xf0\x9e\xb8\x78\x68\
+\xa2\x62\x6a\xd3\x5c\x34\x60\xb2\x90\x9c\xb4\xae\x62\x75\x66\xe1\
+\x08\x92\x4f\x7d\x0b\x0d\x3f\x78\x61\xc0\xe0\xc9\x73\x60\x3e\x7c\
+\x86\xc2\xde\x91\x72\x4e\xb2\x14\xb5\x40\xea\x3c\x7c\x69\x5e\x57\
+\xa1\xb2\x47\xf7\x53\xf4\xc6\xc9\x50\x9c\xd6\x9b\xcb\x23\x9d\x8a\
+\xa1\x3e\xa3\xaf\xcb\x52\x70\x08\x4b\xff\x0c\x18\xcc\xc4\x3c\x43\
+\xe4\xfc\xe7\x4b\x13\x1d\x35\x9b\x94\x86\x8a\xd1\x29\x13\x29\xf7\
+\xdb\x0f\xc1\xaa\x14\x9c\xcb\xb4\xb7\x41\xdc\xfd\x73\xf8\xa7\xde\
+\xa3\xeb\x8b\xee\x13\x60\x6c\xf6\x4c\x12\x76\xfe\x56\x4e\x27\x13\
+\x2f\xb4\xc1\x7d\xea\xbf\x61\xba\x7a\xbc\xae\xc2\x89\xf1\x36\x0a\
+\x3a\x87\xa1\xdf\xbc\x1c\x3e\x8b\x54\x9d\x07\x0d\xa7\x4e\xe9\x2a\
+\x5f\x9f\x5e\x80\xf4\x20\xb3\xed\x75\x4a\xcc\x5e\x28\xcf\x83\x62\
+\x28\x8c\xaa\x57\x56\xc1\x36\x6f\x91\xee\x02\xc6\xee\xb9\x8b\x84\
+\xbd\xcd\xc5\xf3\x02\xdb\x5b\x41\xc7\xdf\x81\xef\xda\x1b\x75\x97\
+\xaf\x4f\x0b\x94\x1e\x74\x65\x65\x21\x9d\x81\x69\xfa\x6d\x70\x6d\
+\xe9\x3f\x43\x5d\xc3\x48\x2d\x5a\x45\x38\x7e\x98\xa2\xe3\xef\xe8\
+\xfb\x80\x2b\xc3\x83\x1f\x3d\x1c\xc3\xde\x3d\x3a\x28\xe0\xf5\xd8\
+\xca\x45\xa7\x4d\xa2\xdc\xa1\x93\x80\xc5\xdc\xeb\x03\xc0\x72\x83\
+\x2a\xd6\x5e\xb0\xca\x41\xb0\x78\x0b\xaf\xc8\xed\x67\x91\x6f\x3e\
+\x84\x9a\xeb\xff\x74\xf0\x01\xe4\xf7\xee\xa4\xf8\xe4\x59\xf2\x47\
+\x7e\xf2\x3c\xf8\xc1\x7f\xc1\xd4\xa4\x3d\x46\xa8\x15\x7a\x7c\xc9\
+\x22\xca\x6e\xd8\x0a\xe6\x74\xf4\x6c\x42\x9a\xfb\x6a\x9d\x68\xf8\
+\xb4\xb2\x01\x52\xb5\x72\xf7\x78\x93\x01\xab\x9d\x98\xdd\x07\xa4\
+\x52\x30\x2f\x9c\x05\xe7\x8b\xeb\x75\x7f\xd3\xfc\xee\xed\x14\x9f\
+\x36\xb7\xf7\xf7\xc2\x81\x00\xc4\x9f\x6d\x80\x7f\x76\xf1\x54\x0b\
+\xb5\x00\x4a\x2d\xdf\x03\x50\xea\xc5\xe7\x29\xb5\xf4\xfb\xf2\x1d\
+\x2d\x14\x3e\x07\xbf\x98\xd3\x1d\x60\x3e\x7c\xb6\xd3\x2f\xbd\xe4\
+\x63\xc3\x3c\x21\x1b\x3a\x83\xa1\xd4\xf1\x1d\xc9\x60\xfa\xf5\x12\
+\x28\x00\x03\x31\x5f\x3d\x28\x1c\x84\xe3\xe7\xeb\x61\xbd\xff\x21\
+\xdd\x85\x96\x93\xdc\xe5\x34\xe3\x4e\x54\xf1\x04\x32\xdf\x98\x89\
+\xba\x97\x07\x26\x60\x50\xec\x85\xf5\x82\x93\xfc\xe1\x3f\x53\xfa\
+\xd9\x1f\x80\x39\xa4\x1b\x37\x38\x54\xb7\xb4\xea\x0e\x30\x68\xb3\
+\x13\xec\xfe\x8b\xa9\x6d\xed\x67\xc0\x7d\x72\x0c\x9e\xd1\x4d\xba\
+\xcb\xd2\x9f\xb5\x17\x14\x28\x60\xb6\x10\x73\xd4\x82\xc2\xed\x70\
+\xbe\xb5\x0d\x96\xc9\x5f\xd5\x55\xf0\xa0\xcf\x47\x20\x7b\xc7\x4a\
+\x2c\x45\x9a\x9d\x46\xd4\xb7\x9e\xd6\x55\x86\xfe\xc0\x75\x3d\x2f\
+\x28\x54\x66\xd7\x16\x4a\x4c\x7b\x08\xcc\x53\x0b\x18\x33\xf0\x05\
+\x02\xba\x0a\x1f\xb0\x48\x2f\x50\xda\x5a\x32\x20\x18\x44\x7e\xc3\
+\x0b\xa8\x99\xb7\x40\x57\x19\x4a\x02\x28\x55\x96\xc3\x4c\x27\x5a\
+\x81\x4c\x12\xe2\xaa\x65\xa8\x59\xba\x4c\x37\x05\xba\x3f\x77\x1d\
+\xc4\x8b\x47\x51\x0b\xec\x7a\x28\xed\x4e\x0c\xd5\x0d\x10\x42\xad\
+\x18\x72\xd9\x05\x39\x4a\xdf\x90\xda\x72\xb9\x2f\x4e\x51\xe4\x8a\
+\xf1\xf2\x6e\x84\xa4\xeb\x49\xfe\x7e\x31\x7c\xdf\x55\x9e\xf0\xa8\
+\xb6\xbf\x52\xcb\x17\xb5\x2a\xfe\xd7\x9b\x29\x76\xf7\x5c\x18\xdc\
+\xb5\x48\xb9\x2d\x68\x38\xfd\x45\xc5\xad\x30\xf5\xd2\x8b\x94\x7a\
+\x72\x39\x98\xcb\x0d\x31\x28\x7d\x02\x2b\x56\xbc\xcf\x52\x20\xf6\
+\x2b\x5c\x6c\xde\x83\x94\xdd\xb8\x0b\xd2\x35\x09\xc9\xaf\x4d\x45\
+\xc3\xa6\x2d\xfd\xd6\x29\x45\xa0\xf0\x98\xd1\x24\xb6\x25\x40\xc9\
+\x24\xac\xcb\x17\xc3\xb1\x7c\xf0\x5a\x5f\x8f\xbd\x70\x31\xa5\xc3\
+\x8d\x63\x49\xfc\x22\x08\x96\x8a\x20\xbd\xf2\x1f\x50\xff\xec\xf2\
+\x8a\x40\x14\x3e\x3c\x42\x91\x71\xb7\x80\xab\x96\x86\xef\x79\xf8\
+\xc5\x8b\x17\xf2\x94\xf2\x52\x2a\x59\x57\x31\x88\xa0\xc7\x43\xc8\
+\x59\xc1\x12\x17\xc0\xaf\x7b\x1e\xc3\x16\x3f\xad\xb8\xae\x52\x05\
+\x42\xa3\x46\x12\x05\xa4\x1b\xd7\x82\x70\x6c\x5e\x07\xeb\x6c\xed\
+\x37\x0a\x29\xed\xb3\xd4\x72\xaa\x20\x04\x6d\x36\x82\xc9\x03\x16\
+\xbb\x80\xe4\xb7\x17\x63\xf8\x0f\xd7\xa8\xaa\x5f\x4c\xd8\xc4\x33\
+\x8f\x53\xe6\x47\x9b\xc0\x6c\x76\x70\xa3\xbc\xf0\x1e\x1f\x1c\x01\
+\xd3\xfe\x00\xab\x06\x10\xac\x72\x13\xc8\x02\x2e\x93\x44\x62\xc2\
+\xd5\x18\x5e\x86\x0c\xa8\xd4\x8f\x57\x51\xf2\xf1\x65\xe0\x7c\xc3\
+\x3a\x17\x8e\x9e\x57\xe2\xf5\xa7\xc4\x40\x3e\x57\x0d\x50\x12\x36\
+\xdc\x38\x86\xf2\x1f\x9f\x03\x67\xb5\x21\x9b\x0c\x80\xfd\x64\x2d\
+\x86\x7c\x6b\xb1\xa6\xb6\xe2\x4b\x1e\xa5\xcc\xea\x8d\xe0\xfc\xc3\
+\xe4\x4b\x1e\xdc\xef\x1e\x84\xf9\x86\xbf\xd0\xd4\xd6\x40\x80\xd4\
+\x2c\x68\xec\x6f\x17\x51\xf6\x85\x97\xc1\xb9\x87\x82\xe2\x51\x60\
+\x68\x35\x1c\x9b\xd6\xc1\x32\x49\xd9\xb6\x2f\xfb\xbb\x3d\x94\x98\
+\xf9\x0d\x88\xc1\x0c\xa4\xbb\x19\xc4\x48\x2b\x5c\xfb\x77\xc2\x32\
+\xb1\xfc\x69\xb8\x95\x04\xab\x19\xa0\x24\x54\xe8\xfd\x23\x94\x9d\
+\x34\x1d\xe6\x70\x02\xb0\xbb\x20\x26\xa3\x60\x4e\x33\x2c\x4b\x16\
+\xc1\x3c\xfd\x6e\x98\x6f\xbe\xad\x47\xfb\xd9\x77\x0e\x51\x76\xcf\
+\x5b\xe0\x57\xaf\x07\x85\xe2\x60\x2e\x9f\xec\xae\x30\xa3\x00\xf7\
+\xc7\xcd\x30\x8e\x18\x5b\x92\x3c\x95\x04\xd5\x57\xdb\x65\x11\xf8\
+\xfc\xab\xaf\x90\xf8\xd4\xd3\xb0\x24\x33\x80\xc5\x01\x12\xf3\xa0\
+\x1c\x0f\x88\x39\x10\x3a\xef\x82\x06\x07\x70\x46\x30\x93\x05\x30\
+\x59\x41\xbc\xf4\xf5\x63\x0c\xb6\x67\x9e\x80\x63\x55\xe1\x1b\x31\
+\x06\x02\x88\xda\x3e\xcb\x02\xb0\xab\xd3\xd0\xfe\x3d\x94\x5e\xbd\
+\x1e\xdc\xf6\x37\x60\x66\x06\x80\x33\xc9\xd0\xe4\x1f\x11\x48\x14\
+\x40\x22\x0f\xc3\x88\x7a\x58\x1e\x5f\x80\xaa\x67\x9e\x2b\x6b\xff\
+\x6a\x95\x2f\x47\xf9\x8a\x29\x10\xfb\xf8\x24\xe5\x3e\x38\x09\xb1\
+\xb5\x0d\x06\x12\x90\xb3\x3b\xe1\xba\xe6\x8f\x60\xb9\x75\x52\xc5\
+\xfa\x2c\x07\x10\xb5\x6d\xfc\xbf\x52\x46\xad\xf2\xe5\x28\xff\x25\
+\xc0\x12\x29\x7e\x09\xf0\x4b\x80\x25\x12\x28\xb1\xfa\x97\x16\x58\
+\x22\xc0\xff\x03\x96\xd7\x88\x9c\xc3\xbd\xa2\xdd\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x06\xe5\
+\x00\
+\x00\x1a\x81\x78\x9c\xdd\x58\x59\x6f\xe3\x36\x10\x7e\xdf\x5f\x21\
+\x38\x2f\x1b\xd4\xa2\x48\x8a\xa7\x72\x14\x3d\xb0\x45\x8b\x45\x5b\
+\x74\xbb\xe8\xb3\x22\xd1\x8e\x1a\x59\x72\x29\x39\x47\x7f\x7d\x87\
+\x94\x6d\x49\xb1\xb2\x71\xba\x69\x81\x36\x79\xb0\x38\x1a\xce\xc5\
+\x8f\x73\xe8\xfc\xcb\xfb\x55\x19\xdc\x1a\xdb\x14\x75\x75\x31\x23\
+\x08\xcf\x02\x53\x65\x75\x5e\x54\xcb\x8b\xd9\xc7\x5f\xdf\x85\x6a\
+\x16\x34\x6d\x5a\xe5\x69\x59\x57\xe6\x62\x56\xd5\xb3\x2f\x2f\xdf\
+\x9c\x37\xb7\xcb\x37\x41\x10\xc0\xe6\xaa\x49\xf2\xec\x62\x76\xdd\
+\xb6\xeb\x24\x8a\xd6\x1b\x5b\xa2\xda\x2e\xa3\x3c\x8b\x4c\x69\x56\
+\xa6\x6a\x9b\x88\x20\x12\xcd\x7a\xf6\xac\x67\xcf\xac\x49\xdb\xe2\
+\xd6\x64\xf5\x6a\x55\x57\x8d\xdf\x59\x35\x27\x03\x66\x9b\x2f\xf6\
+\xdc\x77\x77\x77\xe8\x2e\xf6\x4c\x44\x6b\x1d\x61\x1a\x51\x1a\x02\
+\x47\xd8\x3c\x54\x6d\x7a\x1f\x8e\xb7\x82\x8d\x53\x5b\x29\xc6\x38\
+\x82\x77\x3d\xe7\x71\x5c\xc9\x7d\x59\x54\x37\x4f\x1a\xe3\xdf\x7a\
+\xee\x51\x34\x1d\xa1\xc8\x2f\x66\x20\x4a\x2a\xce\xfc\xfa\xda\x14\
+\xcb\xeb\xf6\x62\x46\xb9\xf0\xeb\xbb\x22\x6f\xaf\xbb\xe5\x25\xac\
+\xcf\x73\xb3\x68\x1c\xbd\xdb\xe9\x56\xb0\xb5\x7b\x07\x6f\x41\x8f\
+\x49\xed\x77\x36\xcd\x0b\x88\x6e\xc7\xd7\x71\x8e\xdf\x48\x2e\xe5\
+\x76\x0f\xec\x6a\xda\x7a\xbd\xe3\xdd\x5a\x04\x14\xe0\xd1\xb3\x9e\
+\x5c\x2f\x16\x8d\x01\xc3\xf0\x80\xd6\xb4\x0f\xa5\xe9\xb8\xc3\xac\
+\x2e\x6b\x9b\x9c\x60\xff\x77\xe6\x49\xf5\x3a\xcd\x8a\xf6\x21\xc1\
+\x28\x26\xb1\xa4\x9c\x9f\xcd\x82\xe8\x59\xad\x8a\x4c\x68\x25\x9f\
+\xd6\xba\xf0\x7f\x63\xad\x64\xaf\xec\x3c\x1a\x7b\xff\xc2\x60\x71\
+\x22\x9e\x0c\xd6\x84\x2d\x66\x41\x35\xd5\x8f\x6c\x39\x7b\x26\x92\
+\x3b\xf7\x41\x97\x7e\x3a\x48\x13\xda\x32\x81\x0d\x36\x47\x68\x23\
+\x93\xda\xe4\x2b\x46\x49\xb1\xe3\xa3\x74\x77\x5d\xb4\xc7\x58\x3d\
+\x1d\x23\x25\x5e\x12\xa3\x09\x5d\xf8\xf8\x08\x29\xf5\x7a\x11\x92\
+\xf4\xdf\x8a\x90\x64\xff\x5e\x84\xa4\xf8\x7b\x11\x7a\xa0\x20\x51\
+\x22\x4c\x19\x1b\x64\x9a\x7b\x47\x15\x48\x70\xc9\x31\xdf\x53\x1f\
+\x08\x50\x31\x52\x2a\x16\x2a\xee\x79\x1d\x95\x23\x4c\x88\x94\x3d\
+\x75\xb9\xd5\xf3\xb1\x2a\x5a\xc8\xdf\x9b\xc6\xd8\x0f\xe0\x95\xf9\
+\xa9\xfa\xd8\x98\xd9\xd3\xe7\xa3\x62\x22\x7b\xd1\x2e\x65\x27\xd7\
+\xd6\x40\x89\x39\x99\x48\x9e\x7b\x8f\x1d\x31\x2d\x1f\xfb\x66\x2f\
+\x66\x12\x71\xa5\x05\x89\xd9\x5e\xe6\xe2\x01\x12\x39\x46\x8c\xe0\
+\x5d\xb6\xf7\xd4\x7b\xef\x84\x02\x8f\xb1\xda\x53\xb3\x49\xde\x6c\
+\x92\xf7\x78\x87\xc7\xc6\x82\xc3\xfa\x18\x87\x7d\x02\x7c\xde\x61\
+\x8e\xb4\x50\x92\x8f\xdc\x25\x04\xc5\xe0\x01\x57\x63\x77\x19\xc2\
+\x5c\x28\x3e\xf2\xf6\x90\x35\x9b\x62\xdd\x39\xfb\xab\x4d\xab\x66\
+\x51\xdb\xd5\xc5\x6c\x95\xb6\xb6\xb8\x7f\x1b\x32\x04\x95\x99\xc6\
+\x84\xcf\x31\xe2\x9a\xc7\x0c\xc7\xf0\x44\x35\x57\x8c\xd1\x39\x45\
+\x58\x2b\x1d\x2b\x31\x0f\xa9\x64\x48\x28\xa5\xe8\x3c\x24\x0a\xc9\
+\x18\x12\xb6\x3a\x7d\x85\x70\x52\x72\x5c\x38\x55\x7f\x3b\x3f\x71\
+\x37\xa8\x40\x0c\x9c\x51\x72\x7c\x37\x62\xc4\x38\xdc\x03\x3d\xba\
+\x1b\xe0\x1c\x91\x6a\x08\x36\x77\x37\x14\xd2\x80\x69\xaa\xd8\x2b\
+\xdc\x0d\x1a\x1f\xe7\x1b\xe4\xb8\xce\xb7\xf3\xc8\x75\x27\xfe\x69\
+\x65\xda\x34\x4f\xdb\xb4\x6f\x5c\x76\x14\x68\x5e\xf4\xae\x79\x81\
+\x66\x2d\xf9\xe5\xdb\x77\xfb\xac\x95\x65\xc9\x6f\xb5\xbd\xe9\x53\
+\x8e\x63\x48\xaf\xea\x0d\x64\xa2\x7d\x1e\x75\x2d\x51\x96\x38\x1c\
+\xa4\xed\x65\xb1\x4a\x97\xc6\x75\x66\x5f\x40\x57\x06\xfa\xf7\x2f\
+\x46\xcc\xed\xc3\xda\xf4\x42\x3b\xb1\xd6\x34\xf5\xc6\x66\x66\xb2\
+\x59\xcd\xb3\x55\xe1\x36\x45\x1f\xda\xa2\x2c\xbf\x77\x4a\x06\xd9\
+\xb5\x13\xea\xbb\xd5\xda\x5e\x0e\x04\x3b\x07\xbe\x5a\xee\xb3\xe0\
+\xc8\x84\xa2\x2d\xcd\xe5\xfb\x74\x5d\x07\xdf\xa4\x65\xba\x82\x1e\
+\xda\x9a\xc2\x5b\xdc\xbd\x1a\x8a\x89\x0e\xe5\x78\xce\x03\x95\x4e\
+\x72\xe7\xc6\xc8\x3a\xd8\x5e\x16\x99\xa9\x9a\xe7\xbd\x9e\xea\xb9\
+\xb7\x7b\x9b\xe8\xbb\x9f\xdf\x47\x80\xb3\xe8\xc0\xf7\xce\xe4\x29\
+\xeb\xbd\x45\x9b\xab\xdf\x4d\x36\x0a\x82\x3f\xea\xaf\xd3\xe5\xa3\
+\xc0\x38\x6a\x59\x5c\x5a\x50\x6f\xf3\xf3\x68\xbb\x9c\xe4\x59\x19\
+\xb8\x79\x53\x2c\x1d\x6d\x24\xdb\x1b\x76\x60\x85\x3f\xb4\xba\x82\
+\xcc\x71\xb5\x79\xe9\xc1\xfd\x90\xde\x6c\xae\x82\x0f\xad\x01\xec\
+\xdb\x97\x9e\xda\xa1\x4e\xcf\xeb\xa0\x3e\x84\xfe\xfb\xc7\x47\x36\
+\x40\xff\x8b\x4e\x6b\x8c\x84\xb5\xb1\x00\xe6\xe6\x59\x24\xdc\x99\
+\x2b\xb4\x23\x7a\xc1\x59\x16\xfd\x62\xd6\xb6\xce\x37\x59\x0b\x13\
+\xcc\xec\x31\xc4\x3e\x47\xf0\xb7\x45\xd3\xc5\x64\x4a\xb0\x35\x7f\
+\x6c\x0a\xd8\xf1\xb7\x24\xff\x58\xb7\x10\x90\xd7\x35\xd6\xd8\xe2\
+\xd6\xc7\xdd\x1d\x59\xf3\xba\xf6\x7e\xb8\x4e\xad\xf9\xaa\x2c\x6e\
+\x0e\x6d\xfe\x3c\xb9\x7e\xf5\x4d\x9d\x0f\xe5\x7a\xdc\x6d\x71\xb6\
+\xeb\xdf\x06\x49\xf8\x3c\xda\x65\x69\xbf\x5a\x76\xbb\xda\xbe\xee\
+\xfa\xc7\x32\x6d\xcd\x5b\x82\x63\x04\x83\x2e\x11\xf3\xee\x49\x6a\
+\xb9\xab\xa7\xbe\x96\xa4\x0f\xc6\x92\x5d\x9e\x5f\xee\x3c\x68\x0f\
+\x4a\xb8\x42\x3c\x16\x50\xa6\xe9\x1c\xc3\xbf\x5b\x31\xa6\xa4\x98\
+\x53\x85\x05\x92\x02\x2a\x3b\x14\x6c\x68\x03\x19\xd5\xfa\x74\x54\
+\xae\x96\x92\x48\xdc\x77\xd7\x59\x61\xb3\x72\x78\x79\x5c\x3f\x46\
+\x08\xa7\x82\x0e\x7a\x58\xdf\x76\x08\x04\x65\x93\xea\x61\x6f\x3b\
+\xdd\x66\x4d\x19\x4c\x11\xc1\x92\x09\x70\xdc\x19\xec\x57\x50\xd1\
+\xe2\x79\x18\x73\x0d\xd5\x9b\x73\x02\x16\x63\x84\xb1\x90\x4a\x9c\
+\x0e\x44\x39\x9b\xd7\x69\x7b\x2d\x85\x9e\x98\x6d\xc7\xc3\x74\x5e\
+\x34\x6b\x08\x61\x52\x54\xae\xd8\x9e\xd5\xb7\xc6\x2e\xca\xfa\x2e\
+\xb9\x2d\x9a\xe2\xaa\x34\x67\xfe\xb7\x28\x5d\xdb\xbe\x23\xf5\xa3\
+\x37\x3b\x5b\x40\xd1\x4a\xa0\x9c\xbd\x3d\x39\xec\x77\x4f\xfd\xdb\
+\xc1\x84\xe1\x97\x76\x53\x9a\xa4\xaa\xab\x3f\x8d\xad\x61\x2c\xb0\
+\xf5\x8d\x5f\x9a\xed\x73\xe8\x3f\x4a\x80\x6c\x4e\x25\xa6\x12\xe6\
+\xfa\x2d\xdd\xc9\xcf\xd2\x75\x02\x37\xb9\x1d\xd2\x7e\xaf\x8b\x2a\
+\x81\x0b\x67\xec\x8e\xea\x17\x65\x01\x3f\x09\xdb\xd1\xf2\xb4\x01\
+\xf4\x5b\x70\x74\xa8\xcb\x51\xbb\xf9\x23\xc1\x3b\x5a\x6f\xee\x2a\
+\xb5\x37\xc6\x76\x1b\xba\xe7\xb0\x69\x53\xdb\x8e\x28\xab\x22\x1f\
+\xad\x4d\xd5\xad\x87\x57\x61\x39\x3e\x9a\xa5\xe4\x82\x8d\x52\xe7\
+\x23\x40\x3d\x05\xa9\xa7\x41\xf5\x34\xac\xa6\x80\x45\x90\xd2\x92\
+\x72\xe9\x71\xe5\x17\x1e\xfd\x31\x07\xc9\x18\x33\x68\x62\x61\x46\
+\x22\x4c\xb0\x38\x3e\x1d\x89\xda\x03\x0b\x9a\xf1\xd1\x8b\xd7\x82\
+\x56\x0f\xa7\xc3\x69\xe2\x78\x38\x9d\xa4\x6c\xfb\xa1\xe8\x7f\x8a\
+\x28\xc0\x8c\x3b\x86\xe9\xa3\x91\x78\x74\x34\xae\x21\x0e\xc2\x98\
+\xc2\x54\x42\x62\x3d\x77\x2d\xbe\xe2\x18\xc7\x41\x16\x84\x30\xde\
+\x0a\x11\x43\x1a\xc1\x90\x00\x31\x96\x32\x08\x35\xb4\xf5\x8c\x4a\
+\x48\x37\xb1\x6b\xee\x79\x10\xba\xd9\x49\x09\x32\x97\x88\x4a\xcd\
+\x49\x1c\x10\x44\x94\x92\x64\x1e\xc3\x2f\x8e\x75\x00\x49\x19\x2b\
+\x42\xe6\x1c\x49\xac\x75\x1c\x48\xc4\x84\x90\x72\x0e\x23\x86\x94\
+\x94\x05\x1c\xc6\x24\xc6\x41\x35\x22\x8c\x08\x4c\x03\x48\x5a\x1c\
+\xe6\x6a\x80\x1c\x34\x11\x70\x22\x0c\x64\xba\x21\x03\x86\xf2\x79\
+\x08\xb8\x67\xb1\xd2\x4e\xb1\xd3\x23\x34\x00\xd3\x29\x62\xa0\x39\
+\xec\x54\xc1\x68\xd5\xe9\xe2\x34\x08\x3b\x6d\xdc\x61\xd6\xa9\x03\
+\x7b\xc0\x1b\x4a\xa4\x73\x0a\xb0\x2c\x95\x5b\x33\x42\x99\x72\x14\
+\x28\x21\xc4\xed\xc2\x48\x50\xc0\xbd\x27\x01\xee\x89\x0e\xfe\xfc\
+\x47\x00\xdd\xe7\x4a\xc1\x30\x63\x9a\xe9\x4f\x60\x9c\x92\xcf\x49\
+\x99\x04\x66\x50\xe6\x3e\x6d\xb0\xff\x05\xc0\xff\xd9\xa4\xf8\xfa\
+\xe7\xcb\xdd\xe9\x02\x48\xbb\xf3\xf5\xfe\x1d\x7b\x96\x93\xf5\x93\
+\xc6\xa7\x07\x09\x4c\x28\xb8\xad\xfe\xfb\xef\x7f\xf2\x7c\x9f\xc8\
+\x57\xf4\xd9\x72\x25\xb9\x26\x90\xc1\xb6\xf5\x4a\x72\x85\x35\x75\
+\x79\x81\xfb\x7c\xa0\xe1\x91\x21\xb8\xc5\x14\xd2\xd2\xe9\xa8\x07\
+\x5d\xee\x5a\xcf\x65\xd7\x74\xc2\xcf\xb9\x9b\xe1\x2f\xdf\xfc\x05\
+\xc1\x88\x7e\x83\
+\x00\x00\x13\x68\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x35\x2e\x31\x2e\x30\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x34\x30\x2e\x34\x36\x70\x78\x22\x20\x68\x65\x69\x67\
+\x68\x74\x3d\x22\x34\x30\x2e\x34\x36\x70\x78\x22\x20\x76\x69\x65\
+\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x34\x30\x2e\x34\x36\x20\
+\x34\x30\x2e\x34\x36\x22\x20\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\
+\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\x77\x20\x30\x20\
+\x30\x20\x34\x30\x2e\x34\x36\x20\x34\x30\x2e\x34\x36\x22\x20\x78\
+\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\
+\x76\x65\x22\x3e\x0d\x0a\x3c\x72\x61\x64\x69\x61\x6c\x47\x72\x61\
+\x64\x69\x65\x6e\x74\x20\x69\x64\x3d\x22\x53\x56\x47\x49\x44\x5f\
+\x31\x5f\x22\x20\x63\x78\x3d\x22\x33\x30\x35\x2e\x39\x39\x39\x35\
+\x22\x20\x63\x79\x3d\x22\x2d\x33\x35\x34\x2e\x39\x38\x31\x34\x22\
+\x20\x72\x3d\x22\x32\x30\x2e\x31\x32\x37\x33\x22\x20\x66\x78\x3d\
+\x22\x32\x39\x33\x2e\x31\x37\x31\x37\x22\x20\x66\x79\x3d\x22\x2d\
+\x33\x35\x34\x2e\x38\x39\x34\x22\x20\x67\x72\x61\x64\x69\x65\x6e\
+\x74\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\
+\x69\x78\x28\x31\x20\x30\x20\x30\x20\x2d\x31\x20\x2d\x32\x38\x35\
+\x2e\x37\x36\x39\x35\x20\x2d\x33\x33\x34\x2e\x37\x37\x30\x35\x29\
+\x22\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\x3d\
+\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\x22\
+\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\x65\
+\x74\x3d\x22\x30\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\
+\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x46\x46\x46\x46\x46\x46\x22\
+\x2f\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\
+\x65\x74\x3d\x22\x30\x2e\x36\x35\x22\x20\x73\x74\x79\x6c\x65\x3d\
+\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x44\x30\x44\
+\x32\x44\x33\x22\x2f\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\
+\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\x22\x20\x73\x74\x79\x6c\x65\
+\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x44\x30\
+\x44\x32\x44\x33\x22\x2f\x3e\x0d\x0a\x3c\x2f\x72\x61\x64\x69\x61\
+\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\x0d\x0a\x3c\x63\x69\x72\
+\x63\x6c\x65\x20\x66\x69\x6c\x6c\x3d\x22\x75\x72\x6c\x28\x23\x53\
+\x56\x47\x49\x44\x5f\x31\x5f\x29\x22\x20\x63\x78\x3d\x22\x32\x30\
+\x2e\x32\x33\x22\x20\x63\x79\x3d\x22\x32\x30\x2e\x32\x31\x31\x22\
+\x20\x72\x3d\x22\x31\x39\x2e\x37\x32\x39\x22\x2f\x3e\x0d\x0a\x3c\
+\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\x45\x45\x34\x31\
+\x33\x43\x22\x20\x64\x3d\x22\x4d\x33\x37\x2e\x30\x31\x33\x2c\x39\
+\x2e\x38\x39\x36\x63\x2d\x33\x2e\x34\x37\x35\x2d\x35\x2e\x36\x33\
+\x2d\x39\x2e\x36\x38\x32\x2d\x39\x2e\x33\x39\x35\x2d\x31\x36\x2e\
+\x37\x38\x33\x2d\x39\x2e\x33\x39\x35\x76\x31\x39\x2e\x37\x31\x38\
+\x4c\x33\x37\x2e\x30\x31\x33\x2c\x39\x2e\x38\x39\x36\x7a\x22\x2f\
+\x3e\x0d\x0a\x3c\x72\x61\x64\x69\x61\x6c\x47\x72\x61\x64\x69\x65\
+\x6e\x74\x20\x69\x64\x3d\x22\x53\x56\x47\x49\x44\x5f\x32\x5f\x22\
+\x20\x63\x78\x3d\x22\x33\x30\x35\x2e\x39\x39\x39\x35\x22\x20\x63\
+\x79\x3d\x22\x2d\x33\x35\x35\x2e\x30\x30\x31\x22\x20\x72\x3d\x22\
+\x31\x39\x2e\x36\x38\x33\x38\x22\x20\x67\x72\x61\x64\x69\x65\x6e\
+\x74\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\
+\x69\x78\x28\x31\x20\x30\x20\x30\x20\x2d\x31\x20\x2d\x32\x38\x35\
+\x2e\x37\x36\x39\x35\x20\x2d\x33\x33\x34\x2e\x37\x37\x30\x35\x29\
+\x22\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\x3d\
+\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\x6e\x55\x73\x65\x22\
+\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\x65\
+\x74\x3d\x22\x30\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\
+\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x45\x45\x34\x31\x33\x43\x22\
+\x2f\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\x6f\x66\x66\x73\
+\x65\x74\x3d\x22\x31\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x73\x74\
+\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\x23\x46\x46\x46\x46\x46\x46\
+\x22\x2f\x3e\x0d\x0a\x3c\x2f\x72\x61\x64\x69\x61\x6c\x47\x72\x61\
+\x64\x69\x65\x6e\x74\x3e\x0d\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\
+\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x30\x2e\x34\x22\x20\x66\x69\
+\x6c\x6c\x3d\x22\x75\x72\x6c\x28\x23\x53\x56\x47\x49\x44\x5f\x32\
+\x5f\x29\x22\x20\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\
+\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\x77\x20\x20\x20\x20\x22\x20\
+\x63\x78\x3d\x22\x32\x30\x2e\x32\x33\x22\x20\x63\x79\x3d\x22\x32\
+\x30\x2e\x32\x33\x22\x20\x72\x3d\x22\x31\x39\x2e\x36\x38\x34\x22\
+\x2f\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\
+\x23\x35\x38\x35\x39\x35\x42\x22\x20\x64\x3d\x22\x4d\x32\x30\x2e\
+\x32\x33\x2c\x34\x30\x2e\x34\x35\x38\x63\x2d\x31\x31\x2e\x31\x35\
+\x34\x2c\x30\x2d\x32\x30\x2e\x32\x32\x39\x2d\x39\x2e\x30\x37\x34\
+\x2d\x32\x30\x2e\x32\x32\x39\x2d\x32\x30\x2e\x32\x32\x39\x63\x30\
+\x2d\x31\x31\x2e\x31\x35\x34\x2c\x39\x2e\x30\x37\x34\x2d\x32\x30\
+\x2e\x32\x32\x39\x2c\x32\x30\x2e\x32\x32\x39\x2d\x32\x30\x2e\x32\
+\x32\x39\x0d\x0a\x09\x63\x31\x31\x2e\x31\x35\x34\x2c\x30\x2c\x32\
+\x30\x2e\x32\x32\x39\x2c\x39\x2e\x30\x37\x35\x2c\x32\x30\x2e\x32\
+\x32\x39\x2c\x32\x30\x2e\x32\x32\x39\x43\x34\x30\x2e\x34\x35\x38\
+\x2c\x33\x31\x2e\x33\x38\x34\x2c\x33\x31\x2e\x33\x38\x34\x2c\x34\
+\x30\x2e\x34\x35\x38\x2c\x32\x30\x2e\x32\x33\x2c\x34\x30\x2e\x34\
+\x35\x38\x7a\x20\x4d\x32\x30\x2e\x32\x33\x2c\x31\x2e\x30\x30\x31\
+\x43\x39\x2e\x36\x32\x37\x2c\x31\x2e\x30\x30\x31\x2c\x31\x2e\x30\
+\x30\x31\x2c\x39\x2e\x36\x32\x37\x2c\x31\x2e\x30\x30\x31\x2c\x32\
+\x30\x2e\x32\x33\x0d\x0a\x09\x63\x30\x2c\x31\x30\x2e\x36\x30\x34\
+\x2c\x38\x2e\x36\x32\x36\x2c\x31\x39\x2e\x32\x32\x39\x2c\x31\x39\
+\x2e\x32\x32\x39\x2c\x31\x39\x2e\x32\x32\x39\x63\x31\x30\x2e\x36\
+\x30\x34\x2c\x30\x2c\x31\x39\x2e\x32\x32\x39\x2d\x38\x2e\x36\x32\
+\x35\x2c\x31\x39\x2e\x32\x32\x39\x2d\x31\x39\x2e\x32\x32\x39\x43\
+\x33\x39\x2e\x34\x35\x38\x2c\x39\x2e\x36\x32\x37\x2c\x33\x30\x2e\
+\x38\x33\x33\x2c\x31\x2e\x30\x30\x31\x2c\x32\x30\x2e\x32\x33\x2c\
+\x31\x2e\x30\x30\x31\x7a\x22\x2f\x3e\x0d\x0a\x3c\x72\x61\x64\x69\
+\x61\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\x20\x69\x64\x3d\x22\x53\
+\x56\x47\x49\x44\x5f\x33\x5f\x22\x20\x63\x78\x3d\x22\x2d\x33\x37\
+\x2e\x36\x31\x31\x38\x22\x20\x63\x79\x3d\x22\x33\x39\x2e\x39\x31\
+\x35\x35\x22\x20\x72\x3d\x22\x37\x2e\x34\x33\x33\x36\x22\x20\x67\
+\x72\x61\x64\x69\x65\x6e\x74\x54\x72\x61\x6e\x73\x66\x6f\x72\x6d\
+\x3d\x22\x6d\x61\x74\x72\x69\x78\x28\x31\x2e\x36\x34\x20\x2d\x30\
+\x2e\x31\x36\x31\x32\x20\x30\x2e\x30\x38\x39\x37\x20\x30\x2e\x39\
+\x31\x33\x32\x20\x37\x37\x2e\x32\x37\x37\x31\x20\x2d\x33\x34\x2e\
+\x35\x30\x33\x34\x29\x22\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\
+\x6e\x69\x74\x73\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\
+\x6e\x55\x73\x65\x22\x3e\x0d\x0a\x09\x3c\x73\x74\x6f\x70\x20\x20\
+\x6f\x66\x66\x73\x65\x74\x3d\x22\x30\x2e\x32\x35\x22\x20\x73\x74\
+\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3a\
+\x23\x46\x46\x46\x46\x46\x46\x22\x2f\x3e\x0d\x0a\x09\x3c\x73\x74\
+\x6f\x70\x20\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\x22\x20\x73\
+\x74\x79\x6c\x65\x3d\x22\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\
+\x3a\x23\x46\x46\x46\x46\x46\x46\x3b\x73\x74\x6f\x70\x2d\x6f\x70\
+\x61\x63\x69\x74\x79\x3a\x30\x22\x2f\x3e\x0d\x0a\x3c\x2f\x72\x61\
+\x64\x69\x61\x6c\x47\x72\x61\x64\x69\x65\x6e\x74\x3e\x0d\x0a\x3c\
+\x70\x61\x74\x68\x20\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x30\x2e\
+\x37\x22\x20\x66\x69\x6c\x6c\x3d\x22\x75\x72\x6c\x28\x23\x53\x56\
+\x47\x49\x44\x5f\x33\x5f\x29\x22\x20\x64\x3d\x22\x4d\x33\x31\x2e\
+\x33\x36\x34\x2c\x36\x2e\x38\x31\x31\x63\x30\x2e\x33\x36\x38\x2c\
+\x33\x2e\x37\x35\x2d\x34\x2e\x37\x39\x31\x2c\x37\x2e\x33\x32\x35\
+\x2d\x31\x31\x2e\x35\x32\x34\x2c\x37\x2e\x39\x38\x37\x53\x37\x2e\
+\x33\x34\x39\x2c\x31\x32\x2e\x39\x35\x37\x2c\x36\x2e\x39\x38\x2c\
+\x39\x2e\x32\x30\x37\x0d\x0a\x09\x63\x2d\x30\x2e\x33\x36\x38\x2d\
+\x33\x2e\x37\x34\x39\x2c\x34\x2e\x37\x39\x32\x2d\x37\x2e\x33\x32\
+\x34\x2c\x31\x31\x2e\x35\x32\x35\x2d\x37\x2e\x39\x38\x36\x53\x33\
+\x30\x2e\x39\x39\x35\x2c\x33\x2e\x30\x36\x32\x2c\x33\x31\x2e\x33\
+\x36\x34\x2c\x36\x2e\x38\x31\x31\x7a\x22\x2f\x3e\x0d\x0a\x3c\x70\
+\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\x32\x33\x31\x46\x32\
+\x30\x22\x20\x64\x3d\x22\x4d\x32\x30\x2e\x33\x32\x34\x2c\x33\x37\
+\x2e\x38\x35\x37\x68\x2d\x30\x2e\x31\x32\x33\x63\x2d\x30\x2e\x36\
+\x39\x31\x2c\x30\x2d\x31\x2e\x32\x35\x2d\x30\x2e\x35\x35\x39\x2d\
+\x31\x2e\x32\x35\x2d\x31\x2e\x32\x35\x63\x30\x2d\x30\x2e\x36\x38\
+\x39\x2c\x30\x2e\x35\x35\x39\x2d\x31\x2e\x32\x35\x2c\x31\x2e\x32\
+\x35\x2d\x31\x2e\x32\x35\x68\x30\x2e\x31\x30\x36\x0d\x0a\x09\x63\
+\x30\x2e\x36\x39\x2c\x30\x2c\x31\x2e\x32\x35\x39\x2c\x30\x2e\x35\
+\x36\x31\x2c\x31\x2e\x32\x35\x39\x2c\x31\x2e\x32\x35\x43\x32\x31\
+\x2e\x35\x36\x36\x2c\x33\x37\x2e\x32\x39\x38\x2c\x32\x31\x2e\x30\
+\x31\x35\x2c\x33\x37\x2e\x38\x35\x37\x2c\x32\x30\x2e\x33\x32\x34\
+\x2c\x33\x37\x2e\x38\x35\x37\x7a\x20\x4d\x31\x32\x2e\x31\x32\x35\
+\x2c\x33\x35\x2e\x37\x31\x36\x63\x2d\x30\x2e\x32\x31\x2c\x30\x2d\
+\x30\x2e\x34\x32\x31\x2d\x30\x2e\x30\x35\x33\x2d\x30\x2e\x36\x31\
+\x36\x2d\x30\x2e\x31\x36\x34\x0d\x0a\x09\x6c\x2d\x30\x2e\x31\x32\
+\x35\x2d\x30\x2e\x30\x37\x63\x2d\x30\x2e\x35\x39\x36\x2d\x30\x2e\
+\x33\x35\x32\x2d\x30\x2e\x37\x39\x33\x2d\x31\x2e\x31\x31\x37\x2d\
+\x30\x2e\x34\x34\x33\x2d\x31\x2e\x37\x31\x33\x63\x30\x2e\x33\x35\
+\x31\x2d\x30\x2e\x35\x39\x36\x2c\x31\x2e\x31\x31\x37\x2d\x30\x2e\
+\x37\x39\x31\x2c\x31\x2e\x37\x31\x32\x2d\x30\x2e\x34\x34\x31\x6c\
+\x30\x2e\x30\x39\x31\x2c\x30\x2e\x30\x35\x31\x0d\x0a\x09\x63\x30\
+\x2e\x36\x2c\x30\x2e\x33\x34\x33\x2c\x30\x2e\x38\x31\x31\x2c\x31\
+\x2e\x31\x30\x34\x2c\x30\x2e\x34\x37\x2c\x31\x2e\x37\x30\x35\x43\
+\x31\x32\x2e\x39\x38\x34\x2c\x33\x35\x2e\x34\x38\x38\x2c\x31\x32\
+\x2e\x35\x36\x2c\x33\x35\x2e\x37\x31\x36\x2c\x31\x32\x2e\x31\x32\
+\x35\x2c\x33\x35\x2e\x37\x31\x36\x7a\x20\x4d\x32\x38\x2e\x33\x39\
+\x2c\x33\x35\x2e\x36\x38\x35\x63\x2d\x30\x2e\x34\x33\x32\x2c\x30\
+\x2d\x30\x2e\x38\x35\x34\x2d\x30\x2e\x32\x32\x35\x2d\x31\x2e\x30\
+\x38\x34\x2d\x30\x2e\x36\x32\x37\x0d\x0a\x09\x63\x2d\x30\x2e\x33\
+\x34\x34\x2d\x30\x2e\x35\x39\x38\x2d\x30\x2e\x31\x33\x39\x2d\x31\
+\x2e\x33\x36\x33\x2c\x30\x2e\x34\x36\x2d\x31\x2e\x37\x30\x37\x6c\
+\x30\x2e\x30\x39\x37\x2d\x30\x2e\x30\x35\x35\x63\x30\x2e\x35\x39\
+\x34\x2d\x30\x2e\x33\x35\x31\x2c\x31\x2e\x33\x36\x2d\x30\x2e\x31\
+\x35\x32\x2c\x31\x2e\x37\x31\x31\x2c\x30\x2e\x34\x34\x63\x30\x2e\
+\x33\x35\x2c\x30\x2e\x35\x39\x37\x2c\x30\x2e\x31\x35\x32\x2c\x31\
+\x2e\x33\x36\x31\x2d\x30\x2e\x34\x34\x33\x2c\x31\x2e\x37\x31\x34\
+\x0d\x0a\x09\x6c\x2d\x30\x2e\x31\x31\x36\x2c\x30\x2e\x30\x36\x37\
+\x43\x32\x38\x2e\x38\x31\x36\x2c\x33\x35\x2e\x36\x33\x2c\x32\x38\
+\x2e\x36\x30\x32\x2c\x33\x35\x2e\x36\x38\x35\x2c\x32\x38\x2e\x33\
+\x39\x2c\x33\x35\x2e\x36\x38\x35\x7a\x20\x4d\x36\x2e\x30\x39\x37\
+\x2c\x32\x39\x2e\x37\x36\x31\x63\x2d\x30\x2e\x34\x32\x38\x2c\x30\
+\x2d\x30\x2e\x38\x34\x35\x2d\x30\x2e\x32\x32\x31\x2d\x31\x2e\x30\
+\x37\x38\x2d\x30\x2e\x36\x31\x35\x6c\x2d\x30\x2e\x30\x36\x38\x2d\
+\x30\x2e\x31\x31\x39\x0d\x0a\x09\x63\x2d\x30\x2e\x33\x34\x35\x2d\
+\x30\x2e\x35\x39\x38\x2d\x30\x2e\x31\x33\x39\x2d\x31\x2e\x33\x36\
+\x31\x2c\x30\x2e\x34\x35\x39\x2d\x31\x2e\x37\x30\x37\x63\x30\x2e\
+\x36\x2d\x30\x2e\x33\x34\x34\x2c\x31\x2e\x33\x36\x33\x2d\x30\x2e\
+\x31\x33\x37\x2c\x31\x2e\x37\x30\x37\x2c\x30\x2e\x34\x36\x31\x6c\
+\x30\x2e\x30\x35\x37\x2c\x30\x2e\x30\x39\x36\x63\x30\x2e\x33\x35\
+\x2c\x30\x2e\x35\x39\x37\x2c\x30\x2e\x31\x35\x32\x2c\x31\x2e\x33\
+\x36\x31\x2d\x30\x2e\x34\x34\x33\x2c\x31\x2e\x37\x31\x31\x0d\x0a\
+\x09\x43\x36\x2e\x35\x33\x31\x2c\x32\x39\x2e\x37\x30\x35\x2c\x36\
+\x2e\x33\x31\x33\x2c\x32\x39\x2e\x37\x36\x31\x2c\x36\x2e\x30\x39\
+\x37\x2c\x32\x39\x2e\x37\x36\x31\x7a\x20\x4d\x33\x34\x2e\x33\x39\
+\x35\x2c\x32\x39\x2e\x37\x30\x37\x63\x2d\x30\x2e\x32\x31\x36\x2c\
+\x30\x2d\x30\x2e\x34\x33\x35\x2d\x30\x2e\x30\x35\x35\x2d\x30\x2e\
+\x36\x33\x34\x2d\x30\x2e\x31\x37\x32\x63\x2d\x30\x2e\x35\x39\x36\
+\x2d\x30\x2e\x33\x35\x32\x2d\x30\x2e\x37\x39\x33\x2d\x31\x2e\x31\
+\x31\x37\x2d\x30\x2e\x34\x34\x32\x2d\x31\x2e\x37\x31\x33\x0d\x0a\
+\x09\x6c\x30\x2e\x30\x35\x32\x2d\x30\x2e\x30\x39\x63\x30\x2e\x33\
+\x34\x32\x2d\x30\x2e\x36\x30\x32\x2c\x31\x2e\x31\x30\x35\x2d\x30\
+\x2e\x38\x31\x33\x2c\x31\x2e\x37\x30\x35\x2d\x30\x2e\x34\x37\x31\
+\x73\x30\x2e\x38\x31\x32\x2c\x31\x2e\x31\x30\x34\x2c\x30\x2e\x34\
+\x36\x39\x2c\x31\x2e\x37\x30\x35\x6c\x2d\x30\x2e\x30\x37\x2c\x30\
+\x2e\x31\x32\x35\x43\x33\x35\x2e\x32\x34\x2c\x32\x39\x2e\x34\x38\
+\x38\x2c\x33\x34\x2e\x38\x32\x33\x2c\x32\x39\x2e\x37\x30\x37\x2c\
+\x33\x34\x2e\x33\x39\x35\x2c\x32\x39\x2e\x37\x30\x37\x7a\x0d\x0a\
+\x09\x20\x4d\x33\x2e\x38\x35\x33\x2c\x32\x31\x2e\x35\x39\x31\x63\
+\x2d\x30\x2e\x36\x39\x31\x2c\x30\x2d\x31\x2e\x32\x35\x2d\x30\x2e\
+\x35\x35\x39\x2d\x31\x2e\x32\x35\x2d\x31\x2e\x32\x35\x76\x2d\x30\
+\x2e\x30\x33\x35\x63\x30\x2d\x30\x2e\x36\x39\x2c\x30\x2e\x35\x35\
+\x39\x2d\x31\x2e\x32\x39\x35\x2c\x31\x2e\x32\x35\x2d\x31\x2e\x32\
+\x39\x35\x63\x30\x2e\x36\x38\x39\x2c\x30\x2c\x31\x2e\x32\x35\x2c\
+\x30\x2e\x35\x31\x36\x2c\x31\x2e\x32\x35\x2c\x31\x2e\x32\x30\x35\
+\x76\x30\x2e\x31\x32\x35\x0d\x0a\x09\x43\x35\x2e\x31\x30\x33\x2c\
+\x32\x31\x2e\x30\x33\x33\x2c\x34\x2e\x35\x34\x32\x2c\x32\x31\x2e\
+\x35\x39\x31\x2c\x33\x2e\x38\x35\x33\x2c\x32\x31\x2e\x35\x39\x31\
+\x7a\x20\x4d\x33\x37\x2e\x38\x35\x38\x2c\x32\x30\x2e\x31\x34\x31\
+\x76\x30\x2e\x30\x39\x34\x63\x30\x2c\x30\x2e\x36\x38\x38\x2d\x30\
+\x2e\x35\x36\x2c\x31\x2e\x32\x37\x31\x2d\x31\x2e\x32\x35\x2c\x31\
+\x2e\x32\x37\x31\x73\x2d\x31\x2e\x32\x35\x2d\x30\x2e\x35\x33\x36\
+\x2d\x31\x2e\x32\x35\x2d\x31\x2e\x32\x32\x38\x76\x2d\x30\x2e\x31\
+\x32\x34\x0d\x0a\x09\x63\x30\x2d\x30\x2e\x36\x39\x2c\x30\x2e\x35\
+\x36\x2d\x31\x2e\x32\x38\x34\x2c\x31\x2e\x32\x35\x2d\x31\x2e\x32\
+\x38\x34\x73\x31\x2e\x32\x34\x39\x2c\x30\x2e\x35\x32\x34\x2c\x31\
+\x2e\x32\x34\x39\x2c\x31\x2e\x32\x31\x35\x20\x4d\x35\x2e\x39\x38\
+\x34\x2c\x31\x33\x2e\x33\x39\x31\x63\x2d\x30\x2e\x32\x30\x39\x2c\
+\x30\x2d\x30\x2e\x34\x32\x31\x2d\x30\x2e\x30\x35\x32\x2d\x30\x2e\
+\x36\x31\x35\x2d\x30\x2e\x31\x36\x32\x0d\x0a\x09\x63\x2d\x30\x2e\
+\x36\x30\x31\x2d\x30\x2e\x33\x34\x31\x2d\x30\x2e\x38\x31\x31\x2d\
+\x31\x2e\x31\x30\x34\x2d\x30\x2e\x34\x37\x31\x2d\x31\x2e\x37\x30\
+\x35\x6c\x30\x2e\x30\x37\x32\x2d\x30\x2e\x31\x32\x35\x63\x30\x2e\
+\x33\x35\x2d\x30\x2e\x35\x39\x34\x2c\x31\x2e\x31\x31\x37\x2d\x30\
+\x2e\x37\x39\x32\x2c\x31\x2e\x37\x31\x31\x2d\x30\x2e\x34\x34\x32\
+\x63\x30\x2e\x35\x39\x36\x2c\x30\x2e\x33\x35\x31\x2c\x30\x2e\x37\
+\x39\x33\x2c\x31\x2e\x31\x31\x36\x2c\x30\x2e\x34\x34\x33\x2c\x31\
+\x2e\x37\x31\x32\x0d\x0a\x09\x6c\x2d\x30\x2e\x30\x35\x33\x2c\x30\
+\x2e\x30\x39\x43\x36\x2e\x38\x34\x32\x2c\x31\x33\x2e\x31\x36\x34\
+\x2c\x36\x2e\x34\x31\x39\x2c\x31\x33\x2e\x33\x39\x31\x2c\x35\x2e\
+\x39\x38\x34\x2c\x31\x33\x2e\x33\x39\x31\x7a\x20\x4d\x33\x34\x2e\
+\x34\x31\x2c\x31\x33\x2e\x32\x37\x35\x63\x2d\x30\x2e\x34\x33\x32\
+\x2c\x30\x2d\x30\x2e\x38\x35\x33\x2d\x30\x2e\x32\x32\x35\x2d\x31\
+\x2e\x30\x38\x34\x2d\x30\x2e\x36\x32\x36\x6c\x2d\x30\x2e\x30\x35\
+\x37\x2d\x30\x2e\x30\x39\x37\x0d\x0a\x09\x63\x2d\x30\x2e\x33\x35\
+\x2d\x30\x2e\x35\x39\x34\x2d\x30\x2e\x31\x35\x32\x2d\x31\x2e\x33\
+\x36\x2c\x30\x2e\x34\x34\x33\x2d\x31\x2e\x37\x31\x31\x63\x30\x2e\
+\x35\x39\x35\x2d\x30\x2e\x33\x35\x2c\x31\x2e\x33\x36\x2d\x30\x2e\
+\x31\x35\x32\x2c\x31\x2e\x37\x31\x31\x2c\x30\x2e\x34\x34\x33\x6c\
+\x30\x2e\x30\x36\x38\x2c\x30\x2e\x31\x31\x37\x63\x30\x2e\x33\x34\
+\x36\x2c\x30\x2e\x35\x39\x39\x2c\x30\x2e\x31\x33\x39\x2c\x31\x2e\
+\x33\x36\x33\x2d\x30\x2e\x34\x35\x39\x2c\x31\x2e\x37\x30\x37\x0d\
+\x0a\x09\x43\x33\x34\x2e\x38\x33\x35\x2c\x31\x33\x2e\x32\x32\x33\
+\x2c\x33\x34\x2e\x36\x32\x33\x2c\x31\x33\x2e\x32\x37\x35\x2c\x33\
+\x34\x2e\x34\x31\x2c\x31\x33\x2e\x32\x37\x35\x7a\x20\x4d\x31\x31\
+\x2e\x39\x33\x35\x2c\x37\x2e\x33\x35\x35\x63\x2d\x30\x2e\x34\x32\
+\x38\x2c\x30\x2d\x30\x2e\x38\x34\x35\x2d\x30\x2e\x32\x32\x2d\x31\
+\x2e\x30\x37\x38\x2d\x30\x2e\x36\x31\x36\x63\x2d\x30\x2e\x33\x35\
+\x2d\x30\x2e\x35\x39\x35\x2d\x30\x2e\x31\x35\x32\x2d\x31\x2e\x33\
+\x36\x31\x2c\x30\x2e\x34\x34\x33\x2d\x31\x2e\x37\x31\x31\x0d\x0a\
+\x09\x6c\x30\x2e\x31\x31\x37\x2d\x30\x2e\x30\x36\x39\x63\x30\x2e\
+\x36\x2d\x30\x2e\x33\x34\x33\x2c\x31\x2e\x33\x36\x33\x2d\x30\x2e\
+\x31\x33\x38\x2c\x31\x2e\x37\x30\x37\x2c\x30\x2e\x34\x36\x63\x30\
+\x2e\x33\x34\x34\x2c\x30\x2e\x35\x39\x39\x2c\x30\x2e\x31\x33\x39\
+\x2c\x31\x2e\x33\x36\x33\x2d\x30\x2e\x34\x36\x2c\x31\x2e\x37\x30\
+\x37\x6c\x2d\x30\x2e\x30\x39\x37\x2c\x30\x2e\x30\x35\x36\x0d\x0a\
+\x09\x43\x31\x32\x2e\x33\x36\x39\x2c\x37\x2e\x32\x39\x39\x2c\x31\
+\x32\x2e\x31\x35\x31\x2c\x37\x2e\x33\x35\x35\x2c\x31\x31\x2e\x39\
+\x33\x35\x2c\x37\x2e\x33\x35\x35\x7a\x20\x4d\x32\x38\x2e\x34\x31\
+\x32\x2c\x37\x2e\x32\x38\x39\x63\x2d\x30\x2e\x32\x31\x37\x2c\x30\
+\x2d\x30\x2e\x34\x33\x35\x2d\x30\x2e\x30\x35\x36\x2d\x30\x2e\x36\
+\x33\x34\x2d\x30\x2e\x31\x37\x33\x6c\x2d\x30\x2e\x30\x39\x31\x2d\
+\x30\x2e\x30\x35\x32\x0d\x0a\x09\x63\x2d\x30\x2e\x36\x2d\x30\x2e\
+\x33\x34\x2d\x30\x2e\x38\x31\x31\x2d\x31\x2e\x31\x30\x34\x2d\x30\
+\x2e\x34\x37\x31\x2d\x31\x2e\x37\x30\x34\x63\x30\x2e\x33\x34\x32\
+\x2d\x30\x2e\x36\x2c\x31\x2e\x31\x30\x34\x2d\x30\x2e\x38\x31\x2c\
+\x31\x2e\x37\x30\x35\x2d\x30\x2e\x34\x37\x6c\x30\x2e\x31\x32\x35\
+\x2c\x30\x2e\x30\x37\x32\x63\x30\x2e\x35\x39\x36\x2c\x30\x2e\x33\
+\x35\x31\x2c\x30\x2e\x37\x39\x33\x2c\x31\x2e\x31\x31\x37\x2c\x30\
+\x2e\x34\x34\x32\x2c\x31\x2e\x37\x31\x31\x0d\x0a\x09\x43\x32\x39\
+\x2e\x32\x35\x35\x2c\x37\x2e\x30\x36\x39\x2c\x32\x38\x2e\x38\x33\
+\x39\x2c\x37\x2e\x32\x38\x39\x2c\x32\x38\x2e\x34\x31\x32\x2c\x37\
+\x2e\x32\x38\x39\x7a\x20\x4d\x32\x30\x2e\x31\x33\x2c\x32\x2e\x36\
+\x30\x33\x68\x30\x2e\x30\x39\x36\x63\x30\x2e\x36\x38\x39\x2c\x30\
+\x2c\x31\x2e\x32\x35\x2c\x30\x2e\x35\x36\x2c\x31\x2e\x32\x35\x2c\
+\x31\x2e\x32\x35\x73\x2d\x30\x2e\x35\x36\x31\x2c\x31\x2e\x32\x35\
+\x2d\x31\x2e\x32\x35\x2c\x31\x2e\x32\x35\x68\x2d\x30\x2e\x31\x32\
+\x35\x0d\x0a\x09\x63\x2d\x30\x2e\x36\x38\x39\x2c\x30\x2d\x31\x2e\
+\x32\x35\x2d\x30\x2e\x35\x36\x2d\x31\x2e\x32\x35\x2d\x31\x2e\x32\
+\x35\x73\x30\x2e\x35\x36\x31\x2d\x31\x2e\x32\x35\x2c\x31\x2e\x32\
+\x35\x2d\x31\x2e\x32\x35\x22\x2f\x3e\x0d\x0a\x3c\x70\x61\x74\x68\
+\x20\x66\x69\x6c\x6c\x3d\x22\x23\x32\x33\x31\x46\x32\x30\x22\x20\
+\x64\x3d\x22\x4d\x32\x30\x2e\x32\x33\x2c\x32\x31\x2e\x32\x33\x63\
+\x2d\x30\x2e\x31\x36\x38\x2c\x30\x2d\x30\x2e\x33\x33\x36\x2d\x30\
+\x2e\x30\x34\x33\x2d\x30\x2e\x34\x38\x37\x2d\x30\x2e\x31\x32\x37\
+\x63\x2d\x30\x2e\x33\x31\x36\x2d\x30\x2e\x31\x37\x38\x2d\x30\x2e\
+\x35\x31\x33\x2d\x30\x2e\x35\x31\x31\x2d\x30\x2e\x35\x31\x33\x2d\
+\x30\x2e\x38\x37\x33\x76\x2d\x39\x2e\x39\x31\x36\x0d\x0a\x09\x63\
+\x30\x2d\x30\x2e\x35\x35\x32\x2c\x30\x2e\x34\x34\x38\x2d\x31\x2c\
+\x31\x2d\x31\x63\x30\x2e\x35\x35\x33\x2c\x30\x2c\x31\x2c\x30\x2e\
+\x34\x34\x38\x2c\x31\x2c\x31\x76\x38\x2e\x31\x32\x35\x6c\x31\x30\
+\x2e\x31\x38\x32\x2d\x36\x2e\x32\x37\x33\x63\x30\x2e\x34\x37\x31\
+\x2d\x30\x2e\x32\x38\x39\x2c\x31\x2e\x30\x38\x36\x2d\x30\x2e\x31\
+\x34\x33\x2c\x31\x2e\x33\x37\x37\x2c\x30\x2e\x33\x32\x38\x0d\x0a\
+\x09\x63\x30\x2e\x32\x38\x39\x2c\x30\x2e\x34\x37\x2c\x30\x2e\x31\
+\x34\x34\x2c\x31\x2e\x30\x38\x36\x2d\x30\x2e\x33\x32\x38\x2c\x31\
+\x2e\x33\x37\x35\x6c\x2d\x31\x31\x2e\x37\x30\x35\x2c\x37\x2e\x32\
+\x31\x32\x43\x32\x30\x2e\x35\x39\x34\x2c\x32\x31\x2e\x31\x37\x39\
+\x2c\x32\x30\x2e\x34\x31\x33\x2c\x32\x31\x2e\x32\x33\x2c\x32\x30\
+\x2e\x32\x33\x2c\x32\x31\x2e\x32\x33\x7a\x22\x2f\x3e\x0d\x0a\x3c\
+\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x05\xaa\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x3f\x3e\x0a\x3c\x73\x76\x67\x20\x77\x69\x64\x74\x68\
+\x3d\x22\x31\x34\x33\x70\x74\x22\x20\x68\x65\x69\x67\x68\x74\x3d\
+\x22\x31\x34\x33\x70\x74\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\
+\x22\x31\x2e\x31\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\
+\x20\x30\x20\x31\x34\x33\x20\x31\x34\x33\x22\x20\x78\x6d\x6c\x6e\
+\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\
+\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\
+\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\
+\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x3e\x3c\x64\x65\x66\x73\x3e\
+\x3c\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6e\x74\x20\
+\x69\x64\x3d\x22\x61\x22\x20\x78\x31\x3d\x22\x32\x32\x2e\x38\x30\
+\x39\x22\x20\x78\x32\x3d\x22\x31\x32\x30\x2e\x39\x32\x22\x20\x79\
+\x31\x3d\x22\x32\x39\x2e\x39\x34\x36\x22\x20\x79\x32\x3d\x22\x31\
+\x31\x39\x2e\x32\x31\x22\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\
+\x6e\x69\x74\x73\x3d\x22\x75\x73\x65\x72\x53\x70\x61\x63\x65\x4f\
+\x6e\x55\x73\x65\x22\x3e\x3c\x73\x74\x6f\x70\x20\x73\x74\x6f\x70\
+\x2d\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x30\x30\x37\x36\x62\x64\x22\
+\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x30\x22\x2f\x3e\x3c\x73\x74\
+\x6f\x70\x20\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3d\x22\x23\
+\x39\x63\x64\x65\x66\x39\x22\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\
+\x31\x22\x2f\x3e\x3c\x2f\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\
+\x69\x65\x6e\x74\x3e\x3c\x2f\x64\x65\x66\x73\x3e\x3c\x67\x20\x69\
+\x64\x3d\x22\x23\x30\x63\x61\x39\x65\x34\x66\x66\x22\x20\x66\x69\
+\x6c\x6c\x3d\x22\x75\x72\x6c\x28\x23\x61\x29\x22\x3e\x3c\x70\x61\
+\x74\x68\x20\x64\x3d\x22\x6d\x35\x32\x2e\x38\x32\x20\x37\x30\x2e\
+\x37\x35\x63\x36\x2e\x30\x33\x2d\x32\x33\x2e\x33\x37\x20\x31\x32\
+\x2e\x34\x35\x2d\x34\x36\x2e\x36\x35\x20\x31\x38\x2e\x32\x31\x2d\
+\x37\x30\x2e\x30\x38\x20\x36\x2e\x34\x20\x32\x33\x2e\x38\x20\x31\
+\x32\x2e\x33\x35\x20\x34\x37\x2e\x37\x33\x20\x31\x38\x2e\x37\x37\
+\x20\x37\x31\x2e\x35\x32\x20\x31\x2e\x30\x36\x20\x34\x2e\x30\x32\
+\x20\x34\x2e\x38\x35\x20\x37\x2e\x33\x35\x20\x39\x2e\x31\x37\x20\
+\x36\x2e\x37\x38\x20\x38\x2e\x31\x37\x2d\x30\x2e\x36\x20\x31\x35\
+\x2e\x31\x39\x2d\x35\x2e\x34\x32\x20\x32\x32\x2e\x31\x36\x2d\x39\
+\x2e\x32\x37\x2d\x31\x34\x2e\x39\x31\x20\x31\x35\x2e\x30\x39\x2d\
+\x32\x39\x2e\x39\x32\x20\x33\x30\x2e\x31\x32\x2d\x34\x34\x2e\x39\
+\x39\x20\x34\x35\x2e\x30\x36\x2d\x30\x2e\x38\x39\x2d\x32\x34\x2e\
+\x32\x35\x2d\x32\x2e\x31\x39\x2d\x34\x38\x2e\x34\x39\x2d\x33\x2e\
+\x30\x32\x2d\x37\x32\x2e\x37\x35\x2d\x30\x2e\x38\x34\x2d\x31\x32\
+\x2e\x37\x35\x2d\x30\x2e\x37\x37\x2d\x32\x35\x2e\x35\x36\x2d\x32\
+\x2e\x30\x32\x2d\x33\x38\x2e\x32\x39\x2d\x31\x2e\x33\x34\x20\x31\
+\x37\x2e\x33\x38\x2d\x31\x2e\x35\x38\x20\x33\x34\x2e\x38\x34\x2d\
+\x32\x2e\x35\x35\x20\x35\x32\x2e\x32\x35\x2d\x30\x2e\x37\x32\x20\
+\x31\x39\x2e\x36\x2d\x31\x2e\x38\x37\x20\x33\x39\x2e\x31\x39\x2d\
+\x32\x2e\x35\x36\x20\x35\x38\x2e\x37\x39\x2d\x31\x35\x2e\x30\x39\
+\x2d\x31\x34\x2e\x39\x31\x2d\x33\x30\x2e\x30\x35\x2d\x32\x39\x2e\
+\x39\x36\x2d\x34\x34\x2e\x38\x38\x2d\x34\x35\x2e\x31\x32\x20\x37\
+\x2e\x32\x20\x33\x2e\x39\x37\x20\x31\x34\x2e\x34\x38\x20\x39\x2e\
+\x31\x20\x32\x32\x2e\x39\x39\x20\x39\x2e\x33\x32\x20\x34\x2e\x36\
+\x32\x20\x30\x2e\x31\x39\x20\x37\x2e\x38\x38\x2d\x34\x2e\x30\x35\
+\x20\x38\x2e\x37\x32\x2d\x38\x2e\x32\x31\x7a\x22\x2f\x3e\x3c\x70\
+\x61\x74\x68\x20\x64\x3d\x22\x6d\x31\x38\x2e\x34\x39\x20\x33\x34\
+\x2e\x34\x31\x63\x31\x30\x2e\x39\x35\x2d\x31\x34\x2e\x32\x31\x20\
+\x32\x37\x2e\x39\x2d\x32\x33\x2e\x34\x38\x20\x34\x35\x2e\x37\x33\
+\x2d\x32\x35\x2e\x33\x33\x2d\x31\x2e\x30\x33\x20\x33\x2e\x38\x33\
+\x2d\x32\x2e\x30\x39\x20\x37\x2e\x36\x36\x2d\x32\x2e\x39\x37\x20\
+\x31\x31\x2e\x35\x33\x2d\x31\x33\x2e\x38\x31\x20\x32\x2e\x37\x32\
+\x2d\x32\x36\x2e\x36\x34\x20\x31\x30\x2e\x34\x36\x2d\x33\x34\x2e\
+\x39\x34\x20\x32\x31\x2e\x39\x2d\x38\x2e\x33\x32\x20\x31\x31\x2e\
+\x31\x38\x2d\x31\x32\x2e\x32\x20\x32\x35\x2e\x36\x2d\x31\x30\x2e\
+\x34\x37\x20\x33\x39\x2e\x34\x34\x20\x31\x2e\x38\x31\x20\x31\x35\
+\x2e\x39\x38\x20\x31\x31\x2e\x30\x31\x20\x33\x30\x2e\x39\x31\x20\
+\x32\x34\x2e\x34\x32\x20\x33\x39\x2e\x37\x37\x20\x31\x33\x2e\x31\
+\x38\x20\x38\x2e\x39\x36\x20\x33\x30\x2e\x33\x20\x31\x31\x2e\x36\
+\x35\x20\x34\x35\x2e\x36\x33\x20\x37\x2e\x33\x36\x20\x31\x34\x2e\
+\x31\x38\x2d\x33\x2e\x38\x37\x20\x32\x36\x2e\x35\x39\x2d\x31\x33\
+\x2e\x36\x36\x20\x33\x33\x2e\x37\x33\x2d\x32\x36\x2e\x35\x20\x37\
+\x2e\x33\x32\x2d\x31\x32\x2e\x39\x33\x20\x39\x2e\x31\x32\x2d\x32\
+\x38\x2e\x38\x37\x20\x34\x2e\x37\x32\x2d\x34\x33\x2e\x30\x38\x2d\
+\x35\x2e\x36\x39\x2d\x31\x39\x2e\x36\x39\x2d\x32\x33\x2e\x31\x34\
+\x2d\x33\x35\x2e\x31\x34\x2d\x34\x33\x2e\x32\x37\x2d\x33\x38\x2e\
+\x38\x2d\x30\x2e\x39\x37\x2d\x33\x2e\x38\x38\x2d\x32\x2e\x30\x31\
+\x2d\x37\x2e\x37\x35\x2d\x32\x2e\x39\x38\x2d\x31\x31\x2e\x36\x33\
+\x20\x31\x34\x2e\x39\x37\x20\x31\x2e\x36\x20\x32\x39\x2e\x33\x37\
+\x20\x38\x2e\x33\x20\x34\x30\x2e\x30\x33\x20\x31\x38\x2e\x39\x35\
+\x20\x31\x30\x2e\x37\x37\x20\x31\x30\x2e\x35\x37\x20\x31\x37\x2e\
+\x37\x35\x20\x32\x34\x2e\x39\x32\x20\x31\x39\x2e\x33\x35\x20\x33\
+\x39\x2e\x39\x32\x20\x31\x2e\x39\x34\x20\x31\x36\x2e\x30\x35\x2d\
+\x32\x2e\x33\x20\x33\x32\x2e\x37\x35\x2d\x31\x31\x2e\x36\x33\x20\
+\x34\x35\x2e\x39\x35\x2d\x31\x30\x20\x31\x34\x2e\x33\x31\x2d\x32\
+\x35\x2e\x37\x38\x20\x32\x34\x2e\x34\x38\x2d\x34\x33\x2e\x30\x32\
+\x20\x32\x37\x2e\x34\x31\x2d\x31\x38\x2e\x30\x32\x20\x33\x2e\x32\
+\x2d\x33\x37\x2e\x33\x31\x2d\x31\x2e\x32\x35\x2d\x35\x31\x2e\x38\
+\x38\x2d\x31\x32\x2e\x33\x38\x2d\x31\x37\x2e\x31\x34\x2d\x31\x32\
+\x2e\x36\x32\x2d\x32\x37\x2e\x30\x38\x2d\x33\x33\x2e\x38\x34\x2d\
+\x32\x36\x2e\x37\x39\x2d\x35\x35\x20\x30\x2e\x37\x35\x2d\x31\x34\
+\x2e\x31\x39\x20\x35\x2e\x34\x37\x2d\x32\x38\x2e\x33\x31\x20\x31\
+\x34\x2e\x33\x34\x2d\x33\x39\x2e\x35\x31\x7a\x22\x2f\x3e\x3c\x2f\
+\x67\x3e\x3c\x2f\x73\x76\x67\x3e\x0a\
+\x00\x00\x02\xc3\
+\x00\
+\x00\x0a\x40\x78\x9c\xa5\x56\x4d\x6f\xda\x40\x10\xbd\xe7\x57\x4c\
+\x37\x97\x56\x8a\xb1\xd7\xf8\x93\x02\x91\x5a\x29\xbd\x10\xa9\x52\
+\x9a\x4b\x6e\x04\x6f\x6c\x0b\xc7\x4b\x8d\x03\xa4\xbf\xbe\x33\xb3\
+\xeb\x84\x56\x29\xaa\x36\x86\x79\xe0\xdd\x9d\xe7\x37\xcf\x3b\x96\
+\xa7\x97\x87\xc7\x06\x76\xaa\xdb\xd6\xba\x9d\x09\x39\x0a\x04\xa8\
+\x76\xa5\x8b\xba\x2d\x67\xe2\xf6\xc7\x95\x97\x89\xcb\xf9\xd9\x74\
+\xbb\x2b\x61\x5f\x17\x7d\x85\x6b\x92\xcd\x41\x40\xa5\xea\xb2\xea\
+\x87\xb3\x5d\xad\xf6\x5f\xf4\x61\x26\x02\x08\x40\x26\xf8\x15\xc7\
+\xa4\x52\x00\x5e\xa6\xdd\xce\x44\xd5\xf7\x9b\x89\xef\xef\xf7\xfb\
+\xd1\x7e\x3c\xd2\x5d\xe9\x87\x41\x10\xf8\x48\x6f\x97\x4c\x0e\x4d\
+\xdd\xae\xdf\x5a\x28\xf3\x3c\xf7\x79\x56\xc0\xb6\x7f\x6e\xd4\x4c\
+\xdc\x2f\x57\xeb\xb2\xd3\x4f\x6d\x31\x81\xf3\x2b\x3e\x3e\x8b\xf9\
+\x19\xe0\x31\xfd\xe0\x79\xf0\x4d\xb5\xaa\x5b\xf6\xba\x9b\xc0\xcd\
+\x5a\xf5\xab\x0a\xa2\x6c\x14\xc2\xc7\x28\x1d\x87\xe9\x27\xf0\xe0\
+\xe8\x2a\xf7\xba\x52\x8f\xf5\xd2\xd6\x3e\x5a\xe9\x47\x7f\x6b\x72\
+\x3c\xcf\x52\xf6\x75\xdf\xa8\xf9\x6d\xcb\xbf\x05\x84\x53\xdf\x8c\
+\x98\xd9\x42\x6d\x57\xf3\xaf\x9d\x5a\xf6\x38\xb7\xaf\xfb\xca\x5e\
+\x73\x34\xf5\x79\x6a\x58\xf5\xb0\x9d\xd3\x08\xfe\x98\x91\x12\xea\
+\x62\x26\xbe\x2f\x4b\xe5\x49\xaa\xac\xd3\x6b\x2c\xad\xd5\xad\x1a\
+\xce\xbc\xc1\x79\x01\x0f\x75\xd3\x0c\x93\xf4\xdf\xeb\x9e\xc8\x08\
+\xb5\x53\xad\x2e\x0a\x5b\xfb\x11\xed\xcf\xce\xc3\x82\xd4\x90\x78\
+\x1e\xf0\xf1\x47\x2e\x92\xfd\x52\x9d\x3e\xca\xe5\xfc\xcd\x12\x2b\
+\x40\x86\xeb\xe4\x22\x80\x45\x60\x20\x81\x45\x62\x20\x80\x3b\xb8\
+\x8e\x2f\x62\x58\x48\x03\x12\x16\xb1\x81\x18\xee\x04\x5f\xfc\xa6\
+\x5a\x6e\x94\xc0\x6a\x89\xeb\x6f\x7a\xdd\x3c\x97\xba\x3d\x5a\x07\
+\x1b\x5d\xb7\x3d\xee\x91\x10\x42\x88\x38\x18\x99\xc0\xac\xfe\x97\
+\xc4\xe0\x42\xb2\x28\x8b\x2c\xd5\x62\x42\x3a\x51\x9d\x91\x67\xd0\
+\xe8\x35\x28\xdf\x2d\x56\x92\x52\x03\xa4\x57\xfe\x8f\x60\xc9\x7e\
+\x4a\x36\x54\x26\x16\xcd\x08\x1b\x2b\x8d\xb3\xd2\x22\xca\x96\xb1\
+\xc5\xf7\xba\x2b\x43\x16\x69\xc0\x08\x3f\x21\xf8\x54\xe1\x29\xf6\
+\x3a\x45\x0e\x63\x8e\x0c\x39\x33\x27\xae\x14\xf3\xcd\x07\xef\x47\
+\x8a\xe0\xc4\x32\xc6\xd4\x98\x23\x23\x35\x4e\x1c\x39\x19\x92\x5a\
+\xa0\x92\x0c\x44\x24\x8d\x61\xec\x44\x9b\x20\x5d\x82\x44\x31\x47\
+\x0e\x29\x47\xea\xc4\x95\x01\x09\xa1\x20\xc6\xc4\xb1\xcc\x6c\xb0\
+\xdb\x7a\x9e\x71\xb8\xde\x3e\x56\xc2\x1c\xae\x55\xb1\xbf\xa8\xc4\
+\x62\x42\xba\xdc\x6a\x4b\x89\x23\xb3\x40\xc6\x3b\xf2\xb0\x31\xf8\
+\x14\xb1\x18\x92\xa2\xd0\x91\x89\x1a\x44\x92\x1e\x8c\xc0\x36\x0e\
+\xe9\xa3\x70\xdb\x51\x92\xfb\x17\x77\xa7\xc5\x84\x14\x3a\x56\x2a\
+\xf9\x21\x26\x23\x78\x25\x0d\x5d\x77\x3a\xb9\x65\xf3\x07\x3a\x79\
+\xfa\x99\x78\x82\x8b\x6d\xa7\x7c\x83\x63\xbe\x11\x8e\xba\x22\x4e\
+\x36\x72\xe2\x01\xc3\x17\xe3\x78\x16\x47\x02\x37\xf6\xf8\xe8\x56\
+\x44\xe6\x0d\x68\xf8\x46\xcc\xeb\xee\x40\x30\x6c\xc2\xb1\xc5\xd7\
+\xb6\x75\x55\x6b\x1f\x71\xd9\x4b\xa7\xe4\x43\xc7\x01\x77\xcf\xdb\
+\x2d\x3c\xf5\x4b\xfb\xca\x42\x7f\xa6\xf4\xd2\x36\xff\x0d\x2a\x0b\
+\xa9\xeb\
+\x00\x00\x05\x46\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\
+\x00\x00\x01\xfe\x50\x4c\x54\x45\x00\x00\x00\xbf\x9f\x40\xba\x9a\
+\x45\x5f\x9b\x73\x96\x79\x45\x97\x78\x44\xbb\x9b\x48\xba\x9a\x48\
+\x5d\x9b\x76\x99\xc6\xa0\x5e\x9c\x74\xba\x9a\x47\x97\x7a\x44\x5e\
+\x9b\x76\x95\x7a\x44\xb9\x9b\x48\x69\xa3\x7e\x87\xba\x95\xba\x9a\
+\x47\xb9\x9b\x48\x9b\xa7\x6d\x9b\xc0\x98\xb9\x9a\x47\x9e\x9b\x54\
+\x9e\xcc\xa8\x96\xb1\x81\x9a\xaa\x7c\xa2\x86\x45\xba\x9b\x48\x9a\
+\xc9\xa5\xba\x9a\x48\xba\x9a\x47\x99\x87\x4a\xaa\x9f\x57\xa6\x88\
+\x46\xba\x9a\x49\xba\x9a\x47\xbd\x9f\x4c\xbe\x9f\x4c\x5e\x9c\x76\
+\x63\xa0\x7a\x64\xa0\x7a\x67\xa1\x7e\x68\xa2\x7e\x6a\xa5\x7f\x6a\
+\xa5\x80\x6b\xa5\x80\x6f\xa8\x83\x70\xa9\x84\x71\xa8\x86\x72\xa8\
+\x87\x74\xad\x87\x75\xad\x87\x7a\xb1\x8c\x7b\xae\x8f\x7c\xae\x8f\
+\x80\xb5\x90\x80\xb6\x90\x85\xb4\x97\x86\xb5\x98\x8c\xbe\x99\x8c\
+\xbe\x9a\x8e\xc0\x9c\x90\xbb\xa1\x91\xc2\x9e\x92\x9d\x6f\x92\xc2\
+\x9e\x96\x7a\x44\x97\xc7\xa2\x9a\xc1\xa9\x9a\xc6\xa5\x9a\xc9\xa4\
+\x9c\xcb\xa6\x9d\xca\xa6\xa1\xca\xad\xa2\xcf\xaa\xa3\x88\x50\xa3\
+\xba\x91\xa3\xbe\x8e\xa4\xb9\x8f\xa4\xc6\x9b\xa5\x8a\x4e\xa7\x95\
+\x59\xa7\xbc\x91\xa7\xd2\xae\xa8\x8a\x46\xa8\x8b\x46\xa8\xbc\x92\
+\xa8\xd3\xaf\xa9\x8f\x55\xa9\x90\x56\xa9\xac\x6d\xaa\xbe\x94\xab\
+\xbf\x95\xab\xd6\xb1\xac\x8f\x4b\xac\x90\x4c\xac\xc0\x9c\xae\xc1\
+\x97\xae\xd8\xb4\xb0\x96\x5b\xb0\x97\x5c\xb1\xc3\x9a\xb1\xc3\xa1\
+\xb1\xd9\xb5\xb3\x98\x58\xb4\x9a\x57\xb4\xdb\xb8\xb4\xdc\xb8\xb4\
+\xdc\xb9\xb5\x9a\x57\xb6\xd9\xb2\xb8\xd3\xc3\xb9\x9f\x5c\xb9\xe0\
+\xbd\xba\x9b\x48\xba\x9f\x5d\xba\xa3\x55\xba\xb9\x7a\xba\xcf\x9f\
+\xba\xcf\xa0\xba\xdc\xb5\xba\xe0\xbc\xba\xe0\xbd\xbc\xb4\x95\xbe\
+\xa0\x4d\xbe\xe2\xc1\xc2\xa5\x54\xc2\xda\xcb\xc2\xe4\xc5\xc3\xad\
+\x6d\xc3\xda\xcc\xc6\xaa\x58\xc6\xaa\x59\xc7\xe6\xc9\xca\xb4\x73\
+\xcb\xaf\x5e\xcb\xb0\x5f\xcb\xe8\xcd\xcc\xe0\xd4\xcd\xe0\xd4\xcf\
+\xb5\x63\xd4\xec\xd6\xd6\xe6\xdc\xd7\xe7\xdd\xd8\xbf\x6f\xd8\xc0\
+\x6f\xdb\xeb\xdf\xdc\xc5\x75\xdd\xc4\x76\xe0\xec\xe5\xe5\xce\x80\
+\xe5\xd0\x8b\xe5\xf4\xe6\xe9\xd4\x86\xeb\xd8\x91\xeb\xf3\xee\xee\
+\xd9\x8c\xf2\xde\x91\xf2\xee\xe7\xf2\xfa\xf3\xf5\xf9\xf6\xf5\xf9\
+\xf7\xf6\xe3\x97\xf8\xe7\x9c\xf8\xfb\xf9\xfb\xe9\x9c\xfb\xfe\xfb\
+\xff\xee\xa3\xff\xff\xff\x27\x7f\x16\x80\x00\x00\x00\x27\x74\x52\
+\x4e\x53\x00\x10\x30\x33\x3f\x40\x40\x60\x66\x66\x67\x6f\x7f\x80\
+\x80\x80\x88\x8c\x90\xa0\xab\xab\xaf\xb3\xb3\xb8\xbf\xbf\xbf\xc0\
+\xc0\xcf\xd9\xda\xdf\xe1\xf0\xfd\xfe\x60\x74\xe8\x32\x00\x00\x02\
+\xd0\x49\x44\x41\x54\x58\xc3\xed\x96\x57\x5b\x13\x41\x14\x86\x83\
+\xd8\x45\xb0\x1b\x7b\x41\x3d\x29\x2a\x9a\x4d\x5c\x75\x37\x46\x49\
+\x54\xec\x0d\x35\x60\xef\x2d\xd6\x01\x2c\x6b\x14\x09\x1a\xb0\x01\
+\x8a\x8a\x04\xd4\x45\x24\xbb\xff\xd2\x29\xe9\x59\x63\x66\x73\xc3\
+\x45\xbe\x8b\x64\x92\xd9\x79\x9f\xf3\x9d\x39\x67\x66\x2d\x96\xb2\
+\xca\x2a\x6b\xbc\xa8\x72\x66\x09\xaa\xc4\x80\xe9\x50\x82\xa6\x52\
+\x40\xa3\x62\x52\x8d\xe3\x1f\xd0\xe0\x75\x63\x79\xf7\x99\x03\x84\
+\xbc\x24\x4b\xa2\x48\x3e\xbd\x21\x7e\x40\xc0\x0e\x52\xbb\xaa\x63\
+\xa9\xed\x12\xd8\x03\xbc\x00\x19\xc4\x1e\x3d\xa5\x1e\x11\xbc\x7c\
+\x00\x19\x7c\xaa\x9e\x21\x55\x02\x99\x07\x10\x00\x9f\x9e\x23\x09\
+\x02\xc5\x03\x42\x76\x51\xcd\x05\xa8\xa2\x3d\x54\x34\x40\x86\x5e\
+\x3d\x4f\x3d\xf9\x26\xb2\x00\xa1\x7a\xb7\x7b\x6b\x90\x4d\x80\xa4\
+\x1b\x48\xb2\xb3\xd9\xa0\xd7\xed\xa9\xcf\x03\x04\x37\x82\x63\x33\
+\x30\x9f\x0d\x10\x31\x02\x44\xa0\x81\xe5\x07\x44\x27\xd4\x5d\xc9\
+\x01\xac\x77\xbc\xd3\xf5\xa1\x2d\x70\x80\x3a\x18\x31\x02\xa8\xd4\
+\x43\x10\x76\xe3\xfc\x7c\x75\xd5\x65\x03\x02\xf0\x80\x3e\xe3\xf0\
+\xe0\xff\x05\xd0\x0d\x05\x74\xd2\x45\xc7\xef\x49\x38\x19\x00\x19\
+\x58\xda\xb7\x03\x79\x46\x32\x06\x88\x02\x9e\xb4\xf9\xd2\xe1\x94\
+\x02\x18\xc9\x01\x24\x2d\x38\x0b\x59\x90\xf7\x92\x1c\xee\xa1\xe3\
+\xcf\xf2\x79\x45\xb9\x29\xcf\x4e\x25\x71\x93\x93\x24\x51\x2c\x94\
+\xc4\x78\x62\xf7\x3f\xc6\x75\xfd\xd7\x2b\x36\xb6\xa6\xb7\x71\x03\
+\x38\x5d\x85\xb7\xf1\x7b\xaa\x80\xde\xbc\x48\x8e\xac\x19\x85\xb4\
+\x53\x10\xb6\x15\x2a\xa4\x9f\x37\x0e\x5d\xa7\xba\x7c\xf6\xc4\xe9\
+\x73\x6c\x74\x64\xf1\xc4\xe2\x4b\xf9\xb9\xdf\x50\xc6\xcd\x64\x13\
+\xf3\xb2\x10\xbf\xb4\xeb\xf8\x85\x87\xd9\xba\x7d\x72\x65\xf5\xbf\
+\xda\x39\xcf\xc4\x5b\x45\x69\xeb\xd2\xb2\x35\x8c\x16\x16\x38\x50\
+\xb2\x62\xf8\x83\xd7\x73\x01\xc8\x91\x96\x91\x87\xde\xfd\x0a\x2f\
+\x40\x09\xd8\x40\x8a\xd0\x28\x86\x22\x12\xec\xe0\x07\x28\x21\xd9\
+\x96\x3c\xd6\x6d\xf2\xdd\x67\x04\xf0\x92\xac\x1a\xbd\x7a\x0d\xab\
+\x83\x01\xe6\xfd\xe7\x62\x91\x05\x41\xf0\xc8\xf4\x18\x78\xa4\x28\
+\x4f\xd0\x27\xb2\x2c\x4a\x76\x2f\x86\x07\xbf\x5f\xa3\xf9\x7c\x57\
+\x5b\x1b\xea\x1e\xc3\x0b\x9b\xfc\xfe\x28\xfe\x1a\x0c\xa3\xa3\x56\
+\x0e\x00\x31\xf1\x18\x85\x87\x35\x2d\xe6\x6f\xc2\xeb\xfb\x50\xeb\
+\x7d\xc5\xca\x7b\xb9\x3e\x6d\x45\x5f\xb0\x89\x98\x36\xd6\x8d\xda\
+\x52\xbd\x50\xa4\xdc\x77\x48\x6a\xcf\x50\x1b\x3f\xc2\xe8\x70\xb2\
+\x99\x8a\x7f\xc5\x99\xb5\x8c\x68\x15\xc2\x2e\xfa\xd1\x22\xfa\x63\
+\x9a\x89\x77\xaa\x1a\x06\x30\xfd\x4e\x56\xb1\x82\x01\x66\x98\x5c\
+\x3f\x79\x0d\xea\x27\x25\xd0\x89\x16\x54\x58\x4c\xc5\xbf\x6e\x98\
+\x95\x71\x1f\xaa\x9d\xc0\x1f\xfe\x52\xd4\x45\x2a\x89\x94\xa1\x36\
+\xb8\x96\xdb\x46\x45\x2d\x0d\x5f\x1b\x3d\x48\x0a\x91\xd8\x98\xc3\
+\x07\x98\x8b\xbe\xd1\xe8\x3b\x58\x2b\x68\xda\x07\xc4\xe7\x62\x79\
+\x27\x5d\x36\x80\x7b\xa9\x39\xd1\xce\x53\xf8\x00\x5d\xcc\x00\xe9\
+\xc6\x28\x03\xd4\x98\x00\x74\xb0\xd3\x38\x66\x16\x30\x90\x38\xce\
+\x9b\x4d\x02\x98\x81\x84\x09\x3e\xc0\xa4\xaa\xd5\x17\x5b\x5a\x8e\
+\xa5\xaf\x94\x5b\x2d\xf7\x4e\x2d\xa9\x2a\x1e\x50\x6d\x7c\x33\xfd\
+\x05\x88\x32\x2b\x72\xf6\xce\x3a\x9c\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x04\x92\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\
+\x00\x00\x04\x59\x49\x44\x41\x54\x78\xda\xed\x58\x5b\x4f\x13\x41\
+\x14\xe6\x27\xf0\x13\xf8\x07\x6e\xc0\x08\x21\x41\x2b\x8a\x62\x17\
+\x63\x13\xdf\x85\x07\x9f\x7c\x90\xbe\x68\x21\xc6\x08\xbe\x10\x13\
+\xed\xa2\x80\x5c\x5a\xd9\xaa\x04\x04\x81\x96\x3b\x72\x6b\x95\x16\
+\x24\x51\xdb\x27\xa3\x09\x09\x24\x26\x5c\xd5\x82\x10\x6e\x22\xe3\
+\x9c\x2d\x85\xd2\x6e\xb7\xbb\xdb\x42\x98\x65\x4e\xf2\x85\x65\x77\
+\x67\x77\xbf\xef\x7c\xe7\xcc\x4c\x93\x92\x68\xd0\xa0\x41\x83\x06\
+\x8d\x63\x13\x45\x1c\x9f\x52\xc4\x59\x79\x13\x67\xf5\xe3\xbf\x08\
+\x60\xe2\x2c\xde\x62\xb3\x35\x5f\xf3\xe4\xef\x72\x56\x43\x28\xf1\
+\x70\xe0\x6b\x76\x23\xc7\x27\x6b\x92\xfc\x1d\xae\x8e\x91\x22\x1f\
+\x02\x5e\x93\x02\x98\xcc\x16\x47\x28\x51\xf3\xcb\x56\xd4\x3e\xe4\
+\x46\x03\x9e\x4f\x11\x22\x80\x58\x9a\x22\x0f\xb6\x0e\x27\xd9\xd0\
+\x35\x24\x90\x17\x13\xc0\x64\xb6\x96\x6b\xac\xf1\x59\x74\x62\x76\
+\x0f\x8a\x10\x71\xcd\x6c\x71\x51\x01\xb4\x5e\x02\x52\x02\x10\x5b\
+\x02\xf6\x61\x4f\x81\x63\xd8\x63\x77\x8c\x78\x50\x18\xbc\xd5\xcd\
+\x5d\x13\xf7\x9e\xf1\xf2\x1c\x80\xd7\x0a\x64\x11\x77\x8e\xeb\x30\
+\xc9\x29\x11\xe2\x07\xd0\x36\xf8\x61\xe7\x51\x7d\xb3\xe4\x34\x48\
+\x5c\xf6\x85\xac\xc7\x20\x1e\x8e\xea\xe6\x4e\x71\x01\xcc\x56\x1b\
+\x89\x99\x47\x6a\x50\xd1\x68\x9f\xdc\x25\x3d\x0d\xc4\xa1\x51\x12\
+\x46\xde\x9b\xec\x18\x71\xfb\xc5\xc8\xb5\xbc\x73\xa1\x32\xcb\x6b\
+\x74\xf3\x7e\x19\x2a\x7d\x5e\x1f\x55\x04\x2c\x60\x4a\x12\xa9\x81\
+\xad\x5f\x12\x4e\xa8\xa1\x7b\x10\x19\xcb\x9e\xa2\xeb\xb7\x8b\xf7\
+\x20\x29\xc0\x88\xdb\x46\xb2\x00\xd3\xe1\x84\x6a\x9b\x3b\x04\xd2\
+\xc6\xb2\x72\x74\xc3\xf4\x30\xa6\x00\x01\x17\x78\xc9\xdb\xfc\x80\
+\x75\xa3\x59\x1f\x00\xc7\xb7\x4a\x1f\xcb\x14\x60\x5c\x47\xa2\x00\
+\x31\x9b\x9f\x6c\x01\x86\xdd\xc6\x13\x2e\x80\xa7\xe4\x64\x0b\xe0\
+\x1c\x33\x10\x28\x00\x4c\x81\x89\x12\xc0\x43\xe6\xde\xdf\x3e\xe2\
+\x71\xc4\x2b\x00\xcc\x24\xe4\x4e\x83\x31\xca\x40\x9e\x00\x04\x36\
+\x40\xb9\x2e\x78\xc2\xbf\x11\xc8\xc3\xda\x20\xca\x22\xc8\x47\xfc\
+\x3e\x1f\x7a\x01\x10\x51\xba\x0f\xc0\xd6\x5f\x22\xb6\xf6\xe3\x15\
+\x01\xee\xd5\x0c\xf9\x83\x4b\x63\xb7\x11\x32\x2b\x99\x75\x3c\xe7\
+\x13\xb9\xf4\x55\xe6\x88\x31\x83\x40\x74\xd8\x53\x0e\x9b\x9d\x00\
+\x69\x02\xe7\xfa\x13\x1b\x68\x40\xcf\xa0\xfe\xbc\x42\xd4\xc7\xf2\
+\xa8\x2f\xcf\x89\x81\x0e\xa0\x97\xf5\x62\x70\xa8\x2f\x37\x45\x3b\
+\xa4\xfb\xf5\xd7\x02\x84\xd9\xa9\x08\xc2\xd2\xc0\x02\xb1\xf9\xe4\
+\x66\x1a\x48\xf7\xe6\xf9\x15\x92\x8e\x04\x3c\x43\x85\x2b\xfc\x1c\
+\x93\x3c\x5b\xc5\x3c\xc0\x98\xc2\x40\x33\x95\x8c\x7f\xae\x8a\x29\
+\x0c\x5e\x9f\xad\x60\x74\xc2\xf5\x4a\x26\x71\x22\xe3\x0f\xd6\xa9\
+\xc8\x74\x42\x5d\x31\x5b\xcd\xa4\x60\xb2\x1c\x10\x06\xe2\xe1\x98\
+\xa9\x3a\x65\x0d\x8a\xb2\x7f\x8e\xf1\xc2\xb8\x04\x65\xfe\xd0\xc8\
+\x4b\xba\x02\x08\x60\x32\xbc\x18\x69\x9c\x65\x24\x7a\x3e\x04\xf3\
+\x35\x69\x8d\x20\xae\xd0\x87\x02\xef\xb0\x03\x1f\x35\x2e\xf0\x1d\
+\x89\x08\xbb\xd8\xe9\xd6\x7b\x97\x1b\xb2\x3e\xcf\xd7\xa4\x46\x27\
+\x2e\x21\xc0\x42\x6d\x1a\x5a\x6d\x3a\x87\x76\x7a\xf4\x3b\xa2\x42\
+\x2b\x6d\xc8\xa8\x4f\x5f\x70\x94\x02\x04\xf1\xaf\x5b\x8f\xd6\x5a\
+\xce\x0b\x84\x62\x65\x1b\xf0\xab\x3e\x5d\xb8\x5f\x86\xdb\xca\x95\
+\x09\xe0\x34\x24\x63\x2b\x2d\xa9\xce\x68\x0f\xfb\x35\x9e\xf1\x00\
+\xc8\x68\x34\xe2\x4b\xaf\x32\xd1\x96\xe3\x92\x92\x72\x73\xa9\x28\
+\x03\xd6\xa6\xe6\xc3\xb7\xbb\x72\x27\x02\xf5\x98\xba\xbd\xd2\x98\
+\x35\x8a\x6d\x39\xa9\x56\x04\x20\xba\x5f\xdf\xa9\x68\xa5\xf1\xac\
+\xe0\x12\x15\xcf\x2a\x39\xb2\x66\xb8\xd1\x96\xf3\x3e\x3c\x63\x8b\
+\x75\xa7\x7f\x6c\xb5\xe7\xb8\xb0\xa8\xcb\x4a\x9e\xb5\xd9\x9e\xb3\
+\xf7\x8c\xd5\x26\x9d\x4a\x37\x61\x27\x62\x47\xab\x9d\x12\x7d\x6a\
+\xba\xfb\x5a\x4b\xf6\x97\x85\x9a\xb4\x45\x31\xfb\x82\x2b\xb6\x3b\
+\xaf\x7c\x94\xf3\xac\xf5\xd6\x0b\x7b\xe3\x36\xdb\x72\xd4\x90\xb7\
+\xa9\x26\x9f\x88\x66\x08\xdd\xfd\x4f\x43\x96\x5b\x4c\x08\x70\x05\
+\x26\xe8\xc4\x25\x32\x13\x6d\x3c\x34\xb9\xe0\xfd\xb8\xb4\x64\x26\
+\x80\x9d\x06\xcb\xc7\x45\x3c\x66\x33\xc4\x4d\x65\xf7\x45\xb2\x6d\
+\xb8\xd1\x76\xd1\xf5\xd3\x7a\xe6\xbb\x98\x18\x7e\x5b\xe6\xe2\xfa\
+\xdb\xec\x90\xf7\xb0\xcb\xe0\x94\xbd\x6e\xff\x22\x7d\x4b\x4e\xa3\
+\x83\x84\x25\x7e\x49\x7c\xa0\x19\xe2\xe3\x90\x85\xc5\xee\xaa\xd1\
+\xa6\x6c\x86\xd0\x7f\x03\x57\xcc\x55\xa7\x2e\xcb\x99\xea\x00\x58\
+\xec\x1f\x92\x36\xc7\xdf\x71\xc8\x7b\x02\x69\x4b\x09\x4e\xe9\x65\
+\x8d\x4a\x5d\xf1\xb7\xe3\xf2\xa8\x9f\xcf\xf0\x45\x23\x0e\x22\x81\
+\x60\xa2\x8d\x0d\xbe\xe9\x38\xee\x38\xd5\xb8\x02\x32\x0c\x25\xf2\
+\xbb\x3e\xc3\x17\x04\xfc\x1f\x51\x7e\x82\xc0\xb8\x2f\x25\xa2\xbe\
+\x0f\x5d\x08\x55\xae\x88\xea\x16\xc7\xa1\xda\xfc\x58\xba\x42\xc8\
+\x3e\x8c\xd1\xd2\x0f\x2b\x72\x5c\x01\xd7\xe0\x1e\x12\x6c\x1e\x97\
+\x18\xbd\x57\x0d\x01\x6b\x0b\x99\x5e\x12\x8e\xf1\x39\xfa\xa3\x23\
+\x0d\x1a\x34\x68\xd0\xa0\x41\x83\x06\x8d\xa3\x89\xff\x22\x07\xb5\
+\xf4\xf6\x9b\xe6\xc0\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x22\xba\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x32\x33\x2e\x30\x2e\x32\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\x73\
+\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\x3d\x22\x4c\x61\
+\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\
+\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\
+\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\x3a\
+\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\
+\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\x22\
+\x30\x70\x78\x22\x0d\x0a\x09\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\
+\x22\x30\x20\x30\x20\x33\x31\x39\x2e\x35\x39\x20\x32\x32\x31\x2e\
+\x36\x33\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x65\x6e\x61\x62\x6c\
+\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3a\x6e\x65\x77\
+\x20\x30\x20\x30\x20\x33\x31\x39\x2e\x35\x39\x20\x32\x32\x31\x2e\
+\x36\x33\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\
+\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x73\x74\x79\
+\x6c\x65\x20\x74\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x63\x73\
+\x73\x22\x3e\x0d\x0a\x09\x2e\x73\x74\x30\x7b\x66\x69\x6c\x6c\x2d\
+\x72\x75\x6c\x65\x3a\x65\x76\x65\x6e\x6f\x64\x64\x3b\x63\x6c\x69\
+\x70\x2d\x72\x75\x6c\x65\x3a\x65\x76\x65\x6e\x6f\x64\x64\x3b\x66\
+\x69\x6c\x6c\x3a\x23\x45\x31\x45\x31\x45\x31\x3b\x7d\x0d\x0a\x09\
+\x2e\x73\x74\x31\x7b\x66\x69\x6c\x6c\x3a\x23\x46\x46\x36\x36\x30\
+\x30\x3b\x7d\x0d\x0a\x09\x2e\x73\x74\x32\x7b\x66\x69\x6c\x6c\x3a\
+\x23\x34\x43\x34\x43\x34\x43\x3b\x7d\x0d\x0a\x09\x2e\x73\x74\x33\
+\x7b\x66\x69\x6c\x6c\x3a\x23\x46\x46\x46\x46\x46\x46\x3b\x7d\x0d\
+\x0a\x3c\x2f\x73\x74\x79\x6c\x65\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\
+\x09\x3c\x70\x61\x74\x68\x20\x63\x6c\x61\x73\x73\x3d\x22\x73\x74\
+\x30\x22\x20\x64\x3d\x22\x4d\x31\x36\x32\x2e\x39\x32\x2c\x31\x31\
+\x38\x2e\x33\x39\x63\x34\x38\x2e\x37\x36\x2c\x30\x2c\x38\x38\x2e\
+\x32\x38\x2c\x32\x2e\x33\x38\x2c\x38\x38\x2e\x32\x38\x2c\x35\x2e\
+\x33\x31\x63\x30\x2c\x32\x2e\x39\x33\x2d\x33\x39\x2e\x35\x33\x2c\
+\x35\x2e\x33\x31\x2d\x38\x38\x2e\x32\x38\x2c\x35\x2e\x33\x31\x63\
+\x2d\x34\x38\x2e\x37\x36\x2c\x30\x2d\x38\x38\x2e\x32\x38\x2d\x32\
+\x2e\x33\x38\x2d\x38\x38\x2e\x32\x38\x2d\x35\x2e\x33\x31\x0d\x0a\
+\x09\x09\x43\x37\x34\x2e\x36\x33\x2c\x31\x32\x30\x2e\x37\x37\x2c\
+\x31\x31\x34\x2e\x31\x36\x2c\x31\x31\x38\x2e\x33\x39\x2c\x31\x36\
+\x32\x2e\x39\x32\x2c\x31\x31\x38\x2e\x33\x39\x4c\x31\x36\x32\x2e\
+\x39\x32\x2c\x31\x31\x38\x2e\x33\x39\x7a\x22\x2f\x3e\x0d\x0a\x09\
+\x3c\x70\x61\x74\x68\x20\x63\x6c\x61\x73\x73\x3d\x22\x73\x74\x31\
+\x22\x20\x64\x3d\x22\x4d\x39\x36\x2e\x36\x32\x2c\x35\x39\x2e\x33\
+\x32\x63\x2d\x32\x2e\x37\x33\x2d\x33\x2e\x37\x32\x2d\x35\x2e\x37\
+\x35\x2d\x38\x2e\x36\x2d\x39\x2e\x30\x36\x2d\x31\x34\x2e\x37\x39\
+\x63\x2d\x31\x2e\x38\x39\x2d\x33\x2e\x32\x37\x2d\x32\x2e\x30\x38\
+\x2d\x34\x2e\x37\x39\x2c\x31\x2e\x30\x37\x2d\x36\x2e\x31\x33\x6c\
+\x35\x36\x2e\x38\x33\x2d\x32\x33\x2e\x35\x31\x0d\x0a\x09\x09\x63\
+\x31\x2e\x36\x2d\x30\x2e\x37\x2c\x33\x2e\x37\x2d\x30\x2e\x37\x31\
+\x2c\x35\x2e\x30\x36\x2c\x31\x2e\x37\x35\x63\x37\x2e\x36\x34\x2c\
+\x31\x31\x2e\x32\x39\x2c\x31\x33\x2e\x32\x2c\x31\x39\x2e\x32\x33\
+\x2c\x32\x31\x2e\x31\x2c\x32\x37\x2e\x38\x63\x31\x32\x2e\x31\x35\
+\x2c\x31\x32\x2e\x35\x38\x2c\x32\x35\x2e\x35\x33\x2c\x32\x36\x2e\
+\x32\x32\x2c\x34\x38\x2e\x37\x33\x2c\x33\x36\x2e\x31\x32\x63\x37\
+\x2e\x33\x32\x2c\x32\x2e\x37\x2c\x31\x34\x2e\x34\x38\x2c\x34\x2e\
+\x39\x33\x2c\x32\x32\x2e\x39\x32\x2c\x36\x2e\x33\x36\x0d\x0a\x09\
+\x09\x63\x30\x2e\x33\x32\x2c\x30\x2e\x30\x35\x2c\x31\x2e\x38\x38\
+\x2c\x30\x2e\x38\x2c\x31\x2e\x37\x37\x2c\x32\x2e\x31\x34\x6c\x2d\
+\x30\x2e\x32\x33\x2c\x31\x33\x2e\x32\x36\x6c\x2d\x33\x39\x2e\x34\
+\x31\x2c\x32\x32\x2e\x36\x33\x63\x2d\x32\x2c\x31\x2e\x37\x36\x2d\
+\x33\x2e\x39\x31\x2c\x33\x2e\x32\x38\x2d\x38\x2e\x34\x2c\x31\x2e\
+\x38\x34\x4c\x37\x39\x2e\x38\x2c\x31\x30\x32\x2e\x34\x6c\x2d\x30\
+\x2e\x30\x32\x2d\x37\x2e\x38\x36\x6c\x2d\x39\x2e\x32\x39\x2d\x32\
+\x2e\x34\x0d\x0a\x09\x09\x63\x2d\x30\x2e\x37\x32\x2d\x30\x2e\x31\
+\x38\x2d\x30\x2e\x37\x33\x2d\x31\x2e\x31\x33\x2d\x30\x2e\x31\x34\
+\x2d\x31\x2e\x35\x33\x6c\x39\x2e\x37\x35\x2d\x37\x2e\x39\x34\x63\
+\x2d\x30\x2e\x30\x34\x2d\x31\x2e\x35\x33\x2c\x30\x2e\x34\x2d\x32\
+\x2e\x35\x2c\x31\x2e\x31\x36\x2d\x33\x2e\x34\x36\x63\x2d\x34\x2e\
+\x32\x38\x2d\x31\x2e\x35\x2d\x35\x2e\x39\x37\x2d\x33\x2e\x33\x39\
+\x2d\x33\x2e\x32\x32\x2d\x35\x2e\x39\x37\x6c\x31\x37\x2e\x32\x31\
+\x2d\x31\x32\x2e\x37\x35\x4c\x39\x36\x2e\x36\x32\x2c\x35\x39\x2e\
+\x33\x32\x0d\x0a\x09\x09\x4c\x39\x36\x2e\x36\x32\x2c\x35\x39\x2e\
+\x33\x32\x7a\x22\x2f\x3e\x0d\x0a\x09\x3c\x67\x3e\x0d\x0a\x09\x09\
+\x3c\x70\x61\x74\x68\x20\x63\x6c\x61\x73\x73\x3d\x22\x73\x74\x32\
+\x22\x20\x64\x3d\x22\x4d\x31\x39\x2e\x34\x31\x2c\x31\x38\x36\x2e\
+\x36\x34\x76\x2d\x32\x37\x2e\x30\x35\x63\x30\x2d\x37\x2e\x30\x34\
+\x2c\x34\x2e\x35\x38\x2d\x31\x31\x2e\x36\x32\x2c\x31\x31\x2e\x34\
+\x31\x2d\x31\x31\x2e\x36\x32\x63\x36\x2e\x39\x2c\x30\x2c\x31\x31\
+\x2e\x34\x38\x2c\x34\x2e\x35\x38\x2c\x31\x31\x2e\x34\x38\x2c\x31\
+\x31\x2e\x36\x32\x76\x31\x2e\x33\x34\x0d\x0a\x09\x09\x09\x63\x30\
+\x2c\x30\x2e\x34\x32\x2d\x30\x2e\x32\x38\x2c\x30\x2e\x37\x38\x2d\
+\x30\x2e\x37\x2c\x30\x2e\x37\x38\x6c\x2d\x32\x2e\x33\x32\x2c\x30\
+\x2e\x31\x34\x63\x2d\x30\x2e\x34\x32\x2c\x30\x2d\x30\x2e\x37\x2d\
+\x30\x2e\x32\x38\x2d\x30\x2e\x37\x2d\x30\x2e\x37\x76\x2d\x31\x2e\
+\x37\x36\x63\x30\x2d\x34\x2e\x38\x36\x2d\x33\x2e\x31\x2d\x38\x2e\
+\x31\x2d\x37\x2e\x37\x35\x2d\x38\x2e\x31\x63\x2d\x34\x2e\x36\x35\
+\x2c\x30\x2d\x37\x2e\x36\x38\x2c\x33\x2e\x32\x34\x2d\x37\x2e\x36\
+\x38\x2c\x38\x2e\x31\x76\x32\x37\x2e\x35\x34\x0d\x0a\x09\x09\x09\
+\x63\x30\x2c\x34\x2e\x38\x36\x2c\x33\x2e\x30\x33\x2c\x38\x2e\x31\
+\x37\x2c\x37\x2e\x36\x38\x2c\x38\x2e\x31\x37\x63\x34\x2e\x36\x35\
+\x2c\x30\x2c\x37\x2e\x37\x35\x2d\x33\x2e\x33\x31\x2c\x37\x2e\x37\
+\x35\x2d\x38\x2e\x31\x37\x76\x2d\x31\x2e\x36\x32\x63\x30\x2d\x30\
+\x2e\x34\x32\x2c\x30\x2e\x32\x38\x2d\x30\x2e\x37\x2c\x30\x2e\x37\
+\x2d\x30\x2e\x37\x6c\x32\x2e\x33\x32\x2c\x30\x2e\x31\x34\x63\x30\
+\x2e\x34\x32\x2c\x30\x2c\x30\x2e\x37\x2c\x30\x2e\x32\x38\x2c\x30\
+\x2e\x37\x2c\x30\x2e\x37\x76\x31\x2e\x32\x0d\x0a\x09\x09\x09\x63\
+\x30\x2c\x37\x2e\x31\x31\x2d\x34\x2e\x35\x38\x2c\x31\x31\x2e\x37\
+\x36\x2d\x31\x31\x2e\x34\x38\x2c\x31\x31\x2e\x37\x36\x43\x32\x33\
+\x2e\x39\x39\x2c\x31\x39\x38\x2e\x34\x2c\x31\x39\x2e\x34\x31\x2c\
+\x31\x39\x33\x2e\x37\x35\x2c\x31\x39\x2e\x34\x31\x2c\x31\x38\x36\
+\x2e\x36\x34\x7a\x22\x2f\x3e\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\
+\x20\x63\x6c\x61\x73\x73\x3d\x22\x73\x74\x32\x22\x20\x64\x3d\x22\
+\x4d\x37\x30\x2e\x36\x39\x2c\x31\x37\x33\x2e\x35\x34\x76\x32\x33\
+\x2e\x36\x63\x30\x2c\x30\x2e\x34\x32\x2d\x30\x2e\x32\x38\x2c\x30\
+\x2e\x37\x2d\x30\x2e\x37\x2c\x30\x2e\x37\x68\x2d\x32\x2e\x33\x32\
+\x63\x2d\x30\x2e\x34\x32\x2c\x30\x2d\x30\x2e\x37\x2d\x30\x2e\x32\
+\x38\x2d\x30\x2e\x37\x2d\x30\x2e\x37\x76\x2d\x32\x2e\x35\x34\x0d\
+\x0a\x09\x09\x09\x63\x30\x2d\x30\x2e\x32\x38\x2d\x30\x2e\x32\x31\
+\x2d\x30\x2e\x33\x35\x2d\x30\x2e\x33\x35\x2d\x30\x2e\x31\x34\x63\
+\x2d\x31\x2e\x38\x33\x2c\x32\x2e\x37\x35\x2d\x34\x2e\x37\x39\x2c\
+\x33\x2e\x39\x34\x2d\x38\x2e\x31\x37\x2c\x33\x2e\x39\x34\x63\x2d\
+\x34\x2e\x30\x31\x2c\x30\x2d\x39\x2e\x31\x36\x2d\x31\x2e\x37\x36\
+\x2d\x39\x2e\x31\x36\x2d\x39\x2e\x38\x36\x63\x30\x2d\x38\x2e\x31\
+\x37\x2c\x35\x2e\x31\x34\x2d\x31\x31\x2e\x33\x34\x2c\x31\x31\x2e\
+\x39\x2d\x31\x31\x2e\x33\x34\x68\x35\x2e\x34\x39\x0d\x0a\x09\x09\
+\x09\x63\x30\x2e\x31\x34\x2c\x30\x2c\x30\x2e\x32\x38\x2d\x30\x2e\
+\x31\x34\x2c\x30\x2e\x32\x38\x2d\x30\x2e\x32\x38\x76\x2d\x33\x2e\
+\x32\x34\x63\x30\x2d\x35\x2e\x31\x34\x2d\x32\x2e\x34\x2d\x38\x2e\
+\x35\x39\x2d\x36\x2e\x35\x35\x2d\x38\x2e\x35\x39\x63\x2d\x33\x2e\
+\x32\x34\x2c\x30\x2d\x35\x2e\x39\x39\x2c\x32\x2e\x32\x35\x2d\x36\
+\x2e\x33\x34\x2c\x35\x2e\x35\x37\x63\x30\x2c\x30\x2e\x34\x39\x2d\
+\x30\x2e\x32\x38\x2c\x30\x2e\x37\x2d\x30\x2e\x37\x2c\x30\x2e\x37\
+\x6c\x2d\x32\x2e\x35\x34\x2d\x30\x2e\x31\x34\x0d\x0a\x09\x09\x09\
+\x63\x2d\x30\x2e\x34\x32\x2c\x30\x2d\x30\x2e\x37\x2d\x30\x2e\x32\
+\x38\x2d\x30\x2e\x36\x33\x2d\x30\x2e\x37\x63\x30\x2e\x35\x36\x2d\
+\x35\x2e\x32\x38\x2c\x34\x2e\x39\x33\x2d\x38\x2e\x37\x33\x2c\x31\
+\x30\x2e\x32\x38\x2d\x38\x2e\x37\x33\x43\x36\x36\x2e\x38\x39\x2c\
+\x31\x36\x31\x2e\x37\x37\x2c\x37\x30\x2e\x36\x39\x2c\x31\x36\x36\
+\x2e\x34\x32\x2c\x37\x30\x2e\x36\x39\x2c\x31\x37\x33\x2e\x35\x34\
+\x7a\x20\x4d\x36\x36\x2e\x39\x36\x2c\x31\x38\x37\x2e\x32\x37\x76\
+\x2d\x36\x2e\x36\x39\x0d\x0a\x09\x09\x09\x63\x30\x2d\x30\x2e\x31\
+\x34\x2d\x30\x2e\x31\x34\x2d\x30\x2e\x32\x38\x2d\x30\x2e\x32\x38\
+\x2d\x30\x2e\x32\x38\x68\x2d\x35\x2e\x34\x39\x63\x2d\x34\x2e\x37\
+\x32\x2c\x30\x2d\x38\x2e\x31\x2c\x32\x2e\x35\x34\x2d\x38\x2e\x31\
+\x2c\x37\x2e\x39\x36\x63\x30\x2c\x34\x2e\x38\x36\x2c\x32\x2e\x36\
+\x38\x2c\x36\x2e\x38\x33\x2c\x36\x2e\x31\x33\x2c\x36\x2e\x38\x33\
+\x43\x36\x33\x2e\x30\x32\x2c\x31\x39\x35\x2e\x30\x39\x2c\x36\x36\
+\x2e\x39\x36\x2c\x31\x39\x32\x2e\x36\x32\x2c\x36\x36\x2e\x39\x36\
+\x2c\x31\x38\x37\x2e\x32\x37\x0d\x0a\x09\x09\x09\x7a\x22\x2f\x3e\
+\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x63\x6c\x61\x73\x73\x3d\
+\x22\x73\x74\x32\x22\x20\x64\x3d\x22\x4d\x37\x37\x2e\x38\x31\x2c\
+\x31\x38\x39\x2e\x32\x34\x76\x2d\x30\x2e\x34\x32\x63\x30\x2d\x30\
+\x2e\x34\x32\x2c\x30\x2e\x32\x38\x2d\x30\x2e\x37\x2c\x30\x2e\x37\
+\x2d\x30\x2e\x37\x68\x32\x2e\x31\x38\x63\x30\x2e\x34\x32\x2c\x30\
+\x2c\x30\x2e\x37\x2c\x30\x2e\x32\x31\x2c\x30\x2e\x37\x2c\x30\x2e\
+\x35\x36\x76\x30\x2e\x35\x36\x63\x30\x2c\x33\x2e\x33\x31\x2c\x32\
+\x2e\x36\x31\x2c\x35\x2e\x39\x32\x2c\x36\x2e\x35\x35\x2c\x35\x2e\
+\x39\x32\x0d\x0a\x09\x09\x09\x63\x33\x2e\x38\x2c\x30\x2c\x36\x2e\
+\x32\x37\x2d\x32\x2e\x35\x34\x2c\x36\x2e\x32\x37\x2d\x36\x2e\x32\
+\x63\x30\x2d\x34\x2e\x33\x37\x2d\x33\x2e\x36\x36\x2d\x35\x2e\x38\
+\x35\x2d\x37\x2e\x34\x37\x2d\x37\x2e\x34\x63\x2d\x34\x2e\x30\x39\
+\x2d\x31\x2e\x36\x39\x2d\x38\x2e\x37\x33\x2d\x33\x2e\x37\x33\x2d\
+\x38\x2e\x37\x33\x2d\x31\x30\x2e\x31\x34\x63\x30\x2d\x35\x2e\x37\
+\x38\x2c\x33\x2e\x39\x34\x2d\x39\x2e\x33\x37\x2c\x39\x2e\x37\x39\
+\x2d\x39\x2e\x33\x37\x0d\x0a\x09\x09\x09\x63\x36\x2e\x30\x36\x2c\
+\x30\x2c\x39\x2e\x38\x36\x2c\x33\x2e\x38\x37\x2c\x39\x2e\x38\x36\
+\x2c\x39\x2e\x33\x37\x76\x30\x2e\x32\x31\x63\x30\x2c\x30\x2e\x34\
+\x32\x2d\x30\x2e\x32\x38\x2c\x30\x2e\x37\x2d\x30\x2e\x37\x2c\x30\
+\x2e\x37\x68\x2d\x32\x2e\x31\x31\x63\x2d\x30\x2e\x34\x32\x2c\x30\
+\x2d\x30\x2e\x37\x2d\x30\x2e\x32\x38\x2d\x30\x2e\x37\x2d\x30\x2e\
+\x35\x36\x76\x2d\x30\x2e\x34\x39\x63\x30\x2d\x33\x2e\x33\x38\x2d\
+\x32\x2e\x35\x34\x2d\x36\x2e\x31\x33\x2d\x36\x2e\x33\x34\x2d\x36\
+\x2e\x31\x33\x0d\x0a\x09\x09\x09\x73\x2d\x36\x2e\x32\x2c\x32\x2e\
+\x36\x31\x2d\x36\x2e\x32\x2c\x36\x2e\x32\x63\x30\x2c\x34\x2e\x30\
+\x38\x2c\x33\x2e\x33\x38\x2c\x35\x2e\x34\x39\x2c\x37\x2e\x30\x34\
+\x2c\x37\x2e\x31\x31\x63\x34\x2e\x32\x33\x2c\x31\x2e\x37\x36\x2c\
+\x39\x2e\x33\x2c\x33\x2e\x38\x37\x2c\x39\x2e\x33\x2c\x31\x30\x2e\
+\x33\x35\x63\x30\x2c\x35\x2e\x36\x34\x2d\x33\x2e\x39\x34\x2c\x39\
+\x2e\x33\x37\x2d\x31\x30\x2c\x39\x2e\x33\x37\x0d\x0a\x09\x09\x09\
+\x43\x38\x31\x2e\x37\x35\x2c\x31\x39\x38\x2e\x31\x39\x2c\x37\x37\
+\x2e\x38\x31\x2c\x31\x39\x34\x2e\x34\x36\x2c\x37\x37\x2e\x38\x31\
+\x2c\x31\x38\x39\x2e\x32\x34\x7a\x22\x2f\x3e\x0d\x0a\x09\x09\x3c\
+\x70\x61\x74\x68\x20\x63\x6c\x61\x73\x73\x3d\x22\x73\x74\x32\x22\
+\x20\x64\x3d\x22\x4d\x31\x32\x35\x2e\x34\x33\x2c\x31\x37\x32\x2e\
+\x38\x33\x76\x32\x34\x2e\x33\x63\x30\x2c\x30\x2e\x34\x32\x2d\x30\
+\x2e\x32\x38\x2c\x30\x2e\x37\x2d\x30\x2e\x37\x2c\x30\x2e\x37\x68\
+\x2d\x32\x2e\x33\x33\x63\x2d\x30\x2e\x34\x32\x2c\x30\x2d\x30\x2e\
+\x37\x2d\x30\x2e\x32\x38\x2d\x30\x2e\x37\x2d\x30\x2e\x37\x76\x2d\
+\x32\x33\x2e\x39\x35\x0d\x0a\x09\x09\x09\x63\x30\x2d\x35\x2e\x30\
+\x37\x2d\x32\x2e\x33\x32\x2d\x38\x2e\x30\x33\x2d\x36\x2e\x33\x34\
+\x2d\x38\x2e\x30\x33\x63\x2d\x34\x2e\x31\x36\x2c\x30\x2d\x36\x2e\
+\x36\x39\x2c\x33\x2e\x31\x37\x2d\x36\x2e\x36\x39\x2c\x38\x2e\x34\
+\x35\x76\x32\x33\x2e\x35\x33\x63\x30\x2c\x30\x2e\x34\x32\x2d\x30\
+\x2e\x32\x38\x2c\x30\x2e\x37\x2d\x30\x2e\x37\x2c\x30\x2e\x37\x68\
+\x2d\x32\x2e\x33\x33\x63\x2d\x30\x2e\x34\x32\x2c\x30\x2d\x30\x2e\
+\x37\x2d\x30\x2e\x32\x38\x2d\x30\x2e\x37\x2d\x30\x2e\x37\x76\x2d\
+\x34\x37\x2e\x39\x0d\x0a\x09\x09\x09\x63\x30\x2d\x30\x2e\x34\x32\
+\x2c\x30\x2e\x32\x38\x2d\x30\x2e\x37\x2c\x30\x2e\x37\x2d\x30\x2e\
+\x37\x68\x32\x2e\x33\x33\x63\x30\x2e\x34\x32\x2c\x30\x2c\x30\x2e\
+\x37\x2c\x30\x2e\x32\x38\x2c\x30\x2e\x37\x2c\x30\x2e\x37\x76\x31\
+\x36\x2e\x35\x35\x63\x30\x2c\x30\x2e\x32\x38\x2c\x30\x2e\x32\x31\
+\x2c\x30\x2e\x32\x38\x2c\x30\x2e\x33\x35\x2c\x30\x63\x31\x2e\x37\
+\x36\x2d\x32\x2e\x37\x35\x2c\x34\x2e\x34\x34\x2d\x33\x2e\x39\x34\
+\x2c\x37\x2e\x34\x37\x2d\x33\x2e\x39\x34\x0d\x0a\x09\x09\x09\x43\
+\x31\x32\x32\x2e\x31\x39\x2c\x31\x36\x31\x2e\x38\x34\x2c\x31\x32\
+\x35\x2e\x34\x33\x2c\x31\x36\x35\x2e\x39\x33\x2c\x31\x32\x35\x2e\
+\x34\x33\x2c\x31\x37\x32\x2e\x38\x33\x7a\x22\x2f\x3e\x0d\x0a\x09\
+\x09\x3c\x70\x61\x74\x68\x20\x63\x6c\x61\x73\x73\x3d\x22\x73\x74\
+\x32\x22\x20\x64\x3d\x22\x4d\x31\x33\x32\x2e\x38\x33\x2c\x31\x38\
+\x35\x2e\x37\x39\x76\x2d\x31\x2e\x39\x63\x30\x2d\x30\x2e\x34\x32\
+\x2c\x30\x2e\x32\x38\x2d\x30\x2e\x37\x31\x2c\x30\x2e\x37\x2d\x30\
+\x2e\x37\x31\x68\x35\x2e\x32\x31\x63\x30\x2e\x34\x32\x2c\x30\x2c\
+\x30\x2e\x37\x2c\x30\x2e\x32\x38\x2c\x30\x2e\x37\x2c\x30\x2e\x37\
+\x31\x76\x31\x2e\x35\x35\x0d\x0a\x09\x09\x09\x63\x30\x2c\x34\x2e\
+\x33\x37\x2c\x32\x2e\x34\x2c\x37\x2e\x31\x31\x2c\x35\x2e\x37\x38\
+\x2c\x37\x2e\x31\x31\x63\x33\x2e\x33\x31\x2c\x30\x2c\x35\x2e\x38\
+\x35\x2d\x32\x2e\x36\x38\x2c\x35\x2e\x38\x35\x2d\x36\x2e\x37\x36\
+\x63\x30\x2d\x34\x2e\x33\x2d\x32\x2e\x38\x32\x2d\x36\x2e\x32\x37\
+\x2d\x37\x2e\x38\x39\x2d\x31\x30\x63\x2d\x35\x2e\x34\x32\x2d\x34\
+\x2e\x30\x32\x2d\x31\x30\x2e\x34\x39\x2d\x37\x2e\x37\x35\x2d\x31\
+\x30\x2e\x34\x39\x2d\x31\x35\x2e\x34\x33\x0d\x0a\x09\x09\x09\x63\
+\x30\x2d\x37\x2e\x36\x38\x2c\x35\x2e\x30\x37\x2d\x31\x32\x2e\x34\
+\x2c\x31\x32\x2e\x31\x39\x2d\x31\x32\x2e\x34\x63\x37\x2e\x35\x34\
+\x2c\x30\x2c\x31\x32\x2e\x34\x37\x2c\x35\x2e\x32\x31\x2c\x31\x32\
+\x2e\x34\x37\x2c\x31\x33\x2e\x30\x33\x76\x31\x2e\x37\x36\x63\x30\
+\x2c\x30\x2e\x34\x32\x2d\x30\x2e\x32\x38\x2c\x30\x2e\x37\x2d\x30\
+\x2e\x37\x2c\x30\x2e\x37\x68\x2d\x35\x2e\x32\x31\x63\x2d\x30\x2e\
+\x34\x32\x2c\x30\x2d\x30\x2e\x37\x2d\x30\x2e\x32\x38\x2d\x30\x2e\
+\x37\x2d\x30\x2e\x37\x76\x2d\x31\x2e\x39\x0d\x0a\x09\x09\x09\x63\
+\x30\x2d\x34\x2e\x32\x33\x2d\x32\x2e\x34\x2d\x37\x2e\x30\x34\x2d\
+\x35\x2e\x38\x35\x2d\x37\x2e\x30\x34\x63\x2d\x33\x2e\x31\x37\x2c\
+\x30\x2d\x35\x2e\x34\x39\x2c\x32\x2e\x33\x32\x2d\x35\x2e\x34\x39\
+\x2c\x36\x2e\x35\x35\x63\x30\x2c\x34\x2e\x30\x31\x2c\x32\x2e\x30\
+\x34\x2c\x35\x2e\x39\x32\x2c\x37\x2e\x34\x37\x2c\x39\x2e\x39\x33\
+\x63\x37\x2e\x31\x38\x2c\x35\x2e\x33\x35\x2c\x31\x30\x2e\x39\x32\
+\x2c\x38\x2e\x33\x31\x2c\x31\x30\x2e\x39\x32\x2c\x31\x35\x2e\x30\
+\x37\x0d\x0a\x09\x09\x09\x63\x30\x2c\x37\x2e\x39\x36\x2d\x35\x2e\
+\x32\x31\x2c\x31\x33\x2e\x30\x33\x2d\x31\x32\x2e\x35\x34\x2c\x31\
+\x33\x2e\x30\x33\x43\x31\x33\x37\x2e\x38\x33\x2c\x31\x39\x38\x2e\
+\x34\x2c\x31\x33\x32\x2e\x38\x33\x2c\x31\x39\x33\x2e\x33\x33\x2c\
+\x31\x33\x32\x2e\x38\x33\x2c\x31\x38\x35\x2e\x37\x39\x7a\x22\x2f\
+\x3e\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x63\x6c\x61\x73\x73\
+\x3d\x22\x73\x74\x32\x22\x20\x64\x3d\x22\x4d\x31\x38\x37\x2e\x33\
+\x35\x2c\x31\x37\x32\x2e\x39\x37\x76\x32\x34\x2e\x31\x36\x63\x30\
+\x2c\x30\x2e\x34\x32\x2d\x30\x2e\x32\x38\x2c\x30\x2e\x37\x2d\x30\
+\x2e\x37\x2c\x30\x2e\x37\x68\x2d\x35\x2e\x33\x35\x63\x2d\x30\x2e\
+\x34\x32\x2c\x30\x2d\x30\x2e\x37\x2d\x30\x2e\x32\x38\x2d\x30\x2e\
+\x37\x2d\x30\x2e\x37\x76\x2d\x32\x33\x2e\x36\x0d\x0a\x09\x09\x09\
+\x63\x30\x2d\x33\x2e\x39\x35\x2d\x31\x2e\x37\x36\x2d\x36\x2e\x32\
+\x2d\x34\x2e\x37\x39\x2d\x36\x2e\x32\x63\x2d\x33\x2e\x32\x34\x2c\
+\x30\x2d\x35\x2e\x31\x34\x2c\x32\x2e\x34\x2d\x35\x2e\x31\x34\x2c\
+\x36\x2e\x34\x38\x76\x32\x33\x2e\x33\x31\x63\x30\x2c\x30\x2e\x34\
+\x32\x2d\x30\x2e\x32\x38\x2c\x30\x2e\x37\x2d\x30\x2e\x37\x2c\x30\
+\x2e\x37\x68\x2d\x35\x2e\x33\x35\x63\x2d\x30\x2e\x34\x32\x2c\x30\
+\x2d\x30\x2e\x37\x2d\x30\x2e\x32\x38\x2d\x30\x2e\x37\x2d\x30\x2e\
+\x37\x76\x2d\x34\x37\x2e\x39\x0d\x0a\x09\x09\x09\x63\x30\x2d\x30\
+\x2e\x34\x32\x2c\x30\x2e\x32\x38\x2d\x30\x2e\x37\x2c\x30\x2e\x37\
+\x2d\x30\x2e\x37\x68\x35\x2e\x33\x35\x63\x30\x2e\x34\x32\x2c\x30\
+\x2c\x30\x2e\x37\x2c\x30\x2e\x32\x38\x2c\x30\x2e\x37\x2c\x30\x2e\
+\x37\x76\x31\x35\x2e\x32\x39\x63\x30\x2c\x30\x2e\x32\x31\x2c\x30\
+\x2e\x32\x31\x2c\x30\x2e\x32\x38\x2c\x30\x2e\x34\x32\x2c\x30\x2e\
+\x30\x37\x63\x31\x2e\x39\x2d\x32\x2e\x33\x32\x2c\x34\x2e\x35\x38\
+\x2d\x33\x2e\x31\x2c\x37\x2e\x31\x31\x2d\x33\x2e\x31\x0d\x0a\x09\
+\x09\x09\x43\x31\x38\x34\x2e\x31\x31\x2c\x31\x36\x31\x2e\x34\x39\
+\x2c\x31\x38\x37\x2e\x33\x35\x2c\x31\x36\x35\x2e\x37\x32\x2c\x31\
+\x38\x37\x2e\x33\x35\x2c\x31\x37\x32\x2e\x39\x37\x7a\x22\x2f\x3e\
+\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x63\x6c\x61\x73\x73\x3d\
+\x22\x73\x74\x32\x22\x20\x64\x3d\x22\x4d\x32\x31\x31\x2e\x33\x2c\
+\x31\x36\x31\x2e\x39\x38\x68\x35\x2e\x33\x35\x63\x30\x2e\x34\x32\
+\x2c\x30\x2c\x30\x2e\x37\x2c\x30\x2e\x32\x38\x2c\x30\x2e\x37\x2c\
+\x30\x2e\x37\x76\x33\x34\x2e\x34\x34\x63\x30\x2c\x30\x2e\x34\x32\
+\x2d\x30\x2e\x32\x38\x2c\x30\x2e\x37\x2d\x30\x2e\x37\x2c\x30\x2e\
+\x37\x68\x2d\x35\x2e\x33\x35\x63\x2d\x30\x2e\x34\x32\x2c\x30\x2d\
+\x30\x2e\x37\x2d\x30\x2e\x32\x38\x2d\x30\x2e\x37\x2d\x30\x2e\x37\
+\x0d\x0a\x09\x09\x09\x76\x2d\x32\x2e\x30\x34\x63\x30\x2d\x30\x2e\
+\x32\x38\x2d\x30\x2e\x32\x31\x2d\x30\x2e\x32\x38\x2d\x30\x2e\x33\
+\x35\x2d\x30\x2e\x30\x37\x63\x2d\x31\x2e\x35\x35\x2c\x32\x2e\x34\
+\x36\x2d\x33\x2e\x39\x34\x2c\x33\x2e\x33\x31\x2d\x36\x2e\x37\x36\
+\x2c\x33\x2e\x33\x31\x63\x2d\x35\x2e\x32\x38\x2c\x30\x2d\x39\x2e\
+\x34\x34\x2d\x33\x2e\x30\x33\x2d\x39\x2e\x34\x34\x2d\x31\x30\x2e\
+\x34\x32\x76\x2d\x32\x35\x2e\x32\x32\x63\x30\x2d\x30\x2e\x34\x32\
+\x2c\x30\x2e\x32\x38\x2d\x30\x2e\x37\x2c\x30\x2e\x37\x2d\x30\x2e\
+\x37\x0d\x0a\x09\x09\x09\x68\x35\x2e\x33\x35\x63\x30\x2e\x34\x32\
+\x2c\x30\x2c\x30\x2e\x37\x2c\x30\x2e\x32\x38\x2c\x30\x2e\x37\x2c\
+\x30\x2e\x37\x76\x32\x33\x2e\x37\x34\x63\x30\x2c\x34\x2e\x30\x38\
+\x2c\x31\x2e\x36\x39\x2c\x36\x2e\x30\x36\x2c\x34\x2e\x37\x39\x2c\
+\x36\x2e\x30\x36\x63\x33\x2e\x31\x37\x2c\x30\x2c\x35\x2d\x32\x2e\
+\x34\x37\x2c\x35\x2d\x36\x2e\x34\x38\x76\x2d\x32\x33\x2e\x33\x31\
+\x0d\x0a\x09\x09\x09\x43\x32\x31\x30\x2e\x36\x2c\x31\x36\x32\x2e\
+\x32\x37\x2c\x32\x31\x30\x2e\x38\x38\x2c\x31\x36\x31\x2e\x39\x38\
+\x2c\x32\x31\x31\x2e\x33\x2c\x31\x36\x31\x2e\x39\x38\x7a\x22\x2f\
+\x3e\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x63\x6c\x61\x73\x73\
+\x3d\x22\x73\x74\x32\x22\x20\x64\x3d\x22\x4d\x32\x35\x32\x2e\x30\
+\x32\x2c\x31\x36\x31\x2e\x37\x63\x30\x2c\x30\x2e\x31\x34\x2c\x30\
+\x2e\x31\x34\x2c\x30\x2e\x32\x38\x2c\x30\x2e\x32\x38\x2c\x30\x2e\
+\x32\x38\x68\x34\x2e\x38\x36\x63\x30\x2e\x34\x32\x2c\x30\x2c\x30\
+\x2e\x37\x2c\x30\x2e\x32\x38\x2c\x30\x2e\x37\x2c\x30\x2e\x37\x76\
+\x33\x2e\x35\x32\x63\x30\x2c\x30\x2e\x34\x32\x2d\x30\x2e\x32\x38\
+\x2c\x30\x2e\x37\x2d\x30\x2e\x37\x2c\x30\x2e\x37\x68\x2d\x34\x2e\
+\x38\x36\x0d\x0a\x09\x09\x09\x63\x2d\x30\x2e\x31\x34\x2c\x30\x2d\
+\x30\x2e\x32\x38\x2c\x30\x2e\x31\x34\x2d\x30\x2e\x32\x38\x2c\x30\
+\x2e\x32\x38\x76\x32\x39\x2e\x39\x34\x63\x30\x2c\x30\x2e\x34\x32\
+\x2d\x30\x2e\x32\x38\x2c\x30\x2e\x37\x2d\x30\x2e\x37\x2c\x30\x2e\
+\x37\x68\x2d\x35\x2e\x33\x35\x63\x2d\x30\x2e\x34\x32\x2c\x30\x2d\
+\x30\x2e\x37\x2d\x30\x2e\x32\x38\x2d\x30\x2e\x37\x2d\x30\x2e\x37\
+\x56\x31\x36\x37\x2e\x32\x63\x30\x2d\x30\x2e\x31\x34\x2d\x30\x2e\
+\x31\x34\x2d\x30\x2e\x32\x38\x2d\x30\x2e\x32\x38\x2d\x30\x2e\x32\
+\x38\x0d\x0a\x09\x09\x09\x68\x2d\x31\x31\x2e\x34\x38\x63\x2d\x30\
+\x2e\x31\x34\x2c\x30\x2d\x30\x2e\x32\x38\x2c\x30\x2e\x31\x34\x2d\
+\x30\x2e\x32\x38\x2c\x30\x2e\x32\x38\x76\x32\x39\x2e\x39\x34\x63\
+\x30\x2c\x30\x2e\x34\x32\x2d\x30\x2e\x32\x38\x2c\x30\x2e\x37\x2d\
+\x30\x2e\x37\x2c\x30\x2e\x37\x68\x2d\x35\x2e\x33\x35\x63\x2d\x30\
+\x2e\x34\x32\x2c\x30\x2d\x30\x2e\x37\x2d\x30\x2e\x32\x38\x2d\x30\
+\x2e\x37\x2d\x30\x2e\x37\x56\x31\x36\x37\x2e\x32\x0d\x0a\x09\x09\
+\x09\x63\x30\x2d\x30\x2e\x31\x34\x2d\x30\x2e\x31\x34\x2d\x30\x2e\
+\x32\x38\x2d\x30\x2e\x32\x38\x2d\x30\x2e\x32\x38\x68\x2d\x32\x2e\
+\x36\x38\x63\x2d\x30\x2e\x34\x32\x2c\x30\x2d\x30\x2e\x37\x2d\x30\
+\x2e\x32\x38\x2d\x30\x2e\x37\x2d\x30\x2e\x37\x76\x2d\x33\x2e\x35\
+\x32\x63\x30\x2d\x30\x2e\x34\x32\x2c\x30\x2e\x32\x38\x2d\x30\x2e\
+\x37\x2c\x30\x2e\x37\x2d\x30\x2e\x37\x68\x32\x2e\x36\x38\x63\x30\
+\x2e\x31\x34\x2c\x30\x2c\x30\x2e\x32\x38\x2d\x30\x2e\x31\x34\x2c\
+\x30\x2e\x32\x38\x2d\x30\x2e\x32\x38\x0d\x0a\x09\x09\x09\x76\x2d\
+\x32\x2e\x38\x32\x63\x30\x2d\x37\x2e\x38\x39\x2c\x33\x2e\x34\x35\
+\x2d\x31\x30\x2e\x39\x39\x2c\x31\x31\x2e\x31\x33\x2d\x31\x30\x2e\
+\x37\x38\x68\x30\x2e\x34\x39\x63\x30\x2e\x34\x32\x2c\x30\x2c\x30\
+\x2e\x37\x2c\x30\x2e\x32\x38\x2c\x30\x2e\x37\x2c\x30\x2e\x37\x76\
+\x33\x2e\x33\x38\x63\x30\x2c\x30\x2e\x34\x32\x2d\x30\x2e\x32\x31\
+\x2c\x30\x2e\x37\x2d\x30\x2e\x35\x36\x2c\x30\x2e\x37\x68\x2d\x30\
+\x2e\x36\x33\x0d\x0a\x09\x09\x09\x63\x2d\x33\x2e\x34\x35\x2c\x30\
+\x2e\x30\x37\x2d\x34\x2e\x33\x37\x2c\x32\x2e\x36\x31\x2d\x34\x2e\
+\x33\x37\x2c\x36\x2e\x35\x35\x76\x32\x2e\x32\x35\x63\x30\x2c\x30\
+\x2e\x31\x34\x2c\x30\x2e\x31\x34\x2c\x30\x2e\x32\x38\x2c\x30\x2e\
+\x32\x38\x2c\x30\x2e\x32\x38\x68\x31\x31\x2e\x34\x38\x63\x30\x2e\
+\x31\x34\x2c\x30\x2c\x30\x2e\x32\x38\x2d\x30\x2e\x31\x34\x2c\x30\
+\x2e\x32\x38\x2d\x30\x2e\x32\x38\x76\x2d\x32\x2e\x38\x32\x0d\x0a\
+\x09\x09\x09\x63\x30\x2d\x37\x2e\x38\x39\x2c\x33\x2e\x34\x35\x2d\
+\x31\x30\x2e\x39\x39\x2c\x31\x31\x2e\x31\x33\x2d\x31\x30\x2e\x37\
+\x38\x68\x30\x2e\x34\x39\x63\x30\x2e\x34\x32\x2c\x30\x2c\x30\x2e\
+\x37\x2c\x30\x2e\x32\x38\x2c\x30\x2e\x37\x2c\x30\x2e\x37\x76\x33\
+\x2e\x33\x38\x63\x30\x2c\x30\x2e\x34\x32\x2d\x30\x2e\x32\x31\x2c\
+\x30\x2e\x37\x2d\x30\x2e\x35\x36\x2c\x30\x2e\x37\x68\x2d\x30\x2e\
+\x36\x33\x0d\x0a\x09\x09\x09\x63\x2d\x33\x2e\x34\x35\x2c\x30\x2e\
+\x30\x37\x2d\x34\x2e\x33\x37\x2c\x32\x2e\x36\x31\x2d\x34\x2e\x33\
+\x37\x2c\x36\x2e\x35\x35\x56\x31\x36\x31\x2e\x37\x7a\x20\x4d\x32\
+\x36\x33\x2e\x39\x32\x2c\x31\x34\x38\x2e\x35\x33\x68\x35\x2e\x33\
+\x35\x63\x30\x2e\x34\x32\x2c\x30\x2c\x30\x2e\x37\x2c\x30\x2e\x32\
+\x38\x2c\x30\x2e\x37\x2c\x30\x2e\x37\x76\x34\x37\x2e\x39\x63\x30\
+\x2c\x30\x2e\x34\x32\x2d\x30\x2e\x32\x38\x2c\x30\x2e\x37\x2d\x30\
+\x2e\x37\x2c\x30\x2e\x37\x68\x2d\x35\x2e\x33\x35\x0d\x0a\x09\x09\
+\x09\x63\x2d\x30\x2e\x34\x32\x2c\x30\x2d\x30\x2e\x37\x31\x2d\x30\
+\x2e\x32\x38\x2d\x30\x2e\x37\x31\x2d\x30\x2e\x37\x76\x2d\x34\x37\
+\x2e\x39\x43\x32\x36\x33\x2e\x32\x32\x2c\x31\x34\x38\x2e\x38\x31\
+\x2c\x32\x36\x33\x2e\x35\x2c\x31\x34\x38\x2e\x35\x33\x2c\x32\x36\
+\x33\x2e\x39\x32\x2c\x31\x34\x38\x2e\x35\x33\x7a\x22\x2f\x3e\x0d\
+\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x63\x6c\x61\x73\x73\x3d\x22\
+\x73\x74\x32\x22\x20\x64\x3d\x22\x4d\x32\x39\x39\x2e\x33\x36\x2c\
+\x31\x38\x32\x2e\x36\x39\x68\x2d\x31\x35\x2e\x39\x32\x63\x2d\x30\
+\x2e\x31\x34\x2c\x30\x2d\x30\x2e\x32\x38\x2c\x30\x2e\x31\x34\x2d\
+\x30\x2e\x32\x38\x2c\x30\x2e\x32\x38\x76\x33\x2e\x38\x63\x30\x2c\
+\x33\x2e\x33\x38\x2c\x32\x2e\x31\x31\x2c\x35\x2e\x37\x38\x2c\x35\
+\x2e\x30\x37\x2c\x35\x2e\x37\x38\x63\x32\x2e\x36\x38\x2c\x30\x2c\
+\x34\x2e\x35\x31\x2d\x31\x2e\x38\x33\x2c\x35\x2d\x34\x2e\x33\x0d\
+\x0a\x09\x09\x09\x63\x30\x2e\x31\x34\x2d\x30\x2e\x34\x32\x2c\x30\
+\x2e\x33\x35\x2d\x30\x2e\x35\x36\x2c\x30\x2e\x37\x37\x2d\x30\x2e\
+\x35\x36\x6c\x35\x2e\x32\x31\x2c\x30\x2e\x32\x38\x63\x30\x2e\x34\
+\x32\x2c\x30\x2c\x30\x2e\x37\x2c\x30\x2e\x32\x38\x2c\x30\x2e\x36\
+\x33\x2c\x30\x2e\x37\x63\x2d\x30\x2e\x36\x33\x2c\x35\x2e\x39\x39\
+\x2d\x34\x2e\x36\x35\x2c\x39\x2e\x37\x32\x2d\x31\x31\x2e\x36\x32\
+\x2c\x39\x2e\x37\x32\x0d\x0a\x09\x09\x09\x63\x2d\x37\x2e\x32\x35\
+\x2c\x30\x2d\x31\x31\x2e\x38\x33\x2d\x34\x2e\x33\x37\x2d\x31\x31\
+\x2e\x38\x33\x2d\x31\x31\x2e\x31\x33\x76\x2d\x31\x34\x2e\x36\x35\
+\x63\x30\x2d\x36\x2e\x36\x32\x2c\x34\x2e\x35\x38\x2d\x31\x31\x2e\
+\x32\x2c\x31\x31\x2e\x38\x33\x2d\x31\x31\x2e\x32\x63\x37\x2e\x34\
+\x2c\x30\x2c\x31\x31\x2e\x38\x33\x2c\x34\x2e\x35\x38\x2c\x31\x31\
+\x2e\x38\x33\x2c\x31\x31\x2e\x32\x76\x39\x2e\x33\x37\x0d\x0a\x09\
+\x09\x09\x43\x33\x30\x30\x2e\x30\x36\x2c\x31\x38\x32\x2e\x34\x31\
+\x2c\x32\x39\x39\x2e\x37\x38\x2c\x31\x38\x32\x2e\x36\x39\x2c\x32\
+\x39\x39\x2e\x33\x36\x2c\x31\x38\x32\x2e\x36\x39\x7a\x20\x4d\x32\
+\x38\x33\x2e\x31\x36\x2c\x31\x37\x33\x2e\x30\x34\x76\x33\x2e\x37\
+\x33\x63\x30\x2c\x30\x2e\x31\x34\x2c\x30\x2e\x31\x34\x2c\x30\x2e\
+\x32\x38\x2c\x30\x2e\x32\x38\x2c\x30\x2e\x32\x38\x68\x39\x2e\x36\
+\x35\x63\x30\x2e\x31\x34\x2c\x30\x2c\x30\x2e\x32\x38\x2d\x30\x2e\
+\x31\x34\x2c\x30\x2e\x32\x38\x2d\x30\x2e\x32\x38\x0d\x0a\x09\x09\
+\x09\x76\x2d\x33\x2e\x37\x33\x63\x30\x2d\x33\x2e\x33\x38\x2d\x32\
+\x2e\x30\x34\x2d\x35\x2e\x37\x38\x2d\x35\x2e\x31\x34\x2d\x35\x2e\
+\x37\x38\x43\x32\x38\x35\x2e\x32\x37\x2c\x31\x36\x37\x2e\x32\x37\
+\x2c\x32\x38\x33\x2e\x31\x36\x2c\x31\x36\x39\x2e\x36\x36\x2c\x32\
+\x38\x33\x2e\x31\x36\x2c\x31\x37\x33\x2e\x30\x34\x7a\x22\x2f\x3e\
+\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x09\x3c\x70\x61\x74\x68\x20\
+\x63\x6c\x61\x73\x73\x3d\x22\x73\x74\x33\x22\x20\x64\x3d\x22\x4d\
+\x32\x34\x31\x2e\x39\x34\x2c\x38\x38\x2e\x37\x35\x4c\x31\x39\x39\
+\x2e\x30\x32\x2c\x31\x31\x33\x63\x2d\x31\x39\x2e\x37\x36\x2d\x34\
+\x2e\x30\x36\x2d\x33\x36\x2e\x35\x31\x2d\x31\x30\x2e\x30\x36\x2d\
+\x35\x30\x2e\x35\x37\x2d\x31\x37\x2e\x30\x38\x63\x33\x2e\x36\x37\
+\x2c\x30\x2e\x38\x36\x2c\x37\x2e\x36\x33\x2c\x31\x2e\x33\x33\x2c\
+\x31\x31\x2e\x37\x36\x2c\x31\x2e\x33\x33\x0d\x0a\x09\x09\x63\x31\
+\x38\x2e\x39\x37\x2c\x30\x2c\x33\x34\x2e\x33\x35\x2d\x39\x2e\x39\
+\x34\x2c\x33\x34\x2e\x33\x35\x2d\x32\x32\x2e\x31\x39\x63\x30\x2d\
+\x32\x2e\x38\x36\x2d\x30\x2e\x38\x34\x2d\x35\x2e\x36\x2d\x32\x2e\
+\x33\x37\x2d\x38\x2e\x31\x31\x43\x32\x30\x36\x2e\x39\x36\x2c\x37\
+\x38\x2e\x31\x37\x2c\x32\x32\x33\x2e\x39\x32\x2c\x38\x36\x2e\x37\
+\x31\x2c\x32\x34\x31\x2e\x39\x34\x2c\x38\x38\x2e\x37\x35\x4c\x32\
+\x34\x31\x2e\x39\x34\x2c\x38\x38\x2e\x37\x35\x7a\x20\x4d\x31\x35\
+\x39\x2e\x38\x39\x2c\x35\x34\x2e\x34\x32\x0d\x0a\x09\x09\x63\x31\
+\x37\x2e\x34\x32\x2c\x30\x2c\x33\x31\x2e\x35\x34\x2c\x38\x2e\x39\
+\x39\x2c\x33\x31\x2e\x35\x34\x2c\x32\x30\x2e\x30\x39\x73\x2d\x31\
+\x34\x2e\x31\x32\x2c\x32\x30\x2e\x30\x39\x2d\x33\x31\x2e\x35\x34\
+\x2c\x32\x30\x2e\x30\x39\x63\x2d\x31\x37\x2e\x34\x32\x2c\x30\x2d\
+\x33\x31\x2e\x35\x34\x2d\x38\x2e\x39\x39\x2d\x33\x31\x2e\x35\x34\
+\x2d\x32\x30\x2e\x30\x39\x53\x31\x34\x32\x2e\x34\x37\x2c\x35\x34\
+\x2e\x34\x32\x2c\x31\x35\x39\x2e\x38\x39\x2c\x35\x34\x2e\x34\x32\
+\x0d\x0a\x09\x09\x4c\x31\x35\x39\x2e\x38\x39\x2c\x35\x34\x2e\x34\
+\x32\x7a\x20\x4d\x31\x38\x30\x2e\x35\x31\x2c\x35\x37\x2e\x31\x37\
+\x63\x2d\x35\x2e\x36\x39\x2d\x32\x2e\x37\x2d\x31\x32\x2e\x37\x31\
+\x2d\x34\x2e\x32\x39\x2d\x32\x30\x2e\x33\x31\x2d\x34\x2e\x32\x39\
+\x63\x2d\x31\x38\x2e\x39\x37\x2c\x30\x2d\x33\x34\x2e\x33\x35\x2c\
+\x39\x2e\x39\x34\x2d\x33\x34\x2e\x33\x35\x2c\x32\x32\x2e\x31\x39\
+\x63\x30\x2c\x33\x2e\x34\x34\x2c\x31\x2e\x32\x31\x2c\x36\x2e\x36\
+\x39\x2c\x33\x2e\x33\x37\x2c\x39\x2e\x35\x39\x0d\x0a\x09\x09\x63\
+\x2d\x32\x30\x2e\x36\x37\x2d\x31\x34\x2e\x31\x36\x2d\x33\x33\x2e\
+\x30\x31\x2d\x33\x30\x2e\x32\x2d\x33\x38\x2e\x38\x33\x2d\x34\x32\
+\x2e\x37\x38\x6c\x35\x37\x2e\x32\x2d\x32\x34\x2e\x37\x38\x43\x31\
+\x35\x34\x2e\x39\x34\x2c\x32\x39\x2e\x33\x32\x2c\x31\x36\x36\x2e\
+\x33\x35\x2c\x34\x34\x2e\x31\x35\x2c\x31\x38\x30\x2e\x35\x31\x2c\
+\x35\x37\x2e\x31\x37\x4c\x31\x38\x30\x2e\x35\x31\x2c\x35\x37\x2e\
+\x31\x37\x7a\x20\x4d\x31\x35\x36\x2e\x38\x38\x2c\x35\x36\x2e\x36\
+\x32\x6c\x2d\x31\x2e\x34\x35\x2c\x34\x2e\x34\x0d\x0a\x09\x09\x6c\
+\x2d\x34\x2e\x35\x33\x2d\x30\x2e\x33\x32\x6c\x2d\x31\x2e\x30\x33\
+\x2c\x32\x2e\x37\x31\x63\x32\x2e\x37\x35\x2c\x30\x2e\x32\x35\x2c\
+\x33\x2e\x39\x36\x2d\x30\x2e\x30\x36\x2c\x33\x2e\x33\x2c\x32\x2e\
+\x30\x36\x6c\x2d\x34\x2e\x32\x37\x2c\x31\x33\x2e\x38\x35\x63\x2d\
+\x30\x2e\x34\x36\x2c\x31\x2e\x34\x38\x2d\x30\x2e\x38\x33\x2c\x31\
+\x2e\x32\x31\x2d\x32\x2e\x37\x38\x2c\x30\x2e\x39\x33\x6c\x2d\x32\
+\x2e\x32\x38\x2d\x30\x2e\x33\x32\x6c\x2d\x31\x2e\x32\x39\x2c\x33\
+\x2e\x38\x38\x6c\x34\x2e\x37\x37\x2c\x30\x2e\x38\x0d\x0a\x09\x09\
+\x6c\x2d\x31\x2e\x34\x31\x2c\x34\x2e\x39\x31\x6c\x36\x2e\x32\x38\
+\x2c\x31\x2e\x30\x38\x6c\x31\x2e\x34\x34\x2d\x35\x6c\x35\x2e\x31\
+\x32\x2c\x30\x2e\x37\x6c\x2d\x31\x2e\x32\x38\x2c\x35\x2e\x30\x38\
+\x6c\x36\x2e\x31\x32\x2c\x30\x2e\x38\x6c\x31\x2e\x32\x32\x2d\x35\
+\x2e\x31\x37\x63\x31\x2e\x37\x31\x2c\x30\x2e\x31\x32\x2c\x31\x2e\
+\x36\x37\x2c\x30\x2e\x30\x32\x2c\x32\x2e\x38\x36\x2d\x30\x2e\x31\
+\x34\x0d\x0a\x09\x09\x63\x32\x2e\x30\x37\x2d\x30\x2e\x32\x36\x2c\
+\x33\x2e\x37\x39\x2d\x30\x2e\x38\x35\x2c\x35\x2e\x31\x35\x2d\x31\
+\x2e\x37\x35\x63\x31\x2e\x33\x35\x2d\x30\x2e\x39\x2c\x32\x2e\x33\
+\x2d\x32\x2e\x34\x34\x2c\x32\x2e\x36\x37\x2d\x33\x2e\x37\x31\x63\
+\x30\x2e\x33\x31\x2d\x31\x2e\x30\x36\x2c\x30\x2e\x31\x35\x2d\x32\
+\x2e\x34\x39\x2d\x30\x2e\x32\x39\x2d\x33\x2e\x34\x35\x63\x2d\x30\
+\x2e\x34\x34\x2d\x30\x2e\x39\x37\x2d\x31\x2e\x31\x38\x2d\x31\x2e\
+\x37\x38\x2d\x32\x2e\x32\x32\x2d\x32\x2e\x34\x34\x0d\x0a\x09\x09\
+\x63\x2d\x30\x2e\x37\x32\x2d\x30\x2e\x34\x36\x2d\x31\x2e\x38\x2d\
+\x30\x2e\x39\x36\x2d\x33\x2e\x32\x35\x2d\x31\x2e\x34\x38\x63\x32\
+\x2e\x35\x32\x2d\x30\x2e\x32\x31\x2c\x34\x2e\x30\x32\x2d\x30\x2e\
+\x39\x36\x2c\x35\x2e\x36\x2d\x32\x2e\x34\x36\x63\x31\x2e\x36\x31\
+\x2d\x31\x2e\x35\x33\x2c\x31\x2e\x39\x33\x2d\x33\x2e\x35\x34\x2c\
+\x30\x2e\x38\x39\x2d\x35\x2e\x33\x31\x63\x2d\x31\x2e\x32\x38\x2d\
+\x32\x2e\x31\x36\x2d\x33\x2e\x39\x31\x2d\x33\x2e\x31\x37\x2d\x36\
+\x2e\x36\x35\x2d\x33\x2e\x37\x39\x0d\x0a\x09\x09\x6c\x31\x2e\x30\
+\x33\x2d\x34\x2e\x35\x39\x6c\x2d\x34\x2e\x30\x37\x2d\x30\x2e\x34\
+\x6c\x2d\x31\x2e\x33\x31\x2c\x34\x2e\x35\x35\x6c\x2d\x34\x2e\x37\
+\x31\x2d\x30\x2e\x34\x38\x6c\x31\x2e\x32\x33\x2d\x34\x2e\x33\x39\
+\x4c\x31\x35\x36\x2e\x38\x38\x2c\x35\x36\x2e\x36\x32\x4c\x31\x35\
+\x36\x2e\x38\x38\x2c\x35\x36\x2e\x36\x32\x7a\x20\x4d\x31\x35\x37\
+\x2e\x39\x32\x2c\x37\x30\x2e\x36\x6c\x31\x2e\x38\x31\x2d\x36\x2e\
+\x32\x32\x6c\x33\x2e\x36\x38\x2c\x30\x2e\x34\x32\x0d\x0a\x09\x09\
+\x63\x32\x2e\x31\x31\x2c\x30\x2e\x32\x34\x2c\x33\x2e\x35\x33\x2c\
+\x30\x2e\x36\x34\x2c\x34\x2e\x32\x38\x2c\x30\x2e\x39\x35\x63\x33\
+\x2e\x32\x2c\x31\x2e\x33\x2c\x32\x2e\x31\x34\x2c\x35\x2e\x33\x31\
+\x2d\x31\x2e\x39\x32\x2c\x35\x2e\x36\x39\x63\x2d\x30\x2e\x39\x36\
+\x2c\x30\x2e\x30\x39\x2d\x32\x2e\x33\x39\x2d\x30\x2e\x30\x31\x2d\
+\x34\x2e\x32\x36\x2d\x30\x2e\x32\x39\x4c\x31\x35\x37\x2e\x39\x32\
+\x2c\x37\x30\x2e\x36\x4c\x31\x35\x37\x2e\x39\x32\x2c\x37\x30\x2e\
+\x36\x7a\x0d\x0a\x09\x09\x20\x4d\x31\x35\x36\x2e\x39\x32\x2c\x37\
+\x34\x2e\x30\x36\x6c\x34\x2e\x32\x34\x2c\x30\x2e\x36\x35\x63\x31\
+\x2e\x38\x36\x2c\x30\x2e\x32\x38\x2c\x33\x2e\x32\x31\x2c\x30\x2e\
+\x36\x32\x2c\x34\x2e\x30\x34\x2c\x31\x2e\x30\x31\x63\x30\x2e\x38\
+\x33\x2c\x30\x2e\x33\x39\x2c\x31\x2e\x34\x31\x2c\x30\x2e\x38\x36\
+\x2c\x31\x2e\x37\x31\x2c\x31\x2e\x34\x32\x63\x30\x2e\x33\x32\x2c\
+\x30\x2e\x35\x36\x2c\x30\x2e\x33\x37\x2c\x31\x2e\x32\x2c\x30\x2e\
+\x31\x36\x2c\x31\x2e\x39\x31\x0d\x0a\x09\x09\x63\x2d\x30\x2e\x32\
+\x34\x2c\x30\x2e\x38\x33\x2d\x30\x2e\x37\x36\x2c\x32\x2e\x33\x37\
+\x2d\x31\x2e\x35\x38\x2c\x32\x2e\x38\x37\x63\x2d\x30\x2e\x38\x31\
+\x2c\x30\x2e\x35\x2d\x31\x2e\x37\x2c\x30\x2e\x37\x37\x2d\x32\x2e\
+\x36\x37\x2c\x30\x2e\x38\x32\x63\x2d\x30\x2e\x39\x37\x2c\x30\x2e\
+\x30\x35\x2d\x32\x2e\x31\x35\x2d\x30\x2e\x30\x37\x2d\x33\x2e\x35\
+\x33\x2d\x30\x2e\x32\x39\x63\x2d\x30\x2e\x34\x35\x2d\x30\x2e\x30\
+\x37\x2d\x34\x2e\x35\x33\x2d\x30\x2e\x36\x36\x2d\x34\x2e\x35\x34\
+\x2d\x30\x2e\x37\x34\x0d\x0a\x09\x09\x4c\x31\x35\x36\x2e\x39\x32\
+\x2c\x37\x34\x2e\x30\x36\x4c\x31\x35\x36\x2e\x39\x32\x2c\x37\x34\
+\x2e\x30\x36\x7a\x20\x4d\x31\x34\x37\x2e\x39\x34\x2c\x31\x30\x31\
+\x2e\x39\x34\x63\x36\x2e\x34\x39\x2c\x31\x2e\x33\x36\x2c\x31\x30\
+\x2e\x33\x2c\x32\x2e\x31\x2c\x31\x33\x2e\x38\x36\x2c\x32\x2e\x35\
+\x39\x63\x39\x2e\x38\x34\x2c\x33\x2e\x31\x36\x2c\x31\x38\x2e\x34\
+\x34\x2c\x35\x2e\x37\x38\x2c\x32\x38\x2e\x32\x34\x2c\x38\x2e\x31\
+\x36\x0d\x0a\x09\x09\x43\x31\x37\x36\x2e\x30\x37\x2c\x31\x31\x30\
+\x2e\x36\x38\x2c\x31\x36\x32\x2e\x32\x36\x2c\x31\x30\x36\x2e\x34\
+\x35\x2c\x31\x34\x37\x2e\x39\x34\x2c\x31\x30\x31\x2e\x39\x34\x4c\
+\x31\x34\x37\x2e\x39\x34\x2c\x31\x30\x31\x2e\x39\x34\x7a\x20\x4d\
+\x32\x31\x33\x2e\x33\x36\x2c\x31\x30\x36\x2e\x33\x37\x6c\x33\x30\
+\x2e\x31\x39\x2d\x31\x37\x2e\x35\x32\x63\x30\x2e\x33\x39\x2d\x30\
+\x2e\x33\x32\x2c\x30\x2e\x33\x38\x2d\x30\x2e\x35\x39\x2d\x30\x2e\
+\x33\x33\x2d\x30\x2e\x37\x0d\x0a\x09\x09\x63\x2d\x31\x34\x2e\x35\
+\x2d\x32\x2e\x34\x35\x2d\x32\x39\x2e\x32\x36\x2d\x37\x2e\x33\x36\
+\x2d\x34\x34\x2e\x36\x36\x2d\x31\x37\x2e\x39\x33\x63\x2d\x35\x2e\
+\x39\x2d\x34\x2e\x31\x37\x2d\x32\x30\x2e\x30\x33\x2d\x31\x36\x2e\
+\x33\x35\x2d\x32\x36\x2e\x38\x35\x2d\x32\x33\x2e\x37\x34\x63\x2d\
+\x37\x2e\x39\x34\x2d\x38\x2e\x36\x31\x2d\x31\x34\x2e\x36\x37\x2d\
+\x31\x38\x2e\x33\x33\x2d\x32\x32\x2e\x33\x34\x2d\x32\x39\x2e\x31\
+\x34\x0d\x0a\x09\x09\x63\x2d\x30\x2e\x35\x31\x2d\x30\x2e\x38\x36\
+\x2d\x30\x2e\x38\x38\x2d\x31\x2e\x34\x2d\x31\x2e\x33\x33\x2d\x31\
+\x2e\x36\x31\x63\x2d\x30\x2e\x34\x33\x2d\x30\x2e\x31\x39\x2d\x30\
+\x2e\x39\x39\x2d\x30\x2e\x31\x2d\x31\x2e\x38\x39\x2c\x30\x2e\x33\
+\x4c\x39\x30\x2e\x39\x2c\x33\x38\x2e\x38\x37\x63\x2d\x33\x2e\x34\
+\x35\x2c\x31\x2e\x34\x36\x2d\x33\x2e\x33\x34\x2c\x32\x2e\x35\x32\
+\x2d\x31\x2e\x35\x34\x2c\x35\x2e\x36\x34\x0d\x0a\x09\x09\x63\x38\
+\x2e\x35\x35\x2c\x31\x38\x2e\x30\x31\x2c\x32\x33\x2e\x39\x35\x2c\
+\x33\x33\x2e\x32\x39\x2c\x33\x39\x2e\x35\x37\x2c\x34\x33\x2e\x36\
+\x37\x63\x32\x2e\x31\x38\x2c\x34\x2e\x33\x36\x2c\x35\x2e\x34\x38\
+\x2c\x38\x2e\x36\x32\x2c\x31\x33\x2e\x31\x38\x2c\x31\x31\x2e\x38\
+\x37\x63\x2d\x31\x37\x2e\x33\x31\x2d\x36\x2e\x31\x39\x2d\x33\x37\
+\x2e\x37\x38\x2d\x31\x34\x2e\x32\x39\x2d\x36\x30\x2e\x38\x31\x2d\
+\x32\x35\x2e\x31\x32\x6c\x31\x32\x2e\x30\x33\x2d\x38\x2e\x38\x33\
+\x6c\x2d\x31\x2e\x34\x38\x2d\x30\x2e\x39\x36\x0d\x0a\x09\x09\x6c\
+\x2d\x31\x31\x2e\x39\x31\x2c\x38\x2e\x37\x38\x63\x2d\x31\x2e\x37\
+\x34\x2c\x31\x2e\x37\x34\x2d\x31\x2e\x31\x32\x2c\x32\x2e\x35\x31\
+\x2c\x30\x2e\x32\x2c\x33\x2e\x31\x31\x63\x31\x33\x2e\x37\x31\x2c\
+\x36\x2e\x38\x39\x2c\x36\x38\x2e\x32\x38\x2c\x32\x38\x2e\x38\x33\
+\x2c\x39\x34\x2e\x34\x32\x2c\x33\x35\x2e\x35\x36\x63\x2d\x31\x38\
+\x2e\x31\x35\x2d\x33\x2e\x39\x36\x2d\x37\x36\x2e\x31\x36\x2d\x32\
+\x33\x2e\x38\x31\x2d\x39\x33\x2e\x32\x2d\x33\x31\x2e\x31\x36\x0d\
+\x0a\x09\x09\x63\x2d\x31\x2e\x30\x34\x2c\x31\x2e\x33\x33\x2d\x30\
+\x2e\x33\x37\x2c\x32\x2e\x38\x34\x2c\x31\x2e\x30\x35\x2c\x33\x2e\
+\x34\x35\x6c\x31\x2e\x33\x33\x2c\x30\x2e\x34\x32\x63\x35\x2e\x34\
+\x34\x2c\x31\x2e\x37\x31\x2c\x34\x37\x2e\x39\x34\x2c\x31\x36\x2e\
+\x35\x33\x2c\x35\x36\x2e\x32\x39\x2c\x31\x38\x2e\x34\x36\x63\x2d\
+\x39\x2e\x37\x31\x2d\x31\x2e\x34\x34\x2d\x35\x34\x2e\x37\x36\x2d\
+\x31\x35\x2e\x32\x38\x2d\x35\x39\x2e\x31\x38\x2d\x31\x37\x2e\x30\
+\x38\x6c\x30\x2e\x31\x36\x2c\x32\x2e\x33\x35\x0d\x0a\x09\x09\x6c\
+\x36\x32\x2e\x31\x37\x2c\x31\x37\x2e\x36\x39\x6c\x36\x2e\x30\x31\
+\x2c\x32\x2e\x32\x37\x4c\x37\x38\x2e\x34\x33\x2c\x39\x31\x2e\x38\
+\x31\x63\x2d\x33\x2e\x30\x33\x2d\x30\x2e\x37\x38\x2d\x35\x2d\x30\
+\x2e\x37\x34\x2d\x32\x2e\x38\x35\x2d\x34\x2e\x30\x34\x6c\x2d\x33\
+\x2e\x37\x38\x2c\x32\x2e\x39\x38\x63\x2d\x30\x2e\x33\x37\x2c\x30\
+\x2e\x32\x34\x2d\x30\x2e\x33\x36\x2c\x30\x2e\x35\x39\x2c\x30\x2e\
+\x30\x39\x2c\x30\x2e\x36\x39\x6c\x38\x31\x2e\x30\x37\x2c\x32\x30\
+\x2e\x30\x34\x6c\x33\x2e\x34\x31\x2c\x31\x2e\x35\x31\x0d\x0a\x09\
+\x09\x4c\x38\x30\x2e\x39\x38\x2c\x39\x35\x2e\x34\x37\x6c\x30\x2e\
+\x30\x35\x2c\x31\x2e\x36\x32\x6c\x35\x38\x2e\x33\x38\x2c\x31\x33\
+\x2e\x34\x31\x6c\x36\x2e\x30\x36\x2c\x32\x2e\x33\x35\x4c\x38\x31\
+\x2e\x30\x33\x2c\x39\x39\x2e\x31\x37\x4c\x38\x31\x2c\x31\x30\x30\
+\x2e\x39\x35\x6c\x31\x31\x36\x2e\x38\x31\x2c\x32\x34\x2e\x31\x38\
+\x63\x31\x2e\x36\x35\x2c\x30\x2e\x33\x35\x2c\x33\x2e\x38\x39\x2c\
+\x30\x2e\x33\x36\x2c\x35\x2e\x34\x39\x2d\x30\x2e\x39\x6c\x33\x39\
+\x2e\x37\x2d\x32\x32\x2e\x39\x39\x0d\x0a\x09\x09\x6c\x2d\x31\x32\
+\x2e\x33\x35\x2c\x35\x2e\x33\x6c\x31\x32\x2e\x33\x37\x2d\x37\x2e\
+\x32\x37\x6c\x2d\x32\x32\x2e\x32\x34\x2c\x39\x2e\x36\x38\x6c\x32\
+\x32\x2e\x31\x38\x2d\x31\x31\x2e\x38\x35\x6c\x2d\x31\x31\x2e\x35\
+\x31\x2c\x34\x2e\x35\x37\x6c\x31\x31\x2e\x34\x35\x2d\x37\x2e\x30\
+\x35\x6c\x2d\x31\x38\x2e\x38\x37\x2c\x38\x2e\x37\x32\x6c\x31\x38\
+\x2e\x39\x32\x2d\x31\x31\x2e\x32\x37\x4c\x32\x31\x33\x2e\x33\x36\
+\x2c\x31\x30\x36\x2e\x33\x37\x4c\x32\x31\x33\x2e\x33\x36\x2c\x31\
+\x30\x36\x2e\x33\x37\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\
+\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x2d\x15\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\
+\x2d\x38\x22\x3f\x3e\x0a\x3c\x73\x76\x67\x20\x77\x69\x64\x74\x68\
+\x3d\x22\x32\x38\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\
+\x22\x31\x38\x35\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\
+\x22\x30\x20\x30\x20\x32\x38\x32\x20\x31\x38\x35\x22\x20\x76\x65\
+\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x78\x6d\x6c\x6e\
+\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\
+\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\
+\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\
+\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x3e\x0a\x20\x20\x20\x20\x3c\
+\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\x61\x74\x6f\x72\x3a\x20\x53\
+\x6b\x65\x74\x63\x68\x20\x34\x38\x2e\x32\x20\x28\x34\x37\x33\x32\
+\x37\x29\x20\x2d\x20\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\
+\x62\x6f\x68\x65\x6d\x69\x61\x6e\x63\x6f\x64\x69\x6e\x67\x2e\x63\
+\x6f\x6d\x2f\x73\x6b\x65\x74\x63\x68\x20\x2d\x2d\x3e\x0a\x20\x20\
+\x20\x20\x3c\x74\x69\x74\x6c\x65\x3e\x6c\x6f\x67\x6f\x2d\x76\x65\
+\x72\x74\x69\x63\x61\x6c\x3c\x2f\x74\x69\x74\x6c\x65\x3e\x0a\x20\
+\x20\x20\x20\x3c\x64\x65\x73\x63\x3e\x43\x72\x65\x61\x74\x65\x64\
+\x20\x77\x69\x74\x68\x20\x53\x6b\x65\x74\x63\x68\x2e\x3c\x2f\x64\
+\x65\x73\x63\x3e\x0a\x20\x20\x20\x20\x3c\x64\x65\x66\x73\x3e\x3c\
+\x2f\x64\x65\x66\x73\x3e\x0a\x20\x20\x20\x20\x3c\x67\x20\x69\x64\
+\x3d\x22\x50\x61\x67\x65\x2d\x31\x22\x20\x73\x74\x72\x6f\x6b\x65\
+\x3d\x22\x6e\x6f\x6e\x65\x22\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\
+\x69\x64\x74\x68\x3d\x22\x31\x22\x20\x66\x69\x6c\x6c\x3d\x22\x6e\
+\x6f\x6e\x65\x22\x20\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3d\x22\
+\x65\x76\x65\x6e\x6f\x64\x64\x22\x3e\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x20\x3c\x67\x20\x69\x64\x3d\x22\x6c\x6f\x67\x6f\x2d\x76\x65\
+\x72\x74\x69\x63\x61\x6c\x22\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x31\
+\x34\x33\x2e\x39\x32\x2c\x31\x30\x34\x2e\x33\x39\x20\x43\x31\x39\
+\x32\x2e\x36\x38\x2c\x31\x30\x34\x2e\x33\x39\x20\x32\x33\x32\x2e\
+\x32\x2c\x31\x30\x36\x2e\x37\x37\x20\x32\x33\x32\x2e\x32\x2c\x31\
+\x30\x39\x2e\x37\x20\x43\x32\x33\x32\x2e\x32\x2c\x31\x31\x32\x2e\
+\x36\x33\x20\x31\x39\x32\x2e\x36\x37\x2c\x31\x31\x35\x2e\x30\x31\
+\x20\x31\x34\x33\x2e\x39\x32\x2c\x31\x31\x35\x2e\x30\x31\x20\x43\
+\x39\x35\x2e\x31\x36\x2c\x31\x31\x35\x2e\x30\x31\x20\x35\x35\x2e\
+\x36\x34\x2c\x31\x31\x32\x2e\x36\x33\x20\x35\x35\x2e\x36\x34\x2c\
+\x31\x30\x39\x2e\x37\x20\x43\x35\x35\x2e\x36\x33\x2c\x31\x30\x36\
+\x2e\x37\x37\x20\x39\x35\x2e\x31\x36\x2c\x31\x30\x34\x2e\x33\x39\
+\x20\x31\x34\x33\x2e\x39\x32\x2c\x31\x30\x34\x2e\x33\x39\x20\x5a\
+\x22\x20\x69\x64\x3d\x22\x53\x68\x61\x70\x65\x22\x20\x66\x69\x6c\
+\x6c\x3d\x22\x23\x45\x31\x45\x31\x45\x31\x22\x3e\x3c\x2f\x70\x61\
+\x74\x68\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x37\x37\x2e\x36\x32\x2c\
+\x34\x35\x2e\x33\x32\x20\x43\x37\x34\x2e\x38\x39\x2c\x34\x31\x2e\
+\x36\x20\x37\x31\x2e\x38\x37\x2c\x33\x36\x2e\x37\x32\x20\x36\x38\
+\x2e\x35\x36\x2c\x33\x30\x2e\x35\x33\x20\x43\x36\x36\x2e\x36\x37\
+\x2c\x32\x37\x2e\x32\x36\x20\x36\x36\x2e\x34\x38\x2c\x32\x35\x2e\
+\x37\x34\x20\x36\x39\x2e\x36\x33\x2c\x32\x34\x2e\x34\x20\x4c\x31\
+\x32\x36\x2e\x34\x36\x2c\x30\x2e\x38\x39\x20\x43\x31\x32\x38\x2e\
+\x30\x36\x2c\x30\x2e\x31\x39\x20\x31\x33\x30\x2e\x31\x36\x2c\x30\
+\x2e\x31\x38\x20\x31\x33\x31\x2e\x35\x32\x2c\x32\x2e\x36\x34\x20\
+\x43\x31\x33\x39\x2e\x31\x36\x2c\x31\x33\x2e\x39\x33\x20\x31\x34\
+\x34\x2e\x37\x32\x2c\x32\x31\x2e\x38\x37\x20\x31\x35\x32\x2e\x36\
+\x32\x2c\x33\x30\x2e\x34\x34\x20\x43\x31\x36\x34\x2e\x37\x37\x2c\
+\x34\x33\x2e\x30\x32\x20\x31\x37\x38\x2e\x31\x35\x2c\x35\x36\x2e\
+\x36\x36\x20\x32\x30\x31\x2e\x33\x35\x2c\x36\x36\x2e\x35\x36\x20\
+\x43\x32\x30\x38\x2e\x36\x37\x2c\x36\x39\x2e\x32\x36\x20\x32\x31\
+\x35\x2e\x38\x33\x2c\x37\x31\x2e\x34\x39\x20\x32\x32\x34\x2e\x32\
+\x37\x2c\x37\x32\x2e\x39\x32\x20\x43\x32\x32\x34\x2e\x35\x39\x2c\
+\x37\x32\x2e\x39\x37\x20\x32\x32\x36\x2e\x31\x35\x2c\x37\x33\x2e\
+\x37\x32\x20\x32\x32\x36\x2e\x30\x34\x2c\x37\x35\x2e\x30\x36\x20\
+\x4c\x32\x32\x35\x2e\x38\x31\x2c\x38\x38\x2e\x33\x32\x20\x4c\x31\
+\x38\x36\x2e\x34\x2c\x31\x31\x30\x2e\x39\x35\x20\x43\x31\x38\x34\
+\x2e\x34\x2c\x31\x31\x32\x2e\x37\x31\x20\x31\x38\x32\x2e\x34\x39\
+\x2c\x31\x31\x34\x2e\x32\x33\x20\x31\x37\x38\x2c\x31\x31\x32\x2e\
+\x37\x39\x20\x4c\x36\x30\x2e\x38\x2c\x38\x38\x2e\x34\x20\x4c\x36\
+\x30\x2e\x37\x38\x2c\x38\x30\x2e\x35\x34\x20\x4c\x35\x31\x2e\x34\
+\x39\x2c\x37\x38\x2e\x31\x34\x20\x43\x35\x30\x2e\x37\x37\x2c\x37\
+\x37\x2e\x39\x36\x20\x35\x30\x2e\x37\x36\x2c\x37\x37\x2e\x30\x31\
+\x20\x35\x31\x2e\x33\x35\x2c\x37\x36\x2e\x36\x31\x20\x4c\x36\x31\
+\x2e\x31\x2c\x36\x38\x2e\x36\x37\x20\x43\x36\x31\x2e\x30\x36\x2c\
+\x36\x37\x2e\x31\x34\x20\x36\x31\x2e\x35\x2c\x36\x36\x2e\x31\x37\
+\x20\x36\x32\x2e\x32\x36\x2c\x36\x35\x2e\x32\x31\x20\x43\x35\x37\
+\x2e\x39\x38\x2c\x36\x33\x2e\x37\x31\x20\x35\x36\x2e\x32\x39\x2c\
+\x36\x31\x2e\x38\x32\x20\x35\x39\x2e\x30\x34\x2c\x35\x39\x2e\x32\
+\x34\x20\x4c\x37\x36\x2e\x32\x35\x2c\x34\x36\x2e\x34\x39\x20\x4c\
+\x37\x37\x2e\x36\x32\x2c\x34\x35\x2e\x33\x32\x20\x5a\x22\x20\x69\
+\x64\x3d\x22\x53\x68\x61\x70\x65\x22\x20\x66\x69\x6c\x6c\x3d\x22\
+\x23\x37\x46\x37\x46\x37\x46\x22\x20\x66\x69\x6c\x6c\x2d\x72\x75\
+\x6c\x65\x3d\x22\x6e\x6f\x6e\x7a\x65\x72\x6f\x22\x3e\x3c\x2f\x70\
+\x61\x74\x68\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x3c\x67\x20\x69\x64\x3d\x22\x47\x72\x6f\x75\x70\x22\x20\x74\
+\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x74\x72\x61\x6e\x73\x6c\
+\x61\x74\x65\x28\x30\x2e\x30\x30\x30\x30\x30\x30\x2c\x20\x31\x33\
+\x33\x2e\x30\x30\x30\x30\x30\x30\x29\x22\x20\x66\x69\x6c\x6c\x3d\
+\x22\x23\x34\x43\x34\x43\x34\x43\x22\x20\x66\x69\x6c\x6c\x2d\x72\
+\x75\x6c\x65\x3d\x22\x6e\x6f\x6e\x7a\x65\x72\x6f\x22\x3e\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\
+\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x30\x2e\x34\x31\x2c\x33\x39\
+\x2e\x36\x34\x20\x4c\x30\x2e\x34\x31\x2c\x31\x32\x2e\x35\x39\x20\
+\x43\x30\x2e\x34\x31\x2c\x35\x2e\x35\x35\x20\x34\x2e\x39\x39\x2c\
+\x30\x2e\x39\x37\x20\x31\x31\x2e\x38\x32\x2c\x30\x2e\x39\x37\x20\
+\x43\x31\x38\x2e\x37\x32\x2c\x30\x2e\x39\x37\x20\x32\x33\x2e\x33\
+\x2c\x35\x2e\x35\x35\x20\x32\x33\x2e\x33\x2c\x31\x32\x2e\x35\x39\
+\x20\x4c\x32\x33\x2e\x33\x2c\x31\x33\x2e\x39\x33\x20\x43\x32\x33\
+\x2e\x33\x2c\x31\x34\x2e\x33\x35\x20\x32\x33\x2e\x30\x32\x2c\x31\
+\x34\x2e\x37\x31\x20\x32\x32\x2e\x36\x2c\x31\x34\x2e\x37\x31\x20\
+\x4c\x32\x30\x2e\x32\x38\x2c\x31\x34\x2e\x38\x35\x20\x43\x31\x39\
+\x2e\x38\x36\x2c\x31\x34\x2e\x38\x35\x20\x31\x39\x2e\x35\x38\x2c\
+\x31\x34\x2e\x35\x37\x20\x31\x39\x2e\x35\x38\x2c\x31\x34\x2e\x31\
+\x35\x20\x4c\x31\x39\x2e\x35\x38\x2c\x31\x32\x2e\x33\x39\x20\x43\
+\x31\x39\x2e\x35\x38\x2c\x37\x2e\x35\x33\x20\x31\x36\x2e\x34\x38\
+\x2c\x34\x2e\x32\x39\x20\x31\x31\x2e\x38\x33\x2c\x34\x2e\x32\x39\
+\x20\x43\x37\x2e\x31\x38\x2c\x34\x2e\x32\x39\x20\x34\x2e\x31\x35\
+\x2c\x37\x2e\x35\x33\x20\x34\x2e\x31\x35\x2c\x31\x32\x2e\x33\x39\
+\x20\x4c\x34\x2e\x31\x35\x2c\x33\x39\x2e\x39\x33\x20\x43\x34\x2e\
+\x31\x35\x2c\x34\x34\x2e\x37\x39\x20\x37\x2e\x31\x38\x2c\x34\x38\
+\x2e\x31\x20\x31\x31\x2e\x38\x33\x2c\x34\x38\x2e\x31\x20\x43\x31\
+\x36\x2e\x34\x38\x2c\x34\x38\x2e\x31\x20\x31\x39\x2e\x35\x38\x2c\
+\x34\x34\x2e\x37\x39\x20\x31\x39\x2e\x35\x38\x2c\x33\x39\x2e\x39\
+\x33\x20\x4c\x31\x39\x2e\x35\x38\x2c\x33\x38\x2e\x33\x31\x20\x43\
+\x31\x39\x2e\x35\x38\x2c\x33\x37\x2e\x38\x39\x20\x31\x39\x2e\x38\
+\x36\x2c\x33\x37\x2e\x36\x31\x20\x32\x30\x2e\x32\x38\x2c\x33\x37\
+\x2e\x36\x31\x20\x4c\x32\x32\x2e\x36\x2c\x33\x37\x2e\x37\x35\x20\
+\x43\x32\x33\x2e\x30\x32\x2c\x33\x37\x2e\x37\x35\x20\x32\x33\x2e\
+\x33\x2c\x33\x38\x2e\x30\x33\x20\x32\x33\x2e\x33\x2c\x33\x38\x2e\
+\x34\x35\x20\x4c\x32\x33\x2e\x33\x2c\x33\x39\x2e\x36\x35\x20\x43\
+\x32\x33\x2e\x33\x2c\x34\x36\x2e\x37\x36\x20\x31\x38\x2e\x37\x32\
+\x2c\x35\x31\x2e\x34\x31\x20\x31\x31\x2e\x38\x32\x2c\x35\x31\x2e\
+\x34\x31\x20\x43\x34\x2e\x39\x39\x2c\x35\x31\x2e\x34\x20\x30\x2e\
+\x34\x31\x2c\x34\x36\x2e\x37\x35\x20\x30\x2e\x34\x31\x2c\x33\x39\
+\x2e\x36\x34\x20\x5a\x22\x20\x69\x64\x3d\x22\x53\x68\x61\x70\x65\
+\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\
+\x64\x3d\x22\x4d\x35\x31\x2e\x36\x39\x2c\x32\x36\x2e\x35\x34\x20\
+\x4c\x35\x31\x2e\x36\x39\x2c\x35\x30\x2e\x31\x34\x20\x43\x35\x31\
+\x2e\x36\x39\x2c\x35\x30\x2e\x35\x36\x20\x35\x31\x2e\x34\x31\x2c\
+\x35\x30\x2e\x38\x34\x20\x35\x30\x2e\x39\x39\x2c\x35\x30\x2e\x38\
+\x34\x20\x4c\x34\x38\x2e\x36\x37\x2c\x35\x30\x2e\x38\x34\x20\x43\
+\x34\x38\x2e\x32\x35\x2c\x35\x30\x2e\x38\x34\x20\x34\x37\x2e\x39\
+\x37\x2c\x35\x30\x2e\x35\x36\x20\x34\x37\x2e\x39\x37\x2c\x35\x30\
+\x2e\x31\x34\x20\x4c\x34\x37\x2e\x39\x37\x2c\x34\x37\x2e\x36\x20\
+\x43\x34\x37\x2e\x39\x37\x2c\x34\x37\x2e\x33\x32\x20\x34\x37\x2e\
+\x37\x36\x2c\x34\x37\x2e\x32\x35\x20\x34\x37\x2e\x36\x32\x2c\x34\
+\x37\x2e\x34\x36\x20\x43\x34\x35\x2e\x37\x39\x2c\x35\x30\x2e\x32\
+\x31\x20\x34\x32\x2e\x38\x33\x2c\x35\x31\x2e\x34\x20\x33\x39\x2e\
+\x34\x35\x2c\x35\x31\x2e\x34\x20\x43\x33\x35\x2e\x34\x34\x2c\x35\
+\x31\x2e\x34\x20\x33\x30\x2e\x32\x39\x2c\x34\x39\x2e\x36\x34\x20\
+\x33\x30\x2e\x32\x39\x2c\x34\x31\x2e\x35\x34\x20\x43\x33\x30\x2e\
+\x32\x39\x2c\x33\x33\x2e\x33\x37\x20\x33\x35\x2e\x34\x33\x2c\x33\
+\x30\x2e\x32\x20\x34\x32\x2e\x31\x39\x2c\x33\x30\x2e\x32\x20\x4c\
+\x34\x37\x2e\x36\x38\x2c\x33\x30\x2e\x32\x20\x43\x34\x37\x2e\x38\
+\x32\x2c\x33\x30\x2e\x32\x20\x34\x37\x2e\x39\x36\x2c\x33\x30\x2e\
+\x30\x36\x20\x34\x37\x2e\x39\x36\x2c\x32\x39\x2e\x39\x32\x20\x4c\
+\x34\x37\x2e\x39\x36\x2c\x32\x36\x2e\x36\x38\x20\x43\x34\x37\x2e\
+\x39\x36\x2c\x32\x31\x2e\x35\x34\x20\x34\x35\x2e\x35\x36\x2c\x31\
+\x38\x2e\x30\x39\x20\x34\x31\x2e\x34\x31\x2c\x31\x38\x2e\x30\x39\
+\x20\x43\x33\x38\x2e\x31\x37\x2c\x31\x38\x2e\x30\x39\x20\x33\x35\
+\x2e\x34\x32\x2c\x32\x30\x2e\x33\x34\x20\x33\x35\x2e\x30\x37\x2c\
+\x32\x33\x2e\x36\x36\x20\x43\x33\x35\x2e\x30\x37\x2c\x32\x34\x2e\
+\x31\x35\x20\x33\x34\x2e\x37\x39\x2c\x32\x34\x2e\x33\x36\x20\x33\
+\x34\x2e\x33\x37\x2c\x32\x34\x2e\x33\x36\x20\x4c\x33\x31\x2e\x38\
+\x33\x2c\x32\x34\x2e\x32\x32\x20\x43\x33\x31\x2e\x34\x31\x2c\x32\
+\x34\x2e\x32\x32\x20\x33\x31\x2e\x31\x33\x2c\x32\x33\x2e\x39\x34\
+\x20\x33\x31\x2e\x32\x2c\x32\x33\x2e\x35\x32\x20\x43\x33\x31\x2e\
+\x37\x36\x2c\x31\x38\x2e\x32\x34\x20\x33\x36\x2e\x31\x33\x2c\x31\
+\x34\x2e\x37\x39\x20\x34\x31\x2e\x34\x38\x2c\x31\x34\x2e\x37\x39\
+\x20\x43\x34\x37\x2e\x38\x39\x2c\x31\x34\x2e\x37\x37\x20\x35\x31\
+\x2e\x36\x39\x2c\x31\x39\x2e\x34\x32\x20\x35\x31\x2e\x36\x39\x2c\
+\x32\x36\x2e\x35\x34\x20\x5a\x20\x4d\x34\x37\x2e\x39\x36\x2c\x34\
+\x30\x2e\x32\x37\x20\x4c\x34\x37\x2e\x39\x36\x2c\x33\x33\x2e\x35\
+\x38\x20\x43\x34\x37\x2e\x39\x36\x2c\x33\x33\x2e\x34\x34\x20\x34\
+\x37\x2e\x38\x32\x2c\x33\x33\x2e\x33\x20\x34\x37\x2e\x36\x38\x2c\
+\x33\x33\x2e\x33\x20\x4c\x34\x32\x2e\x31\x39\x2c\x33\x33\x2e\x33\
+\x20\x43\x33\x37\x2e\x34\x37\x2c\x33\x33\x2e\x33\x20\x33\x34\x2e\
+\x30\x39\x2c\x33\x35\x2e\x38\x34\x20\x33\x34\x2e\x30\x39\x2c\x34\
+\x31\x2e\x32\x36\x20\x43\x33\x34\x2e\x30\x39\x2c\x34\x36\x2e\x31\
+\x32\x20\x33\x36\x2e\x37\x37\x2c\x34\x38\x2e\x30\x39\x20\x34\x30\
+\x2e\x32\x32\x2c\x34\x38\x2e\x30\x39\x20\x43\x34\x34\x2e\x30\x32\
+\x2c\x34\x38\x2e\x30\x39\x20\x34\x37\x2e\x39\x36\x2c\x34\x35\x2e\
+\x36\x32\x20\x34\x37\x2e\x39\x36\x2c\x34\x30\x2e\x32\x37\x20\x5a\
+\x22\x20\x69\x64\x3d\x22\x53\x68\x61\x70\x65\x22\x3e\x3c\x2f\x70\
+\x61\x74\x68\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x35\
+\x38\x2e\x38\x31\x2c\x34\x32\x2e\x32\x34\x20\x4c\x35\x38\x2e\x38\
+\x31\x2c\x34\x31\x2e\x38\x32\x20\x43\x35\x38\x2e\x38\x31\x2c\x34\
+\x31\x2e\x34\x20\x35\x39\x2e\x30\x39\x2c\x34\x31\x2e\x31\x32\x20\
+\x35\x39\x2e\x35\x31\x2c\x34\x31\x2e\x31\x32\x20\x4c\x36\x31\x2e\
+\x36\x39\x2c\x34\x31\x2e\x31\x32\x20\x43\x36\x32\x2e\x31\x31\x2c\
+\x34\x31\x2e\x31\x32\x20\x36\x32\x2e\x33\x39\x2c\x34\x31\x2e\x33\
+\x33\x20\x36\x32\x2e\x33\x39\x2c\x34\x31\x2e\x36\x38\x20\x4c\x36\
+\x32\x2e\x33\x39\x2c\x34\x32\x2e\x32\x34\x20\x43\x36\x32\x2e\x33\
+\x39\x2c\x34\x35\x2e\x35\x35\x20\x36\x35\x2c\x34\x38\x2e\x31\x36\
+\x20\x36\x38\x2e\x39\x34\x2c\x34\x38\x2e\x31\x36\x20\x43\x37\x32\
+\x2e\x37\x34\x2c\x34\x38\x2e\x31\x36\x20\x37\x35\x2e\x32\x31\x2c\
+\x34\x35\x2e\x36\x32\x20\x37\x35\x2e\x32\x31\x2c\x34\x31\x2e\x39\
+\x36\x20\x43\x37\x35\x2e\x32\x31\x2c\x33\x37\x2e\x35\x39\x20\x37\
+\x31\x2e\x35\x35\x2c\x33\x36\x2e\x31\x31\x20\x36\x37\x2e\x37\x34\
+\x2c\x33\x34\x2e\x35\x36\x20\x43\x36\x33\x2e\x36\x35\x2c\x33\x32\
+\x2e\x38\x37\x20\x35\x39\x2e\x30\x31\x2c\x33\x30\x2e\x38\x33\x20\
+\x35\x39\x2e\x30\x31\x2c\x32\x34\x2e\x34\x32\x20\x43\x35\x39\x2e\
+\x30\x31\x2c\x31\x38\x2e\x36\x34\x20\x36\x32\x2e\x39\x35\x2c\x31\
+\x35\x2e\x30\x35\x20\x36\x38\x2e\x38\x2c\x31\x35\x2e\x30\x35\x20\
+\x43\x37\x34\x2e\x38\x36\x2c\x31\x35\x2e\x30\x35\x20\x37\x38\x2e\
+\x36\x36\x2c\x31\x38\x2e\x39\x32\x20\x37\x38\x2e\x36\x36\x2c\x32\
+\x34\x2e\x34\x32\x20\x4c\x37\x38\x2e\x36\x36\x2c\x32\x34\x2e\x36\
+\x33\x20\x43\x37\x38\x2e\x36\x36\x2c\x32\x35\x2e\x30\x35\x20\x37\
+\x38\x2e\x33\x38\x2c\x32\x35\x2e\x33\x33\x20\x37\x37\x2e\x39\x36\
+\x2c\x32\x35\x2e\x33\x33\x20\x4c\x37\x35\x2e\x38\x35\x2c\x32\x35\
+\x2e\x33\x33\x20\x43\x37\x35\x2e\x34\x33\x2c\x32\x35\x2e\x33\x33\
+\x20\x37\x35\x2e\x31\x35\x2c\x32\x35\x2e\x30\x35\x20\x37\x35\x2e\
+\x31\x35\x2c\x32\x34\x2e\x37\x37\x20\x4c\x37\x35\x2e\x31\x35\x2c\
+\x32\x34\x2e\x32\x38\x20\x43\x37\x35\x2e\x31\x35\x2c\x32\x30\x2e\
+\x39\x20\x37\x32\x2e\x36\x31\x2c\x31\x38\x2e\x31\x35\x20\x36\x38\
+\x2e\x38\x31\x2c\x31\x38\x2e\x31\x35\x20\x43\x36\x35\x2e\x30\x31\
+\x2c\x31\x38\x2e\x31\x35\x20\x36\x32\x2e\x36\x31\x2c\x32\x30\x2e\
+\x37\x36\x20\x36\x32\x2e\x36\x31\x2c\x32\x34\x2e\x33\x35\x20\x43\
+\x36\x32\x2e\x36\x31\x2c\x32\x38\x2e\x34\x33\x20\x36\x35\x2e\x39\
+\x39\x2c\x32\x39\x2e\x38\x34\x20\x36\x39\x2e\x36\x35\x2c\x33\x31\
+\x2e\x34\x36\x20\x43\x37\x33\x2e\x38\x38\x2c\x33\x33\x2e\x32\x32\
+\x20\x37\x38\x2e\x39\x35\x2c\x33\x35\x2e\x33\x33\x20\x37\x38\x2e\
+\x39\x35\x2c\x34\x31\x2e\x38\x31\x20\x43\x37\x38\x2e\x39\x35\x2c\
+\x34\x37\x2e\x34\x35\x20\x37\x35\x2e\x30\x31\x2c\x35\x31\x2e\x31\
+\x38\x20\x36\x38\x2e\x39\x35\x2c\x35\x31\x2e\x31\x38\x20\x43\x36\
+\x32\x2e\x37\x35\x2c\x35\x31\x2e\x31\x39\x20\x35\x38\x2e\x38\x31\
+\x2c\x34\x37\x2e\x34\x36\x20\x35\x38\x2e\x38\x31\x2c\x34\x32\x2e\
+\x32\x34\x20\x5a\x22\x20\x69\x64\x3d\x22\x53\x68\x61\x70\x65\x22\
+\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\
+\x3d\x22\x4d\x31\x30\x36\x2e\x34\x33\x2c\x32\x35\x2e\x38\x33\x20\
+\x4c\x31\x30\x36\x2e\x34\x33\x2c\x35\x30\x2e\x31\x33\x20\x43\x31\
+\x30\x36\x2e\x34\x33\x2c\x35\x30\x2e\x35\x35\x20\x31\x30\x36\x2e\
+\x31\x35\x2c\x35\x30\x2e\x38\x33\x20\x31\x30\x35\x2e\x37\x33\x2c\
+\x35\x30\x2e\x38\x33\x20\x4c\x31\x30\x33\x2e\x34\x2c\x35\x30\x2e\
+\x38\x33\x20\x43\x31\x30\x32\x2e\x39\x38\x2c\x35\x30\x2e\x38\x33\
+\x20\x31\x30\x32\x2e\x37\x2c\x35\x30\x2e\x35\x35\x20\x31\x30\x32\
+\x2e\x37\x2c\x35\x30\x2e\x31\x33\x20\x4c\x31\x30\x32\x2e\x37\x2c\
+\x32\x36\x2e\x31\x38\x20\x43\x31\x30\x32\x2e\x37\x2c\x32\x31\x2e\
+\x31\x31\x20\x31\x30\x30\x2e\x33\x38\x2c\x31\x38\x2e\x31\x35\x20\
+\x39\x36\x2e\x33\x36\x2c\x31\x38\x2e\x31\x35\x20\x43\x39\x32\x2e\
+\x32\x2c\x31\x38\x2e\x31\x35\x20\x38\x39\x2e\x36\x37\x2c\x32\x31\
+\x2e\x33\x32\x20\x38\x39\x2e\x36\x37\x2c\x32\x36\x2e\x36\x20\x4c\
+\x38\x39\x2e\x36\x37\x2c\x35\x30\x2e\x31\x33\x20\x43\x38\x39\x2e\
+\x36\x37\x2c\x35\x30\x2e\x35\x35\x20\x38\x39\x2e\x33\x39\x2c\x35\
+\x30\x2e\x38\x33\x20\x38\x38\x2e\x39\x37\x2c\x35\x30\x2e\x38\x33\
+\x20\x4c\x38\x36\x2e\x36\x34\x2c\x35\x30\x2e\x38\x33\x20\x43\x38\
+\x36\x2e\x32\x32\x2c\x35\x30\x2e\x38\x33\x20\x38\x35\x2e\x39\x34\
+\x2c\x35\x30\x2e\x35\x35\x20\x38\x35\x2e\x39\x34\x2c\x35\x30\x2e\
+\x31\x33\x20\x4c\x38\x35\x2e\x39\x34\x2c\x32\x2e\x32\x33\x20\x43\
+\x38\x35\x2e\x39\x34\x2c\x31\x2e\x38\x31\x20\x38\x36\x2e\x32\x32\
+\x2c\x31\x2e\x35\x33\x20\x38\x36\x2e\x36\x34\x2c\x31\x2e\x35\x33\
+\x20\x4c\x38\x38\x2e\x39\x37\x2c\x31\x2e\x35\x33\x20\x43\x38\x39\
+\x2e\x33\x39\x2c\x31\x2e\x35\x33\x20\x38\x39\x2e\x36\x37\x2c\x31\
+\x2e\x38\x31\x20\x38\x39\x2e\x36\x37\x2c\x32\x2e\x32\x33\x20\x4c\
+\x38\x39\x2e\x36\x37\x2c\x31\x38\x2e\x37\x38\x20\x43\x38\x39\x2e\
+\x36\x37\x2c\x31\x39\x2e\x30\x36\x20\x38\x39\x2e\x38\x38\x2c\x31\
+\x39\x2e\x30\x36\x20\x39\x30\x2e\x30\x32\x2c\x31\x38\x2e\x37\x38\
+\x20\x43\x39\x31\x2e\x37\x38\x2c\x31\x36\x2e\x30\x33\x20\x39\x34\
+\x2e\x34\x36\x2c\x31\x34\x2e\x38\x34\x20\x39\x37\x2e\x34\x39\x2c\
+\x31\x34\x2e\x38\x34\x20\x43\x31\x30\x33\x2e\x31\x39\x2c\x31\x34\
+\x2e\x38\x34\x20\x31\x30\x36\x2e\x34\x33\x2c\x31\x38\x2e\x39\x33\
+\x20\x31\x30\x36\x2e\x34\x33\x2c\x32\x35\x2e\x38\x33\x20\x5a\x22\
+\x20\x69\x64\x3d\x22\x53\x68\x61\x70\x65\x22\x3e\x3c\x2f\x70\x61\
+\x74\x68\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x31\x31\
+\x33\x2e\x38\x33\x2c\x33\x38\x2e\x37\x39\x20\x4c\x31\x31\x33\x2e\
+\x38\x33\x2c\x33\x36\x2e\x38\x39\x20\x43\x31\x31\x33\x2e\x38\x33\
+\x2c\x33\x36\x2e\x34\x37\x20\x31\x31\x34\x2e\x31\x31\x2c\x33\x36\
+\x2e\x31\x38\x20\x31\x31\x34\x2e\x35\x33\x2c\x33\x36\x2e\x31\x38\
+\x20\x4c\x31\x31\x39\x2e\x37\x34\x2c\x33\x36\x2e\x31\x38\x20\x43\
+\x31\x32\x30\x2e\x31\x36\x2c\x33\x36\x2e\x31\x38\x20\x31\x32\x30\
+\x2e\x34\x34\x2c\x33\x36\x2e\x34\x36\x20\x31\x32\x30\x2e\x34\x34\
+\x2c\x33\x36\x2e\x38\x39\x20\x4c\x31\x32\x30\x2e\x34\x34\x2c\x33\
+\x38\x2e\x34\x34\x20\x43\x31\x32\x30\x2e\x34\x34\x2c\x34\x32\x2e\
+\x38\x31\x20\x31\x32\x32\x2e\x38\x34\x2c\x34\x35\x2e\x35\x35\x20\
+\x31\x32\x36\x2e\x32\x32\x2c\x34\x35\x2e\x35\x35\x20\x43\x31\x32\
+\x39\x2e\x35\x33\x2c\x34\x35\x2e\x35\x35\x20\x31\x33\x32\x2e\x30\
+\x37\x2c\x34\x32\x2e\x38\x37\x20\x31\x33\x32\x2e\x30\x37\x2c\x33\
+\x38\x2e\x37\x39\x20\x43\x31\x33\x32\x2e\x30\x37\x2c\x33\x34\x2e\
+\x34\x39\x20\x31\x32\x39\x2e\x32\x35\x2c\x33\x32\x2e\x35\x32\x20\
+\x31\x32\x34\x2e\x31\x38\x2c\x32\x38\x2e\x37\x39\x20\x43\x31\x31\
+\x38\x2e\x37\x36\x2c\x32\x34\x2e\x37\x37\x20\x31\x31\x33\x2e\x36\
+\x39\x2c\x32\x31\x2e\x30\x34\x20\x31\x31\x33\x2e\x36\x39\x2c\x31\
+\x33\x2e\x33\x36\x20\x43\x31\x31\x33\x2e\x36\x39\x2c\x35\x2e\x36\
+\x38\x20\x31\x31\x38\x2e\x37\x36\x2c\x30\x2e\x39\x36\x20\x31\x32\
+\x35\x2e\x38\x38\x2c\x30\x2e\x39\x36\x20\x43\x31\x33\x33\x2e\x34\
+\x32\x2c\x30\x2e\x39\x36\x20\x31\x33\x38\x2e\x33\x35\x2c\x36\x2e\
+\x31\x37\x20\x31\x33\x38\x2e\x33\x35\x2c\x31\x33\x2e\x39\x39\x20\
+\x4c\x31\x33\x38\x2e\x33\x35\x2c\x31\x35\x2e\x37\x35\x20\x43\x31\
+\x33\x38\x2e\x33\x35\x2c\x31\x36\x2e\x31\x37\x20\x31\x33\x38\x2e\
+\x30\x37\x2c\x31\x36\x2e\x34\x35\x20\x31\x33\x37\x2e\x36\x35\x2c\
+\x31\x36\x2e\x34\x35\x20\x4c\x31\x33\x32\x2e\x34\x34\x2c\x31\x36\
+\x2e\x34\x35\x20\x43\x31\x33\x32\x2e\x30\x32\x2c\x31\x36\x2e\x34\
+\x35\x20\x31\x33\x31\x2e\x37\x34\x2c\x31\x36\x2e\x31\x37\x20\x31\
+\x33\x31\x2e\x37\x34\x2c\x31\x35\x2e\x37\x35\x20\x4c\x31\x33\x31\
+\x2e\x37\x34\x2c\x31\x33\x2e\x38\x35\x20\x43\x31\x33\x31\x2e\x37\
+\x34\x2c\x39\x2e\x36\x32\x20\x31\x32\x39\x2e\x33\x34\x2c\x36\x2e\
+\x38\x31\x20\x31\x32\x35\x2e\x38\x39\x2c\x36\x2e\x38\x31\x20\x43\
+\x31\x32\x32\x2e\x37\x32\x2c\x36\x2e\x38\x31\x20\x31\x32\x30\x2e\
+\x34\x2c\x39\x2e\x31\x33\x20\x31\x32\x30\x2e\x34\x2c\x31\x33\x2e\
+\x33\x36\x20\x43\x31\x32\x30\x2e\x34\x2c\x31\x37\x2e\x33\x37\x20\
+\x31\x32\x32\x2e\x34\x34\x2c\x31\x39\x2e\x32\x38\x20\x31\x32\x37\
+\x2e\x38\x37\x2c\x32\x33\x2e\x32\x39\x20\x43\x31\x33\x35\x2e\x30\
+\x35\x2c\x32\x38\x2e\x36\x34\x20\x31\x33\x38\x2e\x37\x39\x2c\x33\
+\x31\x2e\x36\x20\x31\x33\x38\x2e\x37\x39\x2c\x33\x38\x2e\x33\x36\
+\x20\x43\x31\x33\x38\x2e\x37\x39\x2c\x34\x36\x2e\x33\x32\x20\x31\
+\x33\x33\x2e\x35\x38\x2c\x35\x31\x2e\x33\x39\x20\x31\x32\x36\x2e\
+\x32\x35\x2c\x35\x31\x2e\x33\x39\x20\x43\x31\x31\x38\x2e\x38\x33\
+\x2c\x35\x31\x2e\x34\x20\x31\x31\x33\x2e\x38\x33\x2c\x34\x36\x2e\
+\x33\x33\x20\x31\x31\x33\x2e\x38\x33\x2c\x33\x38\x2e\x37\x39\x20\
+\x5a\x22\x20\x69\x64\x3d\x22\x53\x68\x61\x70\x65\x22\x3e\x3c\x2f\
+\x70\x61\x74\x68\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\
+\x31\x36\x38\x2e\x33\x35\x2c\x32\x35\x2e\x39\x37\x20\x4c\x31\x36\
+\x38\x2e\x33\x35\x2c\x35\x30\x2e\x31\x33\x20\x43\x31\x36\x38\x2e\
+\x33\x35\x2c\x35\x30\x2e\x35\x35\x20\x31\x36\x38\x2e\x30\x37\x2c\
+\x35\x30\x2e\x38\x33\x20\x31\x36\x37\x2e\x36\x35\x2c\x35\x30\x2e\
+\x38\x33\x20\x4c\x31\x36\x32\x2e\x33\x2c\x35\x30\x2e\x38\x33\x20\
+\x43\x31\x36\x31\x2e\x38\x38\x2c\x35\x30\x2e\x38\x33\x20\x31\x36\
+\x31\x2e\x36\x2c\x35\x30\x2e\x35\x35\x20\x31\x36\x31\x2e\x36\x2c\
+\x35\x30\x2e\x31\x33\x20\x4c\x31\x36\x31\x2e\x36\x2c\x32\x36\x2e\
+\x35\x33\x20\x43\x31\x36\x31\x2e\x36\x2c\x32\x32\x2e\x35\x38\x20\
+\x31\x35\x39\x2e\x38\x34\x2c\x32\x30\x2e\x33\x33\x20\x31\x35\x36\
+\x2e\x38\x31\x2c\x32\x30\x2e\x33\x33\x20\x43\x31\x35\x33\x2e\x35\
+\x37\x2c\x32\x30\x2e\x33\x33\x20\x31\x35\x31\x2e\x36\x37\x2c\x32\
+\x32\x2e\x37\x33\x20\x31\x35\x31\x2e\x36\x37\x2c\x32\x36\x2e\x38\
+\x31\x20\x4c\x31\x35\x31\x2e\x36\x37\x2c\x35\x30\x2e\x31\x32\x20\
+\x43\x31\x35\x31\x2e\x36\x37\x2c\x35\x30\x2e\x35\x34\x20\x31\x35\
+\x31\x2e\x33\x39\x2c\x35\x30\x2e\x38\x32\x20\x31\x35\x30\x2e\x39\
+\x37\x2c\x35\x30\x2e\x38\x32\x20\x4c\x31\x34\x35\x2e\x36\x32\x2c\
+\x35\x30\x2e\x38\x32\x20\x43\x31\x34\x35\x2e\x32\x2c\x35\x30\x2e\
+\x38\x32\x20\x31\x34\x34\x2e\x39\x32\x2c\x35\x30\x2e\x35\x34\x20\
+\x31\x34\x34\x2e\x39\x32\x2c\x35\x30\x2e\x31\x32\x20\x4c\x31\x34\
+\x34\x2e\x39\x32\x2c\x32\x2e\x32\x32\x20\x43\x31\x34\x34\x2e\x39\
+\x32\x2c\x31\x2e\x38\x20\x31\x34\x35\x2e\x32\x2c\x31\x2e\x35\x32\
+\x20\x31\x34\x35\x2e\x36\x32\x2c\x31\x2e\x35\x32\x20\x4c\x31\x35\
+\x30\x2e\x39\x37\x2c\x31\x2e\x35\x32\x20\x43\x31\x35\x31\x2e\x33\
+\x39\x2c\x31\x2e\x35\x32\x20\x31\x35\x31\x2e\x36\x37\x2c\x31\x2e\
+\x38\x20\x31\x35\x31\x2e\x36\x37\x2c\x32\x2e\x32\x32\x20\x4c\x31\
+\x35\x31\x2e\x36\x37\x2c\x31\x37\x2e\x35\x31\x20\x43\x31\x35\x31\
+\x2e\x36\x37\x2c\x31\x37\x2e\x37\x32\x20\x31\x35\x31\x2e\x38\x38\
+\x2c\x31\x37\x2e\x37\x39\x20\x31\x35\x32\x2e\x30\x39\x2c\x31\x37\
+\x2e\x35\x38\x20\x43\x31\x35\x33\x2e\x39\x39\x2c\x31\x35\x2e\x32\
+\x36\x20\x31\x35\x36\x2e\x36\x37\x2c\x31\x34\x2e\x34\x38\x20\x31\
+\x35\x39\x2e\x32\x2c\x31\x34\x2e\x34\x38\x20\x43\x31\x36\x35\x2e\
+\x31\x31\x2c\x31\x34\x2e\x34\x39\x20\x31\x36\x38\x2e\x33\x35\x2c\
+\x31\x38\x2e\x37\x32\x20\x31\x36\x38\x2e\x33\x35\x2c\x32\x35\x2e\
+\x39\x37\x20\x5a\x22\x20\x69\x64\x3d\x22\x53\x68\x61\x70\x65\x22\
+\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\
+\x3d\x22\x4d\x31\x39\x32\x2e\x33\x2c\x31\x34\x2e\x39\x38\x20\x4c\
+\x31\x39\x37\x2e\x36\x35\x2c\x31\x34\x2e\x39\x38\x20\x43\x31\x39\
+\x38\x2e\x30\x37\x2c\x31\x34\x2e\x39\x38\x20\x31\x39\x38\x2e\x33\
+\x35\x2c\x31\x35\x2e\x32\x36\x20\x31\x39\x38\x2e\x33\x35\x2c\x31\
+\x35\x2e\x36\x38\x20\x4c\x31\x39\x38\x2e\x33\x35\x2c\x35\x30\x2e\
+\x31\x32\x20\x43\x31\x39\x38\x2e\x33\x35\x2c\x35\x30\x2e\x35\x34\
+\x20\x31\x39\x38\x2e\x30\x37\x2c\x35\x30\x2e\x38\x32\x20\x31\x39\
+\x37\x2e\x36\x35\x2c\x35\x30\x2e\x38\x32\x20\x4c\x31\x39\x32\x2e\
+\x33\x2c\x35\x30\x2e\x38\x32\x20\x43\x31\x39\x31\x2e\x38\x38\x2c\
+\x35\x30\x2e\x38\x32\x20\x31\x39\x31\x2e\x36\x2c\x35\x30\x2e\x35\
+\x34\x20\x31\x39\x31\x2e\x36\x2c\x35\x30\x2e\x31\x32\x20\x4c\x31\
+\x39\x31\x2e\x36\x2c\x34\x38\x2e\x30\x38\x20\x43\x31\x39\x31\x2e\
+\x36\x2c\x34\x37\x2e\x38\x20\x31\x39\x31\x2e\x33\x39\x2c\x34\x37\
+\x2e\x38\x20\x31\x39\x31\x2e\x32\x35\x2c\x34\x38\x2e\x30\x31\x20\
+\x43\x31\x38\x39\x2e\x37\x2c\x35\x30\x2e\x34\x37\x20\x31\x38\x37\
+\x2e\x33\x31\x2c\x35\x31\x2e\x33\x32\x20\x31\x38\x34\x2e\x34\x39\
+\x2c\x35\x31\x2e\x33\x32\x20\x43\x31\x37\x39\x2e\x32\x31\x2c\x35\
+\x31\x2e\x33\x32\x20\x31\x37\x35\x2e\x30\x35\x2c\x34\x38\x2e\x32\
+\x39\x20\x31\x37\x35\x2e\x30\x35\x2c\x34\x30\x2e\x39\x20\x4c\x31\
+\x37\x35\x2e\x30\x35\x2c\x31\x35\x2e\x36\x38\x20\x43\x31\x37\x35\
+\x2e\x30\x35\x2c\x31\x35\x2e\x32\x36\x20\x31\x37\x35\x2e\x33\x33\
+\x2c\x31\x34\x2e\x39\x38\x20\x31\x37\x35\x2e\x37\x35\x2c\x31\x34\
+\x2e\x39\x38\x20\x4c\x31\x38\x31\x2e\x31\x2c\x31\x34\x2e\x39\x38\
+\x20\x43\x31\x38\x31\x2e\x35\x32\x2c\x31\x34\x2e\x39\x38\x20\x31\
+\x38\x31\x2e\x38\x2c\x31\x35\x2e\x32\x36\x20\x31\x38\x31\x2e\x38\
+\x2c\x31\x35\x2e\x36\x38\x20\x4c\x31\x38\x31\x2e\x38\x2c\x33\x39\
+\x2e\x34\x32\x20\x43\x31\x38\x31\x2e\x38\x2c\x34\x33\x2e\x35\x20\
+\x31\x38\x33\x2e\x34\x39\x2c\x34\x35\x2e\x34\x38\x20\x31\x38\x36\
+\x2e\x35\x39\x2c\x34\x35\x2e\x34\x38\x20\x43\x31\x38\x39\x2e\x37\
+\x36\x2c\x34\x35\x2e\x34\x38\x20\x31\x39\x31\x2e\x35\x39\x2c\x34\
+\x33\x2e\x30\x31\x20\x31\x39\x31\x2e\x35\x39\x2c\x33\x39\x20\x4c\
+\x31\x39\x31\x2e\x35\x39\x2c\x31\x35\x2e\x36\x39\x20\x43\x31\x39\
+\x31\x2e\x36\x2c\x31\x35\x2e\x32\x37\x20\x31\x39\x31\x2e\x38\x38\
+\x2c\x31\x34\x2e\x39\x38\x20\x31\x39\x32\x2e\x33\x2c\x31\x34\x2e\
+\x39\x38\x20\x5a\x22\x20\x69\x64\x3d\x22\x53\x68\x61\x70\x65\x22\
+\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\
+\x3d\x22\x4d\x32\x33\x33\x2e\x30\x32\x2c\x31\x34\x2e\x37\x20\x43\
+\x32\x33\x33\x2e\x30\x32\x2c\x31\x34\x2e\x38\x34\x20\x32\x33\x33\
+\x2e\x31\x36\x2c\x31\x34\x2e\x39\x38\x20\x32\x33\x33\x2e\x33\x2c\
+\x31\x34\x2e\x39\x38\x20\x4c\x32\x33\x38\x2e\x31\x36\x2c\x31\x34\
+\x2e\x39\x38\x20\x43\x32\x33\x38\x2e\x35\x38\x2c\x31\x34\x2e\x39\
+\x38\x20\x32\x33\x38\x2e\x38\x36\x2c\x31\x35\x2e\x32\x36\x20\x32\
+\x33\x38\x2e\x38\x36\x2c\x31\x35\x2e\x36\x38\x20\x4c\x32\x33\x38\
+\x2e\x38\x36\x2c\x31\x39\x2e\x32\x20\x43\x32\x33\x38\x2e\x38\x36\
+\x2c\x31\x39\x2e\x36\x32\x20\x32\x33\x38\x2e\x35\x38\x2c\x31\x39\
+\x2e\x39\x20\x32\x33\x38\x2e\x31\x36\x2c\x31\x39\x2e\x39\x20\x4c\
+\x32\x33\x33\x2e\x33\x2c\x31\x39\x2e\x39\x20\x43\x32\x33\x33\x2e\
+\x31\x36\x2c\x31\x39\x2e\x39\x20\x32\x33\x33\x2e\x30\x32\x2c\x32\
+\x30\x2e\x30\x34\x20\x32\x33\x33\x2e\x30\x32\x2c\x32\x30\x2e\x31\
+\x38\x20\x4c\x32\x33\x33\x2e\x30\x32\x2c\x35\x30\x2e\x31\x32\x20\
+\x43\x32\x33\x33\x2e\x30\x32\x2c\x35\x30\x2e\x35\x34\x20\x32\x33\
+\x32\x2e\x37\x34\x2c\x35\x30\x2e\x38\x32\x20\x32\x33\x32\x2e\x33\
+\x32\x2c\x35\x30\x2e\x38\x32\x20\x4c\x32\x32\x36\x2e\x39\x37\x2c\
+\x35\x30\x2e\x38\x32\x20\x43\x32\x32\x36\x2e\x35\x35\x2c\x35\x30\
+\x2e\x38\x32\x20\x32\x32\x36\x2e\x32\x37\x2c\x35\x30\x2e\x35\x34\
+\x20\x32\x32\x36\x2e\x32\x37\x2c\x35\x30\x2e\x31\x32\x20\x4c\x32\
+\x32\x36\x2e\x32\x37\x2c\x32\x30\x2e\x32\x20\x43\x32\x32\x36\x2e\
+\x32\x37\x2c\x32\x30\x2e\x30\x36\x20\x32\x32\x36\x2e\x31\x33\x2c\
+\x31\x39\x2e\x39\x32\x20\x32\x32\x35\x2e\x39\x39\x2c\x31\x39\x2e\
+\x39\x32\x20\x4c\x32\x31\x34\x2e\x35\x31\x2c\x31\x39\x2e\x39\x32\
+\x20\x43\x32\x31\x34\x2e\x33\x37\x2c\x31\x39\x2e\x39\x32\x20\x32\
+\x31\x34\x2e\x32\x33\x2c\x32\x30\x2e\x30\x36\x20\x32\x31\x34\x2e\
+\x32\x33\x2c\x32\x30\x2e\x32\x20\x4c\x32\x31\x34\x2e\x32\x33\x2c\
+\x35\x30\x2e\x31\x34\x20\x43\x32\x31\x34\x2e\x32\x33\x2c\x35\x30\
+\x2e\x35\x36\x20\x32\x31\x33\x2e\x39\x35\x2c\x35\x30\x2e\x38\x34\
+\x20\x32\x31\x33\x2e\x35\x33\x2c\x35\x30\x2e\x38\x34\x20\x4c\x32\
+\x30\x38\x2e\x31\x38\x2c\x35\x30\x2e\x38\x34\x20\x43\x32\x30\x37\
+\x2e\x37\x36\x2c\x35\x30\x2e\x38\x34\x20\x32\x30\x37\x2e\x34\x38\
+\x2c\x35\x30\x2e\x35\x36\x20\x32\x30\x37\x2e\x34\x38\x2c\x35\x30\
+\x2e\x31\x34\x20\x4c\x32\x30\x37\x2e\x34\x38\x2c\x32\x30\x2e\x32\
+\x20\x43\x32\x30\x37\x2e\x34\x38\x2c\x32\x30\x2e\x30\x36\x20\x32\
+\x30\x37\x2e\x33\x34\x2c\x31\x39\x2e\x39\x32\x20\x32\x30\x37\x2e\
+\x32\x2c\x31\x39\x2e\x39\x32\x20\x4c\x32\x30\x34\x2e\x35\x32\x2c\
+\x31\x39\x2e\x39\x32\x20\x43\x32\x30\x34\x2e\x31\x2c\x31\x39\x2e\
+\x39\x32\x20\x32\x30\x33\x2e\x38\x32\x2c\x31\x39\x2e\x36\x34\x20\
+\x32\x30\x33\x2e\x38\x32\x2c\x31\x39\x2e\x32\x32\x20\x4c\x32\x30\
+\x33\x2e\x38\x32\x2c\x31\x35\x2e\x37\x20\x43\x32\x30\x33\x2e\x38\
+\x32\x2c\x31\x35\x2e\x32\x38\x20\x32\x30\x34\x2e\x31\x2c\x31\x35\
+\x20\x32\x30\x34\x2e\x35\x32\x2c\x31\x35\x20\x4c\x32\x30\x37\x2e\
+\x32\x2c\x31\x35\x20\x43\x32\x30\x37\x2e\x33\x34\x2c\x31\x35\x20\
+\x32\x30\x37\x2e\x34\x38\x2c\x31\x34\x2e\x38\x36\x20\x32\x30\x37\
+\x2e\x34\x38\x2c\x31\x34\x2e\x37\x32\x20\x4c\x32\x30\x37\x2e\x34\
+\x38\x2c\x31\x31\x2e\x39\x20\x43\x32\x30\x37\x2e\x34\x38\x2c\x34\
+\x2e\x30\x31\x20\x32\x31\x30\x2e\x39\x33\x2c\x30\x2e\x39\x31\x20\
+\x32\x31\x38\x2e\x36\x31\x2c\x31\x2e\x31\x32\x20\x4c\x32\x31\x39\
+\x2e\x31\x2c\x31\x2e\x31\x32\x20\x43\x32\x31\x39\x2e\x35\x32\x2c\
+\x31\x2e\x31\x32\x20\x32\x31\x39\x2e\x38\x2c\x31\x2e\x34\x20\x32\
+\x31\x39\x2e\x38\x2c\x31\x2e\x38\x32\x20\x4c\x32\x31\x39\x2e\x38\
+\x2c\x35\x2e\x32\x20\x43\x32\x31\x39\x2e\x38\x2c\x35\x2e\x36\x32\
+\x20\x32\x31\x39\x2e\x35\x39\x2c\x35\x2e\x39\x20\x32\x31\x39\x2e\
+\x32\x34\x2c\x35\x2e\x39\x20\x4c\x32\x31\x38\x2e\x36\x31\x2c\x35\
+\x2e\x39\x20\x43\x32\x31\x35\x2e\x31\x36\x2c\x35\x2e\x39\x37\x20\
+\x32\x31\x34\x2e\x32\x34\x2c\x38\x2e\x35\x31\x20\x32\x31\x34\x2e\
+\x32\x34\x2c\x31\x32\x2e\x34\x35\x20\x4c\x32\x31\x34\x2e\x32\x34\
+\x2c\x31\x34\x2e\x37\x20\x43\x32\x31\x34\x2e\x32\x34\x2c\x31\x34\
+\x2e\x38\x34\x20\x32\x31\x34\x2e\x33\x38\x2c\x31\x34\x2e\x39\x38\
+\x20\x32\x31\x34\x2e\x35\x32\x2c\x31\x34\x2e\x39\x38\x20\x4c\x32\
+\x32\x36\x2c\x31\x34\x2e\x39\x38\x20\x43\x32\x32\x36\x2e\x31\x34\
+\x2c\x31\x34\x2e\x39\x38\x20\x32\x32\x36\x2e\x32\x38\x2c\x31\x34\
+\x2e\x38\x34\x20\x32\x32\x36\x2e\x32\x38\x2c\x31\x34\x2e\x37\x20\
+\x4c\x32\x32\x36\x2e\x32\x38\x2c\x31\x31\x2e\x38\x38\x20\x43\x32\
+\x32\x36\x2e\x32\x38\x2c\x33\x2e\x39\x39\x20\x32\x32\x39\x2e\x37\
+\x33\x2c\x30\x2e\x38\x39\x20\x32\x33\x37\x2e\x34\x31\x2c\x31\x2e\
+\x31\x20\x4c\x32\x33\x37\x2e\x39\x2c\x31\x2e\x31\x20\x43\x32\x33\
+\x38\x2e\x33\x32\x2c\x31\x2e\x31\x20\x32\x33\x38\x2e\x36\x2c\x31\
+\x2e\x33\x38\x20\x32\x33\x38\x2e\x36\x2c\x31\x2e\x38\x20\x4c\x32\
+\x33\x38\x2e\x36\x2c\x35\x2e\x31\x38\x20\x43\x32\x33\x38\x2e\x36\
+\x2c\x35\x2e\x36\x20\x32\x33\x38\x2e\x33\x39\x2c\x35\x2e\x38\x38\
+\x20\x32\x33\x38\x2e\x30\x34\x2c\x35\x2e\x38\x38\x20\x4c\x32\x33\
+\x37\x2e\x34\x31\x2c\x35\x2e\x38\x38\x20\x43\x32\x33\x33\x2e\x39\
+\x36\x2c\x35\x2e\x39\x35\x20\x32\x33\x33\x2e\x30\x34\x2c\x38\x2e\
+\x34\x39\x20\x32\x33\x33\x2e\x30\x34\x2c\x31\x32\x2e\x34\x33\x20\
+\x4c\x32\x33\x33\x2e\x30\x34\x2c\x31\x34\x2e\x37\x20\x4c\x32\x33\
+\x33\x2e\x30\x32\x2c\x31\x34\x2e\x37\x20\x5a\x20\x4d\x32\x34\x34\
+\x2e\x39\x32\x2c\x31\x2e\x35\x33\x20\x4c\x32\x35\x30\x2e\x32\x37\
+\x2c\x31\x2e\x35\x33\x20\x43\x32\x35\x30\x2e\x36\x39\x2c\x31\x2e\
+\x35\x33\x20\x32\x35\x30\x2e\x39\x37\x2c\x31\x2e\x38\x31\x20\x32\
+\x35\x30\x2e\x39\x37\x2c\x32\x2e\x32\x33\x20\x4c\x32\x35\x30\x2e\
+\x39\x37\x2c\x35\x30\x2e\x31\x33\x20\x43\x32\x35\x30\x2e\x39\x37\
+\x2c\x35\x30\x2e\x35\x35\x20\x32\x35\x30\x2e\x36\x39\x2c\x35\x30\
+\x2e\x38\x33\x20\x32\x35\x30\x2e\x32\x37\x2c\x35\x30\x2e\x38\x33\
+\x20\x4c\x32\x34\x34\x2e\x39\x32\x2c\x35\x30\x2e\x38\x33\x20\x43\
+\x32\x34\x34\x2e\x35\x2c\x35\x30\x2e\x38\x33\x20\x32\x34\x34\x2e\
+\x32\x31\x2c\x35\x30\x2e\x35\x35\x20\x32\x34\x34\x2e\x32\x31\x2c\
+\x35\x30\x2e\x31\x33\x20\x4c\x32\x34\x34\x2e\x32\x31\x2c\x32\x2e\
+\x32\x33\x20\x43\x32\x34\x34\x2e\x32\x32\x2c\x31\x2e\x38\x31\x20\
+\x32\x34\x34\x2e\x35\x2c\x31\x2e\x35\x33\x20\x32\x34\x34\x2e\x39\
+\x32\x2c\x31\x2e\x35\x33\x20\x5a\x22\x20\x69\x64\x3d\x22\x53\x68\
+\x61\x70\x65\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x70\x61\
+\x74\x68\x20\x64\x3d\x22\x4d\x32\x38\x30\x2e\x33\x36\x2c\x33\x35\
+\x2e\x36\x39\x20\x4c\x32\x36\x34\x2e\x34\x34\x2c\x33\x35\x2e\x36\
+\x39\x20\x43\x32\x36\x34\x2e\x33\x2c\x33\x35\x2e\x36\x39\x20\x32\
+\x36\x34\x2e\x31\x36\x2c\x33\x35\x2e\x38\x33\x20\x32\x36\x34\x2e\
+\x31\x36\x2c\x33\x35\x2e\x39\x37\x20\x4c\x32\x36\x34\x2e\x31\x36\
+\x2c\x33\x39\x2e\x37\x37\x20\x43\x32\x36\x34\x2e\x31\x36\x2c\x34\
+\x33\x2e\x31\x35\x20\x32\x36\x36\x2e\x32\x37\x2c\x34\x35\x2e\x35\
+\x35\x20\x32\x36\x39\x2e\x32\x33\x2c\x34\x35\x2e\x35\x35\x20\x43\
+\x32\x37\x31\x2e\x39\x31\x2c\x34\x35\x2e\x35\x35\x20\x32\x37\x33\
+\x2e\x37\x34\x2c\x34\x33\x2e\x37\x32\x20\x32\x37\x34\x2e\x32\x33\
+\x2c\x34\x31\x2e\x32\x35\x20\x43\x32\x37\x34\x2e\x33\x37\x2c\x34\
+\x30\x2e\x38\x33\x20\x32\x37\x34\x2e\x35\x38\x2c\x34\x30\x2e\x36\
+\x39\x20\x32\x37\x35\x2c\x34\x30\x2e\x36\x39\x20\x4c\x32\x38\x30\
+\x2e\x32\x31\x2c\x34\x30\x2e\x39\x37\x20\x43\x32\x38\x30\x2e\x36\
+\x33\x2c\x34\x30\x2e\x39\x37\x20\x32\x38\x30\x2e\x39\x31\x2c\x34\
+\x31\x2e\x32\x35\x20\x32\x38\x30\x2e\x38\x34\x2c\x34\x31\x2e\x36\
+\x37\x20\x43\x32\x38\x30\x2e\x32\x31\x2c\x34\x37\x2e\x36\x36\x20\
+\x32\x37\x36\x2e\x31\x39\x2c\x35\x31\x2e\x33\x39\x20\x32\x36\x39\
+\x2e\x32\x32\x2c\x35\x31\x2e\x33\x39\x20\x43\x32\x36\x31\x2e\x39\
+\x37\x2c\x35\x31\x2e\x33\x39\x20\x32\x35\x37\x2e\x33\x39\x2c\x34\
+\x37\x2e\x30\x32\x20\x32\x35\x37\x2e\x33\x39\x2c\x34\x30\x2e\x32\
+\x36\x20\x4c\x32\x35\x37\x2e\x33\x39\x2c\x32\x35\x2e\x36\x31\x20\
+\x43\x32\x35\x37\x2e\x33\x39\x2c\x31\x38\x2e\x39\x39\x20\x32\x36\
+\x31\x2e\x39\x37\x2c\x31\x34\x2e\x34\x31\x20\x32\x36\x39\x2e\x32\
+\x32\x2c\x31\x34\x2e\x34\x31\x20\x43\x32\x37\x36\x2e\x36\x32\x2c\
+\x31\x34\x2e\x34\x31\x20\x32\x38\x31\x2e\x30\x35\x2c\x31\x38\x2e\
+\x39\x39\x20\x32\x38\x31\x2e\x30\x35\x2c\x32\x35\x2e\x36\x31\x20\
+\x4c\x32\x38\x31\x2e\x30\x35\x2c\x33\x34\x2e\x39\x38\x20\x43\x32\
+\x38\x31\x2e\x30\x36\x2c\x33\x35\x2e\x34\x31\x20\x32\x38\x30\x2e\
+\x37\x38\x2c\x33\x35\x2e\x36\x39\x20\x32\x38\x30\x2e\x33\x36\x2c\
+\x33\x35\x2e\x36\x39\x20\x5a\x20\x4d\x32\x36\x34\x2e\x31\x36\x2c\
+\x32\x36\x2e\x30\x34\x20\x4c\x32\x36\x34\x2e\x31\x36\x2c\x32\x39\
+\x2e\x37\x37\x20\x43\x32\x36\x34\x2e\x31\x36\x2c\x32\x39\x2e\x39\
+\x31\x20\x32\x36\x34\x2e\x33\x2c\x33\x30\x2e\x30\x35\x20\x32\x36\
+\x34\x2e\x34\x34\x2c\x33\x30\x2e\x30\x35\x20\x4c\x32\x37\x34\x2e\
+\x30\x39\x2c\x33\x30\x2e\x30\x35\x20\x43\x32\x37\x34\x2e\x32\x33\
+\x2c\x33\x30\x2e\x30\x35\x20\x32\x37\x34\x2e\x33\x37\x2c\x32\x39\
+\x2e\x39\x31\x20\x32\x37\x34\x2e\x33\x37\x2c\x32\x39\x2e\x37\x37\
+\x20\x4c\x32\x37\x34\x2e\x33\x37\x2c\x32\x36\x2e\x30\x34\x20\x43\
+\x32\x37\x34\x2e\x33\x37\x2c\x32\x32\x2e\x36\x36\x20\x32\x37\x32\
+\x2e\x33\x33\x2c\x32\x30\x2e\x32\x36\x20\x32\x36\x39\x2e\x32\x33\
+\x2c\x32\x30\x2e\x32\x36\x20\x43\x32\x36\x36\x2e\x32\x37\x2c\x32\
+\x30\x2e\x32\x37\x20\x32\x36\x34\x2e\x31\x36\x2c\x32\x32\x2e\x36\
+\x36\x20\x32\x36\x34\x2e\x31\x36\x2c\x32\x36\x2e\x30\x34\x20\x5a\
+\x22\x20\x69\x64\x3d\x22\x53\x68\x61\x70\x65\x22\x3e\x3c\x2f\x70\
+\x61\x74\x68\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x3c\x2f\x67\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x32\x32\x2e\
+\x39\x34\x2c\x37\x34\x2e\x37\x35\x20\x4c\x31\x38\x30\x2e\x30\x32\
+\x2c\x39\x39\x20\x43\x31\x36\x30\x2e\x32\x36\x2c\x39\x34\x2e\x39\
+\x34\x20\x31\x34\x33\x2e\x35\x31\x2c\x38\x38\x2e\x39\x34\x20\x31\
+\x32\x39\x2e\x34\x35\x2c\x38\x31\x2e\x39\x32\x20\x43\x31\x33\x33\
+\x2e\x31\x32\x2c\x38\x32\x2e\x37\x38\x20\x31\x33\x37\x2e\x30\x38\
+\x2c\x38\x33\x2e\x32\x35\x20\x31\x34\x31\x2e\x32\x31\x2c\x38\x33\
+\x2e\x32\x35\x20\x43\x31\x36\x30\x2e\x31\x38\x2c\x38\x33\x2e\x32\
+\x35\x20\x31\x37\x35\x2e\x35\x36\x2c\x37\x33\x2e\x33\x31\x20\x31\
+\x37\x35\x2e\x35\x36\x2c\x36\x31\x2e\x30\x36\x20\x43\x31\x37\x35\
+\x2e\x35\x36\x2c\x35\x38\x2e\x32\x20\x31\x37\x34\x2e\x37\x32\x2c\
+\x35\x35\x2e\x34\x36\x20\x31\x37\x33\x2e\x31\x39\x2c\x35\x32\x2e\
+\x39\x35\x20\x43\x31\x38\x37\x2e\x39\x36\x2c\x36\x34\x2e\x31\x37\
+\x20\x32\x30\x34\x2e\x39\x32\x2c\x37\x32\x2e\x37\x31\x20\x32\x32\
+\x32\x2e\x39\x34\x2c\x37\x34\x2e\x37\x35\x20\x5a\x20\x4d\x31\x34\
+\x30\x2e\x38\x39\x2c\x34\x30\x2e\x34\x32\x20\x43\x31\x35\x38\x2e\
+\x33\x31\x2c\x34\x30\x2e\x34\x32\x20\x31\x37\x32\x2e\x34\x33\x2c\
+\x34\x39\x2e\x34\x31\x20\x31\x37\x32\x2e\x34\x33\x2c\x36\x30\x2e\
+\x35\x31\x20\x43\x31\x37\x32\x2e\x34\x33\x2c\x37\x31\x2e\x36\x31\
+\x20\x31\x35\x38\x2e\x33\x31\x2c\x38\x30\x2e\x36\x20\x31\x34\x30\
+\x2e\x38\x39\x2c\x38\x30\x2e\x36\x20\x43\x31\x32\x33\x2e\x34\x37\
+\x2c\x38\x30\x2e\x36\x20\x31\x30\x39\x2e\x33\x35\x2c\x37\x31\x2e\
+\x36\x31\x20\x31\x30\x39\x2e\x33\x35\x2c\x36\x30\x2e\x35\x31\x20\
+\x43\x31\x30\x39\x2e\x33\x35\x2c\x34\x39\x2e\x34\x31\x20\x31\x32\
+\x33\x2e\x34\x37\x2c\x34\x30\x2e\x34\x32\x20\x31\x34\x30\x2e\x38\
+\x39\x2c\x34\x30\x2e\x34\x32\x20\x5a\x20\x4d\x31\x36\x31\x2e\x35\
+\x31\x2c\x34\x33\x2e\x31\x37\x20\x43\x31\x35\x35\x2e\x38\x32\x2c\
+\x34\x30\x2e\x34\x37\x20\x31\x34\x38\x2e\x38\x2c\x33\x38\x2e\x38\
+\x38\x20\x31\x34\x31\x2e\x32\x2c\x33\x38\x2e\x38\x38\x20\x43\x31\
+\x32\x32\x2e\x32\x33\x2c\x33\x38\x2e\x38\x38\x20\x31\x30\x36\x2e\
+\x38\x35\x2c\x34\x38\x2e\x38\x32\x20\x31\x30\x36\x2e\x38\x35\x2c\
+\x36\x31\x2e\x30\x37\x20\x43\x31\x30\x36\x2e\x38\x35\x2c\x36\x34\
+\x2e\x35\x31\x20\x31\x30\x38\x2e\x30\x36\x2c\x36\x37\x2e\x37\x36\
+\x20\x31\x31\x30\x2e\x32\x32\x2c\x37\x30\x2e\x36\x36\x20\x43\x38\
+\x39\x2e\x35\x35\x2c\x35\x36\x2e\x35\x20\x37\x37\x2e\x32\x31\x2c\
+\x34\x30\x2e\x34\x36\x20\x37\x31\x2e\x33\x39\x2c\x32\x37\x2e\x38\
+\x38\x20\x4c\x31\x32\x38\x2e\x35\x39\x2c\x33\x2e\x31\x20\x43\x31\
+\x33\x35\x2e\x39\x34\x2c\x31\x35\x2e\x33\x32\x20\x31\x34\x37\x2e\
+\x33\x35\x2c\x33\x30\x2e\x31\x35\x20\x31\x36\x31\x2e\x35\x31\x2c\
+\x34\x33\x2e\x31\x37\x20\x5a\x20\x4d\x31\x33\x37\x2e\x38\x38\x2c\
+\x34\x32\x2e\x36\x32\x20\x4c\x31\x33\x36\x2e\x34\x33\x2c\x34\x37\
+\x2e\x30\x32\x20\x4c\x31\x33\x31\x2e\x39\x2c\x34\x36\x2e\x37\x20\
+\x4c\x31\x33\x30\x2e\x38\x37\x2c\x34\x39\x2e\x34\x31\x20\x43\x31\
+\x33\x33\x2e\x36\x32\x2c\x34\x39\x2e\x36\x36\x20\x31\x33\x34\x2e\
+\x38\x33\x2c\x34\x39\x2e\x33\x35\x20\x31\x33\x34\x2e\x31\x37\x2c\
+\x35\x31\x2e\x34\x37\x20\x4c\x31\x32\x39\x2e\x39\x2c\x36\x35\x2e\
+\x33\x32\x20\x43\x31\x32\x39\x2e\x34\x34\x2c\x36\x36\x2e\x38\x20\
+\x31\x32\x39\x2e\x30\x37\x2c\x36\x36\x2e\x35\x33\x20\x31\x32\x37\
+\x2e\x31\x32\x2c\x36\x36\x2e\x32\x35\x20\x4c\x31\x32\x34\x2e\x38\
+\x34\x2c\x36\x35\x2e\x39\x33\x20\x4c\x31\x32\x33\x2e\x35\x35\x2c\
+\x36\x39\x2e\x38\x31\x20\x4c\x31\x32\x38\x2e\x33\x32\x2c\x37\x30\
+\x2e\x36\x31\x20\x4c\x31\x32\x36\x2e\x39\x31\x2c\x37\x35\x2e\x35\
+\x32\x20\x4c\x31\x33\x33\x2e\x31\x39\x2c\x37\x36\x2e\x36\x20\x4c\
+\x31\x33\x34\x2e\x36\x33\x2c\x37\x31\x2e\x36\x20\x4c\x31\x33\x39\
+\x2e\x37\x35\x2c\x37\x32\x2e\x33\x20\x4c\x31\x33\x38\x2e\x34\x37\
+\x2c\x37\x37\x2e\x33\x38\x20\x4c\x31\x34\x34\x2e\x35\x39\x2c\x37\
+\x38\x2e\x31\x38\x20\x4c\x31\x34\x35\x2e\x38\x31\x2c\x37\x33\x2e\
+\x30\x31\x20\x43\x31\x34\x37\x2e\x35\x32\x2c\x37\x33\x2e\x31\x33\
+\x20\x31\x34\x37\x2e\x34\x38\x2c\x37\x33\x2e\x30\x33\x20\x31\x34\
+\x38\x2e\x36\x37\x2c\x37\x32\x2e\x38\x37\x20\x43\x31\x35\x30\x2e\
+\x37\x34\x2c\x37\x32\x2e\x36\x31\x20\x31\x35\x32\x2e\x34\x36\x2c\
+\x37\x32\x2e\x30\x32\x20\x31\x35\x33\x2e\x38\x32\x2c\x37\x31\x2e\
+\x31\x32\x20\x43\x31\x35\x35\x2e\x31\x37\x2c\x37\x30\x2e\x32\x32\
+\x20\x31\x35\x36\x2e\x31\x32\x2c\x36\x38\x2e\x36\x38\x20\x31\x35\
+\x36\x2e\x34\x39\x2c\x36\x37\x2e\x34\x31\x20\x43\x31\x35\x36\x2e\
+\x38\x2c\x36\x36\x2e\x33\x35\x20\x31\x35\x36\x2e\x36\x34\x2c\x36\
+\x34\x2e\x39\x32\x20\x31\x35\x36\x2e\x32\x2c\x36\x33\x2e\x39\x36\
+\x20\x43\x31\x35\x35\x2e\x37\x36\x2c\x36\x32\x2e\x39\x39\x20\x31\
+\x35\x35\x2e\x30\x32\x2c\x36\x32\x2e\x31\x38\x20\x31\x35\x33\x2e\
+\x39\x38\x2c\x36\x31\x2e\x35\x32\x20\x43\x31\x35\x33\x2e\x32\x36\
+\x2c\x36\x31\x2e\x30\x36\x20\x31\x35\x32\x2e\x31\x38\x2c\x36\x30\
+\x2e\x35\x36\x20\x31\x35\x30\x2e\x37\x33\x2c\x36\x30\x2e\x30\x34\
+\x20\x43\x31\x35\x33\x2e\x32\x35\x2c\x35\x39\x2e\x38\x33\x20\x31\
+\x35\x34\x2e\x37\x35\x2c\x35\x39\x2e\x30\x38\x20\x31\x35\x36\x2e\
+\x33\x33\x2c\x35\x37\x2e\x35\x38\x20\x43\x31\x35\x37\x2e\x39\x34\
+\x2c\x35\x36\x2e\x30\x35\x20\x31\x35\x38\x2e\x32\x36\x2c\x35\x34\
+\x2e\x30\x34\x20\x31\x35\x37\x2e\x32\x32\x2c\x35\x32\x2e\x32\x37\
+\x20\x43\x31\x35\x35\x2e\x39\x34\x2c\x35\x30\x2e\x31\x31\x20\x31\
+\x35\x33\x2e\x33\x31\x2c\x34\x39\x2e\x31\x20\x31\x35\x30\x2e\x35\
+\x37\x2c\x34\x38\x2e\x34\x38\x20\x4c\x31\x35\x31\x2e\x36\x2c\x34\
+\x33\x2e\x38\x39\x20\x4c\x31\x34\x37\x2e\x35\x33\x2c\x34\x33\x2e\
+\x34\x39\x20\x4c\x31\x34\x36\x2e\x32\x32\x2c\x34\x38\x2e\x30\x34\
+\x20\x4c\x31\x34\x31\x2e\x35\x31\x2c\x34\x37\x2e\x35\x36\x20\x4c\
+\x31\x34\x32\x2e\x37\x34\x2c\x34\x33\x2e\x31\x37\x20\x4c\x31\x33\
+\x37\x2e\x38\x38\x2c\x34\x32\x2e\x36\x32\x20\x5a\x20\x4d\x31\x33\
+\x38\x2e\x39\x32\x2c\x35\x36\x2e\x36\x20\x4c\x31\x34\x30\x2e\x37\
+\x33\x2c\x35\x30\x2e\x33\x38\x20\x4c\x31\x34\x34\x2e\x34\x31\x2c\
+\x35\x30\x2e\x38\x20\x43\x31\x34\x36\x2e\x35\x32\x2c\x35\x31\x2e\
+\x30\x34\x20\x31\x34\x37\x2e\x39\x34\x2c\x35\x31\x2e\x34\x34\x20\
+\x31\x34\x38\x2e\x36\x39\x2c\x35\x31\x2e\x37\x35\x20\x43\x31\x35\
+\x31\x2e\x38\x39\x2c\x35\x33\x2e\x30\x35\x20\x31\x35\x30\x2e\x38\
+\x33\x2c\x35\x37\x2e\x30\x36\x20\x31\x34\x36\x2e\x37\x37\x2c\x35\
+\x37\x2e\x34\x34\x20\x43\x31\x34\x35\x2e\x38\x31\x2c\x35\x37\x2e\
+\x35\x33\x20\x31\x34\x34\x2e\x33\x38\x2c\x35\x37\x2e\x34\x33\x20\
+\x31\x34\x32\x2e\x35\x31\x2c\x35\x37\x2e\x31\x35\x20\x4c\x31\x33\
+\x38\x2e\x39\x32\x2c\x35\x36\x2e\x36\x20\x5a\x20\x4d\x31\x33\x37\
+\x2e\x39\x32\x2c\x36\x30\x2e\x30\x36\x20\x4c\x31\x34\x32\x2e\x31\
+\x36\x2c\x36\x30\x2e\x37\x31\x20\x43\x31\x34\x34\x2e\x30\x32\x2c\
+\x36\x30\x2e\x39\x39\x20\x31\x34\x35\x2e\x33\x37\x2c\x36\x31\x2e\
+\x33\x33\x20\x31\x34\x36\x2e\x32\x2c\x36\x31\x2e\x37\x32\x20\x43\
+\x31\x34\x37\x2e\x30\x33\x2c\x36\x32\x2e\x31\x31\x20\x31\x34\x37\
+\x2e\x36\x31\x2c\x36\x32\x2e\x35\x38\x20\x31\x34\x37\x2e\x39\x31\
+\x2c\x36\x33\x2e\x31\x34\x20\x43\x31\x34\x38\x2e\x32\x33\x2c\x36\
+\x33\x2e\x37\x20\x31\x34\x38\x2e\x32\x38\x2c\x36\x34\x2e\x33\x34\
+\x20\x31\x34\x38\x2e\x30\x37\x2c\x36\x35\x2e\x30\x35\x20\x43\x31\
+\x34\x37\x2e\x38\x33\x2c\x36\x35\x2e\x38\x38\x20\x31\x34\x37\x2e\
+\x33\x31\x2c\x36\x37\x2e\x34\x32\x20\x31\x34\x36\x2e\x34\x39\x2c\
+\x36\x37\x2e\x39\x32\x20\x43\x31\x34\x35\x2e\x36\x38\x2c\x36\x38\
+\x2e\x34\x32\x20\x31\x34\x34\x2e\x37\x39\x2c\x36\x38\x2e\x36\x39\
+\x20\x31\x34\x33\x2e\x38\x32\x2c\x36\x38\x2e\x37\x34\x20\x43\x31\
+\x34\x32\x2e\x38\x35\x2c\x36\x38\x2e\x37\x39\x20\x31\x34\x31\x2e\
+\x36\x37\x2c\x36\x38\x2e\x36\x37\x20\x31\x34\x30\x2e\x32\x39\x2c\
+\x36\x38\x2e\x34\x35\x20\x43\x31\x33\x39\x2e\x38\x34\x2c\x36\x38\
+\x2e\x33\x38\x20\x31\x33\x35\x2e\x37\x36\x2c\x36\x37\x2e\x37\x39\
+\x20\x31\x33\x35\x2e\x37\x35\x2c\x36\x37\x2e\x37\x31\x20\x4c\x31\
+\x33\x37\x2e\x39\x32\x2c\x36\x30\x2e\x30\x36\x20\x5a\x20\x4d\x31\
+\x32\x38\x2e\x39\x34\x2c\x38\x37\x2e\x39\x34\x20\x43\x31\x33\x35\
+\x2e\x34\x33\x2c\x38\x39\x2e\x33\x20\x31\x33\x39\x2e\x32\x34\x2c\
+\x39\x30\x2e\x30\x34\x20\x31\x34\x32\x2e\x38\x2c\x39\x30\x2e\x35\
+\x33\x20\x43\x31\x35\x32\x2e\x36\x34\x2c\x39\x33\x2e\x36\x39\x20\
+\x31\x36\x31\x2e\x32\x34\x2c\x39\x36\x2e\x33\x31\x20\x31\x37\x31\
+\x2e\x30\x34\x2c\x39\x38\x2e\x36\x39\x20\x43\x31\x35\x37\x2e\x30\
+\x37\x2c\x39\x36\x2e\x36\x38\x20\x31\x34\x33\x2e\x32\x36\x2c\x39\
+\x32\x2e\x34\x35\x20\x31\x32\x38\x2e\x39\x34\x2c\x38\x37\x2e\x39\
+\x34\x20\x5a\x20\x4d\x31\x39\x34\x2e\x33\x36\x2c\x39\x32\x2e\x33\
+\x37\x20\x4c\x32\x32\x34\x2e\x35\x35\x2c\x37\x34\x2e\x38\x35\x20\
+\x43\x32\x32\x34\x2e\x39\x34\x2c\x37\x34\x2e\x35\x33\x20\x32\x32\
+\x34\x2e\x39\x33\x2c\x37\x34\x2e\x32\x36\x20\x32\x32\x34\x2e\x32\
+\x32\x2c\x37\x34\x2e\x31\x35\x20\x43\x32\x30\x39\x2e\x37\x32\x2c\
+\x37\x31\x2e\x37\x20\x31\x39\x34\x2e\x39\x36\x2c\x36\x36\x2e\x37\
+\x39\x20\x31\x37\x39\x2e\x35\x36\x2c\x35\x36\x2e\x32\x32\x20\x43\
+\x31\x37\x33\x2e\x36\x36\x2c\x35\x32\x2e\x30\x35\x20\x31\x35\x39\
+\x2e\x35\x33\x2c\x33\x39\x2e\x38\x37\x20\x31\x35\x32\x2e\x37\x31\
+\x2c\x33\x32\x2e\x34\x38\x20\x43\x31\x34\x34\x2e\x37\x37\x2c\x32\
+\x33\x2e\x38\x37\x20\x31\x33\x38\x2e\x30\x34\x2c\x31\x34\x2e\x31\
+\x35\x20\x31\x33\x30\x2e\x33\x37\x2c\x33\x2e\x33\x34\x20\x43\x31\
+\x32\x39\x2e\x38\x36\x2c\x32\x2e\x34\x38\x20\x31\x32\x39\x2e\x34\
+\x39\x2c\x31\x2e\x39\x34\x20\x31\x32\x39\x2e\x30\x34\x2c\x31\x2e\
+\x37\x33\x20\x43\x31\x32\x38\x2e\x36\x31\x2c\x31\x2e\x35\x34\x20\
+\x31\x32\x38\x2e\x30\x35\x2c\x31\x2e\x36\x33\x20\x31\x32\x37\x2e\
+\x31\x35\x2c\x32\x2e\x30\x33\x20\x4c\x37\x31\x2e\x39\x2c\x32\x34\
+\x2e\x38\x37\x20\x43\x36\x38\x2e\x34\x35\x2c\x32\x36\x2e\x33\x33\
+\x20\x36\x38\x2e\x35\x36\x2c\x32\x37\x2e\x33\x39\x20\x37\x30\x2e\
+\x33\x36\x2c\x33\x30\x2e\x35\x31\x20\x43\x37\x38\x2e\x39\x31\x2c\
+\x34\x38\x2e\x35\x32\x20\x39\x34\x2e\x33\x31\x2c\x36\x33\x2e\x38\
+\x20\x31\x30\x39\x2e\x39\x33\x2c\x37\x34\x2e\x31\x38\x20\x43\x31\
+\x31\x32\x2e\x31\x31\x2c\x37\x38\x2e\x35\x34\x20\x31\x31\x35\x2e\
+\x34\x31\x2c\x38\x32\x2e\x38\x20\x31\x32\x33\x2e\x31\x31\x2c\x38\
+\x36\x2e\x30\x35\x20\x43\x31\x30\x35\x2e\x38\x2c\x37\x39\x2e\x38\
+\x36\x20\x38\x35\x2e\x33\x33\x2c\x37\x31\x2e\x37\x36\x20\x36\x32\
+\x2e\x33\x2c\x36\x30\x2e\x39\x33\x20\x4c\x37\x34\x2e\x33\x33\x2c\
+\x35\x32\x2e\x31\x20\x4c\x37\x32\x2e\x38\x35\x2c\x35\x31\x2e\x31\
+\x34\x20\x4c\x36\x30\x2e\x39\x34\x2c\x35\x39\x2e\x39\x32\x20\x43\
+\x35\x39\x2e\x32\x2c\x36\x31\x2e\x36\x36\x20\x35\x39\x2e\x38\x32\
+\x2c\x36\x32\x2e\x34\x33\x20\x36\x31\x2e\x31\x34\x2c\x36\x33\x2e\
+\x30\x33\x20\x43\x37\x34\x2e\x38\x35\x2c\x36\x39\x2e\x39\x32\x20\
+\x31\x32\x39\x2e\x34\x32\x2c\x39\x31\x2e\x38\x36\x20\x31\x35\x35\
+\x2e\x35\x36\x2c\x39\x38\x2e\x35\x39\x20\x43\x31\x33\x37\x2e\x34\
+\x31\x2c\x39\x34\x2e\x36\x33\x20\x37\x39\x2e\x34\x2c\x37\x34\x2e\
+\x37\x38\x20\x36\x32\x2e\x33\x36\x2c\x36\x37\x2e\x34\x33\x20\x43\
+\x36\x31\x2e\x33\x32\x2c\x36\x38\x2e\x37\x36\x20\x36\x31\x2e\x39\
+\x39\x2c\x37\x30\x2e\x32\x37\x20\x36\x33\x2e\x34\x31\x2c\x37\x30\
+\x2e\x38\x38\x20\x4c\x36\x34\x2e\x37\x34\x2c\x37\x31\x2e\x33\x20\
+\x43\x37\x30\x2e\x31\x38\x2c\x37\x33\x2e\x30\x31\x20\x31\x31\x32\
+\x2e\x36\x38\x2c\x38\x37\x2e\x38\x33\x20\x31\x32\x31\x2e\x30\x33\
+\x2c\x38\x39\x2e\x37\x36\x20\x43\x31\x31\x31\x2e\x33\x32\x2c\x38\
+\x38\x2e\x33\x32\x20\x36\x36\x2e\x32\x37\x2c\x37\x34\x2e\x34\x38\
+\x20\x36\x31\x2e\x38\x35\x2c\x37\x32\x2e\x36\x38\x20\x4c\x36\x32\
+\x2e\x30\x31\x2c\x37\x35\x2e\x30\x33\x20\x4c\x31\x32\x34\x2e\x31\
+\x38\x2c\x39\x32\x2e\x37\x32\x20\x4c\x31\x33\x30\x2e\x31\x39\x2c\
+\x39\x34\x2e\x39\x39\x20\x4c\x35\x39\x2e\x34\x33\x2c\x37\x37\x2e\
+\x38\x31\x20\x43\x35\x36\x2e\x34\x2c\x37\x37\x2e\x30\x33\x20\x35\
+\x34\x2e\x34\x33\x2c\x37\x37\x2e\x30\x37\x20\x35\x36\x2e\x35\x38\
+\x2c\x37\x33\x2e\x37\x37\x20\x4c\x35\x32\x2e\x38\x2c\x37\x36\x2e\
+\x37\x35\x20\x43\x35\x32\x2e\x34\x33\x2c\x37\x36\x2e\x39\x39\x20\
+\x35\x32\x2e\x34\x34\x2c\x37\x37\x2e\x33\x34\x20\x35\x32\x2e\x38\
+\x39\x2c\x37\x37\x2e\x34\x34\x20\x4c\x31\x33\x33\x2e\x39\x36\x2c\
+\x39\x37\x2e\x34\x38\x20\x4c\x31\x33\x37\x2e\x33\x37\x2c\x39\x38\
+\x2e\x39\x39\x20\x4c\x36\x31\x2e\x39\x38\x2c\x38\x31\x2e\x34\x37\
+\x20\x4c\x36\x32\x2e\x30\x33\x2c\x38\x33\x2e\x30\x39\x20\x4c\x31\
+\x32\x30\x2e\x34\x31\x2c\x39\x36\x2e\x35\x20\x4c\x31\x32\x36\x2e\
+\x34\x37\x2c\x39\x38\x2e\x38\x35\x20\x4c\x36\x32\x2e\x30\x33\x2c\
+\x38\x35\x2e\x31\x37\x20\x4c\x36\x32\x2c\x38\x36\x2e\x39\x35\x20\
+\x4c\x31\x37\x38\x2e\x38\x31\x2c\x31\x31\x31\x2e\x31\x33\x20\x43\
+\x31\x38\x30\x2e\x34\x36\x2c\x31\x31\x31\x2e\x34\x38\x20\x31\x38\
+\x32\x2e\x37\x2c\x31\x31\x31\x2e\x34\x39\x20\x31\x38\x34\x2e\x33\
+\x2c\x31\x31\x30\x2e\x32\x33\x20\x4c\x32\x32\x34\x2c\x38\x37\x2e\
+\x32\x34\x20\x4c\x32\x31\x31\x2e\x36\x35\x2c\x39\x32\x2e\x35\x34\
+\x20\x4c\x32\x32\x34\x2e\x30\x32\x2c\x38\x35\x2e\x32\x37\x20\x4c\
+\x32\x30\x31\x2e\x37\x38\x2c\x39\x34\x2e\x39\x35\x20\x4c\x32\x32\
+\x33\x2e\x39\x36\x2c\x38\x33\x2e\x31\x20\x4c\x32\x31\x32\x2e\x34\
+\x35\x2c\x38\x37\x2e\x36\x37\x20\x4c\x32\x32\x33\x2e\x39\x2c\x38\
+\x30\x2e\x36\x32\x20\x4c\x32\x30\x35\x2e\x30\x33\x2c\x38\x39\x2e\
+\x33\x34\x20\x4c\x32\x32\x33\x2e\x39\x35\x2c\x37\x38\x2e\x30\x37\
+\x20\x4c\x31\x39\x34\x2e\x33\x36\x2c\x39\x32\x2e\x33\x37\x20\x5a\
+\x22\x20\x69\x64\x3d\x22\x53\x68\x61\x70\x65\x22\x20\x66\x69\x6c\
+\x6c\x3d\x22\x23\x46\x46\x46\x46\x46\x46\x22\x20\x66\x69\x6c\x6c\
+\x2d\x72\x75\x6c\x65\x3d\x22\x6e\x6f\x6e\x7a\x65\x72\x6f\x22\x3e\
+\x3c\x2f\x70\x61\x74\x68\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
+\x3c\x2f\x67\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x67\x3e\x0a\x3c\x2f\
+\x73\x76\x67\x3e\
+"
+
+qt_resource_name = b"\
+\x00\x05\
+\x00\x6f\xa6\x53\
+\x00\x69\
+\x00\x63\x00\x6f\x00\x6e\x00\x73\
+\x00\x0b\
+\x08\x6e\xb4\xc7\
+\x00\x65\
+\x00\x78\x00\x70\x00\x69\x00\x72\x00\x65\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x09\
+\x0b\x61\x86\x47\
+\x00\x62\
+\x00\x61\x00\x74\x00\x6f\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x12\
+\x04\x3b\x74\x87\
+\x00\x73\
+\x00\x74\x00\x61\x00\x74\x00\x75\x00\x73\x00\x5f\x00\x77\x00\x61\x00\x69\x00\x74\x00\x69\x00\x6e\x00\x67\x00\x2e\x00\x73\x00\x76\
+\x00\x67\
+\x00\x11\
+\x0b\x74\x90\xa7\
+\x00\x63\
+\x00\x61\x00\x73\x00\x68\x00\x61\x00\x63\x00\x63\x00\x74\x00\x2d\x00\x6c\x00\x6f\x00\x67\x00\x6f\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\
+\x00\x0e\
+\x0d\x16\x86\x47\
+\x00\x6d\
+\x00\x69\x00\x63\x00\x72\x00\x6f\x00\x70\x00\x68\x00\x6f\x00\x6e\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x05\x95\xd0\xa7\
+\x00\x75\
+\x00\x6e\x00\x6c\x00\x6f\x00\x63\x00\x6b\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x18\
+\x0f\x92\x55\xa7\
+\x00\x63\
+\x00\x61\x00\x73\x00\x68\x00\x73\x00\x68\x00\x75\x00\x66\x00\x66\x00\x6c\x00\x65\x00\x5f\x00\x6f\x00\x6e\x00\x5f\x00\x65\x00\x72\
+\x00\x72\x00\x6f\x00\x72\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x0b\
+\x09\xd1\xc3\xa7\
+\x00\x6d\
+\x00\x75\x00\x74\x00\x61\x00\x62\x00\x6c\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x11\
+\x0e\x07\xd3\x47\
+\x00\x65\
+\x00\x6c\x00\x65\x00\x63\x00\x74\x00\x72\x00\x6f\x00\x6e\x00\x2d\x00\x63\x00\x61\x00\x73\x00\x68\x00\x2e\x00\x73\x00\x76\x00\x67\
+\
+\x00\x0a\
+\x0d\xcb\x00\x07\
+\x00\x6c\
+\x00\x65\x00\x64\x00\x67\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x12\
+\x04\x28\x8e\x67\
+\x00\x73\
+\x00\x74\x00\x61\x00\x74\x00\x75\x00\x73\x00\x5f\x00\x6c\x00\x61\x00\x67\x00\x67\x00\x69\x00\x6e\x00\x67\x00\x2e\x00\x73\x00\x76\
+\x00\x67\
+\x00\x0d\
+\x0c\xa6\xe2\x07\
+\x00\x74\
+\x00\x61\x00\x62\x00\x5f\x00\x63\x00\x6f\x00\x69\x00\x6e\x00\x73\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x1f\
+\x09\x46\x4b\x47\
+\x00\x73\
+\x00\x74\x00\x61\x00\x74\x00\x75\x00\x73\x00\x5f\x00\x63\x00\x6f\x00\x6e\x00\x6e\x00\x65\x00\x63\x00\x74\x00\x65\x00\x64\x00\x5f\
+\x00\x70\x00\x72\x00\x6f\x00\x78\x00\x79\x00\x5f\x00\x66\x00\x6f\x00\x72\x00\x6b\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x10\
+\x0b\xf0\xa3\xa7\
+\x00\x71\
+\x00\x72\x00\x63\x00\x6f\x00\x64\x00\x65\x00\x5f\x00\x77\x00\x68\x00\x69\x00\x74\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x08\
+\x0b\x7f\x55\xe7\
+\x00\x73\
+\x00\x65\x00\x61\x00\x6c\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x17\
+\x0c\xe4\xc4\xc7\
+\x00\x65\
+\x00\x6c\x00\x65\x00\x63\x00\x74\x00\x72\x00\x6f\x00\x6e\x00\x5f\x00\x6c\x00\x69\x00\x67\x00\x68\x00\x74\x00\x5f\x00\x69\x00\x63\
+\x00\x6f\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x0d\
+\x0b\xce\xfb\xa7\
+\x00\x71\
+\x00\x72\x00\x5f\x00\x66\x00\x69\x00\x6e\x00\x64\x00\x65\x00\x72\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x11\
+\x0c\xc5\x8e\x27\
+\x00\x64\
+\x00\x69\x00\x67\x00\x69\x00\x74\x00\x61\x00\x6c\x00\x62\x00\x69\x00\x74\x00\x62\x00\x6f\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\
+\x00\x17\
+\x04\x3d\x6a\x87\
+\x00\x71\
+\x00\x75\x00\x65\x00\x73\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x2d\x00\x6d\x00\x61\x00\x72\x00\x6b\x00\x2d\x00\x6c\x00\x69\x00\x67\
+\x00\x68\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x13\
+\x0b\x09\xcd\x87\
+\x00\x74\
+\x00\x72\x00\x65\x00\x7a\x00\x6f\x00\x72\x00\x5f\x00\x75\x00\x6e\x00\x70\x00\x61\x00\x69\x00\x72\x00\x65\x00\x64\x00\x2e\x00\x70\
+\x00\x6e\x00\x67\
+\x00\x14\
+\x02\x1f\xb6\x07\
+\x00\x74\
+\x00\x61\x00\x62\x00\x5f\x00\x63\x00\x6f\x00\x6e\x00\x76\x00\x65\x00\x72\x00\x74\x00\x65\x00\x72\x00\x5f\x00\x62\x00\x77\x00\x2e\
+\x00\x73\x00\x76\x00\x67\
+\x00\x17\
+\x0c\x0a\x2b\xe7\
+\x00\x73\
+\x00\x74\x00\x61\x00\x74\x00\x75\x00\x73\x00\x5f\x00\x6c\x00\x61\x00\x67\x00\x67\x00\x69\x00\x6e\x00\x67\x00\x5f\x00\x66\x00\x6f\
+\x00\x72\x00\x6b\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x08\
+\x05\x9e\x54\xa7\
+\x00\x6c\
+\x00\x6f\x00\x63\x00\x6b\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x1a\
+\x0e\x11\x56\x67\
+\x00\x64\
+\x00\x69\x00\x67\x00\x69\x00\x74\x00\x61\x00\x6c\x00\x62\x00\x69\x00\x74\x00\x62\x00\x6f\x00\x78\x00\x5f\x00\x75\x00\x6e\x00\x70\
+\x00\x61\x00\x69\x00\x72\x00\x65\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0f\
+\x0d\xcf\x0e\x87\
+\x00\x70\
+\x00\x61\x00\x70\x00\x65\x00\x72\x00\x2d\x00\x70\x00\x6c\x00\x61\x00\x6e\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x13\
+\x0f\x56\x95\xc7\
+\x00\x6c\
+\x00\x65\x00\x64\x00\x67\x00\x65\x00\x72\x00\x5f\x00\x75\x00\x6e\x00\x70\x00\x61\x00\x69\x00\x72\x00\x65\x00\x64\x00\x2e\x00\x70\
+\x00\x6e\x00\x67\
+\x00\x0c\
+\x07\x08\x5a\x67\
+\x00\x74\
+\x00\x61\x00\x62\x00\x5f\x00\x73\x00\x65\x00\x6e\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x07\x7e\xfa\x47\
+\x00\x63\
+\x00\x6f\x00\x6e\x00\x66\x00\x69\x00\x72\x00\x6d\x00\x65\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x0f\
+\x01\x60\xb1\x07\
+\x00\x74\
+\x00\x72\x00\x61\x00\x73\x00\x68\x00\x2d\x00\x31\x00\x30\x00\x2d\x00\x32\x00\x34\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x11\
+\x0f\x67\x22\x87\
+\x00\x74\
+\x00\x61\x00\x62\x00\x5f\x00\x63\x00\x6f\x00\x6e\x00\x76\x00\x65\x00\x72\x00\x74\x00\x65\x00\x72\x00\x2e\x00\x73\x00\x76\x00\x67\
+\
+\x00\x0f\
+\x0e\x5e\x94\x67\
+\x00\x70\
+\x00\x72\x00\x65\x00\x66\x00\x65\x00\x72\x00\x65\x00\x6e\x00\x63\x00\x65\x00\x73\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x08\
+\x08\xc8\x55\xe7\
+\x00\x73\
+\x00\x61\x00\x76\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x0a\
+\x07\xf8\xd0\x07\
+\x00\x75\
+\x00\x6e\x00\x70\x00\x61\x00\x69\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x0c\
+\x09\xa1\x43\x87\
+\x00\x65\
+\x00\x64\x00\x69\x00\x74\x00\x5f\x00\x6e\x00\x66\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x06\x7c\x5a\x07\
+\x00\x63\
+\x00\x6f\x00\x70\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x1a\
+\x0e\x47\x8b\x27\
+\x00\x73\
+\x00\x74\x00\x61\x00\x74\x00\x75\x00\x73\x00\x5f\x00\x63\x00\x6f\x00\x6e\x00\x6e\x00\x65\x00\x63\x00\x74\x00\x65\x00\x64\x00\x5f\
+\x00\x70\x00\x72\x00\x6f\x00\x78\x00\x79\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x13\
+\x0f\x28\x5a\x67\
+\x00\x73\
+\x00\x61\x00\x76\x00\x65\x00\x5f\x00\x64\x00\x61\x00\x72\x00\x6b\x00\x5f\x00\x74\x00\x68\x00\x65\x00\x6d\x00\x65\x00\x2e\x00\x73\
+\x00\x76\x00\x67\
+\x00\x18\
+\x08\x60\xe4\x07\
+\x00\x65\
+\x00\x6c\x00\x65\x00\x63\x00\x74\x00\x72\x00\x6f\x00\x6e\x00\x2d\x00\x63\x00\x61\x00\x73\x00\x68\x00\x2d\x00\x75\x00\x70\x00\x64\
+\x00\x61\x00\x74\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x1a\
+\x02\x66\x8c\xa7\
+\x00\x70\
+\x00\x61\x00\x70\x00\x65\x00\x72\x00\x2d\x00\x70\x00\x6c\x00\x61\x00\x6e\x00\x65\x00\x5f\x00\x64\x00\x61\x00\x72\x00\x6b\x00\x5f\
+\x00\x74\x00\x68\x00\x65\x00\x6d\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x0a\
+\x06\x99\x52\x27\
+\x00\x69\
+\x00\x6d\x00\x70\x00\x6f\x00\x72\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x19\
+\x00\x09\xa0\x87\
+\x00\x73\
+\x00\x74\x00\x61\x00\x74\x00\x75\x00\x73\x00\x5f\x00\x63\x00\x6f\x00\x6e\x00\x6e\x00\x65\x00\x63\x00\x74\x00\x65\x00\x64\x00\x5f\
+\x00\x66\x00\x6f\x00\x72\x00\x6b\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x14\
+\x0a\x21\xdc\x47\
+\x00\x6b\
+\x00\x65\x00\x65\x00\x70\x00\x6b\x00\x65\x00\x79\x00\x5f\x00\x75\x00\x6e\x00\x70\x00\x61\x00\x69\x00\x72\x00\x65\x00\x64\x00\x2e\
+\x00\x70\x00\x6e\x00\x67\
+\x00\x13\
+\x04\x74\xe8\xa7\
+\x00\x63\
+\x00\x61\x00\x73\x00\x68\x00\x73\x00\x68\x00\x75\x00\x66\x00\x66\x00\x6c\x00\x65\x00\x5f\x00\x6f\x00\x66\x00\x66\x00\x2e\x00\x73\
+\x00\x76\x00\x67\
+\x00\x0b\
+\x01\x31\x80\x47\
+\x00\x73\
+\x00\x70\x00\x65\x00\x61\x00\x6b\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x16\
+\x05\x12\xc6\xc7\
+\x00\x71\
+\x00\x75\x00\x65\x00\x73\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x2d\x00\x6d\x00\x61\x00\x72\x00\x6b\x00\x2d\x00\x64\x00\x61\x00\x72\
+\x00\x6b\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x1c\
+\x06\x7f\x1b\x27\
+\x00\x63\
+\x00\x61\x00\x73\x00\x68\x00\x61\x00\x63\x00\x63\x00\x74\x00\x2d\x00\x62\x00\x75\x00\x74\x00\x74\x00\x6f\x00\x6e\x00\x2d\x00\x64\
+\x00\x61\x00\x72\x00\x6b\x00\x6d\x00\x6f\x00\x64\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x09\xea\x1c\x67\
+\x00\x63\
+\x00\x6c\x00\x6f\x00\x63\x00\x6b\x00\x34\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x0c\
+\x00\x32\x3c\x67\
+\x00\x73\
+\x00\x61\x00\x74\x00\x6f\x00\x63\x00\x68\x00\x69\x00\x70\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x16\
+\x09\xa0\xd5\x87\
+\x00\x65\
+\x00\x6c\x00\x65\x00\x63\x00\x74\x00\x72\x00\x6f\x00\x6e\x00\x5f\x00\x64\x00\x61\x00\x72\x00\x6b\x00\x5f\x00\x69\x00\x63\x00\x6f\
+\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x0f\
+\x07\x7f\x0a\xc7\
+\x00\x75\
+\x00\x6e\x00\x63\x00\x6f\x00\x6e\x00\x66\x00\x69\x00\x72\x00\x6d\x00\x65\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x15\
+\x08\xb4\x9b\x87\
+\x00\x69\
+\x00\x6d\x00\x70\x00\x6f\x00\x72\x00\x74\x00\x5f\x00\x64\x00\x61\x00\x72\x00\x6b\x00\x5f\x00\x74\x00\x68\x00\x65\x00\x6d\x00\x65\
+\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x10\
+\x01\xf0\x7d\xa7\
+\x00\x74\
+\x00\x61\x00\x62\x00\x5f\x00\x63\x00\x6f\x00\x6e\x00\x74\x00\x61\x00\x63\x00\x74\x00\x73\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0c\
+\x0a\xcf\x56\xa7\
+\x00\x74\
+\x00\x6f\x00\x72\x00\x5f\x00\x6c\x00\x6f\x00\x67\x00\x6f\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x0a\
+\x01\x6a\x26\xe7\
+\x00\x74\
+\x00\x72\x00\x65\x00\x7a\x00\x6f\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0f\
+\x06\x95\xf4\x67\
+\x00\x74\
+\x00\x61\x00\x62\x00\x5f\x00\x63\x00\x6f\x00\x6e\x00\x73\x00\x6f\x00\x6c\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x00\xb5\x45\xe7\
+\x00\x77\
+\x00\x61\x00\x72\x00\x6e\x00\x69\x00\x6e\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x00\x28\x5a\xe7\
+\x00\x66\
+\x00\x69\x00\x6c\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x0b\xb7\x58\x67\
+\x00\x73\
+\x00\x65\x00\x65\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x14\
+\x04\x52\xd5\xa7\
+\x00\x73\
+\x00\x74\x00\x61\x00\x74\x00\x75\x00\x73\x00\x5f\x00\x63\x00\x6f\x00\x6e\x00\x6e\x00\x65\x00\x63\x00\x74\x00\x65\x00\x64\x00\x2e\
+\x00\x73\x00\x76\x00\x67\
+\x00\x0a\
+\x09\xed\x1c\x67\
+\x00\x63\
+\x00\x6c\x00\x6f\x00\x63\x00\x6b\x00\x35\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x11\
+\x07\x7c\xaf\x47\
+\x00\x74\
+\x00\x61\x00\x62\x00\x5f\x00\x61\x00\x64\x00\x64\x00\x72\x00\x65\x00\x73\x00\x73\x00\x65\x00\x73\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\
+\x00\x0a\
+\x09\xe8\x1c\x67\
+\x00\x63\
+\x00\x6c\x00\x6f\x00\x63\x00\x6b\x00\x32\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x0b\
+\x01\x2b\x2f\xa7\
+\x00\x6b\
+\x00\x65\x00\x65\x00\x70\x00\x6b\x00\x65\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x05\x71\x8d\x67\
+\x00\x74\
+\x00\x61\x00\x62\x00\x5f\x00\x74\x00\x6f\x00\x6b\x00\x65\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x0a\
+\x09\xeb\x1c\x67\
+\x00\x63\
+\x00\x6c\x00\x6f\x00\x63\x00\x6b\x00\x33\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x07\
+\x01\xcc\x57\xa7\
+\x00\x6b\
+\x00\x65\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x12\
+\x03\x7a\x81\xe7\
+\x00\x63\
+\x00\x61\x00\x73\x00\x68\x00\x73\x00\x68\x00\x75\x00\x66\x00\x66\x00\x6c\x00\x65\x00\x5f\x00\x6f\x00\x6e\x00\x2e\x00\x73\x00\x76\
+\x00\x67\
+\x00\x15\
+\x08\xd9\x92\x87\
+\x00\x73\
+\x00\x61\x00\x74\x00\x6f\x00\x63\x00\x68\x00\x69\x00\x70\x00\x5f\x00\x75\x00\x6e\x00\x70\x00\x61\x00\x69\x00\x72\x00\x65\x00\x64\
+\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x17\
+\x0f\xfe\x4a\x07\
+\x00\x73\
+\x00\x74\x00\x61\x00\x74\x00\x75\x00\x73\x00\x5f\x00\x64\x00\x69\x00\x73\x00\x63\x00\x6f\x00\x6e\x00\x6e\x00\x65\x00\x63\x00\x74\
+\x00\x65\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x0a\
+\x09\xf1\x1c\x67\
+\x00\x63\
+\x00\x6c\x00\x6f\x00\x63\x00\x6b\x00\x31\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x12\
+\x0d\xcd\x80\x87\
+\x00\x6f\
+\x00\x70\x00\x65\x00\x6e\x00\x61\x00\x6c\x00\x69\x00\x61\x00\x73\x00\x2d\x00\x6c\x00\x6f\x00\x67\x00\x6f\x00\x2e\x00\x73\x00\x76\
+\x00\x67\
+\x00\x0a\
+\x05\xab\x4b\x87\
+\x00\x71\
+\x00\x72\x00\x63\x00\x6f\x00\x64\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x0f\
+\x06\x27\xab\xc7\
+\x00\x74\
+\x00\x61\x00\x62\x00\x5f\x00\x68\x00\x69\x00\x73\x00\x74\x00\x6f\x00\x72\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x10\
+\x09\xce\x49\xa3\
+\x00\x43\
+\x00\x61\x00\x73\x00\x68\x00\x53\x00\x68\x00\x75\x00\x66\x00\x66\x00\x6c\x00\x65\x00\x4c\x00\x6f\x00\x67\x00\x6f\x00\x73\
+\x00\x0f\
+\x00\x18\xcd\xa7\
+\x00\x74\
+\x00\x61\x00\x62\x00\x5f\x00\x72\x00\x65\x00\x63\x00\x65\x00\x69\x00\x76\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x11\
+\x01\x2b\x17\xa7\
+\x00\x6c\
+\x00\x6f\x00\x67\x00\x6f\x00\x2d\x00\x76\x00\x65\x00\x72\x00\x74\x00\x69\x00\x63\x00\x61\x00\x6c\x00\x2e\x00\x73\x00\x76\x00\x67\
+\
+\x00\x18\
+\x05\x75\x27\x87\
+\x00\x6c\
+\x00\x6f\x00\x67\x00\x6f\x00\x2d\x00\x76\x00\x65\x00\x72\x00\x74\x00\x69\x00\x63\x00\x61\x00\x6c\x00\x5f\x00\x67\x00\x72\x00\x61\
+\x00\x79\x00\x65\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
+"
+
+qt_resource_struct_v1 = b"\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x4b\x00\x00\x00\x02\
+\x00\x00\x06\x10\x00\x01\x00\x00\x00\x01\x00\x02\x72\xeb\
+\x00\x00\x0a\xe0\x00\x00\x00\x00\x00\x01\x00\x04\x4d\xb6\
+\x00\x00\x08\x8a\x00\x00\x00\x00\x00\x01\x00\x03\x5e\xa0\
+\x00\x00\x07\x48\x00\x00\x00\x00\x00\x01\x00\x02\xc8\x0d\
+\x00\x00\x08\x6e\x00\x00\x00\x00\x00\x01\x00\x03\x4f\xca\
+\x00\x00\x09\x40\x00\x00\x00\x00\x00\x01\x00\x03\xbc\x19\
+\x00\x00\x06\xa2\x00\x00\x00\x00\x00\x01\x00\x02\x98\x81\
+\x00\x00\x04\x4c\x00\x00\x00\x00\x00\x01\x00\x01\x9f\x38\
+\x00\x00\x08\x30\x00\x00\x00\x00\x00\x01\x00\x03\x46\x70\
+\x00\x00\x09\x96\x00\x00\x00\x00\x00\x01\x00\x03\xec\x65\
+\x00\x00\x07\xec\x00\x00\x00\x00\x00\x01\x00\x03\x2a\xab\
+\x00\x00\x03\x0c\x00\x01\x00\x00\x00\x01\x00\x01\x5a\xac\
+\x00\x00\x05\xbc\x00\x00\x00\x00\x00\x01\x00\x02\x5f\x74\
+\x00\x00\x09\xaa\x00\x00\x00\x00\x00\x01\x00\x04\x01\x8a\
+\x00\x00\x01\x66\x00\x01\x00\x00\x00\x01\x00\x00\xe0\x23\
+\x00\x00\x00\x44\x00\x01\x00\x00\x00\x01\x00\x00\x22\x0e\
+\x00\x00\x02\xac\x00\x00\x00\x00\x00\x01\x00\x01\x4d\x89\
+\x00\x00\x08\xb6\x00\x01\x00\x00\x00\x01\x00\x03\x8c\xdc\
+\x00\x00\x06\x76\x00\x00\x00\x00\x00\x01\x00\x02\x83\x02\
+\x00\x00\x06\xbe\x00\x00\x00\x00\x00\x01\x00\x02\x99\x98\
+\x00\x00\x09\x5c\x00\x00\x00\x00\x00\x01\x00\x03\xc3\x1b\
+\x00\x00\x00\xb8\x00\x01\x00\x00\x00\x01\x00\x00\x53\xf3\
+\x00\x00\x03\x6e\x00\x01\x00\x00\x00\x01\x00\x01\x74\xac\
+\x00\x00\x0a\x7c\x00\x01\x00\x00\x00\x01\x00\x04\x45\xa5\
+\x00\x00\x0a\x96\x00\x00\x00\x00\x00\x01\x00\x04\x48\x6c\
+\x00\x00\x05\x0a\x00\x00\x00\x00\x00\x01\x00\x02\x0e\x5c\
+\x00\x00\x06\xf0\x00\x00\x00\x00\x00\x01\x00\x02\xa7\x65\
+\x00\x00\x08\x4a\x00\x00\x00\x00\x00\x01\x00\x03\x4e\x25\
+\x00\x00\x05\xf6\x00\x00\x00\x00\x00\x01\x00\x02\x69\xa5\
+\x00\x00\x04\x0e\x00\x00\x00\x00\x00\x01\x00\x01\x96\x96\
+\x00\x00\x08\xfe\x00\x00\x00\x00\x00\x01\x00\x03\xa6\x9e\
+\x00\x00\x04\x2c\x00\x01\x00\x00\x00\x01\x00\x01\x9a\x5c\
+\x00\x00\x07\x98\x00\x01\x00\x00\x00\x01\x00\x03\x05\x51\
+\x00\x00\x04\xd2\x00\x00\x00\x00\x00\x01\x00\x01\xe7\x27\
+\x00\x00\x05\x86\x00\x00\x00\x00\x00\x01\x00\x02\x26\x07\
+\x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x07\xbc\x00\x00\x00\x00\x00\x01\x00\x03\x21\x3d\
+\x00\x00\x04\xbc\x00\x00\x00\x00\x00\x01\x00\x01\xde\xa8\
+\x00\x00\x09\xd4\x00\x00\x00\x00\x00\x01\x00\x04\x16\xf5\
+\x00\x00\x01\xb0\x00\x01\x00\x00\x00\x01\x00\x00\xeb\x5e\
+\x00\x00\x07\x66\x00\x00\x00\x00\x00\x01\x00\x02\xd6\xad\
+\x00\x00\x04\xec\x00\x00\x00\x00\x00\x01\x00\x02\x02\xfc\
+\x00\x00\x0a\xba\x00\x02\x00\x00\x00\x02\x00\x00\x00\x4d\
+\x00\x00\x01\x08\x00\x00\x00\x00\x00\x01\x00\x00\x8e\x6a\
+\x00\x00\x09\x26\x00\x00\x00\x00\x00\x01\x00\x03\xa8\x88\
+\x00\x00\x07\x2e\x00\x00\x00\x00\x00\x01\x00\x02\xb4\x89\
+\x00\x00\x09\x7c\x00\x00\x00\x00\x00\x01\x00\x03\xd9\x8d\
+\x00\x00\x08\xe4\x00\x00\x00\x00\x00\x01\x00\x03\x93\xbf\
+\x00\x00\x0a\x38\x00\x00\x00\x00\x00\x01\x00\x04\x2c\x8b\
+\x00\x00\x06\x48\x00\x00\x00\x00\x00\x01\x00\x02\x7c\x0e\
+\x00\x00\x08\x12\x00\x00\x00\x00\x00\x01\x00\x03\x2d\xb9\
+\x00\x00\x02\xe0\x00\x00\x00\x00\x00\x01\x00\x01\x54\x97\
+\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x01\x00\x00\x13\x1d\
+\x00\x00\x00\x6e\x00\x00\x00\x00\x00\x01\x00\x00\x2d\xbd\
+\x00\x00\x02\x1a\x00\x00\x00\x00\x00\x01\x00\x00\xf7\x6a\
+\x00\x00\x08\xa0\x00\x00\x00\x00\x00\x01\x00\x03\x6b\x51\
+\x00\x00\x02\x64\x00\x00\x00\x00\x00\x01\x00\x01\x3c\xd4\
+\x00\x00\x01\xf4\x00\x01\x00\x00\x00\x01\x00\x00\xf4\xa3\
+\x00\x00\x03\x3a\x00\x01\x00\x00\x00\x01\x00\x01\x6b\x62\
+\x00\x00\x01\x90\x00\x00\x00\x00\x00\x01\x00\x00\xe7\x0d\
+\x00\x00\x02\x84\x00\x00\x00\x00\x00\x01\x00\x01\x46\x38\
+\x00\x00\x02\x30\x00\x00\x00\x00\x00\x01\x00\x01\x0e\x21\
+\x00\x00\x00\x96\x00\x00\x00\x00\x00\x01\x00\x00\x53\x2f\
+\x00\x00\x01\x4c\x00\x00\x00\x00\x00\x01\x00\x00\xdb\x5c\
+\x00\x00\x0a\x52\x00\x00\x00\x00\x00\x01\x00\x04\x3f\xf7\
+\x00\x00\x03\xbe\x00\x00\x00\x00\x00\x01\x00\x01\x87\xc5\
+\x00\x00\x01\x24\x00\x00\x00\x00\x00\x01\x00\x00\xac\xb8\
+\x00\x00\x03\x84\x00\x00\x00\x00\x00\x01\x00\x01\x80\x65\
+\x00\x00\x05\x20\x00\x01\x00\x00\x00\x01\x00\x02\x16\x7e\
+\x00\x00\x04\x98\x00\x01\x00\x00\x00\x01\x00\x01\xcb\xea\
+\x00\x00\x05\x5a\x00\x00\x00\x00\x00\x01\x00\x02\x1d\x61\
+\x00\x00\x03\xe2\x00\x00\x00\x00\x00\x01\x00\x01\x91\xcf\
+\x00\x00\x04\x70\x00\x00\x00\x00\x00\x01\x00\x01\xa1\xd4\
+\x00\x00\x00\xd2\x00\x00\x00\x00\x00\x01\x00\x00\x63\xca\
+\x00\x00\x0a\x04\x00\x01\x00\x00\x00\x01\x00\x04\x25\xa2\
+\x00\x00\x0b\x04\x00\x00\x00\x00\x00\x01\x00\x04\x52\x4c\
+\x00\x00\x0b\x2c\x00\x00\x00\x00\x00\x01\x00\x04\x75\x0a\
+"
+
+qt_resource_struct_v2 = b"\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x4b\x00\x00\x00\x02\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x06\x10\x00\x01\x00\x00\x00\x01\x00\x02\x72\xeb\
+\x00\x00\x01\x6b\x2b\x6e\x5e\xf0\
+\x00\x00\x0a\xe0\x00\x00\x00\x00\x00\x01\x00\x04\x4d\xb6\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x08\x8a\x00\x00\x00\x00\x00\x01\x00\x03\x5e\xa0\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x07\x48\x00\x00\x00\x00\x00\x01\x00\x02\xc8\x0d\
+\x00\x00\x01\x70\x37\x13\xb0\xa5\
+\x00\x00\x08\x6e\x00\x00\x00\x00\x00\x01\x00\x03\x4f\xca\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x09\x40\x00\x00\x00\x00\x00\x01\x00\x03\xbc\x19\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x06\xa2\x00\x00\x00\x00\x00\x01\x00\x02\x98\x81\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x04\x4c\x00\x00\x00\x00\x00\x01\x00\x01\x9f\x38\
+\x00\x00\x01\x88\x16\x8f\xd0\x0a\
+\x00\x00\x08\x30\x00\x00\x00\x00\x00\x01\x00\x03\x46\x70\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x09\x96\x00\x00\x00\x00\x00\x01\x00\x03\xec\x65\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x07\xec\x00\x00\x00\x00\x00\x01\x00\x03\x2a\xab\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x03\x0c\x00\x01\x00\x00\x00\x01\x00\x01\x5a\xac\
+\x00\x00\x01\x6c\x4d\xfc\xf4\x58\
+\x00\x00\x05\xbc\x00\x00\x00\x00\x00\x01\x00\x02\x5f\x74\
+\x00\x00\x01\x70\x37\x13\xb0\xa4\
+\x00\x00\x09\xaa\x00\x00\x00\x00\x00\x01\x00\x04\x01\x8a\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x01\x66\x00\x01\x00\x00\x00\x01\x00\x00\xe0\x23\
+\x00\x00\x01\x6b\x2b\x6e\x5e\xf0\
+\x00\x00\x00\x44\x00\x01\x00\x00\x00\x01\x00\x00\x22\x0e\
+\x00\x00\x01\x6b\x2b\x6e\x5e\xf0\
+\x00\x00\x02\xac\x00\x00\x00\x00\x00\x01\x00\x01\x4d\x89\
+\x00\x00\x01\x70\x37\x13\xb0\xa5\
+\x00\x00\x08\xb6\x00\x01\x00\x00\x00\x01\x00\x03\x8c\xdc\
+\x00\x00\x01\x6b\x2b\x6e\x5e\xf0\
+\x00\x00\x06\x76\x00\x00\x00\x00\x00\x01\x00\x02\x83\x02\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x06\xbe\x00\x00\x00\x00\x00\x01\x00\x02\x99\x98\
+\x00\x00\x01\x70\x37\x13\xb0\xa5\
+\x00\x00\x09\x5c\x00\x00\x00\x00\x00\x01\x00\x03\xc3\x1b\
+\x00\x00\x01\x88\x12\xb7\xf1\x6b\
+\x00\x00\x00\xb8\x00\x01\x00\x00\x00\x01\x00\x00\x53\xf3\
+\x00\x00\x01\x67\xf0\x3d\x4e\xe8\
+\x00\x00\x03\x6e\x00\x01\x00\x00\x00\x01\x00\x01\x74\xac\
+\x00\x00\x01\x67\xf0\x3d\x4e\xe8\
+\x00\x00\x0a\x7c\x00\x01\x00\x00\x00\x01\x00\x04\x45\xa5\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x0a\x96\x00\x00\x00\x00\x00\x01\x00\x04\x48\x6c\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x05\x0a\x00\x00\x00\x00\x00\x01\x00\x02\x0e\x5c\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x06\xf0\x00\x00\x00\x00\x00\x01\x00\x02\xa7\x65\
+\x00\x00\x01\x70\x37\x13\xb0\xa1\
+\x00\x00\x08\x4a\x00\x00\x00\x00\x00\x01\x00\x03\x4e\x25\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x05\xf6\x00\x00\x00\x00\x00\x01\x00\x02\x69\xa5\
+\x00\x00\x01\x70\x37\x13\xb0\xa4\
+\x00\x00\x04\x0e\x00\x00\x00\x00\x00\x01\x00\x01\x96\x96\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x08\xfe\x00\x00\x00\x00\x00\x01\x00\x03\xa6\x9e\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x04\x2c\x00\x01\x00\x00\x00\x01\x00\x01\x9a\x5c\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x07\x98\x00\x01\x00\x00\x00\x01\x00\x03\x05\x51\
+\x00\x00\x01\x67\xf0\x3d\x4e\xe8\
+\x00\x00\x04\xd2\x00\x00\x00\x00\x00\x01\x00\x01\xe7\x27\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x05\x86\x00\x00\x00\x00\x00\x01\x00\x02\x26\x07\
+\x00\x00\x01\x70\x37\x13\xb0\xa2\
+\x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x07\xbc\x00\x00\x00\x00\x00\x01\x00\x03\x21\x3d\
+\x00\x00\x01\x70\x37\x13\xb0\xa4\
+\x00\x00\x04\xbc\x00\x00\x00\x00\x00\x01\x00\x01\xde\xa8\
+\x00\x00\x01\x70\x37\x13\xb0\xa6\
+\x00\x00\x09\xd4\x00\x00\x00\x00\x00\x01\x00\x04\x16\xf5\
+\x00\x00\x01\x70\x37\x13\xb0\xa5\
+\x00\x00\x01\xb0\x00\x01\x00\x00\x00\x01\x00\x00\xeb\x5e\
+\x00\x00\x01\x6b\x2b\x6e\x5e\xf0\
+\x00\x00\x07\x66\x00\x00\x00\x00\x00\x01\x00\x02\xd6\xad\
+\x00\x00\x01\x70\x37\x13\xb0\xa3\
+\x00\x00\x04\xec\x00\x00\x00\x00\x00\x01\x00\x02\x02\xfc\
+\x00\x00\x01\x88\x12\xb7\xf1\x6a\
+\x00\x00\x0a\xba\x00\x02\x00\x00\x00\x02\x00\x00\x00\x4d\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x01\x08\x00\x00\x00\x00\x00\x01\x00\x00\x8e\x6a\
+\x00\x00\x01\x88\x12\xb7\xf1\x6b\
+\x00\x00\x09\x26\x00\x00\x00\x00\x00\x01\x00\x03\xa8\x88\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x07\x2e\x00\x00\x00\x00\x00\x01\x00\x02\xb4\x89\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x09\x7c\x00\x00\x00\x00\x00\x01\x00\x03\xd9\x8d\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x08\xe4\x00\x00\x00\x00\x00\x01\x00\x03\x93\xbf\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x0a\x38\x00\x00\x00\x00\x00\x01\x00\x04\x2c\x8b\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x06\x48\x00\x00\x00\x00\x00\x01\x00\x02\x7c\x0e\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x08\x12\x00\x00\x00\x00\x00\x01\x00\x03\x2d\xb9\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x02\xe0\x00\x00\x00\x00\x00\x01\x00\x01\x54\x97\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x01\x00\x00\x13\x1d\
+\x00\x00\x01\x88\x12\xb7\xf1\x6a\
+\x00\x00\x00\x6e\x00\x00\x00\x00\x00\x01\x00\x00\x2d\xbd\
+\x00\x00\x01\x70\x37\x13\xb0\xa2\
+\x00\x00\x02\x1a\x00\x00\x00\x00\x00\x01\x00\x00\xf7\x6a\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x08\xa0\x00\x00\x00\x00\x00\x01\x00\x03\x6b\x51\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x02\x64\x00\x00\x00\x00\x00\x01\x00\x01\x3c\xd4\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x01\xf4\x00\x01\x00\x00\x00\x01\x00\x00\xf4\xa3\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x03\x3a\x00\x01\x00\x00\x00\x01\x00\x01\x6b\x62\
+\x00\x00\x01\x6b\x2b\x6e\x5e\xf0\
+\x00\x00\x01\x90\x00\x00\x00\x00\x00\x01\x00\x00\xe7\x0d\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x02\x84\x00\x00\x00\x00\x00\x01\x00\x01\x46\x38\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x02\x30\x00\x00\x00\x00\x00\x01\x00\x01\x0e\x21\
+\x00\x00\x01\x70\x37\x13\xb0\xa3\
+\x00\x00\x00\x96\x00\x00\x00\x00\x00\x01\x00\x00\x53\x2f\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x01\x4c\x00\x00\x00\x00\x00\x01\x00\x00\xdb\x5c\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x0a\x52\x00\x00\x00\x00\x00\x01\x00\x04\x3f\xf7\
+\x00\x00\x01\x70\x37\x13\xb0\xa4\
+\x00\x00\x03\xbe\x00\x00\x00\x00\x00\x01\x00\x01\x87\xc5\
+\x00\x00\x01\x70\x37\x13\xb0\xa4\
+\x00\x00\x01\x24\x00\x00\x00\x00\x00\x01\x00\x00\xac\xb8\
+\x00\x00\x01\x70\x37\x13\xb0\xa3\
+\x00\x00\x03\x84\x00\x00\x00\x00\x00\x01\x00\x01\x80\x65\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x05\x20\x00\x01\x00\x00\x00\x01\x00\x02\x16\x7e\
+\x00\x00\x01\x6b\x2b\x6e\x5e\xf0\
+\x00\x00\x04\x98\x00\x01\x00\x00\x00\x01\x00\x01\xcb\xea\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x05\x5a\x00\x00\x00\x00\x00\x01\x00\x02\x1d\x61\
+\x00\x00\x01\x70\x37\x13\xb0\xa6\
+\x00\x00\x03\xe2\x00\x00\x00\x00\x00\x01\x00\x01\x91\xcf\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x04\x70\x00\x00\x00\x00\x00\x01\x00\x01\xa1\xd4\
+\x00\x00\x01\x6c\x4d\xfc\xf4\x58\
+\x00\x00\x00\xd2\x00\x00\x00\x00\x00\x01\x00\x00\x63\xca\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+\x00\x00\x0a\x04\x00\x01\x00\x00\x00\x01\x00\x04\x25\xa2\
+\x00\x00\x01\x6b\x2b\x6e\x5e\xf0\
+\x00\x00\x0b\x04\x00\x00\x00\x00\x00\x01\x00\x04\x52\x4c\
+\x00\x00\x01\x6b\x1e\x38\x6d\x98\
+\x00\x00\x0b\x2c\x00\x00\x00\x00\x00\x01\x00\x04\x75\x0a\
+\x00\x00\x01\x6b\x2b\x54\x4b\x28\
+"
+
+qt_version = [int(v) for v in QtCore.qVersion().split('.')]
+if qt_version < [5, 8, 0]:
+ rcc_version = 1
+ qt_resource_struct = qt_resource_struct_v1
+else:
+ rcc_version = 2
+ qt_resource_struct = qt_resource_struct_v2
+
+def qInitResources():
+ QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+def qCleanupResources():
+ QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+qInitResources()
diff --git a/gui/qt/installwizard.py b/electroncash_gui/qt/installwizard.py
similarity index 61%
rename from gui/qt/installwizard.py
rename to electroncash_gui/qt/installwizard.py
index 75dc19867144..6986d59a4163 100644
--- a/gui/qt/installwizard.py
+++ b/electroncash_gui/qt/installwizard.py
@@ -1,27 +1,35 @@
-
+# -*- mode: python3 -*-
import os
+import random
import sys
+import tempfile
import threading
import traceback
+import weakref
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
-from electroncash import Wallet, WalletStorage
-from electroncash.util import UserCancelled, InvalidPassword
+
+from electroncash import keystore, Wallet, WalletStorage
+from electroncash.network import Network
+from electroncash.util import UserCancelled, InvalidPassword, finalization_print_error, TimeoutException
from electroncash.base_wizard import BaseWizard
from electroncash.i18n import _
+from electroncash.wallet import Standard_Wallet
from .seed_dialog import SeedLayout, KeysLayout
from .network_dialog import NetworkChoiceLayout
from .util import *
from .password_dialog import PasswordLayout, PW_NEW
+from .bip38_importer import Bip38Importer
class GoBack(Exception):
pass
+
MSG_GENERATING_WAIT = _("Electron Cash is generating your addresses, please wait...")
MSG_ENTER_ANYTHING = _("Please enter a seed phrase, a master key, a list of "
"Bitcoin addresses, or a list of private keys")
@@ -71,7 +79,6 @@ def paintEvent(self, event):
qp.end()
-
def wizard_dialog(func):
def func_wrapper(*args, **kwargs):
run_next = kwargs['run_next']
@@ -84,15 +91,13 @@ def func_wrapper(*args, **kwargs):
return
except UserCancelled:
return
- #if out is None:
- # out = ()
+
if type(out) is not tuple:
out = (out,)
run_next(*out)
return func_wrapper
-
# WindowModalDialog must come first as it overrides show_error
class InstallWizard(QDialog, MessageBoxMixin, BaseWizard):
@@ -107,7 +112,6 @@ def __init__(self, config, app, plugins, storage):
self.config = config
# Set for base base class
self.plugins = plugins
- self.language_for_seed = config.get('language')
self.setMinimumSize(600, 400)
self.accept_signal.connect(self.accept)
self.title = QLabel()
@@ -147,10 +151,12 @@ def __init__(self, config, app, plugins, storage):
hbox.setStretchFactor(scroll, 1)
outer_vbox.addLayout(hbox)
outer_vbox.addLayout(Buttons(self.back_button, self.next_button))
- self.set_icon(':icons/electron-cash.png')
+ self.set_icon(':icons/electron-cash.svg')
self.show()
self.raise_()
- self.refresh_gui() # Need for QT on MacOSX. Lame.
+
+ # Track object lifecycle
+ finalization_print_error(self)
def run_and_get_wallet(self):
@@ -220,6 +226,7 @@ def on_filename(filename):
self.name_e.setText(n)
while True:
+ password = None
if self.storage.file_exists() and not self.storage.is_encrypted():
break
if self.loop.exec_() != 2: # 2 = next
@@ -260,7 +267,7 @@ def on_filename(filename):
return
self.storage.upgrade()
self.wallet = Wallet(self.storage)
- return self.wallet
+ return self.wallet, password
action = self.storage.get_action()
if action and action != 'new':
@@ -276,12 +283,10 @@ def on_filename(filename):
if action:
# self.wallet is set in run
self.run(action)
- return self.wallet
+ return self.wallet, password
self.wallet = Wallet(self.storage)
- return self.wallet
-
-
+ return self.wallet, password
def finished(self):
"""Called in hardware client wrapper, in order to close popups."""
@@ -294,7 +299,7 @@ def on_error(self, exc_info):
def set_icon(self, filename):
prior_filename, self.icon_filename = self.icon_filename, filename
- self.logo.setPixmap(QPixmap(filename).scaledToWidth(60))
+ self.logo.setPixmap(QIcon(filename).pixmap(60))
return prior_filename
def set_layout(self, layout, title=None, next_enabled=True):
@@ -306,7 +311,7 @@ def set_layout(self, layout, title=None, next_enabled=True):
QWidget().setLayout(prior_layout)
self.main_widget.setLayout(layout)
self.back_button.setEnabled(True)
- self.next_button.setEnabled(next_enabled)
+ self.next_button.setEnabled(bool(next_enabled))
if next_enabled:
self.next_button.setFocus()
self.main_widget.setVisible(True)
@@ -343,10 +348,18 @@ def text_input(self, title, message, is_valid, allow_multi=False):
return slayout.get_text()
def seed_input(self, title, message, is_seed, options):
- slayout = SeedLayout(title=message, is_seed=is_seed, options=options, parent=self)
+ slayout = SeedLayout(title=message, is_seed=is_seed, options=options, parent=self, editable=True)
self.exec_layout(slayout, title, next_enabled=False)
return slayout.get_seed(), slayout.is_bip39, slayout.is_ext
+ def bip38_prompt_for_pw(self, bip38_keys):
+ ''' Reimplemented from basewizard superclass. Expected to return the pw
+ dict or None. '''
+ d = Bip38Importer(bip38_keys, parent=self.top_level_window())
+ res = d.exec_()
+ d.setParent(None) # python GC quicker if this happens
+ return d.decoded_keys # dict will be empty if user cancelled
+
@wizard_dialog
def add_xpub_dialog(self, title, message, is_valid, run_next, allow_multi=False):
return self.text_input(title, message, is_valid, allow_multi)
@@ -384,9 +397,9 @@ def confirm_seed_dialog(self, run_next, test):
return seed
@wizard_dialog
- def show_seed_dialog(self, run_next, seed_text):
+ def show_seed_dialog(self, run_next, seed_text, editable=True):
title = _("Your wallet generation seed is:")
- slayout = SeedLayout(seed=seed_text, title=title, msg=True, options=['ext'])
+ slayout = SeedLayout(seed=seed_text, title=title, msg=True, options=['ext'], editable=False)
self.exec_layout(slayout)
return slayout.is_ext
@@ -399,38 +412,42 @@ def pw_layout(self, msg, kind):
@wizard_dialog
def request_password(self, run_next):
"""Request the user enter a new password and confirm it. Return
- the password or None for no password."""
+ the password or None for no password. Note that this dialog screen
+ cannot go back, and instead the user can only cancel."""
return self.pw_layout(MSG_ENTER_PASSWORD, PW_NEW)
- def show_restore(self, wallet, network):
- # FIXME: these messages are shown after the install wizard is
- # finished and the window closed. On MacOSX they appear parented
- # with a re-appeared ghost install wizard window...
- if network:
- def task():
- wallet.wait_until_synchronized()
- if wallet.is_found():
- msg = _("Recovery successful")
- else:
- msg = _("No transactions found for this seed")
- self.synchronized_signal.emit(msg)
- self.synchronized_signal.connect(self.show_message)
- t = threading.Thread(target = task)
- t.daemon = True
- t.start()
- else:
- msg = _("This wallet was restored offline. It may "
- "contain more addresses than displayed.")
- self.show_message(msg)
+ @staticmethod
+ def _add_extra_button_to_layout(extra_button, layout):
+ if (not isinstance(extra_button, (list, tuple))
+ or not len(extra_button) == 2):
+ return
+ but_title, but_action = extra_button
+ hbox = QHBoxLayout()
+ hbox.setContentsMargins(12,24,12,12)
+ but = QPushButton(but_title)
+ hbox.addStretch(1)
+ hbox.addWidget(but)
+ layout.addLayout(hbox)
+ but.clicked.connect(but_action)
@wizard_dialog
- def confirm_dialog(self, title, message, run_next):
- self.confirm(message, title)
+ def confirm_dialog(self, title, message, run_next, extra_button=None):
+ self.confirm(message, title, extra_button=extra_button)
- def confirm(self, message, title):
+ def confirm(self, message, title, extra_button=None):
label = WWLabel(message)
+
+ textInteractionFlags = (Qt.LinksAccessibleByMouse
+ | Qt.TextSelectableByMouse
+ | Qt.TextSelectableByKeyboard
+ | Qt.LinksAccessibleByKeyboard)
+ label.setTextInteractionFlags(textInteractionFlags)
+ label.setOpenExternalLinks(True)
+
vbox = QVBoxLayout()
vbox.addWidget(label)
+ if extra_button:
+ self._add_extra_button_to_layout(extra_button, vbox)
self.exec_layout(vbox, title)
@wizard_dialog
@@ -448,12 +465,14 @@ def waiting_dialog(self, task, msg):
t.join()
@wizard_dialog
- def choice_dialog(self, title, message, choices, run_next):
+ def choice_dialog(self, title, message, choices, run_next, extra_button=None):
c_values = [x[0] for x in choices]
c_titles = [x[1] for x in choices]
clayout = ChoicesLayout(message, c_titles)
vbox = QVBoxLayout()
vbox.addLayout(clayout.layout())
+ if extra_button:
+ self._add_extra_button_to_layout(extra_button, vbox)
self.exec_layout(vbox, title)
action = c_values[clayout.selected_index()]
return action
@@ -473,13 +492,45 @@ def line_dialog(self, run_next, title, message, default, test, warning=''):
line = QLineEdit()
line.setText(default)
def f(text):
- self.next_button.setEnabled(test(text))
+ self.next_button.setEnabled(bool(test(text)))
line.textEdited.connect(f)
vbox.addWidget(line)
vbox.addWidget(WWLabel(warning))
self.exec_layout(vbox, title, next_enabled=test(default))
return ' '.join(line.text().split())
+ @wizard_dialog
+ def derivation_path_dialog(self, run_next, title, message, default, test, warning='', seed='', scannable=False):
+ def on_derivation_scan(derivation_line, seed):
+ derivation_scan_dialog = DerivationDialog(self, seed, DerivationPathScanner.DERIVATION_PATHS)
+ destroyed_print_error(derivation_scan_dialog)
+ selected_path = derivation_scan_dialog.get_selected_path()
+ if selected_path:
+ derivation_line.setText(selected_path)
+ derivation_scan_dialog.deleteLater()
+
+ vbox = QVBoxLayout()
+ vbox.addWidget(WWLabel(message))
+ line = QLineEdit()
+ line.setText(default)
+ def f(text):
+ self.next_button.setEnabled(bool(test(text)))
+ line.textEdited.connect(f)
+ vbox.addWidget(line)
+ vbox.addWidget(WWLabel(warning))
+
+ if scannable:
+ hbox = QHBoxLayout()
+ hbox.setContentsMargins(12,24,12,12)
+ but = QPushButton(_("Scan Derivation Paths..."))
+ hbox.addStretch(1)
+ hbox.addWidget(but)
+ vbox.addLayout(hbox)
+ but.clicked.connect(lambda: on_derivation_scan(line, seed))
+
+ self.exec_layout(vbox, title, next_enabled=test(default))
+ return ' '.join(line.text().split())
+
@wizard_dialog
def show_xpub_dialog(self, xpub, run_next):
msg = ' '.join([
@@ -494,11 +545,11 @@ def show_xpub_dialog(self, xpub, run_next):
def init_network(self, network):
message = _("Electron Cash communicates with remote servers to get "
- "information about your transactions and addresses. The "
- "servers all fulfil the same purpose only differing in "
- "hardware. In most cases you simply want to let Electron Cash "
- "pick one at random. However if you prefer feel free to "
- "select a server manually.")
+ "information about your transactions and addresses. The "
+ "servers all fulfil the same purpose only differing in "
+ "hardware. In most cases you simply want to let Electron Cash "
+ "pick one at random. However if you prefer feel free to "
+ "select a server manually.")
choices = [_("Auto connect"), _("Select server manually")]
title = _("How do you want to connect to a server? ")
clayout = ChoicesLayout(message, choices)
@@ -549,3 +600,201 @@ def on_n(n):
m = int(m_edit.value())
n = int(n_edit.value())
return (m, n)
+
+ linux_hw_wallet_support_dialog = None
+
+ def on_hw_wallet_support(self):
+ ''' Overrides base wizard's noop impl. '''
+ if sys.platform.startswith("linux"):
+ if self.linux_hw_wallet_support_dialog:
+ self.linux_hw_wallet_support_dialog.raise_()
+ return
+ # NB: this should only be imported from Linux
+ from . import udev_installer
+ self.linux_hw_wallet_support_dialog = udev_installer.InstallHardwareWalletSupportDialog(self.top_level_window(), self.plugins)
+ self.linux_hw_wallet_support_dialog.exec_()
+ self.linux_hw_wallet_support_dialog.setParent(None)
+ self.linux_hw_wallet_support_dialog = None
+ else:
+ self.show_error("Linux only facility. FIXME!")
+
+
+class DerivationPathScanner(QThread):
+
+ DERIVATION_PATHS = [
+ "m/44'/145'/0'",
+ "m/44'/0'/0'",
+ "m/44'/245'/0'",
+ "m/144'/44'/0'",
+ "m/144'/0'/0'",
+ "m/44'/0'/0'/0",
+ "m/0",
+ "m/0'",
+ "m/0'/0",
+ "m/0'/0'",
+ "m/0'/0'/0'",
+ "m/44'/145'/0'/0",
+ "m/44'/245'/0",
+ "m/44'/245'/0'/0",
+ "m/49'/0'/0'",
+ "m/84'/0'/0'",
+ ]
+
+ def __init__(self, parent, seed, seed_type, config, update_table_cb):
+ QThread.__init__(self, parent)
+ self.update_table_cb = update_table_cb
+ self.seed = seed
+ self.seed_type = seed_type
+ self.config = config
+ self.aborting = False
+
+ def notify_offline(self):
+ for i, p in enumerate(self.DERIVATION_PATHS):
+ self.update_table_cb(i, _('Offline'))
+
+ def notify_timedout(self, i):
+ self.update_table_cb(i, _('Timed out'))
+
+ def run(self):
+ network = Network.get_instance()
+ if not network:
+ self.notify_offline()
+ return
+
+ for i, p in enumerate(self.DERIVATION_PATHS):
+ if self.aborting:
+ return
+ k = keystore.from_seed(self.seed, '', derivation=p, seed_type=self.seed_type)
+ p_safe = p.replace('/', '_').replace("'", 'h')
+ storage_path = os.path.join(
+ tempfile.gettempdir(),
+ p_safe + '_' + random.getrandbits(32).to_bytes(4, 'big').hex()[:8] + "_not_saved_"
+ )
+ tmp_storage = WalletStorage(storage_path, in_memory_only=True)
+ tmp_storage.put('seed_type', self.seed_type)
+ tmp_storage.put('keystore', k.dump())
+ wallet = Standard_Wallet(tmp_storage)
+ try:
+ wallet.start_threads(network)
+ wallet.synchronize()
+ wallet.print_error("Scanning", p)
+ synched = False
+ for ctr in range(25):
+ try:
+ wallet.wait_until_synchronized(timeout=1.0)
+ synched = True
+ except TimeoutException:
+ wallet.print_error(f'timeout try {ctr+1}/25')
+ if self.aborting:
+ return
+ if not synched:
+ wallet.print_error("Timeout on", p)
+ self.notify_timedout(i)
+ continue
+ while network.is_connecting():
+ time.sleep(0.1)
+ if self.aborting:
+ return
+ num_tx = len(wallet.get_history())
+ self.update_table_cb(i, str(num_tx))
+ finally:
+ wallet.clear_history()
+ wallet.stop_threads()
+
+
+class DerivationDialog(QDialog):
+ scan_result_signal = pyqtSignal(object, object)
+
+ def __init__(self, parent, seed, paths):
+ QDialog.__init__(self, parent)
+
+ self.seed = seed
+ self.seed_type = parent.seed_type
+ self.config = parent.config
+ self.max_seen = 0
+
+ self.setWindowTitle(_('Select Derivation Path'))
+ vbox = QVBoxLayout()
+ self.setLayout(vbox)
+ vbox.setContentsMargins(24, 24, 24, 24)
+
+ self.label = QLabel(self)
+ vbox.addWidget(self.label)
+
+ self.table = QTableWidget(self)
+ self.table.setSelectionMode(QAbstractItemView.SingleSelection)
+ self.table.setSelectionBehavior(QAbstractItemView.SelectRows)
+ self.table.verticalHeader().setVisible(False)
+ self.table.verticalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
+ self.table.setSortingEnabled(False)
+ self.table.setColumnCount(2)
+ self.table.setRowCount(len(paths))
+ self.table.setHorizontalHeaderItem(0, QTableWidgetItem(_('Path')))
+ self.table.setHorizontalHeaderItem(1, QTableWidgetItem(_('Transactions')))
+ self.table.horizontalHeader().setSectionResizeMode(0, QHeaderView.ResizeToContents)
+ self.table.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch)
+ self.table.setMinimumHeight(350)
+
+ for row, d_path in enumerate(paths):
+ path_item = QTableWidgetItem(d_path)
+ path_item.setFlags(Qt.ItemIsSelectable|Qt.ItemIsEnabled)
+ self.table.setItem(row, 0, path_item)
+ transaction_count_item = QTableWidgetItem(_('Scanning...'))
+ transaction_count_item.setFlags(Qt.ItemIsSelectable|Qt.ItemIsEnabled)
+ self.table.setItem(row, 1, transaction_count_item)
+
+ self.table.cellDoubleClicked.connect(self.accept)
+ self.table.selectRow(0)
+ vbox.addWidget(self.table)
+ ok_but = OkButton(self)
+ buts = Buttons(CancelButton(self), ok_but)
+ vbox.addLayout(buts)
+ vbox.addStretch(1)
+ ok_but.setEnabled(True)
+ self.scan_result_signal.connect(self.update_table)
+ self.t = None
+
+ def set_scan_progress(self, n):
+ self.label.setText(_('Scanned {}/{}').format(n, len(DerivationPathScanner.DERIVATION_PATHS)))
+
+ def kill_t(self):
+ if self.t and self.t.isRunning():
+ self.t.aborting = True
+ self.t.wait(5000)
+
+ def showEvent(self, e):
+ super().showEvent(e)
+ if e.isAccepted():
+ self.kill_t()
+ self.t = DerivationPathScanner(self, self.seed, self.seed_type, self.config, self.update_table_cb)
+ self.max_seen = 0
+ self.set_scan_progress(0)
+ self.t.start()
+
+ def closeEvent(self, e):
+ super().closeEvent(e)
+ if e.isAccepted():
+ self.kill_t()
+
+ def update_table_cb(self, row, scan_result):
+ self.scan_result_signal.emit(row, scan_result)
+
+ def update_table(self, row, scan_result):
+ self.set_scan_progress(row+1)
+ try:
+ num = int(scan_result)
+ if num > self.max_seen:
+ self.table.selectRow(row)
+ self.max_seen = num
+ except (ValueError, TypeError):
+ pass
+ self.table.item(row, 1).setText(scan_result)
+
+ def get_selected_path(self):
+ path_to_return = None
+ if self.exec_():
+ pathstr = self.table.selectionModel().selectedRows()
+ row = pathstr[0].row()
+ path_to_return = self.table.item(row, 0).text()
+ self.kill_t()
+ return path_to_return
diff --git a/gui/qt/invoice_list.py b/electroncash_gui/qt/invoice_list.py
similarity index 95%
rename from gui/qt/invoice_list.py
rename to electroncash_gui/qt/invoice_list.py
index 11b394dca321..2c77c6c0b935 100644
--- a/gui/qt/invoice_list.py
+++ b/electroncash_gui/qt/invoice_list.py
@@ -27,6 +27,7 @@
from electroncash.i18n import _
from electroncash.util import format_time, FileImportFailed
+from electroncash.paymentrequest import pr_tooltips
class InvoiceList(MyTreeWidget):
@@ -44,10 +45,12 @@ def on_update(self):
for pr in inv_list:
key = pr.get_id()
status = self.parent.invoices.get_status(key)
+ if status is None:
+ continue
requestor = pr.get_requestor()
exp = pr.get_expiration_date()
date_str = format_time(exp) if exp else _('Never')
- item = QTreeWidgetItem([date_str, requestor, pr.memo, self.parent.format_amount(pr.get_amount(), whitespaces=True), pr_tooltips.get(status,'')])
+ item = QTreeWidgetItem([date_str, requestor, pr.memo, self.parent.format_amount(pr.get_amount(), whitespaces=True), _(pr_tooltips.get(status,''))])
item.setIcon(4, QIcon(pr_icons.get(status)))
item.setData(0, Qt.UserRole, key)
item.setFont(1, QFont(MONOSPACE_FONT))
@@ -86,7 +89,7 @@ def create_menu(self, position):
pr = self.parent.invoices.get(key)
status = self.parent.invoices.get_status(key)
if column_data:
- menu.addAction(_("Copy {}").format(column_title), lambda: self.parent.app.clipboard().setText(column_data))
+ menu.addAction(_("Copy {}").format(column_title), lambda: self.parent.app.clipboard().setText(column_data.strip()))
menu.addAction(_("Details"), lambda: self.parent.show_invoice(key))
if status == PR_UNPAID:
menu.addAction(_("Pay Now"), lambda: self.parent.do_pay_invoice(key))
diff --git a/electroncash_gui/qt/main_window.py b/electroncash_gui/qt/main_window.py
new file mode 100644
index 000000000000..61c45a4d54f9
--- /dev/null
+++ b/electroncash_gui/qt/main_window.py
@@ -0,0 +1,5700 @@
+#!/usr/bin/env python3
+#
+# Electrum - lightweight Bitcoin client
+# Copyright (C) 2012 thomasv@gitorious
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+import base64
+import copy
+import csv
+import json
+import os
+import shutil
+import sys
+import threading
+import time
+import traceback
+from decimal import Decimal as PyDecimal # Qt 5.12 also exports Decimal
+from functools import partial
+from collections import OrderedDict
+from typing import Any, Dict, List, Optional, Set
+
+from PyQt5.QtGui import *
+from PyQt5.QtCore import *
+from PyQt5.QtWidgets import *
+
+from electroncash import keystore, get_config
+from electroncash.address import Address, AddressError, ScriptOutput
+from electroncash.bitcoin import COIN, TYPE_ADDRESS, TYPE_SCRIPT
+from electroncash import networks
+from electroncash.plugins import run_hook
+from electroncash.i18n import _, ngettext, pgettext
+from electroncash.util import (format_time, format_satoshis, PrintError,
+ format_satoshis_plain, NotEnoughFunds,
+ ExcessiveFee, UserCancelled, InvalidPassword,
+ bh2u, bfh, format_fee_satoshis, Weak,
+ print_error)
+import electroncash.web as web
+from electroncash import Transaction
+from electroncash import util, bitcoin, commands, cashacct, token
+from electroncash import paymentrequest
+from electroncash.transaction import OPReturn
+from electroncash.wallet import Multisig_Wallet, sweep_preparations
+from electroncash.contacts import Contact
+from electroncash import rpa
+try:
+ from electroncash.plot import plot_history
+except:
+ plot_history = None
+import electroncash.web as web
+
+from .amountedit import AmountEdit, BTCAmountEdit, MyLineEdit, BTCSatsByteEdit
+from .qrcodewidget import QRCodeWidget, QRDialog
+from .qrtextedit import ShowQRTextEdit, ScanQRTextEdit
+from .transaction_dialog import show_transaction
+from .fee_slider import FeeSlider
+from .popup_widget import ShowPopupLabel, KillPopupLabel
+from . import cashacctqt
+from .util import *
+from .token_meta import TokenMetaQt
+
+try:
+ # pre-load QtMultimedia at app start, if possible
+ # this is because lazy-loading it from within Python
+ # callbacks led to crashes on Linux, likely due to
+ # bugs in PyQt5 (crashes wouldn't happen when testing
+ # with PySide2!).
+ from PyQt5.QtMultimedia import QCameraInfo
+ del QCameraInfo # defensive programming: not always available so don't keep name around
+except ImportError as e:
+ pass # we tried to pre-load it, failure is ok; camera just won't be available
+
+
+class StatusBarButton(QPushButton):
+ def __init__(self, icon, tooltip, func):
+ QPushButton.__init__(self, icon, '')
+ self.setToolTip(tooltip)
+ self.setFlat(True)
+ self.setMaximumWidth(25)
+ self.clicked.connect(self.onPress)
+ self.func = func
+ self.setIconSize(QSize(25,25))
+ self.setCursor(Qt.PointingHandCursor)
+
+ def onPress(self, checked=False):
+ '''Drops the unwanted PyQt5 "checked" argument'''
+ self.func()
+
+ def keyPressEvent(self, e):
+ if e.key() == Qt.Key_Return:
+ self.func()
+ else:
+ super().keyPressEvent(e)
+
+
+from electroncash.paymentrequest import PR_PAID
+
+
+class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
+
+ # Note: self.clean_up_connections automatically detects signals named XXX_signal and disconnects them on window close.
+ payment_request_ok_signal = pyqtSignal()
+ payment_request_error_signal = pyqtSignal()
+ new_fx_quotes_signal = pyqtSignal()
+ new_fx_history_signal = pyqtSignal()
+ network_signal = pyqtSignal(str, object)
+ alias_received_signal = pyqtSignal()
+ history_updated_signal = pyqtSignal()
+ labels_updated_signal = pyqtSignal() # note this signal occurs when an explicit update_labels() call happens. Interested GUIs should also listen for history_updated_signal as well which also indicates labels may have changed.
+ on_timer_signal = pyqtSignal() # functions wanting to be executed from timer_actions should connect to this signal, preferably via Qt.DirectConnection
+ ca_address_default_changed_signal = pyqtSignal(object) # passes cashacct.Info object to slot, which is the new default. Mainly emitted by address_list and address_dialog
+
+ status_icon_dict = dict() # app-globel cache of "status_*" -> QIcon instances (for update_status() speedup)
+
+ def __init__(self, gui_object, wallet):
+ QMainWindow.__init__(self)
+
+ self.gui_object = gui_object
+ self.token_meta: TokenMetaQt = self.gui_object.token_meta
+ self.wallet = wallet
+ assert not self.wallet.weak_window
+ self.wallet.weak_window = Weak.ref(self) # This enables plugins such as CashFusion to keep just a reference to the wallet, but eventually be able to find the window it belongs to.
+
+ self.config = config = gui_object.config
+ assert self.wallet and self.config and self.gui_object
+
+ self.network = gui_object.daemon.network
+ self.fx = gui_object.daemon.fx
+ self.invoices = wallet.invoices
+ self.contacts = wallet.contacts
+ self.tray = gui_object.tray
+ self.app = gui_object.app
+ self.cleaned_up = False
+ self.payment_request = None
+ self.checking_accounts = False
+ self.qr_window = None
+ self.not_enough_funds = False
+ self.op_return_toolong = False
+ self.internalpluginsdialog = None
+ self.externalpluginsdialog = None
+ self.hardwarewalletdialog = None
+ self.require_fee_update = False
+ self.cashaddr_toggled_signal = self.gui_object.cashaddr_toggled_signal # alias for backwards compatibility for plugins -- this signal used to live in each window and has since been refactored to gui-object where it belongs (since it's really an app-global setting)
+ self.force_use_single_change_addr = None # this is set by the CashShuffle plugin to a single string that will go into the tool-tip explaining why this preference option is disabled (see self.settings_dialog)
+ self.tl_windows = []
+ self.tx_external_keypairs = {}
+ self._tx_dialogs = Weak.Set()
+ self.tx_update_mgr = TxUpdateMgr(self) # manages network callbacks for 'new_transaction' and 'verified2', and collates GUI updates from said callbacks as a performance optimization
+ self.is_schnorr_enabled = self.wallet.is_schnorr_enabled # This is a function -- Support for plugins that may be using the 4.0.3 & 4.0.4 API -- this function used to live in this class, before being moved to Abstract_Wallet.
+ self.send_tab_opreturn_widgets, self.receive_tab_opreturn_widgets = [], [] # defaults to empty list
+ self._shortcuts = Weak.Set() # keep track of shortcuts and disable them on close
+ self.create_new_token_dialog = None # Gets lazy-initted by self.show_create_new_token_dialog()
+ self.edit_token_metadata_dialog = None # Also gets lazy-initted on-demand
+ self._send_token_form: Optional[WindowModalDialog] = None
+
+ self.create_status_bar()
+ self.need_update = threading.Event()
+ self.labels_need_update = threading.Event()
+
+ self.decimal_point = config.get('decimal_point', 8)
+ self.fee_unit = config.get('fee_unit', 0)
+ self.num_zeros = int(config.get('num_zeros',0))
+
+ self.completions = QStringListModel()
+
+ self.tabs = tabs = QTabWidget(self)
+ self.send_tab = self.create_send_tab()
+ self.receive_tab = self.create_receive_tab()
+ self.addresses_tab = self.create_addresses_tab()
+ self.utxo_tab = self.create_utxo_tab()
+ self.token_tab = self.create_token_tab()
+ self.token_history_tab = self.create_token_history_tab()
+ self.console_tab = self.create_console_tab()
+ self.contacts_tab = self.create_contacts_tab()
+ self.converter_tab = self.create_converter_tab()
+ tabs.addTab(self.create_history_tab(), QIcon(":icons/tab_history.png"), _('History'))
+ tabs.addTab(self.send_tab, QIcon(":icons/tab_send.png"), _('Send'))
+ tabs.addTab(self.receive_tab, QIcon(":icons/tab_receive.png"), _('Receive'))
+ # clears/inits the opreturn widgets
+ self.on_toggled_opreturn(bool(self.config.get('enable_opreturn')))
+
+ def add_optional_tab(tabs, tab, icon, description, name, default=True):
+ tab.tab_icon = icon
+ tab.tab_description = description
+ tab.tab_pos = len(tabs)
+ tab.tab_name = name
+ if self.config.get('show_{}_tab'.format(name), default):
+ tabs.addTab(tab, icon, description.replace("&", ""))
+
+ add_optional_tab(tabs, self.addresses_tab, QIcon(":icons/tab_addresses.png"), _("&Addresses"), "addresses")
+ add_optional_tab(tabs, self.utxo_tab, QIcon(":icons/tab_coins.png"), _("Co&ins"), "utxo")
+ add_optional_tab(tabs, self.token_tab, QIcon(":icons/tab_token.svg"), _("Cash&Tokens"), "token", False)
+ add_optional_tab(tabs, self.token_history_tab, QIcon(":icons/tab_token.svg"), _("Token History"), "token_history", False)
+ add_optional_tab(tabs, self.contacts_tab, QIcon(":icons/tab_contacts.png"), _("Con&tacts"), "contacts")
+ add_optional_tab(tabs, self.converter_tab, QIcon(":icons/tab_converter.svg"), _("Address Converter"), "converter")
+ add_optional_tab(tabs, self.console_tab, QIcon(":icons/tab_console.png"), _("Con&sole"), "console", False)
+
+ tabs.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
+ self.setCentralWidget(tabs)
+
+ if self.config.get("is_maximized"):
+ self.showMaximized()
+
+ self.init_menubar()
+
+ wrtabs = Weak.ref(tabs) # We use a weak reference here to help along python gc of QShortcut children: prevent the lambdas below from holding a strong ref to self.
+ self._shortcuts.add( QShortcut(QKeySequence("Ctrl+W"), self, self.close) )
+ # Below is now addded to the menu as Ctrl+R but we'll also support F5 like browsers do
+ self._shortcuts.add( QShortcut(QKeySequence("F5"), self, self.update_wallet) )
+ self._shortcuts.add( QShortcut(QKeySequence("Ctrl+PgUp"), self, lambda: wrtabs() and wrtabs().setCurrentIndex((wrtabs().currentIndex() - 1)%wrtabs().count())) )
+ self._shortcuts.add( QShortcut(QKeySequence("Ctrl+PgDown"), self, lambda: wrtabs() and wrtabs().setCurrentIndex((wrtabs().currentIndex() + 1)%wrtabs().count())) )
+
+ for i in range(tabs.count()):
+ self._shortcuts.add( QShortcut(QKeySequence("Alt+" + str(i + 1)), self, lambda i=i: wrtabs() and wrtabs().setCurrentIndex(i)) )
+
+ self.gui_object.cashaddr_toggled_signal.connect(self.update_cashaddr_icon)
+ self.payment_request_ok_signal.connect(self.payment_request_ok)
+ self.payment_request_error_signal.connect(self.payment_request_error)
+ self.gui_object.update_available_signal.connect(self.on_update_available) # shows/hides the update_available_button, emitted by update check mechanism when a new version is available
+ self.gui_object.new_window_initialized_signal.connect(self.new_window_initialized)
+ self.history_list.setFocus(True)
+
+ # update fee slider in case we missed the callback
+ self.fee_slider.update()
+ self.load_wallet()
+
+ if self.network:
+ self.network_signal.connect(self.on_network_qt)
+ interests = ['blockchain_updated', 'wallet_updated',
+ 'new_transaction', 'status', 'banner', 'verified2',
+ 'fee', 'ca_verified_tx', 'ca_verification_failed', 'features']
+ # To avoid leaking references to "self" that prevent the
+ # window from being GC-ed when closed, callbacks should be
+ # methods of this class only, and specifically not be
+ # partials, lambdas or methods of subobjects. Hence...
+ self.network.register_callback(self.on_network, interests)
+ # set initial message
+ self.console.showMessage(self.network.banner)
+ self.network.register_callback(self.on_quotes, ['on_quotes'])
+ self.network.register_callback(self.on_history, ['on_history'])
+ self.new_fx_quotes_signal.connect(self.on_fx_quotes)
+ self.new_fx_history_signal.connect(self.on_fx_history)
+
+ if self.network.is_connected():
+ self.check_necessary_server_features()
+
+ gui_object.timer.timeout.connect(self.timer_actions)
+ self.fetch_alias()
+
+ self.gui_object.token_metadata_updated_signal.connect(lambda x: self.update_tabs())
+
+ def new_window_initialized(self):
+ if self.wallet.wallet_type == "rpa" and not self.wallet.rpa_pwd and self.wallet.has_password():
+ while not self.wallet.rpa_pwd:
+ password = self.password_dialog("To perform RPA syncing in the background, please enter your password.")
+ try:
+ self.wallet.check_password(password)
+ self.wallet.rpa_pwd = password
+ except Exception as e:
+ self.show_error(str(e))
+ self.clean_up()
+ self.close()
+ break
+
+ def setup_tx_rcv_sound(self):
+ """Used only in the 'ard moné edition"""
+ if networks.net is not networks.TaxCoinNet:
+ return
+ try:
+ import PyQt5.QtMultimedia
+ from PyQt5.QtCore import QUrl, QResource
+ from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
+ fileName = os.path.join(os.path.dirname(__file__), "data", "ard_mone.mp3")
+ url = QUrl.fromLocalFile(fileName)
+ self.print_error("Sound effect: loading from", url.toLocalFile())
+ player = QMediaPlayer(self)
+ player.setMedia(QMediaContent(url))
+ player.setVolume(100)
+ self.print_error("Sound effect: regustered successfully")
+ return player
+ except Exception as e:
+ self.print_error("Sound effect: Failed:", str(e))
+ return
+
+
+ _first_shown = True
+ def showEvent(self, event):
+ super().showEvent(event)
+ if event.isAccepted() and self._first_shown:
+ self._first_shown = False
+ weakSelf = Weak.ref(self)
+ # do this immediately after this event handler finishes
+ def callback():
+ strongSelf = weakSelf()
+ if strongSelf:
+ # noop on everything but linux
+ strongSelf.gui_object.lin_win_maybe_show_highdpi_caveat_msg(strongSelf)
+ QTimer.singleShot(0, callback)
+
+ def on_history(self, event, *args):
+ # NB: event should always be 'on_history'
+ if not args or args[0] is self.wallet:
+ self.new_fx_history_signal.emit()
+
+ @rate_limited(3.0) # Rate limit to no more than once every 3 seconds
+ def on_fx_history(self):
+ if self.cleaned_up: return
+ self.history_list.refresh_headers()
+ self.history_list.update()
+ self.address_list.update()
+ self.history_updated_signal.emit() # inform things like address_dialog that there's a new history
+
+ def on_quotes(self, b):
+ self.new_fx_quotes_signal.emit()
+
+ @rate_limited(3.0) # Rate limit to no more than once every 3 seconds
+ def on_fx_quotes(self):
+ if self.cleaned_up: return
+ self.update_status()
+ # Refresh edits with the new rate
+ edit = self.fiat_send_e if self.fiat_send_e.is_last_edited else self.amount_e
+ edit.textEdited.emit(edit.text())
+ edit = self.fiat_receive_e if self.fiat_receive_e.is_last_edited else self.receive_amount_e
+ edit.textEdited.emit(edit.text())
+ # History tab needs updating if it used spot
+ if self.fx.history_used_spot:
+ self.history_list.update()
+ self.history_updated_signal.emit() # inform things like address_dialog that there's a new history
+
+ def toggle_tab(self, tab):
+ show = self.tabs.indexOf(tab) == -1
+ self.config.set_key('show_{}_tab'.format(tab.tab_name), show)
+ item_format = _("Hide {tab_description}") if show else _("Show {tab_description}")
+ item_text = item_format.format(tab_description=tab.tab_description)
+ tab.menu_action.setText(item_text)
+ if show:
+ # Find out where to place the tab
+ index = len(self.tabs)
+ for i in range(len(self.tabs)):
+ try:
+ if tab.tab_pos < self.tabs.widget(i).tab_pos:
+ index = i
+ break
+ except AttributeError:
+ pass
+ self.tabs.insertTab(index, tab, tab.tab_icon, tab.tab_description.replace("&", ""))
+ else:
+ i = self.tabs.indexOf(tab)
+ self.tabs.removeTab(i)
+
+ def push_top_level_window(self, window):
+ '''Used for e.g. tx dialog box to ensure new dialogs are appropriately
+ parented. This used to be done by explicitly providing the parent
+ window, but that isn't something hardware wallet prompts know.'''
+ self.tl_windows.append(window)
+
+ def pop_top_level_window(self, window, *, raise_if_missing=False):
+ try:
+ self.tl_windows.remove(window)
+ except ValueError:
+ if raise_if_missing:
+ raise
+ ''' Window not in list. Suppressing the exception by default makes
+ writing cleanup handlers easier. Doing it this way fixes #1707. '''
+
+ def top_level_window(self):
+ '''Do the right thing in the presence of tx dialog windows'''
+ override = self.tl_windows[-1] if self.tl_windows else None
+ return self.top_level_window_recurse(override)
+
+ def diagnostic_name(self):
+ return "%s/%s" % (PrintError.diagnostic_name(self), self.wallet.basename())
+
+ def is_hidden(self):
+ return self.isMinimized() or self.isHidden()
+
+ def show_or_hide(self):
+ if self.is_hidden():
+ self.bring_to_top()
+ else:
+ self.hide()
+
+ def bring_to_top(self):
+ self.show()
+ self.raise_()
+
+ def on_error(self, exc_info):
+ if not isinstance(exc_info[1], UserCancelled):
+ try:
+ traceback.print_exception(*exc_info)
+ except OSError:
+ # Issue #662, user got IO error.
+ # We want them to still get the error displayed to them.
+ pass
+ self.show_error(str(exc_info[1]))
+
+ def on_network(self, event, *args):
+ #self.print_error("on_network:", event, *args)
+ if event == 'wallet_updated':
+ if args[0] is self.wallet:
+ self.need_update.set()
+ elif event == 'blockchain_updated':
+ self.need_update.set()
+ elif event == 'new_transaction':
+ self.tx_update_mgr.notif_add(args) # added only if this wallet's tx
+ if args[1] is self.wallet:
+ self.network_signal.emit(event, args)
+ elif event == 'verified2':
+ self.tx_update_mgr.verif_add(args) # added only if this wallet's tx
+ if args[0] is self.wallet:
+ self.network_signal.emit(event, args)
+ elif event in ['status', 'banner', 'fee']:
+ # Handle in GUI thread
+ self.network_signal.emit(event, args)
+ elif event in ('ca_verified_tx', 'ca_verification_failed'):
+ if args[0] is self.wallet.cashacct:
+ self.network_signal.emit(event, args)
+ elif event == 'features':
+ self.network_signal.emit(event, args)
+ else:
+ self.print_error("unexpected network message:", event, args)
+
+ def on_network_qt(self, event, args=None):
+ if self.cleaned_up: return
+ # Handle a network message in the GUI thread
+ if event == 'status':
+ self.update_status()
+ elif event == 'banner':
+ self.console.showMessage(args[0])
+ elif event == 'fee':
+ pass
+ elif event == 'new_transaction':
+ self.check_and_reset_receive_address_if_needed()
+ elif event in ('ca_verified_tx', 'ca_verification_failed'):
+ pass
+ elif event == 'verified2':
+ pass
+ elif event == 'features':
+ self.check_necessary_server_features()
+ else:
+ self.print_error("unexpected network_qt signal:", event, args)
+
+ def fetch_alias(self):
+ self.alias_info = None
+ alias = self.config.get('alias')
+ if alias:
+ alias = str(alias)
+ def f():
+ self.alias_info = self.contacts.resolve_openalias(alias)
+ self.alias_received_signal.emit()
+ t = threading.Thread(target=f)
+ t.setDaemon(True)
+ t.start()
+
+ def _close_wallet(self):
+ if self.wallet:
+ self.print_error('close_wallet', self.wallet.storage.path)
+ self.wallet.thread = None
+
+ run_hook('close_wallet', self.wallet)
+
+ def load_wallet(self):
+ self.wallet.thread = TaskThread(self, self.on_error, name = self.wallet.diagnostic_name() + '/Wallet')
+ self.update_recently_visited(self.wallet.storage.path)
+ # address used to create a dummy transaction and estimate transaction fee
+ self.history_list.update()
+ self.address_list.update()
+ self.utxo_list.update()
+ self.token_list.update()
+ self.token_history_list.update()
+ self.need_update.set()
+ # update menus
+ self.seed_menu.setEnabled(self.wallet.has_seed())
+ self.update_lock_icon()
+ self.update_buttons_on_seed()
+ self.update_console()
+ self.clear_receive_tab()
+ self.request_list.update()
+ self.tabs.show()
+ self.init_geometry()
+ if self.config.get('hide_gui') and self.tray.isVisible():
+ self.hide()
+ else:
+ self.show()
+ if self._is_invalid_testnet_wallet():
+ self.gui_object.daemon.stop_wallet(self.wallet.storage.path)
+ self._rebuild_history_action.setEnabled(False)
+ self._warn_if_invalid_testnet_wallet()
+ self.watching_only_changed()
+ self.history_updated_signal.emit() # inform things like address_dialog that there's a new history
+ run_hook('load_wallet', self.wallet, self)
+
+ def init_geometry(self):
+ winpos = self.wallet.storage.get("winpos-qt")
+ try:
+ screen = self.app.desktop().screenGeometry()
+ assert screen.contains(QRect(*winpos))
+ self.setGeometry(*winpos)
+ except:
+ self.print_error("using default geometry")
+ self.setGeometry(100, 100, 840, 400)
+
+ def watching_only_changed(self):
+ title = '%s %s - %s' % (networks.net.TITLE,
+ self.wallet.electrum_version,
+ self.wallet.basename())
+ extra = [self.wallet.storage.get('wallet_type', '?')]
+ if self.wallet.is_watching_only():
+ self.warn_if_watching_only()
+ extra.append(_('watching only'))
+ title += ' [%s]'% ', '.join(extra)
+ self.setWindowTitle(title)
+ self.password_menu.setEnabled(self.wallet.can_change_password())
+ self.import_privkey_menu.setVisible(self.wallet.can_import_privkey())
+ self.import_address_menu.setVisible(self.wallet.can_import_address())
+ self.export_menu.setEnabled(bool(self.wallet.can_export()))
+
+ def warn_if_watching_only(self):
+ if self.wallet.is_watching_only():
+ msg = ' '.join([
+ _("This wallet is watching-only."),
+ _("This means you will not be able to spend Bitcoin Cash with it."),
+ _("Make sure you own the seed phrase or the private keys, before you request Bitcoin Cash to be sent to this wallet.")
+ ])
+ self.show_warning(msg, title=_('Information'))
+
+ def _is_invalid_testnet_wallet(self):
+ if not networks.net.TESTNET:
+ return False
+ is_old_bad = False
+ xkey = ((hasattr(self.wallet, 'get_master_public_key') and self.wallet.get_master_public_key())
+ or None)
+ if xkey:
+ from electroncash.bitcoin import deserialize_xpub, InvalidXKeyFormat, InvalidXKeyNotBase58
+ try:
+ xp = deserialize_xpub(xkey)
+ except InvalidXKeyNotBase58:
+ pass # old_keystore uses some other key format, so we will let it slide.
+ except InvalidXKeyFormat:
+ is_old_bad = True
+ return is_old_bad
+
+ def _warn_if_invalid_testnet_wallet(self):
+ ''' This was added after the upgrade from the bad xpub testnet wallets
+ to the good tpub testnet wallet format in version 3.3.6. See #1164.
+ We warn users if they are using the bad wallet format and instruct
+ them on how to upgrade their wallets.'''
+ is_old_bad = self._is_invalid_testnet_wallet()
+ if is_old_bad:
+ msg = ' '.join([
+ _("This testnet wallet has an invalid master key format."),
+ _("(Old versions of Electron Cash before 3.3.6 produced invalid testnet wallets)."),
+ '
',
+ _("In order to use this wallet without errors with this version of EC, please re-generate this wallet from seed."),
+ "
~SPV stopped~"
+ ])
+ self.show_critical(msg, title=_('Invalid Master Key'), rich_text=True)
+ return is_old_bad
+
+ def open_wallet(self):
+ try:
+ wallet_folder = self.get_wallet_folder()
+ except FileNotFoundError as e:
+ self.show_error(str(e))
+ return
+ if not os.path.exists(wallet_folder):
+ wallet_folder = None
+ filename, __ = QFileDialog.getOpenFileName(self, "Select your wallet file", wallet_folder)
+ if not filename:
+ return
+ if filename.lower().endswith('.txn'):
+ # they did File -> Open on a .txn, just do that.
+ self.do_process_from_file(fileName=filename)
+ return
+ self.gui_object.new_window(filename)
+
+
+ def backup_wallet(self):
+ self.wallet.storage.write() # make sure file is committed to disk
+ path = self.wallet.storage.path
+ wallet_folder = os.path.dirname(path)
+ filename, __ = QFileDialog.getSaveFileName(self, _('Enter a filename for the copy of your wallet'), wallet_folder)
+ if not filename:
+ return
+
+ new_path = os.path.join(wallet_folder, filename)
+ if new_path != path:
+ try:
+ # Copy file contents
+ shutil.copyfile(path, new_path)
+
+ # Copy file attributes if possible
+ # (not supported on targets like Flatpak documents)
+ try:
+ shutil.copystat(path, new_path)
+ except (IOError, os.error):
+ pass
+
+ self.show_message(_("A copy of your wallet file was created in")+" '%s'" % str(new_path), title=_("Wallet backup created"))
+ except (IOError, os.error) as reason:
+ self.show_critical(_("Electron Cash was unable to copy your wallet file to the specified location.") + "\n" + str(reason), title=_("Unable to create backup"))
+
+ def update_recently_visited(self, filename):
+ recent = self.config.get('recently_open', [])
+ try:
+ sorted(recent)
+ except:
+ recent = []
+ if filename in recent:
+ recent.remove(filename)
+ recent.insert(0, filename)
+ recent2 = []
+ for k in recent:
+ if os.path.exists(k):
+ recent2.append(k)
+ recent = recent2[:5]
+ self.config.set_key('recently_open', recent)
+ self.recently_visited_menu.clear()
+ gui_object = self.gui_object
+ for i, k in enumerate(sorted(recent)):
+ b = os.path.basename(k)
+ def loader(k):
+ return lambda: gui_object.new_window(k)
+ self.recently_visited_menu.addAction(b, loader(k)).setShortcut(QKeySequence("Ctrl+%d"%(i+1)))
+ self.recently_visited_menu.setEnabled(bool(len(recent)))
+
+ def get_wallet_folder(self):
+ return self.gui_object.get_wallet_folder()
+
+ def new_wallet(self):
+ try:
+ full_path = self.gui_object.get_new_wallet_path()
+ except FileNotFoundError as e:
+ self.show_error(str(e))
+ return
+ self.gui_object.start_new_window(full_path, None)
+
+ def init_menubar(self):
+ menubar = self.menuBar()
+ menubar.setObjectName(self.diagnostic_name() + ".QMenuBar")
+
+ file_menu = menubar.addMenu(_("&File"))
+ self.recently_visited_menu = file_menu.addMenu(_("Open &Recent"))
+ file_menu.addAction(_("&Open") + "...", self.open_wallet).setShortcut(QKeySequence.Open)
+ file_menu.addAction(_("&New/Restore") + "...", self.new_wallet).setShortcut(QKeySequence.New)
+ file_menu.addAction(_("&Save Copy As") + "...", self.backup_wallet).setShortcut(QKeySequence.SaveAs)
+ file_menu.addAction(_("&Delete") + "...", self.remove_wallet)
+ file_menu.addSeparator()
+ file_menu.addAction(_("&Quit"), self.close).setShortcut(QKeySequence.Quit)
+
+ wallet_menu = menubar.addMenu(_("&Wallet"))
+ wallet_menu.addAction(_("&Information"), self.show_master_public_keys, QKeySequence("Ctrl+I"))
+ wallet_menu.addSeparator()
+ self.password_menu = wallet_menu.addAction(_("&Password") + "...", self.change_password_dialog)
+ self.seed_menu = wallet_menu.addAction(_("&Seed"), self.show_seed_dialog)
+ self.private_keys_menu = wallet_menu.addMenu(_("Private Keys"))
+ self.private_keys_menu.addAction(_("&Sweep") + "...", self.sweep_key_dialog)
+ self.import_privkey_menu = self.private_keys_menu.addAction(_("&Import") + "...", self.do_import_privkey)
+ self.export_menu = self.private_keys_menu.addMenu(_("&Export"))
+ self.export_menu.addAction(_("&WIF Plaintext") + "...", self.export_privkeys_dialog)
+ self.export_menu.addAction(_("&BIP38 Encrypted") + "...", self.export_bip38_dialog)
+ self.import_address_menu = wallet_menu.addAction(_("Import addresses") + "...", self.import_addresses)
+ wallet_menu.addSeparator()
+ self._rebuild_history_action = wallet_menu.addAction(_("&Rebuild History") + "...", self.rebuild_history)
+ self._scan_beyond_gap_action = wallet_menu.addAction(_("Scan &More Addresses..."), self.scan_beyond_gap)
+ self._scan_beyond_gap_action.setEnabled(bool(self.wallet.is_deterministic() and self.network))
+ wallet_menu.addSeparator()
+
+ labels_menu = wallet_menu.addMenu(_("&Labels"))
+ labels_menu.addAction(_("&Import") + "...", self.do_import_labels)
+ labels_menu.addAction(_("&Export") + "...", self.do_export_labels)
+ contacts_menu = wallet_menu.addMenu(_("&Contacts"))
+ contacts_menu.addAction(_("&New") + "...", self.new_contact_dialog)
+ contacts_menu.addAction(_("Import") + "...", lambda: self.contact_list.import_contacts())
+ contacts_menu.addAction(_("Export") + "...", lambda: self.contact_list.export_contacts())
+ invoices_menu = wallet_menu.addMenu(_("Invoices"))
+ invoices_menu.addAction(_("Import") + "...", lambda: self.invoice_list.import_invoices())
+ hist_menu = wallet_menu.addMenu(_("&History"))
+ #hist_menu.addAction(_("Plot"), self.plot_history_dialog).setEnabled(plot_history is not None)
+ hist_menu.addAction(_("Export") + "...", self.export_history_dialog)
+
+ wallet_menu.addSeparator()
+ wallet_menu.addAction(_("&Find"), self.toggle_search, QKeySequence("Ctrl+F"))
+ wallet_menu.addAction(_("Refresh GUI"), self.update_wallet, QKeySequence("Ctrl+R"))
+
+ def add_toggle_action(view_menu, tab):
+ is_shown = self.tabs.indexOf(tab) > -1
+ item_format = _("Hide {tab_description}") if is_shown else _("Show {tab_description}")
+ item_name = item_format.format(tab_description=tab.tab_description)
+ tab.menu_action = view_menu.addAction(item_name, lambda: self.toggle_tab(tab))
+
+ view_menu = menubar.addMenu(_("&View"))
+ add_toggle_action(view_menu, self.addresses_tab)
+ add_toggle_action(view_menu, self.utxo_tab)
+ add_toggle_action(view_menu, self.token_tab)
+ add_toggle_action(view_menu, self.token_history_tab)
+ add_toggle_action(view_menu, self.contacts_tab)
+ add_toggle_action(view_menu, self.converter_tab)
+ add_toggle_action(view_menu, self.console_tab)
+
+ tools_menu = menubar.addMenu(_("&Tools"))
+
+ prefs_tit = _("Preferences") + "..."
+ a = tools_menu.addAction(prefs_tit, self.settings_dialog, QKeySequence("Ctrl+,") ) # Note: on macOS this hotkey sequence won't be shown in the menu (since it's reserved by the system), but will still work. :/
+ if sys.platform == 'darwin':
+ # This turns off the heuristic matching based on name and keeps the
+ # "Preferences" action out of the application menu and into the
+ # actual menu we specified on macOS.
+ a.setMenuRole(QAction.NoRole)
+ gui_object = self.gui_object
+ weakSelf = Weak.ref(self)
+ tools_menu.addAction(_("&Network") + "...", lambda: gui_object.show_network_dialog(weakSelf()), QKeySequence("Ctrl+K"))
+ tools_menu.addAction(_("Optional &Features") + "...", self.internal_plugins_dialog, QKeySequence("Shift+Ctrl+P"))
+ tools_menu.addAction(_("Installed &Plugins") + "...", self.external_plugins_dialog, QKeySequence("Ctrl+P"))
+ if sys.platform.startswith('linux'):
+ tools_menu.addSeparator()
+ tools_menu.addAction(_("&Hardware Wallet Support..."), self.hardware_wallet_support)
+ tools_menu.addSeparator()
+ tools_menu.addAction(_("&Sign/Verify Message") + "...", self.sign_verify_message)
+ tools_menu.addAction(_("&Encrypt/Decrypt Message") + "...", self.encrypt_message)
+ tools_menu.addSeparator()
+
+ paytomany_menu = tools_menu.addAction(_("&Pay to Many"), self.paytomany, QKeySequence("Ctrl+M"))
+
+ if self.wallet.wallet_type == 'rpa':
+ tools_menu.addAction(
+ _("&Refresh RPA Transactions"),
+ self.wallet.fetch_rpa_mempool_txs_from_server)
+
+ raw_transaction_menu = tools_menu.addMenu(_("&Load Transaction"))
+ raw_transaction_menu.addAction(_("From &File") + "...", self.do_process_from_file)
+ raw_transaction_menu.addAction(_("From &Text") + "...", self.do_process_from_text, QKeySequence("Ctrl+T"))
+ raw_transaction_menu.addAction(_("From the &Blockchain") + "...", self.do_process_from_txid, QKeySequence("Ctrl+B"))
+ raw_transaction_menu.addAction(_("From &QR Code") + "...", self.read_tx_from_qrcode)
+ self.raw_transaction_menu = raw_transaction_menu
+ tools_menu.addSeparator()
+ if ColorScheme.dark_scheme and sys.platform != 'darwin': # use dark icon in menu except for on macOS where we can't be sure it will look right due to the way menus work on macOS
+ icon = QIcon(":icons/cashacct-button-darkmode.png")
+ else:
+ icon = QIcon(":icons/cashacct-logo.png")
+ tools_menu.addAction(icon, _("Lookup &Cash Account..."), self.lookup_cash_account_dialog, QKeySequence("Ctrl+L"))
+ tools_menu.addAction(icon, _("&Register Cash Account..."), lambda: self.register_new_cash_account(addr='pick'), QKeySequence("Ctrl+G"))
+ tools_menu.addSeparator()
+ tools_menu.addAction(QIcon(":icons/tab_token.svg"), _("Create Cash&Token") + "...",
+ self.show_create_new_token_dialog, QKeySequence("Ctrl+Shift+T"))
+ run_hook('init_menubar_tools', self, tools_menu)
+
+ help_menu = menubar.addMenu(_("&Help"))
+ help_menu.addAction(_("&About"), self.show_about)
+ help_menu.addAction(_("About Qt"), self.app.aboutQt)
+ help_menu.addAction(_("&Check for Updates"), lambda: self.gui_object.show_update_checker(self))
+ help_menu.addAction(_("&Official Website"), lambda: webopen("https://electroncash.org"))
+ help_menu.addSeparator()
+ help_menu.addAction(_("Documentation"), lambda: webopen("http://electroncash.readthedocs.io/")).setShortcut(QKeySequence.HelpContents)
+ help_menu.addAction(_("&Report Bug..."), self.show_report_bug)
+ help_menu.addSeparator()
+ help_menu.addAction(_("&Donate to Server") + "...", self.donate_to_server)
+
+
+ def donate_to_server(self):
+ if self.gui_object.warn_if_no_network(self):
+ return
+ d = {}
+ spv_address = self.network.get_donation_address()
+ spv_prefix = _("Blockchain Server")
+ donation_for = _("Donation for")
+ if spv_address:
+ host = self.network.get_parameters()[0]
+ d[spv_prefix + ": " + host] = spv_address
+ plugin_servers = run_hook('donation_address', self, multi=True)
+ for tup in plugin_servers:
+ if not isinstance(tup, (list, tuple)) or len(tup) != 2:
+ continue
+ desc, address = tup
+ if (desc and address and isinstance(desc, str) and isinstance(address, Address)
+ and desc not in d and not desc.lower().startswith(spv_prefix.lower())):
+ d[desc] = address.to_ui_string()
+ def do_payto(desc):
+ addr = d[desc]
+ # The message is intentionally untranslated, leave it like that
+ self.pay_to_URI('{pre}:{addr}?message={donation_for} {desc}'
+ .format(pre = networks.net.CASHADDR_PREFIX,
+ addr = addr,
+ donation_for = donation_for,
+ desc = desc))
+ if len(d) == 1:
+ do_payto(next(iter(d.keys())))
+ elif len(d) > 1:
+ choices = tuple(d.keys())
+ index = self.query_choice(_('Please select which server you would like to donate to:'), choices, add_cancel_button = True)
+ if index is not None:
+ do_payto(choices[index])
+ else:
+ self.show_error(_('No donation address for this server'))
+
+ def show_about(self):
+ QMessageBox.about(self, "Electron Cash",
+ "Electron Cash
" + _("Version") + f" {self.wallet.electrum_version}" + "
" +
+ '' +
+ _("Copyright © {year_start}-{year_end} Electron Cash LLC and the Electron Cash developers.").format(year_start=2017, year_end=2022) +
+ "
" + _("darkdetect for macOS © 2019 Alberto Sottile") + "
"
+ "" +
+ '' +
+ _("Electron Cash's focus is speed, with low resource usage and simplifying Bitcoin Cash. You do not need to perform regular backups, because your wallet can be recovered from a secret phrase that you can memorize or write on paper. Startup times are instant because it operates in conjunction with high-performance servers that handle the most complicated parts of the Bitcoin Cash system.") +
+ "
"
+ )
+
+ def show_report_bug(self):
+ msg = ' '.join([
+ _("Please report any bugs as issues on github:
"),
+ "https://github.com/Electron-Cash/Electron-Cash/issues
",
+ _("Before reporting a bug, upgrade to the most recent version of Electron Cash (latest release or git HEAD), and include the version number in your report."),
+ _("Try to explain not only what the bug is, but how it occurs.")
+ ])
+ self.show_message(msg, title="Electron Cash - " + _("Reporting Bugs"), rich_text = True)
+
+ def notify(self, message):
+ self.gui_object.notify(message)
+
+
+ # custom wrappers for getOpenFileName and getSaveFileName, that remember the path selected by the user
+ def getOpenFileName(self, title, filter = ""):
+ return __class__.static_getOpenFileName(title=title, filter=filter, config=self.config, parent=self)
+
+ def getSaveFileName(self, title, filename, filter = ""):
+ return __class__.static_getSaveFileName(title=title, filename=filename, filter=filter, config=self.config, parent=self)
+
+ @staticmethod
+ def static_getOpenFileName(*, title, parent=None, config=None, filter=""):
+ if not config:
+ config = get_config()
+ userdir = os.path.expanduser('~')
+ directory = config.get('io_dir', userdir) if config else userdir
+ fileName, __ = QFileDialog.getOpenFileName(parent, title, directory, filter)
+ if fileName and directory != os.path.dirname(fileName) and config:
+ config.set_key('io_dir', os.path.dirname(fileName), True)
+ return fileName
+
+ @staticmethod
+ def static_getSaveFileName(*, title, filename, parent=None, config=None, filter=""):
+ if not config:
+ config = get_config()
+ userdir = os.path.expanduser('~')
+ directory = config.get('io_dir', userdir) if config else userdir
+ path = os.path.join( directory, filename )
+ fileName, __ = QFileDialog.getSaveFileName(parent, title, path, filter)
+ if fileName and directory != os.path.dirname(fileName) and config:
+ config.set_key('io_dir', os.path.dirname(fileName), True)
+ return fileName
+
+ def timer_actions(self):
+ # Note this runs in the GUI thread
+
+ if self.need_update.is_set():
+ self._update_wallet() # will clear flag when it runs. (also clears labels_need_update as well)
+
+ if self.labels_need_update.is_set():
+ self._update_labels() # will clear flag when it runs.
+
+ # resolve aliases
+ # FIXME this is a blocking network call that has a timeout of 5 sec
+ self.payto_e.resolve()
+ # update fee
+ if self.require_fee_update:
+ self.do_update_fee()
+ self.require_fee_update = False
+
+ # hook for other classes to be called here. For example the tx_update_mgr is called here (see TxUpdateMgr.do_check).
+ self.on_timer_signal.emit()
+
+ def format_amount(self, x, is_diff=False, whitespaces=False):
+ return format_satoshis(x, self.num_zeros, self.decimal_point, is_diff=is_diff, whitespaces=whitespaces)
+
+ def format_amount_and_units(self, amount, is_diff=False):
+ text = self.format_amount(amount, is_diff=is_diff) + ' '+ self.base_unit()
+ x = self.fx.format_amount_and_units(amount, is_diff=is_diff)
+ if text and x:
+ text += ' (%s)'%x
+ return text
+
+ def format_fee_rate(self, fee_rate):
+ sats_per_byte = format_fee_satoshis(fee_rate/1000, max(self.num_zeros, 1))
+ return _('{sats_per_byte} sat/byte').format(sats_per_byte=sats_per_byte)
+
+ def get_decimal_point(self):
+ return self.decimal_point
+
+ def base_unit(self):
+ if self.decimal_point in util.inv_base_units:
+ return util.inv_base_units[self.decimal_point]
+ raise Exception('Unknown base unit')
+
+ def connect_fields(self, window, btc_e, fiat_e, fee_e):
+
+ def edit_changed(edit):
+ if edit.follows:
+ return
+ edit.setStyleSheet(ColorScheme.DEFAULT.as_stylesheet())
+ fiat_e.is_last_edited = (edit == fiat_e)
+ amount = edit.get_amount()
+ rate = self.fx.exchange_rate() if self.fx else None
+ if rate is None or amount is None:
+ if edit is fiat_e:
+ btc_e.setText("")
+ if fee_e:
+ fee_e.setText("")
+ else:
+ fiat_e.setText("")
+ else:
+ if edit is fiat_e:
+ btc_e.follows = True
+ btc_e.setAmount(int(amount / PyDecimal(rate) * COIN))
+ btc_e.setStyleSheet(ColorScheme.BLUE.as_stylesheet())
+ btc_e.follows = False
+ if fee_e:
+ window.update_fee()
+ else:
+ fiat_e.follows = True
+ fiat_e.setText(self.fx.ccy_amount_str(
+ amount * PyDecimal(rate) / COIN, False))
+ fiat_e.setStyleSheet(ColorScheme.BLUE.as_stylesheet())
+ fiat_e.follows = False
+
+ btc_e.follows = False
+ fiat_e.follows = False
+ fiat_e.textChanged.connect(partial(edit_changed, fiat_e))
+ btc_e.textChanged.connect(partial(edit_changed, btc_e))
+ fiat_e.is_last_edited = False
+
+ _network_status_tip_dict = dict()
+ def update_status(self):
+ if not self.wallet:
+ return
+
+ icon_dict = ElectrumWindow.status_icon_dict
+ if not icon_dict:
+ # cache the icons to save on CPU overhead per update_status call
+ icon_dict.update({
+ "status_disconnected" : QIcon(":icons/status_disconnected.svg"),
+ "status_waiting" : QIcon(":icons/status_waiting.svg"),
+ "status_lagging" : QIcon(":icons/status_lagging.svg"),
+ "status_lagging_fork" : QIcon(":icons/status_lagging_fork.svg"),
+ "status_connected" : QIcon(":icons/status_connected.svg"),
+ "status_connected_fork" : QIcon(":icons/status_connected_fork.svg"),
+ "status_connected_proxy" : QIcon(":icons/status_connected_proxy.svg"),
+ "status_connected_proxy_fork" : QIcon(":icons/status_connected_proxy_fork.svg"),
+ })
+ status_tip_dict = ElectrumWindow._network_status_tip_dict
+ if not status_tip_dict:
+ # Since we're caching stuff, might as well cache this too
+ status_tip_dict.update({
+ "status_disconnected" : _('Network Status') + " - " + _("Offline"),
+ "status_waiting" : _('Network Status') + " - " + _("Updating..."),
+ "status_lagging" : _('Network Status') + " - " + '',
+ "status_lagging_fork" : _('Network Status') + " - " + _("Chain fork(s) detected"),
+ "status_connected" : _('Network Status') + " - " + _("Connected"),
+ "status_connected_fork" : _('Network Status') + " - " + _("Chain fork(s) detected"),
+ "status_connected_proxy" : _('Network Status') + " - " + _("Connected via proxy"),
+ "status_connected_proxy_fork" : _('Network Status') + " - " + _("Connected via proxy") + "; " + _("Chain fork(s) detected"),
+ })
+
+
+ status_tip = ''
+ if self.network is None or not self.network.is_running():
+ text = _("Offline")
+ icon = icon_dict["status_disconnected"]
+ status_tip = status_tip_dict['status_disconnected']
+
+ elif self.network.is_connected():
+ server_height = self.network.get_server_height()
+ server_lag = self.network.get_local_height() - server_height
+ num_chains = len(self.network.get_blockchains())
+ # Server height can be 0 after switching to a new server
+ # until we get a headers subscription request response.
+ # Display the synchronizing message in that case.
+ if not self.wallet.up_to_date or server_height == 0:
+ text = _("Synchronizing...")
+ icon = icon_dict["status_waiting"]
+ status_tip = status_tip_dict["status_waiting"]
+ elif server_lag > 1:
+ text = _("Server is lagging ({} blocks)").format(server_lag)
+ if num_chains <= 1:
+ icon = icon_dict["status_lagging"]
+ status_tip = status_tip_dict["status_lagging"] + text
+ else:
+ icon = icon_dict["status_lagging_fork"]
+ status_tip = status_tip_dict["status_lagging_fork"] + "; " + text
+ else:
+ c, u, x, cash_toks = self.wallet.get_balance(tokens=True)
+
+ text_items = [
+ _("Balance: {amount_and_unit}").format(
+ amount_and_unit=self.format_amount_and_units(c))
+ ]
+ if u:
+ text_items.append(_("[{amount} unconfirmed]").format(
+ amount=self.format_amount(u, True).strip()))
+
+ if x:
+ text_items.append(_("[{amount} unmatured]").format(
+ amount=self.format_amount(x, True).strip()))
+ if cash_toks:
+ text_items.append(_("[{amount} on CashToken UTXOs]").format(
+ amount=self.format_amount(cash_toks, False).strip()))
+
+ extra = run_hook("balance_label_extra", self)
+ if isinstance(extra, str) and extra:
+ text_items.append(_("[{extra}]").format(extra=extra))
+
+ # append fiat balance and price
+ if self.fx.is_enabled():
+ fiat_text = self.fx.get_fiat_status_text(c + u + x,
+ self.base_unit(), self.get_decimal_point()).strip()
+ if fiat_text:
+ text_items.append(fiat_text)
+ n_unverif = self.wallet.get_unverified_tx_pending_count()
+ if n_unverif >= 10:
+ # if there are lots left to verify, display this informative text
+ text_items.append(_("[{count} unverified TXs]").format(count=n_unverif))
+ if not self.network.proxy:
+ icon = icon_dict["status_connected"] if num_chains <= 1 else icon_dict["status_connected_fork"]
+ status_tip = status_tip_dict["status_connected"] if num_chains <= 1 else status_tip_dict["status_connected_fork"]
+ else:
+ icon = icon_dict["status_connected_proxy"] if num_chains <= 1 else icon_dict["status_connected_proxy_fork"]
+ status_tip = status_tip_dict["status_connected_proxy"] if num_chains <= 1 else status_tip_dict["status_connected_proxy_fork"]
+
+ text = ' '.join(text_items)
+ else:
+ text = _("Not connected")
+ icon = icon_dict["status_disconnected"]
+ status_tip = status_tip_dict["status_disconnected"]
+
+ self.tray.setToolTip("%s (%s)" % (text, self.wallet.basename()))
+ self.balance_label.setText(text)
+ self.status_button.setIcon(icon)
+ self.status_button.setStatusTip( status_tip )
+ run_hook('window_update_status', self)
+
+ def update_wallet(self):
+ self.need_update.set() # will enqueue an _update_wallet() call in at most 0.5 seconds from now.
+
+ def _update_wallet(self):
+ ''' Called by self.timer_actions every 0.5 secs if need_update flag is set.
+ Note that the flag is actually cleared by update_tabs.'''
+ self.update_status()
+ if self.wallet.up_to_date or not self.network or not self.network.is_connected():
+ self.update_tabs()
+
+ def check_necessary_server_features(self):
+ if self.wallet.wallet_type == 'rpa' and 'rpa' not in self.network.features:
+ self.show_warning("The connected server does not support reusable addresses. Please connect to an RPA server.")
+
+ @rate_limited(1.0, classlevel=True, ts_after=True) # Limit tab updates to no more than 1 per second, app-wide. Multiple calls across instances will be collated into 1 deferred series of calls (1 call per extant instance)
+ def update_tabs(self):
+ if self.cleaned_up: return
+ self.history_list.update()
+ self.request_list.update()
+ self.address_list.update()
+ self.utxo_list.update()
+ self.token_list.update()
+ self.token_history_list.update()
+ self.contact_list.update()
+ self.invoice_list.update()
+ self.update_completions()
+ self.history_updated_signal.emit() # inform things like address_dialog that there's a new history, also clears self.tx_update_mgr.verif_q
+ self.need_update.clear() # clear flag
+ if self.labels_need_update.is_set():
+ # if flag was set, might as well declare the labels updated since they necessarily were due to a full update.
+ self.labels_updated_signal.emit() # just in case client code was waiting for this signal to proceed.
+ self.labels_need_update.clear() # clear flag
+
+ def update_labels(self):
+ self.labels_need_update.set() # will enqueue an _update_labels() call in at most 0.5 seconds from now
+
+ @rate_limited(1.0)
+ def _update_labels(self):
+ ''' Called by self.timer_actions every 0.5 secs if labels_need_update flag is set. '''
+ if self.cleaned_up: return
+ self.history_list.update_labels()
+ self.address_list.update_labels()
+ self.utxo_list.update_labels()
+ self.token_list.update_labels()
+ self.token_history_list.update_labels()
+ self.update_completions()
+ self.labels_updated_signal.emit()
+ self.labels_need_update.clear() # clear flag
+
+ def create_history_tab(self):
+ from .history_list import HistoryList
+ self.history_list = l = HistoryList(self)
+ l.searchable_list = l
+ return l
+
+ def create_token_history_tab(self):
+ from .token_history_list import TokenHistoryList
+ self.token_history_list = l = TokenHistoryList(self)
+ return self.create_list_tab(l)
+
+ def show_address(self, addr, *, parent=None):
+ parent = parent or self.top_level_window()
+ from . import address_dialog
+ d = address_dialog.AddressDialog(self, addr, windowParent=parent)
+ d.exec_()
+
+ def show_transaction(self, tx, tx_desc=None, *, broadcast_callback=None):
+ '''tx_desc is set only for txs created in the Send tab'''
+ d = show_transaction(tx, self, tx_desc, broadcast_callback=broadcast_callback)
+ self._tx_dialogs.add(d)
+
+ def on_toggled_opreturn(self, b):
+ ''' toggles opreturn-related widgets for both the receive and send
+ tabs'''
+ b = bool(b)
+ self.config.set_key('enable_opreturn', b)
+ # send tab
+ if not b:
+ self.message_opreturn_e.setText("")
+ self.op_return_toolong = False
+ for x in self.send_tab_opreturn_widgets:
+ x.setVisible(b)
+ # receive tab
+ for x in self.receive_tab_opreturn_widgets:
+ x.setVisible(b)
+
+ def create_receive_tab(self):
+ # A 4-column grid layout. All the stretch is in the last column.
+ # The exchange rate plugin adds a fiat widget in column 2
+ self.receive_grid = grid = QGridLayout()
+ grid.setSpacing(8)
+ grid.setColumnStretch(3, 1)
+
+ self.receive_address = None
+ self.receive_address_e = ButtonsLineEdit()
+ self.receive_address_e.addCopyButton()
+ self.receive_address_e.setReadOnly(True)
+ self.receive_token_address_e = ButtonsLineEdit()
+ self.receive_token_address_e.addCopyButton()
+ self.receive_token_address_e.setReadOnly(True)
+ msg = _('Bitcoin Cash address where the payment should be received. Note that each payment request uses a'
+ ' different Bitcoin Cash address.')
+ msg2 = _("This a token-aware synonym for the above address where CashTokens should be received.")
+ label = HelpLabel(_('&Receiving address'), msg)
+ label.setBuddy(self.receive_address_e)
+ self.receive_address_e.textChanged.connect(self.update_receive_qr)
+ self.gui_object.cashaddr_toggled_signal.connect(self.update_receive_address_widget)
+
+ row = 0
+
+ if self.wallet.wallet_type == 'rpa':
+ self.receive_paycode_e = ButtonsLineEdit()
+ self.receive_paycode_e.addCopyButton()
+ grid.addWidget(self.receive_paycode_e, row, 1, 1, -1)
+ self.receive_paycode_e.setText(self.wallet.get_receiving_paycode())
+ self.receive_paycode_e.setReadOnly(True)
+ self.receive_paycode_e.setStyleSheet(
+ "QLineEdit { qproperty-cursorPosition: 0; }")
+ label = HelpLabel(_('&Receiving paycode'), msg)
+ label.setBuddy(self.receive_paycode_e)
+ grid.addWidget(label, row, 0)
+ row += 1
+ else:
+ grid.addWidget(self.receive_address_e, row, 1, 1, -1)
+ label = HelpLabel(_('&Receiving address'), msg)
+ label.setBuddy(self.receive_address_e)
+ grid.addWidget(label, row, 0)
+ row += 1
+ grid.addWidget(self.receive_token_address_e, row, 1, 1, -1)
+ label = HelpLabel(_('&Token address'), msg2)
+ label.setBuddy(self.receive_token_address_e)
+ grid.addWidget(label, row, 0)
+ row += 1
+
+
+ # Cash Account for this address (if any)
+ msg = _("The Cash Account (if any) associated with this address. It doesn't get saved with the request, but it is shown here for your convenience.\n\nYou may use the Cash Accounts button to register a new Cash Account for this address.")
+ label = HelpLabel(_('Cash Accoun&t'), msg)
+ class CashAcctE(ButtonsLineEdit):
+ my_network_signal = pyqtSignal(str, object)
+ ''' Inner class encapsulating the Cash Account Edit.s
+ Note:
+ - `slf` in this class is this instance.
+ - `self` is wrapping class instance. '''
+ def __init__(slf, *args):
+ super().__init__(*args)
+ slf.font_default_size = slf.font().pointSize()
+ icon = ":icons/cashacct-button-darkmode.png" if ColorScheme.dark_scheme else ":icons/cashacct-logo.png"
+ slf.ca_but = slf.addButton(icon, self.register_new_cash_account, _("Register a new Cash Account for this address"))
+ slf.ca_copy_b = slf.addCopyButton()
+ slf.setReadOnly(True)
+ slf.info = None
+ slf.cleaned_up = False
+ self.network_signal.connect(slf.on_network_qt)
+ slf.my_network_signal.connect(slf.on_network_qt)
+ if self.wallet.network:
+ self.wallet.network.register_callback(slf.on_network, ['ca_updated_minimal_chash'])
+ def clean_up(slf):
+ slf.cleaned_up = True
+ try: self.network_signal.disconnect(slf.on_network_qt) # need to disconnect parent signals due to PyQt bugs, see #1531
+ except TypeError: pass
+ if self.wallet.network:
+ self.wallet.network.unregister_callback(slf.on_network)
+ def set_cash_acct(slf, info: cashacct.Info = None, minimal_chash = None):
+ if not info and self.receive_address:
+ minimal_chash = None
+ ca_list = self.wallet.cashacct.get_cashaccounts(domain=[self.receive_address])
+ ca_list.sort(key=lambda x: ((x.number or 0), str(x.collision_hash)))
+ info = self.wallet.cashacct.get_address_default(ca_list)
+ if info:
+ slf.ca_copy_b.setDisabled(False)
+ f = slf.font(); f.setItalic(False); f.setPointSize(slf.font_default_size); slf.setFont(f)
+ slf.setText(info.emoji + " " + self.wallet.cashacct.fmt_info(info, minimal_chash=minimal_chash))
+ else:
+ slf.setText(pgettext("Referencing CashAccount", "None"))
+ f = slf.font(); f.setItalic(True); f.setPointSize(slf.font_default_size-1); slf.setFont(f)
+ slf.ca_copy_b.setDisabled(True)
+ slf.info = info
+ def on_copy(slf):
+ ''' overrides super class '''
+ QApplication.instance().clipboard().setText(slf.text()[3:] + ' ' + slf.text()[:1]) # cut off the leading emoji, and add it to the end
+ QToolTip.showText(QCursor.pos(), _("Cash Account copied to clipboard"), slf)
+ def on_network_qt(slf, event, args=None):
+ ''' pick up cash account changes and update receive tab. Called
+ from GUI thread. '''
+ if not args or self.cleaned_up or slf.cleaned_up or args[0] != self.wallet.cashacct:
+ return
+ if event == 'ca_verified_tx' and self.receive_address and self.receive_address == args[1].address:
+ slf.set_cash_acct()
+ elif event == 'ca_updated_minimal_chash' and slf.info and slf.info.address == args[1].address:
+ slf.set_cash_acct()
+ def on_network(slf, event, *args):
+ if event == 'ca_updated_minimal_chash' and args[0] == self.wallet.cashacct:
+ slf.my_network_signal.emit(event, args)
+ def showEvent(slf, e):
+ super().showEvent(e)
+ if e.isAccepted():
+ slf.set_cash_acct()
+ self.cash_account_e = CashAcctE()
+ label.setBuddy(self.cash_account_e)
+ grid.addWidget(label, row, 0)
+ grid.addWidget(self.cash_account_e, row, 1, 1, -1)
+ row += 1
+
+
+ self.receive_message_e = QLineEdit()
+ label = QLabel(_('&Description'))
+ label.setBuddy(self.receive_message_e)
+ grid.addWidget(label, row, 0)
+ grid.addWidget(self.receive_message_e, row, 1, 1, -1)
+ row += 1
+ self.receive_message_e.textChanged.connect(self.update_receive_qr)
+
+ # OP_RETURN requests
+ self.receive_opreturn_e = QLineEdit()
+ msg = _("You may optionally append an OP_RETURN message to the payment URI and/or QR you generate.\n\nNote: Not all wallets yet support OP_RETURN parameters, so make sure the other party's wallet supports OP_RETURN URIs.")
+ self.receive_opreturn_label = label = HelpLabel(_('&OP_RETURN'), msg)
+ label.setBuddy(self.receive_opreturn_e)
+ self.receive_opreturn_rawhex_cb = QCheckBox(_('Raw &hex script'))
+ self.receive_opreturn_rawhex_cb.setToolTip(_('If unchecked, the textbox contents are UTF8-encoded into a single-push script: OP_RETURN PUSH <text>. If checked, the text contents will be interpreted as a raw hexadecimal script to be appended after the OP_RETURN opcode: OP_RETURN <script>.'))
+ grid.addWidget(label, row, 0)
+ grid.addWidget(self.receive_opreturn_e, row, 1, 1, 3)
+ grid.addWidget(self.receive_opreturn_rawhex_cb, row, 4, Qt.AlignLeft)
+ row += 1
+ self.receive_opreturn_e.textChanged.connect(self.update_receive_qr)
+ self.receive_opreturn_rawhex_cb.clicked.connect(self.update_receive_qr)
+ self.receive_tab_opreturn_widgets = [
+ self.receive_opreturn_e,
+ self.receive_opreturn_rawhex_cb,
+ self.receive_opreturn_label,
+ ]
+
+ self.receive_amount_e = BTCAmountEdit(self.get_decimal_point)
+ label = QLabel(_('Requested &amount'))
+ label.setBuddy(self.receive_amount_e)
+ grid.addWidget(label, row, 0)
+ grid.addWidget(self.receive_amount_e, row, 1)
+ self.receive_amount_e.textChanged.connect(self.update_receive_qr)
+
+ self.fiat_receive_e = AmountEdit(self.fx.get_currency if self.fx else '')
+ if not self.fx or not self.fx.is_enabled():
+ self.fiat_receive_e.setVisible(False)
+ grid.addWidget(self.fiat_receive_e, row, 2, Qt.AlignLeft)
+ self.connect_fields(self, self.receive_amount_e, self.fiat_receive_e, None)
+ row += 1
+
+
+ self.expires_combo = QComboBox()
+ self.expires_combo.addItems([_(i[0]) for i in expiration_values])
+ self.expires_combo.setCurrentIndex(3)
+ self.expires_combo.setFixedWidth(self.receive_amount_e.width())
+ msg = ' '.join([
+ _('Expiration date of your request.'),
+ _('This information is seen by the recipient if you send them a signed payment request.'),
+ _('Expired requests have to be deleted manually from your list, in order to free the corresponding Bitcoin Cash addresses.'),
+ _('The Bitcoin Cash address never expires and will always be part of this Electron Cash wallet.'),
+ ])
+ label = HelpLabel(_('Request &expires'), msg)
+ label.setBuddy(self.expires_combo)
+ grid.addWidget(label, row, 0)
+ grid.addWidget(self.expires_combo, row, 1)
+ self.expires_label = QLineEdit('')
+ self.expires_label.setReadOnly(1)
+ self.expires_label.hide()
+ grid.addWidget(self.expires_label, row, 1)
+ row += 1
+
+ self.save_request_button = QPushButton(_('&Save'))
+ self.save_request_button.clicked.connect(self.save_payment_request)
+
+ self.new_request_button = QPushButton(_('&Clear'))
+ self.new_request_button.clicked.connect(self.new_payment_request)
+
+ weakSelf = Weak.ref(self)
+
+ class MyQRCodeWidget(QRCodeWidget):
+ def mouseReleaseEvent(slf, e):
+ ''' to make the QRWidget clickable '''
+ weakSelf() and weakSelf().show_qr_window()
+
+ self.receive_qr = MyQRCodeWidget(fixedSize=200)
+ self.receive_qr.setCursor(QCursor(Qt.PointingHandCursor))
+
+ self.receive_buttons = buttons = QHBoxLayout()
+ buttons.addWidget(self.save_request_button)
+ buttons.addWidget(self.new_request_button)
+ buttons.addStretch(1)
+ grid.addLayout(buttons, row, 2, 1, -1)
+ row += 1
+
+ self.receive_requests_label = QLabel(_('Re&quests'))
+
+ from .request_list import RequestList
+ self.request_list = RequestList(self)
+ self.request_list.chkVisible()
+
+ self.receive_requests_label.setBuddy(self.request_list)
+
+ # layout
+ vbox_g = QVBoxLayout()
+ vbox_g.addLayout(grid)
+ vbox_g.addStretch()
+
+ hbox = QHBoxLayout()
+ hbox.addLayout(vbox_g)
+
+ def on_copy_uri():
+ if self.receive_qr.data:
+ uri = str(self.receive_qr.data)
+ self.copy_to_clipboard(
+ uri, _('Receive request URI copied to clipboard'), uribut)
+
+ if self.wallet.wallet_type == 'rpa':
+ # Disable unnecessary fields
+ self.save_request_button.setEnabled(False)
+ self.new_request_button.setEnabled(False)
+ self.receive_message_e.setEnabled(False)
+ self.receive_amount_e.setEnabled(False)
+ self.fiat_receive_e.setEnabled(False)
+ self.expires_combo.setEnabled(False)
+
+ # The QR code for the receive tab.
+ if self.wallet.wallet_type != 'rpa':
+ # Do not attempt to show a QR code for RPA paycode wallets. There is no URI scheme yet for RPA.
+ vbox2 = QVBoxLayout()
+ vbox2.setContentsMargins(0, 0, 0, 0)
+ vbox2.setSpacing(4)
+ vbox2.addWidget(self.receive_qr, Qt.AlignHCenter | Qt.AlignTop)
+ self.receive_qr.setToolTip(_('Receive request QR code (click for details)'))
+ but = uribut = QPushButton(_('Copy &URI'))
+ but.clicked.connect(on_copy_uri)
+ but.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
+ but.setToolTip(_('Click to copy the receive request URI to the clipboard'))
+ vbox2.addWidget(but)
+ vbox2.setAlignment(but, Qt.AlignHCenter | Qt.AlignVCenter)
+ hbox.addLayout(vbox2)
+
+
+ class ReceiveTab(QWidget):
+ def showEvent(slf, e):
+ super().showEvent(e)
+ if e.isAccepted():
+ wslf = weakSelf()
+ if wslf:
+ wslf.check_and_reset_receive_address_if_needed()
+
+ w = ReceiveTab()
+ w.searchable_list = self.request_list
+ vbox = QVBoxLayout(w)
+ vbox.addLayout(hbox)
+ vbox.addStretch(1)
+ vbox.addWidget(self.receive_requests_label)
+ vbox.addWidget(self.request_list)
+ vbox.setStretchFactor(self.request_list, 1000)
+
+ return w
+
+
+ def delete_payment_request(self, addr):
+ self.wallet.remove_payment_request(addr, self.config)
+ self.request_list.update()
+ self.address_list.update()
+ self.clear_receive_tab()
+
+ def get_request_URI(self, addr):
+ req = self.wallet.receive_requests[addr]
+ message = self.wallet.labels.get(addr.to_storage_string(), '')
+ amount = req['amount']
+ op_return = req.get('op_return')
+ op_return_raw = req.get('op_return_raw') if not op_return else None
+ URI = web.create_URI(addr, amount, message, op_return=op_return, op_return_raw=op_return_raw)
+ if req.get('time'):
+ URI += "&time=%d"%req.get('time')
+ if req.get('exp'):
+ URI += "&exp=%d"%req.get('exp')
+ if req.get('name') and req.get('sig'):
+ sig = bfh(req.get('sig'))
+ sig = bitcoin.base_encode(sig, base=58)
+ URI += "&name=" + req['name'] + "&sig="+sig
+ return str(URI)
+
+
+ def sign_payment_request(self, addr):
+ alias = self.config.get('alias')
+ alias_privkey = None
+ if alias and self.alias_info:
+ alias_addr, alias_name, validated = self.alias_info
+ if alias_addr:
+ if self.wallet.is_mine(alias_addr):
+ msg = _('This payment request will be signed.') + '\n' + _('Please enter your password')
+ password = self.password_dialog(msg)
+ if password:
+ try:
+ self.wallet.sign_payment_request(addr, alias, alias_addr, password)
+ except Exception as e:
+ traceback.print_exc(file=sys.stderr)
+ self.show_error(str(e) or repr(e))
+ return
+ else:
+ return
+ else:
+ return
+
+ def save_payment_request(self):
+ if not self.receive_address:
+ self.show_error(_('No receiving address'))
+ amount = self.receive_amount_e.get_amount()
+ message = self.receive_message_e.text()
+ if not message and not amount:
+ self.show_error(_('No message or amount'))
+ return False
+ i = self.expires_combo.currentIndex()
+ expiration = list(map(lambda x: x[1], expiration_values))[i]
+ kwargs = {}
+ opr = self.receive_opreturn_e.text().strip()
+ if opr:
+ # save op_return, if any
+ arg = 'op_return'
+ if self.receive_opreturn_rawhex_cb.isChecked():
+ arg = 'op_return_raw'
+ kwargs[arg] = opr
+ req = self.wallet.make_payment_request(self.receive_address, amount,
+ message, expiration, **kwargs)
+ self.wallet.add_payment_request(req, self.config)
+ self.sign_payment_request(self.receive_address)
+ self.request_list.update()
+ self.request_list.select_item_by_address(req.get('address')) # when adding items to the view the current selection may not reflect what's in the UI. Make sure it's selected.
+ self.address_list.update()
+ self.save_request_button.setEnabled(False)
+
+ def view_and_paste(self, title, msg, data):
+ dialog = WindowModalDialog(self.top_level_window(), title)
+ vbox = QVBoxLayout()
+ label = QLabel(msg)
+ label.setWordWrap(True)
+ vbox.addWidget(label)
+ pr_e = ShowQRTextEdit(text=data)
+ vbox.addWidget(pr_e)
+ vbox.addLayout(Buttons(CopyCloseButton(pr_e.text, self.app, dialog)))
+ dialog.setLayout(vbox)
+ dialog.exec_()
+
+ def export_payment_request(self, addr):
+ r = self.wallet.receive_requests[addr]
+ try:
+ pr = paymentrequest.serialize_request(r).SerializeToString()
+ except ValueError as e:
+ ''' User entered some large amount or other value that doesn't fit
+ into a C++ type. See #1738. '''
+ self.show_error(str(e))
+ return
+ name = r['id'] + '.bip70'
+ fileName = self.getSaveFileName(_("Select where to save your payment request"), name, "*.bip70")
+ if fileName:
+ with open(fileName, "wb+") as f:
+ f.write(util.to_bytes(pr))
+ self.show_message(_("Request saved successfully"))
+ self.saved = True
+
+ def new_payment_request(self):
+ addr = self.wallet.get_unused_address(frozen_ok=False)
+ if addr is None:
+ if not self.wallet.is_deterministic():
+ msg = [
+ _('No more addresses in your wallet.'),
+ _('You are using a non-deterministic wallet, which cannot create new addresses.'),
+ _('If you want to create new addresses, use a deterministic wallet instead.')
+ ]
+ self.show_message(' '.join(msg))
+ # New! Since the button is called 'Clear' now, we let them proceed with a re-used address
+ addr = self.wallet.get_receiving_address()
+ else:
+ # Warn if past gap limit.
+ if not self.question(_("Warning: The next address will not be recovered automatically if you restore your wallet from seed; you may need to add it manually.\n\nThis occurs because you have too many unused addresses in your wallet. To avoid this situation, use the existing addresses first.\n\nCreate anyway?")):
+ return
+ addr = self.wallet.create_new_address(False)
+ self.set_receive_address(addr)
+ self.expires_label.hide()
+ self.expires_combo.show()
+ self.request_list.setCurrentItem(None) # We want the current item to always reflect what's in the UI. So if new, clear selection.
+ self.receive_message_e.setFocus(1)
+
+ def set_receive_address(self, addr):
+ self.receive_address = addr
+ self.receive_message_e.setText('')
+ self.receive_opreturn_rawhex_cb.setChecked(False)
+ self.receive_opreturn_e.setText('')
+ self.receive_amount_e.setAmount(None)
+ self.update_receive_address_widget()
+
+ def update_receive_address_widget(self):
+ text = ''
+ text_token = ''
+ if self.receive_address:
+ text = self.receive_address.to_full_ui_string()
+ text_token = self.receive_address.to_full_token_string()
+ self.receive_address_e.setText(text)
+ self.receive_token_address_e.setText(text_token)
+ self.cash_account_e.set_cash_acct()
+
+ @rate_limited(0.250, ts_after=True) # this function potentially re-computes the QR widget, so it's rate limited to once every 250ms
+ def check_and_reset_receive_address_if_needed(self):
+ ''' Check to make sure the receive tab is kosher and doesn't contain
+ an already-used address. This should be called from the showEvent
+ for the tab. '''
+ if not self.wallet.use_change or self.cleaned_up:
+ # if they don't care about change addresses, they are ok
+ # with re-using addresses, so skip this check.
+ return
+ # ok, they care about anonymity, so make sure the receive address
+ # is always an unused address.
+ if (not self.receive_address # this should always be defined but check anyway
+ or self.receive_address in self.wallet.frozen_addresses # make sure it's not frozen
+ or (self.wallet.get_address_history(self.receive_address) # make a new address if it has a history
+ and not self.wallet.get_payment_request(self.receive_address, self.config))): # and if they aren't actively editing one in the request_list widget
+ addr = self.wallet.get_unused_address(frozen_ok=False) # try unused, not frozen
+ if addr is None:
+ if self.wallet.is_deterministic():
+ # creae a new one if deterministic
+ addr = self.wallet.create_new_address(False)
+ else:
+ # otherwise give up and just re-use one.
+ addr = self.wallet.get_receiving_address()
+ self.receive_address = addr
+ self.update_receive_address_widget()
+
+ def clear_receive_tab(self):
+ self.expires_label.hide()
+ self.expires_combo.show()
+ self.request_list.setCurrentItem(None)
+ self.set_receive_address(self.wallet.get_receiving_address(frozen_ok=False))
+
+ def show_qr_window(self):
+ from . import qrwindow
+ if not self.qr_window:
+ self.qr_window = qrwindow.QR_Window()
+ self.qr_window.setAttribute(Qt.WA_DeleteOnClose, True)
+ weakSelf = Weak.ref(self)
+ def destroyed_clean(x):
+ if weakSelf():
+ weakSelf().qr_window = None
+ weakSelf().print_error("QR Window destroyed.")
+ self.qr_window.destroyed.connect(destroyed_clean)
+ self.update_receive_qr()
+ if self.qr_window.isMinimized():
+ self.qr_window.showNormal()
+ else:
+ self.qr_window.show()
+ self.qr_window.raise_()
+ self.qr_window.activateWindow()
+
+ def show_send_tab(self):
+ self.tabs.setCurrentIndex(self.tabs.indexOf(self.send_tab))
+
+ def show_receive_tab(self):
+ self.tabs.setCurrentIndex(self.tabs.indexOf(self.receive_tab))
+
+ def receive_at(self, addr):
+ self.receive_address = addr
+ self.show_receive_tab()
+ self.update_receive_address_widget()
+
+ def update_receive_qr(self):
+ if not self.receive_address:
+ return
+ amount = self.receive_amount_e.get_amount()
+ message = self.receive_message_e.text()
+ self.save_request_button.setEnabled((amount is not None) or (message != ""))
+ kwargs = {}
+ if self.receive_opreturn_e.isVisible():
+ # set op_return if enabled
+ arg = 'op_return'
+ if self.receive_opreturn_rawhex_cb.isChecked():
+ arg = 'op_return_raw'
+ opret = self.receive_opreturn_e.text()
+ if opret:
+ kwargs[arg] = opret
+
+ # Special case hack -- see #1473. Omit bitcoincash: prefix from
+ # legacy address if no other params present in receive request.
+ if Address.FMT_UI == Address.FMT_LEGACY and not kwargs and not amount and not message:
+ uri = self.receive_address.to_ui_string()
+ else:
+ # Otherwise proceed as normal, prepending bitcoincash: to URI
+ uri = web.create_URI(self.receive_address, amount, message, **kwargs)
+
+ self.receive_qr.setData(uri)
+ if self.qr_window:
+ self.qr_window.set_content(self, self.receive_address_e.text(), amount,
+ message, uri, **kwargs)
+
+ def create_send_tab(self):
+ # A 4-column grid layout. All the stretch is in the last column.
+ # The exchange rate plugin adds a fiat widget in column 2
+ self.send_grid = grid = QGridLayout()
+ grid.setSpacing(8)
+ grid.setColumnStretch(3, 1)
+
+ from .paytoedit import PayToEdit
+ self.amount_e = BTCAmountEdit(self.get_decimal_point)
+ self.payto_e = PayToEdit(self)
+ # NB: the translators hopefully will not have too tough a time with this
+ # *fingers crossed* :)
+ msg = "" + _('Recipient of the funds.') + " " + \
+ _("You may enter:"
+ ""
+ "- Bitcoin Cash Address ★"
+ "
- Bitcoin Cash Token Address ★"
+ "
- Bitcoin Legacy Address ★"
+ "
- Cash Account ★ e.g. satoshi#123"
+ "
- Contact name ★ from the Contacts tab"
+ "
- OpenAlias e.g. satoshi@domain.com"
+ "
"
+ " ★ = Supports pay-to-many, where"
+ " you may optionally enter multiple lines of the form:"
+ "
"
+ " recipient1, amount1 \n"
+ " recipient2, amount2 \n"
+ " etc..."
+ "
")
+ self.payto_label = payto_label = HelpLabel(_('Pay &to'), msg)
+ payto_label.setBuddy(self.payto_e)
+ qmark = ":icons/question-mark-dark.svg" if ColorScheme.dark_scheme else ":icons/question-mark-light.svg"
+ qmark_help_but = HelpButton(msg, button_text='', fixed_size=False, icon=QIcon(qmark), custom_parent=self)
+ self.payto_e.addWidget(qmark_help_but, index=0)
+ grid.addWidget(payto_label, 1, 0)
+ grid.addWidget(self.payto_e, 1, 1, 1, -1)
+
+ completer = QCompleter(self.payto_e)
+ completer.setCaseSensitivity(False)
+ self.payto_e.setCompleter(completer)
+ completer.setModel(self.completions)
+
+ msg = _('Description of the transaction (not mandatory).') + '\n\n'\
+ + _('The description is not sent to the recipient of the funds. It is stored in your wallet file, and displayed in the \'History\' tab.')
+ description_label = HelpLabel(_('&Description'), msg)
+ grid.addWidget(description_label, 2, 0)
+ self.message_e = MyLineEdit()
+ description_label.setBuddy(self.message_e)
+ grid.addWidget(self.message_e, 2, 1, 1, -1)
+
+ msg_opreturn = ( _('OP_RETURN data (optional).') + '\n\n'
+ + _('Posts a PERMANENT note to the BCH blockchain as part of this transaction.')
+ + '\n\n' + _('If you specify OP_RETURN text, you may leave the \'Pay to\' field blank.') )
+ self.opreturn_label = HelpLabel(_('&OP_RETURN'), msg_opreturn)
+ grid.addWidget(self.opreturn_label, 3, 0)
+ self.message_opreturn_e = MyLineEdit()
+ self.opreturn_label.setBuddy(self.message_opreturn_e)
+ hbox = QHBoxLayout()
+ hbox.addWidget(self.message_opreturn_e)
+ self.opreturn_rawhex_cb = QCheckBox(_('&Raw hex script'))
+ self.opreturn_rawhex_cb.setToolTip(_('If unchecked, the textbox contents are UTF8-encoded into a single-push script: OP_RETURN PUSH <text>. If checked, the text contents will be interpreted as a raw hexadecimal script to be appended after the OP_RETURN opcode: OP_RETURN <script>.'))
+ hbox.addWidget(self.opreturn_rawhex_cb)
+ grid.addLayout(hbox, 3 , 1, 1, -1)
+
+ self.send_tab_opreturn_widgets = [
+ self.message_opreturn_e,
+ self.opreturn_rawhex_cb,
+ self.opreturn_label,
+ ]
+
+ self.from_label = QLabel(_('&From'))
+ grid.addWidget(self.from_label, 4, 0)
+ self.from_list = MyTreeWidget(self, self.from_list_menu, ['',''])
+ self.from_label.setBuddy(self.from_list)
+ self.from_list.setHeaderHidden(True)
+ self.from_list.setMaximumHeight(80)
+ grid.addWidget(self.from_list, 4, 1, 1, -1)
+ self.set_pay_from([])
+
+ msg = _('Amount to be sent.') + '\n\n' \
+ + _('The amount will be displayed in red if you do not have enough funds in your wallet.') + ' ' \
+ + _('Note that if you have frozen some of your addresses, the available funds will be lower than your total balance.') + '\n\n' \
+ + _('Keyboard shortcut: type "!" to send all your coins.')
+ amount_label = HelpLabel(_('&Amount'), msg)
+ amount_label.setBuddy(self.amount_e)
+ grid.addWidget(amount_label, 5, 0)
+ grid.addWidget(self.amount_e, 5, 1)
+
+ self.fiat_send_e = AmountEdit(self.fx.get_currency if self.fx else '')
+ if not self.fx or not self.fx.is_enabled():
+ self.fiat_send_e.setVisible(False)
+ grid.addWidget(self.fiat_send_e, 5, 2)
+ self.amount_e.frozen.connect(
+ lambda: self.fiat_send_e.setFrozen(self.amount_e.isReadOnly()))
+
+ self.max_button = EnterButton(_("&Max"), self.spend_max)
+ self.max_button.setFixedWidth(140)
+ self.max_button.setCheckable(True)
+ grid.addWidget(self.max_button, 5, 3)
+ hbox = self.send_tab_extra_plugin_controls_hbox = QHBoxLayout()
+ hbox.addStretch(1)
+ grid.addLayout(hbox, 5, 4, 1, -1)
+
+ msg = _('Bitcoin Cash transactions are in general not free. A transaction fee is paid by the sender of the funds.') + '\n\n'\
+ + _('The amount of fee can be decided freely by the sender. However, transactions with low fees take more time to be processed.') + '\n\n'\
+ + _('A suggested fee is automatically added to this field. You may override it. The suggested fee increases with the size of the transaction.')
+ self.fee_e_label = HelpLabel(_('F&ee'), msg)
+
+ def fee_cb(dyn, pos, fee_rate):
+ if dyn:
+ self.config.set_key('fee_level', pos, False)
+ else:
+ self.config.set_key('fee_per_kb', fee_rate, False)
+ self.spend_max() if self.max_button.isChecked() else self.update_fee()
+
+ self.fee_slider = FeeSlider(self, self.config, fee_cb)
+ self.fee_e_label.setBuddy(self.fee_slider)
+ self.fee_slider.setFixedWidth(140)
+
+ self.fee_custom_lbl = HelpLabel(self.get_custom_fee_text(),
+ _('This is the fee rate that will be used for this transaction.')
+ + "\n\n" + _('It is calculated from the Custom Fee Rate in preferences, but can be overridden from the manual fee edit on this form (if enabled).')
+ + "\n\n" + _('Generally, a fee of 1.0 sats/B is a good minimal rate to ensure your transaction will make it into the next block.'))
+ self.fee_custom_lbl.setFixedWidth(140)
+
+ self.fee_slider_mogrifier()
+
+ self.fee_e = BTCAmountEdit(self.get_decimal_point)
+ if not self.config.get('show_fee', False):
+ self.fee_e.setVisible(False)
+ self.fee_e.textEdited.connect(self.update_fee)
+ # This is so that when the user blanks the fee and moves on,
+ # we go back to auto-calculate mode and put a fee back.
+ self.fee_e.editingFinished.connect(self.update_fee)
+ self.connect_fields(self, self.amount_e, self.fiat_send_e, self.fee_e)
+
+ grid.addWidget(self.fee_e_label, 6, 0)
+ grid.addWidget(self.fee_slider, 6, 1)
+ grid.addWidget(self.fee_custom_lbl, 6, 1)
+ grid.addWidget(self.fee_e, 6, 2)
+
+ self.preview_button = EnterButton(_("&Preview"), self.do_preview)
+ self.preview_button.setToolTip(_('Display the details of your transactions before signing it.'))
+ self.send_button = EnterButton(_("&Send"), self.do_send)
+ self.clear_button = EnterButton(_("&Clear"), self.do_clear)
+ buttons = QHBoxLayout()
+ buttons.addStretch(1)
+ buttons.addWidget(self.clear_button)
+ buttons.addWidget(self.preview_button)
+ buttons.addWidget(self.send_button)
+ grid.addLayout(buttons, 7, 1, 1, 3)
+
+ self.payto_e.textChanged.connect(self.update_buttons_on_seed) # hide/unhide various buttons
+
+ self.amount_e.shortcut.connect(self.spend_max)
+ self.payto_e.textChanged.connect(self.update_fee)
+ self.amount_e.textEdited.connect(self.update_fee)
+ self.message_opreturn_e.textEdited.connect(self.update_fee)
+ self.message_opreturn_e.textChanged.connect(self.update_fee)
+ self.message_opreturn_e.editingFinished.connect(self.update_fee)
+ self.opreturn_rawhex_cb.stateChanged.connect(self.update_fee)
+
+ def reset_max(text):
+ self.max_button.setChecked(False)
+ enabled = not bool(text) and not self.amount_e.isReadOnly()
+ self.max_button.setEnabled(enabled)
+ self.amount_e.textEdited.connect(reset_max)
+ self.fiat_send_e.textEdited.connect(reset_max)
+
+ def entry_changed():
+ text = ""
+ if self.not_enough_funds:
+ amt_color, fee_color = ColorScheme.RED, ColorScheme.RED
+ text = _( "Not enough funds" )
+ c, u, x = self.wallet.get_frozen_balance()
+ if c+u+x:
+ text += ' (' + self.format_amount(c+u+x).strip() + ' ' + self.base_unit() + ' ' +_("are frozen") + ')'
+
+ extra = run_hook("not_enough_funds_extra", self)
+ if isinstance(extra, str) and extra:
+ text += " ({})".format(extra)
+
+ elif self.fee_e.isModified():
+ amt_color, fee_color = ColorScheme.DEFAULT, ColorScheme.DEFAULT
+ elif self.amount_e.isModified():
+ amt_color, fee_color = ColorScheme.DEFAULT, ColorScheme.BLUE
+ else:
+ amt_color, fee_color = ColorScheme.BLUE, ColorScheme.BLUE
+ opret_color = ColorScheme.DEFAULT
+ if self.op_return_toolong:
+ opret_color = ColorScheme.RED
+ text = _("OP_RETURN message too large, needs to be no longer than 220 bytes") + (", " if text else "") + text
+
+ self.statusBar().showMessage(text)
+ self.amount_e.setStyleSheet(amt_color.as_stylesheet())
+ self.fee_e.setStyleSheet(fee_color.as_stylesheet())
+ self.message_opreturn_e.setStyleSheet(opret_color.as_stylesheet())
+
+ self.amount_e.textChanged.connect(entry_changed)
+ self.fee_e.textChanged.connect(entry_changed)
+ self.message_opreturn_e.textChanged.connect(entry_changed)
+ self.message_opreturn_e.textEdited.connect(entry_changed)
+ self.message_opreturn_e.editingFinished.connect(entry_changed)
+ self.opreturn_rawhex_cb.stateChanged.connect(entry_changed)
+
+ self.invoices_label = QLabel(_('Invoices'))
+ from .invoice_list import InvoiceList
+ self.invoice_list = InvoiceList(self)
+ self.invoice_list.chkVisible()
+
+ vbox0 = QVBoxLayout()
+ vbox0.addLayout(grid)
+ hbox = QHBoxLayout()
+ hbox.addLayout(vbox0)
+
+ w = QWidget()
+ vbox = QVBoxLayout(w)
+ vbox.addLayout(hbox)
+ vbox.addStretch(1)
+ vbox.addWidget(self.invoices_label)
+ vbox.addWidget(self.invoice_list)
+ vbox.setStretchFactor(self.invoice_list, 1000)
+ w.searchable_list = self.invoice_list
+ run_hook('create_send_tab', grid)
+ return w
+
+ def spend_max(self):
+ self.max_button.setChecked(True)
+ self.do_update_fee()
+
+ def update_fee(self):
+ self.require_fee_update = True
+
+ def get_payto_or_dummy(self):
+ r = self.payto_e.get_recipient()
+ if r:
+ return r
+ return (TYPE_ADDRESS, self.wallet.dummy_address())
+
+ def get_custom_fee_text(self, fee_rate = None):
+ if not self.config.has_custom_fee_rate():
+ return ""
+ else:
+ if fee_rate is None: fee_rate = self.config.custom_fee_rate() / 1000.0
+ return str(round(fee_rate*100)/100) + " sats/B"
+
+ def do_update_fee(self):
+ '''Recalculate the fee. If the fee was manually input, retain it, but
+ still build the TX to see if there are enough funds.
+ '''
+ freeze_fee = (self.fee_e.isModified()
+ and (self.fee_e.text() or self.fee_e.hasFocus()))
+ amount = '!' if self.max_button.isChecked() else self.amount_e.get_amount()
+ fee_rate = None
+ if amount is None:
+ if not freeze_fee:
+ self.fee_e.setAmount(None)
+ self.not_enough_funds = False
+ self.statusBar().showMessage('')
+ else:
+ fee = self.fee_e.get_amount() if freeze_fee else None
+ outputs = self.payto_e.get_outputs(self.max_button.isChecked())
+ if not outputs:
+ _type, addr = self.get_payto_or_dummy()
+ outputs = [(_type, addr, amount)]
+ try:
+ opreturn_message = self.message_opreturn_e.text() if self.config.get('enable_opreturn') else None
+ if opreturn_message:
+ if self.opreturn_rawhex_cb.isChecked():
+ outputs.append(OPReturn.output_for_rawhex(opreturn_message))
+ else:
+ outputs.append(OPReturn.output_for_stringdata(opreturn_message))
+ tx = self.wallet.make_unsigned_transaction(self.get_coins(), outputs, self.config, fee)
+ self.not_enough_funds = False
+ self.op_return_toolong = False
+ except NotEnoughFunds:
+ self.not_enough_funds = True
+ if not freeze_fee:
+ self.fee_e.setAmount(None)
+ return
+ except OPReturn.TooLarge:
+ self.op_return_toolong = True
+ return
+ except OPReturn.Error as e:
+ self.statusBar().showMessage(str(e))
+ return
+ except BaseException:
+ return
+
+ if not freeze_fee:
+ fee = None if self.not_enough_funds else tx.get_fee()
+ self.fee_e.setAmount(fee)
+
+ if self.max_button.isChecked():
+ amount = tx.output_value()
+ self.amount_e.setAmount(amount)
+ if fee is not None:
+ fee_rate = fee / tx.estimated_size()
+ self.fee_slider_mogrifier(self.get_custom_fee_text(fee_rate))
+
+ def fee_slider_mogrifier(self, text = None):
+ fee_slider_hidden = self.config.has_custom_fee_rate()
+ self.fee_slider.setHidden(fee_slider_hidden)
+ self.fee_custom_lbl.setHidden(not fee_slider_hidden)
+ if text is not None: self.fee_custom_lbl.setText(text)
+
+ def from_list_delete(self, name):
+ item = self.from_list.currentItem()
+ if (item and item.data(0, Qt.UserRole) == name
+ and not item.data(0, Qt.UserRole+1) ):
+ i = self.from_list.indexOfTopLevelItem(item)
+ try:
+ self.pay_from.pop(i)
+ except IndexError:
+ # The list may contain items not in the pay_from if added by a
+ # plugin using the spendable_coin_filter hook
+ pass
+ self.redraw_from_list()
+ self.update_fee()
+
+ def from_list_menu(self, position):
+ item = self.from_list.itemAt(position)
+ if not item:
+ return
+ menu = QMenu()
+ name = item.data(0, Qt.UserRole)
+ action = menu.addAction(_("Remove"), lambda: self.from_list_delete(name))
+ if item.data(0, Qt.UserRole+1):
+ action.setText(_("Not Removable"))
+ action.setDisabled(True)
+ menu.exec_(self.from_list.viewport().mapToGlobal(position))
+
+ def set_pay_from(self, coins):
+ self.pay_from = list(coins)
+ self.redraw_from_list()
+
+ def redraw_from_list(self, *, spendable=None):
+ ''' Optional kwarg spendable indicates *which* of the UTXOs in the
+ self.pay_from list are actually spendable. If this arg is specifid,
+ coins in the self.pay_from list that aren't also in the 'spendable' list
+ will be grayed out in the UI, to indicate that they will not be used.
+ Otherwise all coins will be non-gray (default).
+ (Added for CashShuffle 02/23/2019) '''
+ sel = self.from_list.currentItem() and self.from_list.currentItem().data(0, Qt.UserRole)
+ self.from_list.clear()
+ self.from_label.setHidden(len(self.pay_from) == 0)
+ self.from_list.setHidden(len(self.pay_from) == 0)
+
+ def name(x):
+ return "{}:{}".format(x['prevout_hash'], x['prevout_n'])
+
+ def format(x):
+ h = x['prevout_hash']
+ return '{}...{}:{:d}\t{}'.format(h[0:10], h[-10:],
+ x['prevout_n'], x['address'])
+ def grayify(twi):
+ b = twi.foreground(0)
+ b.setColor(Qt.gray)
+ for i in range(twi.columnCount()):
+ twi.setForeground(i, b)
+
+ def new(item, is_unremovable=False):
+ ret = QTreeWidgetItem( [format(item), self.format_amount(item['value']) ])
+ ret.setData(0, Qt.UserRole, name(item))
+ ret.setData(0, Qt.UserRole+1, is_unremovable)
+ return ret
+
+ for item in self.pay_from:
+ twi = new(item)
+ if spendable is not None and item not in spendable:
+ grayify(twi)
+ self.from_list.addTopLevelItem(twi)
+ if name(item) == sel:
+ self.from_list.setCurrentItem(twi)
+
+ if spendable is not None: # spendable may be None if no plugin filtered coins.
+ for item in spendable:
+ # append items added by the plugin to the spendable list
+ # at the bottom. These coins are marked as "not removable"
+ # in the UI (the plugin basically insisted these coins must
+ # be spent with the other coins in the list for privacy).
+ if item not in self.pay_from:
+ twi = new(item, True)
+ self.from_list.addTopLevelItem(twi)
+ if name(item) == sel:
+ self.from_list.setCurrentItem(twi)
+
+ def get_contact_payto(self, contact : Contact) -> str:
+ assert isinstance(contact, Contact)
+ _type, label = contact.type, contact.name
+ emoji_str = ''
+ mod_type = _type
+ mine_str = ''
+ if _type.startswith('cashacct'): # picks up cashacct and the cashacct_W pseudo-contacts
+ if _type == 'cashacct_T':
+ # temporary "pending verification" registration pseudo-contact. Never offer it as a completion!
+ return None
+ mod_type = 'cashacct'
+ info = self.wallet.cashacct.get_verified(label)
+ if info:
+ emoji_str = f' {info.emoji}'
+ if _type == 'cashacct_W':
+ mine_str = ' [' + _('Mine') + '] '
+ else:
+ self.print_error(label, "not found")
+ # could not get verified contact, don't offer it as a completion
+ return None
+ elif _type == 'openalias':
+ return contact.address
+ return label + emoji_str + ' ' + mine_str + '<' + contact.address + '>' if mod_type in ('address', 'cashacct') else None
+
+ def update_completions(self):
+ l = []
+ for contact in self.contact_list.get_full_contacts():
+ s = self.get_contact_payto(contact)
+ if s is not None: l.append(s)
+ l.sort(key=lambda x: x.lower()) # case-insensitive sort
+ self.completions.setStringList(l)
+
+ def protected(func):
+ '''Password request wrapper. The password is passed to the function
+ as the 'password' named argument. "None" indicates either an
+ unencrypted wallet, or the user cancelled the password request.
+ An empty input is passed as the empty string.'''
+ def request_password(self, *args, **kwargs):
+ parent = self.top_level_window()
+ password = None
+ on_pw_cancel = kwargs.pop('on_pw_cancel', None)
+ while self.wallet.has_password():
+ password = self.password_dialog(parent=parent)
+ if password is None:
+ # User cancelled password input
+ if callable(on_pw_cancel):
+ on_pw_cancel()
+ return
+ try:
+ self.wallet.check_password(password)
+ break
+ except Exception as e:
+ self.show_error(str(e), parent=parent)
+ continue
+
+ kwargs['password'] = password
+ return func(self, *args, **kwargs)
+ return request_password
+
+ def read_send_tab(self,get_raw=False):
+
+ # This is a wrapper function around the call the generate the rpa transaction. We can pass this function to the waiting dialog.
+ def rpa_grind():
+ exit_event = threading.Event()
+
+ def update_prog_grinding(x):
+ if dlg:
+ dlg.update_progress(int(x))
+ if dlg.isHidden():
+ exit_event.set()
+ self.raw_tx = rpa.paycode.generate_transaction_from_paycode(
+ self.wallet, self.config, full_unit_amount, paycode_string,
+ password=rpa_pwd, progress_callback=update_prog_grinding,
+ exit_event=exit_event
+ )
+ return
+
+ isInvoice= False
+
+ if self.payment_request and self.payment_request.has_expired():
+ self.show_error(_('Payment request has expired'))
+ return
+ label = self.message_e.text()
+ if not self.wallet.is_multisig() and self.payto_e.is_paycode:
+ paycode_string = self.payto_e.text()[1:-1]
+ if self.amount_e.get_amount() is None:
+ self.show_error(_('Invalid Amount'))
+ return
+ full_unit_amount = self.amount_e.get_amount() / 100000000
+
+
+ rpa_pwd = None
+ if self.wallet.wallet_type == 'rpa':
+ rpa_pwd = self.wallet.rpa_pwd
+ else:
+ if self.wallet.has_password():
+ msg = []
+ msg.append("")
+ msg.append(_("Enter your password to proceed"))
+ password = self.password_dialog('\n'.join(msg))
+ if not password:
+ return
+ rpa_pwd = password
+
+ self.raw_tx = None
+ dlg = WaitingDialog(self, _('Please allow a few moments while Electron Cash creates your RPA transaction. It needs to grind through many transaction signatures.'), rpa_grind, None, self.on_error, progress_bar=True, progress_min=0, progress_max=100)
+ val=dlg.exec_()
+ # If the user closes the waiting dialog, we should just exit.
+ if self.raw_tx == None:
+ return
+
+ raw_tx = self.raw_tx
+ if raw_tx == 0:
+ self.show_error("Problem creating paycode tx.")
+ return
+ unpacked_tx = Transaction.deserialize(Transaction(raw_tx))
+ output_zero_address = unpacked_tx["outputs"][0]['address']
+ # Set the pay-to field address as a tuple with index 0 and the rpa
+ # output address
+ self.payto_e.payto_address = (0, output_zero_address)
+ outputs = self.payto_e.get_outputs(self.max_button.isChecked())
+ else:
+ # Proceed with normal (non RPA paycode) scenarios
+ if self.payment_request:
+ isInvoice = True;
+ outputs = self.payment_request.get_outputs()
+ else:
+ errors = self.payto_e.get_errors()
+ if errors:
+ self.show_warning(_("Invalid lines found:") + "\n\n" + '\n'.join([ _("Line #") + str(x[0]+1) + ": " + x[1] for x in errors]))
+ return
+ outputs = self.payto_e.get_outputs(self.max_button.isChecked())
+
+ if self.payto_e.is_alias and not self.payto_e.validated:
+ alias = self.payto_e.toPlainText()
+ msg = _('WARNING: the alias "{}" could not be validated via an additional '
+ 'security check, DNSSEC, and thus may not be correct.').format(alias) + '\n'
+ msg += _('Do you wish to continue?')
+ if not self.question(msg):
+ return
+
+ try:
+ # handle op_return if specified and enabled
+ opreturn_message = self.message_opreturn_e.text()
+ if opreturn_message:
+ if self.opreturn_rawhex_cb.isChecked():
+ outputs.append(OPReturn.output_for_rawhex(opreturn_message))
+ else:
+ outputs.append(OPReturn.output_for_stringdata(opreturn_message))
+ except OPReturn.TooLarge as e:
+ self.show_error(str(e))
+ return
+ except OPReturn.Error as e:
+ self.show_error(str(e))
+ return
+
+ # END ELSE (Normal Case, not Paycode)
+ # -----------------------------------
+ # Proceed with checking outputs
+
+ if not outputs:
+ self.show_error(_('No outputs'))
+ return
+
+ for _type, addr, amount in outputs:
+ if amount is None:
+ self.show_error(_('Invalid Amount'))
+ return
+
+ freeze_fee = self.fee_e.isVisible() and self.fee_e.isModified() and (self.fee_e.text() or self.fee_e.hasFocus())
+ fee = self.fee_e.get_amount() if freeze_fee else None
+ coins = self.get_coins(isInvoice)
+
+ # Return data. Include the raw_tx if specified.
+ # raw_tx used for RPA functionality so we can avoid grinding the transaction twice.
+ # In that case, do_send() calls read_send_tab and doesn't need to
+ # create the transaction again.
+
+ if get_raw:
+ return outputs, fee, label, coins, raw_tx
+ else:
+ return outputs, fee, label, coins
+
+ def _chk_no_segwit_suspects(self):
+ ''' Makes sure the payto_e has no addresses that might be BTC segwit
+ in it and if it does, warn user. Intended to be called from do_send.
+ Returns True if no segwit suspects were detected in the payto_e,
+ False otherwise. If False is returned, a suitable error dialog
+ will have already been presented to the user. '''
+ if bool(self.config.get('allow_legacy_p2sh', False)):
+ return True
+ segwits = set()
+ prefix_char = '3' if not networks.net.TESTNET else '2'
+ for line in self.payto_e.lines():
+ line = line.strip()
+ if ':' in line and line.lower().startswith(networks.net.CASHADDR_PREFIX + ":"):
+ line = line.split(':', 1)[1] # strip bitcoincash: prefix
+ if ',' in line:
+ line = line.split(',', 1)[0] # if address, amount line, strip address out and ignore rest
+ line = line.strip()
+ if line.startswith(prefix_char) and Address.is_valid(line):
+ segwits.add(line)
+ if segwits:
+ msg = ngettext("Possible BTC Segwit address in 'Pay to' field. "
+ "Please use CashAddr format for p2sh addresses.\n\n{segwit_addresses}",
+ "Possible BTC Segwit addresses in 'Pay to' field. "
+ "Please use CashAddr format for p2sh addresses.\n\n{segwit_addresses}",
+ len(segwits)).format(segwit_addresses='\n'.join(segwits))
+ detail = _("Legacy '{prefix_char}...' p2sh address support in the Send tab is "
+ "restricted by default in order to prevent inadvertently "
+ "sending BCH to Segwit BTC addresses.\n\n"
+ "If you are an expert user, go to 'Preferences -> Transactions' "
+ "to enable the use of legacy p2sh addresses in the Send tab.").format(prefix_char=prefix_char)
+ self.show_error(msg, detail_text=detail)
+ return False
+ return True
+
+ def _warn_if_legacy_address(self):
+ """Show a warning if self.payto_e has legacy addresses, since the user
+ might be trying to send BTC instead of BCH."""
+ warn_legacy_address = bool(self.config.get("warn_legacy_address", True))
+ if not warn_legacy_address:
+ return
+ for line in self.payto_e.lines():
+ line = line.strip()
+ if line.lower().startswith(networks.net.CASHADDR_PREFIX + ":"):
+ line = line.split(":", 1)[1] # strip "bitcoincash:" prefix
+ if "," in line:
+ # if address, amount line, strip address out and ignore rest
+ line = line.split(",", 1)[0]
+ line = line.strip()
+ if Address.is_legacy(line):
+ msg1 = (
+ _("You are about to send BCH to a legacy address.")
+ + "
"
+ + _("Legacy addresses are deprecated for Bitcoin Cash "
+ "(BCH), but they are used by Bitcoin (BTC).")
+ )
+ msg2 = _("Proceed if what you intend to do is to send BCH.")
+ msg3 = _("If you intend to send BTC, close the application "
+ "and use a BTC wallet instead. Electron Cash is a "
+ "BCH wallet, not a BTC wallet.")
+ res = self.msg_box(
+ parent=self,
+ icon=QMessageBox.Warning,
+ title=_("You are sending to a legacy address"),
+ rich_text=True,
+ text=msg1,
+ informative_text=msg2,
+ detail_text=msg3,
+ checkbox_text=_("Never show this again"),
+ checkbox_ischecked=False,
+ )
+ if res[1]: # Never ask if checked
+ self.config.set_key("warn_legacy_address", False)
+ break
+
+ def do_preview(self):
+ self.do_send(preview = True)
+
+ def do_send(self, preview = False):
+ if run_hook('abort_send', self):
+ return
+
+ # paranoia -- force a resolve right away in case user pasted an
+ # openalias or cashacct and hit preview too quickly.
+ self.payto_e.resolve(force_if_has_focus=True)
+
+ if not self._chk_no_segwit_suspects():
+ return
+
+ self._warn_if_legacy_address()
+
+ if not self.payto_e.is_paycode:
+ r = self.read_send_tab()
+ if not r:
+ return
+ outputs, fee, tx_desc, coins = r
+ else:
+ r = self.read_send_tab(get_raw=True)
+ if not r:
+ return
+ outputs, fee, tx_desc, coins, tx_raw = r
+
+ try:
+ if self.payto_e.is_paycode:
+ tx = self.tx_from_text(tx_raw)
+ else:
+ tx = self.wallet.make_unsigned_transaction(
+ coins, outputs, self.config, fee)
+ except NotEnoughFunds:
+ self.show_message(_("Insufficient funds"))
+ return
+ except ExcessiveFee:
+ self.show_message(_("Your fee is too high. Max is 50 sat/byte."))
+ return
+ except BaseException as e:
+ traceback.print_exc(file=sys.stderr)
+ self.show_message(str(e))
+ return
+
+ amount = tx.output_value() if self.max_button.isChecked() else sum(map(lambda x:x[2], outputs))
+ fee = tx.get_fee()
+
+ #if fee < self.wallet.relayfee() * tx.estimated_size() / 1000 and tx.requires_fee(self.wallet):
+ #self.show_error(_("This transaction requires a higher fee, or it will not be propagated by the network"))
+ #return
+
+ if preview:
+ # NB: this ultimately takes a deepcopy of the tx in question
+ # (TxDialog always takes a deep copy).
+ self.show_transaction(tx, tx_desc)
+ return
+
+ # We must "freeze" the tx and take a deep copy of it here. This is
+ # because it's possible that it points to coins in self.pay_from and
+ # other shared data. We want the tx to be immutable from this point
+ # forward with its own private data. This fixes a bug where sometimes
+ # the tx would stop being "is_complete" randomly after broadcast!
+ tx = copy.deepcopy(tx)
+
+ # confirmation dialog
+ msg = [
+ _("Amount to be sent") + ": " + self.format_amount_and_units(amount),
+ _("Mining fee") + ": " + self.format_amount_and_units(fee),
+ ]
+
+ x_fee = run_hook('get_tx_extra_fee', self.wallet, tx)
+ if x_fee:
+ x_fee_address, x_fee_amount = x_fee
+ msg.append( _("Additional fees") + ": " + self.format_amount_and_units(x_fee_amount) )
+
+ confirm_rate = 2 * self.config.max_fee_rate()
+
+ # IN THE FUTURE IF WE WANT TO APPEND SOMETHING IN THE MSG ABOUT THE FEE, CODE IS COMMENTED OUT:
+ #if fee > confirm_rate * tx.estimated_size() / 1000:
+ # msg.append(_('Warning') + ': ' + _("The fee for this transaction seems unusually high."))
+
+ if (fee < (tx.estimated_size())):
+ msg.append(_('Warning') + ': ' + _("You're using a fee of less than 1.0 sats/B. It may take a very long time to confirm."))
+ tx.ephemeral['warned_low_fee_already'] = True
+
+ if self.config.get('enable_opreturn') and self.message_opreturn_e.text():
+ msg.append(_("You are using an OP_RETURN message. This gets permanently written to the blockchain."))
+
+ if self.wallet.has_password():
+ msg.append("")
+ msg.append(_("Enter your password to proceed"))
+ password = self.password_dialog('\n'.join(msg))
+ if not password:
+ return
+ else:
+ msg.append(_('Proceed?'))
+ password = None
+ if not self.question('\n\n'.join(msg)):
+ return
+
+ def sign_done(success):
+ if success:
+ if not tx.is_complete():
+ self.show_transaction(tx, tx_desc)
+ self.do_clear()
+ else:
+ self.broadcast_transaction(tx, tx_desc)
+ self.sign_tx_with_password(tx, sign_done, password)
+
+ @protected
+ def sign_tx(self, tx, callback, password):
+ self.sign_tx_with_password(tx, callback, password)
+
+ def sign_tx_with_password(self, tx, callback, password):
+ '''Sign the transaction in a separate thread. When done, calls
+ the callback with a success code of True or False.
+ '''
+ # call hook to see if plugin needs gui interaction
+ run_hook('sign_tx', self, tx)
+
+ def on_signed(result):
+ callback(True)
+ def on_failed(exc_info):
+ self.on_error(exc_info)
+ callback(False)
+
+ if self.tx_external_keypairs:
+ task = partial(Transaction.sign, tx, self.tx_external_keypairs, use_cache=True)
+ else:
+ task = partial(self.wallet.sign_transaction, tx, password, use_cache=True)
+ WaitingDialog(self, _('Signing transaction...'), task,
+ on_signed, on_failed)
+
+ def broadcast_transaction(self, tx, tx_desc, *, callback=None):
+
+ def broadcast_thread():
+ # non-GUI thread
+ status = False
+ msg = "Failed"
+ pr = self.payment_request
+ if pr and pr.has_expired():
+ self.payment_request = None
+ return False, _("Payment request has expired")
+ if pr:
+ refund_address = self.wallet.get_receiving_addresses()[0]
+ ack_status, ack_msg = pr.send_payment(str(tx), refund_address)
+ if not ack_status:
+ if ack_msg == "no url":
+ # "no url" hard-coded in send_payment method
+ # it means merchant doesn't need the tx sent to him
+ # since he didn't specify a POST url.
+ # so we just broadcast and rely on that result status.
+ ack_msg = None
+ else:
+ return False, ack_msg
+ # at this point either ack_status is True or there is "no url"
+ # and we proceed anyway with the broadcast
+ status, msg = self.network.broadcast_transaction(tx)
+
+ # figure out what to return...
+ msg = ack_msg or msg # prefer the merchant's ack_msg over the broadcast msg, but fallback to broadcast msg if no ack_msg.
+ status = bool(ack_status or status) # if both broadcast and merchant ACK failed -- it's a failure. if either succeeded -- it's a success
+
+ if status:
+ self.invoices.set_paid(pr, tx.txid())
+ self.invoices.save()
+ self.payment_request = None
+
+ else:
+ # Not a PR, just broadcast.
+ status, msg = self.network.broadcast_transaction(tx)
+
+ return status, msg
+
+ # Check fee and warn if it's below 1.0 sats/B (and not warned already)
+ fee = None
+ try: fee = tx.get_fee()
+ except: pass # no fee info available for tx
+ # Check fee >= size otherwise warn. FIXME: If someday network relay
+ # rules change to be other than 1.0 sats/B minimum, this code needs
+ # to be changed.
+ if (isinstance(fee, int) and tx.is_complete() and fee < len(str(tx))//2
+ and not tx.ephemeral.get('warned_low_fee_already')):
+ msg = _('Warning') + ': ' + _("You're using a fee of less than 1.0 sats/B. It may take a very long time to confirm.") + "\n\n" + _("Proceed?")
+ if not self.question(msg, title = _("Low Fee")):
+ return
+ # /end fee check
+
+ # Capture current TL window; override might be removed on return
+ parent = self.top_level_window()
+
+ if self.gui_object.warn_if_no_network(self):
+ # Don't allow a useless broadcast when in offline mode. Previous to this we were getting an exception on broadcast.
+ return
+ elif not self.network.is_connected():
+ # Don't allow a potentially very slow broadcast when obviously not connected.
+ parent.show_error(_("Not connected"))
+ return
+
+ def broadcast_done(result):
+ # GUI thread
+ cb_result = False
+ if result:
+ status, msg = result
+ if status:
+ cb_result = True
+ buttons, copy_index, copy_link = [ _('Ok') ], None, ''
+ try: txid = tx.txid() # returns None if not is_complete, but may raise potentially as well
+ except: txid = None
+ if txid is not None:
+ if tx_desc is not None:
+ self.wallet.set_label(txid, tx_desc)
+ copy_link = web.BE_URL(self.config, 'tx', txid)
+ if copy_link:
+ # tx is complete and there is a copy_link
+ buttons.insert(0, _("Copy link"))
+ copy_index = 0
+ if parent.show_message(_('Payment sent.') + '\n' + msg,
+ buttons = buttons,
+ defaultButton = buttons[-1],
+ escapeButton = buttons[-1]) == copy_index:
+ # There WAS a 'Copy link' and they clicked it
+ self.copy_to_clipboard(copy_link, _("Block explorer link copied to clipboard"), self.top_level_window())
+ self.invoice_list.update()
+ self.do_clear()
+
+ else:
+ if msg.startswith("error: "):
+ msg = msg.split(" ", 1)[-1] # take the last part, sans the "error: " prefix
+ parent.show_error(msg)
+ if callback:
+ callback(cb_result)
+
+ WaitingDialog(self, _('Broadcasting transaction...'),
+ broadcast_thread, broadcast_done, self.on_error)
+
+ def query_choice(self, msg, choices, *, add_cancel_button=False):
+ # Needed by QtHandler for hardware wallets
+ dialog = WindowModalDialog(self.top_level_window())
+ clayout = ChoicesLayout(msg, choices)
+ vbox = QVBoxLayout(dialog)
+ vbox.addLayout(clayout.layout())
+ buts = [OkButton(dialog)]
+ if add_cancel_button:
+ buts.insert(0, CancelButton(dialog))
+ vbox.addLayout(Buttons(*buts))
+ result = dialog.exec_()
+ dialog.setParent(None)
+ if not result:
+ return None
+ return clayout.selected_index()
+
+ def lock_amount(self, b):
+ self.amount_e.setFrozen(b)
+ self.max_button.setEnabled(not b)
+
+ def prepare_for_payment_request(self):
+ self.show_send_tab()
+ self.payto_e.is_pr = True
+ for e in [self.payto_e, self.amount_e, self.message_e]:
+ e.setFrozen(True)
+ self.max_button.setDisabled(True)
+ self.payto_e.setText(_("please wait..."))
+ return True
+
+ def delete_invoice(self, key):
+ self.invoices.remove(key)
+ self.invoice_list.update()
+
+ def payment_request_ok(self):
+ pr = self.payment_request
+ key = self.invoices.add(pr)
+ status = self.invoices.get_status(key)
+ self.invoice_list.update()
+ if status == PR_PAID:
+ self.show_message("invoice already paid")
+ self.do_clear()
+ self.payment_request = None
+ return
+ self.payto_e.is_pr = True
+ if not pr.has_expired():
+ self.payto_e.setGreen()
+ else:
+ self.payto_e.setExpired()
+ self.payto_e.setText(pr.get_requestor())
+ self.amount_e.setText(format_satoshis_plain(pr.get_amount(), self.decimal_point))
+ self.message_e.setText(pr.get_memo())
+ # signal to set fee
+ self.amount_e.textEdited.emit("")
+
+ def payment_request_error(self):
+ request_error = (self.payment_request and self.payment_request.error) or ''
+ self.payment_request = None
+ self.print_error("PaymentRequest error:", request_error)
+ self.show_error(_("There was an error processing the payment request"), rich_text=False, detail_text=request_error)
+ self.do_clear()
+
+ def on_pr(self, request):
+ self.payment_request = request
+ if self.payment_request.verify(self.contacts):
+ self.payment_request_ok_signal.emit()
+ else:
+ self.payment_request_error_signal.emit()
+
+ def pay_to_URI(self, URI):
+ if not URI:
+ return
+ try:
+ out = web.parse_URI(URI, self.on_pr, strict=True, on_exc=self.on_error)
+ except web.ExtraParametersInURIWarning as e:
+ out = e.args[0] # out dict is in e.args[0]
+ extra_params = e.args[1:]
+ self.show_warning(ngettext('Extra parameter in URI was ignored:\n\n{extra_params}',
+ 'Extra parameters in URI were ignored:\n\n{extra_params}',
+ len(extra_params)
+ ).format(extra_params=', '.join(extra_params)))
+ # fall through ...
+ except web.BadURIParameter as e:
+ extra_info = (len(e.args) > 1 and str(e.args[1])) or ''
+ self.print_error('Bad URI Parameter:', *[repr(i) for i in e.args])
+ if extra_info:
+ extra_info = '\n\n' + extra_info # prepend newlines
+ self.show_error(_('Bad parameter: {bad_param_name}{extra_info}').format(bad_param_name=e.args[0], extra_info=extra_info))
+ return
+ except web.DuplicateKeyInURIError as e:
+ # this exception always has a translated message as args[0]
+ # plus a list of keys as args[1:], see web.parse_URI
+ self.show_error(e.args[0] + ":\n\n" + ', '.join(e.args[1:]))
+ return
+ except Exception as e:
+ self.show_error(_('Invalid bitcoincash URI:') + '\n\n' + str(e))
+ return
+ self.show_send_tab()
+ r = out.get('r')
+ sig = out.get('sig')
+ name = out.get('name')
+ if r or (name and sig):
+ self.prepare_for_payment_request()
+ return
+ address = out.get('address')
+ amount = out.get('amount')
+ label = out.get('label')
+ message = out.get('message')
+ scheme = out.get('scheme')
+ op_return = out.get('op_return')
+ op_return_raw = out.get('op_return_raw')
+
+ # use label as description (not BIP21 compliant)
+ if label and not message:
+ message = label
+ if address or URI.strip().lower().split(':', 1)[0] in web.parseable_schemes():
+ # if address, set the payto field to the address.
+ # if *not* address, then we set the payto field to the empty string
+ # only IFF it was bitcoincash: and/or cashacct:, see issue #1131.
+ self.payto_e.setText(address or '')
+ if message:
+ self.message_e.setText(message)
+ if amount:
+ self.amount_e.setAmount(amount)
+ self.amount_e.textEdited.emit("")
+ if op_return:
+ self.message_opreturn_e.setText(op_return)
+ self.message_opreturn_e.setHidden(False)
+ self.opreturn_rawhex_cb.setHidden(False)
+ self.opreturn_rawhex_cb.setChecked(False)
+ self.opreturn_label.setHidden(False)
+ elif op_return_raw is not None:
+ # 'is not None' allows blank value.
+ # op_return_raw is secondary precedence to op_return
+ if not op_return_raw:
+ op_return_raw='empty'
+ self.message_opreturn_e.setText(op_return_raw)
+ self.message_opreturn_e.setHidden(False)
+ self.opreturn_rawhex_cb.setHidden(False)
+ self.opreturn_rawhex_cb.setChecked(True)
+ self.opreturn_label.setHidden(False)
+ elif not self.config.get('enable_opreturn'):
+ self.message_opreturn_e.setText('')
+ self.message_opreturn_e.setHidden(True)
+ self.opreturn_rawhex_cb.setHidden(True)
+ self.opreturn_label.setHidden(True)
+
+ if address and URI.lower().startswith(cashacct.URI_SCHEME + ':'):
+ # this is important so that cashacct: URIs get insta-resolved
+ # (they only get resolved when payto_e loses focus)
+ self.message_e.setFocus()
+
+ # Ensure the checksum for the RPA address is correct.
+ paycode_checksum_ok = True
+ if scheme == networks.net.RPA_PREFIX and not self.wallet.is_multisig():
+ try:
+ rpa.addr.decode(networks.net.RPA_PREFIX + ":" + address)
+ except:
+ paycode_checksum_ok = False
+
+ if scheme == "paycode" and paycode_checksum_ok and not self.wallet.is_multisig():
+ self.payto_e.setIsPaycode(True)
+ self.payto_e.setText("<" + networks.net.RPA_PREFIX + ":" + address + ">")
+ self.payto_e.setGreen()
+ self.payto_e.setReadOnly(True)
+ else:
+ self.payto_e.setIsPaycode(False)
+
+ def do_clear(self):
+ ''' Clears the send tab, reseting its UI state to its initiatial state.'''
+ self.max_button.setChecked(False)
+ self.not_enough_funds = False
+ self.op_return_toolong = False
+ self.payment_request = None
+ self.payto_e.is_pr = False
+ self.payto_e.setIsPaycode(False)
+ self.payto_e.is_alias, self.payto_e.validated = False, False # clear flags to avoid bad things
+ for e in [self.payto_e, self.message_e, self.amount_e, self.fiat_send_e, self.fee_e, self.message_opreturn_e]:
+ e.setText('')
+ e.setFrozen(False)
+ self.payto_e.setHidden(False)
+ self.payto_label.setHidden(False)
+ self.max_button.setDisabled(False)
+ self.opreturn_rawhex_cb.setChecked(False)
+ self.opreturn_rawhex_cb.setDisabled(False)
+ self.set_pay_from([])
+ self.tx_external_keypairs = {}
+ self.message_opreturn_e.setVisible(self.config.get('enable_opreturn', False))
+ self.opreturn_rawhex_cb.setVisible(self.config.get('enable_opreturn', False))
+ self.opreturn_label.setVisible(self.config.get('enable_opreturn', False))
+ self.update_status()
+ run_hook('do_clear', self)
+
+ def set_frozen_state(self, addrs, freeze):
+ self.wallet.set_frozen_state(addrs, freeze)
+ self.address_list.update()
+ self.utxo_list.update()
+ self.token_list.update()
+ self.update_fee()
+
+ def set_frozen_coin_state(self, utxos, freeze):
+ self.wallet.set_frozen_coin_state(utxos, freeze)
+ self.utxo_list.update()
+ self.token_list.update()
+ self.update_fee()
+
+ def create_converter_tab(self):
+
+ source_address = QLineEdit()
+ cash_address = ButtonsLineEdit()
+ cash_address.addCopyButton()
+ cash_address.setReadOnly(True)
+ legacy_address = ButtonsLineEdit()
+ legacy_address.addCopyButton()
+ legacy_address.setReadOnly(True)
+ token_address = ButtonsLineEdit()
+ token_address.addCopyButton()
+ token_address.setReadOnly(True)
+
+ widgets = [
+ (cash_address, Address.FMT_CASHADDR),
+ (legacy_address, Address.FMT_LEGACY),
+ (token_address, Address.FMT_TOKEN)
+ ]
+
+ def convert_address():
+ try:
+ addr = Address.from_string(source_address.text().strip())
+ except:
+ addr = None
+ for widget, fmt in widgets:
+ if addr:
+ text = addr.to_full_string(fmt)
+ widget.setText(text)
+ else:
+ widget.setText('')
+
+ source_address.textChanged.connect(convert_address)
+
+ w = QWidget()
+ grid = QGridLayout()
+ grid.setSpacing(15)
+ grid.setColumnStretch(1, 2)
+ grid.setColumnStretch(2, 1)
+
+ label = QLabel(_('&Address to convert'))
+ label.setBuddy(source_address)
+ grid.addWidget(label, 0, 0)
+ grid.addWidget(source_address, 0, 1)
+
+ label = QLabel(_('&Cash address'))
+ label.setBuddy(cash_address)
+ grid.addWidget(label, 1, 0)
+ grid.addWidget(cash_address, 1, 1)
+
+ label = QLabel(_('&Legacy address'))
+ label.setBuddy(legacy_address)
+ grid.addWidget(label, 2, 0)
+ grid.addWidget(legacy_address, 2, 1)
+
+ label = QLabel(_('&Token address'))
+ label.setBuddy(token_address)
+ grid.addWidget(label, 3, 0)
+ grid.addWidget(token_address, 3, 1)
+
+ w.setLayout(grid)
+
+ label = WWLabel(_(
+ "Address Converter
"
+ "This tool helps convert between address formats for Bitcoin Cash addresses.
"
+ "You are encouraged to use the Cash address format for BCH.
"
+ "The Token address format is for receiving CashTokens."
+ ))
+
+ vbox = QVBoxLayout()
+ vbox.addWidget(label)
+ vbox.addWidget(w)
+ vbox.addStretch(1)
+
+ w = QWidget()
+ w.setLayout(vbox)
+
+ return w
+
+ def create_list_tab(self, l, list_header=None):
+ w = QWidget()
+ w.searchable_list = l
+ vbox = QVBoxLayout()
+ w.setLayout(vbox)
+ vbox.setContentsMargins(0, 0, 0, 0)
+ vbox.setSpacing(0)
+ if list_header:
+ hbox = QHBoxLayout()
+ for b in list_header:
+ hbox.addWidget(b)
+ hbox.addStretch()
+ vbox.addLayout(hbox)
+ vbox.addWidget(l)
+ return w
+
+ def create_addresses_tab(self):
+ from .address_list import AddressList
+ self.address_list = l = AddressList(self)
+ return self.create_list_tab(l)
+
+ def create_utxo_tab(self):
+ from .utxo_list import UTXOList
+ self.utxo_list = l = UTXOList(self)
+ return self.create_list_tab(l)
+
+ def create_token_tab(self):
+ from .token_list import TokenList
+ self.token_list = TokenList(self)
+ return self.create_list_tab(self.token_list)
+
+ def create_contacts_tab(self):
+ from .contact_list import ContactList
+ self.contact_list = l = ContactList(self)
+ return self.create_list_tab(l)
+
+ def remove_address(self, addr):
+ if self.question(_("Do you want to remove {} from your wallet?"
+ .format(addr.to_ui_string()))):
+ self.wallet.delete_address(addr)
+ self.update_tabs()
+ self.update_status()
+ self.clear_receive_tab()
+
+ def get_coins(self, isInvoice = False):
+ coins = []
+ if self.pay_from:
+ coins = copy.deepcopy(self.pay_from)
+ else:
+ coins = self.wallet.get_spendable_coins(None, self.config, isInvoice)
+ run_hook("spendable_coin_filter", self, coins) # may modify coins -- used by CashShuffle if in shuffle = ENABLED mode.
+ if self.pay_from:
+ # coins may have been filtered, so indicate this in the UI
+ self.redraw_from_list(spendable=coins)
+ return coins
+
+ def spend_coins(self, coins):
+ self.set_pay_from(coins)
+ self.show_send_tab()
+ run_hook('on_spend_coins', self, coins) # CashShuffle: will set the mode of send tab to coins[0]'s shuffled/unshuffled state
+ self.update_fee()
+
+ def paytomany(self):
+ self.show_send_tab()
+ self.do_clear()
+ self.payto_e.paytomany()
+ msg = '\n'.join([
+ _('Enter a list of outputs in the \'Pay to\' field.'),
+ _('One output per line.'),
+ _('Format: address, amount'),
+ _('You may load a CSV file using the file icon.')
+ ])
+ self.show_message(msg, title=_('Pay to many'))
+
+ def payto_contacts(self, contacts : List[Contact]):
+ paytos = []
+ for contact in contacts:
+ s = self.get_contact_payto(contact)
+ if s is not None: paytos.append(s)
+ self.payto_payees(paytos)
+
+ def payto_payees(self, payees : List[str]):
+ ''' Like payto_contacts except it accepts a list of free-form strings
+ rather than requiring a list of Contacts objects '''
+ self.show_send_tab()
+ if len(payees) == 1:
+ self.payto_e.setText(payees[0])
+ self.amount_e.setFocus()
+ else:
+ text = "\n".join([payee + ", 0" for payee in payees])
+ self.payto_e.setText(text)
+ self.payto_e.setFocus()
+
+ def resolve_cashacct(self, name):
+ ''' Throws up a WaitingDialog while it resolves a Cash Account.
+
+ Goes out to network, verifies all tx's.
+
+ Returns: a tuple of: (Info, Minimally_Encoded_Formatted_AccountName)
+
+ Argument `name` should be a Cash Account name string of the form:
+
+ name#number.123
+ name#number
+ name#number.; etc
+
+ If the result would be ambigious, that is considered an error, so enough
+ of the account name#number.collision_hash needs to be specified to
+ unambiguously resolve the Cash Account.
+
+ On failure throws up an error window and returns None.'''
+ return cashacctqt.resolve_cashacct(self, name)
+
+ def set_contact(self, label, address, typ='address', replace=None, *, resolved=None) -> Optional[Contact]:
+ ''' Returns a reference to the newly inserted Contact object.
+ replace is optional and if specified, replace an existing contact,
+ otherwise add a new one.
+
+ Note that duplicate contacts will not be added multiple times, but in
+ that case the returned value would still be a valid Contact.
+
+ Returns None on failure.'''
+ assert typ in ('address', 'cashacct')
+ contact = None
+ if typ == 'cashacct':
+ tup = self.resolve_cashacct(label) # this displays an error message for us
+ if not tup:
+ self.contact_list.update() # Displays original
+ return
+ info, label = tup
+ address = info.address.to_ui_string()
+ contact = Contact(name=label, address=address, type=typ)
+ elif not Address.is_valid(address):
+ # Bad 'address' code path
+ self.show_error(_('Invalid Address'))
+ self.contact_list.update() # Displays original unchanged value
+ return
+ else:
+ # Good 'address' code path...
+ contact = Contact(name=label, address=address, type=typ)
+ assert contact
+ if replace != contact:
+ if self.contacts.has(contact):
+ self.show_error(_("A contact named {contact_name} with the same address and type already exists.")
+ .format(contact_name=contact.name))
+ self.contact_list.update()
+ return replace or contact
+ self.contacts.add(contact, replace_old=replace, unique=True)
+ self.contact_list.update()
+ self.history_list.update()
+ self.history_updated_signal.emit() # inform things like address_dialog that there's a new history
+ self.update_completions()
+
+ # The contact has changed, update any addresses that are displayed with the old information.
+ run_hook('update_contact2', contact, replace)
+ return contact
+
+ def delete_contacts(self, contacts):
+ n = len(contacts)
+ qtext = ''
+ if n <= 3:
+ def fmt(contact):
+ if len(contact.address) > 20:
+ addy = contact.address[:10] + '…' + contact.address[-10:]
+ else:
+ addy = contact.address
+ return f"{contact.name} <{addy}>"
+ names = [fmt(contact) for contact in contacts]
+ contact_str = ", ".join(names)
+ qtext = _("Remove {list_of_contacts} from your contact list?").format(list_of_contacts = contact_str)
+ else:
+ # Note: we didn't use ngettext here for plural check because n > 1 in this branch
+ qtext = _("Remove {number_of_contacts} contacts from your contact list?").format(number_of_contacts=n)
+ if not self.question(qtext):
+ return
+ removed_entries = []
+ for contact in contacts:
+ if self.contacts.remove(contact):
+ removed_entries.append(contact)
+
+ self.history_list.update()
+ self.history_updated_signal.emit() # inform things like address_dialog that there's a new history
+ self.contact_list.update()
+ self.update_completions()
+
+ run_hook('delete_contacts2', removed_entries)
+
+ def show_invoice(self, key):
+ pr = self.invoices.get(key)
+ pr.verify(self.contacts)
+ self.show_pr_details(pr)
+
+ def show_pr_details(self, pr):
+ key = pr.get_id()
+ d = WindowModalDialog(self.top_level_window(), _("Invoice"))
+ vbox = QVBoxLayout(d)
+ grid = QGridLayout()
+ grid.addWidget(QLabel(_("Requestor") + ':'), 0, 0)
+ grid.addWidget(QLabel(pr.get_requestor()), 0, 1)
+ grid.addWidget(QLabel(_("Amount") + ':'), 1, 0)
+ outputs_str = '\n'.join(map(lambda x: self.format_amount(x[2])+ self.base_unit() + ' @ ' + x[1].to_ui_string(), pr.get_outputs()))
+ grid.addWidget(QLabel(outputs_str), 1, 1)
+ expires = pr.get_expiration_date()
+ grid.addWidget(QLabel(_("Memo") + ':'), 2, 0)
+ grid.addWidget(QLabel(pr.get_memo()), 2, 1)
+ grid.addWidget(QLabel(_("Signature") + ':'), 3, 0)
+ grid.addWidget(QLabel(pr.get_verify_status()), 3, 1)
+ if expires:
+ grid.addWidget(QLabel(_("Expires") + ':'), 4, 0)
+ grid.addWidget(QLabel(format_time(expires)), 4, 1)
+ vbox.addLayout(grid)
+ weakD = Weak.ref(d)
+ def do_export():
+ ext = pr.export_file_ext()
+ fn = self.getSaveFileName(_("Save invoice to file"), "*." + ext)
+ if not fn:
+ return
+ with open(fn, 'wb') as f:
+ data = f.write(pr.export_file_data())
+ self.show_message(_('Invoice saved as' + ' ' + fn))
+ exportButton = EnterButton(_('Save'), do_export)
+ def do_delete():
+ if self.question(_('Delete invoice?')):
+ self.invoices.remove(key)
+ self.history_list.update()
+ self.history_updated_signal.emit() # inform things like address_dialog that there's a new history
+ self.invoice_list.update()
+ d = weakD()
+ if d: d.close()
+ deleteButton = EnterButton(_('Delete'), do_delete)
+ vbox.addLayout(Buttons(exportButton, deleteButton, CloseButton(d)))
+ d.exec_()
+ d.setParent(None) # So Python can GC
+
+ def do_pay_invoice(self, key):
+ pr = self.invoices.get(key)
+ self.payment_request = pr
+ self.prepare_for_payment_request()
+ pr.error = None # this forces verify() to re-run
+ if pr.verify(self.contacts):
+ self.payment_request_ok()
+ else:
+ self.payment_request_error()
+
+ def create_console_tab(self):
+ from .console import Console
+ self.console = console = Console(wallet=self.wallet)
+ return console
+
+ def update_console(self):
+ console = self.console
+ console.history = self.config.get("console-history",[])
+ console.history_index = len(console.history)
+
+ console.updateNamespace({'wallet' : self.wallet,
+ 'network' : self.network,
+ 'plugins' : self.gui_object.plugins,
+ 'window': self})
+ console.updateNamespace({'util' : util, 'bitcoin':bitcoin})
+
+ set_json = Weak(self.console.set_json)
+ c = commands.Commands(self.config, self.wallet, self.network, self.gui_object.daemon, lambda: set_json(True))
+ methods = {}
+ password_getter = Weak(self.password_dialog)
+ def mkfunc(f, method):
+ return lambda *args, **kwargs: f(method, *args, password_getter=password_getter,
+ **kwargs)
+ for m in dir(c):
+ if m[0]=='_' or m in ['network','wallet','config']: continue
+ methods[m] = mkfunc(c._run, m)
+
+ console.updateNamespace(methods)
+
+
+ def create_status_bar(self):
+
+ sb = QStatusBar()
+ sb.setFixedHeight(35)
+ qtVersion = qVersion()
+
+ self.balance_label = QLabel("")
+ sb.addWidget(self.balance_label)
+
+ self._search_box_spacer = QWidget()
+ self._search_box_spacer.setFixedWidth(6) # 6 px spacer
+ self.search_box = QLineEdit()
+ self.search_box.setPlaceholderText(_("Search wallet, {key}F to hide").format(key='Ctrl+' if sys.platform != 'darwin' else '⌘'))
+ self.search_box.textChanged.connect(self.do_search)
+ self.search_box.hide()
+ sb.addPermanentWidget(self.search_box, 1)
+
+ self.update_available_button = StatusBarButton(QIcon(":icons/electron-cash-update.svg"), _("Update available, click for details"), lambda: self.gui_object.show_update_checker(self, skip_check=True))
+ self.update_available_button.setStatusTip(_("An Electron Cash update is available"))
+ sb.addPermanentWidget(self.update_available_button)
+ self.update_available_button.setVisible(bool(self.gui_object.new_version_available)) # if hidden now gets unhidden by on_update_available when a new version comes in
+
+ self.lock_icon = QIcon()
+ self.password_button = StatusBarButton(self.lock_icon, _("Password"), self.change_password_dialog)
+ sb.addPermanentWidget(self.password_button)
+
+ self.addr_converter_button = StatusBarButton(
+ self.cashaddr_icon(),
+ _("Toggle CashAddr Display"),
+ self.toggle_cashaddr_status_bar
+ )
+ self.update_cashaddr_icon()
+ sb.addPermanentWidget(self.addr_converter_button)
+ self.addr_converter_button.setHidden(self.gui_object.is_cashaddr_status_button_hidden())
+ self.gui_object.cashaddr_status_button_hidden_signal.connect(self.addr_converter_button.setHidden)
+
+ q_icon_prefs = QIcon(":icons/preferences.svg"), _("Preferences"), self.settings_dialog
+ sb.addPermanentWidget(StatusBarButton(*q_icon_prefs))
+ q_icon_seed = QIcon(":icons/seed.png"), _("Seed"), self.show_seed_dialog
+ self.seed_button = StatusBarButton(*q_icon_seed)
+ sb.addPermanentWidget(self.seed_button)
+ weakSelf = Weak.ref(self)
+ gui_object = self.gui_object
+ self.status_button = StatusBarButton(QIcon(":icons/status_disconnected.svg"), _("Network"), lambda: gui_object.show_network_dialog(weakSelf()))
+ sb.addPermanentWidget(self.status_button)
+ run_hook('create_status_bar', sb)
+ self.setStatusBar(sb)
+
+ def on_update_available(self, b):
+ self.update_available_button.setVisible(bool(b))
+
+ # The popup label won't really be shown unless this window is
+ # on top.. but regardless we give each label a unique internal name
+ # so they dont interfere with each other.
+ lblName = "UpdateAvailable_" + self.diagnostic_name()
+
+ if b:
+ ShowPopupLabel(name = lblName,
+ text="{}
{}".format(_("Update Available"),_("Click for details")),
+ target=self.update_available_button,
+ timeout=20000, onClick=self.update_available_button.click,
+ onRightClick=self.update_available_button.click,
+ dark_mode = ColorScheme.dark_scheme)
+ else:
+ # Immediately kills any extant labels
+ KillPopupLabel(lblName)
+
+ def update_lock_icon(self):
+ icon = QIcon(":icons/lock.svg") if self.wallet.has_password() else QIcon(":icons/unlock.svg")
+ tip = _('Wallet Password') + ' - '
+ tip += _('Enabled') if self.wallet.has_password() else _('Disabled')
+ self.password_button.setIcon(icon)
+ self.password_button.setStatusTip(tip)
+
+ def update_buttons_on_seed(self):
+ self.seed_button.setVisible(self.wallet.has_seed())
+ self.password_button.setVisible(self.wallet.can_change_password())
+ self.send_button.setVisible(not self.wallet.is_watching_only())
+ self.preview_button.setVisible(True)
+
+ def change_password_dialog(self):
+ from .password_dialog import ChangePasswordDialog
+ d = ChangePasswordDialog(self.top_level_window(), self.wallet)
+ ok, password, new_password, encrypt_file = d.run()
+ if not ok:
+ return
+ try:
+ self.wallet.update_password(password, new_password, encrypt_file)
+ self.gui_object.cache_password(self.wallet, None) # clear password cache when user changes it, just in case
+ run_hook("on_new_password", self, password, new_password)
+ except BaseException as e:
+ self.show_error(str(e))
+ return
+ except:
+ if util.is_verbose:
+ traceback.print_exc(file=sys.stderr)
+ self.show_error(_('Failed to update password'))
+ return
+ msg = _('Password was updated successfully') if new_password else _('Password is disabled, this wallet is not protected')
+ self.show_message(msg, title=_("Success"))
+ self.update_lock_icon()
+
+ def get_passphrase_dialog(self, msg : str, title : str = None, *, permit_empty = False) -> str:
+ from .password_dialog import PassphraseDialog
+ d = PassphraseDialog(self.wallet, self.top_level_window(), msg, title, permit_empty = permit_empty)
+ return d.run()
+
+ def toggle_search(self):
+ self.search_box.setHidden(not self.search_box.isHidden())
+ if not self.search_box.isHidden():
+ self.balance_label.setHidden(True)
+ self.statusBar().insertWidget(0, self._search_box_spacer)
+ self._search_box_spacer.show()
+ self.search_box.setFocus(1)
+ if self.search_box.text():
+ self.do_search(self.search_box.text())
+ else:
+ self._search_box_spacer.hide()
+ self.statusBar().removeWidget(self._search_box_spacer)
+ self.balance_label.setHidden(False)
+ self.do_search('')
+
+ def do_search(self, t):
+ '''Apply search text to all tabs. FIXME: if a plugin later is loaded
+ it will not receive the search filter -- but most plugins I know about
+ do not support searchable_list anyway, so hopefully it's a non-issue.'''
+ for i in range(self.tabs.count()):
+ tab = self.tabs.widget(i)
+ try:
+ tab.searchable_list.filter(t)
+ except (AttributeError, TypeError):
+ pass
+
+ def new_contact_dialog(self):
+ d = WindowModalDialog(self.top_level_window(), _("New Contact"))
+ vbox = QVBoxLayout(d)
+ vbox.addWidget(QLabel(_('New Contact') + ':'))
+ grid = QGridLayout()
+ line1 = QLineEdit()
+ line1.setFixedWidth(350)
+ line2 = QLineEdit()
+ line2.setFixedWidth(350)
+ grid.addWidget(QLabel(_("Name")), 1, 0)
+ grid.addWidget(line1, 1, 1)
+ grid.addWidget(QLabel(_("Address")), 2, 0)
+ grid.addWidget(line2, 2, 1)
+ vbox.addLayout(grid)
+ vbox.addLayout(Buttons(CancelButton(d), OkButton(d)))
+ if d.exec_():
+ name = line1.text().strip()
+ address = line2.text().strip()
+ prefix = networks.net.CASHADDR_PREFIX.lower() + ':'
+ if address.lower().startswith(prefix):
+ address = address[len(prefix):]
+ self.set_contact(name, address)
+
+ def lookup_cash_account_dialog(self):
+ blurb = "
" + _('Enter a string of the form name#number')
+ cashacctqt.lookup_cash_account_dialog(self, self.wallet, blurb=blurb,
+ add_to_contacts_button = True, pay_to_button = True)
+
+ def show_master_public_keys(self):
+ dialog = WindowModalDialog(self.top_level_window(), _("Wallet Information"))
+ dialog.setMinimumSize(500, 100)
+ mpk_list = self.wallet.get_master_public_keys()
+ vbox = QVBoxLayout()
+ wallet_type = self.wallet.storage.get('wallet_type', '')
+ grid = QGridLayout()
+ basename = os.path.basename(self.wallet.storage.path)
+ grid.addWidget(QLabel(_("Wallet name")+ ':'), 0, 0)
+ grid.addWidget(QLabel(basename), 0, 1)
+ grid.addWidget(QLabel(_("Wallet type")+ ':'), 1, 0)
+ grid.addWidget(QLabel(wallet_type), 1, 1)
+ grid.addWidget(QLabel(_("Script type")+ ':'), 2, 0)
+ grid.addWidget(QLabel(self.wallet.txin_type), 2, 1)
+ vbox.addLayout(grid)
+ if self.wallet.is_deterministic():
+ mpk_text = ShowQRTextEdit()
+ mpk_text.setMaximumHeight(150)
+ mpk_text.addCopyButton()
+ def show_mpk(index):
+ mpk_text.setText(mpk_list[index])
+ # only show the combobox in case multiple accounts are available
+ if len(mpk_list) > 1:
+ def label(key):
+ if isinstance(self.wallet, Multisig_Wallet):
+ return _("cosigner") + ' ' + str(key+1)
+ return ''
+ labels = [label(i) for i in range(len(mpk_list))]
+ on_click = lambda clayout: show_mpk(clayout.selected_index())
+ labels_clayout = ChoicesLayout(_("Master Public Keys"), labels, on_click)
+ vbox.addLayout(labels_clayout.layout())
+ else:
+ vbox.addWidget(QLabel(_("Master Public Key")))
+ show_mpk(0)
+ vbox.addWidget(mpk_text)
+ vbox.addStretch(1)
+ vbox.addLayout(Buttons(CloseButton(dialog)))
+ dialog.setLayout(vbox)
+ dialog.exec_()
+
+ def remove_wallet(self):
+ if self.question('\n'.join([
+ _('Delete wallet file?'),
+ "%s"%self.wallet.storage.path,
+ _('If your wallet contains funds, make sure you have saved its seed.')])):
+ self._delete_wallet()
+
+ @protected
+ def _delete_wallet(self, password):
+ wallet_path = self.wallet.storage.path
+ basename = os.path.basename(wallet_path)
+ r = self.gui_object.daemon.delete_wallet(wallet_path) # implicitly also calls stop_wallet
+ self.update_recently_visited(wallet_path) # this ensures it's deleted from the menu
+ if r:
+ self.show_error(_("Wallet removed: {}").format(basename))
+ else:
+ self.show_error(_("Wallet file not found: {}").format(basename))
+ self.close()
+
+ @protected
+ def show_seed_dialog(self, password):
+ if not self.wallet.has_seed():
+ self.show_message(_('This wallet has no seed'))
+ return
+ if self.wallet.wallet_type == 'rpa':
+ keystore = self.wallet.get_keystore_rpa_aux()
+ else:
+ keystore = self.wallet.get_keystore()
+ try:
+ seed = keystore.get_seed(password)
+ passphrase = keystore.get_passphrase(password) # may be None or ''
+ derivation = keystore.has_derivation() and keystore.derivation # may be None or ''
+ seed_type = getattr(keystore, 'seed_type', '')
+ if derivation == 'm/' and seed_type in ['electrum', 'standard']:
+ derivation = None # suppress Electrum seed 'm/' derivation from UI
+ except BaseException as e:
+ self.show_error(str(e))
+ return
+ from .seed_dialog import SeedDialog
+ d = SeedDialog(self.top_level_window(), seed, passphrase, derivation, seed_type)
+ d.exec_()
+
+ def show_qrcode(self, data, title = _("QR code"), parent=None):
+ if not data:
+ return
+ d = QRDialog(data, parent or self, title)
+ d.exec_()
+ d.setParent(None) # Help Python GC this sooner rather than later
+
+ @protected
+ def show_private_key(self, address, password):
+ if not address:
+ return
+ try:
+ pk = self.wallet.export_private_key(address, password)
+ except Exception as e:
+ if util.is_verbose:
+ traceback.print_exc(file=sys.stderr)
+ self.show_message(str(e))
+ return
+ xtype = bitcoin.deserialize_privkey(pk)[0]
+ d = WindowModalDialog(self.top_level_window(), _("Private key"))
+ d.setMinimumSize(600, 150)
+ vbox = QVBoxLayout()
+ vbox.addWidget(QLabel('{}: {}'.format(_("Address"), address)))
+ vbox.addWidget(QLabel(_("Script type") + ': ' + xtype))
+ pk_lbl = QLabel(_("Private key") + ':')
+ vbox.addWidget(pk_lbl)
+ keys_e = ShowQRTextEdit(text=pk)
+ keys_e.addCopyButton()
+ # BIP38 Encrypt Button
+ def setup_encrypt_button():
+ encrypt_but = QPushButton(_("Encrypt BIP38") + "...")
+ f = encrypt_but.font(); f.setPointSize(f.pointSize()-1); encrypt_but.setFont(f) # make font -= 1
+ encrypt_but.setEnabled(bool(bitcoin.Bip38Key.canEncrypt()))
+ encrypt_but.setToolTip(_("Encrypt this private key using BIP38 encryption")
+ if encrypt_but.isEnabled() else
+ _("BIP38 encryption unavailable: install pycryptodomex to enable"))
+ border_color = ColorScheme.DEFAULT.as_color(False)
+ border_color.setAlphaF(0.65)
+ encrypt_but_ss_en = (
+ keys_e.styleSheet() + (("QPushButton { border: 1px solid %s; border-radius: 6px; padding: 2px; margin: 2px; } "
+ "QPushButton:hover { border: 1px solid #3daee9; } "
+ "QPushButton:disabled { border: 1px solid transparent; ") % (border_color.name(QColor.HexArgb)))
+ )
+ encrypt_but_ss_dis = ( keys_e.styleSheet() )
+ encrypt_but.setStyleSheet(encrypt_but_ss_en if encrypt_but.isEnabled() else encrypt_but_ss_dis)
+ def on_encrypt():
+ passphrase = self.get_passphrase_dialog(
+ msg = (
+ _("Specify a passphrase to use for BIP38 encryption.") + "\n" +
+ _("Save this passphrase if you save the generated key so you may decrypt it later.")
+ )
+ )
+ if not passphrase:
+ return
+ try:
+ bip38 = str(bitcoin.Bip38Key.encrypt(pk, passphrase))
+ keys_e.setText(bip38)
+ encrypt_but.setEnabled(False)
+ encrypt_but.setStyleSheet(encrypt_but_ss_dis)
+ pk_lbl.setText( _("BIP38 Key") + ":" )
+ self.show_message(_("WIF key has been encrypted using BIP38.\n\n"
+ "You may save this encrypted key to a file or print out its QR code and/or text.\n\n"
+ "It is strongly encrypted with the passphrase you specified and safe to store electronically. "
+ "However, the passphrase should be stored securely and not shared with anyone."))
+ except Exception as e:
+ if util.is_verbose:
+ traceback.print_exc(file=sys.stderr)
+ self.show_error(str(e))
+ encrypt_but.clicked.connect(on_encrypt)
+ keys_e.addWidget(encrypt_but, 0)
+ setup_encrypt_button()
+ # /BIP38 Encrypt Button
+ vbox.addWidget(keys_e)
+ vbox.addWidget(QLabel(_("Redeem Script") + ':'))
+ rds_e = ShowQRTextEdit(text=address.to_script().hex())
+ rds_e.addCopyButton()
+ vbox.addWidget(rds_e)
+ vbox.addLayout(Buttons(CloseButton(d)))
+ d.setLayout(vbox)
+
+ d.exec_()
+
+ @protected
+ def do_sign(self, address, message, signature, password):
+ address = address.text().strip()
+ message = message.toPlainText().strip()
+ try:
+ addr = Address.from_string(address)
+ except:
+ self.show_message(_('Invalid Bitcoin Cash address.'))
+ return
+ if addr.kind != addr.ADDR_P2PKH:
+ msg_sign = ( _("Signing with an address actually means signing with the corresponding "
+ "private key, and verifying with the corresponding public key. The "
+ "address you have entered does not have a unique public key, so these "
+ "operations cannot be performed.") + '\n\n' +
+ _('The operation is undefined. Not just in Electron Cash, but in general.') )
+ self.show_message(_('Cannot sign messages with this type of address.') + '\n\n' + msg_sign)
+ return
+ if self.wallet.is_watching_only():
+ self.show_message(_('This is a watching-only wallet.'))
+ return
+ if not self.wallet.is_mine(addr):
+ self.show_message(_('Address not in wallet.'))
+ return
+ task = partial(self.wallet.sign_message, addr, message, password)
+
+ def show_signed_message(sig):
+ signature.setText(base64.b64encode(sig).decode('ascii'))
+ self.wallet.thread.add(task, on_success=show_signed_message)
+
+ def do_verify(self, address, message, signature):
+ try:
+ address = Address.from_string(address.text().strip())
+ except:
+ self.show_message(_('Invalid Bitcoin Cash address.'))
+ return
+ message = message.toPlainText().strip().encode('utf-8')
+ try:
+ # This can throw on invalid base64
+ sig = base64.b64decode(signature.toPlainText())
+ verified = bitcoin.verify_message(address, sig, message)
+ except:
+ verified = False
+
+ if verified:
+ self.show_message(_("Signature verified"))
+ else:
+ self.show_error(_("Wrong signature"))
+
+ def sign_verify_message(self, address=None):
+ d = WindowModalDialog(self.top_level_window(), _('Sign/verify Message'))
+ d.setMinimumSize(610, 290)
+
+ layout = QGridLayout(d)
+
+ message_e = QTextEdit()
+ message_e.setAcceptRichText(False)
+ layout.addWidget(QLabel(_('Message')), 1, 0)
+ layout.addWidget(message_e, 1, 1)
+ layout.setRowStretch(2,3)
+
+ address_e = QLineEdit()
+ address_e.setText(address.to_ui_string() if address else '')
+ layout.addWidget(QLabel(_('Address')), 2, 0)
+ layout.addWidget(address_e, 2, 1)
+
+ signature_e = QTextEdit()
+ signature_e.setAcceptRichText(False)
+ layout.addWidget(QLabel(_('Signature')), 3, 0)
+ layout.addWidget(signature_e, 3, 1)
+ layout.setRowStretch(3,1)
+
+ hbox = QHBoxLayout()
+
+ b = QPushButton(_("Sign"))
+ b.clicked.connect(lambda: self.do_sign(address_e, message_e, signature_e))
+ hbox.addWidget(b)
+
+ b = QPushButton(_("Verify"))
+ b.clicked.connect(lambda: self.do_verify(address_e, message_e, signature_e))
+ hbox.addWidget(b)
+
+ b = QPushButton(_("Close"))
+ b.clicked.connect(d.accept)
+ hbox.addWidget(b)
+ layout.addLayout(hbox, 4, 1)
+ d.exec_()
+
+ @protected
+ def do_decrypt(self, message_e, pubkey_e, encrypted_e, password):
+ if self.wallet.is_watching_only():
+ self.show_message(_('This is a watching-only wallet.'))
+ return
+ cyphertext = encrypted_e.toPlainText()
+ task = partial(self.wallet.decrypt_message, pubkey_e.text(), cyphertext, password)
+ self.wallet.thread.add(task, on_success=lambda text: message_e.setText(text.decode('utf-8')))
+
+ def do_encrypt(self, message_e, pubkey_e, encrypted_e):
+ message = message_e.toPlainText()
+ message = message.encode('utf-8')
+ try:
+ encrypted = bitcoin.encrypt_message(message, pubkey_e.text())
+ encrypted_e.setText(encrypted.decode('ascii'))
+ except BaseException as e:
+ if util.is_verbose:
+ traceback.print_exc(file=sys.stderr)
+ self.show_warning(str(e))
+
+ def encrypt_message(self, address=None):
+ d = WindowModalDialog(self.top_level_window(), _('Encrypt/decrypt Message'))
+ d.setMinimumSize(610, 490)
+
+ layout = QGridLayout(d)
+
+ message_e = QTextEdit()
+ message_e.setAcceptRichText(False)
+ layout.addWidget(QLabel(_('Message')), 1, 0)
+ layout.addWidget(message_e, 1, 1)
+ layout.setRowStretch(2,3)
+
+ pubkey_e = QLineEdit()
+ if address:
+ pubkey = self.wallet.get_public_key(address)
+ if not isinstance(pubkey, str):
+ pubkey = pubkey.to_ui_string()
+ pubkey_e.setText(pubkey)
+ layout.addWidget(QLabel(_('Public key')), 2, 0)
+ layout.addWidget(pubkey_e, 2, 1)
+
+ encrypted_e = QTextEdit()
+ encrypted_e.setAcceptRichText(False)
+ layout.addWidget(QLabel(_('Encrypted')), 3, 0)
+ layout.addWidget(encrypted_e, 3, 1)
+ layout.setRowStretch(3,1)
+
+ hbox = QHBoxLayout()
+ b = QPushButton(_("Encrypt"))
+ b.clicked.connect(lambda: self.do_encrypt(message_e, pubkey_e, encrypted_e))
+ hbox.addWidget(b)
+
+ b = QPushButton(_("Decrypt"))
+ b.clicked.connect(lambda: self.do_decrypt(message_e, pubkey_e, encrypted_e))
+ hbox.addWidget(b)
+
+ b = QPushButton(_("Close"))
+ b.clicked.connect(d.accept)
+ hbox.addWidget(b)
+
+ layout.addLayout(hbox, 4, 1)
+ d.exec_()
+
+ def password_dialog(self, msg=None, parent=None):
+ from .password_dialog import PasswordDialog
+ parent = parent or self
+ return PasswordDialog(parent, msg).run()
+
+ def tx_from_text(self, txt):
+ from electroncash.transaction import tx_from_str
+ try:
+ txt_tx = tx_from_str(txt)
+ tx = Transaction(txt_tx, sign_schnorr=self.wallet.is_schnorr_enabled())
+ tx.deserialize()
+ if self.wallet:
+ my_coins = self.wallet.get_spendable_coins(None, self.config)
+ my_outpoints = [vin['prevout_hash'] + ':' + str(vin['prevout_n']) for vin in my_coins]
+ for i, txin in enumerate(tx.inputs()):
+ outpoint = txin['prevout_hash'] + ':' + str(txin['prevout_n'])
+ if outpoint in my_outpoints:
+ my_index = my_outpoints.index(outpoint)
+ tx._inputs[i]['value'] = my_coins[my_index]['value']
+ return tx
+ except:
+ if util.is_verbose:
+ traceback.print_exc(file=sys.stderr)
+ self.show_critical(_("Electron Cash was unable to parse your transaction"))
+ return
+
+ # Due to the asynchronous nature of the qr reader we need to keep the
+ # dialog instance as member variable to prevent reentrancy/multiple ones
+ # from being presented at once.
+ _qr_dialog = None
+
+ def read_tx_from_qrcode(self):
+ if self._qr_dialog:
+ # Re-entrancy prevention -- there is some lag between when the user
+ # taps the QR button and the modal dialog appears. We want to
+ # prevent multiple instances of the dialog from appearing, so we
+ # must do this.
+ self.print_error("Warning: QR dialog is already presented, ignoring.")
+ return
+ if self.gui_object.warn_if_cant_import_qrreader(self):
+ return
+ from electroncash import get_config
+ from .qrreader import QrReaderCameraDialog
+ data = ''
+ self._qr_dialog = None
+ try:
+ self._qr_dialog = QrReaderCameraDialog(parent=self.top_level_window())
+
+ def _on_qr_reader_finished(success: bool, error: str, result):
+ if self._qr_dialog:
+ self._qr_dialog.deleteLater(); self._qr_dialog = None
+ if not success:
+ if error:
+ self.show_error(error)
+ return
+ if not result:
+ return
+ # if the user scanned a bitcoincash URI
+ if result.lower().startswith(networks.net.CASHADDR_PREFIX + ':'):
+ self.pay_to_URI(result)
+ return
+ # else if the user scanned an offline signed tx
+ try:
+ result = bh2u(bitcoin.base_decode(result, length=None, base=43))
+ tx = self.tx_from_text(result) # will show an error dialog on error
+ if not tx:
+ return
+ except BaseException as e:
+ self.show_error(str(e))
+ return
+ self.show_transaction(tx)
+
+ self._qr_dialog.qr_finished.connect(_on_qr_reader_finished)
+ self._qr_dialog.start_scan(get_config().get_video_device())
+ except BaseException as e:
+ if util.is_verbose:
+ traceback.print_exc(file=sys.stderr)
+ self._qr_dialog = None
+ self.show_error(str(e))
+
+ def read_tx_from_file(self, *, fileName = None):
+ fileName = fileName or self.getOpenFileName(_("Select your transaction file"), "*.txn")
+ if not fileName:
+ return
+ try:
+ with open(fileName, "r", encoding='utf-8') as f:
+ file_content = f.read()
+ file_content = file_content.strip()
+ tx_file_dict = json.loads(str(file_content))
+ except (ValueError, IOError, OSError, json.decoder.JSONDecodeError) as reason:
+ self.show_critical(_("Electron Cash was unable to open your transaction file") + "\n" + str(reason), title=_("Unable to read file or no transaction found"))
+ return
+ tx = self.tx_from_text(file_content)
+ return tx
+
+ def do_process_from_text(self):
+ from electroncash.transaction import SerializationError
+ text = text_dialog(self.top_level_window(), _('Input raw transaction'), _("Transaction:"), _("Load transaction"))
+ if not text:
+ return
+ try:
+ tx = self.tx_from_text(text)
+ if tx:
+ self.show_transaction(tx)
+ except SerializationError as e:
+ self.show_critical(_("Electron Cash was unable to deserialize the transaction:") + "\n" + str(e))
+
+ def do_process_from_file(self, *, fileName = None):
+ from electroncash.transaction import SerializationError
+ try:
+ tx = self.read_tx_from_file(fileName=fileName)
+ if tx:
+ self.show_transaction(tx)
+ except SerializationError as e:
+ self.show_critical(_("Electron Cash was unable to deserialize the transaction:") + "\n" + str(e))
+
+ def do_process_from_txid(self, *, txid=None, parent=None, tx_desc=None):
+ parent = parent or self
+ if self.gui_object.warn_if_no_network(parent):
+ return
+ from electroncash import transaction
+ ok = txid is not None
+ if not ok:
+ txid, ok = QInputDialog.getText(parent, _('Lookup transaction'), _('Transaction ID') + ':')
+ if ok and txid:
+ ok, r = self.network.get_raw_tx_for_txid(txid, timeout=10.0)
+ if not ok:
+ parent.show_message(_("Error retrieving transaction") + ":\n" + r)
+ return
+ tx = transaction.Transaction(r, sign_schnorr=self.wallet.is_schnorr_enabled()) # note that presumably the tx is already signed if it comes from blockchain so this sign_schnorr parameter is superfluous, but here to satisfy my OCD -Calin
+ self.show_transaction(tx, tx_desc=tx_desc)
+
+ def export_bip38_dialog(self):
+ ''' Convenience method. Simply calls self.export_privkeys_dialog(bip38=True) '''
+ self.export_privkeys_dialog(bip38 = True)
+
+ @protected
+ def export_privkeys_dialog(self, password, *, bip38=False):
+ if self.wallet.is_watching_only():
+ self.show_message(_("This is a watching-only wallet"))
+ return
+
+ if isinstance(self.wallet, Multisig_Wallet):
+ if bip38:
+ self.show_error(_('WARNING: This is a multi-signature wallet.') + '\n' +
+ _("It cannot be used with BIP38 encrypted keys."))
+ return
+ self.show_message(_('WARNING: This is a multi-signature wallet.') + '\n' +
+ _('It can not be "backed up" by simply exporting these private keys.'))
+
+ if bip38:
+ if not bitcoin.Bip38Key.canEncrypt() or not bitcoin.Bip38Key.isFast():
+ self.show_error(_("BIP38 Encryption is not available. Please install 'pycryptodomex' and restart Electron Cash to enable BIP38."))
+ return
+ passphrase = self.get_passphrase_dialog(
+ msg = (
+ _("You are exporting your wallet's private keys as BIP38 encrypted keys.") + "\n\n" +
+ _("You must specify a passphrase to use for encryption.") + "\n" +
+ _("Save this passphrase so you may decrypt your BIP38 keys later.")
+ )
+ )
+ if not passphrase:
+ # user cancel
+ return
+ bip38 = passphrase # overwrite arg with passphrase.. for use down below ;)
+
+
+ class MyWindowModalDialog(WindowModalDialog):
+ computing_privkeys_signal = pyqtSignal()
+ show_privkeys_signal = pyqtSignal()
+
+ d = MyWindowModalDialog(self.top_level_window(), _('Private keys'))
+ weak_d = Weak.ref(d)
+ d.setObjectName('WindowModalDialog - Private Key Export')
+ destroyed_print_error(d) # track object lifecycle
+ d.setMinimumSize(850, 300)
+ vbox = QVBoxLayout(d)
+
+ lines = [ _("WARNING: ALL your private keys are secret."),
+ _("Exposing a single private key can compromise your entire wallet!"),
+ _("In particular, DO NOT use 'redeem private key' services proposed by third parties.") ]
+ if bip38:
+ del lines[0] # No need to scream-WARN them since BIP38 *are* encrypted
+ msg = '\n'.join(lines)
+ vbox.addWidget(QLabel(msg))
+
+ if bip38:
+ wwlbl = WWLabel()
+ def set_ww_txt(pf_shown=False):
+ if pf_shown:
+ pf_text = ( ("".format(monoface=MONOSPACE_FONT))
+ + bip38
+ + (' {link}'.format(link=_("Hide"))) )
+ else:
+ pf_text = '{link}'.format(link=_("Click to show"))
+ wwlbl.setText(
+ _("The below keys are BIP38 encrypted using the passphrase: {passphrase}
"
+ "Please write this passphrase down and store it in a secret place, separate from these encrypted keys."
+ ).format(passphrase=pf_text)
+ )
+ def toggle_ww_txt(link):
+ set_ww_txt(link=="show")
+ set_ww_txt()
+ wwlbl.linkActivated.connect(toggle_ww_txt)
+ vbox.addWidget(wwlbl)
+
+ e = QTextEdit()
+ e.setFont(QFont(MONOSPACE_FONT))
+ e.setWordWrapMode(QTextOption.NoWrap)
+ e.setReadOnly(True)
+ vbox.addWidget(e)
+
+ defaultname = 'electron-cash-private-keys.csv' if not bip38 else 'electron-cash-bip38-keys.csv'
+ select_msg = _('Select file to export your private keys to')
+ box, filename_e, csv_button = filename_field(self.config, defaultname, select_msg)
+ vbox.addSpacing(12)
+ vbox.addWidget(box)
+
+ b = OkButton(d, _('Export'))
+ b.setEnabled(False)
+ vbox.addLayout(Buttons(CancelButton(d), b))
+
+ private_keys = {}
+ addresses = self.wallet.get_addresses()
+ stop = False
+ def privkeys_thread():
+ for addr in addresses:
+ if not bip38:
+ # This artificial sleep is likely a security / paranoia measure
+ # to allow user to cancel or to make the process "feel expensive".
+ # In the bip38 case it's already slow enough so this delay
+ # is not needed.
+ time.sleep(0.100)
+ if stop:
+ return
+ try:
+ privkey = self.wallet.export_private_key(addr, password)
+ if bip38 and privkey:
+ privkey = str(bitcoin.Bip38Key.encrypt(privkey, bip38)) # __str__() -> base58 encoded bip38 key
+ except InvalidPassword:
+ # See #921 -- possibly a corrupted wallet or other strangeness
+ privkey = 'INVALID_PASSWORD'
+ private_keys[addr.to_ui_string()] = privkey
+ strong_d = weak_d()
+ try:
+ if strong_d and not stop:
+ strong_d.computing_privkeys_signal.emit()
+ else:
+ return
+ finally:
+ del strong_d
+ if stop:
+ return
+ strong_d = weak_d()
+ if strong_d:
+ strong_d.show_privkeys_signal.emit()
+
+ def show_privkeys():
+ nonlocal stop
+ if stop:
+ return
+ s = "\n".join('{:45} {}'.format(addr, privkey)
+ for addr, privkey in private_keys.items())
+ e.setText(s)
+ b.setEnabled(True)
+ stop = True
+
+ thr = None
+
+ def on_dialog_closed(*args):
+ nonlocal stop
+ stop = True
+ try: d.computing_privkeys_signal.disconnect()
+ except TypeError: pass
+ try: d.show_privkeys_signal.disconnect()
+ except TypeError: pass
+ try: d.finished.disconnect()
+ except TypeError: pass
+ if thr and thr.is_alive():
+ thr.join(timeout=1.0) # wait for thread to end for maximal GC mojo
+
+ def computing_privkeys_slot():
+ if stop:
+ return
+ e.setText(_("Please wait... {num}/{total}").format(num=len(private_keys),total=len(addresses)))
+
+ d.computing_privkeys_signal.connect(computing_privkeys_slot)
+ d.show_privkeys_signal.connect(show_privkeys)
+ d.finished.connect(on_dialog_closed)
+ thr = threading.Thread(target=privkeys_thread, daemon=True)
+ thr.start()
+
+ res = d.exec_()
+ if not res:
+ stop = True
+ return
+
+ filename = filename_e.text()
+ if not filename:
+ return
+
+ try:
+ self.do_export_privkeys(filename, private_keys, csv_button.isChecked())
+ except (IOError, os.error) as reason:
+ txt = "\n".join([
+ _("Electron Cash was unable to produce a private key-export."),
+ str(reason)
+ ])
+ self.show_critical(txt, title=_("Unable to create csv"))
+
+ except Exception as e:
+ self.show_message(str(e))
+ return
+
+ self.show_message(_("Private keys exported."))
+
+ def do_export_privkeys(self, fileName, pklist, is_csv):
+ with open(fileName, "w+", encoding='utf-8') as f:
+ if is_csv:
+ transaction = csv.writer(f)
+ transaction.writerow(["address", "private_key"])
+ for addr, pk in pklist.items():
+ transaction.writerow(["%34s"%addr,pk])
+ else:
+ f.write(json.dumps(pklist, indent = 4))
+
+ def do_import_labels(self):
+ labelsFile = self.getOpenFileName(_("Open labels file"), "*.json")
+ if not labelsFile: return
+ try:
+ with open(labelsFile, 'r', encoding='utf-8') as f: # always ensure UTF-8. See issue #1453.
+ data = f.read()
+ data = json.loads(data)
+ if type(data) is not dict or not len(data) or not all(type(v) is str and type(k) is str for k,v in data.items()):
+ self.show_critical(_("The file you selected does not appear to contain labels."))
+ return
+ for key, value in data.items():
+ self.wallet.set_label(key, value)
+ self.show_message(_("Your labels were imported from") + " '%s'" % str(labelsFile))
+ except (IOError, OSError, json.decoder.JSONDecodeError) as reason:
+ self.show_critical(_("Electron Cash was unable to import your labels.") + "\n" + str(reason))
+ self.address_list.update()
+ self.history_list.update()
+ self.utxo_list.update()
+ self.token_list.update()
+ self.token_history_list.update()
+ self.history_updated_signal.emit() # inform things like address_dialog that there's a new history
+
+ def do_export_labels(self):
+ labels = self.wallet.labels
+ try:
+ fileName = self.getSaveFileName(_("Select file to save your labels"), 'electron-cash_labels.json', "*.json")
+ if fileName:
+ with open(fileName, 'w+', encoding='utf-8') as f: # always ensure UTF-8. See issue #1453.
+ json.dump(labels, f, indent=4, sort_keys=True)
+ self.show_message(_("Your labels were exported to") + " '%s'" % str(fileName))
+ except (IOError, os.error) as reason:
+ self.show_critical(_("Electron Cash was unable to export your labels.") + "\n" + str(reason))
+
+ def export_history_dialog(self):
+ d = WindowModalDialog(self.top_level_window(), _('Export History'))
+ d.setMinimumSize(400, 200)
+ vbox = QVBoxLayout(d)
+ defaultname = os.path.expanduser('~/electron-cash-history.csv')
+ select_msg = _('Select file to export your wallet transactions to')
+ box, filename_e, csv_button = filename_field(self.config, defaultname, select_msg)
+ vbox.addWidget(box)
+ include_addresses_chk = QCheckBox(_("Include addresses"))
+ include_addresses_chk.setChecked(True)
+ include_addresses_chk.setToolTip(_("Include input and output addresses in history export"))
+ vbox.addWidget(include_addresses_chk)
+ fee_dl_chk = QCheckBox(_("Fetch accurate fees from network (slower)"))
+ fee_dl_chk.setChecked(self.is_fetch_input_data())
+ fee_dl_chk.setEnabled(bool(self.wallet.network))
+ fee_dl_chk.setToolTip(_("If this is checked, accurate fee and input value data will be retrieved from the network"))
+ vbox.addWidget(fee_dl_chk)
+ fee_time_w = QWidget()
+ fee_time_w.setToolTip(_("The amount of overall time in seconds to allow for downloading fee data before giving up"))
+ hbox = QHBoxLayout(fee_time_w)
+ hbox.setContentsMargins(20, 0, 0, 0)
+ hbox.addWidget(QLabel(_("Timeout:")), 0, Qt.AlignRight)
+ fee_time_sb = QSpinBox()
+ fee_time_sb.setMinimum(10)
+ fee_time_sb.setMaximum(9999)
+ fee_time_sb.setSuffix(" " + _("seconds"))
+ fee_time_sb.setValue(30)
+ fee_dl_chk.clicked.connect(fee_time_w.setEnabled)
+ fee_time_w.setEnabled(fee_dl_chk.isChecked())
+ hbox.addWidget(fee_time_sb, 0, Qt.AlignLeft)
+ hbox.addStretch(1)
+ vbox.addWidget(fee_time_w)
+ vbox.addStretch(1)
+ hbox = Buttons(CancelButton(d), OkButton(d, _('Export')))
+ vbox.addLayout(hbox)
+ run_hook('export_history_dialog', self, hbox)
+ self.update()
+ res = d.exec_()
+ d.setParent(None) # for python GC
+ if not res:
+ return
+ filename = filename_e.text()
+ if not filename:
+ return
+ success = False
+ try:
+ # minimum 10s time for calc. fees, etc
+ timeout = max(fee_time_sb.value() if fee_dl_chk.isChecked() else 10.0, 10.0)
+ success = self.do_export_history(filename, csv_button.isChecked(),
+ download_inputs=fee_dl_chk.isChecked(),
+ timeout=timeout,
+ include_addresses=include_addresses_chk.isChecked())
+ except Exception as reason:
+ export_error_label = _("Electron Cash was unable to produce a transaction export.")
+ self.show_critical(export_error_label + "\n" + str(reason), title=_("Unable to export history"))
+ else:
+ if success:
+ self.show_message(_("Your wallet history has been successfully exported."))
+
+ def plot_history_dialog(self):
+ if plot_history is None:
+ return
+ wallet = self.wallet
+ history = wallet.get_history()
+ if len(history) > 0:
+ plt = plot_history(self.wallet, history)
+ plt.show()
+
+ def is_fetch_input_data(self):
+ ''' default on if network.auto_connect is True, otherwise use config value '''
+ return bool(self.wallet and self.wallet.network and self.config.get('fetch_input_data', self.wallet.network.auto_connect))
+
+ def set_fetch_input_data(self, b):
+ self.config.set_key('fetch_input_data', bool(b))
+
+ def do_export_history(self, fileName, is_csv, *, download_inputs=False, timeout=30.0, include_addresses=True):
+ wallet = self.wallet
+ if not wallet:
+ return
+ dlg = None # this will be set at the bottom of this function
+ def task():
+ def update_prog(x):
+ if dlg: dlg.update_progress(int(x*100))
+ return wallet.export_history(fx=self.fx,
+ show_addresses=include_addresses,
+ decimal_point=self.decimal_point,
+ fee_calc_timeout=timeout,
+ download_inputs=download_inputs,
+ progress_callback=update_prog,
+ receives_before_sends=True)
+ success = False
+ def on_success(history):
+ nonlocal success
+ ccy = (self.fx and self.fx.get_currency()) or ''
+ has_fiat_columns = history and self.fx and self.fx.show_history() and 'fiat_value' in history[0] and 'fiat_balance' in history[0] and 'fiat_fee' in history[0]
+ lines = []
+ for item in history:
+ if is_csv:
+ cols = [item['txid'], item.get('label', ''), item['confirmations'], item['value'], item['fee'], item['date']]
+ if has_fiat_columns:
+ cols += [item['fiat_value'], item['fiat_balance'], item['fiat_fee']]
+ if include_addresses:
+ inaddrs_filtered = (x for x in (item.get('input_addresses') or [])
+ if Address.is_valid(x))
+ outaddrs_filtered = (x for x in (item.get('output_addresses') or [])
+ if Address.is_valid(x))
+ cols.append( ','.join(inaddrs_filtered) )
+ cols.append( ','.join(outaddrs_filtered) )
+ lines.append(cols)
+ else:
+ if has_fiat_columns and ccy:
+ item['fiat_currency'] = ccy # add the currency to each entry in the json. this wastes space but json is bloated anyway so this won't hurt too much, we hope
+ elif not has_fiat_columns:
+ # No need to include these fields as they will always be 'No Data'
+ item.pop('fiat_value', None)
+ item.pop('fiat_balance', None)
+ item.pop('fiat_fee', None)
+ lines.append(item)
+
+ with open(fileName, "w+", encoding="utf-8") as f: # ensure encoding to utf-8. Avoid Windows cp1252. See #1453.
+ if is_csv:
+ transaction = csv.writer(f, lineterminator='\n')
+ cols = ["transaction_hash","label", "confirmations", "value", "fee", "timestamp"]
+ if has_fiat_columns:
+ cols += [f"fiat_value_{ccy}", f"fiat_balance_{ccy}", f"fiat_fee_{ccy}"] # in CSV mode, we use column names eg fiat_value_USD, etc
+ if include_addresses:
+ cols += ["input_addresses", "output_addresses"]
+ transaction.writerow(cols)
+ for line in lines:
+ transaction.writerow(line)
+ else:
+ f.write(json.dumps(lines, indent=4))
+ success = True
+ # kick off the waiting dialog to do all of the above
+ dlg = WaitingDialog(self.top_level_window(),
+ _("Exporting history, please wait ..."),
+ task, on_success, self.on_error, disable_escape_key=True,
+ auto_exec=False, auto_show=False, progress_bar=True, progress_min=0, progress_max=100)
+ dlg.exec_()
+ # this will block heere in the WaitingDialog event loop... and set success to True if success
+ return success
+
+ def sweep_key_dialog(self):
+ addresses = self.wallet.get_unused_addresses()
+ if not addresses:
+ try:
+ addresses = self.wallet.get_receiving_addresses()
+ except AttributeError:
+ addresses = self.wallet.get_addresses()
+ if not addresses:
+ self.show_warning(_('Wallet has no address to sweep to'))
+ return
+
+ d = WindowModalDialog(self.top_level_window(), title=_('Sweep private keys'))
+ d.setMinimumSize(600, 300)
+
+ vbox = QVBoxLayout(d)
+ bip38_warn_label = QLabel(_("BIP38 support is disabled because a requisite library is not installed. Please install 'cryptodomex' or omit BIP38 private keys (private keys starting in 6P...). Decrypt keys to WIF format (starting with 5, K, or L) in order to sweep."))
+ bip38_warn_label.setWordWrap(True)
+ bip38_warn_label.setHidden(True)
+ vbox.addWidget(bip38_warn_label)
+ extra = ""
+ if bitcoin.is_bip38_available():
+ extra += " " + _('or BIP38 keys')
+ vbox.addWidget(QLabel(_("Enter private keys") + extra + " :"))
+
+ keys_e = ScanQRTextEdit(allow_multi=True)
+ keys_e.setTabChangesFocus(True)
+ vbox.addWidget(keys_e)
+
+ h, addr_combo = address_combo(addresses)
+ vbox.addLayout(h)
+
+ vbox.addStretch(1)
+ sweep_button = OkButton(d, _('Sweep'))
+ vbox.addLayout(Buttons(CancelButton(d), sweep_button))
+
+ def get_address_text():
+ return addr_combo.currentText()
+
+ def get_priv_keys():
+ return keystore.get_private_keys(keys_e.toPlainText(), allow_bip38=True)
+
+ def has_bip38_keys_but_no_bip38():
+ if bitcoin.is_bip38_available():
+ return False
+ keys = [k for k in keys_e.toPlainText().split() if k]
+ return any(bitcoin.is_bip38_key(k) for k in keys)
+
+ def enable_sweep():
+ bad_bip38 = has_bip38_keys_but_no_bip38()
+ sweepok = bool(get_address_text() and not bad_bip38 and get_priv_keys())
+ sweep_button.setEnabled(sweepok)
+ bip38_warn_label.setHidden(not bad_bip38)
+
+ keys_e.textChanged.connect(enable_sweep)
+ enable_sweep()
+ res = d.exec_()
+ d.setParent(None)
+ if not res:
+ return
+
+ try:
+ self.do_clear()
+ keys = get_priv_keys()
+ bip38s = {}
+ for i, k in enumerate(keys):
+ if bitcoin.is_bip38_key(k):
+ bip38s[k] = i
+ if bip38s:
+ # For all the BIP38s detected, prompt for password
+ from .bip38_importer import Bip38Importer
+ d2 = Bip38Importer(bip38s.keys(), parent=self.top_level_window())
+ d2.exec_()
+ d2.setParent(None)
+ if d2.decoded_keys:
+ for k,tup in d2.decoded_keys.items():
+ wif, adr = tup
+ # rewrite the keys they specified with the decrypted WIF in the keys list for sweep_preparations to work below...
+ i = bip38s[k]
+ keys[i] = wif
+ else:
+ self.show_message(_("User cancelled"))
+ return
+ coins, keypairs = sweep_preparations(keys, self.network)
+ self.tx_external_keypairs = keypairs
+ self.payto_e.setText(get_address_text())
+ self.spend_coins(coins)
+ self.spend_max()
+ except BaseException as e:
+ self.show_message(str(e))
+ return
+ self.payto_e.setFrozen(True)
+ self.amount_e.setFrozen(True)
+ self.warn_if_watching_only()
+
+ def _do_import(self, title, msg, func):
+ text = text_dialog(self.top_level_window(), title, msg + ' :', _('Import'),
+ allow_multi=True)
+ if not text:
+ return
+ bad, bad_info = [], []
+ good = []
+ for key in str(text).split():
+ try:
+ addr = func(key)
+ good.append(addr)
+ except BaseException as e:
+ bad.append(key)
+ bad_info.append("{}: {}".format(key, str(e)))
+ continue
+ if good:
+ self.show_message(_("The following addresses were added") + ':\n' + '\n'.join(good))
+ if bad:
+ self.show_warning(_("The following could not be imported") + ':\n' + '\n'.join(bad), detail_text='\n\n'.join(bad_info))
+ self.address_list.update()
+ self.history_list.update()
+ self.history_updated_signal.emit() # inform things like address_dialog that there's a new history
+
+ def import_addresses(self):
+ if not self.wallet.can_import_address():
+ return
+ title, msg = _('Import addresses'), _("Enter addresses")
+ def import_addr(addr):
+ if self.wallet.import_address(Address.from_string(addr)):
+ return addr
+ return ''
+ self._do_import(title, msg, import_addr)
+
+ @protected
+ def do_import_privkey(self, password):
+ if not self.wallet.can_import_privkey():
+ return
+ title, msg = _('Import private keys'), _("Enter private keys")
+ if bitcoin.is_bip38_available():
+ msg += " " + _('or BIP38 keys')
+ def func(key):
+ if bitcoin.is_bip38_available() and bitcoin.is_bip38_key(key):
+ from .bip38_importer import Bip38Importer
+ d = Bip38Importer([key], parent=self.top_level_window(),
+ message = _('A BIP38 key was specified, please enter a password to decrypt it'),
+ show_count = False)
+ d.exec_()
+ d.setParent(None) # python GC quicker if this happens
+ if d.decoded_keys:
+ wif, adr = d.decoded_keys[key]
+ return self.wallet.import_private_key(wif, password)
+ else:
+ raise util.UserCancelled()
+ else:
+ return self.wallet.import_private_key(key, password)
+ self._do_import(title, msg, func)
+
+ def update_fiat(self):
+ b = self.fx and self.fx.is_enabled()
+ self.fiat_send_e.setVisible(b)
+ self.fiat_receive_e.setVisible(b)
+ self.history_list.refresh_headers()
+ self.history_list.update()
+ self.history_updated_signal.emit() # inform things like address_dialog that there's a new history
+ self.address_list.refresh_headers()
+ self.address_list.update()
+ self.update_status()
+
+ def cashaddr_icon(self):
+ if self.gui_object.is_cashaddr():
+ return QIcon(":icons/tab_converter.svg")
+ else:
+ return QIcon(":icons/tab_converter_bw.svg")
+
+ def cashaddr_status_tip(self):
+ if self.gui_object.is_cashaddr():
+ return _('Address Format') + ' - ' + _('CashAddr')
+ else:
+ return _('Address Format') + ' - ' + _('Legacy')
+
+ def update_cashaddr_icon(self):
+ self.addr_converter_button.setIcon(self.cashaddr_icon())
+ self.addr_converter_button.setStatusTip(self.cashaddr_status_tip())
+
+ def toggle_cashaddr_status_bar(self):
+ self.gui_object.toggle_cashaddr()
+ self.statusBar().showMessage(self.cashaddr_status_tip(), 2000)
+
+ def toggle_cashaddr_settings(self, state):
+ self.gui_object.toggle_cashaddr(state == Qt.Checked)
+
+ def toggle_cashaddr(self, on):
+ self.print_error('*** WARNING ElectrumWindow.toggle_cashaddr: This function is deprecated. Please do not call it!')
+ self.gui_object.toggle_cashaddr(on)
+
+
+ def settings_dialog(self):
+ class SettingsModalDialog(WindowModalDialog):
+ shown_signal = pyqtSignal()
+ def showEvent(self, e):
+ super().showEvent(e)
+ self.shown_signal.emit()
+ self.need_restart = False
+ need_wallet_reopen = False
+ dialog_finished = False
+ d = SettingsModalDialog(self.top_level_window(), _('Preferences'))
+ d.setObjectName('WindowModalDialog - Preferences')
+ destroyed_print_error(d)
+ vbox = QVBoxLayout()
+ tabs = QTabWidget()
+ gui_widgets = []
+ misc_widgets = []
+ global_tx_widgets, per_wallet_tx_widgets = [], []
+
+ # language
+ lang_help = _('Select which language is used in the GUI (after restart).')
+ lang_label = HelpLabel(_('Language') + ':', lang_help)
+ lang_combo = QComboBox()
+ from electroncash.i18n import languages, get_system_language_match, match_language
+
+ language_names = []
+ language_keys = []
+ for (lang_code, lang_def) in languages.items():
+ language_keys.append(lang_code)
+ lang_name = []
+ lang_name.append(lang_def.name)
+ if lang_code == '':
+ # System entry in languages list (==''), gets system setting
+ sys_lang = get_system_language_match()
+ if sys_lang:
+ lang_name.append(f' [{languages[sys_lang].name}]')
+ language_names.append(''.join(lang_name))
+ lang_combo.addItems(language_names)
+ conf_lang = self.config.get("language", '')
+ if conf_lang:
+ # The below code allows us to rename languages in saved config and
+ # have them still line up with languages in our languages dict.
+ # For example we used to save English as en_UK but now it's en_US
+ # and it will still match
+ conf_lang = match_language(conf_lang)
+ try: index = language_keys.index(conf_lang)
+ except ValueError: index = 0
+ lang_combo.setCurrentIndex(index)
+
+ if not self.config.is_modifiable('language'):
+ for w in [lang_combo, lang_label]:
+ w.setEnabled(False)
+
+ def on_lang(x):
+ lang_request = language_keys[lang_combo.currentIndex()]
+ if lang_request != self.config.get('language'):
+ self.config.set_key("language", lang_request, True)
+ self.need_restart = True
+ lang_combo.currentIndexChanged.connect(on_lang)
+ gui_widgets.append((lang_label, lang_combo))
+
+ nz_help = _('Number of zeros displayed after the decimal point. For example, if this is set to 2, "1." will be '
+ 'displayed as "1.00"')
+ nz_label = HelpLabel(_('Zeros after decimal point') + ':', nz_help)
+ nz = QSpinBox()
+ nz.setMinimum(0)
+ nz.setMaximum(self.decimal_point)
+ nz.setValue(self.num_zeros)
+ if not self.config.is_modifiable('num_zeros'):
+ for w in [nz, nz_label]: w.setEnabled(False)
+ def on_nz():
+ value = nz.value()
+ if self.num_zeros != value:
+ self.num_zeros = value
+ self.config.set_key('num_zeros', value, True)
+ self.update_tabs()
+ self.update_status()
+ nz.valueChanged.connect(on_nz)
+ gui_widgets.append((nz_label, nz))
+
+ def on_customfee(x):
+ amt = customfee_e.get_amount()
+ m = int(amt * 1000.0) if amt is not None else None
+ self.config.set_key('customfee', m)
+ self.fee_slider.update()
+ self.fee_slider_mogrifier()
+
+ fee_gb = QGroupBox(_('Fees'))
+ fee_lo = QGridLayout(fee_gb)
+
+ customfee_e = BTCSatsByteEdit()
+ customfee_e.setAmount(self.config.custom_fee_rate() / 1000.0 if self.config.has_custom_fee_rate() else None)
+ customfee_e.textChanged.connect(on_customfee)
+ customfee_label = HelpLabel(_('Custom fee rate:'), _('Custom Fee Rate in Satoshis per byte'))
+ fee_lo.addWidget(customfee_label, 0, 0, 1, 1, Qt.AlignRight)
+ fee_lo.addWidget(customfee_e, 0, 1, 1, 1, Qt.AlignLeft)
+
+ feebox_cb = QCheckBox(_('Edit fees manually'))
+ feebox_cb.setChecked(self.config.get('show_fee', False))
+ feebox_cb.setToolTip(_("Show fee edit box in send tab."))
+ def on_feebox(x):
+ self.config.set_key('show_fee', x == Qt.Checked)
+ self.fee_e.setVisible(bool(x))
+ feebox_cb.stateChanged.connect(on_feebox)
+ fee_lo.addWidget(feebox_cb, 1, 0, 1, 2, Qt.AlignJustify)
+
+ # Fees box up top
+ misc_widgets.append((fee_gb, None))
+
+ msg = _('OpenAlias record, used to receive coins and to sign payment requests.') + '\n\n'\
+ + _('The following alias providers are available:') + '\n'\
+ + '\n'.join(['https://cryptoname.co/', 'http://xmr.link/']) + '\n\n'\
+ + _('For more information, see http://openalias.org')
+ alias_label = HelpLabel(_('OpenAlias') + ':', msg)
+ alias = self.config.get('alias','')
+ alias_e = QLineEdit(alias)
+ def set_alias_color():
+ if not self.config.get('alias'):
+ alias_e.setStyleSheet("")
+ return
+ if self.alias_info:
+ alias_addr, alias_name, validated = self.alias_info
+ alias_e.setStyleSheet((ColorScheme.GREEN if validated else ColorScheme.RED).as_stylesheet(True))
+ else:
+ alias_e.setStyleSheet(ColorScheme.RED.as_stylesheet(True))
+ def on_alias_edit():
+ alias_e.setStyleSheet("")
+ alias = str(alias_e.text())
+ self.config.set_key('alias', alias, True)
+ if alias:
+ self.fetch_alias()
+ set_alias_color()
+ self.alias_received_signal.connect(set_alias_color)
+ # this ensures that even if exception occurs or we exit function early,
+ # the signal is disconnected
+ disconnect_alias_received_signal = Weak.finalize(d, self.alias_received_signal.disconnect, set_alias_color)
+ alias_e.editingFinished.connect(on_alias_edit)
+ id_gb = QGroupBox(_("Identity"))
+ id_form = QFormLayout(id_gb)
+ id_form.addRow(alias_label, alias_e)
+
+ # SSL certificate
+ msg = ' '.join([
+ _('SSL certificate used to sign payment requests.'),
+ _('Use setconfig to set ssl_chain and ssl_privkey.'),
+ ])
+ if self.config.get('ssl_privkey') or self.config.get('ssl_chain'):
+ try:
+ SSL_identity = paymentrequest.check_ssl_config(self.config)
+ SSL_error = None
+ except BaseException as e:
+ SSL_identity = "error"
+ SSL_error = str(e)
+ else:
+ SSL_identity = ""
+ SSL_error = None
+ SSL_id_label = HelpLabel(_('SSL certificate') + ':', msg)
+ SSL_id_e = QLineEdit(SSL_identity)
+ SSL_id_e.setStyleSheet((ColorScheme.RED if SSL_error else ColorScheme.GREEN).as_stylesheet(True) if SSL_identity else '')
+ if SSL_error:
+ SSL_id_e.setToolTip(SSL_error)
+ SSL_id_e.setReadOnly(True)
+ id_form.addRow(SSL_id_label, SSL_id_e)
+
+ # Identity box in middle of this tab
+ misc_widgets.append((id_gb, None)) # commit id_form/id_gb to master layout via this data structure
+
+ from . import exception_window as ew
+ cr_gb = QGroupBox(_("Crash Reporter"))
+ cr_grid = QGridLayout(cr_gb)
+ cr_chk = QCheckBox()
+ cr_chk.setChecked(ew.is_enabled(self.config))
+ cr_chk.clicked.connect(lambda b: ew.set_enabled(self.config, b))
+ cr_help = HelpLabel(_("Crash reporter enabled"),
+ _("The crash reporter is the error window which pops-up when Electron Cash encounters an internal error.\n\n"
+ "It is recommended that you leave this option enabled, so that developers can be notified of any internal bugs. "
+ "When a crash is encountered you are asked if you would like to send a report.\n\n"
+ "Private information is never revealed in crash reports to developers."))
+ # The below dance ensures the checkbox is horizontally centered in the widget
+ cr_grid.addWidget(QWidget(), 0, 0, 1, 1) # dummy spacer
+ cr_grid.addWidget(cr_chk, 0, 1, 1, 1, Qt.AlignRight)
+ cr_grid.addWidget(cr_help, 0, 2, 1, 1, Qt.AlignLeft)
+ cr_grid.addWidget(QWidget(), 0, 3, 1, 1) # dummy spacer
+ cr_grid.setColumnStretch(0, 1)
+ cr_grid.setColumnStretch(3, 1)
+
+ # Crash reporter box at bottom of this tab
+ misc_widgets.append((cr_gb, None)) # commit crash reporter gb to layout
+
+
+ units = util.base_unit_labels # ( 'BCH', 'mBCH', 'bits' )
+ msg = _('Base unit of your wallet.')\
+ + '\n1 BCH = 1,000 mBCH = 1,000,000 bits.\n' \
+ + _(' These settings affects the fields in the Send tab')+' '
+ unit_label = HelpLabel(_('Base unit') + ':', msg)
+ unit_combo = QComboBox()
+ unit_combo.addItems(units)
+ unit_combo.setCurrentIndex(units.index(self.base_unit()))
+ def on_unit(x, nz):
+ unit_result = units[unit_combo.currentIndex()]
+ if self.base_unit() == unit_result:
+ return
+ edits = self.amount_e, self.fee_e, self.receive_amount_e
+ amounts = [edit.get_amount() for edit in edits]
+ dp = util.base_units.get(unit_result)
+ if dp is not None:
+ self.decimal_point = dp
+ else:
+ raise Exception('Unknown base unit')
+ self.config.set_key('decimal_point', self.decimal_point, True)
+ nz.setMaximum(self.decimal_point)
+ for edit, amount in zip(edits, amounts):
+ edit.setAmount(amount)
+ self.update_tabs()
+ self.update_status()
+ unit_combo.currentIndexChanged.connect(lambda x: on_unit(x, nz))
+ gui_widgets.append((unit_label, unit_combo))
+
+ block_explorers = web.BE_sorted_list()
+ msg = _('Choose which online block explorer to use for functions that open a web browser')
+ block_ex_label = HelpLabel(_('Online block explorer') + ':', msg)
+ block_ex_combo = QComboBox()
+ block_ex_combo.addItems(block_explorers)
+ block_ex_combo.setCurrentIndex(block_ex_combo.findText(web.BE_from_config(self.config)))
+ def on_be(x):
+ be_result = block_explorers[block_ex_combo.currentIndex()]
+ self.config.set_key('block_explorer', be_result, True)
+ block_ex_combo.currentIndexChanged.connect(on_be)
+ gui_widgets.append((block_ex_label, block_ex_combo))
+
+ qr_combo = QComboBox()
+ qr_label = HelpLabel(_('Video device'), '')
+ qr_did_scan = False
+ def set_no_camera(e=''):
+ # Older Qt or missing libs -- disable GUI control and inform user why
+ qr_combo.setEnabled(False)
+ qr_combo.clear()
+ qr_combo.addItem(_("Default"), "default")
+ qr_combo.setToolTip(_("Unable to probe for cameras on this system. QtMultimedia is likely missing."))
+ qr_label.setText(_('Video device') + ' ' + _('(disabled)') + ':')
+ qr_label.help_text = qr_combo.toolTip() + "\n\n" + str(e)
+ qr_label.setToolTip(qr_combo.toolTip())
+ def scan_cameras():
+ nonlocal qr_did_scan
+ if qr_did_scan or dialog_finished: # dialog_finished guard needed because QueuedConnection
+ # already scanned or dialog finished quickly
+ return
+ qr_did_scan = True
+ system_cameras = []
+ try:
+ from PyQt5.QtMultimedia import QCameraInfo
+ except ImportError as e:
+ set_no_camera(e)
+ return
+ system_cameras = QCameraInfo.availableCameras()
+ qr_combo.clear()
+ qr_combo.addItem(_("Default"), "default")
+ qr_label.setText(_('Video device') + ':')
+ qr_label.help_text = _("For scanning QR codes.")
+ qr_combo.setToolTip(qr_label.help_text)
+ qr_label.setToolTip(qr_label.help_text)
+ for cam in system_cameras:
+ qr_combo.addItem(cam.description(), cam.deviceName())
+ video_device = self.config.get("video_device")
+ video_device_index = 0
+ if video_device:
+ video_device_index = max(0, qr_combo.findData(video_device)) # if not found, default to 0 (the default item)
+ qr_combo.setCurrentIndex(video_device_index)
+ qr_combo.setEnabled(True)
+ def on_video_device(x):
+ if qr_combo.isEnabled():
+ self.config.set_key("video_device", qr_combo.itemData(x), True)
+
+ set_no_camera() # pre-populate combo box with default so it has a sizeHint
+
+ d.shown_signal.connect(scan_cameras, Qt.QueuedConnection) # do the camera scan once dialog is shown, using QueuedConnection so it's called from top level event loop and not from the showEvent handler
+ qr_combo.currentIndexChanged.connect(on_video_device)
+ gui_widgets.append((qr_label, qr_combo))
+
+ colortheme_combo = QComboBox()
+ colortheme_combo.addItem(_('Default'), 'default') # We can't name this "light" in the UI as sometimes the default is actually dark-looking eg on Mojave or on some Linux desktops.
+ colortheme_combo.addItem(_('Dark'), 'dark')
+ theme_name = self.config.get('qt_gui_color_theme', 'default')
+ dark_theme_available = self.gui_object.is_dark_theme_available()
+ if theme_name == 'dark' and not dark_theme_available:
+ theme_name = 'default'
+ index = colortheme_combo.findData(theme_name)
+ if index < 0: index = 0
+ colortheme_combo.setCurrentIndex(index)
+ if sys.platform in ('darwin',) and not dark_theme_available:
+ msg = _("Color theme support is provided by macOS if using Mojave or above."
+ " Use the System Preferences to switch color themes.")
+ err_msg = msg
+ else:
+ msg = ( _("Dark theme support requires the package 'QDarkStyle' (typically installed via the 'pip3' command on Unix & macOS).")
+ if not dark_theme_available
+ else '' )
+ err_msg = _("Dark theme is not available. Please install QDarkStyle to access this feature.")
+ lbltxt = _('Color theme') + ':'
+ colortheme_label = HelpLabel(lbltxt, msg) if msg else QLabel(lbltxt)
+ def on_colortheme(x):
+ item_data = colortheme_combo.itemData(x)
+ if not dark_theme_available and item_data == 'dark':
+ self.show_error(err_msg)
+ colortheme_combo.setCurrentIndex(0)
+ return
+ self.config.set_key('qt_gui_color_theme', item_data, True)
+ if theme_name != item_data:
+ self.need_restart = True
+ colortheme_combo.currentIndexChanged.connect(on_colortheme)
+ gui_widgets.append((colortheme_label, colortheme_combo))
+
+ if sys.platform not in ('darwin',):
+ # Enable/Disable HighDPI -- this option makes no sense for macOS
+ # and thus does not appear on that platform
+ hidpi_chk = QCheckBox(_('Automatic high-DPI scaling'))
+ if sys.platform in ('linux',):
+ hidpi_chk.setToolTip(_("Enable/disable this option if you experience graphical glitches (such as overly large status bar icons)"))
+ else: # windows
+ hidpi_chk.setToolTip(_("Enable/disable this option if you experience graphical glitches (such as dialog box text being cut off"))
+ hidpi_chk.setChecked(bool(self.config.get('qt_enable_highdpi', True)))
+ if self.config.get('qt_disable_highdpi'):
+ hidpi_chk.setToolTip(_('Automatic high DPI scaling was disabled from the command-line'))
+ hidpi_chk.setChecked(False)
+ hidpi_chk.setDisabled(True)
+ def on_hi_dpi_toggle():
+ self.config.set_key('qt_enable_highdpi', hidpi_chk.isChecked())
+ self.need_restart = True
+ hidpi_chk.stateChanged.connect(on_hi_dpi_toggle)
+ gui_widgets.append((hidpi_chk, None))
+
+ if sys.platform in ('win32', 'cygwin'):
+ # Enable/Disable the use of the FreeType library on Qt
+ # (Windows only)
+ freetype_chk = QCheckBox(_('Use FreeType for font rendering'))
+ freetype_chk.setChecked(self.gui_object.windows_qt_use_freetype)
+ freetype_chk.setEnabled(self.config.is_modifiable('windows_qt_use_freetype'))
+ freetype_chk.setToolTip(_("Enable/disable this option if you experience font rendering glitches (such as blurred text or monochrome emoji characters)"))
+ def on_freetype_chk():
+ self.gui_object.windows_qt_use_freetype = freetype_chk.isChecked() # property has a method backing it
+ self.need_restart = True
+ freetype_chk.stateChanged.connect(on_freetype_chk)
+ gui_widgets.append((freetype_chk, None))
+ elif sys.platform in ('linux',):
+ # Enable/Disable the use of the fonts.xml FontConfig override
+ # (Linux only)
+ fontconfig_chk = QCheckBox(_('Use custom fontconfig for emojis'))
+ fontconfig_chk.setChecked(self.gui_object.linux_qt_use_custom_fontconfig)
+ fontconfig_chk.setEnabled(self.config.is_modifiable('linux_qt_use_custom_fontconfig'))
+ fontconfig_chk.setToolTip(_("Enable/disable this option if you experience font rendering glitches (such as blurred text or monochrome emoji characters)"))
+ def on_fontconfig_chk():
+ self.gui_object.linux_qt_use_custom_fontconfig = fontconfig_chk.isChecked() # property has a method backing it
+ self.need_restart = True
+ fontconfig_chk.stateChanged.connect(on_fontconfig_chk)
+ gui_widgets.append((fontconfig_chk, None))
+
+
+ # CashAddr control
+ gui_widgets.append((None, None)) # spacer
+ address_w = QGroupBox(_('Address Format'))
+ address_w.setToolTip(_('Select between Cash Address and Legacy formats for addresses'))
+ hbox = QHBoxLayout(address_w)
+ cashaddr_cbox = QComboBox()
+ cashaddr_cbox.addItem(QIcon(':icons/tab_converter.svg'), _("CashAddr"), Address.FMT_CASHADDR)
+ cashaddr_cbox.addItem(QIcon(':icons/tab_converter_bw.svg'), _("Legacy"), Address.FMT_LEGACY)
+ cashaddr_cbox.setCurrentIndex(0 if self.gui_object.is_cashaddr() else 1)
+ def cashaddr_cbox_handler(ignored_param):
+ fmt = int(cashaddr_cbox.currentData())
+ self.gui_object.toggle_cashaddr(fmt == Address.FMT_CASHADDR)
+ cashaddr_cbox.currentIndexChanged.connect(cashaddr_cbox_handler)
+ hbox.addWidget(cashaddr_cbox)
+ toggle_cashaddr_control = QCheckBox(_('Hide status button'))
+ toggle_cashaddr_control.setToolTip(_('If checked, the status bar button for toggling address formats will be hidden'))
+ toggle_cashaddr_control.setChecked(self.gui_object.is_cashaddr_status_button_hidden())
+ toggle_cashaddr_control.toggled.connect(self.gui_object.set_cashaddr_status_button_hidden)
+ hbox.addWidget(toggle_cashaddr_control)
+ gui_widgets.append((address_w, None))
+
+ gui_widgets.append((None, None)) # spacer
+ updatecheck_cb = QCheckBox(_("Automatically check for updates"))
+ updatecheck_cb.setChecked(self.gui_object.has_auto_update_check())
+ updatecheck_cb.setToolTip(_("Enable this option if you wish to be notified as soon as a new version of Electron Cash becomes available"))
+ def on_set_updatecheck(v):
+ self.gui_object.set_auto_update_check(v == Qt.Checked)
+ updatecheck_cb.stateChanged.connect(on_set_updatecheck)
+ gui_widgets.append((updatecheck_cb, None))
+
+
+ notify_tx_cb = QCheckBox(_('Notify when receiving funds'))
+ notify_tx_cb.setToolTip(_('If enabled, a system notification will be presented when you receive funds to this wallet.'))
+ notify_tx_cb.setChecked(bool(self.wallet.storage.get('gui_notify_tx', True)))
+ def on_notify_tx(b):
+ self.wallet.storage.put('gui_notify_tx', bool(b))
+ notify_tx_cb.stateChanged.connect(on_notify_tx)
+ per_wallet_tx_widgets.append((notify_tx_cb, None))
+
+ usechange_cb = QCheckBox(_('Use change addresses'))
+ if self.force_use_single_change_addr:
+ usechange_cb.setChecked(True)
+ usechange_cb.setEnabled(False)
+ if isinstance(self.force_use_single_change_addr, str):
+ usechange_cb.setToolTip(self.force_use_single_change_addr)
+ else:
+ usechange_cb.setToolTip('')
+ else:
+ usechange_cb.setChecked(self.wallet.use_change)
+ usechange_cb.setToolTip(_('Using change addresses makes it more difficult for other people to track your transactions.'))
+ def on_usechange(x):
+ usechange_result = x == Qt.Checked
+ if self.wallet.use_change != usechange_result:
+ self.wallet.use_change = usechange_result
+ self.wallet.storage.put('use_change', self.wallet.use_change)
+ multiple_cb.setEnabled(bool(self.wallet.use_change))
+ usechange_cb.stateChanged.connect(on_usechange)
+ per_wallet_tx_widgets.append((usechange_cb, None))
+
+ multiple_change = self.wallet.multiple_change
+ multiple_cb = QCheckBox(_('Use multiple change addresses'))
+ if self.force_use_single_change_addr:
+ multiple_cb.setEnabled(False)
+ multiple_cb.setChecked(False)
+ if isinstance(self.force_use_single_change_addr, str):
+ multiple_cb.setToolTip(self.force_use_single_change_addr)
+ else:
+ multiple_cb.setToolTip('')
+ else:
+ multiple_cb.setEnabled(bool(self.wallet.use_change))
+ multiple_cb.setToolTip('\n'.join([
+ _('In some cases, use up to 3 change addresses in order to break '
+ 'up large coin amounts and obfuscate the recipient address.'),
+ _('This may result in higher transactions fees.')
+ ]))
+ multiple_cb.setChecked(multiple_change)
+ def on_multiple(x):
+ multiple = x == Qt.Checked
+ if self.wallet.multiple_change != multiple:
+ self.wallet.multiple_change = multiple
+ self.wallet.storage.put('multiple_change', multiple)
+ multiple_cb.stateChanged.connect(on_multiple)
+ per_wallet_tx_widgets.append((multiple_cb, None))
+
+ def fmt_docs(key, klass):
+ lines = [ln.lstrip(" ") for ln in klass.__doc__.split("\n")]
+ return '\n'.join([key, "", " ".join(lines)])
+
+ def on_unconf(x):
+ self.config.set_key('confirmed_only', bool(x))
+ conf_only = self.config.get('confirmed_only', False)
+ unconf_cb = QCheckBox(_('Spend only confirmed coins'))
+ unconf_cb.setToolTip(_('Spend only confirmed inputs.'))
+ unconf_cb.setChecked(conf_only)
+ unconf_cb.stateChanged.connect(on_unconf)
+ global_tx_widgets.append((unconf_cb, None))
+
+ # Fiat Currency
+ hist_checkbox = QCheckBox()
+ fiat_address_checkbox = QCheckBox()
+ ccy_combo = QComboBox()
+ ex_combo = QComboBox()
+
+ enable_opreturn = bool(self.config.get('enable_opreturn'))
+ opret_cb = QCheckBox(_('Enable OP_RETURN output'))
+ opret_cb.setToolTip(_('Enable posting messages with OP_RETURN.'))
+ opret_cb.setChecked(enable_opreturn)
+ opret_cb.stateChanged.connect(self.on_toggled_opreturn)
+ global_tx_widgets.append((opret_cb,None))
+
+ # Legacy BCT Segwit Send Protection™
+ legacy_p2sh_cb = QCheckBox(_('Allow legacy p2sh in the Send tab'))
+ prefix_char = '3' if not networks.net.TESTNET else '2'
+ legacy_p2sh_cb.setToolTip(_('If enabled, you will be allowed to use legacy \'{prefix_char}...\' style addresses in the Send tab.\nOtherwise you must use CashAddr for p2sh in the UI.').format(prefix_char=prefix_char))
+ legacy_p2sh_cb.setChecked(bool(self.config.get('allow_legacy_p2sh', False)))
+ def on_legacy_p2sh_cb(b):
+ self.config.set_key('allow_legacy_p2sh', bool(b))
+ legacy_p2sh_cb.stateChanged.connect(on_legacy_p2sh_cb)
+ global_tx_widgets.append((legacy_p2sh_cb, None))
+
+ # Schnorr
+ use_schnorr_cb = QCheckBox(_("Sign with Schnorr signatures"))
+ use_schnorr_cb.setChecked(self.wallet.is_schnorr_enabled())
+ use_schnorr_cb.stateChanged.connect(self.wallet.set_schnorr_enabled)
+ no_schnorr_reason = []
+ if self.wallet.is_schnorr_possible(no_schnorr_reason):
+ use_schnorr_cb.setEnabled(True)
+ use_schnorr_cb.setToolTip(_("Sign all transactions using Schnorr signatures."))
+ else:
+ # not possible (wallet type not supported); show reason in tooltip
+ use_schnorr_cb.setEnabled(False)
+ use_schnorr_cb.setToolTip(no_schnorr_reason[0])
+ per_wallet_tx_widgets.append((use_schnorr_cb, None))
+
+ # Retire old change addresses
+ limit_change_w = QWidget()
+ vb = QVBoxLayout(limit_change_w)
+ vb.setContentsMargins(0, 0, 0, 0)
+ limit_change_chk = QCheckBox(_("Retire unused change addresses"))
+ limit_change_chk.setChecked(self.wallet.limit_change_addr_subs > 0)
+ vb.addWidget(limit_change_chk)
+ limit_change_inner_w = QWidget()
+ hb = QHBoxLayout(limit_change_inner_w)
+ hb.addSpacing(24)
+ hb.setContentsMargins(0, 0, 0, 0)
+ limit_change_sb = QSpinBox()
+ limit_change_sb.setMinimum(0)
+ limit_change_sb.setMaximum(2**31 - 1)
+ limit_change_sb.setValue(self.wallet.limit_change_addr_subs or self.wallet.DEFAULT_CHANGE_ADDR_SUBS_LIMIT)
+ l1 = QLabel(_("Retire if older than:"))
+ f = l1.font()
+ f.setPointSize(f.pointSize() - 1)
+ l1.setFont(f)
+ hb.addWidget(l1)
+ hb.addWidget(limit_change_sb)
+ l2 = QLabel(_("from latest index"))
+ l2.setFont(f)
+ hb.addWidget(l2)
+ limit_change_sb.setFont(f)
+ orig_limit_change_subs = self.wallet.limit_change_addr_subs
+ def limit_change_subs_changed():
+ nonlocal need_wallet_reopen
+ limit_change_inner_w.setEnabled(limit_change_chk.isChecked())
+ self.wallet.limit_change_addr_subs = limit_change_sb.value() if limit_change_chk.isChecked() else 0
+ if self.wallet.limit_change_addr_subs != orig_limit_change_subs:
+ need_wallet_reopen = True
+ if self.wallet.synchronizer:
+ self.wallet.synchronizer.clear_retired_change_addrs()
+ limit_change_inner_w.setEnabled(limit_change_chk.isChecked())
+ limit_change_sb.valueChanged.connect(limit_change_subs_changed)
+ limit_change_chk.stateChanged.connect(limit_change_subs_changed)
+ vb.addWidget(limit_change_inner_w)
+ vb.addStretch(1)
+ limit_change_w.setToolTip("" + _("If checked, change addresses with no balance and trivial history which are"
+ " sufficeintly old will not be subscribed-to on the server, in order"
+ " to save resources.") + "
" +
+ "" + _("Disable this option if you plan on receiving funds using your old change"
+ " addresses or if you suspect your old change addresses"
+ " may have unseen funds on them.") + "
")
+ limit_change_inner_w.setToolTip("" + _("Specify how old a change address must be in order to be considered"
+ " for retirement. This value is in terms of address index position"
+ " from the most recent change address.") + "")
+ per_wallet_tx_widgets.append((limit_change_w, None))
+
+ # Fiat Tab (only build it if not on testnet)
+ #
+ # Note that at the present time self.fx is always defined, including for --offline mode;
+ # we will check if self.fx is not None here just in case that changes some day.
+ if self.fx and self.fx.is_supported():
+ def update_currencies():
+ if not self.fx: return
+ currencies = sorted(self.fx.get_currencies(self.fx.get_history_config()))
+ ccy_combo.clear()
+ ccy_combo.addItems([pgettext('Referencing Fiat currency', 'None')] + currencies)
+ if self.fx.is_enabled():
+ ccy_combo.setCurrentIndex(ccy_combo.findText(self.fx.get_currency()))
+
+ def update_history_cb():
+ if not self.fx: return
+ hist_checkbox.setChecked(self.fx.get_history_config())
+ hist_checkbox.setEnabled(self.fx.is_enabled())
+
+ def update_fiat_address_cb():
+ if not self.fx: return
+ fiat_address_checkbox.setChecked(self.fx.get_fiat_address_config())
+
+ def update_exchanges():
+ if not self.fx: return
+ b = self.fx.is_enabled()
+ ex_combo.setEnabled(b)
+ if b:
+ c = self.fx.get_currency()
+ h = self.fx.get_history_config()
+ else:
+ c, h = self.fx.default_currency, False
+ exchanges = self.fx.get_exchanges_by_ccy(c, h)
+ conf_exchange = self.fx.config_exchange()
+ ex_combo.clear()
+ ex_combo.addItems(sorted(exchanges))
+ idx = ex_combo.findText(conf_exchange) # try and restore previous exchange if in new list
+ if idx < 0:
+ # hmm, previous exchange wasn't in new h= setting. Try default exchange.
+ idx = ex_combo.findText(self.fx.default_exchange)
+ idx = 0 if idx < 0 else idx # if still no success (idx < 0) -> default to the first exchange in combo
+ if exchanges: # don't set index if no exchanges, as any index is illegal. this shouldn't happen.
+ ex_combo.setCurrentIndex(idx) # note this will emit a currentIndexChanged signal if it's changed
+
+ def on_currency(hh):
+ if not self.fx: return
+ b = bool(ccy_combo.currentIndex())
+ ccy = str(ccy_combo.currentText()) if b else None
+ self.fx.set_enabled(b)
+ if b and ccy != self.fx.ccy:
+ self.fx.set_currency(ccy)
+ update_history_cb()
+ update_exchanges()
+ self.update_fiat()
+
+ def on_exchange(idx):
+ exchange = str(ex_combo.currentText())
+ if self.fx and self.fx.is_enabled() and exchange and exchange != self.fx.exchange.name():
+ self.fx.set_exchange(exchange)
+
+ def on_history(checked):
+ if not self.fx: return
+ changed = bool(self.fx.get_history_config()) != bool(checked)
+ self.fx.set_history_config(checked)
+ update_exchanges()
+ self.history_list.refresh_headers()
+ if self.fx.is_enabled() and checked:
+ # reset timeout to get historical rates
+ self.fx.timeout = 0
+ if changed:
+ self.history_list.update() # this won't happen too often as it's rate-limited
+
+ def on_fiat_address(checked):
+ if not self.fx: return
+ self.fx.set_fiat_address_config(checked)
+ self.address_list.refresh_headers()
+ self.address_list.update()
+
+ update_currencies()
+ update_history_cb()
+ update_fiat_address_cb()
+ update_exchanges()
+ ccy_combo.currentIndexChanged.connect(on_currency)
+ hist_checkbox.stateChanged.connect(on_history)
+ fiat_address_checkbox.stateChanged.connect(on_fiat_address)
+ ex_combo.currentIndexChanged.connect(on_exchange)
+
+ hist_checkbox.setText(_('Show history rates'))
+ fiat_address_checkbox.setText(_('Show fiat balance for addresses'))
+
+ fiat_widgets = []
+ fiat_widgets.append((QLabel(_('Fiat currency:')), ccy_combo))
+ fiat_widgets.append((QLabel(_('Source:')), ex_combo))
+ fiat_widgets.append((hist_checkbox, None))
+ fiat_widgets.append((fiat_address_checkbox, None))
+
+ else:
+ # For testnet(s) where we do not support Fiat display
+ lbl = QLabel(_("Fiat display is not supported on this chain."))
+ lbl.setAlignment(Qt.AlignHCenter|Qt.AlignVCenter)
+ f = lbl.font()
+ f.setItalic(True)
+ lbl.setFont(f)
+ fiat_widgets = [(lbl, None)]
+
+ tabs_info = [
+ (gui_widgets, _('General')),
+ (misc_widgets, pgettext("The preferences -> Fees,misc tab", 'Fees && Misc.')),
+ (OrderedDict([
+ ( _("App-Global Options") , global_tx_widgets ),
+ ( _("Per-Wallet Options") , per_wallet_tx_widgets),
+ ]), _('Transactions')),
+ (fiat_widgets, _('Fiat')),
+ ]
+ def add_tabs_info_to_tabs(tabs, tabs_info):
+ def add_widget_pair(a,b,grid):
+ i = grid.rowCount()
+ if b:
+ if a:
+ grid.addWidget(a, i, 0)
+ grid.addWidget(b, i, 1)
+ else:
+ if a:
+ grid.addWidget(a, i, 0, 1, 2)
+ else:
+ grid.addItem(QSpacerItem(15, 15), i, 0, 1, 2)
+ for thing, name in tabs_info:
+ tab = QWidget()
+ if isinstance(thing, dict):
+ # This Prefs tab is laid out as groupboxes one atop another...
+ d = thing
+ vbox = QVBoxLayout(tab)
+ for groupName, widgets in d.items():
+ gbox = QGroupBox(groupName)
+ grid = QGridLayout(gbox)
+ grid.setColumnStretch(0,1)
+ for a,b in widgets:
+ add_widget_pair(a,b,grid)
+ vbox.addWidget(gbox, len(widgets))
+ else:
+ # Standard layout.. 1 tab has just a grid of widgets
+ widgets = thing
+ grid = QGridLayout(tab)
+ grid.setColumnStretch(0,1)
+ for a,b in widgets:
+ add_widget_pair(a,b,grid)
+ tabs.addTab(tab, name)
+ # / add_tabs_info_to_tabs
+ add_tabs_info_to_tabs(tabs, tabs_info)
+
+ vbox.addWidget(tabs)
+ vbox.addStretch(1)
+ vbox.addLayout(Buttons(CloseButton(d)))
+ d.setLayout(vbox)
+
+ try:
+ # run the dialog
+ d.exec_()
+ finally:
+ dialog_finished = True # paranoia for scan_cameras
+ d.setParent(None) # for Python GC
+
+ if self.fx:
+ self.fx.timeout = 0
+
+ disconnect_alias_received_signal() # aka self.alias_received_signal.disconnect(set_alias_color)
+
+ run_hook('close_settings_dialog')
+ if self.need_restart:
+ self.show_message(_('Please restart Electron Cash to activate the new GUI settings'), title=_('Success'))
+ elif need_wallet_reopen:
+ self.show_message(_('Please close and reopen this wallet to activate the new settings'), title=_('Success'))
+
+ def closeEvent(self, event):
+ # It seems in some rare cases this closeEvent() is called twice.
+ # clean_up() guards against that situation.
+ self.clean_up()
+ super().closeEvent(event)
+ event.accept() # paranoia. be sure it's always accepted.
+
+ def is_alive(self): return bool(not self.cleaned_up)
+
+ def clean_up_connections(self):
+ def disconnect_signals():
+ del self.cashaddr_toggled_signal # delete alias so it doesn interfere with below
+ for attr_name in dir(self):
+ if attr_name.endswith("_signal"):
+ sig = getattr(self, attr_name)
+ if isinstance(sig, pyqtBoundSignal):
+ try: sig.disconnect()
+ except TypeError: pass # no connections
+ elif attr_name.endswith("__RateLimiter"): # <--- NB: this needs to match the attribute name in util.py rate_limited decorator
+ rl_obj = getattr(self, attr_name)
+ if isinstance(rl_obj, RateLimiter):
+ rl_obj.kill_timer()
+ # The below shouldn't even be needed, since Qt should take care of this,
+ # but Axel Gembe got a crash related to this on Python 3.7.3, PyQt 5.12.3
+ # so here we are. See #1531
+ try: self.gui_object.cashaddr_toggled_signal.disconnect(self.update_cashaddr_icon)
+ except TypeError: pass
+ try: self.gui_object.cashaddr_toggled_signal.disconnect(self.update_receive_address_widget)
+ except TypeError: pass
+ try: self.gui_object.cashaddr_status_button_hidden_signal.disconnect(self.addr_converter_button.setHidden)
+ except TypeError: pass
+ try: self.gui_object.update_available_signal.disconnect(self.on_update_available)
+ except TypeError: pass
+ try: self.disconnect()
+ except TypeError: pass
+ def disconnect_network_callbacks():
+ if self.network:
+ self.network.unregister_callback(self.on_network)
+ self.network.unregister_callback(self.on_quotes)
+ self.network.unregister_callback(self.on_history)
+ # /
+ disconnect_network_callbacks()
+ disconnect_signals()
+
+ def clean_up_children(self):
+ # Status bar holds references to self, so clear it to help GC this window
+ self.setStatusBar(None)
+ # Note that due to quirks on macOS and the shared menu bar, we do *NOT*
+ # clear the menuBar. Instead, doing this causes the object to get
+ # deleted and/or its actions (and more importantly menu action hotkeys)
+ # to go away immediately.
+ self.setMenuBar(None)
+
+ # Disable shortcuts immediately to prevent them from accidentally firing
+ # on us after we are closed. They will get deleted when this QObject
+ # is finally deleted by Qt.
+ for shortcut in self._shortcuts:
+ shortcut.setEnabled(False)
+ del shortcut
+ self._shortcuts.clear()
+
+ # Reparent children to 'None' so python GC can clean them up sooner rather than later.
+ # This also hopefully helps accelerate this window's GC.
+ children = [c for c in self.children()
+ if (isinstance(c, (QWidget, QAction, TaskThread))
+ and not isinstance(c, (QStatusBar, QMenuBar, QFocusFrame, QShortcut)))]
+ for c in children:
+ try: c.disconnect()
+ except TypeError: pass
+ c.setParent(None)
+
+ def clean_up(self):
+ if self.cleaned_up:
+ return
+ self.cleaned_up = True
+ if self.wallet.thread: # guard against window close before load_wallet was called (#1554)
+ self.wallet.thread.stop()
+ self.wallet.thread.wait() # Join the thread to make sure it's really dead.
+
+ for w in [self.address_list, self.history_list, self.utxo_list, self.token_list, self.token_history_list,
+ self.cash_account_e, self.contact_list, self.tx_update_mgr]:
+ if w:
+ # tell relevant object to clean itself up, unregister callbacks, disconnect signals, etc
+ w.clean_up()
+
+ # We catch these errors with the understanding that there is no recovery at
+ # this point, given user has likely performed an action we cannot recover
+ # cleanly from. So we attempt to exit as cleanly as possible.
+ try:
+ self.config.set_key("is_maximized", self.isMaximized())
+ self.config.set_key("console-history", self.console.history[-50:], True)
+ except (OSError, PermissionError) as e:
+ self.print_error("unable to write to config (directory removed?)", e)
+
+ if not self.isMaximized():
+ try:
+ g = self.geometry()
+ self.wallet.storage.put("winpos-qt", [g.left(),g.top(),g.width(),g.height()])
+ except (OSError, PermissionError) as e:
+ self.print_error("unable to write to wallet storage (directory removed?)", e)
+
+ # Should be no side-effects in this function relating to file access past this point.
+ if self.qr_window:
+ self.qr_window.close()
+ self.qr_window = None # force GC sooner rather than later.
+ for d in list(self._tx_dialogs):
+ # clean up all extant tx dialogs we opened as they hold references
+ # to us that will be invalidated
+ d.prompt_if_unsaved = False # make sure to unconditionally close
+ d.close()
+ self._close_wallet()
+
+ # Save any dirty token meta keys to disk
+ self.token_meta.save()
+
+ try: self.gui_object.timer.timeout.disconnect(self.timer_actions)
+ except TypeError: pass # defensive programming: this can happen if we got an exception before the timer action was connected
+
+ self.gui_object.close_window(self) # implicitly runs the hook: on_close_window
+ # Now, actually STOP the wallet's synchronizer and verifiers and remove
+ # it from the daemon. Note that its addresses will still stay
+ # 'subscribed' to the ElectrumX server until we connect to a new server,
+ # (due to ElectrumX protocol limitations).. but this is harmless.
+ self.gui_object.daemon.stop_wallet(self.wallet.storage.path)
+
+ # At this point all plugins should have removed any references to this window.
+ # Now, just to be paranoid, do some active destruction of signal/slot connections as well as
+ # Removing child widgets forcefully to speed up Python's own GC of this window.
+ self.clean_up_connections()
+ self.clean_up_children()
+
+ # And finally, print when we are destroyed by C++ for debug purposes
+ # We must call this here as above calls disconnected all signals
+ # involving this widget.
+ destroyed_print_error(self)
+
+
+ def internal_plugins_dialog(self):
+ if self.internalpluginsdialog:
+ # NB: reentrance here is possible due to the way the window menus work on MacOS.. so guard against it
+ self.internalpluginsdialog.raise_()
+ return
+ d = WindowModalDialog(parent=self.top_level_window(), title=_('Optional Features'))
+ weakD = Weak.ref(d)
+
+ gui_object = self.gui_object
+ plugins = gui_object.plugins
+
+ vbox = QVBoxLayout(d)
+
+ # plugins
+ scroll = QScrollArea()
+ scroll.setEnabled(True)
+ scroll.setWidgetResizable(True)
+ scroll.setMinimumSize(400,250)
+ vbox.addWidget(scroll)
+
+ w = QWidget()
+ scroll.setWidget(w)
+ w.setMinimumHeight(plugins.get_internal_plugin_count() * 35)
+
+ grid = QGridLayout()
+ grid.setColumnStretch(0,1)
+ weakGrid = Weak.ref(grid)
+ w.setLayout(grid)
+
+ settings_widgets = Weak.ValueDictionary()
+
+ def enable_settings_widget(p, name, i):
+ widget = settings_widgets.get(name)
+ grid = weakGrid()
+ d = weakD()
+ if d and grid and not widget and p and p.requires_settings():
+ widget = settings_widgets[name] = p.settings_widget(d)
+ grid.addWidget(widget, i, 1)
+ if widget:
+ widget.setEnabled(bool(p and p.is_enabled()))
+ if not p:
+ # Need to delete settings widget because keeping it around causes bugs as it points to a now-dead plugin instance
+ settings_widgets.pop(name)
+ widget.hide(); widget.setParent(None); widget.deleteLater(); widget = None
+
+ def do_toggle(weakCb, name, i):
+ cb = weakCb()
+ if cb:
+ p = plugins.toggle_internal_plugin(name)
+ cb.setChecked(bool(p))
+ enable_settings_widget(p, name, i)
+ # All plugins get this whenever one is toggled.
+ run_hook('init_qt', gui_object)
+
+ for i, descr in enumerate(plugins.internal_plugin_metadata.values()):
+ name = descr['__name__']
+ p = plugins.get_internal_plugin(name)
+ if descr.get('registers_keystore'):
+ continue
+ try:
+ plugins.retranslate_internal_plugin_metadata(name)
+ cb = QCheckBox(descr['fullname'])
+ weakCb = Weak.ref(cb)
+ plugin_is_loaded = p is not None
+ cb_enabled = bool(not plugin_is_loaded and plugins.is_internal_plugin_available(name, self.wallet)
+ or plugin_is_loaded and p.can_user_disable())
+ cb.setEnabled(cb_enabled)
+ cb.setChecked(bool(plugin_is_loaded and p.is_enabled()))
+ grid.addWidget(cb, i, 0)
+ enable_settings_widget(p, name, i)
+ cb.clicked.connect(partial(do_toggle, weakCb, name, i))
+ msg = descr['description']
+ if descr.get('requires'):
+ msg += '\n\n' + _('Requires') + ':\n' + '\n'.join(map(lambda x: x[1], descr.get('requires')))
+ grid.addWidget(HelpButton(msg), i, 2)
+ except Exception:
+ self.print_msg("error: cannot display plugin", name)
+ traceback.print_exc(file=sys.stderr)
+ grid.setRowStretch(len(plugins.internal_plugin_metadata.values()), 1)
+ vbox.addLayout(Buttons(CloseButton(d)))
+ self.internalpluginsdialog = d
+ d.exec_()
+ self.internalpluginsdialog = None # Python GC please!
+
+ def external_plugins_dialog(self):
+ if self.externalpluginsdialog:
+ # NB: reentrance here is possible due to the way the window menus work on MacOS.. so guard against it
+ self.externalpluginsdialog.raise_()
+ return
+ from . import external_plugins_window
+ d = external_plugins_window.ExternalPluginsDialog(self, _('Plugin Manager'))
+ self.externalpluginsdialog = d
+ d.exec_()
+ self.externalpluginsdialog = None # allow python to GC
+
+ def hardware_wallet_support(self):
+ if not sys.platform.startswith('linux'):
+ self.print_error("FIXME! hardware_wallet_support is Linux only!")
+ return
+ if self.hardwarewalletdialog:
+ # NB: reentrance here is possible due to the way the window menus work on MacOS.. so guard against it
+ self.hardwarewalletdialog.raise_()
+ return
+ from .udev_installer import InstallHardwareWalletSupportDialog
+ d = InstallHardwareWalletSupportDialog(self.top_level_window(), self.gui_object.plugins)
+ self.hardwarewalletdialog = d
+ d.exec_()
+ self.hardwarewalletdialog = None # allow python to GC
+
+ def rebuild_history(self):
+ if self.gui_object.warn_if_no_network(self):
+ # Don't allow if offline mode.
+ return
+ msg = ' '.join([
+ _('This feature is intended to allow you to rebuild a wallet if it has become corrupted.'),
+ "\n\n"+_('Your entire transaction history will be downloaded again from the server and verified from the blockchain.'),
+ _('Just to be safe, back up your wallet file first!'),
+ "\n\n"+_("Rebuild this wallet's history now?")
+ ])
+ if self.question(msg, title=_("Rebuild Wallet History")):
+ try:
+ self.wallet.rebuild_history()
+ except RuntimeError as e:
+ self.show_error(str(e))
+
+ def scan_beyond_gap(self):
+ if self.gui_object.warn_if_no_network(self):
+ return
+ from .scan_beyond_gap import ScanBeyondGap
+ d = ScanBeyondGap(self)
+ d.exec_()
+ d.setParent(None) # help along Python by dropping refct to 0
+
+ def copy_to_clipboard(self, text, tooltip=None, widget=None):
+ tooltip = tooltip or _("Text copied to clipboard")
+ widget = widget or self
+ qApp.clipboard().setText(text)
+ QToolTip.showText(QCursor.pos(), tooltip, widget)
+
+ def _pick_address(self, *, title=None, icon=None) -> Address:
+ ''' Returns None on user cancel, or a valid is_mine Address object
+ from the Address list. '''
+ from .address_list import AddressList
+
+ # Show user address picker
+ d = WindowModalDialog(self.top_level_window(), title or _('Choose an address'))
+ d.setObjectName("Window Modal Dialog - " + d.windowTitle())
+ destroyed_print_error(d) # track object lifecycle
+ d.setMinimumWidth(self.width()-150)
+ vbox = QVBoxLayout(d)
+ if icon:
+ hbox = QHBoxLayout()
+ hbox.setContentsMargins(0,0,0,0)
+ ic_lbl = QLabel()
+ ic_lbl.setPixmap(icon.pixmap(50))
+ hbox.addWidget(ic_lbl)
+ hbox.addItem(QSpacerItem(10, 1))
+ t_lbl = QLabel("" + (title or '') + "")
+ hbox.addWidget(t_lbl, 0, Qt.AlignLeft)
+ hbox.addStretch(1)
+ vbox.addLayout(hbox)
+ vbox.addWidget(QLabel(_('Choose an address') + ':'))
+ l = AddressList(self, picker=True)
+ try:
+ l.setObjectName("AddressList - " + d.windowTitle())
+ destroyed_print_error(l) # track object lifecycle
+ l.update()
+ vbox.addWidget(l)
+
+ ok = OkButton(d)
+ ok.setDisabled(True)
+
+ addr = None
+ def on_item_changed(current, previous):
+ nonlocal addr
+ addr = current and current.data(0, l.DataRoles.address)
+ ok.setEnabled(addr is not None)
+ def on_selection_changed():
+ items = l.selectedItems()
+ if items: on_item_changed(items[0], None)
+ else: on_item_changed(None, None)
+ l.currentItemChanged.connect(on_item_changed)
+
+ cancel = CancelButton(d)
+
+ vbox.addLayout(Buttons(cancel, ok))
+
+ res = d.exec_()
+ if res == QDialog.Accepted:
+ return addr
+ return None
+ finally:
+ l.clean_up() # required to unregister network callback
+
+ def register_new_cash_account(self, addr = None):
+ ''' Initiates the "Register a new cash account" dialog.
+ If addr is none, will use self.receive_address.
+
+ Alternatively, you may pass the string 'pick' in lieu of an address
+ if you want this function to present the user with a UI for choosing
+ an address to register.'''
+ if addr == 'pick':
+ addr = self._pick_address(title=_("Register A New Cash Account"), icon=QIcon(":icons/cashacct-logo.png"))
+ if addr is None:
+ return # user cancel
+ addr = addr or self.receive_address or self.wallet.get_receiving_address()
+ if not addr:
+ self.print_error("register_new_cash_account: no receive address specified")
+ return
+ def on_link(link):
+ if link == 'ca':
+ webopen('https://www.cashaccount.info/')
+ elif link == 'addr':
+ if self.wallet.is_mine(addr):
+ self.show_address(addr)
+ else:
+ url = web.BE_URL(self.config, 'addr', addr)
+ if url: webopen(url)
+ name, placeholder = '', 'Satoshi_Nakamoto'
+ while True:
+ lh = self.wallet.get_local_height()
+ le = ButtonsLineEdit()
+ help_msg = '' + \
+ _('How it works: Cash Accounts registrations work by issuing an OP_RETURN transaction to yourself, costing fractions of a penny.
'
+ 'The registrations are permanently written to the blockchain and associate a human-friendly name with your address.
'
+ 'After the registration transaction receives 1 confirmation, you can use your new Cash Account name as if it were an address and give it out to other people (Electron Cash or another Cash Account enabled wallet is required).
'
+ 'You will be offered the opportunity to review the generated transaction before broadcasting it to the blockchain.
') + \
+ ''
+ qmark = ":icons/question-mark-dark.svg" if ColorScheme.dark_scheme else ":icons/question-mark-light.svg"
+ help_but = HelpButton(help_msg, button_text='', fixed_size=False, icon=QIcon(qmark), custom_parent=self)
+ le.addWidget(help_but)
+ name = line_dialog(self.top_level_window(),
+ _("Register A New Cash Account"),
+ (_("You are registering a new Cash Account for your address {address}
").format(address=addr.to_ui_string())
+ + _("The current block height is {block_height}, so the new cash account will likely look like: AccountName#{number}.")
+ .format(block_height=lh or '???', number=max(cashacct.bh2num(lh or 0)+1, 0) or '???')
+ + "
" + _("Specify the account name below (limited to 99 characters):") ),
+ _("Proceed to Send Tab"), default=name, linkActivated=on_link,
+ placeholder=placeholder, disallow_empty=True,
+ line_edit_widget = le,
+ icon=QIcon(":icons/cashacct-logo.png"))
+ if name is None:
+ # user cancel
+ return
+ name = name.strip()
+ if not cashacct.name_accept_re.match(name):
+ self.show_error(_("The specified name cannot be used for a Cash Accounts registration. You must specify 1-99 alphanumeric (ASCII) characters, without spaces (underscores are permitted as well)."))
+ continue
+ self._reg_new_cash_account(name, addr)
+ return
+
+ def _reg_new_cash_account(self, name, addr):
+ self.show_send_tab()
+ self.do_clear()
+
+ # Enabled OP_RETURN stuff even if disabled in prefs. Next do_clear call will reset to prefs presets.
+ self.message_opreturn_e.setVisible(True)
+ self.opreturn_rawhex_cb.setVisible(True)
+ self.opreturn_label.setVisible(True)
+
+ # Prevent user from modifying required fields, and hide what we
+ # can as well.
+ self.message_opreturn_e.setText(cashacct.ScriptOutput.create_registration(name, addr).script[1:].hex())
+ self.message_opreturn_e.setFrozen(True)
+ self.opreturn_rawhex_cb.setChecked(True)
+ self.opreturn_rawhex_cb.setDisabled(True)
+ self.amount_e.setAmount(0)
+ self.amount_e.setFrozen(True)
+ self.max_button.setDisabled(True)
+ self.payto_e.setHidden(True)
+ self.payto_label.setHidden(True)
+
+ # Set a default description -- this we allow them to edit
+ self.message_e.setText(
+ _("Cash Accounts Registration: '{name}' -> {address}").format(
+ name=name, address=addr.to_ui_string()
+ )
+ )
+
+ # set up "Helpful Window" informing user registration will
+ # not be accepted until at least 1 confirmation.
+ cashaccounts_never_show_send_tab_hint = self.config.get('cashaccounts_never_show_send_tab_hint', False)
+
+ if not cashaccounts_never_show_send_tab_hint:
+ msg1 = (
+ _("The Send Tab has been filled-in with your Cash Accounts registration data.")
+ + "
" + _("Please review the transaction, save it, and/or broadcast it at your leisure.")
+ )
+ msg2 = ( _("After at least 1 confirmation, you will be able to use your new Cash Account, and it will be visible in Electron Cash in the Addresses tab.")
+ )
+ msg3 = _("If you wish to control which specific coins are used to "
+ "fund this registration transaction, feel free to use the "
+ "Coins and/or Addresses tabs' Spend-from facility.\n\n"
+ "('Spend from' is a right-click menu option in either tab.)")
+
+ res = self.msg_box(
+ # TODO: get SVG icon..
+ parent = self, icon=QIcon(":icons/cashacct-logo.png").pixmap(75, 75),
+ title=_('Register A New Cash Account'), rich_text=True,
+ text = msg1, informative_text = msg2, detail_text = msg3,
+ checkbox_text=_("Never show this again"), checkbox_ischecked=False
+ )
+ if res[1]:
+ # never ask checked
+ self.config.set_key('cashaccounts_never_show_send_tab_hint', True)
+
+ def show_create_new_token_dialog(self):
+ from . import token_create
+ if not self.create_new_token_dialog:
+ self.create_new_token_dialog = token_create.CreateTokenForm(self)
+ self.create_new_token_dialog.show()
+ self.create_new_token_dialog.activateWindow()
+ self.create_new_token_dialog.raise_()
+
+ def _send_or_edit_tokens_common(self, utxos: List[Dict[str, Any]], form_mode: int):
+ from .token_send import SendTokenForm
+ assert all(isinstance(u['token_data'], token.OutputData) for u in utxos)
+ modes = {0: SendTokenForm.FormMode.send, 1: SendTokenForm.FormMode.edit, 2: SendTokenForm.FormMode.mint}
+ assert form_mode in modes, "Bad form_mode argument"
+ form_mode = modes[form_mode]
+
+ form = None
+
+ def broadcast_done(success):
+ """On success, if the send token form is up, close it"""
+ nonlocal form
+ if success and form and self._send_token_form and self._send_token_form is form and form.isVisible():
+ form.accept()
+
+ self._send_token_form = form = SendTokenForm(self, utxos, broadcast_callback=broadcast_done,
+ form_mode=form_mode)
+ form.open()
+
+ weak_self = weakref.ref(self)
+ def on_close():
+ nonlocal form
+ slf = weak_self and weak_self()
+ if slf and form and slf._send_token_form and slf._send_token_form is form:
+ # Coerce python to GC this now-defunct window
+ if not slf._send_token_form.isVisible():
+ slf._send_token_form.setParent(None)
+ slf._send_token_form = None
+ form = None
+ form.accepted.connect(on_close)
+ form.rejected.connect(on_close)
+
+ def send_tokens(self, utxos: List[Dict[str, Any]]):
+ self._send_or_edit_tokens_common(utxos, form_mode=0)
+
+ def edit_tokens(self, utxos: List[Dict[str, Any]]):
+ self._send_or_edit_tokens_common(utxos, form_mode=1)
+
+ def mint_tokens(self, utxos: List[Dict[str, Any]]):
+ self._send_or_edit_tokens_common(utxos, form_mode=2)
+
+ def show_edit_token_metadata_dialog(self, token_id_hex: str):
+ from .token_meta_edit import TokenMetaEditorForm
+ if self.edit_token_metadata_dialog:
+ self.edit_token_metadata_dialog.close()
+ self.edit_token_metadata_dialog.setParent(None) # For Python GC
+ self.edit_token_metadata_dialog = None
+ self.edit_token_metadata_dialog = TokenMetaEditorForm(self, token_id_hex, flags=Qt.Window)
+ self.edit_token_metadata_dialog.show()
+
+
+class TxUpdateMgr(QObject, PrintError):
+ ''' Manages new transaction notifications and transaction verified
+ notifications from the network thread. It collates them and sends them to
+ the appropriate GUI controls in the main_window in an efficient manner. '''
+ def __init__(self, main_window_parent):
+ assert isinstance(main_window_parent, ElectrumWindow), "TxUpdateMgr must be constructed with an ElectrumWindow as its parent"
+ super().__init__(main_window_parent)
+ self.cleaned_up = False
+ self.lock = threading.Lock() # used to lock thread-shared attrs below
+ # begin thread-shared attributes
+ self.notif_q = []
+ self.verif_q = []
+ self.need_process_v, self.need_process_n = False, False
+ # /end thread-shared attributes
+ self.weakParent = Weak.ref(main_window_parent)
+ main_window_parent.history_updated_signal.connect(self.verifs_get_and_clear, Qt.DirectConnection) # immediately clear verif_q on history update because it would be redundant to keep the verify queue around after a history list update
+ main_window_parent.on_timer_signal.connect(self.do_check, Qt.DirectConnection) # hook into main_window's timer_actions function
+ self.full_hist_refresh_timer = QTimer(self)
+ self.full_hist_refresh_timer.setInterval(1000); self.full_hist_refresh_timer.setSingleShot(False)
+ self.full_hist_refresh_timer.timeout.connect(self.schedule_full_hist_refresh_maybe)
+
+ def diagnostic_name(self):
+ return ((self.weakParent() and self.weakParent().diagnostic_name()) or "???") + "." + __class__.__name__
+
+ def clean_up(self):
+ self.cleaned_up = True
+ main_window_parent = self.weakParent() # weak -> strong ref
+ if main_window_parent:
+ try: main_window_parent.history_updated_signal.disconnect(self.verifs_get_and_clear)
+ except TypeError: pass
+ try: main_window_parent.on_timer_signal.disconnect(self.do_check)
+ except TypeError: pass
+
+ def do_check(self):
+ ''' Called from timer_actions in main_window to check if notifs or
+ verifs need to update the GUI.
+ - Checks the need_process_[v|n] flags
+ - If either flag is set, call the @rate_limited process_verifs
+ and/or process_notifs functions which update GUI parent in a
+ rate-limited (collated) fashion (for decent GUI responsiveness). '''
+ with self.lock:
+ bV, bN = self.need_process_v, self.need_process_n
+ self.need_process_v, self.need_process_n = False, False
+ if bV: self.process_verifs() # rate_limited call (1 per second)
+ if bN: self.process_notifs() # rate_limited call (1 per 15 seconds)
+
+ def verifs_get_and_clear(self):
+ ''' Clears the verif_q. This is called from the network
+ thread for the 'verified2' event as well as from the below
+ update_verifs (GUI thread), hence the lock. '''
+ with self.lock:
+ ret = self.verif_q
+ self.verif_q = []
+ self.need_process_v = False
+ return ret
+
+ def notifs_get_and_clear(self):
+ with self.lock:
+ ret = self.notif_q
+ self.notif_q = []
+ self.need_process_n = False
+ return ret
+
+ def verif_add(self, args):
+ # args: [wallet, tx_hash, height, conf, timestamp]
+ # filter out tx's not for this wallet
+ parent = self.weakParent()
+ if not parent or parent.cleaned_up:
+ return
+ if args[0] is parent.wallet:
+ with self.lock:
+ self.verif_q.append(args[1:])
+ self.need_process_v = True
+
+ def notif_add(self, args):
+ parent = self.weakParent()
+ if not parent or parent.cleaned_up:
+ return
+ tx, wallet = args
+ # filter out tx's not for this wallet
+ if wallet is parent.wallet:
+ with self.lock:
+ self.notif_q.append(tx)
+ self.need_process_n = True
+
+ @rate_limited(1.0, ts_after=True)
+ def process_verifs(self):
+ ''' Update history list with tx's from verifs_q, but limit the
+ GUI update rate to once per second. '''
+ parent = self.weakParent()
+ if not parent or parent.cleaned_up:
+ return
+ items = self.verifs_get_and_clear()
+ if items:
+ t0 = time.time()
+ parent.history_list.setUpdatesEnabled(False)
+ had_sorting = parent.history_list.isSortingEnabled()
+ if had_sorting:
+ parent.history_list.setSortingEnabled(False)
+ n_updates = 0
+ for item in items:
+ did_update = parent.history_list.update_item(*item)
+ n_updates += 1 if did_update else 0
+ self.print_error("Updated {}/{} verified txs in GUI in {:0.2f} ms"
+ .format(n_updates, len(items), (time.time()-t0)*1e3))
+ if had_sorting:
+ parent.history_list.setSortingEnabled(True)
+ parent.history_list.setUpdatesEnabled(True)
+ parent.update_status()
+ if parent.history_list.has_unknown_balances:
+ self.print_error("History tab: 'Unknown' balances detected, will schedule a GUI refresh after wallet settles")
+ self._full_refresh_ctr = 0
+ self.full_hist_refresh_timer.start()
+
+ _full_refresh_ctr = 0
+ def schedule_full_hist_refresh_maybe(self):
+ ''' self.full_hist_refresh_timer timeout slot. May schedule a full
+ history refresh after wallet settles if we have "Unknown" balances. '''
+ parent = self.weakParent()
+ if self._full_refresh_ctr > 60:
+ # Too many retries. Give up.
+ self.print_error("History tab: Full refresh scheduler timed out.. wallet hasn't settled in 1 minute. Giving up.")
+ self.full_hist_refresh_timer.stop()
+ elif parent and parent.history_list.has_unknown_balances:
+ # Still have 'Unknown' balance. Check if wallet is settled.
+ if self.need_process_v or not parent.wallet.is_fully_settled_down():
+ # Wallet not fully settled down yet... schedule this function to run later
+ self.print_error("History tab: Wallet not yet settled.. will try again in 1 second...")
+ else:
+ # Wallet has settled. Schedule an update. Note this function may be called again
+ # in 1 second to check if the 'Unknown' situation has corrected itself.
+ self.print_error("History tab: Wallet has settled down, latching need_update to true")
+ parent.need_update.set()
+ self._full_refresh_ctr += 1
+ else:
+ # No more polling is required. 'Unknown' balance disappeared from
+ # GUI (or parent window was just closed).
+ self.full_hist_refresh_timer.stop()
+ self._full_refresh_ctr = 0
+
+ @rate_limited(5.0, classlevel=True)
+ def process_notifs(self):
+ parent = self.weakParent()
+ if not parent or parent.cleaned_up:
+ return
+ if parent.network:
+ txns = self.notifs_get_and_clear()
+ if txns:
+ # Combine the transactions
+ n_ok, n_cashacct, total_amount = 0, 0, 0
+ last_seen_ca_name = ''
+ ca_txs = dict() # 'txid' -> ('name', address) -- will be given to contacts_list for "unconfirmed registrations" display
+ token_category_ids: Set[bytes] = set()
+ n_nfts_in, n_nfts_out = 0, 0
+ for tx in txns:
+ if tx:
+
+ wallet_delta, txinfo3 = parent.wallet.get_tx_extended_info(tx, ver=3)
+ is_relevant, is_mine, v, fee = wallet_delta[:4]
+ for _typ, addr, val in tx.outputs():
+ # Find Cash Account registrations that are for addresses *in* this wallet
+ if isinstance(addr, cashacct.ScriptOutput) and parent.wallet.is_mine(addr.address):
+ n_cashacct += 1
+ last_seen_ca_name = addr.name
+ txid = tx.txid_fast()
+ if txid: ca_txs[txid] = (addr.name, addr.address)
+ if not is_relevant:
+ continue
+ for (_typ, addr, val), token_data in tx.outputs(tokens=True):
+ if (isinstance(token_data, token.OutputData) and isinstance(addr, Address)
+ and parent.wallet.is_mine(addr)):
+ token_category_ids.add(token_data.id)
+ n_nfts_in += token_data.has_nft()
+ input_token_datas = txinfo3.token_data
+ for i, token_data in enumerate(input_token_datas):
+ if token_data is None:
+ continue
+ addr = tx.inputs()[i].get('address')
+ if (isinstance(token_data, token.OutputData) and isinstance(addr, Address)
+ and parent.wallet.is_mine(addr)):
+ token_category_ids.add(token_data.id)
+ n_nfts_out += token_data.has_nft()
+ total_amount += v
+ n_ok += 1
+ if n_cashacct:
+ # Unhide the Addresses tab if cash account reg tx seen
+ # and user never explicitly hid it.
+ if parent.config.get("show_addresses_tab") is None:
+ # We unhide it because presumably they want to SEE
+ # their cash accounts now that they have them --
+ # and part of the UI is *IN* the Addresses tab.
+ parent.toggle_tab(parent.addresses_tab)
+ # Do same for console tab
+ if parent.config.get("show_contacts_tab") is None:
+ # We unhide it because presumably they want to SEE
+ # their cash accounts now that they have them --
+ # and part of the UI is *IN* the Console tab.
+ parent.toggle_tab(parent.contacts_tab)
+ if ca_txs:
+ # Notify contact_list of potentially unconfirmed txs
+ parent.contact_list.ca_update_potentially_unconfirmed_registrations(ca_txs)
+ if parent.wallet.storage.get('gui_notify_tx', True):
+ ca_text = ''
+ tok_text = ''
+ if n_cashacct > 1:
+ # plural
+ ca_text = " + " + _("{number_of_cashaccounts} Cash Accounts registrations").format(number_of_cashaccounts = n_cashacct)
+ elif n_cashacct == 1:
+ # singular
+ ca_text = " + " + _("1 Cash Accounts registration ({cash_accounts_name})").format(cash_accounts_name = last_seen_ca_name)
+ if token_category_ids:
+ n_cats = len(token_category_ids)
+ tok_text = " | " + ngettext("{n_cats} CashToken category", "{n_cats} CashToken categories",
+ n_cats).format(n_cats=n_cats)
+ n_nft_net = n_nfts_in - n_nfts_out
+ if n_nft_net > 0:
+ tok_text += " " + ngettext("with {n_in} NFT in", "with {n_in} NFTs in",
+ n_nft_net).format(n_in=n_nft_net)
+ elif n_nft_net < 0:
+ tok_text += " " + ngettext("with {n_out} NFT out", "with {n_out} NFTs out",
+ abs(n_nft_net)).format(n_out=abs(n_nft_net))
+ if total_amount > 0 or token_category_ids:
+ self.print_error("Notifying GUI %d tx"%(max(n_ok, n_cashacct)))
+ if max(n_ok, n_cashacct) > 1:
+ parent.notify(_("{} new transactions: {}")
+ .format(n_ok, parent.format_amount_and_units(total_amount, is_diff=True)) + ca_text + tok_text)
+ else:
+ parent.notify(_("New transaction: {}").format(parent.format_amount_and_units(total_amount, is_diff=True)) + ca_text + tok_text)
+ elif n_cashacct:
+ # No total amount (was just a cashacct reg tx)
+ ca_text = ca_text[3:] # pop off the " + "
+ if n_cashacct > 1:
+ parent.notify(_("{} new transactions: {}")
+ .format(n_cashacct, ca_text) + tok_text)
+ else:
+ parent.notify(_("New transaction: {}").format(ca_text) + tok_text)
diff --git a/gui/qt/network_dialog.py b/electroncash_gui/qt/network_dialog.py
similarity index 57%
rename from gui/qt/network_dialog.py
rename to electroncash_gui/qt/network_dialog.py
index a35d296d4195..6706c01bb68f 100644
--- a/gui/qt/network_dialog.py
+++ b/electroncash_gui/qt/network_dialog.py
@@ -3,6 +3,9 @@
# Electrum - lightweight Bitcoin client
# Copyright (C) 2012 thomasv@gitorious
#
+# Electron Cash - lightweight Bitcoin Cash client
+# Copyright (C) 2020 The Electron Cash Developers
+#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
# (the "Software"), to deal in the Software without restriction,
@@ -23,41 +26,76 @@
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
-import socket, queue
+import queue
+import socket
+import weakref
+from functools import partial
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import PyQt5.QtCore as QtCore
-from electroncash.i18n import _
from electroncash import networks
-from electroncash.util import print_error, Weak, PrintError
+from electroncash.i18n import _, pgettext
+from electroncash.interface import Interface
from electroncash.network import serialize_server, deserialize_server, get_eligible_servers
+from electroncash.plugins import run_hook
+from electroncash.simple_config import SimpleConfig
+from electroncash.tor import TorController
+from electroncash.util import print_error, Weak, PrintError, in_main_thread
from .util import *
+from .utils import UserPortValidator
protocol_names = ['TCP', 'SSL']
protocol_letters = 'ts'
-class NetworkDialog(QDialog, MessageBoxMixin):
+
+class NetworkDialog(MessageBoxMixin, OnDestroyedMixin, QDialog):
network_updated_signal = pyqtSignal()
def __init__(self, network, config):
QDialog.__init__(self)
+ OnDestroyedMixin.__init__(self)
+ self.weak_network = network and weakref.ref(network)
self.setWindowTitle(_('Network'))
self.setMinimumSize(500, 350)
self.nlayout = NetworkChoiceLayout(self, network, config)
vbox = QVBoxLayout(self)
vbox.addLayout(self.nlayout.layout())
- vbox.addLayout(Buttons(CloseButton(self)))
+ # We don't want the close button's behavior to have the enter key close
+ # the window because user may edit text fields, etc, so we do the below:
+ close_but = CloseButton(self); close_but.setDefault(False); close_but.setAutoDefault(False)
+ vbox.addLayout(Buttons(close_but))
self.network_updated_signal.connect(self.on_update)
+ # below timer is to work around Qt on Linux display glitches when
+ # showing this window.
+ self.workaround_timer = QTimer()
+ self.workaround_timer.timeout.connect(self._workaround_update)
+ self.workaround_timer.setSingleShot(True)
network.register_callback(self.on_network, ['blockchain_updated', 'interfaces', 'status'])
+ self.refresh_timer = QTimer(self)
+ self.refresh_timer.timeout.connect(self.network_updated_signal.emit)
+ self.refresh_timer.setInterval(500)
+
+ def on_destroyed(self, obj):
+ if self.is_destroyed:
+ return
+ OnDestroyedMixin.on_destroyed(self, obj)
+ network = self.weak_network and self.weak_network()
+ if network:
+ network.unregister_callback(self.on_network)
+ print_error("NetworkDialog: unregistered callback")
+
+ def jumpto(self, location : str):
+ self.nlayout.jumpto(location)
def on_network(self, event, *args):
''' This may run in network thread '''
#print_error("[NetworkDialog] on_network:",event,*args)
- self.network_updated_signal.emit() # this enqueues call to on_update in GUI thread
+ if not self.is_destroyed:
+ self.network_updated_signal.emit() # this enqueues call to on_update in GUI thread
@rate_limited(0.333) # limit network window updates to max 3 per second. More frequent isn't that useful anyway -- and on large wallets/big synchs the network spams us with events which we would rather collapse into 1
def on_update(self):
@@ -88,6 +126,28 @@ def closeEvent(self, e):
return
super().closeEvent(e)
+ def hideEvent(self, e):
+ super().hideEvent(e)
+ if not self.isVisible():
+ self.workaround_timer.stop()
+ self.refresh_timer.stop()
+
+ def showEvent(self, e):
+ super().showEvent(e)
+ if e.isAccepted():
+ # Single-shot. Works around Linux/Qt bugs
+ # -- see _workaround_update below for description.
+ self.workaround_timer.start(500)
+ self.refresh_timer.start()
+
+ def _workaround_update(self):
+ # Hack to work around strange behavior on some Linux:
+ # On some Linux systems (Debian based), the dialog sometimes is empty
+ # and glitchy if we don't do this. Note this .update() call is a Qt
+ # C++ QWidget::update() call and has nothing to do with our own
+ # same-named `update` methods.
+ QDialog.update(self)
+
class NodesListWidget(QTreeWidget):
@@ -95,7 +155,7 @@ class NodesListWidget(QTreeWidget):
def __init__(self, parent):
QTreeWidget.__init__(self)
self.parent = parent
- self.setHeaderLabels([_('Connected node'), _('Height')])
+ self.setHeaderLabels([_('Connected node'), '', _('Height')])
self.setContextMenuPolicy(Qt.CustomContextMenu)
self.customContextMenuRequested.connect(self.create_menu)
@@ -114,10 +174,12 @@ def create_menu(self, position):
menu.exec_(self.viewport().mapToGlobal(position))
def keyPressEvent(self, event):
- if event.key() in [ Qt.Key_F2, Qt.Key_Return ]:
- self.on_activated(self.currentItem(), self.currentColumn())
+ if event.key() in {Qt.Key_F2, Qt.Key_Return}:
+ item, col = self.currentItem(), self.currentColumn()
+ if item and col > -1:
+ self.on_activated(item, col)
else:
- QTreeWidget.keyPressEvent(self, event)
+ super().keyPressEvent(event)
def on_activated(self, item, column):
# on 'enter' we show the menu
@@ -125,49 +187,84 @@ def on_activated(self, item, column):
pt.setX(50)
self.customContextMenuRequested.emit(pt)
- def update(self, network):
+ def update(self, network, servers):
+ item = self.currentItem()
+ sel = None
+ if item:
+ sel = item.data(1, Qt.UserRole)
self.clear()
self.addChild = self.addTopLevelItem
chains = network.get_blockchains()
n_chains = len(chains)
+ restore_sel = None
for k, items in chains.items():
b = network.blockchains[k]
name = b.get_name()
- if n_chains >1:
- x = QTreeWidgetItem([name + '@%d'%b.get_base_height(), '%d'%b.height()])
+ if n_chains > 1:
+ x = QTreeWidgetItem([name + '@%d'%b.get_base_height(), '', '%d'%b.height()])
x.setData(0, Qt.UserRole, 1)
x.setData(1, Qt.UserRole, b.base_height)
else:
- x = self
+ x = self.invisibleRootItem()
for i in items:
star = ' ◀' if i == network.interface else ''
- item = QTreeWidgetItem([i.host + star, '%d'%i.tip])
+
+ display_text = i.host
+ is_onion = i.host.lower().endswith('.onion')
+ if is_onion and i.host in servers and 'display' in servers[i.host]:
+ display_text = servers[i.host]['display'] + ' (.onion)'
+
+ item = QTreeWidgetItem([display_text + star, '', '%d'%i.tip])
item.setData(0, Qt.UserRole, 0)
item.setData(1, Qt.UserRole, i.server)
+ if i.server == sel:
+ restore_sel = item
+ if is_onion:
+ item.setIcon(1, QIcon(":icons/tor_logo.svg"))
x.addChild(item)
- if n_chains>1:
+ if n_chains > 1:
self.addTopLevelItem(x)
x.setExpanded(True)
+ # restore selection, if there was any
+ if restore_sel:
+ val = self.hasAutoScroll()
+ self.setAutoScroll(False) # prevent automatic scrolling when we do this which may annoy user / appear glitchy
+ self.setCurrentItem(restore_sel)
+ self.setAutoScroll(val)
+
h = self.header()
h.setStretchLastSection(False)
h.setSectionResizeMode(0, QHeaderView.Stretch)
h.setSectionResizeMode(1, QHeaderView.ResizeToContents)
+ h.setSectionResizeMode(2, QHeaderView.ResizeToContents)
+
class ServerFlag:
''' Used by ServerListWidget for Server flags & Symbols '''
+ BadCertificate = 4 # Servers with a bad certificate.
Banned = 2 # Blacklisting/banning was a hidden mechanism inherited from Electrum. We would blacklist misbehaving servers under the hood. Now that facility is exposed (editable by the user). We never connect to blacklisted servers.
Preferred = 1 # Preferred servers (white-listed) start off as the servers in servers.json and are "more trusted" and optionally the user can elect to connect to only these servers
NoFlag = 0
- Symbol = ("", "★", "⛔") # indexed using pseudo-enum above
- UnSymbol = ("", "✖", "⚬") # used for "disable X" context menu
+ Symbol = {
+ NoFlag: "",
+ Preferred: "⭐",
+ Banned: "⛔",
+ BadCertificate: "❗️"
+ }
+ UnSymbol = { # used for "disable X" context menu
+ NoFlag: "",
+ Preferred: "❌",
+ Banned: "✅",
+ BadCertificate: ""
+ }
class ServerListWidget(QTreeWidget):
def __init__(self, parent):
QTreeWidget.__init__(self)
self.parent = parent
- self.setHeaderLabels(['', _('Host'), _('Port')])
+ self.setHeaderLabels(['', _('Host'), '', _('Port')])
self.setContextMenuPolicy(Qt.CustomContextMenu)
self.customContextMenuRequested.connect(self.create_menu)
@@ -200,8 +297,16 @@ def create_menu(self, position):
optxt_fav = ServerFlag.Symbol[ServerFlag.Preferred] + " " + _("Add to preferred")
menu.addAction(optxt_fav, lambda: self.parent.set_whitelisted(server, not iswl))
menu.addAction(optxt, lambda: self.parent.set_blacklisted(server, not isbl))
+ if flagval & ServerFlag.BadCertificate:
+ optxt = ServerFlag.UnSymbol[ServerFlag.BadCertificate] + " " + _("Remove pinned certificate")
+ menu.addAction(optxt, partial(self.on_remove_pinned_certificate, server))
menu.exec_(self.viewport().mapToGlobal(position))
+ def on_remove_pinned_certificate(self, server):
+ if not self.parent.remove_pinned_certificate(server):
+ QMessageBox.critical(None, _("Remove pinned certificate"),
+ _("Failed to remove the pinned certificate. Check the log for errors."))
+
def set_server(self, s):
host, port, protocol = deserialize_server(s)
self.parent.server_host.setText(host)
@@ -212,9 +317,11 @@ def set_server(self, s):
def keyPressEvent(self, event):
if event.key() in [ Qt.Key_F2, Qt.Key_Return ]:
- self.on_activated(self.currentItem(), self.currentColumn())
+ item, col = self.currentItem(), self.currentColumn()
+ if item and col > -1:
+ self.on_activated(item, col)
else:
- QTreeWidget.keyPressEvent(self, event)
+ super().keyPressEvent(event)
def on_activated(self, item, column):
# on 'enter' we show the menu
@@ -230,51 +337,90 @@ def lightenItemText(item, rang=None):
item.setForeground(i, brush)
def update(self, network, servers, protocol, use_tor):
+ sel_item = self.currentItem()
+ sel = sel_item.data(2, Qt.UserRole) if sel_item else None
+ restore_sel = None
self.clear()
self.setIndentation(0)
wl_only = network.is_whitelist_only()
for _host, d in sorted(servers.items()):
- if _host.lower().endswith('.onion') and not use_tor:
+ is_onion = _host.lower().endswith('.onion')
+ if is_onion and not use_tor:
continue
port = d.get(protocol)
if port:
server = serialize_server(_host, port, protocol)
- flag, flagval, tt = (ServerFlag.Symbol[ServerFlag.Banned], ServerFlag.Banned, _("This server is banned")) if network.server_is_blacklisted(server) else ("", 0, "")
- flag2, flagval2, tt2 = (ServerFlag.Symbol[ServerFlag.Preferred], ServerFlag.Preferred, _("This is a preferred server")) if network.server_is_whitelisted(server) else ("", 0, "")
- flag = flag or flag2; del flag2
- tt = tt or tt2; del tt2
- flagval |= flagval2; del flagval2
- x = QTreeWidgetItem([flag, _host, port])
+
+ flag = ""
+ flagval = 0
+ tt = ""
+
+ if network.server_is_blacklisted(server):
+ flagval |= ServerFlag.Banned
+ if network.server_is_whitelisted(server):
+ flagval |= ServerFlag.Preferred
+ if network.server_is_bad_certificate(server):
+ flagval |= ServerFlag.BadCertificate
+
+ if flagval & ServerFlag.Banned:
+ flag = ServerFlag.Symbol[ServerFlag.Banned]
+ tt = _("This server is banned")
+ elif flagval & ServerFlag.BadCertificate:
+ flag = ServerFlag.Symbol[ServerFlag.BadCertificate]
+ tt = _("This server's pinned certificate mismatches its current certificate")
+ elif flagval & ServerFlag.Preferred:
+ flag = ServerFlag.Symbol[ServerFlag.Preferred]
+ tt = _("This is a preferred server")
+
+ display_text = _host
+ if is_onion and 'display' in d:
+ display_text = d['display'] + ' (.onion)'
+
+ x = QTreeWidgetItem([flag, display_text, '', port])
+ if is_onion:
+ x.setIcon(2, QIcon(":icons/tor_logo.svg"))
if tt: x.setToolTip(0, tt)
- if (wl_only and flagval != ServerFlag.Preferred) or flagval & ServerFlag.Banned:
+ if (wl_only and not flagval & ServerFlag.Preferred) or flagval & ServerFlag.Banned:
# lighten the text of servers we can't/won't connect to for the given mode
- self.lightenItemText(x, range(1,3))
+ self.lightenItemText(x, range(1,4))
x.setData(2, Qt.UserRole, server)
x.setData(0, Qt.UserRole, flagval)
+ x.setTextAlignment(0, Qt.AlignHCenter)
self.addTopLevelItem(x)
+ if server == sel:
+ restore_sel = x
h = self.header()
h.setStretchLastSection(False)
h.setSectionResizeMode(0, QHeaderView.ResizeToContents)
h.setSectionResizeMode(1, QHeaderView.Stretch)
h.setSectionResizeMode(2, QHeaderView.ResizeToContents)
+ h.setSectionResizeMode(3, QHeaderView.ResizeToContents)
+ # restore selection
+ if restore_sel:
+ val = self.hasAutoScroll()
+ self.setAutoScroll(False) # prevent automatic scrolling when we do this which may annoy user / appear glitchy
+ self.setCurrentItem(restore_sel)
+ self.setAutoScroll(val)
-class NetworkChoiceLayout(QObject, PrintError):
+
+class NetworkChoiceLayout(QObject, OnDestroyedMixin, PrintError):
def __init__(self, parent, network, config, wizard=False):
- super().__init__(parent)
+ QObject.__init__(self, parent)
+ OnDestroyedMixin.__init__(self)
self.network = network
self.config = config
self.protocol = None
self.tor_proxy = None
# tor detector
- self.td = TorDetector(self)
+ self.td = TorDetector(self, self.network)
self.td.found_proxy.connect(self.suggest_proxy)
self.tabs = tabs = QTabWidget()
- server_tab = QWidget()
+ self.server_tab = server_tab = QWidget()
weakTd = Weak.ref(self.td)
class ProxyTab(QWidget):
def showEvent(slf, e):
@@ -287,8 +433,9 @@ def hideEvent(slf, e):
td = weakTd()
if e.isAccepted() and td:
td.stop() # stops the tor detector when proxy_tab disappears
- proxy_tab = ProxyTab()
- blockchain_tab = QWidget()
+ self.proxy_tab = proxy_tab = ProxyTab()
+ self.blockchain_tab = blockchain_tab = QWidget()
+
tabs.addTab(blockchain_tab, _('Overview'))
tabs.addTab(server_tab, _('Server'))
tabs.addTab(proxy_tab, _('Proxy'))
@@ -351,6 +498,7 @@ def hideEvent(slf, e):
self.servers_list = ServerListWidget(self)
grid.addWidget(self.servers_list, 5, 0, 1, 5)
self.legend_label = label = WWLabel('') # will get populated with the legend by self.update()
+ label.setTextInteractionFlags(label.textInteractionFlags() & (~Qt.TextSelectableByMouse)) # disable text selection by mouse here
self.legend_label.linkActivated.connect(self.on_view_blacklist)
grid.addWidget(label, 6, 0, 1, 4)
msg = ' '.join([
@@ -367,6 +515,7 @@ def hideEvent(slf, e):
# proxy setting
self.proxy_cb = QCheckBox(_('Use proxy'))
+ self.proxy_cb.setToolTip(_("If enabled, all connections application-wide will be routed through this proxy."))
self.proxy_cb.clicked.connect(self.check_disable_proxy)
self.proxy_cb.clicked.connect(self.set_proxy)
@@ -389,68 +538,227 @@ def hideEvent(slf, e):
self.proxy_user.editingFinished.connect(self.set_proxy)
self.proxy_password.editingFinished.connect(self.set_proxy)
- self.proxy_mode.currentIndexChanged.connect(self.proxy_settings_changed)
- self.proxy_host.textEdited.connect(self.proxy_settings_changed)
- self.proxy_port.textEdited.connect(self.proxy_settings_changed)
- self.proxy_user.textEdited.connect(self.proxy_settings_changed)
- self.proxy_password.textEdited.connect(self.proxy_settings_changed)
-
self.tor_cb = QCheckBox(_("Use Tor Proxy"))
- self.tor_cb.setIcon(QIcon(":icons/tor_logo.png"))
- self.tor_cb.hide()
+ self.tor_cb.setIcon(QIcon(":icons/tor_logo.svg"))
+ self.tor_cb.setEnabled(False)
self.tor_cb.clicked.connect(self.use_tor_proxy)
-
- grid.addWidget(self.tor_cb, 1, 0, 1, 3)
- grid.addWidget(self.proxy_cb, 2, 0, 1, 3)
- grid.addWidget(HelpButton(_('Proxy settings apply to all connections: with Electron Cash servers, but also with third-party services.')), 2, 4)
- grid.addWidget(self.proxy_mode, 4, 1)
- grid.addWidget(self.proxy_host, 4, 2)
- grid.addWidget(self.proxy_port, 4, 3)
- grid.addWidget(self.proxy_user, 5, 2)
- grid.addWidget(self.proxy_password, 5, 3)
- grid.setRowStretch(7, 1)
+ tor_proxy_tooltip = _("If enabled, all connections application-wide will be routed through Tor.")
+ tor_proxy_help = (
+ tor_proxy_tooltip + "\n\n" +
+ _("Depending on your configuration and preferences as a user, this may or may not be ideal. "
+ "In general, connections routed through Tor hide your IP address from servers, at the expense of "
+ "performance and network throughput.") + "\n\n" +
+ _("For the average user, it's recommended that you leave this option "
+ "disabled and only leave the 'Start Tor client' option enabled.") )
+ self.tor_cb.setToolTip(tor_proxy_tooltip)
+
+ self.tor_enabled = QCheckBox()
+ self.tor_enabled.setIcon(QIcon(":icons/tor_logo.svg"))
+ self.tor_enabled.clicked.connect(self.set_tor_enabled)
+ self.tor_enabled.setChecked(self.network.tor_controller.is_enabled())
+ self.tor_enabled_help = HelpButton('')
+
+ self.tor_custom_port_cb = QCheckBox(_("Custom port"))
+ self.tor_enabled.clicked.connect(self.tor_custom_port_cb.setEnabled)
+ self.tor_custom_port_cb.setChecked(bool(self.network.tor_controller.get_socks_port()))
+ self.tor_custom_port_cb.clicked.connect(self.on_custom_port_cb_click)
+ custom_port_tooltip = _("Leave unspecified to automatically allocate a port.")
+ self.tor_custom_port_cb.setToolTip(custom_port_tooltip)
+ self.network.tor_controller.status_changed.append_weak(self.on_tor_status_changed)
+
+ self.tor_socks_port = QLineEdit()
+ self.tor_socks_port.setFixedWidth(60)
+ self.tor_socks_port.editingFinished.connect(self.set_tor_socks_port)
+ self.tor_socks_port.setText(str(self.network.tor_controller.get_socks_port()))
+ self.tor_socks_port.setToolTip(custom_port_tooltip)
+ self.tor_socks_port.setValidator(UserPortValidator(self.tor_socks_port, accept_zero=True))
+
+ self.update_tor_enabled()
+
+ # Start Tor
+ grid.addWidget(self.tor_enabled, 1, 0, 1, 2)
+ grid.addWidget(self.tor_enabled_help, 1, 4)
+ # Custom Tor port
+ hbox = QHBoxLayout()
+ hbox.addSpacing(20) # indentation
+ hbox.addWidget(self.tor_custom_port_cb, 0, Qt.AlignLeft|Qt.AlignVCenter)
+ hbox.addWidget(self.tor_socks_port, 0, Qt.AlignLeft|Qt.AlignVCenter)
+ hbox.addStretch(2)
+ hbox.setContentsMargins(0,0,0,6) # a bit of a "paragraph break" here
+ grid.addLayout(hbox, 2, 0, 1, 3)
+ grid.addWidget(HelpButton(custom_port_tooltip), 2, 4)
+ # Use Tor Proxy
+ grid.addWidget(self.tor_cb, 3, 0, 1, 3)
+ grid.addWidget(HelpButton(tor_proxy_help), 3, 4)
+ # Proxy settings
+ grid.addWidget(self.proxy_cb, 4, 0, 1, 3)
+ grid.addWidget(HelpButton(_('Proxy settings apply to all connections: with Electron Cash servers, but also with third-party services.')), 4, 4)
+ grid.addWidget(self.proxy_mode, 6, 1)
+ grid.addWidget(self.proxy_host, 6, 2)
+ grid.addWidget(self.proxy_port, 6, 3)
+ grid.addWidget(self.proxy_user, 7, 2)
+ grid.addWidget(self.proxy_password, 7, 3)
+ grid.setRowStretch(8, 1)
# Blockchain Tab
grid = QGridLayout(blockchain_tab)
- msg = ' '.join([
+ msg = ' '.join([
_("Electron Cash connects to several nodes in order to download block headers and find out the longest blockchain."),
_("This blockchain is used to verify the transactions sent by your transaction server.")
])
+ row = 0
self.status_label = QLabel('')
- grid.addWidget(QLabel(_('Status') + ':'), 0, 0)
- grid.addWidget(self.status_label, 0, 1, 1, 3)
- grid.addWidget(HelpButton(msg), 0, 4)
+ self.status_label.setTextInteractionFlags(self.status_label.textInteractionFlags() | Qt.TextSelectableByMouse)
+ grid.addWidget(QLabel(_('Status') + ':'), row, 0)
+ grid.addWidget(self.status_label, row, 1, 1, 3)
+ grid.addWidget(HelpButton(msg), row, 4)
+ row += 1
self.server_label = QLabel('')
+ self.server_label.setTextInteractionFlags(self.server_label.textInteractionFlags() | Qt.TextSelectableByMouse)
msg = _("Electron Cash sends your wallet addresses to a single server, in order to receive your transaction history.")
- grid.addWidget(QLabel(_('Server') + ':'), 1, 0)
- grid.addWidget(self.server_label, 1, 1, 1, 3)
- grid.addWidget(HelpButton(msg), 1, 4)
+ grid.addWidget(QLabel(_('Server') + ':'), row, 0)
+ grid.addWidget(self.server_label, row, 1, 1, 3)
+ grid.addWidget(HelpButton(msg), row, 4)
+ row += 1
self.height_label = QLabel('')
+ self.height_label.setTextInteractionFlags(self.height_label.textInteractionFlags() | Qt.TextSelectableByMouse)
msg = _('This is the height of your local copy of the blockchain.')
- grid.addWidget(QLabel(_('Blockchain') + ':'), 2, 0)
- grid.addWidget(self.height_label, 2, 1)
- grid.addWidget(HelpButton(msg), 2, 4)
+ grid.addWidget(QLabel(_('Blockchain') + ':'), row, 0)
+ grid.addWidget(self.height_label, row, 1)
+ grid.addWidget(HelpButton(msg), row, 4)
+ row += 1
+
+ self.reqs_label = QLabel('')
+ self.reqs_label.setTextInteractionFlags(self.height_label.textInteractionFlags() | Qt.TextSelectableByMouse)
+ msg = _('The number of unanswered network requests.\n\n'
+ "You can configure:\n\n"
+ " - Limit: maximum request backlog size\n"
+ " - ChunkSize: requests to enqueue every 100ms\n\n"
+ "If the connection drops when synchronizing, you may wish "
+ "to reduce these values to throttle requests to the server.")
+ grid.addWidget(QLabel(_('Pending requests') + ':'), row, 0)
+ hbox = QHBoxLayout()
+ hbox.addWidget(self.reqs_label)
+ hbox.setContentsMargins(0, 0, 12, 0)
+ hbox.addWidget(QLabel(_("Limit:")))
+ self.req_max_sb = sb = QSpinBox()
+ sb.setRange(1, 2000)
+ sb.setFocusPolicy(Qt.TabFocus|Qt.ClickFocus|Qt.WheelFocus)
+ hbox.addWidget(sb)
+ hbox.addWidget(QLabel(_("ChunkSize:")))
+ self.req_chunk_sb = sb = QSpinBox()
+ sb.setRange(1, 100)
+ sb.setFocusPolicy(Qt.TabFocus|Qt.ClickFocus|Qt.WheelFocus)
+ hbox.addWidget(sb)
+ but = QPushButton(_("Reset"))
+ f = but.font()
+ f.setPointSize(f.pointSize()-2)
+ but.setFont(f)
+ but.setDefault(False); but.setAutoDefault(False)
+ hbox.addWidget(but)
+ grid.addLayout(hbox, row, 1, 1, 3)
+ grid.setAlignment(hbox, Qt.AlignLeft|Qt.AlignVCenter)
+ grid.setColumnStretch(3, 1)
+ grid.addWidget(HelpButton(msg), row, 4)
+ row += 1
+ def req_max_changed(val):
+ Interface.set_req_throttle_params(self.config, max=val)
+ def req_chunk_changed(val):
+ Interface.set_req_throttle_params(self.config, chunkSize=val)
+ def req_defaults():
+ p = Interface.req_throttle_default
+ Interface.set_req_throttle_params(self.config, max=p.max, chunkSize=p.chunkSize)
+ self.update()
+ but.clicked.connect(req_defaults)
+ self.req_max_sb.valueChanged.connect(req_max_changed)
+ self.req_chunk_sb.valueChanged.connect(req_chunk_changed)
self.split_label = QLabel('')
- grid.addWidget(self.split_label, 3, 0, 1, 3)
+ self.split_label.setTextInteractionFlags(self.split_label.textInteractionFlags() | Qt.TextSelectableByMouse)
+ grid.addWidget(self.split_label, row, 0, 1, 3)
+ row += 2
self.nodes_list_widget = NodesListWidget(self)
- grid.addWidget(self.nodes_list_widget, 5, 0, 1, 5)
+ grid.addWidget(self.nodes_list_widget, row, 0, 1, 5)
+ row += 1
vbox = QVBoxLayout()
vbox.addWidget(tabs)
self.layout_ = vbox
+ self.network.tor_controller.active_port_changed.append_weak(self.on_tor_port_changed)
+
+ self.network.server_list_updated.append_weak(self.on_server_list_updated)
+
self.fill_in_proxy_settings()
self.update()
+ _tor_client_names = {
+ TorController.BinaryType.MISSING: _('Tor'),
+ TorController.BinaryType.SYSTEM: _('system Tor'),
+ TorController.BinaryType.INTEGRATED: _('integrated Tor')
+ }
+
+ def update_tor_enabled(self, *args):
+ tbt = self.network.tor_controller.tor_binary_type
+ tbname = self._tor_client_names[tbt]
+
+ self.tor_enabled.setText(_("Start {tor_binary_name} client").format(
+ tor_binary_name=tbname,
+ tor_binary_name_capitalized=tbname[:1].upper() + tbname[1:]
+ ))
+ avalable = tbt != TorController.BinaryType.MISSING
+ self.tor_enabled.setEnabled(avalable)
+ self.tor_custom_port_cb.setEnabled(avalable and self.tor_enabled.isChecked())
+ self.tor_socks_port.setEnabled(avalable and self.tor_custom_port_cb.isChecked())
+
+ tor_enabled_tooltip = [_("This will start a private instance of the Tor proxy controlled by Electron Cash.")]
+ if not avalable:
+ tor_enabled_tooltip.insert(0, _("This feature is unavailable because no Tor binary was found."))
+ tor_enabled_tooltip_text = ' '.join(tor_enabled_tooltip)
+ self.tor_enabled.setToolTip(tor_enabled_tooltip_text)
+ self.tor_enabled_help.help_text = (
+ tor_enabled_tooltip_text + "\n\n"
+ + _("If unsure, it's safe to enable this feature, and leave 'Use Tor Proxy' disabled. "
+ "In that situation, only certain plugins (such as CashFusion) will use Tor, but your "
+ "regular SPV server connections will remain unaffected.") )
+
+ def jumpto(self, location : str):
+ if not isinstance(location, str):
+ return
+ location = location.strip().lower()
+ if location in ('proxy', 'tor'):
+ self.tabs.setCurrentWidget(self.proxy_tab)
+ elif location in ('servers', 'server'):
+ self.tabs.setCurrentWidget(self.server_tab)
+ elif location in ('blockchain', 'overview', 'main'):
+ self.tabs.setCurrentWidget(self.blockchain_tab)
+ elif not run_hook('on_network_dialog_jumpto', self, location):
+ self.print_error(f"jumpto: unknown location '{location}'")
+
+ @in_main_thread
+ def on_tor_port_changed(self, controller: TorController):
+ if self.is_destroyed or not controller.active_socks_port or not controller.is_enabled() or not self.tor_use:
+ return
+
+ # The Network class handles actually changing the port, we just
+ # set the value in the text box here.
+ self.proxy_port.setText(str(controller.active_socks_port))
+
+ @in_main_thread
+ def on_server_list_updated(self):
+ self.update()
+
def check_disable_proxy(self, b):
if not self.config.is_modifiable('proxy'):
b = False
+ if self.tor_use:
+ # Disallow changing the proxy settings when Tor is in use
+ b = False
for w in [self.proxy_mode, self.proxy_host, self.proxy_port, self.proxy_user, self.proxy_password]:
- w.setEnabled(b)
+ w.setEnabled(bool(b))
def get_set_server_flags(self):
return (self.config.is_modifiable('server'),
@@ -477,8 +785,9 @@ def enable_set_server(self):
def update(self):
host, port, protocol, proxy_config, auto_connect = self.network.get_parameters()
preferred_only = self.network.is_whitelist_only()
- self.server_host.setText(host)
- self.server_port.setText(port)
+ if not self.server_host.hasFocus() and not self.server_port.hasFocus():
+ self.server_host.setText(host)
+ self.server_port.setText(port)
self.ssl_cb.setChecked(protocol=='s')
ssl_disable = self.ssl_cb.isChecked() and not self.tor_cb.isChecked() and not host.lower().endswith('.onion')
for w in [self.ssl_cb]:#, self.ssl_help]:
@@ -486,11 +795,15 @@ def update(self):
self.autoconnect_cb.setChecked(auto_connect)
self.preferred_only_cb.setChecked(preferred_only)
- host = self.network.interface.host if self.network.interface else _('None')
+ self.servers = self.network.get_servers()
+
+ host = self.network.interface.host if self.network.interface else pgettext('Referencing server', 'None')
+ is_onion = host.lower().endswith('.onion')
+ if is_onion and host in self.servers and 'display' in self.servers[host]:
+ host = self.servers[host]['display'] + ' (.onion)'
self.server_label.setText(host)
self.set_protocol(protocol)
- self.servers = self.network.get_servers()
def protocol_suffix():
if protocol == 't':
return ' (non-SSL)'
@@ -526,14 +839,26 @@ def protocol_suffix():
msg += ' (%d %s)' % (chain.get_branch_size(), _('blocks'))
else:
msg = ''
+
self.split_label.setText(msg)
- self.nodes_list_widget.update(self.network)
+
+ self.reqs_label.setText(str((self.network.interface and len(self.network.interface.unanswered_requests)) or 0))
+ params = Interface.get_req_throttle_params(self.config)
+ self.req_max_sb.setValue(params.max)
+ self.req_chunk_sb.setValue(params.chunkSize)
+
+ self.nodes_list_widget.update(self.network, self.servers)
def fill_in_proxy_settings(self):
host, port, protocol, proxy_config, auto_connect = self.network.get_parameters()
if not proxy_config:
proxy_config = {"mode": "none", "host": "localhost", "port": "9050"}
+ # We need to restore the "Use tor" checkbox as its value is needed in the server
+ # list, to determine whether to show .onion servers, before the TorDetector
+ # has been started.
+ self._set_tor_use(self.config.get('tor_use', False))
+
b = proxy_config.get('mode') != "none"
self.check_disable_proxy(b)
if b:
@@ -619,31 +944,39 @@ def set_server(self, onion_hack=False):
def set_proxy(self):
host, port, protocol, proxy, auto_connect = self.network.get_parameters()
if self.proxy_cb.isChecked():
- proxy = { 'mode':str(self.proxy_mode.currentText()).lower(),
- 'host':str(self.proxy_host.text()),
- 'port':str(self.proxy_port.text()),
- 'user':str(self.proxy_user.text()),
- 'password':str(self.proxy_password.text())}
+ proxy = {'mode':str(self.proxy_mode.currentText()).lower(),
+ 'host':str(self.proxy_host.text()),
+ 'port':str(self.proxy_port.text()),
+ 'user':str(self.proxy_user.text()),
+ 'password':str(self.proxy_password.text())}
else:
proxy = None
- self.tor_cb.setChecked(False)
self.network.set_parameters(host, port, protocol, proxy, auto_connect)
def suggest_proxy(self, found_proxy):
if not found_proxy:
- self.tor_cb.hide()
- self.tor_cb.setChecked(False) # It's not clear to me that if the tor service goes away and comes back later, and in the meantime they unchecked proxy_cb, that this should remain checked. I can see it being confusing for that to be the case. Better to uncheck. It gets auto-re-checked anyway if it comes back and it's the same due to code below. -Calin
+ self.tor_cb.setEnabled(False)
+ self._set_tor_use(False) # It's not clear to me that if the tor service goes away and comes back later, and in the meantime they unchecked proxy_cb, that this should remain checked. I can see it being confusing for that to be the case. Better to uncheck. It gets auto-re-checked anyway if it comes back and it's the same due to code below. -Calin
return
self.tor_proxy = found_proxy
- self.tor_cb.setText("Use Tor proxy at port " + str(found_proxy[1]))
- if (self.proxy_mode.currentIndex() == self.proxy_mode.findText('SOCKS5')
+ self.tor_cb.setText(_("Use Tor proxy at port {tor_port}").format(tor_port = found_proxy[1]))
+ same_proxy = (self.proxy_mode.currentIndex() == self.proxy_mode.findText('SOCKS5')
and self.proxy_host.text() == found_proxy[0]
and self.proxy_port.text() == str(found_proxy[1])
- and self.proxy_cb.isChecked()):
- self.tor_cb.setChecked(True)
- self.tor_cb.show()
+ and self.proxy_cb.isChecked())
+ self._set_tor_use(same_proxy)
+ self.tor_cb.setEnabled(True)
+
+ def _set_tor_use(self, use_it):
+ self.tor_use = use_it
+ self.config.set_key('tor_use', self.tor_use)
+ self.tor_cb.setChecked(self.tor_use)
+ self.proxy_cb.setEnabled(not self.tor_use)
+ self.check_disable_proxy(not self.tor_use)
def use_tor_proxy(self, use_it):
+ self._set_tor_use(use_it)
+
if not use_it:
self.proxy_cb.setChecked(False)
else:
@@ -656,14 +989,37 @@ def use_tor_proxy(self, use_it):
self.proxy_port.setText(str(self.tor_proxy[1]))
self.proxy_user.setText("")
self.proxy_password.setText("")
- self.tor_cb.setChecked(True)
self.proxy_cb.setChecked(True)
- self.check_disable_proxy(use_it)
self.set_proxy()
+ def set_tor_enabled(self, enabled: bool):
+ self.network.tor_controller.set_enabled(enabled)
+
+ @in_main_thread
+ def on_tor_status_changed(self, controller):
+ if self.is_destroyed:
+ return
+ if controller.status == TorController.Status.ERRORED and self.tabs.isVisible():
+ tbname = self._tor_client_names[self.network.tor_controller.tor_binary_type]
+ msg = _("The {tor_binary_name} client experienced an error or could not be started.").format(tor_binary_name=tbname)
+ QMessageBox.critical(None, _("Tor Client Error"), msg)
+
+ def set_tor_socks_port(self):
+ socks_port = int(self.tor_socks_port.text())
+ self.network.tor_controller.set_socks_port(socks_port)
+
+ def on_custom_port_cb_click(self, b):
+ self.tor_socks_port.setEnabled(bool(b))
+ if not b:
+ self.tor_socks_port.setText("0")
+ self.set_tor_socks_port()
+
def proxy_settings_changed(self):
self.tor_cb.setChecked(False)
+ def remove_pinned_certificate(self, server):
+ return self.network.remove_pinned_certificate(server)
+
def set_blacklisted(self, server, bl):
self.network.server_set_blacklisted(server, bl, True)
self.set_server() # if the blacklisted server is the active server, this will force a reconnect to another server
@@ -722,9 +1078,21 @@ def on_clear_blacklist(self):
return False
-class TorDetector(QThread):
+class TorDetector(QThread, OnDestroyedMixin):
found_proxy = pyqtSignal(object)
+ def __init__(self, parent, network):
+ QThread.__init__(self, parent)
+ OnDestroyedMixin.__init__(self)
+ self.network = network
+ self.network.tor_controller.active_port_changed.append_weak(self.on_tor_port_changed)
+
+ def on_tor_port_changed(self, controller: TorController):
+ if self.is_destroyed:
+ return
+ if controller.active_socks_port and self.isRunning():
+ self.stopQ.put('kick')
+
def start(self):
self.stopQ = queue.Queue() # create a new stopQ blowing away the old one just in case it has old data in it (this prevents races with stop/start arriving too quickly for the thread)
super().start()
@@ -732,10 +1100,15 @@ def start(self):
def stop(self):
if self.isRunning():
self.stopQ.put(None)
+ self.wait()
def run(self):
- ports = [9050, 9150] # Probable ports for Tor to listen at
while True:
+ ports = [9050, 9150] # Probable ports for Tor to listen at
+
+ if self.network.tor_controller and self.network.tor_controller.is_enabled() and self.network.tor_controller.active_socks_port:
+ ports.insert(0, self.network.tor_controller.active_socks_port)
+
for p in ports:
if TorDetector.is_tor_port(p):
self.found_proxy.emit(("127.0.0.1", p))
@@ -743,8 +1116,13 @@ def run(self):
else:
self.found_proxy.emit(None) # no proxy found, will hide the Tor checkbox
try:
- self.stopQ.get(timeout=10.0) # keep trying every 10 seconds
- return # we must have gotten a stop signal if we get here, break out of function, ending thread
+ stopq = self.stopQ.get(timeout=10.0) # keep trying every 10 seconds
+ if stopq is None:
+ return # we must have gotten a stop signal if we get here, break out of function, ending thread
+ # We were kicked, which means the tor port changed.
+ # Run the detection after a slight delay which increases the reliability.
+ QThread.msleep(250)
+ continue
except queue.Empty:
continue # timeout, keep looping
diff --git a/gui/qt/password_dialog.py b/electroncash_gui/qt/password_dialog.py
similarity index 70%
rename from gui/qt/password_dialog.py
rename to electroncash_gui/qt/password_dialog.py
index d54f9557d9ef..fa07786c90e1 100644
--- a/gui/qt/password_dialog.py
+++ b/electroncash_gui/qt/password_dialog.py
@@ -23,16 +23,19 @@
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
-from PyQt5.QtCore import Qt
-from PyQt5.QtGui import *
-from PyQt5.QtWidgets import *
-from electroncash.i18n import _
-from .util import *
import re
import math
+from PyQt5.QtCore import Qt
+from PyQt5.QtGui import QIcon
+from PyQt5.QtWidgets import QLineEdit, QVBoxLayout, QLabel, QGridLayout, QCheckBox
+
+from electroncash.i18n import _
+
from electroncash.plugins import run_hook
+from .util import WindowModalDialog, OkButton, Buttons, CancelButton
+
def check_password_strength(password):
'''
@@ -45,7 +48,7 @@ def check_password_strength(password):
num = re.search("[0-9]", password) is not None and re.match("^[0-9]*$", password) is None
caps = password != password.upper() and password != password.lower()
extra = re.match("^[a-zA-Z0-9]*$", password) is None
- score = len(password)*( n + caps + num + extra)/20
+ score = len(password)*(n + caps + num + extra)/20
password_strength = {0:"Weak",1:"Medium",2:"Strong",3:"Very Strong"}
return password_strength[min(3, int(score))]
@@ -53,21 +56,24 @@ def check_password_strength(password):
PW_NEW, PW_CHANGE, PW_PASSPHRASE = range(0, 3)
-class PasswordLayout(object):
+class PasswordLayout:
titles = [_("Enter Password"), _("Change Password"), _("Enter Passphrase")]
- def __init__(self, wallet, msg, kind, OK_button):
+ def __init__(self, wallet, msg, kind, OK_button, *, permit_empty=True):
self.wallet = wallet
+ self.permit_empty = bool(permit_empty)
self.pw = QLineEdit()
- self.pw.setEchoMode(2)
+ self.pw.setEchoMode(QLineEdit.Password)
self.new_pw = QLineEdit()
- self.new_pw.setEchoMode(2)
+ self.new_pw.setEchoMode(QLineEdit.Password)
self.conf_pw = QLineEdit()
- self.conf_pw.setEchoMode(2)
+ self.conf_pw.setEchoMode(QLineEdit.Password)
self.kind = kind
self.OK_button = OK_button
+ self.all_lineedits = ( self.pw, self.new_pw, self.conf_pw )
+ self.pw_strength = None # Will be a QLabel if kind != PW_PASSPHRASE
vbox = QVBoxLayout()
label = QLabel(msg + "\n")
@@ -75,9 +81,7 @@ def __init__(self, wallet, msg, kind, OK_button):
grid = QGridLayout()
grid.setSpacing(8)
- grid.setColumnMinimumWidth(0, 150)
- grid.setColumnMinimumWidth(1, 100)
- grid.setColumnStretch(1,1)
+ grid.setColumnStretch(1, 1)
if kind == PW_PASSPHRASE:
vbox.addWidget(label)
@@ -99,17 +103,17 @@ def __init__(self, wallet, msg, kind, OK_button):
msgs = [m1, _('Confirm Password:')]
if wallet and wallet.has_password():
grid.addWidget(QLabel(_('Current Password:')), 0, 0)
- grid.addWidget(self.pw, 0, 1)
- lockfile = ":icons/lock.png"
+ grid.addWidget(self.pw, 0, 1, 1, -1)
+ lockfile = ":icons/lock.svg"
else:
- lockfile = ":icons/unlock.png"
- logo.setPixmap(QPixmap(lockfile).scaledToWidth(36))
+ lockfile = ":icons/unlock.svg"
+ logo.setPixmap(QIcon(lockfile).pixmap(36))
grid.addWidget(QLabel(msgs[0]), 1, 0)
- grid.addWidget(self.new_pw, 1, 1)
+ grid.addWidget(self.new_pw, 1, 1, 1, -1)
grid.addWidget(QLabel(msgs[1]), 2, 0)
- grid.addWidget(self.conf_pw, 2, 1)
+ grid.addWidget(self.conf_pw, 2, 1, 1, -1)
vbox.addLayout(grid)
# Password Strength Label
@@ -118,18 +122,31 @@ def __init__(self, wallet, msg, kind, OK_button):
grid.addWidget(self.pw_strength, 3, 0, 1, 2)
self.new_pw.textChanged.connect(self.pw_changed)
+ self.show_cb = QCheckBox(_('Show'))
+ f = self.show_cb.font(); f.setPointSize(f.pointSize()-1); self.show_cb.setFont(f) # make font -1
+ grid.addWidget(self.show_cb, 3, 2, Qt.AlignRight)
+ def toggle_show_pws():
+ show = self.show_cb.isChecked()
+ for le in self.all_lineedits:
+ le.setEchoMode(QLineEdit.Password if not show else QLineEdit.Normal)
+ self.show_cb.toggled.connect(toggle_show_pws)
+
self.encrypt_cb = QCheckBox(_('Encrypt wallet file'))
self.encrypt_cb.setEnabled(False)
- grid.addWidget(self.encrypt_cb, 4, 0, 1, 2)
+ grid.addWidget(self.encrypt_cb, 4, 0, 1, -1)
self.encrypt_cb.setVisible(kind != PW_PASSPHRASE)
def enable_OK():
- ok = self.new_pw.text() == self.conf_pw.text()
+ ok = bool(self.new_pw.text() == self.conf_pw.text()
+ and (self.new_pw.text() or self.permit_empty))
OK_button.setEnabled(ok)
- self.encrypt_cb.setEnabled(ok and bool(self.new_pw.text()))
+ self.encrypt_cb.setEnabled(bool(ok and self.new_pw.text()))
self.new_pw.textChanged.connect(enable_OK)
self.conf_pw.textChanged.connect(enable_OK)
+ if not self.permit_empty:
+ enable_OK() # force buttons to OFF state initially.
+
self.vbox = vbox
def title(self):
@@ -139,6 +156,8 @@ def layout(self):
return self.vbox
def pw_changed(self):
+ if not self.pw_strength:
+ return
password = self.new_pw.text()
if password:
colors = {"Weak":"Red", "Medium":"Blue", "Strong":"Green",
@@ -214,3 +233,27 @@ def run(self):
if not self.exec_():
return
return self.pw.text()
+
+class PassphraseDialog(WindowModalDialog):
+ ''' Use this window to query the user to input a passphrase eg for
+ things like the Bip38 export facility in the GUI. '''
+ def __init__(self, wallet, parent=None, msg=None, title=None, permit_empty=False):
+ msg = msg or _('Please enter a passphrase')
+ title = title or _("Enter Passphrase")
+ super().__init__(parent, title)
+ if parent is None:
+ # Force app-modal if no parent window given
+ self.setWindowModality(Qt.ApplicationModal)
+
+ OK_button = OkButton(self)
+ self.playout = PasswordLayout(wallet, msg, PW_PASSPHRASE, OK_button, permit_empty=permit_empty)
+ self.setWindowTitle(title)
+ vbox = QVBoxLayout(self)
+ vbox.addLayout(self.playout.layout())
+ vbox.addStretch(1)
+ vbox.addLayout(Buttons(CancelButton(self), OK_button))
+
+ def run(self):
+ if not self.exec_():
+ return None
+ return self.playout.new_password()
diff --git a/electroncash_gui/qt/paytoedit.py b/electroncash_gui/qt/paytoedit.py
new file mode 100644
index 000000000000..90b3482d5759
--- /dev/null
+++ b/electroncash_gui/qt/paytoedit.py
@@ -0,0 +1,514 @@
+#!/usr/bin/env python3
+#
+# Electrum - lightweight Bitcoin client
+# Copyright (C) 2012 thomasv@gitorious
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from PyQt5.QtCore import *
+from PyQt5.QtGui import *
+from PyQt5.QtWidgets import QCompleter, QPlainTextEdit
+from .qrtextedit import ScanQRTextEdit
+
+import re
+import sys
+from decimal import Decimal as PyDecimal # Qt 5.12 also exports Decimal
+from electroncash import bitcoin
+from electroncash.address import Address, ScriptOutput
+from electroncash import networks
+from electroncash.util import PrintError
+from electroncash.contacts import Contact
+from electroncash import web
+
+from . import util
+from . import cashacctqt
+
+RE_ALIAS = r'^(.*?)\s*<\s*([0-9A-Za-z:]{26,})\s*>$'
+RE_AMT = r'^.*\s*,\s*([0-9,.]*)\s*$'
+
+RX_ALIAS = re.compile(RE_ALIAS)
+RX_AMT = re.compile(RE_AMT)
+
+frozen_style = "PayToEdit { border:none;}"
+normal_style = "PayToEdit { }"
+
+class PayToEdit(PrintError, ScanQRTextEdit):
+
+ def __init__(self, win):
+ from .main_window import ElectrumWindow
+ assert isinstance(win, ElectrumWindow) and win.amount_e and win.wallet
+ ScanQRTextEdit.__init__(self)
+ self.win = win
+ self.amount_edit = win.amount_e
+ document = self.document()
+ document.contentsChanged.connect(self.update_size)
+
+ fontMetrics = QFontMetrics(document.defaultFont())
+ self.fontSpacing = fontMetrics.lineSpacing()
+
+ margins = self.contentsMargins()
+ documentMargin = document.documentMargin()
+ self.verticalMargins = margins.top() + margins.bottom()
+ self.verticalMargins += self.frameWidth() * 2
+ self.verticalMargins += int(documentMargin * 2)
+
+ self.heightMin = self.fontSpacing + self.verticalMargins
+ self.heightMax = (self.fontSpacing * 10) + self.verticalMargins
+
+ self.c = None
+ self.textChanged.connect(self.check_text)
+ self.outputs = []
+ self.errors = []
+ self.is_pr = False
+ self.is_alias = self.validated = False
+ self.scan_f = win.pay_to_URI
+ self.update_size()
+ self.payto_address = None
+ self._ca_busy = False
+ self._original_style_sheet = self.styleSheet() or ''
+
+ self.previous_payto = ''
+
+ self.previous_ca_could_not_verify = set()
+ self.is_paycode = False
+
+ if sys.platform in ('darwin',):
+ # See issue #1411 -- on *some* macOS systems, clearing the
+ # payto field with setText('') ends up leaving "ghost" pixels
+ # in the field, which look like the text that was just there.
+ # This situation corrects itself eventually if another repaint
+ # is issued to the widget. I couldn't figure out why it is happening
+ # and the workaround is simply to force a repaint using this trick
+ # for all textChanged events. -Calin
+ self.textChanged.connect(self.repaint)
+
+ self.verticalScrollBar().valueChanged.connect(self._vertical_scroll_bar_changed)
+
+ def setFrozen(self, b):
+ self.setReadOnly(b)
+ self.setStyleSheet(self._original_style_sheet + (frozen_style if b else normal_style))
+ self.overlay_widget.setHidden(b)
+
+
+ def setIsPaycode(self, val):
+ self.is_paycode = val
+
+ def setDefault(self):
+ self.setStyleSheet(self._original_style_sheet + util.ColorScheme.DEFAULT.as_stylesheet(True))
+
+ def setGreen(self):
+ if sys.platform in ('darwin',) and util.ColorScheme.dark_scheme:
+ # MacOS dark mode requires special treatment here
+ self.setStyleSheet(self._original_style_sheet + util.ColorScheme.DEEPGREEN.as_stylesheet(True))
+ else:
+ self.setStyleSheet(self._original_style_sheet + util.ColorScheme.GREEN.as_stylesheet(True))
+
+ def setExpired(self):
+ self.setStyleSheet(self._original_style_sheet + util.ColorScheme.RED.as_stylesheet(True))
+
+ def parse_address_and_amount(self, line):
+ x, y = line.split(',')
+ out_type, out = self.parse_output(x)
+ amount = self.parse_amount(y)
+ return out_type, out, amount
+
+ @classmethod
+ def parse_output(cls, x):
+ try:
+ address = cls.parse_address(x)
+ return bitcoin.TYPE_ADDRESS, address
+ except:
+ return bitcoin.TYPE_SCRIPT, ScriptOutput.from_string(x)
+
+ @staticmethod
+ def parse_address(line):
+ r = line.strip()
+ m = RX_ALIAS.match(r)
+ address = m.group(2) if m else r
+ return Address.from_string(address)
+
+ def parse_amount(self, x):
+ if x.strip() == '!':
+ return '!'
+ p = pow(10, self.amount_edit.decimal_point())
+ return int(p * PyDecimal(x.strip()))
+
+ def check_text(self):
+ self.errors = []
+ if self.is_pr:
+ return
+ # filter out empty lines
+ lines = [i for i in self.lines() if i]
+ outputs = []
+ total = 0
+ self.payto_address = None
+ if len(lines) == 1:
+ data = lines[0]
+ lc_data = data.lower()
+ if any(lc_data.startswith(scheme + ":") for scheme in web.parseable_schemes()):
+ self.scan_f(data)
+ return
+ try:
+ self.payto_address = self.parse_output(data)
+ except:
+ pass
+ if self.payto_address:
+ self.win.lock_amount(False)
+ return
+
+ is_max = False
+ for i, line in enumerate(lines):
+ try:
+ _type, to_address, amount = self.parse_address_and_amount(line)
+ except:
+ self.errors.append((i, line.strip()))
+ continue
+
+ outputs.append((_type, to_address, amount))
+ if amount == '!':
+ is_max = True
+ else:
+ total += amount
+
+ self.win.max_button.setChecked(is_max)
+ self.outputs = outputs
+ self.payto_address = None
+
+ if self.win.max_button.isChecked():
+ self.win.do_update_fee()
+ else:
+ self.amount_edit.setAmount(total if outputs else None)
+ self.win.lock_amount(total or len(lines)>1)
+
+ def get_errors(self):
+ return self.errors
+
+ def get_recipient(self):
+ return self.payto_address
+
+ def get_outputs(self, is_max):
+ if self.payto_address:
+ if is_max:
+ amount = '!'
+ else:
+ amount = self.amount_edit.get_amount()
+
+ _type, addr = self.payto_address
+ self.outputs = [(_type, addr, amount)]
+
+ return self.outputs[:]
+
+ def lines(self):
+ return self.toPlainText().split('\n')
+
+ def is_multiline(self):
+ return len(self.lines()) > 1
+
+ def paytomany(self):
+ self.setText("\n\n\n")
+ self.update_size()
+
+ def update_size(self):
+ docLineCount = self.document().lineCount()
+ if self.cursorRect().right() + 1 >= self.overlay_widget.pos().x():
+ # Add a line if we are under the overlay widget
+ docLineCount += 1
+ docHeight = docLineCount * self.fontSpacing
+
+ h = docHeight + self.verticalMargins
+ h = min(max(h, self.heightMin), self.heightMax)
+
+ self.setMinimumHeight(h)
+ self.setMaximumHeight(h)
+
+ self.verticalScrollBar().setHidden(docHeight + self.verticalMargins < self.heightMax)
+
+ # The scrollbar visibility can have changed so we update the overlay position here
+ self._updateOverlayPos()
+
+ def _vertical_scroll_bar_changed(self, value):
+ ''' Fix for bug #1521 -- Contents of payto edit can disappear
+ unexpectedly when selecting with mouse on a single-liner. '''
+ vb = self.verticalScrollBar()
+ docLineCount = self.document().lineCount()
+ if docLineCount == 1 and vb.maximum()-vb.minimum() == 1 and value != vb.minimum():
+ self.print_error(f"Workaround #1521: forcing scrollbar value back to {vb.minimum()} for single line payto_e.")
+ vb.setValue(vb.minimum())
+
+ def setCompleter(self, completer):
+ self.c = completer
+ self.c.setWidget(self)
+ self.c.setCompletionMode(QCompleter.PopupCompletion)
+ self.c.activated.connect(self.insertCompletion)
+
+
+ def insertCompletion(self, completion):
+ if self.c.widget() != self:
+ return
+ tc = self.textCursor()
+ # new! because of the way Cash Accounts works we must delete the whole
+ # line under cursor and insert the full completion. This ends up
+ # working reasonably well.
+ tc.select(QTextCursor.LineUnderCursor)
+ tc.removeSelectedText()
+ tc.insertText(completion + " ")
+ self.setTextCursor(tc)
+
+
+ def textUnderCursor(self):
+ tc = self.textCursor()
+ tc.select(QTextCursor.LineUnderCursor)
+ return tc.selectedText()
+
+ def keyPressEvent(self, e):
+ if self.isReadOnly() or not self.hasFocus():
+ e.ignore()
+ return
+
+ if self.c.popup().isVisible():
+ if e.key() in [Qt.Key_Enter, Qt.Key_Return]:
+ e.ignore()
+ return
+
+ if e.key() in [Qt.Key_Tab, Qt.Key_Backtab]:
+ e.ignore()
+ return
+
+ if e.key() in [Qt.Key_Down, Qt.Key_Up] and not self.is_multiline():
+ e.ignore()
+ return
+
+ super().keyPressEvent(e)
+
+ ctrlOrShift = e.modifiers() and (Qt.ControlModifier or Qt.ShiftModifier)
+ if self.c is None or (ctrlOrShift and not e.text()):
+ return
+
+ hasModifier = (e.modifiers() != Qt.NoModifier) and not ctrlOrShift
+ completionPrefix = self.textUnderCursor()
+
+ if hasModifier or not e.text() or len(completionPrefix) < 1:
+ self.c.popup().hide()
+ return
+
+ if completionPrefix != self.c.completionPrefix():
+ self.c.setCompletionPrefix(completionPrefix)
+ self.c.popup().setCurrentIndex(self.c.completionModel().index(0, 0))
+
+ cr = self.cursorRect()
+ cr.setWidth(self.c.popup().sizeHintForColumn(0) + self.c.popup().verticalScrollBar().sizeHint().width())
+ self.c.complete(cr)
+
+ def qr_input(self):
+ def _on_qr_success(result):
+ if result and result.startswith(networks.net.CASHADDR_PREFIX + ":"):
+ self.scan_f(result)
+ # TODO: update fee
+ super(PayToEdit,self).qr_input(_on_qr_success)
+
+ def _resolve_open_alias(self, *, force_if_has_focus=False):
+ prev_vals = self.is_alias, self.validated # used only if early return due to unchanged text below
+ self.is_alias, self.validated = False, False
+ if not force_if_has_focus and self.hasFocus():
+ return
+ if self.is_multiline(): # only supports single line entries atm
+ return
+ if self.is_pr:
+ return
+ key = str(self.toPlainText())
+ if '@' not in key:
+ return
+ key = key.strip() # strip whitespaces
+ if key == self.previous_payto:
+ # unchanged, restore previous state, abort early.
+ self.is_alias, self.validated = prev_vals
+ return self.is_alias
+ self.previous_payto = key
+ if '.' not in key or '<' in key or ' ' in key:
+ # not an openalias or an openalias with extra info in it, bail..!
+ return
+ parts = key.split(sep=',') # assuming single line
+ if parts and len(parts) > 0 and Address.is_valid(parts[0]):
+ return
+ try:
+ data = self.win.contacts.resolve(key)
+ except Exception as e:
+ self.print_error(f'error resolving alias: {repr(e)}')
+ return
+ if not data:
+ return
+
+ address = data.get('address')
+ name = data.get('name')
+ _type = data.get('type')
+
+ if _type != 'openalias':
+ return
+
+ address_str = None
+ if isinstance(address, str):
+ address_str = address
+ elif isinstance(address, Address):
+ address_str = address.to_ui_string()
+ else:
+ raise RuntimeError('unknown address type')
+
+ self.is_alias = True
+
+ new_url = key + ' <' + address_str + '>'
+ self.setText(new_url)
+ self.previous_payto = new_url
+
+ self.win.contacts.add(Contact(name=name, address=key, type='openalias'), unique=True)
+ self.win.contact_list.update()
+
+ self.setFrozen(True)
+
+ self.validated = bool(data.get('validated'))
+ if self.validated:
+ self.setGreen()
+ else:
+ self.setExpired()
+
+ return True
+
+ _rx_split = re.compile(r'(\s+)|(\s*,\s*)') # split on ',' or on
+ def _resolve_cash_accounts(self, skip_verif=False):
+ ''' This should be called if not hasFocus(). Will run through the
+ text in the payto and rewrite any verified cash accounts we find. '''
+ has_ca = False
+ wallet = self.win.wallet
+ lines = self.lines()
+ lines_orig = lines.copy()
+ need_verif = set()
+ for n, line in enumerate(lines):
+ line = line.strip()
+ parts = self._rx_split.split(line, maxsplit=1)
+ if not parts:
+ # nothing there..
+ continue
+ ca_string = parts[0]
+ while ca_string.endswith(','):
+ # string trailing ',', if any
+ ca_string = ca_string[:-1]
+ parts.insert(1, ',') # push stripped ',' into the 'parts' list
+ ca_tup = wallet.cashacct.parse_string(ca_string)
+ if not ca_tup:
+ # not a cashaccount
+ continue
+ has_ca = True
+ # strip the '<' piece... in case user edited and stale is present
+ m = RX_AMT.match(line)
+ if m:
+ parts = [ca_string, ',', m.group(1)] # strip down to just ca_string + , + amount
+ else:
+ parts = [ca_string] # strip down to JUST ca_string
+ ca_info = wallet.cashacct.get_verified(ca_string)
+ if ca_info:
+ resolved = wallet.cashacct.fmt_info(ca_info) + " " + ca_info.emoji + " <" + ca_info.address.to_ui_string() + ">"
+ lines[n] = line = resolved + " ".join(parts[1:]) # rewrite line, putting the resolved cash account + at the beginning, amount at the end (if any)
+ else:
+ lines[n] = line = " ".join(parts) # rewrite line, possibly stripping <> address here
+ # user specified cash account not found.. potentially kick off verify
+ need_verif.add(ca_tup[1])
+ if (need_verif and not skip_verif
+ and need_verif != self.previous_ca_could_not_verify # this makes it so we don't keep retrying when verif fails due to bad cashacct spec
+ and wallet.network and wallet.network.is_connected()):
+ # Note: verify_multiple_blocks here throws up a waiting dialog
+ # and spawns a local event loop, so this call path may block for
+ # up to 10 seconds. The waiting dialog is however cancellable with
+ # the ESC key, so it's not too bad UX-wise. Just bear in mind that
+ # the local event loop can cause this code path to execute again
+ # if not careful (see the self._ca_busy flag documented inside
+ # function `resolve` below).
+ res = cashacctqt.verify_multiple_blocks(list(need_verif), self.win, wallet)
+ if res is None:
+ # user abort
+ return
+ elif res > 0:
+ # got some verifications...
+ # call self again, to redo the payto edit with the verified pieces
+ self._resolve_cash_accounts(skip_verif=True)
+ return # above call takes care of rewriting self, so just return early
+
+ self.previous_ca_could_not_verify = need_verif
+
+ if lines_orig != lines:
+ # set text only if we changed something since setText kicks off more
+ # parsing elsewehre in this class on textChanged
+ self.setText('\n'.join(lines))
+ return has_ca
+
+ def resolve(self, *, force_if_has_focus = False):
+ ''' This is called by the main window periodically from a timer. See
+ main_window.py function `timer_actions`.
+
+ It will resolve OpenAliases in the send tab and will also alternatively
+ resolve Cash Accounts by attempting to verify them in the background
+ and rewriting the payto field with completed information.
+
+ Note that OpenAlias is assumed to be a single-line payto. Also note
+ that OpenAlias blocks the GUI thread whereas Cash Accounts does this
+ by throwing up a WaitingDialog (which may be aborted/cancelled and
+ doesn't lock the UI event loop).
+
+ TODO/FIXME: Make OpenAlias also use a Waiting Dialog
+
+ Cash Accounts supports full multiline with mixed address/cash accounts
+ in the payto lines.
+
+ OpenAlias and other payto types are mutually exclusive (that is, if
+ OpenAlias, you are such with 1 payee which is OpenAlias, and cannot
+ mix with regular and/or Cash Accounts).
+
+ Note that this mechanism was piggy-backed onto code we inherited from
+ Electrum. It's my opinion that this mechanism is a bit complex for what
+ it is since it requires the progremmer to spend considerable time
+ reading this code to modfy/enhance it. But we will work with that
+ we have for now. -Calin '''
+ if not len(self.toPlainText().strip()):
+ return
+
+ if self._ca_busy:
+ # See the comment at the end of this function about why this flag is
+ # here.
+ return
+ if self._resolve_open_alias(force_if_has_focus=force_if_has_focus):
+ # it was an openalias -- abort and don't proceed to cash account
+ # resolve
+ return
+ if (not force_if_has_focus and self.hasFocus()) or self.is_pr:
+ # PR by definition can't proceed.
+ # We also don't proceed if user is still editing.
+ return
+
+ # self._ca_busy is a reentrancy prevention flag, needed because
+ # _resolve_cash_acconts causes a local event loop to happen in some
+ # cases as it resolves cash accounts by throwing up a WaitingDialog,
+ # which may cause the timer that calls this function to fire again.
+ # The below mechanism prevents that situation as it may lead to
+ # multiple "Verifying, please wait... " dialogs on top of each other.
+ try:
+ self._ca_busy = True
+ if self._resolve_cash_accounts():
+ return
+ finally:
+ self._ca_busy = False
diff --git a/electroncash_gui/qt/popup_widget.py b/electroncash_gui/qt/popup_widget.py
new file mode 100644
index 000000000000..11c567b503d5
--- /dev/null
+++ b/electroncash_gui/qt/popup_widget.py
@@ -0,0 +1,378 @@
+#
+# PopupWidget and PopupLabel
+# by Calin Culianu
+#
+# Adapted from my C++ sourcecode used in the VikingRecorder project.
+#
+# LICENSE: MIT
+#
+from PyQt5.QtGui import *
+from PyQt5.QtCore import *
+from PyQt5.QtWidgets import *
+import sys
+
+class PopupWidget(QWidget):
+
+ # enum PointerPosition
+ LeftSide = 0; RightSide = 1; TopSide = 2; BottomSide = 3; NoPointer = 4
+
+ LR_MARGIN = 10.0#8.0 #/* left / right margin */
+ TB_MARGIN = 8.0#5.5 #/* top / bottom margin */
+
+ didHide = pyqtSignal()
+ didShow = pyqtSignal()
+ onClick = pyqtSignal()
+ onRightClick = pyqtSignal()
+
+ def __init__(self, parent = None, timeout = None, delete_on_hide = True,
+ activation_hides = True, dark_mode = False):
+ ''' parent should be a window or None
+ timeout is the amount of time, in milliseconds, to show the widget before it is auto-hidden. None is no timeout.
+ delete_on_hide, if True, will auto-delete this widget after it is hidden due to the timeout or due to calling hide().
+ '''
+ super().__init__(parent)
+ self.layout = QGridLayout(self)
+ if sys.platform != 'darwin':
+ self.layout.setContentsMargins(20,20,20,20)
+ self.animation = QPropertyAnimation(self)
+ self.final_opacity = 1.0
+ self.popup_opacity = 1.0
+ self.pointerPos = self.LeftSide
+ self._timer = None
+ self.activation_hides = activation_hides
+ self.dark_mode = dark_mode and sys.platform.lower() != "darwin"
+
+ #self.resize(200, 50)
+
+ self.setWindowFlags(Qt.FramelessWindowHint | Qt.Tool)
+ self.setAttribute(Qt.WA_TranslucentBackground)
+ self.setAttribute(Qt.WA_ShowWithoutActivating)
+
+ self.animation.setTargetObject(self)
+ self.animation.setPropertyName(b'popupOpacity')
+ self.animation.setDuration(200)
+
+ self.setLayout(self.layout)
+
+ if parent: parent.installEventFilter(self)
+
+ self.timeout = timeout
+ self.delete_on_hide = delete_on_hide
+
+
+ def getPointerPosition(self): return self.pointerPos
+ def setPointerPosition(self, r): self.pointerPos = r; self.update()
+
+ @pyqtProperty(float) # Property so that Qt animations work. You may set the actual attrbute directly and ingore this in client code
+ def popupOpacity(self): return self.popup_opacity
+ @popupOpacity.setter
+ def popupOpacity(self, value):
+ self.popup_opacity = value
+ self.setWindowOpacity(value)
+ @pyqtProperty(float) # Property so that Qt animations work. You may set the actual attrbute directly and ingore this in client code
+ def finalOpacity(self): return self.final_opacity
+ @finalOpacity.setter
+ def finalOpacity(self, value): self.final_opacity = value
+
+ def paintEvent(self, e):
+ #// Draw the popup here
+ #// You can always pick an image and use drawPixmap to
+ #// draw it in order to make things simpler
+
+ painter = QPainter(self)
+ painter.setRenderHint(QPainter.Antialiasing)
+ painter.setClipRegion(e.region())
+ painter.fillRect(e.rect(),QColor(0,0,0,0))
+
+ #// Prepare the popup dimensions
+ roundedRectDimensions = QRectF()
+ roundedRectDimensions.setX(self.rect().x() + self.LR_MARGIN)
+ roundedRectDimensions.setY(self.rect().y() + self.TB_MARGIN)
+ roundedRectDimensions.setWidth(self.rect().width() - self.LR_MARGIN*2.0)
+ roundedRectDimensions.setHeight(self.rect().height() - self.TB_MARGIN*2.0)
+
+ pal = QPalette(self.palette())
+
+ painter.setBrush(QBrush(pal.color(QPalette.Window if self.dark_mode else QPalette.Mid)))
+
+
+ pen = QPen()
+ pen.setColor(pal.color(QPalette.Light if self.dark_mode else QPalette.Button))
+ pen.setWidth(3)
+ painter.setPen(pen)
+
+ #// Draw the popup body
+ painter.drawRoundedRect(roundedRectDimensions, self.LR_MARGIN*2.0, self.TB_MARGIN*2.0)
+
+ painter.setPen(Qt.NoPen)
+ painter.setBrush(QBrush(pal.color(QPalette.BrightText if self.dark_mode else QPalette.Dark)))
+ #// Draw the popup pointer based on relPos
+ self.drawPopupPointer(painter)
+
+ e.accept()
+
+ def drawPopupPointer(self, p):
+ r = QRectF(self.rect())
+
+ if self.pointerPos == self.LeftSide:
+ PPIX_X = self.LR_MARGIN
+ PPIX_Y = PPIX_X * 2.0
+ points = [
+ QPointF(r.x() + PPIX_X, r.height() / 2.0 - PPIX_Y / 2.0),
+ QPointF(r.x() + PPIX_X, r.height() / 2.0 + PPIX_Y / 2.0),
+ QPointF(r.x(), r.height() / 2.0),
+ ]
+
+ p.drawPolygon(*points)
+
+ if self.pointerPos == self.RightSide:
+ PPIX_X = self.LR_MARGIN
+ PPIX_Y = PPIX_X * 2.0
+ points = [
+ QPointF(r.right()-PPIX_X, r.height()/2.0 - PPIX_Y/2.0),
+ QPointF(r.right()-PPIX_X, r.height()/2.0 + PPIX_Y/2.0),
+ QPointF(r.right(), r.height() / 2.0),
+ ]
+
+ p.drawPolygon(*points)
+
+ if self.pointerPos == self.TopSide:
+ PPIX_Y = self.TB_MARGIN
+ PPIX_X = PPIX_Y*2.0
+ points = [
+ QPointF(r.x()+r.width()/2.0 - PPIX_X/2.0, r.top() + PPIX_Y),
+ QPointF(r.x()+r.width()/2.0 + PPIX_X/2.0, r.top() + PPIX_Y),
+ QPointF(r.x()+r.width()/2.0, r.top()),
+ ]
+
+ p.drawPolygon(*points)
+
+ if self.pointerPos == self.BottomSide:
+ PPIX_Y = self.TB_MARGIN
+ PPIX_X = PPIX_Y*2.0
+ points = [
+ QPointF(r.x()+r.width()/2.0 - PPIX_X/2.0, r.bottom() - PPIX_Y),
+ QPointF(r.x()+r.width()/2.0 + PPIX_X/2.0, r.bottom() - PPIX_Y),
+ QPointF(r.x()+r.width()/2.0, r.bottom()),
+ ]
+
+ p.drawPolygon(*points)
+
+ def showRelativeTo(self, w):
+ s = self.size()
+ self.moveRelativeTo(w)
+ self.hide()
+ self.show()
+ if self.pointerPos == self.NoPointer:
+ self.raise_()
+ if s != self.size():
+ # show caused widget resize.. recenter
+ self.moveRelativeTo(w)
+
+
+ def moveRelativeTo(self, w):
+ if not w:
+ print("INTERNAL ERROR: PopupWidget::showRelativeTo got passed a NULL widget pointer! Ignoring.. FIXME!")
+ return
+
+ p = w.mapToGlobal(QPoint(0,0))
+ if self.pointerPos == self.LeftSide:
+ p.setX(p.x()+w.width())
+ p.setY(p.y()-self.height()//2+w.height()//2)
+ elif self.pointerPos == self.RightSide:
+ p.setX(p.x()-self.width())
+ p.setY(p.y()-self.height()//2+w.height()//2)
+ elif self.pointerPos == self.BottomSide:
+ p.setX(p.x()+w.width()//2 - self.width()//2)
+ p.setY(p.y()-self.height())
+ elif self.pointerPos == self.TopSide:
+ p.setX(p.x()+w.width()//2 - self.width()//2)
+ p.setY(p.y()+w.height())
+ else:
+ #// just center it on the widget
+ p.setX(p.x()+w.width()//2 - self.width()//2)
+ p.setY(p.y()+w.height()//2 - self.height()//2)
+ if self.isVisible():
+ self.raise_()
+
+ self.move(p);
+
+ def _killTimer(self):
+ if self._timer:
+ self._timer.stop()
+ self._timer.deleteLater()
+ self._timer = None
+
+ def _startTimer(self, target):
+ self._killTimer()
+ self._timer = QTimer(self)
+ self._timer.setSingleShot(True)
+ def timeout():
+ self._killTimer()
+ target()
+ self._timer.timeout.connect(timeout)
+ self._timer.start(int(self.timeout))
+
+ def showEvent(self, e):
+ super().showEvent(e)
+ if not e.isAccepted():
+ return
+ if self.animation.state() == QAbstractAnimation.Running:
+ return
+ self.setWindowOpacity(0.0)
+
+ self.animation.setStartValue(0.0)
+ self.animation.setEndValue(self.final_opacity)
+
+ self.didShow.emit()
+ self._cleanUp()
+ self.animation.setDirection(QAbstractAnimation.Forward)
+ self.animation.start()
+
+ if isinstance(self.timeout, (float, int)) and self.timeout > 0:
+ def autoHide():
+ self._cleanUp()
+ self._startTimer(self.hideAnimated)
+ self.animation.finished.connect(autoHide)
+
+ def hideEvent(self, e):
+ super().hideEvent(e)
+ if e.isAccepted():
+ self._cleanUp()
+ if self.delete_on_hide:
+ self.setParent(None)
+ self.deleteLater()
+
+ def _disconnectFinished(self):
+ try: self.animation.finished.disconnect()
+ except: pass
+
+ def hideAnimated(self):
+ if self.animation.state() == QAbstractAnimation.Running:
+ return
+ self._cleanUp()
+ self.animation.setDirection(QAbstractAnimation.Backward)
+ self.animation.start()
+ def doHide():
+ self._cleanUp()
+ self.hide()
+ self.didHide.emit()
+ self.animation.finished.connect(doHide)
+
+ def eventFilter(self, obj, e):
+ evts = (QEvent.Move, QEvent.Resize, QEvent.Close, QEvent.Hide, QEvent.Show)
+ if self.activation_hides:
+ evts = (*evts, QEvent.WindowStateChange, QEvent.WindowDeactivate)
+ if e.type() in evts:
+ # if the parent window is moved or otherwise touched, make this popup go away
+ self.hideAnimated()
+ return False
+
+ def mousePressEvent(self, e):
+ if e.button() == Qt.LeftButton:
+ self.onClick.emit()
+ e.accept()
+ elif e.button() == Qt.RightButton:
+ self.onRightClick.emit()
+ e.accept()
+
+ def _cleanUp(self):
+ ''' Forces animation and timer to stop. This is essential to force
+ the object into a known consistent state ready for deletion, restart
+ of animations, etc. '''
+ self._disconnectFinished()
+ self._killTimer()
+ self.animation.stop()
+
+
+class PopupLabel(PopupWidget):
+
+ def __init__(self, text = "", parent = None, alignment = None, textColor = None, **kwargs):
+ super().__init__(parent, **kwargs)
+ self.label = QLabel(text, self)
+ if alignment is None:
+ alignment = Qt.AlignCenter
+ self.label.setAlignment(alignment)
+ self.label.setWordWrap(True)
+ self.label.setScaledContents(True)
+ p = QPalette(self.label.palette())
+ p.setColor(QPalette.Window,QColor(0,0,0,0))
+ if textColor is None:
+ textColor = QColor(255,255,255,255) if not self.dark_mode else p.color(QPalette.BrightText)
+ p.setColor(QPalette.WindowText,textColor)
+ self.label.setPalette(p);
+
+ self.layout.addWidget(self.label, 0, 0);
+
+ self.setAutoFillBackground(False)
+ self.setUpdatesEnabled(True)
+
+ def setPopupText(self, text):
+ self.label.setText(text)
+
+### Helpers for EC integration
+from .util import destroyed_print_error
+from electroncash.util import finalization_print_error
+
+_extant_popups = dict()
+def ShowPopupLabel(text, target, timeout, name="Global", pointer_position=PopupWidget.RightSide, opacity=0.9, onClick=None, onRightClick=None,
+ activation_hides=True, track_target=True, dark_mode=False):
+ assert isinstance(name, str) and isinstance(text, str) and isinstance(target, QWidget) and isinstance(timeout, (float, int)), "Invalid parameters"
+ window = target.window()
+ if not window.isActiveWindow():
+ return False
+ KillPopupLabel(name)
+ popup = PopupLabel(text, window, timeout=timeout, delete_on_hide=True, activation_hides=activation_hides, dark_mode=dark_mode)
+ popup.setPointerPosition(pointer_position)
+ popup.final_opacity = opacity
+ popup.setObjectName(str(id(popup)))
+ def onDestroyed(x):
+ # NB: even though x and popup are the same object, they will have different id() at this point (I think this is because Qt destructed the python object stub and is passing us a reference to the QWidget base here.)
+ xid = None
+ try:
+ xid = int(x.objectName())
+ except (ValueError,TypeError):
+ pass
+ if xid == id(_extant_popups.get(name, None)):
+ # Clean up the dict entry
+ _extant_popups.pop(name, None)
+ #print("----> Destroyed and cleaned up:",name)
+ else:
+ # Stale object or already removed from dict. No need to clean up the dict entry
+ pass
+ #print("----> Not found!!")
+ if track_target:
+ class MyEventFilter(QObject):
+ ''' Traps target move events and moves the popup to line up with the target '''
+ def eventFilter(self, obj, e):
+ lbl = self.parent()
+ if e.type() in (QEvent.Move, QEvent.Resize) and isinstance(lbl, PopupLabel):
+ # track the target, moving us along with it if its geometry changes
+ lbl.moveRelativeTo(obj)
+ return False
+ popup.my_e_filter = MyEventFilter(popup)
+ target.installEventFilter(popup.my_e_filter)
+ popup.destroyed.connect(onDestroyed)
+ destroyed_print_error(popup, "[PopupLabel/{}] destroyed".format(name))
+ finalization_print_error(popup, "[PopupLabel/{}] finalized".format(name))
+ _extant_popups[name] = popup
+ if onClick:
+ popup.onClick.connect(onClick, Qt.QueuedConnection)
+ if onRightClick:
+ popup.onRightClick.connect(onRightClick, Qt.QueuedConnection)
+ popup.showRelativeTo(target)
+ return True
+
+def KillPopupLabel(name="Global"):
+ extant = _extant_popups.pop(name, None)
+ if extant:
+ try: extant.destroyed.disconnect()
+ except: pass
+ try:
+ destroyed_print_error(extant, "[PopupLabel/{}] destroyed".format(name))
+ extant._cleanUp()
+ extant.setParent(None)
+ extant.deleteLater()
+ except RuntimeError:
+ ''' In rare cases, wrapped C++ object may be dead already; see #1796 '''
+ #print("----> Found and killed extant label")
diff --git a/gui/qt/qrcodewidget.py b/electroncash_gui/qt/qrcodewidget.py
similarity index 77%
rename from gui/qt/qrcodewidget.py
rename to electroncash_gui/qt/qrcodewidget.py
index 32721b1bca63..2bc1ae829683 100644
--- a/gui/qt/qrcodewidget.py
+++ b/electroncash_gui/qt/qrcodewidget.py
@@ -1,17 +1,16 @@
from PyQt5.QtCore import *
from PyQt5.QtGui import *
-import PyQt5.QtGui as QtGui
from PyQt5.QtWidgets import (
QApplication, QVBoxLayout, QTextEdit, QHBoxLayout, QPushButton, QWidget,
- QSizePolicy)
+ QSizePolicy, QToolTip)
import os
import qrcode
from electroncash import util
from electroncash.i18n import _
-from .util import WindowModalDialog, MessageBoxMixin
+from .util import WindowModalDialog, MessageBoxMixin, CloseButton
class QRCodeWidget(QWidget, util.PrintError):
@@ -48,17 +47,19 @@ def setData(self, data):
def _paint_blank(self):
- qp = QtGui.QPainter(self)
+ qp = QPainter(self)
r = qp.viewport()
- qp.fillRect(0, 0, r.width(), r.height(), self._white)
+ qp.fillRect(0, 0, r.width(), r.height(), self._white_brush)
qp.end(); del qp
def _bad_data(self, data):
self.print_error("Failed to generate QR image -- data too long! Data length was: {} bytes".format(len(data or '')))
self.qr = None
- _black = QColor(0, 0, 0, 255)
- _white = QColor(255, 255, 255, 255)
+ _black_brush = QBrush(QColor(0, 0, 0, 255))
+ _white_brush = QBrush(QColor(255, 255, 255, 255))
+ _black_pen = QPen(_black_brush, 1.0, join=Qt.MiterJoin)
+ _white_pen = QPen(_white_brush, 1.0, join=Qt.MiterJoin)
def paintEvent(self, e):
matrix = None
@@ -74,22 +75,22 @@ def paintEvent(self, e):
return
k = len(matrix)
- qp = QtGui.QPainter(self)
+ qp = QPainter(self)
r = qp.viewport()
- margin = 10
+ margin = 5
framesize = min(r.width(), r.height())
- boxsize = int( (framesize - 2*margin)/k )
- size = k*boxsize
- left = (r.width() - size)/2
- top = (r.height() - size)/2
+ boxsize = (framesize - 2 * margin) // k
+ size = k * boxsize
+ left = (r.width() - size) // 2
+ top = (r.height() - size) // 2
# Make a white margin around the QR in case of dark theme use
- qp.setBrush(self._white)
- qp.setPen(self._white)
- qp.drawRect(left-margin, top-margin, size+(margin*2), size+(margin*2))
- qp.setBrush(self._black)
- qp.setPen(self._black)
+ qp.setBrush(self._white_brush)
+ qp.setPen(self._white_pen)
+ qp.drawRect(left-margin, top-margin, size + (margin * 2), size + (margin * 2))
+ qp.setBrush(self._black_brush)
+ qp.setPen(self._black_pen)
for r in range(k):
for c in range(k):
@@ -107,11 +108,11 @@ def save_to_file(qrw, parent):
p.save(filename, 'png')
isinstance(parent, MessageBoxMixin) and parent.show_message(_("QR code saved to file") + " " + filename)
-def copy_to_clipboard(qrw, parent):
+def copy_to_clipboard(qrw, widget):
p = qrw and qrw.grab()
if p and not p.isNull():
QApplication.clipboard().setPixmap(p)
- isinstance(parent, MessageBoxMixin) and parent.show_message(_("QR code copied to clipboard"))
+ QToolTip.showText(QCursor.pos(), _("QR code copied to clipboard"), widget)
class QRDialog(WindowModalDialog):
@@ -133,18 +134,17 @@ def __init__(self, data, parent=None, title = "", show_text=False):
weakSelf = util.Weak.ref(self) # Qt & Python GC hygeine: don't hold references to self in non-method slots as it appears Qt+Python GC don't like this too much and may leak memory in that case.
weakQ = util.Weak.ref(qrw)
- b = QPushButton(_("Copy"))
+ b = QPushButton(_("&Copy"))
hbox.addWidget(b)
- b.clicked.connect(lambda: copy_to_clipboard(weakQ(), weakSelf()))
+ weakBut = util.Weak.ref(b)
+ b.clicked.connect(lambda: copy_to_clipboard(weakQ(), weakBut()))
- b = QPushButton(_("Save"))
+ b = QPushButton(_("&Save"))
hbox.addWidget(b)
b.clicked.connect(lambda: save_to_file(weakQ(), weakSelf()))
- b = QPushButton(_("Close"))
+ b = CloseButton(self)
hbox.addWidget(b)
- b.clicked.connect(self.accept)
- b.setDefault(True)
vbox.addLayout(hbox)
self.setLayout(vbox)
diff --git a/electroncash_gui/qt/qrreader/__init__.py b/electroncash_gui/qt/qrreader/__init__.py
new file mode 100644
index 000000000000..2fbdf34f69c4
--- /dev/null
+++ b/electroncash_gui/qt/qrreader/__init__.py
@@ -0,0 +1,30 @@
+#!/usr/bin/env python3
+#
+# Electron Cash - lightweight Bitcoin client
+# Copyright (C) 2019 Axel Gembe
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from .camera_dialog import (QrReaderCameraDialog, CameraError, NoCamerasFound,
+ NoCameraResolutionsFound, MissingQrDetectionLib)
+from .validator import (QrReaderValidatorResult, AbstractQrReaderValidator,
+ QrReaderValidatorCounting, QrReaderValidatorColorizing,
+ QrReaderValidatorStrong, QrReaderValidatorCounted)
diff --git a/electroncash_gui/qt/qrreader/camera_dialog.py b/electroncash_gui/qt/qrreader/camera_dialog.py
new file mode 100644
index 000000000000..69d533362ed3
--- /dev/null
+++ b/electroncash_gui/qt/qrreader/camera_dialog.py
@@ -0,0 +1,462 @@
+#!/usr/bin/env python3
+#
+# Electron Cash - lightweight Bitcoin client
+# Copyright (C) 2019 Axel Gembe
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+import time
+import math
+import sys
+import os
+from typing import List
+
+from PyQt5.QtMultimedia import QCameraInfo, QCamera, QCameraViewfinderSettings
+from PyQt5.QtWidgets import QDialog, QVBoxLayout, QHBoxLayout, QCheckBox, QPushButton, QLabel
+from PyQt5.QtGui import QImage, QPixmap
+from PyQt5.QtCore import QSize, QRect, Qt, pyqtSignal, PYQT_VERSION
+
+from electroncash import get_config
+from electroncash.i18n import _
+from electroncash.util import print_error, PrintError
+from electroncash.qrreaders import get_qr_reader, QrCodeResult
+
+from electroncash_gui.qt.utils import FixedAspectRatioLayout, ImageGraphicsEffect
+
+from .video_widget import QrReaderVideoWidget
+from .video_overlay import QrReaderVideoOverlay
+from .video_surface import QrReaderVideoSurface
+from .crop_blur_effect import QrReaderCropBlurEffect
+from .validator import AbstractQrReaderValidator, QrReaderValidatorCounted, QrReaderValidatorResult
+from ..util import MessageBoxMixin
+
+class CameraError(RuntimeError):
+ ''' Base class of the camera-related error conditions. '''
+
+class NoCamerasFound(CameraError):
+ ''' Raised by start_scan if no usable cameras were found. Interested
+ code can catch this specific exception.'''
+
+class NoCameraResolutionsFound(CameraError):
+ ''' Raised internally if no usable camera resolutions were found. '''
+
+class MissingQrDetectionLib(RuntimeError):
+ ''' Raised if we can't find zbar or whatever other platform lib
+ we require to detect QR in image frames. '''
+
+class QrReaderCameraDialog(PrintError, MessageBoxMixin, QDialog):
+ """
+ Dialog for reading QR codes from a camera
+ """
+
+ # Try to crop so we have minimum 512 dimensions
+ SCAN_SIZE: int = 512
+
+ qr_finished = pyqtSignal(bool, str, object)
+
+ def __init__(self, parent):
+ ''' Note: make sure parent is a "top_level_window()" as per
+ MessageBoxMixin API else bad things can happen on macOS. '''
+ QDialog.__init__(self, parent=parent)
+
+ self.validator: AbstractQrReaderValidator = None
+ self.frame_id: int = 0
+ self.qr_crop: QRect = None
+ self.qrreader_res: List[QrCodeResult] = []
+ self.validator_res: QrReaderValidatorResult = None
+ self.last_stats_time: float = 0.0
+ self.frame_counter: int = 0
+ self.qr_frame_counter: int = 0
+ self.last_qr_scan_ts: float = 0.0
+ self.camera: QCamera = None
+ self._error_message: str = None
+ self._ok_done: bool = False
+ self.camera_sc_conn = None
+ self.resolution: QSize = None
+
+ self.config = get_config()
+
+ # Try to get the QR reader for this system
+ self.qrreader = get_qr_reader()
+ if not self.qrreader:
+ raise MissingQrDetectionLib(_("The platform QR detection library is not available."))
+
+ # Set up the window, add the maximize button
+ flags = self.windowFlags()
+ flags = flags | Qt.WindowMaximizeButtonHint
+ self.setWindowFlags(flags)
+ self.setWindowTitle(_("Scan QR Code"))
+ self.setWindowModality(Qt.WindowModal if parent else Qt.ApplicationModal)
+
+ # Create video widget and fixed aspect ratio layout to contain it
+ self.video_widget = QrReaderVideoWidget()
+ self.video_overlay = QrReaderVideoOverlay()
+ self.video_layout = FixedAspectRatioLayout()
+ self.video_layout.addWidget(self.video_widget)
+ self.video_layout.addWidget(self.video_overlay)
+
+ # Create root layout and add the video widget layout to it
+ vbox = QVBoxLayout()
+ self.setLayout(vbox)
+ vbox.setContentsMargins(0, 0, 0, 0)
+ vbox.addLayout(self.video_layout)
+
+ self.lowres_label = QLabel(_("Note: This camera generates frames of relatively low resolution; QR scanning accuracy may be affected"))
+ self.lowres_label.setWordWrap(True)
+ self.lowres_label.setAlignment(Qt.AlignVCenter | Qt.AlignHCenter)
+ vbox.addWidget(self.lowres_label)
+ self.lowres_label.setHidden(True)
+
+ # Create a layout for the controls
+ controls_layout = QHBoxLayout()
+ controls_layout.addStretch(2)
+ controls_layout.setContentsMargins(10, 10, 10, 10)
+ controls_layout.setSpacing(10)
+ vbox.addLayout(controls_layout)
+
+ # Flip horizontally checkbox with default coming from global config
+ self.flip_x = QCheckBox()
+ self.flip_x.setText(_("&Flip horizontally"))
+ self.flip_x.setChecked(bool(self.config.get('qrreader_flip_x', True)))
+ self.flip_x.stateChanged.connect(self._on_flip_x_changed)
+ controls_layout.addWidget(self.flip_x)
+
+ close_but = QPushButton(_("&Close"))
+ close_but.clicked.connect(self.reject)
+ controls_layout.addWidget(close_but)
+
+ # Create the video surface and receive events when new frames arrive
+ self.video_surface = QrReaderVideoSurface(self)
+ self.video_surface.frame_available.connect(self._on_frame_available)
+
+ # Create the crop blur effect
+ self.crop_blur_effect = QrReaderCropBlurEffect(self)
+ self.image_effect = ImageGraphicsEffect(self, self.crop_blur_effect)
+
+
+ # Note these should stay as queued connections becasue we use the idiom
+ # self.reject() and self.accept() in this class to kill the scan --
+ # and we do it from within callback functions. If you don't use
+ # queued connections here, bad things can happen.
+ self.finished.connect(self._boilerplate_cleanup, Qt.QueuedConnection)
+ self.finished.connect(self._on_finished, Qt.QueuedConnection)
+
+ def _on_flip_x_changed(self, _state: int):
+ self.config.set_key('qrreader_flip_x', self.flip_x.isChecked())
+
+ def _get_resolution(self, resolutions: List[QSize], min_size: int) -> QSize:
+ """
+ Given a list of resolutions that the camera supports this function picks the
+ lowest resolution that is at least min_size in both width and height.
+ If no resolution is found, NoCameraResolutionsFound is raised.
+ """
+ def res_list_to_str(res_list: List[QSize]) -> str:
+ return ', '.join(['{}x{}'.format(r.width(), r.height()) for r in res_list])
+
+ def check_res(res: QSize):
+ return res.width() >= min_size and res.height() >= min_size
+
+ self.print_error('searching for at least {0}x{0}'.format(min_size))
+
+ # Query and display all resolutions the camera supports
+ format_str = 'camera resolutions: {}'
+ self.print_error(format_str.format(res_list_to_str(resolutions)))
+
+ # Filter to those that are at least min_size in both width and height
+ candidate_resolutions = []
+ ideal_resolutions = [r for r in resolutions if check_res(r)]
+ less_than_ideal_resolutions = [r for r in resolutions if r not in ideal_resolutions]
+ format_str = 'ideal resolutions: {}, less-than-ideal resolutions: {}'
+ self.print_error(format_str.format(res_list_to_str(ideal_resolutions), res_list_to_str(less_than_ideal_resolutions)))
+
+ # Raise an error if we have no usable resolutions
+ if not ideal_resolutions and not less_than_ideal_resolutions:
+ raise NoCameraResolutionsFound(_("Cannot start QR scanner, no usable camera resolution found.") + self._linux_pyqt5bug_msg())
+
+ if not ideal_resolutions:
+ self.print_error('Warning: No ideal resolutions found, falling back to less-than-ideal resolutions -- QR recognition may fail!')
+ candidate_resolutions = less_than_ideal_resolutions
+ is_ideal = False
+ else:
+ candidate_resolutions = ideal_resolutions
+ is_ideal = True
+
+
+ # Sort the usable resolutions, least number of pixels first, get the first element
+ resolution = sorted(candidate_resolutions, key=lambda r: r.width() * r.height(), reverse=not is_ideal)[0]
+ format_str = 'chosen resolution is {}x{}'
+ self.print_error(format_str.format(resolution.width(), resolution.height()))
+
+ return resolution, is_ideal
+
+ @staticmethod
+ def _get_crop(resolution: QSize, scan_size: int) -> QRect:
+ """
+ Returns a QRect that is scan_size x scan_size in the middle of the resolution
+ """
+ scan_pos_x = int((resolution.width() - scan_size) / 2)
+ scan_pos_y = int((resolution.height() - scan_size) / 2)
+ return QRect(scan_pos_x, scan_pos_y, scan_size, scan_size)
+
+ @staticmethod
+ def _linux_pyqt5bug_msg():
+ ''' Returns a string that may be appended to an exception error message
+ only if on Linux and PyQt5 < 5.12.2, otherwise returns an empty string. '''
+ if (sys.platform == 'linux' and PYQT_VERSION < 0x050c02 # Check if PyQt5 < 5.12.2 on linux
+ # Also: this warning is not relevant to APPIMAGE; so make sure
+ # we are not running from APPIMAGE.
+ and not os.environ.get('APPIMAGE')):
+ # In this case it's possible we couldn't detect a camera because
+ # of that missing libQt5MultimediaGstTools.so problem.
+ return ("\n\n" + _('If you indeed do have a usable camera connected, then this error may be caused by bugs in previous PyQt5 versions on Linux. Try installing the latest PyQt5:')
+ + "\n\n" + "python3 -m pip install --user -I pyqt5")
+ return ''
+
+ def start_scan(self, device: str = ''):
+ """
+ Scans a QR code from the given camera device.
+ If no QR code is found the returned string will be empty.
+ If the camera is not found or can't be opened NoCamerasFound will be raised.
+ """
+
+ self.validator = QrReaderValidatorCounted()
+ self.validator.strong_count = 5 # FIXME: make this time based rather than framect based
+
+ device_info = None
+
+ for camera in QCameraInfo.availableCameras():
+ if camera.deviceName() == device:
+ device_info = camera
+ break
+
+ if not device_info:
+ self.print_error('Failed to open selected camera, trying to use default camera')
+ device_info = QCameraInfo.defaultCamera()
+
+ if not device_info or device_info.isNull():
+ raise NoCamerasFound(_("Cannot start QR scanner, no usable camera found.") + self._linux_pyqt5bug_msg())
+
+ self._init_stats()
+ self.qrreader_res = []
+ self.validator_res = None
+ self._ok_done = False
+ self._error_message = None
+
+ if self.camera:
+ self.print_error("Warning: start_scan already called for this instance.")
+
+ self.camera = QCamera(device_info)
+ self.camera.setViewfinder(self.video_surface)
+ self.camera.setCaptureMode(QCamera.CaptureViewfinder)
+
+ # this operates on camera from within the signal handler, so should be a queued connection
+ self.camera_sc_conn = self.camera.statusChanged.connect(self._on_camera_status_changed, Qt.QueuedConnection)
+ self.camera.error.connect(self._on_camera_error) # print_error the errors we get, if any, for debugging
+ # Camera needs to be loaded to query resolutions, this tries to open the camera
+ self.camera.load()
+
+ _camera_status_names = {
+ QCamera.UnavailableStatus: _('unavailable'),
+ QCamera.UnloadedStatus: _('unloaded'),
+ QCamera.UnloadingStatus: _('unloading'),
+ QCamera.LoadingStatus: _('loading'),
+ QCamera.LoadedStatus: _('loaded'),
+ QCamera.StandbyStatus: _('standby'),
+ QCamera.StartingStatus: _('starting'),
+ QCamera.StoppingStatus: _('stopping'),
+ QCamera.ActiveStatus: _('active')
+ }
+
+ def _get_camera_status_name(self, status: QCamera.Status):
+ return self._camera_status_names.get(status, _('unknown'))
+
+ def _set_resolution(self, resolution: QSize):
+ self.resolution = resolution
+ self.qr_crop = self._get_crop(resolution, self.SCAN_SIZE)
+
+ # Initialize the video widget
+ #self.video_widget.setMinimumSize(resolution) # <-- on macOS this makes it fixed size for some reason.
+ self.resize(720, 540)
+ self.video_overlay.set_crop(self.qr_crop)
+ self.video_overlay.set_resolution(resolution)
+ self.video_layout.set_aspect_ratio(resolution.width() / resolution.height())
+
+ # Set up the crop blur effect
+ self.crop_blur_effect.setCrop(self.qr_crop)
+
+ def _on_camera_status_changed(self, status: QCamera.Status):
+ if self._ok_done:
+ # camera/scan is quitting, abort.
+ return
+
+ self.print_error('camera status changed to {}'.format(self._get_camera_status_name(status)))
+
+ if status == QCamera.LoadedStatus:
+ # Determine the optimal resolution and compute the crop rect
+ camera_resolutions = self.camera.supportedViewfinderResolutions()
+ try:
+ resolution, was_ideal = self._get_resolution(camera_resolutions, self.SCAN_SIZE)
+ except RuntimeError as e:
+ self._error_message = str(e)
+ self.reject()
+ return
+ self._set_resolution(resolution)
+
+ # Set the camera resolution
+ viewfinder_settings = QCameraViewfinderSettings()
+ viewfinder_settings.setResolution(resolution)
+ self.camera.setViewfinderSettings(viewfinder_settings)
+
+ # Counter for the QR scanner frame number
+ self.frame_id = 0
+
+ self.camera.start()
+ self.lowres_label.setVisible(not was_ideal) # if they have a low res camera, show the warning label.
+ elif status == QCamera.UnloadedStatus or status == QCamera.UnavailableStatus:
+ self._error_message = _("Cannot start QR scanner, camera is unavailable.")
+ self.reject()
+ elif status == QCamera.ActiveStatus:
+ self.open()
+
+ CameraErrorStrings = {
+ QCamera.NoError : "No Error",
+ QCamera.CameraError : "Camera Error",
+ QCamera.InvalidRequestError : "Invalid Request Error",
+ QCamera.ServiceMissingError : "Service Missing Error",
+ QCamera.NotSupportedFeatureError : "Unsupported Feature Error"
+ }
+ def _on_camera_error(self, errorCode):
+ errStr = self.CameraErrorStrings.get(errorCode, "Unknown Error")
+ self.print_error("QCamera error:", errStr)
+
+ def accept(self):
+ self._ok_done = True # immediately blocks further processing
+ super().accept()
+
+ def reject(self):
+ self._ok_done = True # immediately blocks further processing
+ super().reject()
+
+ def _boilerplate_cleanup(self):
+ self._close_camera()
+ if self.isVisible():
+ self.close()
+
+ def _close_camera(self):
+ if self.camera:
+ self.camera.setViewfinder(None)
+ if self.camera_sc_conn:
+ self.camera.statusChanged.disconnect(self.camera_sc_conn)
+ self.camera_sc_conn = None
+ self.camera.unload()
+ self.camera = None
+
+ def _on_finished(self, code):
+ res = ( (code == QDialog.Accepted
+ and self.validator_res and self.validator_res.accepted
+ and self.validator_res.simple_result)
+ or '' )
+
+ self.validator = None
+
+ self.print_error('closed', res)
+
+ self.qr_finished.emit(code == QDialog.Accepted, self._error_message, res)
+
+ def _on_frame_available(self, frame: QImage):
+ if self._ok_done:
+ return
+
+ self.frame_id += 1
+
+ if frame.size() != self.resolution:
+ self.print_error('Getting video data at {}x{} instead of the requested {}x{}, switching resolution.'.format(
+ frame.size().width(), frame.size().height(),
+ self.resolution.width(), self.resolution.height()
+ ))
+ self._set_resolution(frame.size())
+
+ flip_x = self.flip_x.isChecked()
+
+ # Only QR scan every QR_SCAN_PERIOD secs
+ qr_scanned = time.time() - self.last_qr_scan_ts >= self.qrreader.interval()
+ if qr_scanned:
+ self.last_qr_scan_ts = time.time()
+ # Crop the frame so we only scan a SCAN_SIZE rect
+ frame_cropped = frame.copy(self.qr_crop)
+
+ # Convert to Y800 / GREY FourCC (single 8-bit channel)
+ # This creates a copy, so we don't need to keep the frame around anymore
+ frame_y800 = frame_cropped.convertToFormat(QImage.Format_Grayscale8)
+
+ # Read the QR codes from the frame
+ self.qrreader_res = self.qrreader.read_qr_code(
+ frame_y800.constBits().__int__(), frame_y800.byteCount(),
+ frame_y800.bytesPerLine(),
+ frame_y800.width(),
+ frame_y800.height(), self.frame_id
+ )
+
+ # Call the validator to see if the scanned results are acceptable
+ self.validator_res = self.validator.validate_results(self.qrreader_res)
+
+ # Update the video overlay with the results
+ self.video_overlay.set_results(self.qrreader_res, flip_x, self.validator_res)
+
+ # Close the dialog if the validator accepted the result
+ if self.validator_res.accepted:
+ self.accept()
+ return
+
+ # Apply the crop blur effect
+ if self.image_effect:
+ frame = self.image_effect.apply(frame)
+
+ # If horizontal flipping is enabled, only flip the display
+ if flip_x:
+ frame = frame.mirrored(True, False)
+
+ # Display the frame in the widget
+ self.video_widget.setPixmap(QPixmap.fromImage(frame))
+
+ self._update_stats(qr_scanned)
+
+ def _init_stats(self):
+ self.last_stats_time = time.perf_counter()
+ self.frame_counter = 0
+ self.qr_frame_counter = 0
+
+ def _update_stats(self, qr_scanned):
+ self.frame_counter += 1
+ if qr_scanned:
+ self.qr_frame_counter += 1
+ now = time.perf_counter()
+ last_stats_delta = now - self.last_stats_time
+ if last_stats_delta > 1.0: # stats every 1.0 seconds
+ fps = self.frame_counter / last_stats_delta
+ qr_fps = self.qr_frame_counter / last_stats_delta
+ if self.validator is not None:
+ self.validator.strong_count = math.ceil(qr_fps / 3) # 1/3 of a second's worth of qr frames determines strong_count
+ stats_format = 'running at {} FPS, scanner at {} FPS'
+ self.print_error(stats_format.format(fps, qr_fps))
+ self.frame_counter = 0
+ self.qr_frame_counter = 0
+ self.last_stats_time = now
diff --git a/electroncash_gui/qt/qrreader/crop_blur_effect.py b/electroncash_gui/qt/qrreader/crop_blur_effect.py
new file mode 100644
index 000000000000..b6adf9fc8c5d
--- /dev/null
+++ b/electroncash_gui/qt/qrreader/crop_blur_effect.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python3
+#
+# Electron Cash - lightweight Bitcoin client
+# Copyright (C) 2019 Axel Gembe
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from PyQt5.QtWidgets import QGraphicsBlurEffect, QGraphicsEffect
+from PyQt5.QtGui import QPainter, QTransform, QRegion
+from PyQt5.QtCore import QObject, QRect, QPoint, Qt
+
+class QrReaderCropBlurEffect(QGraphicsBlurEffect):
+ CROP_OFFSET_ENABLED = False
+ CROP_OFFSET = QPoint(5, 5)
+
+ BLUR_DARKEN = 0.25
+ BLUR_RADIUS = 8
+
+ def __init__(self, parent: QObject, crop: QRect = None):
+ super().__init__(parent)
+ self.crop = crop
+ self.setBlurRadius(self.BLUR_RADIUS)
+
+ def setCrop(self, crop: QRect = None):
+ self.crop = crop
+
+ def draw(self, painter: QPainter):
+ assert self.crop, 'crop must be set'
+
+ # Compute painter regions for the crop and the blur
+ all_region = QRegion(painter.viewport())
+ crop_region = QRegion(self.crop)
+ blur_region = all_region.subtracted(crop_region)
+
+ # Let the QGraphicsBlurEffect only paint in blur_region
+ painter.setClipRegion(blur_region)
+
+ # Fill with black and set opacity so that the blurred region is drawn darker
+ if self.BLUR_DARKEN > 0.0:
+ painter.fillRect(painter.viewport(), Qt.black)
+ painter.setOpacity(1 - self.BLUR_DARKEN)
+
+ # Draw the blur effect
+ super().draw(painter)
+
+ # Restore clipping and opacity
+ painter.setClipping(False)
+ painter.setOpacity(1.0)
+
+ # Get the source pixmap
+ pixmap, offset = self.sourcePixmap(Qt.DeviceCoordinates, QGraphicsEffect.NoPad)
+ painter.setWorldTransform(QTransform())
+
+ # Get the source by adding the offset to the crop location
+ source = self.crop
+ if self.CROP_OFFSET_ENABLED:
+ source = source.translated(self.CROP_OFFSET)
+ painter.drawPixmap(self.crop.topLeft() + offset, pixmap, source)
diff --git a/electroncash_gui/qt/qrreader/validator.py b/electroncash_gui/qt/qrreader/validator.py
new file mode 100644
index 000000000000..5ae8d24b0775
--- /dev/null
+++ b/electroncash_gui/qt/qrreader/validator.py
@@ -0,0 +1,166 @@
+#!/usr/bin/env python3
+#
+# Electron Cash - lightweight Bitcoin client
+# Copyright (C) 2019 Axel Gembe
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from typing import List, Dict, Callable, Any
+from abc import ABC, abstractmethod
+
+from PyQt5.QtGui import QColor
+from PyQt5.QtCore import Qt
+
+from electroncash.i18n import _
+from electroncash.qrreaders import QrCodeResult
+
+from electroncash_gui.qt.utils import QColorLerp
+from electroncash_gui.qt.util import ColorScheme
+
+class QrReaderValidatorResult():
+ """
+ Result of a QR code validator
+ """
+
+ def __init__(self):
+ self.accepted: bool = False
+
+ self.message: str = None
+ self.message_color: QColor = None
+
+ self.simple_result : str = None
+
+ self.result_usable: Dict[QrCodeResult, bool] = {}
+ self.result_colors: Dict[QrCodeResult, QColor] = {}
+ self.result_messages: Dict[QrCodeResult, str] = {}
+
+ self.selected_results: List[QrCodeResult] = []
+
+
+class AbstractQrReaderValidator(ABC):
+ """
+ Abstract base class for QR code result validators.
+ """
+
+ @abstractmethod
+ def validate_results(self, results: List[QrCodeResult]) -> QrReaderValidatorResult:
+ """
+ Checks a list of QR code results for usable codes.
+ """
+
+class QrReaderValidatorCounting(AbstractQrReaderValidator):
+ """
+ This QR code result validator doesn't directly accept any results but maintains a dictionary
+ of detection counts in `result_counts`.
+ """
+
+ result_counts: Dict[QrCodeResult, int] = {}
+
+ def validate_results(self, results: List[QrCodeResult]) -> QrReaderValidatorResult:
+ res = QrReaderValidatorResult()
+
+ for result in results:
+ # Increment the detection count
+ if not result in self.result_counts:
+ self.result_counts[result] = 0
+ self.result_counts[result] += 1
+
+ # Search for missing results, iterate over a copy because the loop might modify the dict
+ for result in self.result_counts.copy():
+ # Count down missing results
+ if result in results:
+ continue
+ self.result_counts[result] -= 2
+ # When the count goes to zero, remove
+ if self.result_counts[result] < 1:
+ del self.result_counts[result]
+
+ return res
+
+class QrReaderValidatorColorizing(QrReaderValidatorCounting):
+ """
+ This QR code result validator doesn't directly accept any results but colorizes the results
+ based on the counts maintained by `QrReaderValidatorCounting`.
+ """
+
+ WEAK_COLOR: QColor = QColor(Qt.red)
+ STRONG_COLOR: QColor = QColor(Qt.green)
+
+ strong_count: int = 10
+
+ def validate_results(self, results: List[QrCodeResult]) -> QrReaderValidatorResult:
+ res = super().validate_results(results)
+
+ # Colorize the QR code results by their detection counts
+ for result in results:
+ # Enforce strong_count as upper limit
+ self.result_counts[result] = min(self.result_counts[result], self.strong_count)
+
+ # Interpolate between WEAK_COLOR and STRONG_COLOR based on count / strong_count
+ lerp_factor = (self.result_counts[result] - 1) / self.strong_count
+ lerped_color = QColorLerp(self.WEAK_COLOR, self.STRONG_COLOR, lerp_factor)
+ res.result_colors[result] = lerped_color
+
+ return res
+
+class QrReaderValidatorStrong(QrReaderValidatorColorizing):
+ """
+ This QR code result validator doesn't directly accept any results but passes every strong
+ detection in the return values `selected_results`.
+ """
+
+ def validate_results(self, results: List[QrCodeResult]) -> QrReaderValidatorResult:
+ res = super().validate_results(results)
+
+ for result in results:
+ if self.result_counts[result] >= self.strong_count:
+ res.selected_results.append(result)
+ break
+
+ return res
+
+class QrReaderValidatorCounted(QrReaderValidatorStrong):
+ """
+ This QR code result validator accepts a result as soon as there is at least `minimum` and at
+ most `maximum` QR code(s) with strong detection.
+ """
+
+ def __init__(self, minimum: int = 1, maximum: int = 1):
+ super().__init__()
+ self.minimum = minimum
+ self.maximum = maximum
+
+ def validate_results(self, results: List[QrCodeResult]) -> QrReaderValidatorResult:
+ res = super().validate_results(results)
+
+ num_results = len(res.selected_results)
+ if num_results < self.minimum:
+ if num_results > 0:
+ res.message = _('Too few QR codes detected.')
+ res.message_color = ColorScheme.RED.as_color()
+ elif num_results > self.maximum:
+ res.message = _('Too many QR codes detected.')
+ res.message_color = ColorScheme.RED.as_color()
+ else:
+ res.accepted = True
+ res.simple_result = (results and results[0].data) or '' # hack added by calin just to take the first one
+
+ return res
diff --git a/electroncash_gui/qt/qrreader/video_overlay.py b/electroncash_gui/qt/qrreader/video_overlay.py
new file mode 100644
index 000000000000..1e5b5437811c
--- /dev/null
+++ b/electroncash_gui/qt/qrreader/video_overlay.py
@@ -0,0 +1,172 @@
+#!/usr/bin/env python3
+#
+# Electron Cash - lightweight Bitcoin client
+# Copyright (C) 2019 Axel Gembe
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from typing import List
+
+from PyQt5.QtWidgets import QWidget
+from PyQt5.QtGui import QPainter, QPaintEvent, QPen, QPainterPath, QColor, QTransform
+from PyQt5.QtCore import QPoint, QSize, QRect, QRectF, Qt
+from PyQt5.QtSvg import QSvgRenderer
+
+from electroncash.qrreaders import QrCodeResult
+
+from .validator import QrReaderValidatorResult
+
+class QrReaderVideoOverlay(QWidget):
+ """
+ Overlays the QR scanner results over the video
+ """
+
+ BG_RECT_PADDING = 10
+ BG_RECT_CORNER_RADIUS = 10.0
+ BG_RECT_OPACITY = 0.75
+
+ QR_FINDER_OPACITY = 0.25
+ QR_FINDER_SIZE = 0.5
+
+ def __init__(self, parent: QWidget = None):
+ super().__init__(parent)
+
+ self.results = []
+ self.flip_x = False
+ self.validator_results = None
+ self.crop = None
+ self.resolution = None
+
+ self.qr_outline_pen = QPen()
+ self.qr_outline_pen.setColor(Qt.red)
+ self.qr_outline_pen.setWidth(3)
+ self.qr_outline_pen.setStyle(Qt.DotLine)
+
+ self.text_pen = QPen()
+ self.text_pen.setColor(Qt.black)
+
+ self.bg_rect_pen = QPen()
+ self.bg_rect_pen.setColor(Qt.black)
+ self.bg_rect_pen.setStyle(Qt.DotLine)
+ self.bg_rect_fill = QColor(255, 255, 255, int(255 * self.BG_RECT_OPACITY))
+
+ self.qr_finder = QSvgRenderer(":icons/qr_finder.svg")
+
+ def set_results(self, results: List[QrCodeResult], flip_x: bool,
+ validator_results: QrReaderValidatorResult):
+ self.results = results
+ self.flip_x = flip_x
+ self.validator_results = validator_results
+ self.update()
+
+ def set_crop(self, crop: QRect):
+ self.crop = crop
+
+ def set_resolution(self, resolution: QSize):
+ self.resolution = resolution
+
+ def paintEvent(self, _event: QPaintEvent):
+ if not self.crop or not self.resolution:
+ return
+
+ painter = QPainter(self)
+
+ # Keep a backup of the transform and create a new one
+ transform = painter.worldTransform()
+
+ # Set scaling transform
+ transform = transform.scale(self.width() / self.resolution.width(),
+ self.height() / self.resolution.height())
+
+ # Compute the transform to flip the coordinate system on the x axis
+ transform_flip = QTransform()
+ if self.flip_x:
+ transform_flip = transform_flip.translate(float(self.resolution.width()), 0.0)
+ transform_flip = transform_flip.scale(-1.0, 1.0)
+
+ # Small helper for tuple to QPoint
+ def toqp(point):
+ return QPoint(int(point[0]), int(point[1]))
+
+ # Starting from here we care about AA
+ painter.setRenderHint(QPainter.Antialiasing)
+
+ # Draw the QR code finder overlay
+ painter.setWorldTransform(transform_flip * transform, False)
+ painter.setOpacity(self.QR_FINDER_OPACITY)
+ qr_finder_size = self.crop.size() * self.QR_FINDER_SIZE
+ tmp = (self.crop.size() - qr_finder_size) / 2
+ qr_finder_pos = QPoint(tmp.width(), tmp.height()) + self.crop.topLeft()
+ qr_finder_rect = QRect(qr_finder_pos, qr_finder_size)
+ self.qr_finder.render(painter, QRectF(qr_finder_rect))
+ painter.setOpacity(1.0)
+
+ # Draw all the QR code results
+ for res in self.results:
+ painter.setWorldTransform(transform_flip * transform, False)
+
+ # Draw lines between all of the QR code points
+ pen = QPen(self.qr_outline_pen)
+ if res in self.validator_results.result_colors:
+ pen.setColor(self.validator_results.result_colors[res])
+ painter.setPen(pen)
+ num_points = len(res.points)
+ for i in range(0, num_points):
+ i_n = i + 1
+
+ line_from = toqp(res.points[i])
+ line_from += self.crop.topLeft()
+
+ line_to = toqp(res.points[i_n] if i_n < num_points else res.points[0])
+ line_to += self.crop.topLeft()
+
+ painter.drawLine(line_from, line_to)
+
+ # Draw the QR code data
+ # Note that we reset the world transform to only the scaled transform
+ # because otherwise the text could be flipped. We only use transform_flip
+ # to map the center point of the result.
+ painter.setWorldTransform(transform, False)
+ font_metrics = painter.fontMetrics()
+ data_metrics = QSize(font_metrics.horizontalAdvance(res.data), font_metrics.capHeight())
+
+ center_pos = toqp(res.center)
+ center_pos += self.crop.topLeft()
+ center_pos = transform_flip.map(center_pos)
+
+ text_offset = QPoint(data_metrics.width(), data_metrics.height())
+ text_offset = text_offset / 2
+ text_offset.setX(-text_offset.x())
+ center_pos += text_offset
+
+ padding = self.BG_RECT_PADDING
+ bg_rect_pos = center_pos - QPoint(padding, data_metrics.height() + padding)
+ bg_rect_size = data_metrics + (QSize(padding, padding) * 2)
+ bg_rect = QRect(bg_rect_pos, bg_rect_size)
+ bg_rect_path = QPainterPath()
+ radius = self.BG_RECT_CORNER_RADIUS
+ bg_rect_path.addRoundedRect(QRectF(bg_rect), radius, radius, Qt.AbsoluteSize)
+ painter.setPen(self.bg_rect_pen)
+ painter.fillPath(bg_rect_path, self.bg_rect_fill)
+ painter.drawPath(bg_rect_path)
+
+ painter.setPen(self.text_pen)
+ painter.drawText(center_pos, res.data)
diff --git a/electroncash_gui/qt/qrreader/video_surface.py b/electroncash_gui/qt/qrreader/video_surface.py
new file mode 100644
index 000000000000..42b15685825b
--- /dev/null
+++ b/electroncash_gui/qt/qrreader/video_surface.py
@@ -0,0 +1,87 @@
+#!/usr/bin/env python3
+#
+# Electron Cash - lightweight Bitcoin client
+# Copyright (C) 2019 Axel Gembe
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from typing import List
+
+from PyQt5.QtMultimedia import (QVideoFrame, QAbstractVideoBuffer, QAbstractVideoSurface,
+ QVideoSurfaceFormat)
+from PyQt5.QtGui import QImage
+from PyQt5.QtCore import QObject, pyqtSignal
+
+from electroncash.i18n import _
+from electroncash.util import print_error
+
+class QrReaderVideoSurface(QAbstractVideoSurface):
+ """
+ Receives QVideoFrames from QCamera, converts them into a QImage, flips the X and Y axis if
+ necessary and sends them to listeners via the frame_available event.
+ """
+
+ def __init__(self, parent: QObject = None):
+ super().__init__(parent)
+
+ def present(self, frame: QVideoFrame) -> bool:
+ if not frame.isValid():
+ return False
+
+ image_format = QVideoFrame.imageFormatFromPixelFormat(frame.pixelFormat())
+ if image_format == QVideoFrame.Format_Invalid:
+ print_error(_('QR code scanner for video frame with invalid pixel format'))
+ return False
+
+ if not frame.map(QAbstractVideoBuffer.ReadOnly):
+ print_error(_('QR code scanner failed to map video frame'))
+ return False
+
+ try:
+ img = QImage(frame.bits(), frame.width(), frame.height(), image_format)
+
+ # Check whether we need to flip the image on any axis
+ surface_format = self.surfaceFormat()
+ flip_x = surface_format.isMirrored()
+ flip_y = surface_format.scanLineDirection() == QVideoSurfaceFormat.BottomToTop
+
+ # Mirror the image if needed
+ if flip_x or flip_y:
+ img = img.mirrored(flip_x, flip_y)
+
+ # Create a copy of the image so the original frame data can be freed
+ img = img.copy()
+ finally:
+ frame.unmap()
+
+ self.frame_available.emit(img)
+
+ return True
+
+ def supportedPixelFormats(self, handle_type: QAbstractVideoBuffer.HandleType) -> List[QVideoFrame.PixelFormat]:
+ if handle_type == QAbstractVideoBuffer.NoHandle:
+ # We support all pixel formats that can be understood by QImage directly
+ return [QVideoFrame.Format_ARGB32, QVideoFrame.Format_ARGB32_Premultiplied,
+ QVideoFrame.Format_RGB32, QVideoFrame.Format_RGB24, QVideoFrame.Format_RGB565,
+ QVideoFrame.Format_RGB555, QVideoFrame.Format_ARGB8565_Premultiplied]
+ return []
+
+ frame_available = pyqtSignal(QImage)
diff --git a/electroncash_gui/qt/qrreader/video_widget.py b/electroncash_gui/qt/qrreader/video_widget.py
new file mode 100644
index 000000000000..c3fd4197536f
--- /dev/null
+++ b/electroncash_gui/qt/qrreader/video_widget.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python3
+#
+# Electron Cash - lightweight Bitcoin client
+# Copyright (C) 2019 Axel Gembe
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from PyQt5.QtWidgets import QWidget
+from PyQt5.QtGui import QPixmap, QPainter, QPaintEvent
+
+class QrReaderVideoWidget(QWidget):
+ """
+ Simple widget for drawing a pixmap
+ """
+
+ USE_BILINEAR_FILTER = True
+
+ def __init__(self, parent: QWidget = None):
+ super().__init__(parent)
+
+ self.pixmap = None
+
+ def paintEvent(self, _event: QPaintEvent):
+ if not self.pixmap:
+ return
+ painter = QPainter(self)
+ if self.USE_BILINEAR_FILTER:
+ painter.setRenderHint(QPainter.SmoothPixmapTransform)
+ painter.drawPixmap(self.rect(), self.pixmap, self.pixmap.rect())
+
+ def setPixmap(self, pixmap: QPixmap):
+ self.pixmap = pixmap
+ self.update()
diff --git a/electroncash_gui/qt/qrtextedit.py b/electroncash_gui/qt/qrtextedit.py
new file mode 100644
index 000000000000..b020380f048f
--- /dev/null
+++ b/electroncash_gui/qt/qrtextedit.py
@@ -0,0 +1,178 @@
+import sys
+
+from electroncash.i18n import _
+from electroncash.plugins import run_hook
+from electroncash import util
+from PyQt5.QtGui import *
+from PyQt5.QtCore import *
+from PyQt5.QtWidgets import QFileDialog, QAbstractButton, QWidget, QApplication, QMenu
+
+from .util import ButtonsTextEdit, MessageBoxMixin, ColorScheme
+
+class _QrCodeTextEdit(ButtonsTextEdit):
+ def __init__(self, text=None):
+ ButtonsTextEdit.__init__(self, text)
+ self.qr_button = None
+
+ def get_qr_icon(self):
+ return ":icons/qrcode_white.svg" if ColorScheme.dark_scheme else ":icons/qrcode.svg"
+
+ def showEvent(self, e):
+ super().showEvent(e)
+ if sys.platform in ('darwin',) and isinstance(self.qr_button, QAbstractButton):
+ # on Darwin it's entirely possible that the color scheme changes
+ # from underneath our feet, so force a re-set of the icon on show.
+ self.qr_button.setIcon(QIcon(self.get_qr_icon()))
+
+
+class ShowQRTextEdit(_QrCodeTextEdit):
+
+ def __init__(self, text=None):
+ _QrCodeTextEdit.__init__(self, text)
+ self.setReadOnly(1)
+ self.qr_button = self.addButton(self.get_qr_icon(), self.qr_show, _("Show as QR code"))
+
+ run_hook('show_text_edit', self)
+
+ def qr_show(self):
+ from .qrcodewidget import QRDialog
+ try:
+ s = str(self.toPlainText())
+ except:
+ s = self.toPlainText()
+ QRDialog(s).exec_()
+
+ def contextMenuEvent(self, e):
+ m = self.createStandardContextMenu()
+ m.addSeparator()
+ m.addAction(_("Show as QR code"), self.qr_show)
+ m.exec_(e.globalPos())
+
+
+class ScanQRTextEdit(_QrCodeTextEdit, MessageBoxMixin):
+
+ def __init__(self, text="", allow_multi=False):
+ _QrCodeTextEdit.__init__(self, text)
+ self.allow_multi = allow_multi
+ self.setReadOnly(0)
+ self.qr_button = self.addButton(self.get_qr_icon(), self.qr_input, _("Read QR code"))
+ qr_menu = QMenu()
+ qr_menu.addAction(_("Read QR code from camera"), self.qr_input)
+ qr_menu.addAction(_("Read QR from screen"), self.screenshot_input)
+ self.qr_button.setMenu(qr_menu)
+ self.addButton(":icons/file.png", self.file_input, _("Read text or image file"))
+ run_hook('scan_text_edit', self)
+
+ def file_input(self):
+ fileName, __ = QFileDialog.getOpenFileName(self, _('Load a text file or scan an image for QR codes'))
+ if not fileName:
+ return
+
+ image = QImage()
+ if image.load(fileName):
+ scanned_qrs = self.scan_qr_from_image(image)
+ if not len(scanned_qrs):
+ self.show_error(_("No QR code was found in the selected image file."), title=_("No QR code found"))
+ return
+ if len(scanned_qrs) > 1:
+ self.show_error(_("More than one QR code was found in the selected image file."), title=_("More than one QR code found"))
+ return
+
+ self.setText(scanned_qrs[0].data)
+ return
+
+ try:
+ with open(fileName, "r", encoding='utf-8') as f:
+ data = f.read()
+ except UnicodeDecodeError as reason:
+ self.show_error(_("The selected file appears to be a binary file.") +"\n"+ _("Please ensure you only import text files."), title=_("Not a text file"))
+ return
+ self.setText(data)
+
+ def screenshot_input(self):
+ scanned_qr = None
+ for screen in QApplication.instance().screens():
+ scan_result = self.scan_qr_from_image(screen.grabWindow(0).toImage())
+ if len(scan_result) > 0:
+ if (scanned_qr is not None) or len(scan_result) > 1:
+ self.show_error(_("More than one QR code was found on the screen."), title=_("More than one QR code found"))
+ return
+ scanned_qr = scan_result
+
+ if scanned_qr is None:
+ self.show_error(_("No QR code was found on the screen."), title=_("No QR code found"))
+ return
+ self.setText(scanned_qr[0].data)
+
+ def scan_qr_from_image(self, image):
+ from electroncash.qrreaders import get_qr_reader
+ qr_reader = get_qr_reader()
+ if not qr_reader:
+ self.show_error(_("Unable to scan image.") + "\n" +
+ _("The platform QR detection library is not available."))
+ return
+
+ image_y800 = image.convertToFormat(QImage.Format_Grayscale8)
+ res = qr_reader.read_qr_code(
+ image_y800.constBits().__int__(), image_y800.byteCount(),
+ image_y800.bytesPerLine(),
+ image_y800.width(),
+ image_y800.height()
+ )
+
+ return res
+
+ # Due to the asynchronous nature of the qr reader we need to keep the
+ # dialog instance as member variable to prevent reentrancy/multiple ones
+ # from being presented at once.
+ qr_dialog = None
+
+ def qr_input(self, callback = None):
+ if self.qr_dialog:
+ # Re-entrancy prevention -- there is some lag between when the user
+ # taps the QR button and the modal dialog appears. We want to
+ # prevent multiple instances of the dialog from appearing, so we
+ # must do this.
+ util.print_error("[ScanQRTextEdit] Warning: QR dialog is already presented, ignoring.")
+ return
+ from . import ElectrumGui
+ if ElectrumGui.instance.warn_if_cant_import_qrreader(self):
+ return
+ from electroncash import get_config
+ from .qrreader import QrReaderCameraDialog
+ try:
+ self.qr_dialog = QrReaderCameraDialog(parent=self.top_level_window())
+
+ def _on_qr_reader_finished(success: bool, error: str, result):
+ if self.qr_dialog:
+ self.qr_dialog.deleteLater(); self.qr_dialog = None
+ if not success:
+ if error:
+ self.show_error(error)
+ return
+ if not result:
+ result = ''
+ if self.allow_multi:
+ new_text = self.text() + result + '\n'
+ else:
+ new_text = result
+ self.setText(new_text)
+ if callback and success:
+ callback(result)
+
+ self.qr_dialog.qr_finished.connect(_on_qr_reader_finished)
+ self.qr_dialog.start_scan(get_config().get_video_device())
+ except Exception as e:
+ if util.is_verbose:
+ import traceback
+ traceback.print_exc()
+ self.qr_dialog = None
+ self.show_error(str(e))
+
+ def contextMenuEvent(self, e):
+ m = self.createStandardContextMenu()
+ m.addSeparator()
+ m.addAction(_("Read QR code from camera"), self.qr_input)
+ m.addAction(_("Read QR from screen"), self.screenshot_input)
+ m.addAction(_("Read text or image file"), self.file_input)
+ m.exec_(e.globalPos())
diff --git a/gui/qt/qrwindow.py b/electroncash_gui/qt/qrwindow.py
similarity index 85%
rename from gui/qt/qrwindow.py
rename to electroncash_gui/qt/qrwindow.py
index b1f264bd0c15..f078dd1d61c4 100644
--- a/gui/qt/qrwindow.py
+++ b/electroncash_gui/qt/qrwindow.py
@@ -65,6 +65,10 @@ def __init__(self):
self.amount_label.setTextInteractionFlags(Qt.TextSelectableByMouse)
vbox.addWidget(self.amount_label)
+ self.op_return_label = WWLabel()
+ self.op_return_label.setTextInteractionFlags(Qt.TextSelectableByMouse)
+ vbox.addWidget(self.op_return_label)
+
vbox.addStretch(2)
copyBut = QPushButton(_("Copy QR Image"))
@@ -73,12 +77,15 @@ def __init__(self):
weakSelf = Weak.ref(self) # Qt & Python GC hygeine: don't hold references to self in non-method slots as it appears Qt+Python GC don't like this too much and may leak memory in that case.
weakQ = Weak.ref(self.qrw)
- copyBut.clicked.connect(lambda: copy_to_clipboard(weakQ(), weakSelf()))
+ weakBut = Weak.ref(copyBut)
+ copyBut.clicked.connect(lambda: copy_to_clipboard(weakQ(), weakBut()))
saveBut.clicked.connect(lambda: save_to_file(weakQ(), weakSelf()))
- def set_content(self, win, address_text, amount, message, url):
+ def set_content(self, win, address_text, amount, message, url, *, op_return = None, op_return_raw = None):
+ if op_return is not None and op_return_raw is not None:
+ raise ValueError('Must specify exactly one of op_return or op_return_hex as kwargs to QR_Window.set_content')
self.address_label.setText(address_text)
if amount:
amount_text = '{} {}'.format(win.format_amount(amount), win.base_unit())
@@ -87,6 +94,11 @@ def set_content(self, win, address_text, amount, message, url):
self.amount_label.setText(amount_text)
self.msg_label.setText(message)
self.qrw.setData(url)
+ if op_return:
+ self.op_return_label.setText(f'OP_RETURN: {str(op_return)}')
+ elif op_return_raw:
+ self.op_return_label.setText(f'OP_RETURN (raw): {str(op_return_raw)}')
+ self.op_return_label.setVisible(bool(op_return or op_return_raw))
self.layout().activate()
def closeEvent(self, e):
diff --git a/gui/qt/request_list.py b/electroncash_gui/qt/request_list.py
similarity index 91%
rename from gui/qt/request_list.py
rename to electroncash_gui/qt/request_list.py
index 2fc06e2ba6b8..024f0179ec6b 100644
--- a/gui/qt/request_list.py
+++ b/electroncash_gui/qt/request_list.py
@@ -27,11 +27,11 @@
from electroncash.i18n import _
from electroncash.util import format_time, age
from electroncash.plugins import run_hook
-from electroncash.paymentrequest import PR_UNKNOWN
+from electroncash.paymentrequest import pr_tooltips, PR_UNKNOWN
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import QTreeWidgetItem, QMenu
-from .util import MyTreeWidget, pr_tooltips, pr_icons
+from .util import MyTreeWidget, pr_icons
class RequestList(MyTreeWidget):
@@ -39,7 +39,7 @@ class RequestList(MyTreeWidget):
def __init__(self, parent):
- MyTreeWidget.__init__(self, parent, self.create_menu, [_('Date'), _('Address'), '', _('Description'), _('Amount'), _('Status')], 3)
+ MyTreeWidget.__init__(self, parent, self.create_menu, [_('Date'), _('Address'), '', _('Description'), _('Amount'), _('Status')], 3, deferred_updates=False)
self.currentItemChanged.connect(self.item_changed)
self.itemClicked.connect(self.item_changed)
self.setSortingEnabled(True)
@@ -58,6 +58,8 @@ def item_changed(self, item):
return
expires = age(req['time'] + req['exp']) if req.get('exp') else _('Never')
amount = req['amount']
+ opr = req.get('op_return') or req.get('op_return_raw')
+ opr_is_raw = bool(req.get('op_return_raw'))
message = self.wallet.labels.get(addr.to_storage_string(), '')
self.parent.receive_address = addr
self.parent.receive_address_e.setText(addr.to_full_ui_string())
@@ -66,7 +68,10 @@ def item_changed(self, item):
self.parent.expires_combo.hide()
self.parent.expires_label.show()
self.parent.expires_label.setText(expires)
+ self.parent.receive_opreturn_rawhex_cb.setChecked(opr_is_raw)
+ self.parent.receive_opreturn_e.setText(opr or '')
self.parent.save_request_button.setEnabled(False)
+ self.parent.cash_account_e.set_cash_acct()
def select_item_by_address(self, address):
self.setCurrentItem(None)
@@ -124,10 +129,10 @@ def on_update(self):
requestor = req.get('name', '')
amount_str = self.parent.format_amount(amount) if amount else ""
item = QTreeWidgetItem([date, address.to_ui_string(), '', message,
- amount_str, pr_tooltips.get(status,'')])
+ amount_str, _(pr_tooltips.get(status,''))])
item.setData(0, Qt.UserRole, address)
if signature is not None:
- item.setIcon(2, QIcon(":icons/seal.png"))
+ item.setIcon(2, QIcon(":icons/seal.svg"))
item.setToolTip(2, 'signed by '+ requestor)
if status is not PR_UNKNOWN:
item.setIcon(6, QIcon(pr_icons.get(status)))
@@ -146,7 +151,7 @@ def create_menu(self, position):
column_title = self.headerItem().text(column)
column_data = item.text(column)
menu = QMenu(self)
- menu.addAction(_("Copy {}").format(column_title), lambda: self.parent.app.clipboard().setText(column_data))
+ menu.addAction(_("Copy {}").format(column_title), lambda: self.parent.app.clipboard().setText(column_data.strip()))
menu.addAction(_("Copy URI"), lambda: self.parent.view_and_paste('URI', '', self.parent.get_request_URI(addr)))
menu.addAction(_("Save as BIP70 file"), lambda: self.parent.export_payment_request(addr))
menu.addAction(_("Delete"), lambda: self.parent.delete_payment_request(addr))
diff --git a/gui/qt/scan_beyond_gap.py b/electroncash_gui/qt/scan_beyond_gap.py
similarity index 99%
rename from gui/qt/scan_beyond_gap.py
rename to electroncash_gui/qt/scan_beyond_gap.py
index 51d1b6b63c5b..392c9394f226 100644
--- a/gui/qt/scan_beyond_gap.py
+++ b/electroncash_gui/qt/scan_beyond_gap.py
@@ -97,7 +97,7 @@ def cancel(self):
self.found_label.setText('')
def reject():
super(ScanBeyondGap, self).reject()
- if self.thread.isAlive():
+ if self.thread.is_alive():
# We do the below so the user can get the "Canceling..." text
# before we begin waiting for the worker thread and blocking the
# UI thread.
diff --git a/gui/qt/seed_dialog.py b/electroncash_gui/qt/seed_dialog.py
similarity index 60%
rename from gui/qt/seed_dialog.py
rename to electroncash_gui/qt/seed_dialog.py
index e963bc9ad553..63188f132348 100644
--- a/gui/qt/seed_dialog.py
+++ b/electroncash_gui/qt/seed_dialog.py
@@ -27,15 +27,25 @@
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from electroncash.i18n import _
+from electroncash import mnemonic
from .util import *
from .qrtextedit import ShowQRTextEdit, ScanQRTextEdit
-def seed_warning_msg(seed):
+def seed_warning_msg(seed, has_der=False, has_ext=False):
+ extra = ''
+ if has_der:
+ if has_ext:
+ extra = (' ' + _('Additionally, save the seed extension and derivation path as well.') + ' ')
+ else:
+ extra = (' ' + _('Additionally, save the derivation path as well.') + ' ')
+ elif has_ext:
+ extra = (' ' + _('Additionally, save the seed extension as well.') + ' ')
return ''.join([
"",
_("Please save these %d words on paper (order is important). "),
+ extra,
_("This seed will allow you to recover your wallet in case "
"of computer failure."),
"
",
@@ -52,7 +62,6 @@ class SeedLayout(QVBoxLayout):
#options
is_bip39 = False
is_ext = False
- is_bip39_145 = False
def seed_options(self):
dialog = QDialog()
@@ -66,62 +75,26 @@ def f(b):
self.is_seed = (lambda x: bool(x)) if b else self.saved_is_seed
self.is_bip39 = b
self.on_edit()
- if b:
- msg = ' '.join([
- '' + _('Warning') + ': ',
- _('BIP39 seeds can be imported in Electron Cash, so that users can access funds locked in other wallets.'),
- _('However, we do not generate BIP39 seeds, because they do not meet our safety standard.'),
- _('BIP39 seeds do not include a version number, which compromises compatibility with future software.'),
- _('We do not guarantee that BIP39 imports will always be supported in Electron Cash.'),
- ])
- else:
- msg = ''
- self.seed_warning.setText(msg)
- cb_bip39 = QCheckBox(_('BIP39 seed'))
+ cb_bip39 = QCheckBox(_('Force BIP39 interpretation of this seed'))
cb_bip39.toggled.connect(f)
cb_bip39.setChecked(self.is_bip39)
vbox.addWidget(cb_bip39)
-
-
-
- if 'bip39_145' in self.options:
- def f(b):
- self.is_seed = (lambda x: bool(x)) if b else self.saved_is_seed
- self.on_edit()
- self.is_bip39 = b
- if b:
- msg = ' '.join([
- '' + _('Warning') + ': BIP39 seeds are dangerous!' + '
',
- _('BIP39 seeds can be imported in Electron Cash so that users can access funds locked in other wallets.'),
- _('However, BIP39 seeds do not include a version number, which compromises compatibility with future wallet software.'),
- '
',
- _('We do not guarantee that BIP39 imports will always be supported in Electron Cash.'),
- _('In addition, Electron Cash does not verify the checksum of BIP39 seeds; make sure you type your seed correctly.'),
- ])
- else:
- msg = ''
- self.seed_warning.setText(msg)
- cb_bip39_145 = QCheckBox(_('Use Coin Type 145 with bip39'))
- cb_bip39_145.toggled.connect(f)
- cb_bip39_145.setChecked(self.is_bip39_145)
- vbox.addWidget(cb_bip39_145)
-
-
vbox.addLayout(Buttons(OkButton(dialog)))
if not dialog.exec_():
return None
self.is_ext = cb_ext.isChecked() if 'ext' in self.options else False
self.is_bip39 = cb_bip39.isChecked() if 'bip39' in self.options else False
- self.is_bip39_145 = cb_bip39_145.isChecked() if 'bip39_145' in self.options else False
- def __init__(self, seed=None, title=None, icon=True, msg=None, options=None, is_seed=None, passphrase=None, parent=None, editable=True):
+ def __init__(self, seed=None, title=None, icon=True, msg=None, options=None, is_seed=None, passphrase=None, parent=None, editable=True,
+ derivation=None, seed_type=None):
QVBoxLayout.__init__(self)
self.parent = parent
- self.options = options
+ self.options = options or ()
if title:
self.addWidget(WWLabel(title))
self.seed_e = ButtonsTextEdit()
- self.seed_e.setReadOnly(not editable)
+ self.editable = bool(editable)
+ self.seed_e.setReadOnly(not self.editable)
if seed:
self.seed_e.setText(seed)
else:
@@ -133,7 +106,7 @@ def __init__(self, seed=None, title=None, icon=True, msg=None, options=None, is_
hbox = QHBoxLayout()
if icon:
logo = QLabel()
- logo.setPixmap(QPixmap(":icons/seed.png").scaledToWidth(64))
+ logo.setPixmap(QIcon(":icons/seed.png").pixmap(64))
logo.setMaximumWidth(60)
hbox.addWidget(logo)
hbox.addWidget(self.seed_e)
@@ -142,42 +115,75 @@ def __init__(self, seed=None, title=None, icon=True, msg=None, options=None, is_
hbox.addStretch(1)
self.seed_type_label = QLabel('')
hbox.addWidget(self.seed_type_label)
- if options:
+ if self.options:
opt_button = EnterButton(_('Options'), self.seed_options)
hbox.addWidget(opt_button)
self.addLayout(hbox)
+ grid_maybe = QGridLayout() # may not be used if none of the below if expressions evaluates to true, that's ok.
+ grid_maybe.setColumnStretch(1, 1) # we want the right-hand column to take up as much space as it needs.
+ grid_row = 0
+ if seed_type:
+ seed_type_text = mnemonic.format_seed_type_name_for_ui(seed_type)
+ grid_maybe.addWidget(QLabel(_("Seed format") + ':'), grid_row, 0)
+ grid_maybe.addWidget(QLabel(f'{seed_type_text}'), grid_row, 1, Qt.AlignLeft)
+ grid_row += 1
if passphrase:
- hbox = QHBoxLayout()
passphrase_e = QLineEdit()
passphrase_e.setText(passphrase)
passphrase_e.setReadOnly(True)
- hbox.addWidget(QLabel(_("Your seed extension is") + ':'))
- hbox.addWidget(passphrase_e)
- self.addLayout(hbox)
+ grid_maybe.addWidget(QLabel(_("Your seed extension is") + ':'), grid_row, 0)
+ grid_maybe.addWidget(passphrase_e, grid_row, 1)
+ grid_row += 1
+ if derivation:
+ der_e = QLineEdit()
+ der_e.setText(str(derivation))
+ der_e.setReadOnly(True)
+ grid_maybe.addWidget(QLabel(_("Wallet derivation path") + ':'), grid_row, 0)
+ grid_maybe.addWidget(der_e, grid_row, 1)
+ grid_row += 1
+ if grid_row > 0: # only if above actually added widgets
+ self.addLayout(grid_maybe)
self.addStretch(1)
self.seed_warning = WWLabel('')
- if msg:
- self.seed_warning.setText(seed_warning_msg(seed))
+ self.has_warning_message = bool(msg)
+ if self.has_warning_message:
+ self.seed_warning.setText(seed_warning_msg(seed, bool(derivation), bool(passphrase)))
self.addWidget(self.seed_warning)
def get_seed(self):
text = self.seed_e.text()
return ' '.join(text.split())
+ _mnem = None
def on_edit(self):
- from electroncash.bitcoin import seed_type
+ may_clear_warning = not self.has_warning_message and self.editable
+ if not self._mnem:
+ # cache the lang wordlist so it doesn't need to get loaded each time.
+ # This speeds up seed_type_name and Mnemonic.is_checksum_valid
+ self._mnem = mnemonic.Mnemonic('en')
s = self.get_seed()
b = self.is_seed(s)
if not self.is_bip39:
- t = seed_type(s)
+ t = mnemonic.format_seed_type_name_for_ui(mnemonic.seed_type_name(s))
label = _('Seed Type') + ': ' + t if t else ''
+ if t and may_clear_warning and 'bip39' in self.options:
+ match_set = mnemonic.autodetect_seed_type(s)
+ if len(match_set) > 1 and mnemonic.SeedType.BIP39 in match_set:
+ may_clear_warning = False
+ self.seed_warning.setText(
+ _('This seed is ambiguous and may also be interpreted as a BIP39 seed.')
+ + '
'
+ + _('If you wish this seed to be interpreted as a BIP39 seed, '
+ 'then use the Options button to force BIP39 interpretation of this seed.')
+ )
else:
- from electroncash.keystore import bip39_is_checksum_valid
- is_checksum, is_wordlist = bip39_is_checksum_valid(s)
+ is_checksum, is_wordlist = self._mnem.is_checksum_valid(s)
status = ('checksum: ' + ('ok' if is_checksum else 'failed')) if is_wordlist else 'unknown wordlist'
label = 'BIP39' + ' (%s)'%status
self.seed_type_label.setText(label)
- self.parent.next_button.setEnabled(b)
+ self.parent.next_button.setEnabled(bool(b))
+ if may_clear_warning:
+ self.seed_warning.setText('')
class KeysLayout(QVBoxLayout):
@@ -194,17 +200,17 @@ def get_text(self):
return self.text_e.text()
def on_edit(self):
- b = self.is_valid(self.get_text())
+ b = bool(self.is_valid(self.get_text()))
self.parent.next_button.setEnabled(b)
class SeedDialog(WindowModalDialog):
- def __init__(self, parent, seed, passphrase):
+ def __init__(self, parent, seed, passphrase, derivation=None, seed_type=None):
WindowModalDialog.__init__(self, parent, ('Electron Cash - ' + _('Seed')))
self.setMinimumWidth(400)
vbox = QVBoxLayout(self)
title = _("Your wallet generation seed is:")
- slayout = SeedLayout(title=title, seed=seed, msg=True, passphrase=passphrase, editable=False)
+ slayout = SeedLayout(title=title, seed=seed, msg=True, passphrase=passphrase, editable=False, derivation=derivation, seed_type=seed_type)
vbox.addLayout(slayout)
vbox.addLayout(Buttons(CloseButton(self)))
diff --git a/electroncash_gui/qt/style_patcher.py b/electroncash_gui/qt/style_patcher.py
new file mode 100644
index 000000000000..252f992aaf5a
--- /dev/null
+++ b/electroncash_gui/qt/style_patcher.py
@@ -0,0 +1,54 @@
+"""
+This is used to patch the QApplication style sheet.
+It reads the current stylesheet, appends our modifications and sets the new stylesheet.
+"""
+
+from PyQt5 import QtWidgets
+from electroncash.util import print_error
+
+OLD_QDARKSTYLE_PATCH = '''
+QWidget:disabled {
+ color: hsl(0, 0, 50%);
+}
+QPushButton:disabled {
+ border-color: hsl(0, 0, 50%);
+ color: hsl(0, 0, 50%);
+}
+'''
+
+CUSTOM_PATCH_FOR_DARK_THEME = '''
+/* PayToEdit text was being clipped */
+QAbstractScrollArea {
+ padding: 0px;
+}
+/* In History tab, labels while edited were being clipped (Windows) */
+QAbstractItemView QLineEdit {
+ padding: 0px;
+ show-decoration-selected: 1;
+}
+/* Checked item in dropdowns have way too much height...
+ see #6281 and https://github.com/ColinDuquesnoy/QDarkStyleSheet/issues/200
+ */
+QComboBox::item:checked {
+ font-weight: bold;
+ max-height: 30px;
+}
+'''
+
+def patch(use_dark_theme: bool = False, darkstyle_ver: tuple = None):
+ if not use_dark_theme:
+ return
+ custom_patch = ""
+ if darkstyle_ver is None or darkstyle_ver < (2,6,8):
+ # only apply this patch to qdarkstyle < 2.6.8.
+ # 2.6.8 and above seem to not need it.
+ custom_patch = OLD_QDARKSTYLE_PATCH
+ print_error("[style_patcher] qdarkstyle < 2.6.8 detected; stylesheet patch #1 applied")
+ else:
+ # This patch is for qdarkstyle >= 2.6.8.
+ custom_patch = CUSTOM_PATCH_FOR_DARK_THEME
+ print_error("[style_patcher] qdarkstyle >= 2.6.8 detected; stylesheet patch #2 applied")
+
+ app = QtWidgets.QApplication.instance()
+ style_sheet = app.styleSheet() + custom_patch
+ app.setStyleSheet(style_sheet)
\ No newline at end of file
diff --git a/electroncash_gui/qt/token_create.py b/electroncash_gui/qt/token_create.py
new file mode 100644
index 000000000000..079b0d127012
--- /dev/null
+++ b/electroncash_gui/qt/token_create.py
@@ -0,0 +1,696 @@
+#!/usr/bin/env python3
+#
+# Electron Cash - lightweight Bitcoin Cash client
+# Copyright (C) 2023 The Electron Cash Developers
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+import hashlib
+import math
+import re
+import requests
+import threading
+import urllib.parse
+import weakref
+from typing import Optional, Tuple
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+from PyQt5.QtGui import QFont
+
+from electroncash.i18n import _
+from electroncash import address, bitcoin, networks, token, util, wallet
+
+from .main_window import ElectrumWindow
+from .util import HelpLabel, MessageBoxMixin, MONOSPACE_FONT, OnDestroyedMixin, PrintError, WaitingDialog
+
+BCMR_URL_REQUIRED_PREFIX = "https://"
+
+
+class CreateTokenForm(QtWidgets.QWidget, MessageBoxMixin, PrintError, OnDestroyedMixin):
+
+ def __init__(self, parent: ElectrumWindow):
+ assert isinstance(parent, ElectrumWindow)
+ super().__init__(parent=parent, flags=QtCore.Qt.Window)
+ MessageBoxMixin.__init__(self)
+ PrintError.__init__(self)
+ OnDestroyedMixin.__init__(self)
+ util.finalization_print_error(self)
+ self.parent = parent
+ self.wallet = self.parent.wallet
+ self.network = self.parent.network
+ self.eligible_utxos = []
+ self.other_non_dust_utxos = []
+ self.did_warn_wallet_empty = False
+ self.token_meta = self.parent.token_meta
+ self.setWindowTitle(_("Create Token") + " - " + self.wallet.basename())
+ self.setWindowIcon(QtGui.QIcon(":icons/tab_token.svg"))
+
+ self.last_size = None
+
+ grid = QtWidgets.QGridLayout()
+ l = QtWidgets.QLabel(_("Create Token"))
+ f = l.font()
+ f.setPointSize(f.pointSize() + 1)
+ f.setBold(True)
+ l.setFont(f)
+ row, col = 0, 0
+ n_cols = 3
+ grid.addWidget(l, row, col)
+ row += 1
+
+ help_text = _("In order to create a new token, you must spend a coin (UTXO) that has output number 0, e.g."
+ " \"xxxx:0\". Up to ~{tx_fee} satoshis from this coin will be used in fees, and the rest will"
+ " go back to your wallet. If your wallet lacks any \"xxx:0\" coins, click the"
+ " \"New...\" button to send some funds to yourself to create an eligible coin with tx output"
+ " number 0.").format(
+ tx_fee=self.est_tx_fee())
+ tt = _("Select a coin from your wallet to use for token creation")
+ l = HelpLabel(_("Select Coin"), help_text)
+ l.setToolTip(tt)
+ grid.addWidget(l, row, col, 1, n_cols)
+ col += 1
+ self.cb_utxos = QtWidgets.QComboBox()
+ f = QtGui.QFont(MONOSPACE_FONT)
+ f.setPointSize(f.pointSize() - 1)
+ smaller_mono_font = f
+ self.cb_utxos.setFont(f)
+ self.cb_utxos.setToolTip(tt)
+ grid.addWidget(self.cb_utxos, row, col)
+
+ col += 1
+ self.create_coin_button = b = QtWidgets.QPushButton(_("New..."))
+ self.create_coin_button_tooltip_on = _("Create a UTXO with output number 0 from a non-0 wallet UTXO")
+ self.create_coin_button_tooltip_off = _("No eligible non-zero UTXOs left in the wallet")
+ b.setToolTip(self.create_coin_button_tooltip_on)
+ b.clicked.connect(self.create_new_coin)
+ grid.addWidget(b, row, col)
+
+ col = 0
+ row += 1
+ help_text = _("The newly created token derives its Category ID (also known as a Token ID) from the tx hash"
+ " of the \"xxx:0\" coin that was used to create it.")
+ tt = _("Category ID of the newly created token")
+ l = HelpLabel(_("Category ID"), help_text)
+ l.setToolTip(tt)
+ grid.addWidget(l, row, col)
+ col += 1
+ self.token_id_label = l = QtWidgets.QLabel("")
+ l.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse | QtCore.Qt.TextSelectableByKeyboard)
+ f = QFont(smaller_mono_font)
+ f.setPointSize(f.pointSize() + 1)
+ f.setStretch(QtGui.QFont.SemiCondensed)
+ l.setFont(f)
+ l.setToolTip(tt)
+ self.cb_utxos.currentIndexChanged.connect(self.on_cb_utxo_index_change)
+ grid.addWidget(l, row, col)
+
+ # Embed icon
+ col += 1
+ vbox = QtWidgets.QVBoxLayout()
+ vbox.setContentsMargins(6, 12, 0, 0)
+ vbox.setSpacing(0)
+ tt = _("The icon is generated from the Category ID and is for display purposes only")
+ self.icon_lbl = l = QtWidgets.QLabel()
+ l.setToolTip(tt)
+ l.setScaledContents(True)
+ l.setFixedSize(64, 64)
+ l.setAlignment(QtCore.Qt.AlignBottom | QtCore.Qt.AlignCenter)
+ l.setFrameStyle(QtWidgets.QFrame.Box)
+ vbox.addWidget(l)
+ l = QtWidgets.QLabel(_("Icon"))
+ l.setToolTip(tt)
+ l.setAlignment(QtCore.Qt.AlignTop | QtCore.Qt.AlignCenter)
+ f = l.font()
+ f.setPointSize(f.pointSize() - 1)
+ l.setFont(f)
+ vbox.addWidget(l)
+ vbox.addSpacerItem(QtWidgets.QSpacerItem(0, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding))
+ vbox.setStretch(2, 1)
+
+ grid.addLayout(vbox, row, col, 2, 1)
+
+ col = 0
+ row += 1
+ help_text = _("Specify the token properties, such as fungible amount, whether to also create an NFT, and the"
+ " properties of the optional NFT.")
+ tt = _("Specify token details")
+ l = HelpLabel(_("Specify"), help_text)
+ l.setToolTip(tt)
+ grid.addWidget(l, row, col)
+ grid.setAlignment(l, QtCore.Qt.AlignTop)
+
+ # Embed a sub-grid here for the token details
+ col += 1
+ grid2 = QtWidgets.QGridLayout()
+ row2, col2, n_cols2 = 0, 0, 2
+ grid2.setHorizontalSpacing(max(grid2.horizontalSpacing(), 6))
+ help_text = _("The fungible amount is specified at token creation time and is fixed for the token once it has"
+ " been created. In other words, one may not mint new fungible tokens after token genesis. "
+ " Valid values are in the range [0, 9223372036854775807]. Note that fungible amounts of 0 are"
+ " only allowed if the token generates an NFT, otherwise the amount must be greater than 0.")
+ tt = _("Specify the fungible amount for this token")
+ l = HelpLabel(_("Fungible Amount") + ":", help_text)
+ l.setToolTip(tt)
+ grid2.addWidget(l, row2, col2)
+
+ col2 += 1
+ self.le_fungible = le = QtWidgets.QLineEdit()
+ le.textChanged.connect(self.check_sanity)
+ le.setToolTip(tt)
+ le.setPlaceholderText("1234…")
+ grid2.addWidget(le, row2, col2)
+
+ col2 = 0
+ row2 += 1
+ self.gb_nft = gb = QtWidgets.QGroupBox(_("Has NFT"))
+ gb.setCheckable(True)
+ gb.setChecked(False)
+ row3, col3, n_cols3 = 0, 0, 2
+ grid3 = QtWidgets.QGridLayout()
+ grid3.setHorizontalSpacing(max(grid3.horizontalSpacing(), 6))
+ help_text = _("The NFT commitment is a 0-40 byte value that uniquely identifies this specific non-fungible"
+ " token. Enter up to 40 bytes worth of an even number of hexadecimal characters here to"
+ " specify the commitment, or leave this field blank for an empty commitment.")
+ tt = _("Specify the NFT commitment data as hex")
+ l = HelpLabel(_("NFT Commitment"), help_text)
+ l.setToolTip(tt)
+ grid3.addWidget(l, row3, col3)
+ col3 += 1
+ self.le_commitment = le = QtWidgets.QLineEdit()
+ le.textChanged.connect(self.check_sanity)
+ le.setToolTip(tt)
+ le.setPlaceholderText(_("Hexadecimal"))
+ grid3.addWidget(le, row3, col3)
+ col3 = 0
+ row3 += 1
+ help_text = _("NFT capabilities are \"permissions\" that the NFT has.
"
+ ""
+ "- None - Sets the NFT to be immutable and thus the only thing one can do is"
+ " send the NFT or burn it.
"
+ "- Mutable - Allows users to modify the commitment for the NFT to any value"
+ " when sending it.
"
+ "- Minting - Allows holders of this NFT to create an unlimited number of new"
+ " NFTs of the same token category.
"
+ "
")
+ tt = _("Specify the NFT's capability")
+ l = HelpLabel(_("NFT Capability"), help_text)
+ l.setToolTip(tt)
+ grid3.addWidget(l, row3, col3)
+ col3 += 1
+ hbox = QtWidgets.QHBoxLayout()
+ self.rb_none = rb = QtWidgets.QRadioButton(_("None"))
+ rb.setToolTip(_("No Capability (Immutable NFT)"))
+ hbox.addWidget(rb)
+ self.rb_mutable = rb = QtWidgets.QRadioButton(_("Mutable"))
+ rb.setToolTip(_("Mutable Capability (Editable NFT)"))
+ hbox.addWidget(rb)
+ self.rb_minting = rb = QtWidgets.QRadioButton(_("Minting"))
+ rb.setToolTip(_("Minting Capability (Minting Baton)"))
+ hbox.addWidget(rb)
+ self.rb_default = self.rb_minting
+ self.rb_default.setChecked(True) # Default to minting
+ grid3.addLayout(hbox, row3, col3)
+
+ gb.setLayout(grid3)
+ grid2.addWidget(gb, row2, col2, 1, n_cols2)
+
+ grid.addLayout(grid2, row, col, 1, n_cols - col - 1)
+
+ def maybe_auto_set_fungible_to_0(b):
+ if b and self.le_fungible.text().strip() == "":
+ self.le_fungible.setText("0")
+
+ gb.toggled.connect(maybe_auto_set_fungible_to_0)
+ gb.toggled.connect(self.check_sanity)
+ # /Embed
+
+ col = 0
+ row += 1
+ help_text = _("The destination address to which the newly created token should be sent."
+ " {coin_amt} satoshis will accompany the token on the same UTXO. You can either send this new"
+ " token to a new receiving address in your wallet, or you can send it to any Bitcoin Cash"
+ " address outside this wallet.").format(
+ coin_amt=token.heuristic_dust_limit_for_token_bearing_output())
+ tt = _("Address to which to send the newly created token")
+ l = HelpLabel(_("Send To"), help_text)
+ l.setToolTip(tt)
+ grid.addWidget(l, row, col)
+ col += 1
+ hbox = QtWidgets.QHBoxLayout()
+ self.bg_addr_radios = QtWidgets.QButtonGroup(self)
+ self.rb_me = QtWidgets.QRadioButton(_("This wallet"))
+ self.rb_me.setToolTip(_("Send to a fresh address in this wallet"))
+ self.bg_addr_radios.addButton(self.rb_me)
+ hbox.addWidget(self.rb_me)
+ tt = _("Send to any external address")
+ self.rb_ext = QtWidgets.QRadioButton("")
+ self.rb_ext.setToolTip(tt)
+ self.bg_addr_radios.addButton(self.rb_ext)
+ hbox.addWidget(self.rb_ext)
+
+ class ClickableLE(QtWidgets.QLineEdit):
+ """A line-edit that emits a "mouse_clicked" signal even if it is disabled."""
+
+ mouse_clicked = QtCore.pyqtSignal(bool)
+
+ def event(self, evt: QtCore.QEvent):
+ if evt.type() == QtCore.QEvent.MouseButtonPress:
+ self.mouse_clicked.emit(True)
+ return super().event(evt)
+
+ self.le_address = ClickableLE()
+ self.le_address.setToolTip(tt)
+ hbox.addWidget(self.le_address)
+ grid.addLayout(hbox, row, col, 1, n_cols - col - 1)
+ self.rb_me.toggled.connect(self.le_address.setDisabled)
+ self.rb_ext.toggled.connect(self.le_address.setEnabled)
+ self.rb_ext.toggled.connect(self.check_sanity)
+ self.le_address.setPlaceholderText(networks.net.CASHADDR_PREFIX + ":…")
+ self.le_address.textChanged.connect(self.check_sanity)
+ self.rb_me.setChecked(True)
+ # Ensure that clicking the address line-edit is like selecting the radio button
+ self.le_address.mouse_clicked.connect(self.rb_ext.setChecked)
+ self.le_address.mouse_clicked.connect(self.le_address.setFocus)
+
+ # BCMR Url
+ col = 0
+ row += 1
+ tt = _("Optional URL to embed as an OP_RETURN in the token genesis txn")
+ help_text = _("This field is optional, but if specified, Electron Cash will embed an OP_RETURN in the"
+ " genesis tx for this token which contains the URL and a hash of the URL's contents. This"
+ " would make the token conform to the BCMR token meta-data standard for Bitcoin Cash. The"
+ " URL must begin with {bcmr_prefix} and should serve up a BCMR-conforming JSON document.\n\n"
+ "See: https://github.com/bitjson/chip-bcmr\n\n"
+ "Electron Cash will fetch this document once before creating the token and calculate"
+ " the SHA-256 hash of this document which gets embedded into the genesis tx along with"
+ " the URL.\n\n"
+ "Therefore, before you create the token, be sure that the URL points to the final"
+ " BCMR-conforming JSON document describing this token's metadata.\n\n"
+ "Feel free to leave this field blank to not associate this token with any BCMR metadata.").format(
+ bcmr_prefix=BCMR_URL_REQUIRED_PREFIX
+ )
+ l = HelpLabel(_("BCMR URL"), help_text)
+ grid.addWidget(l, row, col)
+ col += 1
+ self.le_url = QtWidgets.QLineEdit()
+ self.le_url.setPlaceholderText(BCMR_URL_REQUIRED_PREFIX + "server.com/mytoken.json" + " " + _("(Optional)"))
+ grid.addWidget(l, row, col)
+ self.le_url.textChanged.connect(self.check_sanity)
+ grid.addWidget(self.le_url, row, col)
+ col += 1
+
+ # Bottom buttons
+ col = 0
+ row += 1
+ hbox = QtWidgets.QHBoxLayout()
+ hbox.setContentsMargins(0, 0, 0, 0)
+ self.clear_button = QtWidgets.QPushButton(_("Clear"))
+ self.clear_button.clicked.connect(self.clear_form)
+ hbox.addWidget(self.clear_button)
+ hbox.addStretch(2)
+
+ self.dlg_buttons = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel)
+ self.create_button = self.dlg_buttons.button(QtWidgets.QDialogButtonBox.Ok)
+ self.cancel_button = self.dlg_buttons.button(QtWidgets.QDialogButtonBox.Cancel)
+ self.create_button.setText(_("Create..."))
+ assert self.create_button and self.cancel_button
+ self.dlg_buttons.accepted.connect(self.do_create)
+ self.dlg_buttons.rejected.connect(self.close)
+ hbox.addWidget(self.dlg_buttons)
+ grid.addLayout(hbox, row, col, 1, n_cols)
+
+ self.setLayout(grid)
+
+ def diagnostic_name(self):
+ dn = super().diagnostic_name()
+ w = getattr(self, 'wallet', None)
+ wn = ("/" + w.diagnostic_name()) if w else ""
+ return f'{dn}{wn}'
+
+ def get_fungible_amount(self) -> Optional[int]:
+ """ Only returns a real int if our line-edit is in the 0 - 2^63-1 range"""
+ txt = self.le_fungible.text().strip()
+ if re.match("^[0-9]+$", txt):
+ try:
+ val = int(txt)
+ except (ValueError, TypeError):
+ return None
+ if val < 0 or val > 2 ** 63 - 1:
+ return None
+ return val
+ return None
+
+ def clear_form(self):
+ """Bring this form back to the initial state, clear text fields, etc"""
+ self.rb_default.setChecked(True)
+ self.gb_nft.setChecked(False)
+ self.le_commitment.clear()
+ self.le_address.clear()
+ self.rb_me.setChecked(True)
+ self.le_fungible.clear()
+ if self.cb_utxos.count():
+ self.cb_utxos.setCurrentIndex(0)
+ self.le_url.clear()
+
+ def check_sanity(self) -> bool:
+ sane = True
+ if not self.cb_utxos.count() or self.cb_utxos.currentIndex() < 0:
+ # No input token selected
+ sane = False
+ elif self.rb_ext.isChecked():
+ addr_text = self.le_address.text().strip()
+ try:
+ address.Address.from_string(addr_text)
+ except address.AddressError:
+ # Free-form address line-edit selected but address entered is invalid
+ sane = False
+ if sane:
+ famt = self.get_fungible_amount()
+ if famt is None:
+ sane = False
+ elif famt == 0 and not self.gb_nft.isChecked():
+ # Disallow fungible 0 if no NFT enabled
+ sane = False
+ if sane and self.gb_nft.isChecked():
+ try:
+ data = bytes.fromhex(self.le_commitment.text().strip())
+ if len(data) > token.MAX_CONSENSUS_COMMITMENT_LENGTH:
+ sane = False
+ except ValueError:
+ sane = False
+ if sane:
+ url = self.le_url.text().strip()
+ len_prefix = len(BCMR_URL_REQUIRED_PREFIX)
+ if url and (not url.startswith(BCMR_URL_REQUIRED_PREFIX) or len(url) <= len_prefix):
+ sane = False
+ self.create_button.setEnabled(sane)
+ return sane
+
+ def read_form(self) -> Optional[Tuple[dict, address.Address, token.OutputData, str]]:
+ if not self.check_sanity():
+ return None
+ utxo = self.tup2u(self.cb_utxos.currentData())
+ if utxo is None:
+ return None
+ if self.rb_ext.isChecked():
+ addr = address.Address.from_string(self.le_address.text().strip())
+ else:
+ # Send back to a new address
+ addr = self.wallet.get_unused_address(for_change=False, frozen_ok=False) or utxo["address"]
+
+ fungible_amt = self.get_fungible_amount()
+ if fungible_amt is None:
+ return None
+ token_id_hex = utxo['prevout_hash']
+ assert len(token_id_hex) == 64
+ bitfield = 0
+ bitfield |= token.Structure.HasAmount if fungible_amt else 0
+ commitment = b''
+ if self.gb_nft.isChecked():
+ bitfield |= token.Structure.HasNFT
+ commitment = bytes.fromhex(self.le_commitment.text().strip())
+ bitfield |= token.Structure.HasCommitmentLength if len(commitment) else 0
+ if self.rb_mutable.isChecked():
+ bitfield |= token.Capability.Mutable
+ elif self.rb_minting.isChecked():
+ bitfield |= token.Capability.Minting
+ else:
+ assert self.rb_none.isChecked()
+ bitfield |= token.Capability.NoCapability
+ tok = token.OutputData(id=token_id_hex, amount=fungible_amt, commitment=commitment, bitfield=bitfield)
+ url = self.le_url.text().strip()
+ return utxo, addr, tok, url
+
+ def _do_validate_url_and_get_hash(self, url: str) -> Optional[Tuple[bytes, bytes]]:
+ """Returns a tuple of hash_bytes, url_bytes (url-encoded to ascii) after retrieving the data from
+ url, or None if there was an error or user canceled."""
+
+ assert url.startswith(BCMR_URL_REQUIRED_PREFIX)
+ len_prefix = len(BCMR_URL_REQUIRED_PREFIX)
+ try:
+ url_encoded_sans_prefix = urllib.parse.quote(url[len_prefix:],
+ safe="/~", encoding="ascii", errors="strict").encode("ascii")
+ except UnicodeError as e:
+ self.show_error(_("Unable to url-encode URL: {error}").format(error=repr(e)))
+ return None
+
+ full_url_as_bytes = BCMR_URL_REQUIRED_PREFIX.encode('ascii') + url_encoded_sans_prefix
+
+ def retrieve_document_in_thread_and_calculate_hash() -> bytes:
+ r = requests.get(full_url_as_bytes, timeout=20.0)
+ if r.status_code != 200:
+ raise RuntimeError(f"{r.status_code} {r.reason}")
+ h = hashlib.sha256()
+ h.update(r.content)
+ the_hash = h.digest()
+ self.print_error(f"Got hash from \"{full_url_as_bytes.decode('ascii')}\" -> {the_hash.hex()}")
+ return the_hash
+
+ def on_error(exc_info: tuple):
+ self.show_error(_("Unable to retrieve document from \"{url}\", error: {errmsg}")
+ .format(url=full_url_as_bytes.decode('ascii'), errmsg=str(exc_info[1])))
+
+ hash_bytes: Optional[bytes] = None
+
+ def on_success(result):
+ nonlocal hash_bytes
+ assert isinstance(result, (bytes, bytearray))
+ hash_bytes = bytes(result)
+
+ WaitingDialog(self, _("Retrieving document from specified URL, please wait..."),
+ task=retrieve_document_in_thread_and_calculate_hash, on_success=on_success, on_error=on_error,
+ auto_cleanup=True, auto_exec=True, title=_("Checking URL"))
+
+ if not hash_bytes:
+ return None
+
+ assert len(hash_bytes) == 32
+
+ return hash_bytes, url_encoded_sans_prefix
+
+ def do_create(self):
+ tup = self.read_form()
+ if tup is None:
+ self.show_error("Error: Form is not sane; unexpected return value from read_form()")
+ return
+ utxo, addr, tok, url = tup
+ if url:
+ tup = self._do_validate_url_and_get_hash(url)
+ if not tup:
+ return
+ hash_bytes, url_bytes = tup
+ else:
+ hash_bytes, url_bytes = None, None
+ # We intentionally order things so that the change goes to output 0, so that the wallet doesn't run out of
+ # genesis-capable UTXOs.
+ change_addr = self.wallet.get_unused_address(for_change=True, frozen_ok=False) or utxo["address"]
+ outputs = [(bitcoin.TYPE_ADDRESS, change_addr, '!'),
+ (bitcoin.TYPE_ADDRESS, addr, token.heuristic_dust_limit_for_token_bearing_output())]
+ if hash_bytes and url_bytes:
+ script = address.ScriptOutput.from_string("OP_RETURN {BCMR} {hash} {url}"
+ .format(BCMR=b'BCMR'.hex(),
+ hash=hash_bytes.hex(),
+ url=url_bytes.hex()))
+ # Check that OP_RETURN size is sane according to current relay policy
+ if len(script.script) > 223:
+ self.show_error(_("OP_RETURN script too large, needs to be no longer than 223 bytes")
+ + ".\n\n" + _("To fix this, please ensure the URL is shorter."))
+ return
+ outputs += [(bitcoin.TYPE_SCRIPT, script, 0)]
+ token_datas = [None, tok]
+ tx = self.wallet.make_unsigned_transaction(inputs=[utxo], outputs=outputs, config=self.parent.config,
+ token_datas=token_datas, bip69_sort=False)
+
+ tx_desc = _("Token genesis: {token_id}").format(token_id=tok.id_hex)
+ self.parent.show_transaction(tx, tx_desc=tx_desc)
+
+ def get_utxos(self):
+ return self.wallet.get_utxos(exclude_frozen=True, mature=True, confirmed_only=False, exclude_slp=True,
+ exclude_tokens=True)
+
+ def create_new_coin(self):
+ # Sort by highest prevout_n, highest value first, so we prefer non-0 output nums first
+ self.refresh_utxos()
+ utxos = sorted(self.other_non_dust_utxos, key=lambda x: (-x['prevout_n'], -x['value']))
+ if not utxos:
+ self.show_error(_("Not enough funds"))
+ return
+ utxo = utxos[0]
+ addr = self.wallet.get_unused_address(for_change=True, frozen_ok=False) or utxo['address']
+ try:
+ tx = self.wallet.make_unsigned_transaction(config=self.parent.config, inputs=[utxo],
+ outputs=[(bitcoin.TYPE_ADDRESS, addr, '!')])
+ except util.NotEnoughFunds:
+ self.show_error(_("Not enough funds"))
+ return
+ except util.ExcessiveFee:
+ self.show_error(_("Excessive fee"))
+ return
+ self.parent.show_transaction(tx, tx_desc=_("Create a new genesis-capable UTXO; spend {coin_name} back to"
+ " wallet").format(coin_name=self.utxo_short_name(utxo)))
+
+ def on_cb_utxo_index_change(self, ignored: int):
+ data = self.cb_utxos.currentData()
+ if data and data[0]:
+ self.token_id_label.setText(data[0])
+ icon: QtGui.QIcon = self.token_meta.get_icon(data[0])
+ self.icon_lbl.setPixmap(icon.pixmap(64, 64))
+ else:
+ self.token_id_label.setText("-")
+ self.icon_lbl.setPixmap(QtGui.QPixmap())
+ is_sane = self.check_sanity()
+ if is_sane:
+ # Ensure that if the index changed, we clear the URL to avoid problems for users
+ self.le_url.clear()
+
+ @staticmethod
+ def utxo_short_name(utxo: dict) -> str:
+ h = utxo["prevout_hash"]
+ short_hash = f'{h[:6]}…{h[-6:]}'
+ return f'{short_hash}:{utxo["prevout_n"]}'
+
+ def refresh(self) -> None:
+ select_index = None
+ if self.refresh_utxos():
+ selected = self.cb_utxos.currentData()
+ self.cb_utxos.clear()
+ amts = []
+ cut_pos = 2**64 # Just a huge out-of-range value to start
+ for utxo in self.eligible_utxos:
+ # Grab amounts, figure out how much of the leading spaces to trim
+ amt = self.parent.format_amount(utxo['value'], whitespaces=True)
+ ctr = 0
+ for ch in amt:
+ if ch != ' ':
+ break
+ ctr += 1
+ cut_pos = min(cut_pos, ctr)
+ amts.append(amt)
+ for i, amt in enumerate(amts):
+ # Trim leading spaces
+ amts[i] = amt[cut_pos:]
+ for i, utxo in enumerate(self.eligible_utxos):
+ data = self.u2tup(utxo)
+ amt = amts[i]
+ unit = self.parent.base_unit()
+ addr = utxo["address"].to_ui_string()
+ text = f'{self.utxo_short_name(utxo)} | {amt} {unit} | {addr}'
+ self.cb_utxos.addItem(text, data)
+ if selected == data:
+ select_index = i
+ if select_index is not None:
+ self.cb_utxos.setCurrentIndex(select_index)
+ elif self.cb_utxos.currentIndex() < 0:
+ # Called to set the Category ID label to "-" on empty / no selection
+ self.on_cb_utxo_index_change(-1)
+ # Only enable the "New..." button if it makes sense ot do so, and set the tooltip accordingly
+ b = bool(len(self.other_non_dust_utxos))
+ self.create_coin_button.setEnabled(b)
+ tt = self.create_coin_button_tooltip_on if b else self.create_coin_button_tooltip_off
+ self.create_coin_button.setToolTip(tt)
+
+ self.maybe_warn_wallet_empty() # Pop up warning on empty wallet
+ self.check_sanity()
+
+ def maybe_warn_wallet_empty(self):
+ if not self.eligible_utxos and not self.other_non_dust_utxos and not self.did_warn_wallet_empty:
+ self.did_warn_wallet_empty = True
+ weak_self = weakref.ref(self)
+
+ def called_later():
+ me = weak_self()
+ if not me or me.isHidden():
+ return
+ me.show_error(_("There are no eligible genesis-capable \"output 0\" coins in the wallet and there"
+ " are not enough free funds to create any new such coins. Fund the wallet or"
+ " unfreeze any frozen coins to proceed."), parent=me)
+
+ QtCore.QTimer.singleShot(250, called_later)
+
+ @staticmethod
+ def u2tup(utxo: dict) -> Tuple[str, int]:
+ return utxo['prevout_hash'], utxo['prevout_n']
+
+ def tup2u(self, tup: Optional[Tuple[str, int]]) -> Optional[dict]:
+ if tup is not None:
+ for utxo in self.eligible_utxos:
+ if utxo['prevout_hash'] == tup[0] and utxo['prevout_n'] == tup[1]:
+ return utxo
+
+ def est_tx_fee(self, tx_size=310) -> int:
+ return int(math.ceil(tx_size * wallet.relayfee(self.parent.network) / 1000.0))
+
+ def refresh_utxos(self) -> bool:
+ """Populates self.eligible_utxos and self.other_non_dust_utxos with fresh data from self.wallet.
+ Returns True if there was a change, False otherwise."""
+
+ # Try and guess the worst-case value we need on a single utxo for creating a new token.
+ # min_val: roughly 800 + 310 byte txn -> 1310 sats.
+ min_val = token.heuristic_dust_limit_for_token_bearing_output() + self.est_tx_fee()
+ min_val_other = token.heuristic_dust_limit_for_token_bearing_output() + self.est_tx_fee(200) * 2
+ utxos = []
+ utxos_other = []
+ for utxo in self.get_utxos():
+ # NB: Only prevout_n == 0 UTXOs can create new tokens.
+ if utxo['prevout_n'] == 0 and utxo['value'] >= min_val:
+ utxos.append(utxo)
+ elif utxo['prevout_n'] != 0 and utxo['value'] >= min_val_other:
+ utxos_other.append(utxo)
+ set_old1 = {self.u2tup(utxo) for utxo in self.eligible_utxos}
+ set_old2 = {self.u2tup(utxo) for utxo in self.other_non_dust_utxos}
+ self.eligible_utxos = sorted(utxos, key=lambda x: -x['value']) # sort results descending
+ self.other_non_dust_utxos = sorted(utxos_other, key=lambda x: -x['value']) # sort results descending
+ set_new1 = {self.u2tup(utxo) for utxo in self.eligible_utxos}
+ set_new2 = {self.u2tup(utxo) for utxo in self.other_non_dust_utxos}
+ return set_old1 != set_new1 or set_old2 != set_new2 # Return True if there actually was an update
+
+ # This decorator makes this callback always run in main thread (as opposed to the network thread)
+ @util.in_main_thread
+ def on_network_callback(self, event, *args):
+ assert threading.current_thread() == threading.main_thread()
+ if event == "wallet_updated" and args and args[0] == self.wallet:
+ self.refresh()
+
+ def register_network_callbacks(self):
+ if self.network:
+ # So we can get refresh our utxo lists as soon as the wallet is updated
+ self.network.register_callback(self.on_network_callback, ["wallet_updated"])
+
+ def unregister_network_callbacks(self):
+ if self.network:
+ # Undo the effects of registering the callback when it is no longer needed, in case this wallet is closed
+ # later and this object dies (avoids dangling refs)
+ self.network.unregister_callback(self.on_network_callback)
+
+ def showEvent(self, event: QtGui.QShowEvent) -> None:
+ super().showEvent(event)
+ if event.isAccepted():
+ self.did_warn_wallet_empty = False
+ self.register_network_callbacks()
+ self.refresh()
+ if self.last_size:
+ self.resize(self.last_size)
+
+ def hideEvent(self, event: QtGui.QCloseEvent) -> None:
+ super().hideEvent(event)
+ if event.isAccepted():
+ self.last_size = self.size()
+ self.unregister_network_callbacks()
diff --git a/electroncash_gui/qt/token_history_list.py b/electroncash_gui/qt/token_history_list.py
new file mode 100644
index 000000000000..6ac054a77e31
--- /dev/null
+++ b/electroncash_gui/qt/token_history_list.py
@@ -0,0 +1,358 @@
+#!/usr/bin/env python3
+#
+# Electron Cash - lightweight Bitcoin Cash client
+# Copyright (C) 2022 The Electron Cash Developers
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from enum import IntEnum
+
+from PyQt5 import QtCore
+from PyQt5.QtGui import QBrush, QColor, QIcon, QFont
+from PyQt5.QtWidgets import QMenu, QHeaderView
+
+from electroncash import token
+from electroncash.i18n import _, ngettext
+from electroncash.util import profiler, PrintError
+
+from .token_list import TokenList
+from .token_meta import TokenMetaQt
+from .util import MONOSPACE_FONT, MyTreeWidget, rate_limited, SortableTreeWidgetItem
+
+
+class TokenHistoryList(MyTreeWidget, PrintError):
+
+ class Col(IntEnum):
+ """Column numbers. This is to make code in on_update easier to read.
+ If you modify these, make sure to modify the column header names in
+ the MyTreeWidget constructor."""
+ status_icon = 0
+ date = 1
+ description = 2
+ cap_icon_extra = 3
+ cap_icon_main = 4
+ category = 5
+ fungible_amount = 6
+ nft_amount = 7
+ fungible_balance = 8
+ nft_balance = 9
+
+ class DataRoles(IntEnum):
+ """Data roles. Again, to make code in on_update easier to read."""
+ tx_hash = QtCore.Qt.UserRole # This must be this value so that superclass on_edited() picks up the label change
+ status = QtCore.Qt.UserRole + 1
+ category_id = QtCore.Qt.UserRole + 2
+ outpoint = QtCore.Qt.UserRole + 3
+ nft_row = QtCore.Qt.UserRole + 4
+ commitment = QtCore.Qt.UserRole + 5
+ capability = QtCore.Qt.UserRole + 6
+ editable_label = QtCore.Qt.UserRole + 7
+ item_key = QtCore.Qt.UserRole + 8
+
+ statusIcons = {}
+
+ def __init__(self, parent):
+ from .main_window import ElectrumWindow
+ assert isinstance(parent, ElectrumWindow)
+ MyTreeWidget.__init__(self, parent, self.create_menu, [], self.Col.description, deferred_updates=True)
+ PrintError.__init__(self)
+
+ headers = ['', _('Date'), _('Description'), '', '', _('Category'), _('Fungible Amount'),
+ _('NFT Amount'), _('Fungible Balance'), _('NFT Balance')]
+ self.update_headers(headers)
+ self.setSortingEnabled(True)
+ self.sortByColumn(0, QtCore.Qt.AscendingOrder)
+ self.setAlternatingRowColors(True)
+ self.wallet = self.parent.wallet
+ self.cleaned_up = False
+ self.monospaceFont = QFont(MONOSPACE_FONT)
+ self.monospaceFontCondensed = QFont(MONOSPACE_FONT)
+ self.monospaceFontCondensed.setStretch(QFont.SemiCondensed)
+ self.withdrawalBrush = QBrush(QColor("#BC1E1E"))
+ self.batonIcon = QIcon(":icons/baton.png")
+ self.mutableIcon = QIcon(":icons/mutable.png")
+ self.token_meta: TokenMetaQt = parent.token_meta
+ self.setTextElideMode(QtCore.Qt.ElideMiddle)
+ self.header().setSectionResizeMode(self.Col.description, QHeaderView.Stretch)
+ self.header().setMinimumSectionSize(21)
+ for col in (self.Col.cap_icon_main, self.Col.cap_icon_extra):
+ self.header().setSectionResizeMode(col, QHeaderView.Interactive)
+ self.header().resizeSection(col, 21)
+ for col in range(self.Col.category, len(headers)):
+ self.header().setSectionResizeMode(col, QHeaderView.Interactive)
+ self.header().resizeSection(self.Col.category, 100) # Start out with 100 width for this column
+ for col in range(self.Col.fungible_amount, len(headers)):
+ self.header().resizeSection(col, 100)
+
+ def clean_up(self):
+ self.cleaned_up = True
+
+ @rate_limited(1.0, classlevel=True, ts_after=True)
+ def update(self):
+ if self.cleaned_up:
+ # short-cut return if window was closed and wallet is stopped
+ return
+ super().update()
+
+ @profiler
+ def on_update(self):
+ def item_key(item: SortableTreeWidgetItem) -> str:
+ return item.data(0, self.DataRoles.item_key) or ""
+ # Remember selections and expanded top-level items (must be done before clear)
+ selected_keys = {item_key(item) for item in self.selectedItems()}
+ expanded_keys = {item_key(self.topLevelItem(i)) for i in range(self.topLevelItemCount())
+ if self.topLevelItem(i).childCount() > 0 and self.topLevelItem(i).isExpanded()}
+ was_empty = self.topLevelItemCount() == 0
+
+ self.clear()
+
+ h = self.wallet.get_history(self.wallet.get_addresses(), reverse=True, receives_before_sends=True,
+ include_tokens=True, include_tokens_balances=True)
+
+ all_items = []
+ for h_item in h:
+ tx_hash, height, conf, timestamp, value, balance, tokens_deltas, tokens_balances = h_item
+ if not tokens_deltas:
+ continue
+ label = self.wallet.get_label(tx_hash)
+ status, status_str = self.wallet.get_tx_status(tx_hash, height, conf, timestamp)
+ icon = self.parent.history_list.get_icon_for_status(status)
+
+ for category_id, category_delta in tokens_deltas.items():
+ tl_item_key = tx_hash + category_id
+ fungible_amount = category_delta.get("fungibles", 0)
+ fungible_amount_str = self.token_meta.format_amount(category_id, fungible_amount)
+ cat_nfts_in = category_delta.get("nfts_in", [])
+ cat_nfts_out = category_delta.get("nfts_out", [])
+ bal_fts = tokens_balances.get(category_id, {}).get("fungibles", 0)
+ bal_fts_str = self.token_meta.format_amount(category_id, bal_fts)
+ bal_nfts = tokens_balances.get(category_id, {}).get("nfts", 0)
+ nft_amount = len(cat_nfts_in) - len(cat_nfts_out)
+ token_display_name = self.token_meta.format_token_display_name(category_id)
+ entry = ['', status_str, label, '', '', token_display_name, fungible_amount_str, str(nft_amount),
+ bal_fts_str, str(bal_nfts)]
+ item = SortableTreeWidgetItem(entry)
+ has_minting_ctr = 0
+ has_mutable_ctr = 0
+ item.setData(0, self.DataRoles.status, (status, conf))
+ item.setData(0, self.DataRoles.tx_hash, tx_hash)
+ item.setData(0, self.DataRoles.nft_row, False)
+ item.setData(0, self.DataRoles.category_id, category_id)
+ item.setData(0, self.DataRoles.editable_label, True)
+ item.setData(0, self.DataRoles.item_key, tl_item_key)
+ if token_display_name != category_id:
+ item.setToolTip(self.Col.category, _("Category ID") + ": " + category_id)
+ else:
+ item.setToolTip(self.Col.category, category_id)
+ item.setToolTip(self.Col.fungible_amount, self.token_meta.format_amount(category_id, fungible_amount,
+ append_tokentoshis=True))
+ item.setToolTip(self.Col.nft_amount, str(nft_amount))
+ item.setToolTip(self.Col.fungible_balance, self.token_meta.format_amount(category_id, bal_fts,
+ append_tokentoshis=True))
+ item.setToolTip(self.Col.nft_balance, str(bal_nfts))
+ item.setIcon(self.Col.category, self.token_meta.get_icon(category_id))
+ if icon:
+ item.setIcon(0, icon)
+ conf_suffix = ngettext("confirmation", "confirmations", conf)
+ item.setToolTip(0, str(conf) + " " + conf_suffix)
+ for col in (self.Col.category, self.Col.fungible_amount, self.Col.nft_amount,
+ self.Col.fungible_balance, self.Col.nft_balance):
+ if col == self.Col.category:
+ # Category id's and/or names get a more compact font
+ font = self.monospaceFontCondensed
+ align = QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter
+ else:
+ font = self.monospaceFont
+ align = QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter
+ item.setTextAlignment(col, align)
+ item.setFont(col, font)
+ # Make the date column compact to save horizontal space
+ item.setFont(self.Col.date, self.monospaceFontCondensed)
+ if fungible_amount < 0 or nft_amount < 0:
+ item.setForeground(self.Col.description, self.withdrawalBrush)
+ if fungible_amount < 0:
+ item.setForeground(self.Col.fungible_amount, self.withdrawalBrush)
+ if nft_amount < 0:
+ item.setForeground(self.Col.nft_amount, self.withdrawalBrush)
+ if bal_fts < 0:
+ item.setForeground(self.Col.fungible_balance, self.withdrawalBrush)
+ if bal_nfts < 0:
+ item.setForeground(self.Col.nft_balance, self.withdrawalBrush)
+
+ def add_nft(nft, out=False):
+ nonlocal has_minting_ctr, has_mutable_ctr
+ if out:
+ outpoint_hash, outpoint_n, token_data = nft
+ else:
+ outpoint_n, token_data = nft
+ outpoint_hash = tx_hash
+ outpoint_str = TokenList.get_outpoint_longname({"prevout_hash": outpoint_hash,
+ "prevout_n": outpoint_n})
+ capability = token.get_nft_flag_text(token_data) or ""
+ direction = "-" if out else "+"
+ if token_data.is_immutable_nft():
+ capability = ""
+ direction = " " + direction
+ commitment = token_data.commitment.hex()
+ capability_str = f"{capability} " if len(capability) else ""
+ commitment_suffix = f": {commitment}" if commitment else ""
+ name = f"{direction} {capability_str}NFT{commitment_suffix}"
+ nft_item = SortableTreeWidgetItem(['', '', name, '', '', '', '', '', ''])
+ nft_item.setFont(self.Col.description, self.monospaceFont)
+ nft_item.setData(0, self.DataRoles.nft_row, True)
+ nft_item.setData(0, self.DataRoles.outpoint, outpoint_str)
+ nft_item.setData(0, self.DataRoles.commitment, commitment)
+ nft_item.setData(0, self.DataRoles.capability, capability)
+ nft_item.setData(0, self.DataRoles.item_key, tl_item_key + outpoint_str)
+ if out:
+ nft_item.setForeground(self.Col.description, self.withdrawalBrush)
+ if token_data.is_minting_nft():
+ has_minting_ctr += 1
+ nft_item.setIcon(self.Col.description, self.batonIcon)
+ tt = _("Minting NFT") + commitment_suffix
+ elif token_data.is_mutable_nft():
+ has_mutable_ctr += 1
+ nft_item.setIcon(self.Col.description, self.mutableIcon)
+ tt = _("Mutable NFT") + commitment_suffix
+ else:
+ tt = _("NFT") + commitment_suffix
+ nft_item.setToolTip(self.Col.description, tt)
+
+ item.addChild(nft_item)
+ all_items.append(nft_item)
+
+ for nft_in in cat_nfts_in:
+ add_nft(nft_in, False)
+ for nft_out in cat_nfts_out:
+ add_nft(nft_out, True)
+
+ def get_tip_text(number, nft_capability):
+ return ngettext("Transaction has {number} {nft_capability} NFT entry",
+ "Transaction has {number} {nft_capability} NFT entries",
+ number).format(number=has_minting_ctr, nft_capability=nft_capability)
+ if has_minting_ctr:
+ item.setToolTip(self.Col.cap_icon_main, get_tip_text(has_minting_ctr, "Minting"))
+ item.setIcon(self.Col.cap_icon_main, self.batonIcon)
+ if has_mutable_ctr:
+ item.setToolTip(self.Col.cap_icon_extra, get_tip_text(has_mutable_ctr, "Mutable"))
+ item.setIcon(self.Col.cap_icon_extra, self.mutableIcon)
+ elif has_mutable_ctr:
+ item.setToolTip(self.Col.cap_icon_main, get_tip_text(has_mutable_ctr, "Mutable"))
+ item.setIcon(self.Col.cap_icon_main, self.mutableIcon)
+
+ self.addChild(item)
+ all_items.append(item)
+
+ # Restore selections of sub-items, and expanded top-level items
+ for item in all_items:
+ k = item_key(item)
+ if k in selected_keys:
+ item.setSelected(True)
+ if k in expanded_keys:
+ item.setExpanded(True)
+
+ if was_empty:
+ # Auto-expand if we have only 1 top-level item with children and this was the first run through
+ if self.invisibleRootItem().childCount() == 1:
+ self.invisibleRootItem().child(0).setExpanded(True)
+
+ def on_permit_edit(self, item: SortableTreeWidgetItem, column):
+ return bool(item.data(0, self.DataRoles.editable_label))
+
+ def on_doubleclick(self, item, column):
+ if self.permit_edit(item, column):
+ super(TokenHistoryList, self).on_doubleclick(item, column)
+ else:
+ tx_id = item.data(0, self.DataRoles.tx_hash)
+ tx = self.wallet.transactions.get(tx_id)
+ if tx:
+ self.parent.show_transaction(tx, self.wallet.get_label(tx_id))
+
+ def create_menu(self, position):
+ menu = QMenu()
+
+ selected = self.selectedItems()
+ num_selected = len(selected)
+
+ def do_copy(txt):
+ txt = txt.strip()
+ self.parent.copy_to_clipboard(txt)
+
+ col = self.currentColumn()
+ column_title = self.headerItem().text(col)
+
+ if num_selected > 0:
+ if num_selected == 1:
+ item = self.itemAt(position)
+ if item:
+ category_id = item.data(0, self.DataRoles.category_id)
+
+ if category_id:
+ menu.addAction(self.token_meta.get_icon(category_id),
+ _("Category Properties") + "...",
+ lambda: self.parent.show_edit_token_metadata_dialog(category_id))
+
+ copy_text = item.text(col).strip()
+ nft_row = item.data(0, self.DataRoles.nft_row)
+ if nft_row:
+ description = item.text(self.Col.description).strip()
+ commitment = item.data(0, self.DataRoles.commitment)
+ outpoint = item.data(0, self.DataRoles.outpoint)
+ if description:
+ menu.addAction(_("Copy {}").format(_("NFT Description")), lambda: do_copy(description[2:]))
+ if commitment:
+ menu.addAction(_("Copy {}").format(_("NFT Commitment")), lambda: do_copy(commitment))
+ menu.addAction(_("Copy Outpoint").format(_("Outpoint")), lambda: do_copy(outpoint))
+ elif copy_text:
+ menu.addAction(_("Copy {}").format(column_title), lambda: do_copy(copy_text))
+ if col == self.Col.category and category_id:
+ action_text = _("Copy Category ID")
+ if copy_text != category_id:
+ # User specified a token name, add "Copy Category ID"
+ menu.actions()[-1].setText(_("Copy Token Name"))
+ menu.addAction(action_text, lambda: do_copy(category_id))
+ elif column_title == _("Category"):
+ # Column name *is* the Category ID, rewrite name "Category" -> "Category ID"
+ menu.actions()[-1].setText(action_text)
+
+
+ tx_hash = item.data(0, self.DataRoles.tx_hash)
+ tx = self.wallet.transactions.get(tx_hash, None)
+ if tx:
+ menu.addAction(_("View Tx") + "...", lambda: self.parent.show_transaction(tx))
+
+ menu.addSeparator()
+ menu.addAction(QIcon(":icons/tab_token.svg"), _("Create Token..."), self.parent.show_create_new_token_dialog)
+ menu.exec_(self.viewport().mapToGlobal(position))
+
+ def update_labels(self):
+ if self.should_defer_update_incr():
+ return
+ root = self.invisibleRootItem()
+ child_count = root.childCount()
+ for i in range(child_count):
+ item = root.child(i)
+ if not item.data(0, self.DataRoles.editable_label):
+ # This item declares its "Description" is not a label, skip
+ continue
+ txid = item.data(0, self.DataRoles.tx_hash)
+ h_label = self.wallet.get_label(txid)
+ item.setText(self.Col.description, h_label)
diff --git a/electroncash_gui/qt/token_list.py b/electroncash_gui/qt/token_list.py
new file mode 100644
index 000000000000..759916a56642
--- /dev/null
+++ b/electroncash_gui/qt/token_list.py
@@ -0,0 +1,673 @@
+#!/usr/bin/env python3
+#
+# Electron Cash - lightweight Bitcoin Cash client
+# Copyright (C) 2022 The Electron Cash Developers
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from collections import defaultdict
+from enum import IntEnum
+from functools import wraps
+from typing import Any, DefaultDict, Dict, List, Optional, Set
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+from PyQt5.QtGui import QFont
+from PyQt5.QtWidgets import QAbstractItemView, QMenu
+
+from electroncash import token, util
+from electroncash.i18n import _, ngettext
+from .main_window import ElectrumWindow
+from .util import ColorScheme, MONOSPACE_FONT, MyTreeWidget, rate_limited, SortableTreeWidgetItem
+from .token_meta import TokenMetaQt
+
+
+class TokenList(MyTreeWidget, util.PrintError):
+
+ class Col(IntEnum):
+ """Column numbers. This is to make code in on_update easier to read.
+ If you modify these, make sure to modify the column header names in
+ the MyTreeWidget constructor."""
+ category = 0
+ quantity = 1
+ nfts = 2
+ cap_icon_extra = 3
+ cap_icon_main = 4
+ nft_flags = 5
+ num_utxos = 6
+ bch_amount = 7
+ output_pt = 8
+
+ class DataRoles(IntEnum):
+ """Data roles. Again, to make code in on_update easier to read."""
+ item_key = QtCore.Qt.UserRole # This is also the wallet label key
+ token_id = QtCore.Qt.UserRole + 1
+ utxos = QtCore.Qt.UserRole + 2
+ nft_utxo = QtCore.Qt.UserRole + 3
+ frozen_flags = QtCore.Qt.UserRole + 4 # Flags address/coin-level freeze: None or "" or "a" or "c" or "ac"
+
+ filter_columns = [Col.category]
+ default_sort = MyTreeWidget.SortSpec(Col.category, QtCore.Qt.AscendingOrder) # sort by token_id, ascending
+
+ amount_heading = _('Amount ({unit})')
+
+ def __init__(self, parent: ElectrumWindow):
+ assert isinstance(parent, ElectrumWindow)
+ columns = [_('Category'), _('Fungible Amount'), _('NFTs'), '', '', _('Capability'), _('Num UTXOs'),
+ self.amount_heading.format(unit=parent.base_unit()), _('Output Point')]
+ super().__init__(parent=parent, create_menu=self.create_menu, headers=columns,
+ stretch_column=None, deferred_updates=True,
+ save_sort_settings=True)
+ self.setSelectionMode(QAbstractItemView.ExtendedSelection)
+ self.setSortingEnabled(True)
+ self.setAlternatingRowColors(True)
+ self.wallet = self.parent.wallet
+ self.cleaned_up = False
+ self.fixed_width = QFont(MONOSPACE_FONT, QFont().pointSize() - 1)
+ self.fixed_width.setFixedPitch(True)
+ self.fixed_width.setStretch(QFont.SemiCondensed)
+ self.fixed_width_smaller = QFont(MONOSPACE_FONT, QFont().pointSize() - 1)
+ self.fixed_width_smaller.setFixedPitch(True)
+ self.fixed_width_smaller.setStretch(QFont.Condensed)
+ self.fixed_width_larger = QFont(MONOSPACE_FONT, QFont().pointSize())
+ self.fixed_width_larger.setFixedPitch(True)
+ self.smaller_font = QFont()
+ self.smaller_font.setPointSize(self.smaller_font.pointSize() - 1)
+ self.smaller_font.setLetterSpacing(QFont.PercentageSpacing, 90)
+ self.light_blue = QtGui.QColor('lightblue') if not ColorScheme.dark_scheme else QtGui.QColor('blue')
+ self.blue = ColorScheme.BLUE.as_color(True)
+ self.cyan_blue = QtGui.QColor('#3399ff')
+ self.icon_baton = QtGui.QIcon(":icons/baton.png")
+ self.icon_mutable = QtGui.QIcon(":icons/mutable.png")
+ self.token_meta: TokenMetaQt = self.parent.token_meta
+ self.header().setMinimumSectionSize(21)
+ for col in (self.Col.cap_icon_main, self.Col.cap_icon_extra):
+ self.header().setSectionResizeMode(col, QtWidgets.QHeaderView.Interactive)
+ self.header().resizeSection(col, 21)
+ for col in (self.Col.nft_flags,):
+ self.header().setSectionResizeMode(col, QtWidgets.QHeaderView.Interactive)
+ self.setTextElideMode(QtCore.Qt.ElideRight)
+
+ def clean_up(self):
+ self.cleaned_up = True
+
+ def if_not_dead(func):
+ """Boilerplate: Check if cleaned up, and if so, don't execute method"""
+ @wraps(func)
+ def wrapper(self, *args, **kwargs):
+ if self.cleaned_up or not self.wallet or not self.parent:
+ return
+ else:
+ func(self, *args, **kwargs)
+ return wrapper
+
+ @rate_limited(1.0, ts_after=True) # performance tweak -- limit updates to no more than once per second
+ def update(self):
+ if self.cleaned_up:
+ # short-cut return if window was closed and wallet is stopped
+ return
+ super().update()
+
+ @classmethod
+ def get_outpoint_shortname(cls, utxo):
+ return cls.elide(utxo['prevout_hash'], 12) + ':' + str(utxo['prevout_n'])
+
+ @staticmethod
+ def get_outpoint_longname(utxo):
+ return f"{utxo['prevout_hash']}:{utxo['prevout_n']}"
+
+ @staticmethod
+ def elide(s: str, elide_threshold=32) -> str:
+ if len(s) > elide_threshold:
+ n = max(elide_threshold // 2, 0)
+ return s[:n] + '…' + s[-n:]
+ return s
+
+ @if_not_dead
+ @util.profiler
+ def on_update(self):
+ def item_path(item: SortableTreeWidgetItem) -> str:
+ """ Recursively builds the path for an item eg 'parent_name/item_name' """
+ item_key = item.data(0, self.DataRoles.item_key)
+ return item_key if not item.parent() else item_path(item.parent()) + "/" + item_key
+
+ def remember_expanded_items(root: QtWidgets.QTreeWidgetItem) -> Set[str]:
+ """ Save the set of expanded items... so that token list updates don't annoyingly collapse our tree list
+ widget due to the update. This function recurses. Pass self.invisibleRootItem(). """
+ ret: Set[str] = set()
+ for i in range(0, root.childCount()):
+ it = root.child(i)
+ if it and it.childCount():
+ if it.isExpanded():
+ ret.add(item_path(it))
+ ret |= remember_expanded_items(it) # recurse
+ return ret
+
+ def restore_expanded_items(root, item_names: Set[str]):
+ """ Recursively restore the expanded state saved previously. Pass self.invisibleRootItem(). """
+ for i in range(0, root.childCount()):
+ it = root.child(i)
+ if it and it.childCount():
+ restore_expanded_items(it, item_names) # recurse, do leaves first
+ old = bool(it.isExpanded())
+ new = bool(item_path(it) in item_names)
+ if old != new:
+ it.setExpanded(new)
+
+ # Remember selections and previously-expanded items, if any (keeps UI state consistent across refreshes)
+ sels = self.selectedItems()
+ item_keys_to_re_select = {item.data(0, self.DataRoles.item_key) for item in sels}
+ expanded_item_names = remember_expanded_items(self.invisibleRootItem())
+ del sels # avoid keeping reference to about-to-be deleted C++ objects
+
+ self.clear()
+
+ # Pick up changes to the configured base_unit and update the amount column
+ self.headerItem().setText(self.Col.bch_amount, self.amount_heading.format(unit=self.parent.base_unit()))
+
+ tok_utxos = self.wallet.get_utxos(tokens_only=True)
+
+ tokens: DefaultDict[List[Dict]] = defaultdict(list) # key: token_id, value: List of utxo dicts
+ items_to_re_select: List[SortableTreeWidgetItem] = []
+ # token_id_hex -> |"ft_only" -> list of utxos
+ tokens_grouped: DefaultDict[DefaultDict[List[Dict]]] = defaultdict(lambda: defaultdict(list))
+
+ for utxo in tok_utxos:
+ td = utxo['token_data']
+ assert isinstance(td, token.OutputData)
+ token_id = td.id_hex
+ tokens[token_id].append(utxo)
+ if not td.has_nft():
+ # Special group -- fungible-only utxos
+ tokens_grouped[token_id]["ft_only"].append(utxo)
+ else:
+ # Otherwise group each token_id by the commitment bytes
+ tokens_grouped[token_id][td.commitment.hex()].append(utxo)
+
+ def set_fonts(item: SortableTreeWidgetItem):
+ for col in (self.Col.category, self.Col.quantity, self.Col.bch_amount):
+ txt = item.text(col)
+ token_id = item.data(0, self.DataRoles.token_id)
+ if col == self.Col.category and txt != token_id and not txt.startswith("NFT: "):
+ continue # Don't set the font for the "Fungible-Only" entries, or ones with user-edited names
+ if len(txt) > 64:
+ item.setFont(col, self.fixed_width_smaller)
+ elif len(txt) > 32:
+ item.setFont(col, self.fixed_width)
+ else:
+ item.setFont(col, self.fixed_width_larger)
+ item.setFont(self.Col.nft_flags, self.smaller_font)
+ item.setFont(self.Col.output_pt, self.fixed_width)
+ # Lastly, realign the quantity, num_nfts, and num_utxos columns
+ for col, align in ((self.Col.quantity, QtCore.Qt.AlignRight),
+ (self.Col.nfts, QtCore.Qt.AlignCenter),
+ (self.Col.num_utxos, QtCore.Qt.AlignCenter)):
+ item.setTextAlignment(col, align)
+
+ def set_icons_inner(item: SortableTreeWidgetItem, num_minting, num_mutable, toplevel=False, leaf=False):
+ assert not (toplevel and leaf)
+
+ def get_tip_text(number, nft_capability):
+ if leaf:
+ prefix = ""
+ elif toplevel:
+ prefix = _("Category contains {number} ").format(number=number)
+ else:
+ prefix = _("Group contains {number} ").format(number=number)
+ return ngettext("{prefix}{nft_capability} NFT",
+ "{prefix}{nft_capability} NFTs",
+ number).format(prefix=prefix, nft_capability=nft_capability)
+ if num_minting > 0:
+ item.setIcon(self.Col.cap_icon_main, self.icon_baton)
+ item.setToolTip(self.Col.cap_icon_main, get_tip_text(num_minting, "Minting"))
+ if num_mutable > 0:
+ item.setIcon(self.Col.cap_icon_extra, self.icon_mutable)
+ item.setToolTip(self.Col.cap_icon_extra, get_tip_text(num_mutable, "Mutable"))
+ elif num_mutable > 0:
+ item.setIcon(self.Col.cap_icon_main, self.icon_mutable)
+ item.setToolTip(self.Col.cap_icon_main, get_tip_text(num_mutable, "Mutable"))
+
+ def set_icons(item: SortableTreeWidgetItem, td: Optional[token.OutputData], toplevel=False, leaf=False):
+ if not td:
+ return
+ if td.has_nft():
+ num_minting = 1 if td.is_minting_nft() else 0
+ num_mutable = 1 if td.is_mutable_nft() else 0
+ set_icons_inner(item, num_minting, num_mutable, toplevel, leaf)
+
+ def add_utxo_item(parent: Optional[SortableTreeWidgetItem], utxo, name, item_key):
+ td = utxo['token_data']
+ tid = td.id_hex
+ amt = self.token_meta.format_amount(tid, td.amount)
+ nft_flags = token.get_nft_flag_text(td) or ""
+ num_nfts = str(int(td.has_nft()))
+ num_utxos = "1"
+ outpt_shortname = self.get_outpoint_shortname(utxo)
+ bch_amt = self.parent.format_amount(utxo['value'], is_diff=False, whitespaces=True)
+ stwi = SortableTreeWidgetItem([name, amt, num_nfts, "", "", nft_flags, num_utxos, bch_amt, outpt_shortname])
+ stwi.setData(0, self.DataRoles.item_key, item_key)
+ stwi.setData(0, self.DataRoles.token_id, tid)
+ stwi.setData(0, self.DataRoles.utxos, [utxo])
+ set_fonts(stwi)
+ set_icons(stwi, td, toplevel=False, leaf=True)
+ tt = self.get_outpoint_longname(utxo) + "\n"
+ if utxo['height'] > 0:
+ tt += _("Confirmed in block {height}").format(height=utxo['height'])
+ else:
+ tt += _("Unconfirmed")
+ stwi.setToolTip(self.Col.output_pt, tt)
+
+ stwi.setData(0, self.DataRoles.nft_utxo, utxo if td.has_nft() else None)
+ a_frozen = 'a' if self.wallet.is_frozen(utxo['address']) else ''
+ c_frozen = 'c' if utxo.get('is_frozen_coin') else ''
+ stwi.setData(0, self.DataRoles.frozen_flags, a_frozen + c_frozen)
+ if a_frozen and not c_frozen:
+ # address is frozen, coin is not frozen
+ # emulate the "Look" off the address_list .py's frozen entry
+ stwi.setBackground(0, self.light_blue)
+ tool_tip_misc = _("Address is frozen")
+ elif c_frozen and not a_frozen:
+ # coin is frozen, address is not frozen
+ stwi.setBackground(0, self.blue)
+ tool_tip_misc = _("Coin is frozen")
+ elif c_frozen and a_frozen:
+ # both coin and address are frozen so color-code it to indicate that.
+ stwi.setBackground(0, self.light_blue)
+ stwi.setForeground(0, self.cyan_blue)
+ tool_tip_misc = _("Coin & Address are frozen")
+ else:
+ tool_tip_misc = ""
+
+ if tool_tip_misc:
+ stwi.setToolTip(self.Col.category, tool_tip_misc)
+ if parent is not None:
+ parent.addChild(stwi)
+ if item_key in item_keys_to_re_select:
+ items_to_re_select.append(stwi)
+ return stwi
+
+ for token_id, dd in tokens_grouped.items():
+ utxo_list = tokens[token_id]
+ key_prefix = f'token_{token_id}'
+ item_key = key_prefix
+ quantity = self.token_meta.format_amount(token_id, sum(u['token_data'].amount for u in utxo_list))
+ num_nfts = sum(1 for u in utxo_list if u['token_data'].has_nft())
+ nfts = str(num_nfts)
+ flags = {token.get_nft_flag_text(u['token_data']) for u in utxo_list}
+ num_minting = sum(1 for u in utxo_list if u['token_data'] and u['token_data'].is_minting_nft())
+ num_mutable = sum(1 for u in utxo_list if u['token_data'] and u['token_data'].is_mutable_nft())
+ flags.discard(None) # Non-nft's add "None" to this set. discard
+ nft_flags = ', '.join(sorted(flags, key=token.nft_flag_text_sorter))
+ n_utxos = sum(len(ul) for ul in dd.values())
+ num_utxos = str(n_utxos)
+ bch_amt = self.parent.format_amount(sum(x['value'] for x in utxo_list), is_diff=False, whitespaces=True)
+
+ token_display_name = self.token_meta.format_token_display_name(token_id)
+ item = SortableTreeWidgetItem([token_display_name, quantity, nfts, "", "", nft_flags, num_utxos, bch_amt, ""])
+ item.setData(0, self.DataRoles.item_key, item_key)
+ item.setData(0, self.DataRoles.token_id, token_id)
+ item.setData(0, self.DataRoles.utxos, utxo_list)
+ item.setData(0, self.DataRoles.nft_utxo, None)
+ set_fonts(item)
+ set_icons_inner(item, num_minting, num_mutable, toplevel=True)
+ if token_id != token_display_name:
+ item.setToolTip(self.Col.category, _("Category ID") + ": " + token_id)
+ if item_key in item_keys_to_re_select:
+ items_to_re_select.append(item)
+
+ # Do fungibles first
+ dd = dd.copy()
+ ft_only_utxo_list = dd.pop("ft_only", [])
+ ft_only_utxo_list = sorted(ft_only_utxo_list, key=lambda u: -u['token_data'].amount) # Sort by amount, desc
+
+ name = _("Fungible-Only")
+ if len(ft_only_utxo_list) == 1:
+ utxo = ft_only_utxo_list[0]
+ item_key = key_prefix + "_" + self.get_outpoint_longname(utxo)
+ put_on_top_level = num_nfts == 0 and n_utxos == 1 and not dd
+ if put_on_top_level:
+ # Special case -- have 1 fungible only and no NFTs for this token-id, just push this to top level
+ parent_item = None
+ else:
+ parent_item = item
+ sub_item = add_utxo_item(parent_item, utxo, name, item_key)
+ if put_on_top_level:
+ # Overwrite the "item" with this sub-item in the special case
+ sub_item.setText(self.Col.category, item.text(self.Col.category))
+ item = sub_item
+ set_fonts(item)
+ elif ft_only_utxo_list:
+ item_key = key_prefix + "_ft_only"
+ create_subgroup = num_nfts > 0 or dd
+ if create_subgroup:
+ # Create a subgroup called "Fungible-Only" because we have NFTs
+ ft_amt = self.token_meta.format_amount(token_id,
+ sum(u['token_data'].amount for u in ft_only_utxo_list))
+ bch_amt = self.parent.format_amount(sum(x['value'] for x in ft_only_utxo_list), is_diff=False,
+ whitespaces=True)
+ ft_parent = SortableTreeWidgetItem([name, ft_amt, "0", "", "", "", str(len(ft_only_utxo_list)),
+ bch_amt, ""])
+ ft_parent.setData(0, self.DataRoles.item_key, item_key)
+ ft_parent.setData(0, self.DataRoles.token_id, token_id)
+ ft_parent.setData(0, self.DataRoles.utxos, ft_only_utxo_list)
+ ft_parent.setData(0, self.DataRoles.nft_utxo, None)
+ set_fonts(ft_parent)
+ if item_key in item_keys_to_re_select:
+ items_to_re_select.append(ft_parent)
+ else:
+ # Don't create a subgroup: put all fungible UTXOs up right under the item level
+ ft_parent = item
+
+ for utxo in ft_only_utxo_list:
+ item_key2 = key_prefix + "_" + self.get_outpoint_longname(utxo)
+ add_utxo_item(ft_parent, utxo, name, item_key2)
+
+ if ft_parent is not item:
+ item.addChild(ft_parent)
+
+ # Do NFTs next; iterate sorted by commitment, asc
+ for commitment_hex, utxo_list in sorted(dd.items(), key=lambda tup: tup[0]):
+ utxo_list = sorted(utxo_list, key=lambda u: -u['token_data'].amount) # Sort by amount, desc
+ if not utxo_list:
+ continue
+
+ if commitment_hex:
+ name = f"NFT: {commitment_hex}"
+ else:
+ name = "NFT: " + _("zero-length commitment")
+
+ if len(utxo_list) == 1:
+ utxo = utxo_list[0]
+ item_key = key_prefix + "_" + self.get_outpoint_longname(utxo)
+ add_utxo_item(item, utxo, name, item_key)
+ else:
+ item_key = key_prefix + "_nft_" + commitment_hex
+ ft_amt = self.token_meta.format_amount(token_id, sum(u['token_data'].amount for u in utxo_list))
+ nfts = str(sum(1 for u in utxo_list if u['token_data'].has_nft()))
+ nft_flags = ', '.join(sorted({token.get_nft_flag_text(u['token_data']) for u in utxo_list},
+ key=token.nft_flag_text_sorter))
+ num_minting = sum(1 for u in utxo_list if u['token_data'] and u['token_data'].is_minting_nft())
+ num_mutable = sum(1 for u in utxo_list if u['token_data'] and u['token_data'].is_mutable_nft())
+ num_utxos = str(len(utxo_list))
+ bch_amt = self.parent.format_amount(sum(x['value'] for x in utxo_list), is_diff=False,
+ whitespaces=True)
+ nft_parent = SortableTreeWidgetItem([name, ft_amt, nfts, "", "", nft_flags, num_utxos,bch_amt, ""])
+ nft_parent.setData(0, self.DataRoles.item_key, item_key)
+ nft_parent.setData(0, self.DataRoles.token_id, token_id)
+ nft_parent.setData(0, self.DataRoles.utxos, utxo_list)
+ nft_parent.setData(0, self.DataRoles.nft_utxo, None)
+ set_fonts(nft_parent)
+ set_icons_inner(nft_parent, num_minting, num_mutable)
+ if item_key in item_keys_to_re_select:
+ items_to_re_select.append(nft_parent)
+
+ for utxo in utxo_list:
+ item_key2 = key_prefix + "_" + self.get_outpoint_longname(utxo)
+ add_utxo_item(nft_parent, utxo, name, item_key2)
+
+ item.addChild(nft_parent)
+
+ # Lastly, grab the token icon. We set it last because above code may have
+ # replaced `item` with another instance.
+ item.setIcon(self.Col.category, self.token_meta.get_icon(token_id))
+ self.addChild(item)
+
+ # Now, at the very end, enforce previous UI state with respect to what was expanded or not. See #1042
+ restore_expanded_items(self.invisibleRootItem(), expanded_item_names)
+
+ # restore selections
+ for item in items_to_re_select:
+ # NB: Need to select the item at the end because otherwise weird bugs. See #1042.
+ item.setSelected(True)
+
+ @if_not_dead
+ def create_menu(self, position):
+ menu = QMenu()
+
+ selected = self.selectedItems()
+ num_selected = len(selected)
+
+ nft_utxos = [item.data(0, self.DataRoles.nft_utxo)
+ for item in selected if item.data(0, self.DataRoles.nft_utxo)]
+ non_frozen_utxos = []
+ non_frozen_utxos_that_are_editable = []
+ non_frozen_utxos_that_are_minting = []
+ frozen_utxos = []
+ frozen_addresses = set()
+ unique_token_ids_selected_that_may_be_frozen_or_unfrozen = set()
+
+ def recurse_find_non_frozen_leaves(item):
+ if item.childCount() == 0:
+ uxs = item.data(0, self.DataRoles.utxos)
+ if len(uxs) == 1:
+ utxo = uxs[0]
+ td = utxo['token_data']
+ if td:
+ unique_token_ids_selected_that_may_be_frozen_or_unfrozen.add(td.id_hex)
+ flags = item.data(0, self.DataRoles.frozen_flags)
+ if 'a' in flags:
+ frozen_addresses.add(utxo['address'])
+ elif 'c' in flags:
+ frozen_utxos.append(utxo)
+ elif not flags:
+ non_frozen_utxos.append(utxo)
+ if td and (td.is_mutable_nft() or td.is_minting_nft()):
+ non_frozen_utxos_that_are_editable.append(utxo)
+ if td.is_minting_nft():
+ non_frozen_utxos_that_are_minting.append(utxo)
+ else:
+ self.print_error("WARNING: Unexpected state -- childCount is 0 but we have more than 1 utxo for a"
+ "QTreeWidgetItem in token_list.py")
+ else:
+ for i in range(item.childCount()):
+ recurse_find_non_frozen_leaves(item.child(i))
+
+ for item in selected:
+ recurse_find_non_frozen_leaves(item)
+
+ non_frozen_utxos = self.dedupe_utxos(non_frozen_utxos)
+ frozen_utxos = self.dedupe_utxos(frozen_utxos)
+ non_frozen_utxos_that_are_editable = self.dedupe_utxos(non_frozen_utxos_that_are_editable)
+ non_frozen_utxos_that_are_minting = self.dedupe_utxos(non_frozen_utxos_that_are_minting,
+ # For mint, we only care to grab at most 1 of each token
+ # category.
+ enforce_unique_token_ids=True)
+
+ def do_copy(txt):
+ txt = txt.strip()
+ self.parent.copy_to_clipboard(txt)
+
+ col = self.currentColumn()
+ column_title = self.headerItem().text(col)
+ # Hack to override Category -> CategoryID
+ if col == self.Col.category:
+ column_title = _("Cateogry ID")
+
+ if num_selected > 0:
+
+ if len(unique_token_ids_selected_that_may_be_frozen_or_unfrozen) == 1:
+ token_id_hex = list(unique_token_ids_selected_that_may_be_frozen_or_unfrozen)[0]
+ menu.addAction(self.token_meta.get_icon(token_id_hex),
+ _("Category Properties") + "...", lambda: self.on_edit_metadata(token_id_hex))
+
+ if num_selected == 1:
+ # Single selection
+ item = self.itemAt(position)
+ if item:
+ nft_utxo = item.data(0, self.DataRoles.nft_utxo)
+ alt_column_title, alt_copy_text = None, None
+ insert_cat_title, insert_cat_text = None, None
+ utxos = item.data(0, self.DataRoles.utxos)
+ is_leaf_utxo = len(utxos) == 1 and item.childCount() == 0
+ if col == self.Col.category:
+ copy_text = item.data(0, self.DataRoles.token_id)
+ if copy_text != item.text(self.Col.category):
+ # Prepend "Copy Token Name" right above "Copy Category ID" in cases where user specified
+ # a token name
+ insert_cat_title = _("Token Name")
+ insert_cat_text = item.text(self.Col.category)
+ elif col == self.Col.output_pt and is_leaf_utxo:
+ copy_text = self.get_outpoint_longname(utxos[0])
+ else:
+ copy_text = item.text(col).strip()
+ if nft_utxo:
+ # NFT child item
+ if col == self.Col.category:
+ alt_column_title = _("NFT Commitment")
+ alt_copy_text = nft_utxo['token_data'].commitment.hex()
+ copy_text = nft_utxo['token_data'].id_hex
+ if copy_text == '-':
+ copy_text = None
+ else:
+ # Top-level item
+ pass
+
+ if insert_cat_title and insert_cat_text:
+ menu.addAction(_("Copy {}").format(insert_cat_title), lambda: do_copy(insert_cat_text))
+ if copy_text:
+ menu.addAction(_("Copy {}").format(column_title), lambda: do_copy(copy_text))
+ if alt_column_title and alt_copy_text:
+ menu.addAction(_("Copy {}").format(alt_column_title), lambda: do_copy(alt_copy_text))
+ if is_leaf_utxo:
+ txid = utxos[0]['prevout_hash']
+ tx = self.wallet.transactions.get(txid, None)
+
+ def do_show_tx():
+ self.parent.show_transaction(tx, tx_desc=self.wallet.get_label(txid) or None)
+ if tx:
+ menu.addAction(_("View Tx") + "...", do_show_tx)
+ else:
+ # Multi-selection
+ if col > -1:
+ texts, alt_copy, alt_copy_text = None, None, None
+ if col == self.Col.category: # token-id or name column
+ texts, seen_token_ids = list(), set()
+ # We do it this way to preserve order, but also to de-duplicate
+ for item in selected:
+ tid = item.data(0, self.DataRoles.token_id)
+ if tid not in seen_token_ids:
+ seen_token_ids.add(tid)
+ texts.append(tid)
+ if nft_utxos:
+ alt_copy = _("Copy {}").format(_("NFT Commitment")) + f" ({len(nft_utxos)})"
+ alt_copy_text = '\n'.join([u['token_data'].commitment.hex() for u in nft_utxos])
+ else:
+ def get_text(item):
+ if col == self.Col.output_pt and item.childCount() == 0:
+ ul = item.data(0, self.DataRoles.utxos)
+ if len(ul) == 1:
+ return self.get_outpoint_longname(ul[0])
+ return item.text(col).strip()
+ texts = [get_text(i) for i in selected if get_text(i) and get_text(i) != '-']
+ alt_copy_texts = [i.data(0, self.DataRoles.token_id) + ", " + get_text(i)
+ for i in selected if get_text(i) and get_text(i) != '-']
+ alt_copy_text = "\n".join(alt_copy_texts)
+ primary_col_text = _("Category ID")
+ alt_copy = (_("Copy {}").format(primary_col_text)
+ + ", " + column_title + f" ({len(alt_copy_texts)})")
+ if texts:
+ copy_text = '\n'.join(texts)
+ menu.addAction(_("Copy {}").format(column_title) + f" ({len(texts)})",
+ lambda: do_copy(copy_text))
+ if alt_copy and alt_copy_text:
+ menu.addAction(alt_copy, lambda: do_copy(alt_copy_text))
+ if frozen_utxos:
+ menu.addAction(ngettext(_("Unfreeze Coin"), _("Unfreeze Coins"), len(frozen_utxos)),
+ lambda: self.parent.set_frozen_coin_state(frozen_utxos, False))
+ if frozen_addresses:
+ menu.addAction(ngettext(_("Unfreeze Address"), _("Unfreeze Addresses"), len(frozen_addresses)),
+ lambda: self.parent.set_frozen_state(frozen_addresses, False))
+
+ menu.addSeparator()
+ num_utxos = len(non_frozen_utxos)
+ if num_utxos:
+ menu.addAction(QtGui.QIcon(":icons/tab_send.png"),
+ ngettext("Send Token", "Send Tokens", num_utxos)
+ + (f" ({num_utxos})" if num_utxos > 1 else "") + "...",
+ lambda: self.send_tokens(non_frozen_utxos))
+ num_editable_utxos = len(non_frozen_utxos_that_are_editable)
+ if num_editable_utxos:
+ menu.addAction(QtGui.QIcon(":icons/edit_nft.png"),
+ ngettext("Edit NFT Commitment", "Edit NFT Commitments", num_editable_utxos)
+ + (f" ({num_editable_utxos})" if num_editable_utxos > 1 else "") + "...",
+ lambda: self.edit_tokens(non_frozen_utxos_that_are_editable))
+ num_minting_utxos = len(non_frozen_utxos_that_are_minting)
+ if num_minting_utxos:
+ menu.addAction(QtGui.QIcon(":icons/baton.png"), _("Mint NFTs..."),
+ lambda: self.mint_tokens(non_frozen_utxos_that_are_minting))
+
+ menu.addAction(QtGui.QIcon(":icons/tab_token.svg"), _("Create Token") + "...", self.create_new_token)
+
+ menu.exec_(self.viewport().mapToGlobal(position))
+
+ @if_not_dead
+ def create_new_token(self):
+ self.parent.show_create_new_token_dialog()
+
+ @if_not_dead
+ def on_edit_metadata(self, token_id_hex: str):
+ self.parent.show_edit_token_metadata_dialog(token_id_hex)
+
+ @classmethod
+ def dedupe_utxos(cls, utxos: List[Dict], enforce_unique_token_ids=False) -> List[Dict]:
+ deduped_utxos = []
+ seen = set()
+ seen_token_ids = set()
+ for utxo in utxos:
+ key = cls.get_outpoint_longname(utxo)
+ td = utxo['token_data']
+ tid = td and td.id
+ if key not in seen and (not enforce_unique_token_ids or not tid or tid not in seen_token_ids):
+ seen.add(key)
+ if tid:
+ seen_token_ids.add(tid)
+ deduped_utxos.append(utxo)
+ return deduped_utxos
+
+ @if_not_dead
+ def send_tokens(self, utxos: List[Dict[str, Any]]):
+ utxos = self.dedupe_utxos(utxos)
+ self.parent.send_tokens(utxos)
+
+ @if_not_dead
+ def edit_tokens(self, utxos: List[Dict[str, Any]]):
+ utxos = self.dedupe_utxos(utxos)
+ self.parent.edit_tokens(utxos)
+
+ @if_not_dead
+ def mint_tokens(self, utxos: List[Dict[str, Any]]):
+ utxos = self.dedupe_utxos(utxos, enforce_unique_token_ids=True)
+ self.parent.mint_tokens(utxos)
+
+ @if_not_dead
+ def update_labels(self):
+ self.update()
+
+ def on_doubleclick(self, item, column):
+ if self.permit_edit(item, column):
+ super().on_doubleclick(item, column)
+ else:
+ utxos = item.data(0, self.DataRoles.utxos)
+ if len(utxos) == 1 and item.childCount() == 0: # Leaf utxo item, show transaction
+ tx_hash = utxos[0]['prevout_hash']
+ tx = self.wallet.transactions.get(tx_hash)
+ if tx:
+ label = self.wallet.get_label(tx_hash) or None
+ self.parent.show_transaction(tx, label)
diff --git a/electroncash_gui/qt/token_meta.py b/electroncash_gui/qt/token_meta.py
new file mode 100644
index 000000000000..f6e4d5e1c90e
--- /dev/null
+++ b/electroncash_gui/qt/token_meta.py
@@ -0,0 +1,40 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+# -*- mode: python3 -*-
+# This file (c) 2023 Calin Culianu
+# Part of the Electron Cash SPV Wallet
+# License: MIT
+""" Encapsulation and handling of token metadata -- Qt-specific functions """
+
+from electroncash.token_meta import TokenMeta
+from .utils import qblockies
+
+from PyQt5.QtCore import QBuffer, QByteArray, QIODevice
+from PyQt5.QtGui import QColor, QIcon, QPixmap
+
+
+class TokenMetaQt(TokenMeta):
+
+ def _icon_to_bytes(self, icon: QIcon) -> bytes:
+ ba = QByteArray()
+ buffer = QBuffer(ba)
+ buffer.open(QIODevice.WriteOnly)
+ pm = icon.pixmap(32, 32)
+ pm.save(buffer, "PNG")
+ return bytes(ba)
+
+ def _bytes_to_icon(self, buf: bytes) -> QIcon:
+ ba = QByteArray(buf)
+ pm = QPixmap()
+ pm.loadFromData(ba, "PNG")
+ icon = QIcon(pm)
+ return icon
+
+ def gen_default_icon(self, token_id_hex: str) -> QIcon:
+ img = qblockies.create(token_id_hex, size=12, scale=4, spotcolor=QColor(0, 0, 0))
+ return QIcon(QPixmap.fromImage(img))
+
+ @property
+ def _icon_ext(self) -> str:
+ """Override"""
+ return "png"
diff --git a/electroncash_gui/qt/token_meta_edit.py b/electroncash_gui/qt/token_meta_edit.py
new file mode 100644
index 000000000000..1f0c3775a5c0
--- /dev/null
+++ b/electroncash_gui/qt/token_meta_edit.py
@@ -0,0 +1,250 @@
+#!/usr/bin/env python3
+#
+# Electron Cash - lightweight Bitcoin Cash client
+# Copyright (C) 2022 The Electron Cash Developers
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from collections import namedtuple
+from typing import Optional
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+from PyQt5.QtGui import QFont
+
+from electroncash import token, util
+from electroncash.i18n import _
+from .main_window import ElectrumWindow
+from .util import HelpLabel, MessageBoxMixin, MONOSPACE_FONT, OnDestroyedMixin, PrintError
+from .token_meta import TokenMetaQt
+
+MAX_UI_DECIMALS = len(str(2**63 - 1))
+ICON_BUT_SIZE = 64
+
+
+class TokenMetaEditorForm(QtWidgets.QWidget, MessageBoxMixin, PrintError, OnDestroyedMixin):
+
+ def __init__(self, parent: QtWidgets.QWidget, token_id: str, *,
+ flags=None, window: Optional[ElectrumWindow] = None):
+ window = window or parent
+ assert isinstance(window, ElectrumWindow)
+ if flags:
+ super().__init__(parent=parent, flags=flags)
+ else:
+ super().__init__(parent=parent)
+ MessageBoxMixin.__init__(self)
+ PrintError.__init__(self)
+ OnDestroyedMixin.__init__(self)
+ util.finalization_print_error(self)
+ self.window: ElectrumWindow = window
+ self.token_meta: TokenMetaQt = self.window.token_meta
+ self.token_id = token_id
+
+ self.setWindowTitle(_("Edit Token Properties") + f" - {self.token_id}")
+ self.setWindowIcon(self.token_meta.get_icon(self.token_id))
+
+ # Remember what the state of things was when this form was created
+ RV = namedtuple("reset", "name, ticker, decimals, icon")
+ self.reset_vals = RV(
+ name=self.token_meta.get_token_display_name(self.token_id) or "",
+ ticker=self.token_meta.get_token_ticker_symbol(self.token_id) or "",
+ decimals=self.token_meta.get_token_decimals(self.token_id) or 0,
+ icon=self.token_meta.get_icon(self.token_id) or QtGui.QIcon(),
+ )
+ self.selected_icon = self.reset_vals.icon
+
+ layout = QtWidgets.QFormLayout(self)
+ layout.setFieldGrowthPolicy(layout.ExpandingFieldsGrow)
+
+ tt = _("Category ID (Token ID)")
+ help_text = _("This token derived its Category ID (aka Token ID) from the tx hash"
+ " of the \"xxx:0\" coin that was used to create it. Once set at token genesis, this ID is"
+ " fixed forever and cannot be edited.")
+ l = HelpLabel(_("Category ID") + ":", help_text)
+ l.setToolTip(tt)
+ l2 = QtWidgets.QLabel(self.token_id)
+ l2.setToolTip(tt)
+ f = QFont(MONOSPACE_FONT)
+ f.setBold(True)
+ l2.setFont(f)
+ l2.setTextInteractionFlags(l2.textInteractionFlags() | QtCore.Qt.TextSelectableByMouse)
+ a = QtWidgets.QAction(_("Copy Category ID"), self)
+ a.triggered.connect(lambda: self.window.copy_to_clipboard(self.token_id))
+ l.addAction(a)
+ l2.addAction(a)
+ l.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
+ l2.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
+ layout.addRow(l, l2)
+
+ help_text = _("The token icon is used in the UI to decorate all tokens sharing this Category ID."
+ " This field is local to this installation of Electron Cash and is for UI convenience only.")
+ tt = _("The icon to assign to this token")
+ l = HelpLabel(_("Token Icon") + ":", help_text)
+ l.setToolTip(tt)
+ hbox = QtWidgets.QHBoxLayout()
+ hbox.setContentsMargins(0, 0, 0, 0)
+ self.but_icon = QtWidgets.QPushButton()
+ self.but_icon.setFixedSize(ICON_BUT_SIZE, ICON_BUT_SIZE)
+ self.but_icon.setIconSize(QtCore.QSize(ICON_BUT_SIZE, ICON_BUT_SIZE))
+ self.but_icon.setToolTip(tt + "; " + _("Click to change"))
+ self.but_icon.setFlat(True)
+ self.but_icon.resize(ICON_BUT_SIZE, ICON_BUT_SIZE)
+ self.but_icon.clicked.connect(self.on_but_icon)
+ hbox.setAlignment(self.but_icon, QtCore.Qt.AlignTop | QtCore.Qt.AlignCenter)
+ hbox.addWidget(self.but_icon)
+ vbox = QtWidgets.QVBoxLayout()
+ vbox.setSpacing(1)
+ vbox.setContentsMargins(0, 0, 0, 0)
+ but_chg = QtWidgets.QPushButton(_("Change Icon..."))
+ but_chg.clicked.connect(self.on_but_icon)
+ vbox.addWidget(but_chg)
+ but_def = QtWidgets.QPushButton(_("Set to Auto-Gen"))
+ but_def.setToolTip(_("Click to clear the icon and assign it an auto-generated deterministic value"))
+ f = but_def.font()
+ f.setStretch(f.SemiCondensed)
+ f.setPointSize(f.pointSize() - 1)
+ but_def.setFont(f)
+ but_chg.setFont(f)
+
+ def reset_to_autogen():
+ self.selected_icon = self.token_meta.gen_default_icon(self.token_id)
+ self.but_icon.setIcon(self.selected_icon)
+ but_def.clicked.connect(reset_to_autogen)
+ vbox.addWidget(but_def)
+ hbox.addLayout(vbox)
+ hbox.setAlignment(vbox, QtCore.Qt.AlignBottom | QtCore.Qt.AlignCenter)
+ layout.addRow(l, hbox)
+ layout.setAlignment(l, QtCore.Qt.AlignTop | QtCore.Qt.AlignRight)
+
+ help_text = _("The token name is the display name that will be used in Electron Cash to refer to this token."
+ " It is local to this installation of Electron Cash and is for UI convenience only.")
+ tt = _("Token name used for UI display within Electron Cash")
+ l = HelpLabel(_("Token Name") + ":", help_text)
+ l.setToolTip(tt)
+ self.le_token_name = QtWidgets.QLineEdit()
+ self.le_token_name.setToolTip(tt)
+ self.le_token_name.setPlaceholderText(_("Satoshi's Token"))
+ self.le_token_name.textChanged.connect(self.on_edit_token_name)
+ layout.addRow(l, self.le_token_name)
+
+ help_text = _("The token symbol should be a short acronym for the token, as would appear on an exchange."
+ " This field is local to this installation of Electron Cash and is for UI convenience only.")
+ tt = _("Token symbol used for UI display within Electron Cash")
+ l = HelpLabel(_("Token Symbol") + ":", help_text)
+ l.setToolTip(tt)
+ self.le_token_sym = QtWidgets.QLineEdit()
+ self.le_token_sym.setToolTip(tt)
+ self.le_token_sym.setPlaceholderText(_("ST"))
+ layout.addRow(l, self.le_token_sym)
+
+ help_text = (_("The token decimals is an integer from 0 to {max}. It controls how the token's fungible amount"
+ " is formatted within Electron Cash."
+ " This field is local to this installation of Electron Cash and is for UI convenience only.")
+ .format(max=MAX_UI_DECIMALS))
+ tt = _("Controls how to format token fungible amounts in the UI")
+ l = HelpLabel(_("Token Decimals") + ":", help_text)
+ l.setToolTip(tt)
+ self.sb_token_dec = QtWidgets.QSpinBox()
+ self.sb_token_dec.setToolTip(tt)
+ self.sb_token_dec.setMinimum(0)
+ self.sb_token_dec.setMaximum(MAX_UI_DECIMALS)
+ hbox = QtWidgets.QHBoxLayout()
+ hbox.setContentsMargins(0, 0, 0, 0)
+ self.l_token_sym_dec_example = QtWidgets.QLabel()
+ self.l_token_sym_dec_example.setToolTip(_("Sample of how this setting will look in the UI"))
+ hbox.addWidget(self.sb_token_dec)
+ hbox.addWidget(self.l_token_sym_dec_example)
+ self.sb_token_dec.valueChanged.connect(self.update_token_dec_example)
+ self.update_token_dec_example(self.sb_token_dec.value())
+ # Formats label with whatever is in settings
+ layout.addRow(l, hbox)
+
+ # Bottom buttons
+ layout.addItem(QtWidgets.QSpacerItem(0, 12, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding))
+ hbox = QtWidgets.QHBoxLayout()
+ hbox.setContentsMargins(0, 0, 0, 0)
+ clear_but = QtWidgets.QPushButton(_("Clear"))
+ clear_but.setToolTip(_("Clear this form to its initial state"))
+ clear_but.clicked.connect(self.reset_form)
+ hbox.addWidget(clear_but)
+ hbox.addStretch(2)
+ clz = QtWidgets.QDialogButtonBox
+ buttons = QtWidgets.QDialogButtonBox(clz.Cancel | clz.Ok)
+ buttons.accepted.connect(self.on_ok_button)
+ buttons.rejected.connect(self.on_close_button)
+ hbox.addWidget(buttons, 1, QtCore.Qt.AlignRight)
+ layout.addRow(hbox)
+
+ self.reset_form()
+
+ def on_ok_button(self):
+ tid = self.token_id
+ self.token_meta.set_icon(tid, self.selected_icon if not self.selected_icon.isNull() else None)
+ self.token_meta.set_token_display_name(tid, self.le_token_name.text().strip() or None)
+ self.token_meta.set_token_ticker_symbol(tid, self.le_token_sym.text().strip() or None)
+ self.token_meta.set_token_decimals(tid, self.sb_token_dec.value() or None)
+ self.token_meta.save()
+ self.close()
+ self.window.gui_object.token_metadata_updated_signal.emit(tid)
+
+ def on_close_button(self):
+ self.close()
+
+ def on_but_icon(self):
+ fn, filt = QtWidgets.QFileDialog.getOpenFileName(self, _("Open File"), "",
+ "Images (*.png *.svg *.jpg *.jpeg *.ico)")
+ if not fn:
+ return
+ icon = QtGui.QIcon(fn)
+ if icon.isNull():
+ return
+ # Scale it for this button
+ self.but_icon.setIcon(icon)
+ self.selected_icon = icon
+
+ def update_token_dec_example(self, num_decimals):
+ val = 2**63 - 1
+ fmt = token.format_fungible_amount(val, decimal_point=num_decimals, precision=num_decimals)
+ if fmt.endswith('.'):
+ fmt = fmt[:-1]
+ example = _("Example") + ": " + fmt + ""
+ self.l_token_sym_dec_example.setText(example)
+
+ def on_edit_token_name(self):
+ """Automagically sets the token symbol for a user if they never edited the token symbol field,
+ and they begin typing in the token name field"""
+ if self.le_token_sym.isModified():
+ return
+ auto_acronym = ''
+ for word in self.le_token_name.text().strip().split():
+ if word:
+ ch = word[0].upper()
+ if ch >= 'A' and ch <= 'Z':
+ auto_acronym += ch
+ self.le_token_sym.setText(auto_acronym)
+
+ def reset_form(self):
+ rv = self.reset_vals
+ self.le_token_sym.setText(rv.ticker)
+ self.le_token_sym.setModified(len(self.le_token_sym.text().strip()) > 0)
+ self.le_token_name.setText(rv.name)
+ self.sb_token_dec.setValue(rv.decimals)
+ self.selected_icon = rv.icon
+ self.but_icon.setIcon(self.selected_icon)
diff --git a/electroncash_gui/qt/token_send.py b/electroncash_gui/qt/token_send.py
new file mode 100644
index 000000000000..e258ba48c911
--- /dev/null
+++ b/electroncash_gui/qt/token_send.py
@@ -0,0 +1,1120 @@
+#!/usr/bin/env python3
+#
+# Electron Cash - lightweight Bitcoin Cash client
+# Copyright (C) 2023 The Electron Cash Developers
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+import copy
+import math
+from collections import defaultdict
+from enum import IntEnum
+from typing import Any, Callable, DefaultDict, Dict, List, Optional, Set
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+from electroncash import address, networks, token, util, wallet
+from electroncash.i18n import _
+from .amountedit import BTCAmountEdit
+from .fee_slider import FeeSlider
+from .main_window import ElectrumWindow
+from .qrtextedit import ScanQRTextEdit
+from .token_meta import TokenMetaQt
+from .util import ColorScheme, HelpLabel, OnDestroyedMixin, PrintError, WindowModalDialog
+
+
+class SendTokenForm(WindowModalDialog, PrintError, OnDestroyedMixin):
+
+ class ColsTok(IntEnum):
+ category = 0
+ nfts = 1
+ amount = 2
+ amount_send = 3
+
+ class ColsNFT(IntEnum):
+ selected = 0
+ category = 1
+ commitment = 2
+ flags = 3
+
+ class ColsBaton(IntEnum):
+ icon = 0
+ category = 1
+ buttons = 2
+
+ class ColsMint(IntEnum):
+ category = 0
+ commitment = 1
+ capability = 2
+ multiplier = 3
+
+ class DataRoles(IntEnum):
+ token_id = QtCore.Qt.UserRole
+ output_point = QtCore.Qt.UserRole + 1
+ receives_nft_count_updates = QtCore.Qt.UserRole + 2
+ receives_nft_flag_updates = QtCore.Qt.UserRole + 3
+
+ class FormMode(IntEnum):
+ send = 0
+ edit = 1
+ mint = 2
+
+ headers_tok = [_("Category"), _("NFTs to Send"), _("Fungible Amount"), _("Fungible Amount to Send")]
+ headers_nft = [_("Send"), _("Category"), _("Commitment"), _("Capability")]
+ headers_baton = ["", _("Category"), ""]
+ headers_mint = [_("Category"), _("Commitment"), _("Capability"), _("Multiplier")]
+
+ def __init__(self, parent: ElectrumWindow, token_utxos: List[dict],
+ *, broadcast_callback: Optional[Callable[[bool], Any]] = None, form_mode=FormMode.send):
+ assert isinstance(parent, ElectrumWindow)
+ if form_mode == self.FormMode.send:
+ title = _("Send Tokens")
+ elif form_mode == self.FormMode.edit:
+ title = _("Edit Tokens")
+ else:
+ title = _("Mint NFTs")
+ title += " - " + parent.wallet.basename()
+ super().__init__(parent=parent, title=title)
+ PrintError.__init__(self)
+ OnDestroyedMixin.__init__(self)
+ self.fully_constructed = False
+ self._rebuilding_treewidget = False
+ util.finalization_print_error(self)
+ self.setWindowIcon(QtGui.QIcon(":icons/tab_send.png"))
+ self.parent = parent
+ self.token_meta: TokenMetaQt = parent.token_meta
+ self.wallet: wallet.Abstract_Wallet = self.parent.wallet
+ self.utxos_by_name: Dict[str, dict] = dict()
+ self.token_utxos: DefaultDict[str, List[str]] = defaultdict(list) # tokenid -> unique sorted list of utxonames
+ self.token_nfts: DefaultDict[str, List[str]] = defaultdict(list) # tokenid -> list of utxonames
+ self.token_fungible_only: DefaultDict[str, List[str]] = defaultdict(list)
+ self.token_fungible_totals: DefaultDict[str, int] = defaultdict(int) # tokenid -> fungible total
+ self.token_nfts_selected: DefaultDict[str, Set[str]] = defaultdict(set) # tokenid -> set of selected utxonames
+ self.token_fungible_to_spend: DefaultDict[str, int] = defaultdict(int) # tokenid -> amount
+ self.nfts_to_edit: DefaultDict[str, Optional[bytes]] = defaultdict(bytes) # utxoname -> new commitment bytes
+ self.nfts_to_mint: List[Dict] = list() # Inner Dict keys: category_id, commitment, capability, copies, baton_name
+ self.broadcast_callback = broadcast_callback
+ self.icon_baton = QtGui.QIcon(":icons/baton.png")
+ self.icon_mutable = QtGui.QIcon(":icons/mutable.png")
+ self.icon_trash = QtGui.QIcon(":icons/trash-10-24.png")
+ self.form_mode = form_mode
+
+ # Setup data source; iterate over a sorted list of utxos
+ def sort_func(u):
+ td: token.OutputData = u['token_data']
+ return td.id, td.commitment, td.bitfield & 0x0f, self.get_outpoint_longname(u)
+ sorted_utxos = sorted(token_utxos, key=sort_func)
+
+ for utxo in sorted_utxos:
+ td: token.OutputData = utxo['token_data']
+ assert isinstance(td, token.OutputData)
+ tid = td.id_hex
+ name = self.get_outpoint_longname(utxo)
+ if name in self.utxos_by_name:
+ # skip dupes
+ assert self.utxos_by_name[name] == utxo
+ continue
+ self.utxos_by_name[name] = utxo
+ self.token_utxos[tid].append(name)
+ if td.has_nft():
+ self.token_nfts[tid].append(name)
+ # Start out with nothing selected
+ self.token_nfts_selected[tid].clear()
+ else:
+ assert td.has_amount()
+ self.token_fungible_only[tid].append(name)
+ self.token_fungible_totals[tid] += td.amount
+
+ # Build UI
+ vbox = QtWidgets.QVBoxLayout(self)
+ splitter = QtWidgets.QSplitter(QtCore.Qt.Vertical)
+ splitter.setChildrenCollapsible(False)
+ splitter.setContentsMargins(0, 0, 0, 0) # contains the two top groupboxess (each containing a treewidget)
+
+ # Top panel
+ if self.form_mode == self.FormMode.mint:
+ gb_tok_title = _("Available Minting Tokens")
+ else:
+ gb_tok_title = _("Tokens to Send")
+
+ self.gb_ft = gb = QtWidgets.QGroupBox(gb_tok_title)
+ vbox_gb = QtWidgets.QVBoxLayout(gb)
+ self.tw_tok = tw = QtWidgets.QTreeWidget()
+ tw.setAlternatingRowColors(True)
+ tw.setSortingEnabled(False)
+ tw.setTextElideMode(QtCore.Qt.ElideMiddle)
+ if self.form_mode == self.FormMode.mint:
+ tw.setHeaderLabels(self.headers_baton)
+ tw.header().setSectionResizeMode(self.ColsBaton.category, QtWidgets.QHeaderView.Stretch)
+ tw.header().setSectionResizeMode(self.ColsBaton.buttons, QtWidgets.QHeaderView.ResizeToContents)
+ tw.header().setStretchLastSection(False)
+ tw.header().resizeSection(self.ColsBaton.icon, 21)
+ tw.itemDoubleClicked.connect(self.on_mint_mode_top_tree_dbl_click)
+ tw.setMinimumHeight(100)
+ else:
+ tw.setHeaderLabels(self.headers_tok)
+ tw.header().setSectionResizeMode(self.ColsTok.amount_send, QtWidgets.QHeaderView.Stretch)
+ tw.setRootIsDecorated(False) # Saves space in col0
+ tw.setItemsExpandable(False) # ditto
+ vbox_gb.addWidget(tw)
+ splitter.addWidget(gb)
+ if self.form_mode == self.FormMode.mint:
+ splitter.setStretchFactor(splitter.count()-1, 38)
+ else:
+ splitter.setStretchFactor(splitter.count()-1, 100)
+
+ # Middle panel
+ if self.form_mode == self.FormMode.send:
+ gb_nft_title = _("NFTs to Send")
+ elif self.form_mode == self.FormMode.edit:
+ gb_nft_title = _("NFTs to Edit")
+ else:
+ gb_nft_title = _("NFTs to Mint")
+ self.gb_nft = gb_nft = QtWidgets.QGroupBox(gb_nft_title)
+ gb_nft_vbox = QtWidgets.QVBoxLayout(gb_nft)
+
+ self.tw_nft = tw = QtWidgets.QTreeWidget()
+ tw.setAlternatingRowColors(True)
+ tw.setSortingEnabled(False)
+ tw.setTextElideMode(QtCore.Qt.ElideMiddle)
+ if self.form_mode == self.FormMode.send:
+ tw.setHeaderLabels(self.headers_nft)
+ tw.header().setSectionResizeMode(self.ColsNFT.flags, QtWidgets.QHeaderView.Stretch)
+ elif self.form_mode == self.FormMode.edit:
+ self.headers_nft = [_("Selected")] + self.headers_nft[1:]
+ tw.setHeaderLabels(self.headers_nft)
+ tw.header().setSectionResizeMode(self.ColsNFT.commitment, QtWidgets.QHeaderView.Stretch)
+ elif self.form_mode == self.FormMode.mint:
+ tw.setRootIsDecorated(False)
+ tw.setItemsExpandable(False)
+ tw.setHeaderLabels(self.headers_mint)
+ tw.header().setSectionResizeMode(self.ColsMint.commitment, QtWidgets.QHeaderView.Stretch)
+ tw.header().setSectionResizeMode(self.ColsMint.capability, QtWidgets.QHeaderView.Fixed)
+ gb_nft_vbox.addWidget(tw)
+
+ self.rebuild_output_tokens_treewidget()
+ self.rebuild_input_tokens_treewidget()
+
+ # Receive notification and update nft selected sets when user clicks the NFT widget
+ self.tw_nft.itemChanged.connect(self.on_nft_item_changed)
+
+ splitter.addWidget(gb_nft)
+ splitter.setStretchFactor(splitter.count()-1, 100)
+
+ # Pay To
+ vbox_bottom = QtWidgets.QVBoxLayout()
+ vbox_bottom.setContentsMargins(0, 0, 0, 0) # No inset
+ gb_payto = self.gb_payto = QtWidgets.QGroupBox(_("Pay To"))
+ vbox_payto = QtWidgets.QVBoxLayout(gb_payto)
+ self.te_payto = te = ScanQRTextEdit()
+
+ vbox_payto.addWidget(te)
+ te.setPlaceholderText(networks.net.CASHADDR_PREFIX + ":" + "...")
+ te.textChanged.connect(self.on_ui_state_changed)
+
+ self._adjust_te_payto_size()
+ if self.form_mode in (self.FormMode.edit, self.FormMode.mint):
+ gb_payto.setHidden(True)
+ self.te_payto.setText(self.wallet.get_unused_address(for_change=True).to_token_string())
+
+ vbox_bottom.addWidget(gb_payto)
+ vbox_bottom.setStretch(vbox_bottom.count()-1, 1)
+
+ # BCH to send plus description
+ hbox = QtWidgets.QHBoxLayout()
+ vbox_bottom.setStretch(vbox.count()-1, 100)
+ hbox.setContentsMargins(0, 0, 0, 0) # No inset
+ # Additional BCH to Send
+ self._setup_additional_bch_gbox(hbox)
+ # Description
+ gb_desc = QtWidgets.QGroupBox(_("Description"))
+ gb_desc.setToolTip(_("Enter an optional label for the transaction"))
+ vbox_gb_desc = QtWidgets.QVBoxLayout(gb_desc)
+ self.te_desc = QtWidgets.QPlainTextEdit()
+ vbox_gb_desc.addWidget(self.te_desc)
+ self.te_desc.setWordWrapMode(QtGui.QTextOption.WrapAnywhere)
+ self.te_desc.setPlaceholderText(_("Memo") + "...")
+ hbox.addWidget(gb_desc)
+
+ vbox_bottom.addLayout(hbox)
+ vbox_bottom.setStretch(vbox_bottom.count()-1, 100)
+ w_bottom = QtWidgets.QWidget()
+ w_bottom.setContentsMargins(0, 0, 0, 0) # No inset
+ w_bottom.setLayout(vbox_bottom)
+ splitter.addWidget(w_bottom)
+ if self.form_mode == self.FormMode.mint:
+ splitter.setStretchFactor(splitter.count()-1, 38)
+ else:
+ splitter.setStretchFactor(splitter.count()-1, 26)
+ vbox.addWidget(splitter)
+ vbox.setStretch(vbox.count()-1, 100)
+
+ # Bottom buttons
+ hbox = QtWidgets.QHBoxLayout()
+ but_clear = QtWidgets.QPushButton(_("Clear"))
+ but_clear.clicked.connect(self.clear_form)
+ hbox.addWidget(but_clear)
+ self.lbl_status_msg = l = QtWidgets.QLabel()
+ hbox.addWidget(l, 1, QtCore.Qt.AlignCenter | QtCore.Qt.AlignVCenter)
+ spacer = QtWidgets.QSpacerItem(0, 0, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
+ hbox.addItem(spacer)
+ but_cancel = QtWidgets.QPushButton(_("Cancel"))
+ but_cancel.clicked.connect(self.close)
+ hbox.addWidget(but_cancel)
+ self.but_preview_tx = QtWidgets.QPushButton(_("Preview Tx..."))
+ self.but_preview_tx.setDefault(True)
+ self.but_preview_tx.clicked.connect(self.on_preview_tx)
+ hbox.addWidget(self.but_preview_tx)
+
+ vbox.addLayout(hbox)
+
+ self.fully_constructed = True
+ self.on_ui_state_changed()
+
+ self.resize(640, 480)
+
+ def showEvent(self, evt: QtGui.QShowEvent):
+ super().showEvent(evt)
+ if evt.isAccepted():
+ # Subscribe to signals when metadata is updated in another window to redraw UI with proper metadata
+ self.parent.gui_object.token_metadata_updated_signal.connect(self._on_token_metadata_updated)
+
+ def hideEvent(self, evt: QtGui.QHideEvent):
+ super().hideEvent(evt)
+ if evt.isAccepted():
+ try:
+ self.parent.gui_object.token_metadata_updated_signal.disconnect(self._on_token_metadata_updated)
+ except TypeError:
+ pass
+
+ def _on_token_metadata_updated(self, tid):
+ if self.fully_constructed and tid in self.token_utxos:
+ self.rebuild_output_tokens_treewidget()
+ self.rebuild_input_tokens_treewidget()
+ self.on_ui_state_changed()
+
+ def _adjust_te_payto_size(self):
+ te = self.te_payto
+ gb = self.gb_payto
+ font_spacing = QtGui.QFontMetrics(te.document().defaultFont()).lineSpacing()
+ margins = te.contentsMargins()
+ document_margin = te.document().documentMargin()
+ vertical_margins = margins.top() + margins.bottom()
+ vertical_margins += te.frameWidth() * 2
+ vertical_margins += int(document_margin * 2)
+
+ height_min = font_spacing + vertical_margins
+ te.setMinimumHeight(height_min)
+ sp = gb.sizePolicy()
+ sp.setVerticalPolicy(sp.Maximum)
+ gb.setSizePolicy(sp)
+ te.setSizePolicy(sp)
+
+ def _setup_additional_bch_gbox(self, parent_layout: QtWidgets.QLayout):
+ gb = QtWidgets.QGroupBox(_("Additional BCH to Send"))
+ grid = QtWidgets.QGridLayout(gb)
+ row, col, n_cols = 0, 0, 5
+ msg = (_('Additional amount to be sent along with the tokens.') + '\n\n'
+ # The below text comes from the main_window.
+ + _('The amount will be displayed in red if you do not have enough funds in your wallet.') + ' '
+ + _('Note that if you have frozen some of your addresses, the available funds will be lower than your'
+ ' total balance.'))
+ l = HelpLabel(_("Amount"), msg)
+ grid.addWidget(l, row, col)
+ col += 1
+ self.amount_e = BTCAmountEdit(self.parent.get_decimal_point)
+ self.amount_e.setFixedWidth(150)
+ grid.addWidget(self.amount_e, row, col)
+ l.setBuddy(self.amount_e)
+ col += 1
+
+ def spend_max(checked):
+ if checked:
+ self.on_ui_state_changed()
+ self.cb_max = QtWidgets.QCheckBox(_("&Max"))
+ grid.addWidget(self.cb_max, row, col)
+ self.cb_max.clicked.connect(spend_max)
+ col += 1
+
+ def on_text_edited():
+ if self.cb_max.isChecked():
+ self.cb_max.setChecked(False) # will call on_ui_state_changed
+ else:
+ self.on_ui_state_changed()
+ self.amount_e.textEdited.connect(on_text_edited)
+
+ spacer = QtWidgets.QSpacerItem(0, 0, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
+ grid.addItem(spacer, row, col)
+
+ row += 1
+ col = 0
+ msg = (_('Bitcoin Cash transactions are in general not free. A transaction fee is paid by the sender of the'
+ ' funds.') + '\n\n'
+ + _('Generally, a fee of 1.0 sats/B is a good minimal rate to ensure your transaction will make it into'
+ ' the next block.'))
+ fee_e_label = HelpLabel(_('F&ee'), msg)
+ grid.addWidget(fee_e_label)
+ col += 1
+
+ self.fee_rate = 1000 # this gets quickly overwritten below
+
+ def fee_cb(dyn, pos, fee_rate):
+ self.fee_rate = fee_rate
+ self.on_ui_state_changed()
+
+ self.fee_slider = FeeSlider(self.parent, self.parent.config, fee_cb)
+ self.fee_slider.setFixedWidth(140)
+ grid.addWidget(self.fee_slider, row, col)
+ fee_e_label.setBuddy(self.fee_slider)
+ self.fee_slider.moved(self.fee_slider.value()) # Ensure callback fires at least once
+
+ parent_layout.addWidget(gb)
+ if self.form_mode in (self.FormMode.edit, self.FormMode.mint):
+ gb.setHidden(True)
+
+ def have_fts(self) -> bool:
+ return sum(amt for amt in self.token_fungible_totals.values()) > 0
+
+ def have_nfts(self) -> bool:
+ return sum(len(u) for u in self.token_nfts.values()) > 0
+
+ def get_nfts_selected_str(self, tid: str) -> str:
+ nft_total = len(self.token_nfts.get(tid, []))
+ nfts_selected = len(self.token_nfts_selected.get(tid, set()))
+ return f"{nfts_selected}/{nft_total}"
+
+ def on_nft_item_changed(self, item: QtWidgets.QTreeWidgetItem, column: int):
+ if self._rebuilding_treewidget:
+ return
+ tid = item.data(0, self.DataRoles.token_id)
+ name = item.data(0, self.DataRoles.output_point)
+ # Update NFTs selected set and counts in UI
+ if tid and name and column == self.ColsNFT.selected:
+ checked = item.checkState(column) == QtCore.Qt.Checked
+ if checked:
+ self.token_nfts_selected[tid].add(name)
+ else:
+ self.token_nfts_selected[tid].discard(name)
+ self.update_tokens_to_send_nft_count(tid)
+ self.on_ui_state_changed()
+
+ def update_tokens_to_send_nft_flags(self, tid: str):
+ """Intended to be a callback for a specific token id -- updates the NFTs x/y column"""
+ tw = self.tw_nft
+ for i in range(tw.topLevelItemCount()):
+ item = tw.topLevelItem(i)
+ if (item.data(0, self.DataRoles.token_id) == tid
+ and item.data(0, self.DataRoles.receives_nft_flag_updates)):
+ flags = set()
+ for index in range(item.childCount()):
+ child = item.child(index)
+ name = child.data(0, self.DataRoles.output_point)
+ if name and name in self.token_nfts_selected.get(tid, set()):
+ flags.add(child.text(self.ColsNFT.flags))
+ flags = ', '.join(flags)
+ if flags:
+ flags = _("Selected") + ": " + flags
+ item.setText(self.ColsNFT.flags, flags)
+ return
+
+ def update_tokens_to_send_nft_count(self, tid: str):
+ """Intended to be a callback for a specific token id -- updates the NFTs x/y column"""
+ tws = [(self.tw_tok, self.ColsTok.nfts), (self.tw_nft, self.ColsNFT.selected)]
+ for tw, col in tws:
+ if tw is None:
+ continue
+ for i in range(tw.topLevelItemCount()):
+ item = tw.topLevelItem(i)
+ if (item.data(0, self.DataRoles.token_id) == tid
+ and item.data(0, self.DataRoles.receives_nft_count_updates)):
+ item.setText(col, self.get_nfts_selected_str(tid))
+ break
+
+ def add_nft_to_mint(self, category_id: str, baton_name: str):
+ self.nfts_to_mint.append(
+ {"category_id": category_id,
+ "commitment": b'',
+ "capability": token.Capability.NoCapability,
+ "copies": 1,
+ "baton_name": baton_name})
+ self.rebuild_output_tokens_treewidget()
+ self.on_ui_state_changed()
+ # Scroll to bottom so user understands where the new NFT ended up (otherwise he/she might have impression
+ # that the Mint button had no effect on UI)
+ self.tw_nft.scrollToBottom()
+
+ def remove_nft_to_mint(self, row_number):
+ scroll_pos_val = self.tw_nft.verticalScrollBar().value()
+ del self.nfts_to_mint[row_number]
+ self.rebuild_output_tokens_treewidget()
+ self.tw_nft.verticalScrollBar().setValue(scroll_pos_val)
+ self.on_ui_state_changed()
+
+ def on_mint_mode_top_tree_dbl_click(self, item, column):
+ """Slot to make double-clicks do the same things as clicking the "Mint..." button"""
+ if self.form_mode != self.FormMode.mint:
+ return
+ baton_name = item.data(0, self.DataRoles.output_point)
+ w = self.tw_tok.itemWidget(item, self.ColsBaton.buttons)
+ if w and baton_name:
+ but = w.findChild(QtWidgets.QToolButton, "mint_" + baton_name, QtCore.Qt.FindChildrenRecursively)
+ if but:
+ but.clicked.emit()
+
+ @staticmethod
+ def _set_field_margins(hbox, first_row=False, first_column=False, last_column=False):
+ normal = 2
+ left = 0 if first_column else normal
+ right = normal * 2 if last_column else normal
+ top = normal * 2 if first_row else normal
+ hbox.setContentsMargins(left, top, right, normal)
+
+ @staticmethod
+ def allow_transparent_background(widget: QtWidgets.QWidget):
+ """QWidgets added to QTreeWidgets by default have fully opaque backgrounds which disrupt the alternate-row
+ styling and row-hover effects. This function gives the appropriate QWidget a transparent background."""
+ widget.parentWidget().setStyleSheet(
+ 'QTreeWidget::item > QWidget > QWidget { background-color: transparent; }')
+
+ def _set_category_col(self, item, tid: str, category_col: int):
+ # Params: tid: token_id (category id), category_col: the column that corresponds to the category column
+ assert category_col in {self.ColsNFT.category, self.ColsTok.category, self.ColsMint.category,
+ self.ColsBaton.category}
+ item.setIcon(category_col, self.token_meta.get_icon(tid))
+ formatted_category = self.token_meta.format_token_display_name(tid)
+ item.setText(category_col, formatted_category)
+ tt = formatted_category
+ if formatted_category != tid:
+ tt += " " + _("Category ID") + ": " + tid
+ item.setToolTip(category_col, tt)
+ f = item.font(category_col)
+ f.setStretch(f.SemiCondensed)
+ item.setFont(category_col, f)
+
+ def rebuild_input_tokens_treewidget(self):
+ try:
+ self._rebuilding_treewidget = True
+ self._rebuild_input_tokens_treewidget()
+ finally:
+ self._rebuilding_treewidget = False
+
+ def _rebuild_input_tokens_treewidget(self):
+ tw = self.tw_tok
+ tw.clear()
+ first_row = True
+ if self.form_mode == self.FormMode.send:
+ for tid, amt in self.token_fungible_totals.items():
+ try:
+ if amt <= 0:
+ # Skip displaying rows in this table for tokens that have no fungibles
+ continue
+ formatted_amt = self.token_meta.format_amount(tid, amt)
+ item = QtWidgets.QTreeWidgetItem(["", "", formatted_amt, ""])
+ item.setData(0, self.DataRoles.token_id, tid)
+ item.setData(0, self.DataRoles.receives_nft_count_updates, True)
+ self._set_category_col(item, tid, self.ColsTok.category)
+ item.setToolTip(self.ColsTok.amount, item.text(self.ColsTok.amount))
+ item.setFlags(item.flags() & ~QtCore.Qt.ItemIsSelectable)
+ tw.addTopLevelItem(item)
+ finally:
+ # Update NFTs M/N column (must be done after add, and even if we didn't add anything)
+ self.update_tokens_to_send_nft_count(tid)
+ w = QtWidgets.QWidget()
+ w.setToolTip(_("Specify fungible token amount to be sent in the transaction"))
+ hbox = QtWidgets.QHBoxLayout(w)
+ self._set_field_margins(hbox, first_row, last_column=True)
+ le = QtWidgets.QLineEdit()
+ le.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+ le.setObjectName("le") # so we can find it later
+ formatted_saved_amt = self.token_meta.format_amount(tid, self.token_fungible_to_spend.get(tid, 0))
+ le.setText(formatted_saved_amt)
+
+ def on_edit(amt=amt, tid=tid, le=le):
+ try:
+ val = self.token_meta.parse_amount(tid, le.text())
+ if val < 0:
+ val = 0
+ elif val > amt:
+ val = amt
+ self.token_fungible_to_spend[tid] = val
+ except ValueError:
+ pass
+ le.setText(self.token_meta.format_amount(tid, self.token_fungible_to_spend[tid]))
+ self.on_ui_state_changed()
+ le.editingFinished.connect(on_edit)
+ hbox.addWidget(le)
+
+ def on_max(b, amt=amt, tid=tid, le=le):
+ le.setText(self.token_meta.format_amount(tid, amt))
+ on_edit(amt=amt, tid=tid, le=le)
+
+ def on_clear(b, amt=amt, tid=tid, le=le):
+ le.setText("0")
+ on_edit(amt=amt, tid=tid, le=le)
+ but = QtWidgets.QToolButton()
+ but.clicked.connect(on_max)
+ but.setText(_("Max"))
+ but.setObjectName("max")
+ but.setToolTip("Set to full amount available")
+ hbox.addWidget(but)
+ but2 = QtWidgets.QToolButton()
+ but2.clicked.connect(on_clear)
+ but2.setText(_("Clear"))
+ but2.setObjectName("clear")
+ but2.setToolTip("Set to 0")
+ hbox.addWidget(but2)
+ tw.setItemWidget(item, self.ColsTok.amount_send, w)
+ self.allow_transparent_background(w)
+ first_row = False
+ elif self.form_mode == self.FormMode.mint:
+ for tid, baton_names in self.token_nfts.items():
+ for baton_name in baton_names:
+ utxo = self.get_utxo(baton_name)
+ td = utxo['token_data']
+ assert isinstance(td, token.OutputData)
+ category_id = td.id_hex
+ assert category_id == tid
+ item = QtWidgets.QTreeWidgetItem(["", "", ""])
+ item.setData(0, self.DataRoles.token_id, tid)
+ item.setData(0, self.DataRoles.output_point, baton_name)
+ self._set_category_col(item, category_id, self.ColsBaton.category)
+ item.setToolTip(self.ColsBaton.icon, _("Minting NFT"))
+ item.setFlags(item.flags() & ~QtCore.Qt.ItemIsSelectable)
+ item.setIcon(self.ColsBaton.icon, self.icon_baton)
+ tw.addTopLevelItem(item)
+ w = QtWidgets.QWidget()
+ w.setToolTip(item.toolTip(self.ColsNFT.commitment))
+ hbox = QtWidgets.QHBoxLayout(w)
+ self._set_field_margins(hbox, first_row, last_column=True)
+ but = QtWidgets.QToolButton()
+
+ def on_clicked(_, _category_id=category_id, _baton_name=baton_name):
+ self.add_nft_to_mint(_category_id, _baton_name)
+ self.on_ui_state_changed()
+ but.clicked.connect(on_clicked)
+ but.setText(_("Mint..."))
+ but.setObjectName("mint_" + baton_name)
+ but.setToolTip("Use this Minting token to mint new NFTs")
+ hbox.addWidget(but)
+ tw.setItemWidget(item, self.ColsBaton.buttons, w)
+ self.allow_transparent_background(w)
+ first_row = False
+
+ if self.form_mode == self.FormMode.edit or (self.form_mode == self.FormMode.send and not self.have_fts()):
+ # Hide the input tokens box in edit mode or if no fungibles in send mode
+ self.gb_ft.setHidden(True)
+
+ @staticmethod
+ def is_commitment_valid(commitment_hex):
+ if len(commitment_hex) > token.MAX_CONSENSUS_COMMITMENT_LENGTH * 2:
+ return False, b''
+ try:
+ return True, bytes.fromhex(commitment_hex)
+ except ValueError:
+ return False, b''
+
+ def rebuild_output_tokens_treewidget(self):
+ try:
+ self._rebuilding_treewidget = True
+ self._rebuild_output_tokens_treewidget()
+ finally:
+ self._rebuilding_treewidget = False
+
+ def _rebuild_output_tokens_treewidget(self):
+ tw = self.tw_nft
+ tw.clear()
+ row_num = 0
+ first_row = True
+
+ if self.form_mode == self.FormMode.mint:
+ for row_data in self.nfts_to_mint:
+ category_id = row_data["category_id"]
+ commitment = row_data["commitment"] or b''
+ capability = row_data["capability"]
+ copies = row_data["copies"]
+ item = QtWidgets.QTreeWidgetItem(["", "", "", ""])
+ self._set_category_col(item, category_id, self.ColsMint.category)
+ max_chars = token.MAX_CONSENSUS_COMMITMENT_LENGTH * 2
+ item.setToolTip(self.ColsNFT.commitment,
+ _("Enter an even number of up to {max_chars} hexadecimal characters")
+ .format(max_chars=max_chars))
+ item.setFlags(item.flags() & ~QtCore.Qt.ItemIsSelectable)
+ tw.addTopLevelItem(item)
+
+ # Commitment field
+ w = QtWidgets.QWidget()
+ w.setToolTip(item.toolTip(self.ColsMint.commitment))
+ hbox = QtWidgets.QHBoxLayout(w)
+ self._set_field_margins(hbox, first_row)
+ commitment_le = QtWidgets.QLineEdit()
+ commitment_le.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+ commitment_le.setText(row_data.get("last_text_seen") or commitment.hex())
+
+ def on_text_changed(text, no_updaate_ui=False, le=commitment_le, _row_num=row_num):
+ self.nfts_to_mint[_row_num]["last_text_seen"] = text
+ color = ColorScheme.DEFAULT
+ valid, new_commitment = self.is_commitment_valid(text)
+ if valid:
+ self.nfts_to_mint[_row_num]["commitment"] = new_commitment
+ else:
+ color = ColorScheme.RED
+ self.nfts_to_mint[_row_num]["commitment"] = None # Indicate that we have an error
+ le.setStyleSheet(color.as_stylesheet())
+ if not no_updaate_ui:
+ self.on_ui_state_changed()
+
+ on_text_changed(commitment_le.text(), False) # Call once to properly set color
+
+ commitment_le.textChanged.connect(on_text_changed)
+ hbox.addWidget(commitment_le)
+ tw.setItemWidget(item, self.ColsMint.commitment, w)
+ self.allow_transparent_background(w)
+
+ # Capability field
+ w = QtWidgets.QWidget()
+ w.setToolTip(item.toolTip(self.ColsMint.capability))
+ hbox = QtWidgets.QHBoxLayout(w)
+ self._set_field_margins(hbox, first_row)
+ capability_cb = QtWidgets.QComboBox()
+ capability_cb.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+ capability_cb.addItems([_('Immutable'), _('Mutable'), _('Minting')])
+ capability_cb.setItemIcon(1, self.icon_mutable)
+ capability_cb.setItemIcon(2, self.icon_baton)
+ capability_cb.setToolTip(_("Capability of the newly-minted NFT"))
+ if capability == token.Capability.Minting:
+ capability_cb.setCurrentIndex(2)
+ elif capability == token.Capability.Mutable:
+ capability_cb.setCurrentIndex(1)
+ else:
+ capability_cb.setCurrentIndex(0)
+
+ def on_capability_change(index, _row_num=row_num):
+ assert index in (0, 1, 2)
+ if index == 0:
+ cap = token.Capability.NoCapability
+ elif index == 1:
+ cap = token.Capability.Mutable
+ else:
+ cap = token.Capability.Minting
+ self.nfts_to_mint[_row_num]["capability"] = cap
+ capability_cb.currentIndexChanged.connect(on_capability_change)
+ hbox.addWidget(capability_cb)
+ tw.setItemWidget(item, self.ColsMint.capability, w)
+ self.allow_transparent_background(w)
+
+ # Multiplier field
+ w = QtWidgets.QWidget()
+ w.setToolTip(item.toolTip(self.ColsMint.multiplier))
+ hbox = QtWidgets.QHBoxLayout(w)
+ self._set_field_margins(hbox, first_row, last_column=True)
+ multiplier_sb = QtWidgets.QSpinBox()
+ multiplier_sb.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+ multiplier_sb.setMinimum(1)
+ multiplier_sb.setMaximum(1000)
+ multiplier_sb.setSuffix(" " + _("copies"))
+ multiplier_sb.setSpecialValueText(_("Single"))
+ multiplier_sb.setValue(copies)
+ multiplier_sb.setToolTip(_("Number of identical copies of this NFT to mint"))
+
+ def on_multiplier_change(value, _row_num=row_num):
+ self.nfts_to_mint[_row_num]["copies"] = value
+ multiplier_sb.valueChanged.connect(on_multiplier_change)
+ hbox.addWidget(multiplier_sb)
+ delete_button = QtWidgets.QToolButton()
+ delete_button.setIcon(self.icon_trash)
+ delete_button.setToolTip(_("Remove this NFT from the list"))
+
+ def on_button_click(_, _row_num=row_num):
+ self.remove_nft_to_mint(_row_num)
+ delete_button.clicked.connect(on_button_click)
+ hbox.addWidget(delete_button)
+
+ hbox.addStretch(10)
+
+ tw.setItemWidget(item, self.ColsMint.multiplier, w)
+ self.allow_transparent_background(w)
+ first_row = False
+ row_num += 1
+ else: # form_mode edit or send
+ def add_leaf_item(parent: QtWidgets.QTreeWidgetItem, tid, name, first=False) -> QtWidgets.QTreeWidgetItem:
+ utxo = self.get_utxo(name)
+ td = utxo['token_data']
+ assert isinstance(td, token.OutputData)
+ commitment = td.commitment
+ commitment_display_str = commitment.hex() if self.form_mode != self.FormMode.edit else ""
+ item = QtWidgets.QTreeWidgetItem(["", "", commitment_display_str, token.get_nft_flag_text(td)])
+ item.setData(0, self.DataRoles.token_id, tid)
+ item.setData(0, self.DataRoles.output_point, name)
+ self._set_category_col(item, tid, self.ColsNFT.category)
+ if self.form_mode == self.FormMode.send:
+ item.setToolTip(self.ColsNFT.selected, _("Check to send this NFT"))
+ item.setToolTip(self.ColsNFT.commitment, commitment.hex()
+ if commitment.hex() else _("zero-length commitment"))
+ elif self.form_mode == self.FormMode.edit:
+ item.setToolTip(self.ColsNFT.selected, _("Check to edit this NFT"))
+ max_chars = token.MAX_CONSENSUS_COMMITMENT_LENGTH * 2
+ item.setToolTip(self.ColsNFT.commitment,
+ _("Enter an even number of up to {max_chars} hexadecimal characters")
+ .format(max_chars=max_chars))
+ item.setFlags((item.flags() | QtCore.Qt.ItemIsUserCheckable) & ~QtCore.Qt.ItemIsSelectable)
+ if td.is_minting_nft():
+ item.setIcon(self.ColsNFT.flags, self.icon_baton)
+ elif td.is_mutable_nft():
+ item.setIcon(self.ColsNFT.flags, self.icon_mutable)
+ parent.addChild(item)
+ item.setCheckState(self.ColsNFT.selected,
+ QtCore.Qt.Checked) # Need to call this at least once to make checkbox appear
+ if name not in self.token_nfts_selected.get(tid, set()):
+ item.setCheckState(self.ColsNFT.selected, QtCore.Qt.Unchecked)
+
+ if self.form_mode == self.FormMode.edit:
+ w = QtWidgets.QWidget()
+ w.setToolTip(item.toolTip(self.ColsNFT.commitment))
+ hbox = QtWidgets.QHBoxLayout(w)
+ self._set_field_margins(hbox, first)
+ le = QtWidgets.QLineEdit()
+ le.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+ le.setObjectName("le_" + name) # so we can find it later
+ le.setText(commitment.hex())
+
+ def on_commitment_changed(text, _item=item, _le=le, _commitment=commitment, _name=name):
+ color = ColorScheme.DEFAULT
+ valid, new_commitment = self.is_commitment_valid(text)
+ if valid:
+ if text == _commitment.hex():
+ _item.setCheckState(self.ColsNFT.selected, QtCore.Qt.Unchecked)
+ self.nfts_to_edit.pop(_name, None)
+ else:
+ color = ColorScheme.BLUE
+ _item.setCheckState(self.ColsNFT.selected, QtCore.Qt.Checked)
+ self.nfts_to_edit[_name] = new_commitment
+ else:
+ color = ColorScheme.RED
+ _item.setCheckState(self.ColsNFT.selected, QtCore.Qt.Unchecked)
+ self.nfts_to_edit[_name] = None # Indicate that we have an error
+ _le.setStyleSheet(color.as_stylesheet())
+ self.on_ui_state_changed()
+
+ le.textChanged.connect(on_commitment_changed)
+ hbox.addWidget(le)
+
+ def on_reset(b, commitment_hex=commitment.hex(), _le=le):
+ is_same = _le.text() == commitment_hex
+ if is_same:
+ # If same, above slot won't fire when calling setText(), so we force it to fire
+ on_commitment_changed(commitment_hex)
+ else:
+ # Otherwise modify text and slot fires
+ _le.setText(commitment_hex)
+
+ but = QtWidgets.QToolButton()
+ but.clicked.connect(on_reset)
+ but.setText(_("Reset"))
+ but.setObjectName("reset_" + name)
+ but.setToolTip("Reset to original commitment")
+ hbox.addWidget(but)
+ tw.setItemWidget(item, self.ColsNFT.commitment, w)
+ self.allow_transparent_background(w)
+
+ return item
+
+ for tid, names in self.token_nfts.items():
+ if not names:
+ # Defensive programming: should never happen
+ continue
+ if len(names) == 1:
+ # This group has only 1 item, push to top-level and don't build a sub-item
+ item = add_leaf_item(tw.invisibleRootItem(), tid, names[0], first_row)
+ # Subscribe to counts label updates
+ item.setData(0, self.DataRoles.receives_nft_count_updates, True)
+ continue
+ # This group has more than 1 item, build a subgrouping
+ parent = QtWidgets.QTreeWidgetItem(["", "", "", ""])
+ self._set_category_col(parent, tid, self.ColsNFT.category)
+ parent.setFlags((parent.flags() | QtCore.Qt.ItemIsAutoTristate | QtCore.Qt.ItemIsUserCheckable)
+ & ~QtCore.Qt.ItemIsSelectable)
+ parent.setData(0, self.DataRoles.token_id, tid)
+ # Subscribe to update of counts label
+ parent.setData(0, self.DataRoles.receives_nft_count_updates, True)
+ # Subscribe to updates of Flags label
+ parent.setData(0, self.DataRoles.receives_nft_flag_updates, True)
+ parent.setCheckState(0, QtCore.Qt.Checked) # Needs to be called once to make checkbox appear
+ nfts_selected = self.token_nfts_selected.get(tid, set())
+ nchkd = len(nfts_selected)
+ ntot = len(names)
+ if nchkd == 0:
+ parent.setCheckState(0, QtCore.Qt.Unchecked)
+ elif nchkd < ntot:
+ parent.setCheckState(0, QtCore.Qt.PartiallyChecked)
+ tw.addTopLevelItem(parent)
+ for name in names:
+ add_leaf_item(parent, tid, name, first_row)
+ first_row = False
+
+ if self.form_mode == self.FormMode.edit:
+ # After above is built, do a 1-pass to re-set the counts for items receiving count updates,
+ # so that the UI starts off with the right counts. This is necessary in "edit" mode only;
+ # "send" mode has the "fungibles" box firing a re-count as it builds itself, thereby implicitly
+ # causing the below update_tokens_to_send_nft_count(tid) to run for each `tid`.
+ for tid in self.token_nfts.keys():
+ self.update_tokens_to_send_nft_count(tid)
+
+ if tw.topLevelItemCount() == 1:
+ # Auto-expand if only 1 item
+ item = tw.topLevelItem(0)
+ if item.childCount() > 0:
+ item.setExpanded(True)
+
+ # In send mode, if we have no NFTs, hide this widget completely
+ if self.form_mode == self.FormMode.send:
+ self.gb_nft.setHidden(not self.have_nfts())
+
+ def diagnostic_name(self):
+ dn = super().diagnostic_name()
+ w = getattr(self, 'wallet', None)
+ wn = ("/" + w.diagnostic_name()) if w else ""
+ return f'{dn}{wn}'
+
+ @staticmethod
+ def get_outpoint_longname(utxo) -> str:
+ return f"{utxo['prevout_hash']}:{utxo['prevout_n']}"
+
+ def get_utxo(self, name: str) -> Optional[dict]:
+ return self.utxos_by_name.get(name)
+
+ def clear_form(self):
+ """Bring this form back to the initial state, clear text fields, etc"""
+ self.tw_nft.itemChanged.disconnect(self.on_nft_item_changed) # Need to disable this signal temporarily
+ for tid in list(self.token_fungible_to_spend):
+ self.token_fungible_to_spend[tid] = 0
+ for tid in list(self.token_nfts_selected):
+ self.token_nfts_selected[tid].clear()
+ self.nfts_to_mint.clear()
+ self.rebuild_output_tokens_treewidget()
+ self.rebuild_input_tokens_treewidget()
+ self.cb_max.setChecked(False)
+ self.fee_slider.setValue(0)
+ self.amount_e.clear()
+ if self.form_mode == self.FormMode.send:
+ self.te_payto.clear()
+ self.te_desc.clear()
+ self.tw_nft.itemChanged.connect(self.on_nft_item_changed)
+ self.on_ui_state_changed()
+
+ def check_sanity(self) -> bool:
+ sane = True
+ ft_total = sum(amt for amt in self.token_fungible_to_spend.values())
+ num_nfts = sum(len(s) for s in self.token_nfts_selected.values())
+ if max(ft_total, 0) + num_nfts + len(self.nfts_to_mint) <= 0:
+ # No tokens specified!
+ sane = False
+ elif not address.Address.is_valid(self.te_payto.toPlainText().strip()):
+ # Bad address
+ sane = False
+ if sane and self.form_mode == self.FormMode.edit:
+ # Checks for edit mode only
+ if any(c is None for c in self.nfts_to_edit.values()):
+ # Bad NFT commitment specified
+ sane = False
+ else:
+ # Ensure that at least one modified selection exists
+ modct = 0
+ for s in self.token_nfts_selected.values():
+ if modct:
+ break
+ for name in s:
+ if modct:
+ break
+ utxo = self.get_utxo(name)
+ td = utxo['token_data']
+ new_commitment = self.nfts_to_edit.get(name)
+ modct += new_commitment is not None and td.commitment != new_commitment
+ if not modct:
+ # No modified selections exist, bail
+ sane = False
+ if sane and self.form_mode == self.FormMode.mint:
+ # Checks for mint mode only
+ # Must have specified minting of at least 1 thing, and no NFT commitments that are malformed can exist
+ sane = len(self.nfts_to_mint) and all(d.get("commitment") is not None for d in self.nfts_to_mint)
+ return sane
+
+ def _estimate_max_amount(self):
+ spec = self.make_token_send_spec(dummy=True)
+ try:
+ tx = self.wallet.make_token_send_tx(self.parent.config, spec)
+ except Exception as e:
+ self.print_error("_estimate_max_amount:", repr(e))
+ return None
+ dust_regular = wallet.dust_threshold(self.wallet.network)
+ dust_token = token.heuristic_dust_limit_for_token_bearing_output()
+ # Consider all non-token non-dust utxos as potentially contributing to max_amount
+ max_in = sum(x['value'] for x in spec.non_token_utxos.values() if x['value'] >= dust_regular)
+ # Quirk: We don't choose token utxos for contributing to BCH amount unless the token was selected for
+ # sending by the user in the UI. So only consider BCH amounts > 800 sats for tokens chosen for this tx
+ # by the user's NFT/FT selections in the UI.
+ max_in += sum(x['value'] - dust_token for x in tx.inputs() if x['token_data'] and x['value'] > dust_token)
+
+ val_out_minus_change = 0
+ for (_, addr, val), td in tx.outputs(tokens=True):
+ if td or addr != spec.change_addr:
+ val_out_minus_change += val
+ bytes = tx.serialize_bytes(estimate_size=True)
+ max_amount = max(0, max_in - val_out_minus_change - int(math.ceil(len(bytes)/1000 * spec.feerate)))
+ return max_amount
+
+ def on_ui_state_changed(self):
+ if not self.fully_constructed:
+ return
+ sane = self.check_sanity()
+ self.but_preview_tx.setEnabled(sane)
+
+ # Manage amt color state
+ amt_color = ColorScheme.DEFAULT
+ if self.cb_max.isChecked():
+ amt = self._estimate_max_amount()
+ self.amount_e.setAmount(amt or 0)
+ else:
+ amt = self.amount_e.get_amount()
+ if amt is not None:
+ max_amt = self._estimate_max_amount()
+ if max_amt is not None and amt > max_amt:
+ amt_color = ColorScheme.RED
+ self.amount_e.setStyleSheet(amt_color.as_stylesheet())
+
+ # Manage address color state
+ addr_color = ColorScheme.DEFAULT
+ msg = ""
+ if sane:
+ addr_str = self.te_payto.toPlainText().strip()
+ if address.Address.is_token(addr_str):
+ addr_color = ColorScheme.GREEN
+ else:
+ addr_color = ColorScheme.YELLOW
+ msg = _("Not a CashToken-aware address")
+ self.te_payto.setStyleSheet(addr_color.as_stylesheet())
+ self.lbl_status_msg.setText(msg)
+ self.lbl_status_msg.setStyleSheet(addr_color.as_stylesheet() if msg else ColorScheme.DEFAULT.as_stylesheet())
+
+ def make_token_send_spec(self, dummy=False) -> wallet.TokenSendSpec:
+ spec = wallet.TokenSendSpec()
+ if dummy:
+ spec.payto_addr = self.wallet.dummy_address()
+ else:
+ spec.payto_addr = address.Address.from_string(self.te_payto.text().strip())
+ spec.change_addr = self.wallet.get_unused_address(for_change=True, frozen_ok=False)
+ spec.feerate = self.fee_rate
+ if dummy:
+ spec.send_satoshis = wallet.dust_threshold(self.wallet.network)
+ else:
+ spec.send_satoshis = self.amount_e.get_amount() or 0
+ spec.token_utxos = copy.deepcopy(self.utxos_by_name)
+ spec.non_token_utxos = {self.get_outpoint_longname(x): x
+ for x in self.wallet.get_spendable_coins(None, self.parent.config)}
+ spec.send_fungible_amounts = {tid: amt for tid, amt in self.token_fungible_to_spend.items()}
+
+ # Gather tx inputs
+ spec.send_nfts = set()
+ if self.form_mode == self.FormMode.mint:
+ for i, nft_mint_row in enumerate(self.nfts_to_mint):
+ if nft_mint_row["commitment"] is None:
+ # Defensive programming: This should never happen
+ self.print_error(f"BUG: commitment for nft_mint_row {i} was None")
+ continue
+ spec.send_nfts.add(nft_mint_row["baton_name"])
+ else:
+ for tid, utxo_name_set in self.token_nfts_selected.items():
+ if self.form_mode == self.FormMode.send:
+ spec.send_nfts |= utxo_name_set
+ else:
+ # In edit mode, only pick up NFTs that changed
+ for utxo_name in utxo_name_set:
+ new_commitment = self.nfts_to_edit.get(utxo_name)
+ commitment = self.utxos_by_name[utxo_name]['token_data'].commitment
+ if new_commitment is not None and new_commitment != commitment:
+ spec.send_nfts.add(utxo_name)
+ spec.edit_nfts[utxo_name] = new_commitment
+
+ # In edit or mint mode, avoid splitting NFTs with amounts on them when editing/minting them, by specifying
+ # that the fungible amount should be "sent"
+ if self.form_mode in (self.FormMode.edit, self.FormMode.mint):
+ iterable = spec.edit_nfts if self.form_mode == self.FormMode.edit else spec.send_nfts
+ for utxo_name in iterable:
+ utxo = spec.get_utxo(utxo_name)
+ td = utxo['token_data']
+ spec.send_fungible_amounts[td.id_hex] = td.amount + spec.send_fungible_amounts.get(td.id_hex, 0)
+
+ # 'dummy' mode only: Try and fill in at least 1 nft or fungible amount
+ if dummy and not spec.send_nfts and sum(spec.send_fungible_amounts.values()) <= 0:
+ for name, utxo in spec.token_utxos.items():
+ td = utxo['token_data']
+ if td.has_nft():
+ spec.send_nfts.add(name)
+ break
+ elif td.amount:
+ spec.send_fungible_amounts[td.id_hex] = td.amount
+ break
+
+ # Determine outputs for minting tx
+ if self.form_mode == self.FormMode.mint:
+ for i, nft_mint_row in enumerate(self.nfts_to_mint):
+ copies = nft_mint_row["copies"]
+ baton_name = nft_mint_row["baton_name"]
+ capability = nft_mint_row["capability"]
+ commitment = nft_mint_row["commitment"]
+ if baton_name not in spec.send_nfts:
+ # Defensive programming: This should never happen
+ self.print_error(f"BUG: commitment for nft_mint_row {i} not in spec.send_nfts")
+ continue
+ for _ in range(copies):
+ l = spec.mint_nfts.get(baton_name, list())
+ l.append((capability, commitment))
+ if len(l) == 1:
+ # Was missing, ensure exists in dict
+ spec.mint_nfts[baton_name] = l
+
+ return spec
+
+ def on_preview_tx(self):
+ # First, we must make sure that any amount line-edits have lost focus, so we can be 100% sure
+ # "textEdited" signals propagate and what the user sees on-screen is what ends-up in the txn
+ w = self.focusWidget()
+ if w:
+ w.clearFocus()
+ # Check sanity just in case the above caused us to no longer be "sane"
+ if not self.check_sanity():
+ self.print_error("Spurious click of 'preview tx', returning early")
+ return
+ spec = self.make_token_send_spec()
+ try:
+ tx = self.wallet.make_token_send_tx(self.parent.config, spec)
+ if tx:
+ self.parent.show_transaction(tx, tx_desc=self.te_desc.toPlainText().strip() or None,
+ broadcast_callback=self.broadcast_callback)
+ else:
+ self.show_error("Unimplemented")
+ except wallet.NotEnoughFunds as e:
+ self.show_error(str(e) or _("Not enough funds"))
+ except wallet.ExcessiveFee as e:
+ self.show_error(str(e) or _("Excessive fee"))
+ except wallet.TokensBurnedError as e:
+ self.show_error(str(e) or _("Internal Error: Transaction generation yielded a transaction in which"
+ " some tokens are being burned; refusing to proceed. Please report this"
+ " situation to the developers."))
diff --git a/electroncash_gui/qt/transaction_dialog.py b/electroncash_gui/qt/transaction_dialog.py
new file mode 100644
index 000000000000..a0db9e501a15
--- /dev/null
+++ b/electroncash_gui/qt/transaction_dialog.py
@@ -0,0 +1,1036 @@
+#!/usr/bin/env python3
+#
+# Electrum - lightweight Bitcoin client
+# Copyright (C) 2012 thomasv@gitorious
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+import copy
+import datetime
+import json
+import time
+
+from enum import Enum, auto
+from typing import Optional
+
+from PyQt5.QtCore import *
+from PyQt5.QtGui import *
+from PyQt5.QtWidgets import *
+
+from electroncash import cashacct, token, web
+
+from electroncash.address import Address, PublicKey, ScriptOutput
+from electroncash.bitcoin import base_encode
+from electroncash.i18n import _, ngettext
+from electroncash.plugins import run_hook
+from electroncash.transaction import InputValueMissing
+
+from electroncash.util import bfh, Weak, PrintError
+from .util import *
+
+dialogs = [] # Otherwise python randomly garbage collects the dialogs...
+
+if False:
+ # NB: on Qt for Windows the 'ⓢ' symbol looks aliased and bad. So we do this
+ # for windows.
+ SCHNORR_SIGIL = "(S)"
+else:
+ # On Linux & macOS it looks fine so we go with the more fancy unicode
+ SCHNORR_SIGIL = "ⓢ"
+
+def show_transaction(tx, parent, desc=None, prompt_if_unsaved=False, *, broadcast_callback=None):
+ d = TxDialog(tx, parent, desc, prompt_if_unsaved, broadcast_callback=broadcast_callback)
+ dialogs.append(d)
+ d.show()
+ return d
+
+class TxDialog(QDialog, MessageBoxMixin, PrintError):
+
+ throttled_update_sig = pyqtSignal() # connected to self.throttled_update -- emit from thread to do update in main thread
+ dl_done_sig = pyqtSignal() # connected to an inner function to get a callback in main thread upon dl completion
+
+ BROADCAST_COOLDOWN_SECS = 5.0
+
+ class FreezeOp(Enum):
+ Freeze = auto()
+ Unfreeze = auto()
+
+ def __init__(self, tx, parent, desc, prompt_if_unsaved, *, broadcast_callback=None):
+ '''Transactions in the wallet will show their description.
+ Pass desc to give a description for txs not yet in the wallet.
+ '''
+ # We want to be a top-level window
+ QDialog.__init__(self, parent=None)
+ # Take a copy; it might get updated in the main window by
+ # e.g. the FX plugin. If this happens during or after a long
+ # sign operation the signatures are lost.
+ self.tx = copy.deepcopy(tx)
+ self.tx.deserialize()
+ self.main_window = parent
+ self.token_meta = self.main_window.token_meta
+ self.wallet = parent.wallet
+ self.prompt_if_unsaved = prompt_if_unsaved
+ self.saved = False
+ self.desc = desc
+ self.cashaddr_signal_slots = []
+ self._dl_pct = None
+ self._closed = False
+ self.tx_hash = self.tx.txid_fast() if self.tx.raw and self.tx.is_complete() else None
+ self.tx_height = self.wallet.get_tx_height(self.tx_hash)[0] or None
+ self.block_hash = None
+ self.extra_broadcast_callback = broadcast_callback
+ Weak.finalization_print_error(self) # track object lifecycle
+
+ self.setMinimumWidth(750)
+ self.setWindowTitle(_("Transaction"))
+
+ vbox = QVBoxLayout()
+ self.setLayout(vbox)
+
+ self.tx_hash_e = ButtonsLineEdit()
+ l = QLabel(_("&Transaction ID:"))
+ l.setBuddy(self.tx_hash_e)
+ vbox.addWidget(l)
+ self.tx_hash_e.addCopyButton()
+ weakSelfRef = Weak.ref(self)
+ qr_show = lambda: weakSelfRef() and weakSelfRef().main_window.show_qrcode(str(weakSelfRef().tx_hash_e.text()), _("Transaction ID"), parent=weakSelfRef())
+ icon = ":icons/qrcode_white.svg" if ColorScheme.dark_scheme else ":icons/qrcode.svg"
+ self.tx_hash_e.addButton(icon, qr_show, _("Show as QR code"))
+ self.tx_hash_e.setReadOnly(True)
+ vbox.addWidget(self.tx_hash_e)
+ self.tx_desc = QLabel()
+ vbox.addWidget(self.tx_desc)
+ self.status_label = QLabel()
+ vbox.addWidget(self.status_label)
+ self.date_label = QLabel()
+ vbox.addWidget(self.date_label)
+ self.amount_label = QLabel()
+ vbox.addWidget(self.amount_label)
+ self.size_label = QLabel()
+ vbox.addWidget(self.size_label)
+ self.fee_label = QLabel()
+ vbox.addWidget(self.fee_label)
+
+ for l in (self.tx_desc, self.status_label, self.date_label, self.amount_label, self.size_label, self.fee_label):
+ # make these labels selectable by mouse in case user wants to copy-paste things in tx dialog
+ l.setTextInteractionFlags(l.textInteractionFlags() | Qt.TextSelectableByMouse)
+
+ def open_be_url(link):
+ if link:
+ try:
+ kind, thing = link.split(':')
+ url = web.BE_URL(self.main_window.config, kind, thing)
+ except:
+ url = None
+ if url:
+ webopen( url )
+ else:
+ self.show_error(_('Unable to open in block explorer. Please be sure your block explorer is configured correctly in preferences.'))
+
+ self.status_label.linkActivated.connect(open_be_url)
+
+ self.add_io(vbox)
+
+ self.freeze_button = b = QPushButton(self._make_freeze_button_text())
+ b.setToolTip(_("Lock/unlock the coin(s) being spent in this transaction.\n\n"
+ "Use this facility if you wish to broadcast this transaction later,\n"
+ "in order to prevent its inputs from being accidentally spent."))
+ b.clicked.connect(self.do_freeze_unfreeze)
+
+ self.sign_button = b = QPushButton(_("&Sign"))
+ b.clicked.connect(self.sign)
+ b.setToolTip(_("Sign the transaction"))
+
+ self.broadcast_button = b = QPushButton(_("&Broadcast"))
+ b.clicked.connect(self.do_broadcast)
+ b.setToolTip(_("Submit the transaction to the blockchain"))
+ self.last_broadcast_time = 0
+
+ self.save_button = b = QPushButton(_("S&ave"))
+ b.setToolTip(_("Save the transaction to a file"))
+ b.clicked.connect(self.save)
+
+ self.cancel_button = b = CloseButton(self)
+
+ self.qr_button = b = QPushButton()
+ b.setToolTip(_("Show transaction QR code"))
+ b.setIcon(QIcon(icon))
+ b.clicked.connect(self.show_qr)
+ b.setShortcut(QKeySequence(Qt.ALT + Qt.Key_Q))
+
+ self.copy_button = b = CopyButton(lambda: str(weakSelfRef() and weakSelfRef().tx),
+ callback=lambda: weakSelfRef() and weakSelfRef().show_message(
+ _("Transaction raw hex copied to clipboard.")))
+ b.setToolTip(_("Copy transaction raw hex to the clipboard"))
+
+
+ # Action buttons
+ self.buttons = [self.freeze_button, self.sign_button, self.broadcast_button, self.cancel_button]
+ # Transaction sharing buttons
+ self.sharing_buttons = [self.copy_button, self.qr_button, self.save_button]
+
+ run_hook('transaction_dialog', self)
+
+ hbox = QHBoxLayout()
+ hbox.addLayout(Buttons(*self.sharing_buttons))
+ hbox.addStretch(1)
+ hbox.addLayout(Buttons(*self.buttons))
+ vbox.addLayout(hbox)
+
+ if self.tx_height:
+ # this avoids downloading the block_height info if we already have it.
+ self.tx.ephemeral['block_height'] = self.tx_height
+
+ self.throttled_update_sig.connect(self.throttled_update, Qt.QueuedConnection)
+ self.initiate_fetch_input_data(True)
+
+ self.update()
+
+ # connect slots so we update in realtime as blocks come in, etc
+ parent.history_updated_signal.connect(self.update_tx_if_in_wallet)
+ parent.labels_updated_signal.connect(self.update_tx_if_in_wallet)
+ parent.network_signal.connect(self.got_verified_tx)
+ parent.gui_object.token_metadata_updated_signal.connect(self.on_token_metadata_updated)
+
+ def on_token_metadata_updated(self, tid: str):
+ self.update()
+
+ @classmethod
+ def _make_freeze_button_text(cls, op: FreezeOp = FreezeOp.Freeze, num_coins: int = 0) -> str:
+ if op == cls.FreezeOp.Freeze:
+ return ngettext("&Freeze Coin", "&Freeze Coins", num_coins)
+ elif op == cls.FreezeOp.Unfreeze:
+ return ngettext("&Unfreeze Coin", "&Unfreeze Coins", num_coins)
+ raise ValueError(f"Invalid op: {op!r}")
+
+ def initiate_fetch_input_data(self, force):
+ weakSelfRef = Weak.ref(self)
+ def dl_prog(pct):
+ slf = weakSelfRef()
+ if slf:
+ slf._dl_pct = pct
+ slf.throttled_update_sig.emit()
+ def dl_done():
+ slf = weakSelfRef()
+ if slf:
+ slf._dl_pct = None
+ slf.throttled_update_sig.emit()
+ slf.dl_done_sig.emit()
+ dl_retries = 0
+ def dl_done_mainthread():
+ nonlocal dl_retries
+ slf = weakSelfRef()
+ if slf:
+ if slf._closed:
+ return
+ dl_retries += 1
+ fee = slf.try_calculate_fee()
+ if fee is None and dl_retries < 2:
+ if not self.is_fetch_input_data():
+ slf.print_error("input fetch incomplete; network use is disabled in GUI")
+ return
+ # retry at most once -- in case a slow server scrwed us up
+ slf.print_error("input fetch appears incomplete; retrying download once ...")
+ slf.tx.fetch_input_data(self.wallet, done_callback=dl_done, prog_callback=dl_prog, force=True, use_network=self.is_fetch_input_data()) # in this case we reallly do force
+ elif fee is not None:
+ slf.print_error("input fetch success")
+ else:
+ slf.print_error("input fetch failed")
+ try: self.dl_done_sig.disconnect() # disconnect previous
+ except TypeError: pass
+ self.dl_done_sig.connect(dl_done_mainthread, Qt.QueuedConnection)
+ self.tx.fetch_input_data(self.wallet, done_callback=dl_done, prog_callback=dl_prog, force=force, use_network=self.is_fetch_input_data())
+
+ def got_verified_tx(self, event, args):
+ if ( (event == 'verified2' and args[1] == self.tx_hash)
+ or (event == 'ca_verified_tx' and args[1].txid == self.tx_hash) ):
+ self.update()
+
+ def update_tx_if_in_wallet(self):
+ if self.tx.txid() in self.wallet.transactions:
+ self.update()
+
+ def do_broadcast(self):
+ def broadcast_done(success):
+ if success:
+ # 5 second cooldown period on broadcast_button after successful
+ # broadcast
+ self.last_broadcast_time = time.time()
+ # disables the broadcast button if last_broadcast_time is < BROADCAST_COOLDOWN_SECS seconds ago
+ self.update()
+ # broadcast button will re-enable if we got nothing from server and >= BROADCAST_COOLDOWN_SECS elapsed
+ QTimer.singleShot(int(self.BROADCAST_COOLDOWN_SECS * 1e3 + 100), self.update)
+ if self.extra_broadcast_callback is not None:
+ # extra_broadcast_callback may have signature: foo(success, tx) or foo(success) -- decide which
+ import inspect
+ params = inspect.signature(self.extra_broadcast_callback).parameters
+ n_non_default_args = sum(p.default is p.empty for name, p in params.items())
+ args = [success]
+ if n_non_default_args > 1:
+ # Accepts at least 2 args
+ args += [self.tx]
+ if n_non_default_args > 2:
+ # Accepts at least 3 args
+ args += [self]
+ self.extra_broadcast_callback(*args)
+
+ self.main_window.push_top_level_window(self)
+ try:
+ self.main_window.broadcast_transaction(self.tx, self.desc, callback=broadcast_done)
+ finally:
+ self.main_window.pop_top_level_window(self)
+ self.saved = True
+ self.update()
+
+ def do_freeze_unfreeze(self):
+ coins = getattr(self.freeze_button, "_coins", [])
+ op = getattr(self.freeze_button, "_op", None)
+ if not coins or op is None:
+ return
+ freeze = op == self.FreezeOp.Freeze
+ # Freeze / Unfreeze
+ self.wallet.set_frozen_coin_state(coins, freeze)
+ delattr(self.freeze_button, "_coins")
+ delattr(self.freeze_button, "_op")
+ self.update()
+ self.main_window.update_tabs()
+ if freeze:
+ # Freeze op success message
+ self.show_message(ngettext("{count} coin has been frozen.",
+ "{count} coins have been frozen.", len(coins)).format(count=len(coins))
+ + "\n" + _("Check the Coins tab to unfreeze."))
+ else:
+ # Unfreeze op success message
+ self.show_message(ngettext("{count} coin has been unfrozen.",
+ "{count} coins have been unfrozen.", len(coins)).format(count=len(coins)))
+
+ def closeEvent(self, event):
+ if (self.prompt_if_unsaved and not self.saved
+ and not self.question(_('This transaction is not saved. Close anyway?'), title=_("Warning"))):
+ event.ignore()
+ else:
+ super().closeEvent(event)
+ event.accept()
+ if self._closed:
+ return
+ self._closed = True
+ self.tx.fetch_cancel()
+ parent = self.main_window
+ if parent:
+ # clean up connections so window gets gc'd
+ try: parent.history_updated_signal.disconnect(self.update_tx_if_in_wallet)
+ except TypeError: pass
+ try: parent.network_signal.disconnect(self.got_verified_tx)
+ except TypeError: pass
+ try: parent.labels_updated_signal.disconnect(self.update_tx_if_in_wallet)
+ except TypeError: pass
+ try: parent.gui_object.token_metadata_updated_signal.disconnect(self.on_token_metadata_updated)
+ except TypeError: pass
+ for slot in self.cashaddr_signal_slots:
+ try: parent.gui_object.cashaddr_toggled_signal.disconnect(slot)
+ except TypeError: pass
+ self.cashaddr_signal_slots = []
+
+ cls = self.__class__
+ cls._pyqt_bug_gc_workaround = self # <--- keep this object alive in PyQt until at least after this
+ # event handler completes. This is because on some platforms
+ # Python deletes the C++ object right away inside this event
+ # handler (QObject with no parent) -- which crashes Qt!
+ def clr_workaround():
+ cls._pyqt_bug_gc_workaround = None
+ QTimer.singleShot(0, clr_workaround)
+
+ try:
+ dialogs.remove(self)
+ except ValueError: # wasn't in list
+ pass
+ while True:
+ try:
+ # Esoteric bug happens when user rejects password dialog on top of this window.. so we must keep popping self off the top_level_windows
+ self.main_window.pop_top_level_window(self, raise_if_missing=True)
+ except ValueError:
+ break
+ # The below is used to clean up any modal dialogs this txdialog may have up
+ tlw = self.top_level_window()
+ while tlw is not self:
+ tlw.reject()
+ tlw = self.top_level_window()
+
+ def reject(self):
+ # Override escape-key to close normally (and invoke closeEvent)
+ self.close()
+
+ def show_qr(self):
+ text = bfh(str(self.tx))
+ text = base_encode(text, base=43)
+ try:
+ self.main_window.show_qrcode(text, _('Transaction'), parent=self)
+ except Exception as e:
+ self.show_message(str(e))
+
+ def sign(self):
+ def cleanup():
+ self.main_window.pop_top_level_window(self)
+
+ def sign_done(success):
+ if success:
+ self.sign_button.setDisabled(True)
+ self.prompt_if_unsaved = True
+ self.saved = False
+ self.update()
+ cleanup()
+
+ self.main_window.push_top_level_window(self)
+ self.main_window.sign_tx(self.tx, sign_done, on_pw_cancel=cleanup)
+
+ def save(self):
+ name = 'signed_%s.txn' % (self.tx.txid()[0:8]) if self.tx.is_complete() else 'unsigned.txn'
+ fileName = self.main_window.getSaveFileName(_("Select where to save your signed transaction"), name, "*.txn")
+ if fileName:
+ tx_dict = self.tx.as_dict()
+ with open(fileName, "w+", encoding='utf-8') as f:
+ f.write(json.dumps(tx_dict, indent=4) + '\n')
+ self.show_message(_("Transaction saved successfully"))
+ self.saved = True
+
+ @rate_limited(0.5, ts_after=True)
+ def throttled_update(self):
+ if not self._closed:
+ self.update()
+
+ def try_calculate_fee(self):
+ ''' Try and compute fee by summing all the input values and subtracting
+ the output values. We don't always have 'value' in all the inputs,
+ so in that case None will be returned. '''
+ fee = None
+ try:
+ fee = self.tx.get_fee()
+ except InputValueMissing:
+ ''' 'value' key missing or bad from an input '''
+ return fee
+
+ def update(self):
+ if self._closed:
+ # latent timer fire
+ return
+ desc = self.desc
+ base_unit = self.main_window.base_unit()
+ format_amount = self.main_window.format_amount
+ delta2, info3 = self.wallet.get_tx_extended_info(self.tx, ver=3)
+ spends_coins_mine = delta2.spends_coins_mine
+ (tx_hash, status, label, can_broadcast, amount, fee, height, conf, timestamp, exp_n, status_enum,
+ input_token_data) = info3
+ for i, txin in enumerate(self.tx.inputs()):
+ if 'token_data' not in txin:
+ txin['token_data'] = input_token_data[i]
+ self.tx_height = height or self.tx.ephemeral.get('block_height') or None
+ self.tx_hash = tx_hash
+ desc = label or desc
+ size = self.tx.estimated_size()
+
+ # Update freeze/unfreeze button depending on tx state
+ StatusEnum = self.wallet.StatusEnum
+ if spends_coins_mine:
+ has_frozen = bool(self.wallet.is_frozen_coin(set(spends_coins_mine)))
+ self.freeze_button._coins = spends_coins_mine
+ self.freeze_button._op = op = self.FreezeOp.Freeze if not has_frozen else self.FreezeOp.Unfreeze
+ # Set the proper text (plural / singular form)
+ self.freeze_button.setText(self._make_freeze_button_text(op, len(spends_coins_mine)))
+ # Freeze/Unfreeze enabled only for signed transactions or transactions with frozen coins
+ self.freeze_button.setEnabled(
+ bool(has_frozen or status_enum in (StatusEnum.Signed, StatusEnum.PartiallySigned)))
+ else:
+ self.freeze_button.setEnabled(False)
+ self.freeze_button.setText(self._make_freeze_button_text())
+
+ # We enable the broadcast button IFF both of the following hold:
+ # 1. can_broadcast is true (tx has not been seen yet on the network
+ # and is_complete).
+ # 2. The last time user hit "Broadcast" (and it was successful) was
+ # more than BROADCAST_COOLDOWN_SECS ago. This second condition
+ # implements a broadcast cooldown timer which immediately disables
+ # the "Broadcast" button for a time after a successful broadcast.
+ # This prevents the user from being able to spam the broadcast
+ # button. See #1483.
+ self.broadcast_button.setEnabled(
+ bool(can_broadcast and time.time() - self.last_broadcast_time >= self.BROADCAST_COOLDOWN_SECS))
+
+ can_sign = bool(not self.tx.is_complete() and
+ (self.wallet.can_sign(self.tx) or bool(self.main_window.tx_external_keypairs)))
+ self.sign_button.setEnabled(can_sign)
+ self.tx_hash_e.setText(tx_hash or _('Unknown'))
+ if fee is None:
+ fee = self.try_calculate_fee()
+ if fee is None:
+ # see if we can grab the fee from the wallet internal cache which
+ # sometimes has fees for tx's not entirely 'is_mine'
+ if self.wallet and self.tx_hash:
+ fee = self.wallet.tx_fees.get(self.tx_hash)
+ if desc is None:
+ self.tx_desc.hide()
+ else:
+ self.tx_desc.setText(_("Description") + ': ' + desc)
+ self.tx_desc.show()
+
+ if self.tx_height is not None and self.tx_height > 0 and tx_hash:
+ status_extra = ' ( ' + _("Mined in block") + f': {self.tx_height}' + ' )'
+ else:
+ status_extra = ''
+
+ self.status_label.setText(_('Status:') + ' ' + status + status_extra)
+
+ if timestamp:
+ time_str = datetime.datetime.fromtimestamp(timestamp).isoformat(' ')[:-3]
+ self.date_label.setText(_("Date: {}").format(time_str))
+ self.date_label.show()
+ elif exp_n:
+ text = '%d blocks'%(exp_n) if exp_n > 0 else _('unknown (low fee)')
+ self.date_label.setText(_('Expected confirmation time') + ': ' + text)
+ self.date_label.show()
+ else:
+ self.date_label.hide()
+ if amount is None:
+ amount_str = _("Transaction unrelated to your wallet")
+ elif amount > 0:
+ amount_str = _("Amount received:") + ' %s'% format_amount(amount) + ' ' + base_unit
+ else:
+ amount_str = _("Amount sent:") + ' %s'% format_amount(-amount) + ' ' + base_unit
+ size_str = _("Size: {size} bytes").format(size=size)
+ fee_str = _("Fee") + ": "
+ if fee is not None:
+ fee_str = _("Fee: {fee_amount} {fee_unit} ( {fee_rate} )")
+ fee_str = fee_str.format(fee_amount=format_amount(fee), fee_unit=base_unit,
+ fee_rate=self.main_window.format_fee_rate(fee/size*1000))
+ dusty_fee = self.tx.ephemeral.get('dust_to_fee', 0)
+ if dusty_fee:
+ fee_str += ' ' + (_("( %s in dust was added to fee )") % format_amount(dusty_fee)) + ''
+ elif self._dl_pct is not None:
+ fee_str = _('Downloading input data, please wait...') + ' {:.0f}%'.format(self._dl_pct)
+ else:
+ fee_str += _("unknown")
+ self.amount_label.setText(amount_str)
+ self.fee_label.setText(fee_str)
+ self.size_label.setText(size_str)
+ self.update_io()
+ run_hook('transaction_dialog_update', self)
+
+ def is_fetch_input_data(self):
+ return self.main_window.is_fetch_input_data()
+
+ def set_fetch_input_data(self, b):
+ self.main_window.set_fetch_input_data(b)
+ if self.is_fetch_input_data():
+ self.initiate_fetch_input_data(bool(self.try_calculate_fee() is None))
+ else:
+ self.tx.fetch_cancel()
+ self._dl_pct = None # makes the "download progress" thing clear
+ self.update()
+
+ def add_io(self, vbox):
+ if self.tx.locktime > 0:
+ lbl = QLabel(_("LockTime: {lock_time}").format(lock_time=self.tx.locktime))
+ lbl.setTextInteractionFlags(lbl.textInteractionFlags() | Qt.TextSelectableByMouse)
+ vbox.addWidget(lbl)
+
+ hbox = QHBoxLayout()
+ hbox.setContentsMargins(0,12,0,0)
+
+ self.i_text = i_text = TextBrowserKeyboardFocusFilter()
+ num_inputs = len(self.tx.inputs())
+ inputs_lbl_text = ngettext("&Input", "&Inputs ({num_inputs})", num_inputs).format(num_inputs=num_inputs)
+ l = QLabel(inputs_lbl_text)
+ l.setBuddy(i_text)
+ hbox.addWidget(l)
+
+
+ hbox.addSpacerItem(QSpacerItem(20, 0)) # 20 px padding
+ self.dl_input_chk = chk = QCheckBox(_("&Download input data"))
+ chk.setChecked(self.is_fetch_input_data())
+ chk.clicked.connect(self.set_fetch_input_data)
+ chk.setToolTip(_("If this is checked, accurate fee and input value data will be retrieved from the network"))
+ hbox.addWidget(chk)
+ hbox.addStretch(1)
+ if not self.wallet.network:
+ # it makes no sense to enable this checkbox if the network is offline
+ chk.setHidden(True)
+
+ self.schnorr_label = QLabel(_('{} = Schnorr signed').format(SCHNORR_SIGIL))
+ self.schnorr_label.setAlignment(Qt.AlignVCenter | Qt.AlignRight)
+ f = self.schnorr_label.font()
+ f.setPointSize(f.pointSize()-1) # make it a little smaller
+ self.schnorr_label.setFont(f)
+ hbox.addWidget(self.schnorr_label)
+ self.schnorr_label.setHidden(True)
+
+ vbox.addLayout(hbox)
+
+ i_text.setOpenLinks(False) # disable automatic link opening
+ i_text.anchorClicked.connect(self._open_internal_link) # send links to our handler
+ self.i_text_has_selection = False
+ def set_i_text_has_selection(b):
+ self.i_text_has_selection = bool(b)
+ i_text.copyAvailable.connect(set_i_text_has_selection)
+ i_text.setContextMenuPolicy(Qt.CustomContextMenu)
+ i_text.customContextMenuRequested.connect(self.on_context_menu_for_inputs)
+ i_text.setFont(QFont(MONOSPACE_FONT))
+ i_text.setReadOnly(True)
+ i_text.setTextInteractionFlags(i_text.textInteractionFlags() | Qt.LinksAccessibleByMouse | Qt.LinksAccessibleByKeyboard)
+ vbox.addWidget(i_text)
+
+
+ hbox = QHBoxLayout()
+ hbox.setContentsMargins(0,0,0,0)
+ vbox.addLayout(hbox)
+
+ self.o_text = o_text = TextBrowserKeyboardFocusFilter()
+ num_outputs = len(self.tx.outputs())
+ outputs_lbl_text = ngettext("&Output", "&Outputs ({num_outputs})", num_outputs).format(num_outputs=num_outputs)
+ l = QLabel(outputs_lbl_text)
+ l.setBuddy(o_text)
+ hbox.addWidget(l)
+
+ box_char = "█"
+ self.recv_legend = QLabel("" + box_char + " = " + _("Receiving Address"))
+ self.change_legend = QLabel("" + box_char + " = " + _("Change Address"))
+ f = self.recv_legend.font(); f.setPointSize(f.pointSize()-1)
+ self.recv_legend.setFont(f)
+ self.change_legend.setFont(f)
+ hbox.addStretch(2)
+ hbox.addWidget(self.recv_legend)
+ hbox.addWidget(self.change_legend)
+ self.recv_legend.setHidden(True)
+ self.change_legend.setHidden(True)
+
+ o_text.setOpenLinks(False) # disable automatic link opening
+ o_text.anchorClicked.connect(self._open_internal_link) # send links to our handler
+ self.o_text_has_selection = False
+ def set_o_text_has_selection(b):
+ self.o_text_has_selection = bool(b)
+ o_text.copyAvailable.connect(set_o_text_has_selection)
+ o_text.setContextMenuPolicy(Qt.CustomContextMenu)
+ o_text.customContextMenuRequested.connect(self.on_context_menu_for_outputs)
+ o_text.setFont(QFont(MONOSPACE_FONT))
+ o_text.setReadOnly(True)
+ o_text.setTextInteractionFlags(o_text.textInteractionFlags() | Qt.LinksAccessibleByMouse | Qt.LinksAccessibleByKeyboard)
+ vbox.addWidget(o_text)
+ self.cashaddr_signal_slots.append(self.update_io)
+ self.main_window.gui_object.cashaddr_toggled_signal.connect(self.update_io)
+ self.update_io()
+
+ def format_token_amount(self, tid, amt, append_tokentoshis=True):
+ return self.token_meta.format_amount(tid, amt, append_tokentoshis=append_tokentoshis)
+
+ def format_token_name(self, tid, append_parenthetical=True):
+ dname = self.token_meta.format_token_display_name(tid, format_str="{token_name} {token_symbol}")
+ if append_parenthetical and dname != tid:
+ # Append actual category id here
+ dname += " (" + tid + ")"
+ return dname
+
+ def _tok2str(self, tok: Optional[token.OutputData]) -> str:
+ if not tok:
+ return repr(tok)
+ tid = tok.id_hex
+ dname = self.format_token_name(tid)
+ ret = f"CashToken - " + _('Category') + f": {dname}"
+ if tok.has_amount():
+ formatted_amt = self.format_token_amount(tid, tok.amount)
+ ret += " - " + _('Fungible Amount') + ": " + formatted_amt
+ if tok.has_nft():
+ ret += f" - NFT"
+ if tok.has_commitment_length():
+ ret += ": " + tok.commitment[:token.MAX_CONSENSUS_COMMITMENT_LENGTH].hex()
+ ret += " - " + token.get_nft_flag_text(tok)
+ return ret
+
+ def update_io(self):
+ i_text = self.i_text
+ o_text = self.o_text
+ ext = QTextCharFormat()
+ ext.setToolTip(_("Right-click for context menu"))
+ lnk = QTextCharFormat()
+ lnk.setToolTip(_('Click to open, right-click for menu'))
+ lnk.setAnchor(True)
+ lnk.setUnderlineStyle(QTextCharFormat.SingleUnderline)
+ rec = QTextCharFormat(lnk)
+ rec.setBackground(QBrush(ColorScheme.GREEN.as_color(background=True)))
+ chg = QTextCharFormat(lnk)
+ chg.setBackground(QBrush(ColorScheme.YELLOW.as_color(True)))
+ tok = QTextCharFormat(ext)
+ # CashTokens get a slightly smaller font
+ f = tok.font()
+ f.setPointSize(f.pointSize() - 1)
+ f.setItalic(True)
+ tok.setFont(f)
+ tok.setToolTip(_("This output contains a CashToken"))
+ tok_inp = QTextCharFormat(tok)
+ tok_inp.setToolTip(_("This input contains a CashToken"))
+
+ rec_ct, chg_ct = 0, 0
+
+ def text_format(addr):
+ nonlocal rec_ct, chg_ct
+ ret = None
+ try:
+ if isinstance(addr, Address) and self.wallet.is_mine(addr):
+ if self.wallet.is_change(addr):
+ chg_ct += 1
+ chg2 = QTextCharFormat(chg)
+ chg2.setAnchorHref(addr.to_ui_string())
+ ret = chg2
+ return ret
+ else:
+ rec_ct += 1
+ rec2 = QTextCharFormat(rec)
+ rec2.setAnchorHref(addr.to_ui_string())
+ ret = rec2
+ return ret
+ ret = QTextCharFormat(ext)
+ return ret
+ finally:
+ if ret and isinstance(addr, Address) and addr.to_ui_string() != addr.to_token_string():
+ tt = ret.toolTip()
+ tt = (tt + '
'
+ + _('Token-aware encoding:') + ' ' + addr.to_token_string())
+ ret.setToolTip(tt)
+
+ def format_amount(amt):
+ return self.main_window.format_amount(amt, whitespaces=True)
+
+ i_text.clear()
+ cursor = i_text.textCursor()
+ has_schnorr = False
+ for i, x in enumerate(self.tx.fetched_inputs() or self.tx.inputs()):
+ a_name = f"input {i}"
+ for fmt in (ext, rec, chg, lnk, tok_inp):
+ fmt.setAnchorNames([a_name]) # anchor name for this line (remember input#); used by context menu creation
+ if x['type'] == 'coinbase':
+ cursor.insertText('coinbase', ext)
+ if isinstance(x.get('value'), int):
+ cursor.insertText(format_amount(x['value']), ext)
+ else:
+ prevout_hash = x.get('prevout_hash')
+ prevout_n = x.get('prevout_n')
+ hashn = f'{ prevout_hash[0:6] }...{ prevout_hash[-6:] }:{ prevout_n }'
+ # linkify prevout_hash:n, send link to our handler
+ lnk2 = QTextCharFormat(lnk)
+ lnk2.setAnchorHref(prevout_hash)
+ cursor.insertText(hashn, lnk2)
+ cursor.insertText((1+max(4-len(str(prevout_n)), 0)) * ' ', ext) # put spaces/padding
+ addr = x.get('address')
+ if addr is None:
+ addr_text = _('unknown')
+ else:
+ addr_text = addr.to_ui_string()
+ cursor.insertText(addr_text, text_format(addr))
+ if x.get('value'):
+ cursor.insertText(format_amount(x['value']), ext)
+ if self.tx.is_schnorr_signed(i):
+ # Schnorr
+ cursor.insertText(' {}'.format(SCHNORR_SIGIL), ext)
+ has_schnorr = True
+ if x.get('token_data'):
+ cursor.insertBlock()
+ cr_text = '\u21b3 '
+ cursor.insertText(cr_text, ext)
+ input_token_text = self._tok2str(x['token_data'])
+ fmt = text_format(addr)
+ # Set token background color to a slightly different shade of the change/receive color
+ brush = fmt.background()
+ color = brush.color()
+ color.setAlpha(0x77)
+ brush.setColor(color)
+ tokfmt = QTextCharFormat(tok_inp)
+ tokfmt.setBackground(brush)
+ cursor.insertText(input_token_text, tokfmt)
+ cursor.insertBlock()
+
+ self.schnorr_label.setVisible(has_schnorr)
+
+ o_text.clear()
+ cursor = o_text.textCursor()
+ ca_script = None
+ opret_ct = 0
+ for i, tup0 in enumerate(self.tx.outputs(tokens=True)):
+ my_addr_in_script = None
+ tup, token_data = tup0
+ typ, addr, v = tup
+ for fmt in (ext, rec, chg, lnk, tok):
+ fmt.setAnchorNames([f"output {i}"]) # anchor name for this line (remember input#); used by context menu creation
+ # CashAccounts support
+ if isinstance(addr, ScriptOutput) and addr.is_opreturn():
+ opret_ct += 1
+ if isinstance(addr, cashacct.ScriptOutput):
+ ca_script = addr
+ my_addr_in_script = (self.wallet.is_mine(ca_script.address) and ca_script.address) or None
+ if not addr.is_complete() and self.tx_hash and self.tx_height and self.tx_height >= cashacct.activation_height:
+ # The below will fail and return None if the height is less than
+ # networks.net.VERIFICATION_BLOCK_HEIGHT - 146 and if we lack
+ # this header.
+ # This is not catastrophic -- it just means the ScriptOutput
+ # won't be as pretty with the emoji and collision_hash.
+ # In many cases however we will have the header if the
+ # CashAccounts tx being viewed was verified by us.
+ self.block_hash = self.block_hash or self.wallet.get_block_hash(self.tx_height) or None
+ if self.block_hash:
+ # make it complete right away if we have the block_hash for pretty UI printing a few lines below...
+ ca_script.make_complete(block_height=self.tx_height, block_hash=self.block_hash, txid=self.tx_hash)
+ else:
+ # "forget" the script in this case so we don't keep
+ # processing it further below..
+ ca_script = None
+ # Format Cash Accounts address *in* script to be highlighted with
+ # our preferred yellow/green for change/receiving and also
+ # linkify it.
+ addrstr = addr.to_ui_string()
+ my_addr_in_script_str = my_addr_in_script and my_addr_in_script.to_ui_string()
+ idx = my_addr_in_script_str and addrstr.find(my_addr_in_script_str)
+ if idx is not None and idx > -1:
+ cursor.insertText(addrstr[:idx], text_format(addr))
+ len2 = idx+len(my_addr_in_script_str)
+ cursor.insertText(addrstr[idx:len2], text_format(my_addr_in_script))
+ cursor.insertText(addrstr[len2:], text_format(addr))
+ else:
+ # Regular format. Was not a Cash Accounts script, just
+ # any old Address/ScriptOutput/PublicKey output.
+ cursor.insertText(addrstr, text_format(addr))
+ # /CashAccounts support
+ # Mark B. Lundeberg's patented output formatter logic™
+ if v is not None:
+ if len(addrstr) > 42: # for long outputs, make a linebreak.
+ cursor.insertBlock()
+ addrstr = '\u21b3'
+ cursor.insertText(addrstr, ext)
+ # insert enough spaces until column 43, to line up amounts
+ cursor.insertText(' '*(43 - len(addrstr)), ext)
+ cursor.insertText(format_amount(v), ext)
+ # /Mark B. Lundeberg's patented output formatting logic™
+ if token_data is not None:
+ tokstr = self._tok2str(token_data)
+ cursor.insertBlock()
+ cr_text = '\u21b3 '
+ cursor.insertText(cr_text, ext)
+ fmt = text_format(addr)
+ # Set token background color to a slightly different shade of the change/receive color
+ brush = fmt.background()
+ color = brush.color()
+ color.setAlpha(0x77)
+ brush.setColor(color)
+ tokfmt = QTextCharFormat(tok)
+ tokfmt.setBackground(brush)
+ cursor.insertText(tokstr, tokfmt)
+ cursor.insertBlock()
+
+ # Cash Accounts support
+ if ca_script:
+ # This branch is taken if script.is_complete() was False initially above...
+ if opret_ct == 1: # <-- make sure only 1 OP_RETURN appears in the tx as per Cash Accounts spec
+ if ca_script.is_complete():
+ # add tx to cashaccts ext tx's and verify, since user initiated
+ # a UI action to open the TX, so maybe they are interested
+ # in this particular cashacct registration
+ self.print_error("adding ext tx to Cash Accounts")
+ self.wallet.cashacct.add_ext_tx(self.tx_hash, ca_script)
+ else:
+ # Not complete -- kick off ext verifier anyway
+ # We will get an update() signal should it verify ok...
+ # At which point it may become is_complete() and UI can
+ # display all the info.
+ self.print_error("adding incomplete tx to Cash Accounts")
+ self.wallet.cashacct.add_ext_incomplete_tx(self.tx_hash, self.tx_height, ca_script)
+ else:
+ self.print_error(f"Encountered more than 1 OP_RETURN script in TX {self.tx_hash} with Cash Accounts registrations in it, ignoring registration script")
+ # /Cash Accounts support
+
+ # make the change & receive legends appear only if we used that color
+ self.recv_legend.setVisible(bool(rec_ct))
+ self.change_legend.setVisible(bool(chg_ct))
+
+ @staticmethod
+ def _copy_to_clipboard(text, widget):
+ if not text and isinstance(widget, QTextEdit):
+ widget.copy()
+ else:
+ qApp.clipboard().setText(text)
+ QToolTip.showText(QCursor.pos(), _("Text copied to clipboard"), widget)
+
+ def _open_internal_link(self, target):
+ ''' accepts either a str txid, str address, or a QUrl which should be
+ of the bare form "txid" and/or "address" -- used by the clickable
+ links in the inputs/outputs QTextBrowsers'''
+ if isinstance(target, QUrl):
+ target = target.toString(QUrl.None_)
+ assert target
+ if Address.is_valid(target):
+ # target was an address, open address dialog
+ self.main_window.show_address(Address.from_string(target), parent=self)
+ else:
+ # target was a txid, open new tx dialog
+ self.main_window.do_process_from_txid(txid=target, parent=self)
+
+ def _create_token_specific_context_menu_options(self, token_data, io_text) -> list:
+ ret = []
+ if token_data:
+ id_hex = token_data.id_hex
+ dname = self.format_token_name(id_hex, append_parenthetical=False)
+ if dname != id_hex and dname:
+ ret += [(_("Copy Token Name"), lambda: self._copy_to_clipboard(dname, io_text))]
+ ret += [(_("Copy Token Category ID"), lambda: self._copy_to_clipboard(id_hex, io_text))]
+ if token_data.has_amount():
+ formatted_amt = self.format_token_amount(id_hex, token_data.amount, append_tokentoshis=False)
+ raw_amt = str(token_data.amount)
+ ret += [(_("Copy Token Amount"), lambda: self._copy_to_clipboard(formatted_amt, io_text))]
+ if raw_amt != formatted_amt:
+ ret += [(_("Copy Token Amount (Raw)"), lambda: self._copy_to_clipboard(raw_amt, io_text))]
+ if token_data.has_commitment_length():
+ ret += [(_("Copy Token Commitment"), lambda: self._copy_to_clipboard(token_data.commitment.hex(),
+ io_text))]
+ return ret
+
+ def on_context_menu_for_inputs(self, pos):
+ i_text = self.i_text
+ menu = QMenu()
+ global_pos = i_text.viewport().mapToGlobal(pos)
+
+ charFormat, cursor = QTextCharFormat(), i_text.cursorForPosition(pos)
+ charFormat = cursor and cursor.charFormat()
+ name = charFormat.anchorNames() and charFormat.anchorNames()[0]
+
+ show_list = []
+ copy_list = []
+ was_cb = False
+ try:
+ # figure out which input they right-clicked on .. input lines have an anchor named "input N"
+ i = int(name.split()[1]) # split "input N", translate N -> int
+ inp = (self.tx.fetched_inputs() or self.tx.inputs())[i]
+ value = inp.get('value')
+ #value_text = (value is not None and (self.main_window.format_amount(value) + " " + self.main_window.base_unit()))
+ #menu.addAction(_("Input") + " #" + str(i) + (' - ' + value_text if value else '')).setDisabled(True)
+ menu.addAction(_("Input") + " #" + str(i)).setDisabled(True)
+ menu.addSeparator()
+ if inp.get('type') == 'coinbase':
+ menu.addAction(_("Coinbase Input")).setDisabled(True)
+ was_cb = True
+ else:
+ # not coindbase, add options
+ u_tup = inp.get('prevout_hash'), inp.get('prevout_n')
+ if all(x is not None for x in u_tup):
+ # Copy UTXO
+ utxo = f"{u_tup[0]}:{u_tup[1]}"
+ show_list += [ ( _("Show Prev Tx"), lambda: self._open_internal_link(u_tup[0]) ) ]
+ copy_list += [ ( _("Copy Prevout"), lambda: self._copy_to_clipboard(utxo, i_text) ) ]
+ addr = inp.get('address')
+ self._add_addr_to_io_menu_lists_for_widget(addr, show_list, copy_list, i_text)
+ if isinstance(value, int):
+ value_fmtd = self.main_window.format_amount(value)
+ copy_list += [ ( _("Copy Amount"), lambda: self._copy_to_clipboard(value_fmtd, i_text) ) ]
+ token_data = inp.get('token_data')
+ copy_list += self._create_token_specific_context_menu_options(token_data, i_text)
+
+ except (TypeError, ValueError, IndexError, KeyError, AttributeError) as e:
+ self.print_error("Inputs right-click menu exception:", repr(e))
+
+ for item in show_list:
+ menu.addAction(*item)
+ if show_list and copy_list:
+ menu.addSeparator()
+ for item in copy_list:
+ menu.addAction(*item)
+
+ if show_list or copy_list or was_cb: menu.addSeparator()
+ if self.i_text_has_selection:
+ # Add this if they have a selection
+ menu.addAction(_("Copy Selected Text"), lambda: self._copy_to_clipboard(None, i_text))
+ menu.addAction(_("Select All"), i_text.selectAll)
+ menu.exec_(global_pos)
+
+ def _add_addr_to_io_menu_lists_for_widget(self, addr, show_list, copy_list, widget):
+ if hasattr(addr, 'to_ui_string'):
+ addr_text = addr.to_ui_string()
+ if isinstance(addr, Address) and self.wallet.is_mine(addr):
+ show_list += [ ( _("Address Details"), lambda: self._open_internal_link(addr_text) ) ]
+ addr_URL = web.BE_URL(self.main_window.config, 'addr', addr)
+ if addr_URL:
+ show_list += [ ( _("View on block explorer"), lambda: webopen(addr_URL) ) ]
+ if isinstance(addr, ScriptOutput):
+ action_text = _("Copy Script Text")
+ elif isinstance(addr, PublicKey):
+ action_text = _("Copy Public Key")
+ else:
+ action_text = _("Copy Address")
+ copy_list += [ ( action_text, lambda: self._copy_to_clipboard(addr_text, widget) ) ]
+ if isinstance(addr, Address):
+ token_text = addr.to_token_string()
+ if token_text != addr_text:
+ copy_list += [(_("Copy Address") + ' ' + _("(token-aware)"),
+ lambda: self._copy_to_clipboard(token_text, widget))]
+ # also add script hex copy to clipboard
+ if isinstance(addr, ScriptOutput):
+ hex_text = addr.to_script().hex() or ''
+ if hex_text:
+ copy_list += [ ( _("Copy Script Hex"), lambda: self._copy_to_clipboard(hex_text, widget) ) ]
+
+ def on_context_menu_for_outputs(self, pos):
+ o_text = self.o_text
+ menu = QMenu()
+ global_pos = o_text.viewport().mapToGlobal(pos)
+
+ charFormat, cursor = QTextCharFormat(), o_text.cursorForPosition(pos)
+ charFormat = cursor and cursor.charFormat()
+ name = charFormat.anchorNames() and charFormat.anchorNames()[0]
+
+ show_list = []
+ copy_list = []
+ try:
+ # figure out which output they right-clicked on .. output lines have an anchor named "output N"
+ i = int(name.split()[1]) # split "output N", translate N -> int
+ ignored, addr, value = (self.tx.outputs())[i]
+ ca_script = (isinstance(addr, cashacct.ScriptOutput) and addr) or None
+ token_data = self.tx.token_datas()[i]
+ menu.addAction(_("Output") + " #" + str(i)).setDisabled(True)
+ menu.addSeparator()
+ self._add_addr_to_io_menu_lists_for_widget(addr, show_list, copy_list, o_text)
+ if isinstance(value, int):
+ value_fmtd = self.main_window.format_amount(value)
+ copy_list += [ ( _("Copy Amount"), lambda: self._copy_to_clipboard(value_fmtd, o_text) ) ]
+ copy_list += self._create_token_specific_context_menu_options(token_data, o_text)
+ if ca_script:
+ copy_list += [ ( _("Copy Address (Embedded)"), lambda: self._copy_to_clipboard(ca_script.address.to_ui_string(), o_text) ) ]
+ if ca_script.is_complete() and self.tx_hash:
+ text_getter = lambda: self.wallet.cashacct.fmt_info(cashacct.Info.from_script(ca_script, self.tx_hash), emoji=True)
+ text_getter() # go out to network to cache the shortest encoding for cash account name ahead of time...
+ copy_list += [ ( _("Copy Cash Account"), lambda: self._copy_to_clipboard(text_getter(), o_text) ) ]
+ except (TypeError, ValueError, IndexError, KeyError, AttributeError) as e:
+ self.print_error("Outputs right-click menu exception:", repr(e))
+
+ for item in show_list:
+ menu.addAction(*item)
+ if show_list and copy_list:
+ menu.addSeparator()
+ for item in copy_list:
+ menu.addAction(*item)
+
+ if show_list or copy_list: menu.addSeparator()
+ if self.o_text_has_selection:
+ # Add this if they have a selection
+ menu.addAction(_("Copy Selected Text"), lambda: self._copy_to_clipboard(None, o_text))
+ menu.addAction(_("Select All"), o_text.selectAll)
+ menu.exec_(global_pos)
diff --git a/electroncash_gui/qt/udev_installer.py b/electroncash_gui/qt/udev_installer.py
new file mode 100644
index 000000000000..dccf2431abd7
--- /dev/null
+++ b/electroncash_gui/qt/udev_installer.py
@@ -0,0 +1,220 @@
+# Electron Cash - lightweight Bitcoin client
+# Copyright (C) 2019 Axel Gembe
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+"""
+Only import this on linux platforms, the module imports linux specific modules
+"""
+
+import os
+import tempfile
+import grp
+
+from PyQt5.QtCore import Qt, QObject
+from PyQt5.QtGui import QFont
+from PyQt5.QtWidgets import QDialog, QVBoxLayout, QLabel, QHBoxLayout, QPushButton, QMessageBox, QFrame, QWidget
+
+from electroncash.util import _, PrintError
+from electroncash.plugins import Plugins
+from electroncash_gui.qt import WindowModalDialog
+
+class InstallHardwareWalletSupportDialog(PrintError, WindowModalDialog):
+ UDEV_RULES_FILE='/etc/udev/rules.d/20-electron-cash-hw-wallets.rules'
+ GRAPHICAL_SUDOS=['pkexec','gksudo','kdesudo']
+
+ ADDITIONAL_HARDWARE_IDS = {
+ (0x534c, 0x0001), # TREZOR
+ (0x1209, 0x53c0), # TREZOR V2
+ (0x1209, 0x53c1), # TREZOR V2
+ }
+
+ def __init__(self, parent: QWidget, plugins: Plugins):
+ assert parent and plugins
+ super().__init__(parent)
+
+ # Make sure that all plugins are loaded so we have all hardware ids
+ plugins.get_hardware_support()
+ self.device_manager = plugins.device_manager
+
+ self.setWindowTitle(_('Hardware Wallet Support'))
+
+ layout = QVBoxLayout()
+ self.setLayout(layout)
+ layout.setContentsMargins(20,20,20,20)
+
+ info_label = QLabel()
+ info_label.setText(
+ _('This tool installs hardware wallet "udev rules" on your system.') + ' ' +
+ _('Correct udev rules are required in order for a hardware wallet to be accessed by Electron Cash.') + '\n\n' +
+ _('Note: Installing udev rules requires root access via "sudo", so make sure you are in the sudoers file and/or have Administrator rights on this system!')
+ )
+ info_label.setWordWrap(True)
+
+ layout.addWidget(info_label)
+
+ hbox = QHBoxLayout()
+ hbox.addStretch(2)
+ status_title = QLabel()
+ status_title.setText(_('udev Rules Status:'))
+ status_title.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
+ hbox.addWidget(status_title)
+ hbox.addStretch(1)
+ self.status_label = QLabel()
+ self.status_label.setAlignment(Qt.AlignLeft | Qt.AlignVCenter)
+ font = self.status_label.font()
+ font.setPointSize(15)
+ self.status_label.setFont(font)
+ hbox.addWidget(self.status_label)
+ hbox.addStretch(2)
+ layout.addLayout(hbox)
+
+ button_layout = QHBoxLayout()
+ layout.addLayout(button_layout)
+
+ close_button = QPushButton(_('&Close'))
+ close_button.clicked.connect(self.reject)
+ button_layout.addWidget(close_button)
+ button_layout.addStretch(1)
+ self.uninstall_button = QPushButton()
+ self.uninstall_button.setText(_('&Uninstall'))
+ self.uninstall_button.clicked.connect(self.uninstallClicked)
+ button_layout.addWidget(self.uninstall_button)
+
+ self.install_button = QPushButton()
+ self.install_button.setText(_('&Install'))
+ self.install_button.clicked.connect(self.installClicked)
+ button_layout.addWidget(self.install_button)
+
+ self.install_button.setMinimumWidth(100)
+ self.uninstall_button.setMinimumWidth(100)
+
+
+ self.updateStatus()
+
+ self.resize(400,300)
+
+ def setStatus(self, text: str, bold: bool = False):
+ self.status_label.setText(text if not bold else ('{}'.format(text)))
+ self.status_label.setTextFormat(Qt.RichText)
+
+ def updateStatus(self):
+ if not os.path.isfile(self.UDEV_RULES_FILE):
+ self.install_button.setEnabled(True)
+ self.uninstall_button.setEnabled(False)
+ self.setStatus(_('Not installed'), True)
+ return
+
+ with open(self.UDEV_RULES_FILE, 'r') as rules_file:
+ rules_installed = rules_file.read()
+
+ rules = self.generateRulesFile()
+
+ if rules_installed != rules:
+ self.install_button.setEnabled(True)
+ self.uninstall_button.setEnabled(True)
+ self.setStatus(_('Needs update'), True)
+ return
+
+ self.install_button.setEnabled(False)
+ self.uninstall_button.setEnabled(True)
+ self.setStatus(_('Installed'), False)
+
+ def generateRulesFile(self) -> str:
+ line_format='SUBSYSTEMS=="usb", ATTRS{{idVendor}}=="{:04x}", ATTRS{{idProduct}}=="{:04x}"'
+
+ try:
+ # Add the plugdev group if it exists
+ grp.getgrnam('plugdev')
+ line_format += ', GROUP="plugdev"'
+ except KeyError:
+ pass
+
+ # Add the uaccess tag. On most distros this is all that is needed for users to access USB devices
+ line_format += ', TAG+="uaccess"'
+
+ ids_set = self.device_manager.recognised_hardware.union(self.ADDITIONAL_HARDWARE_IDS)
+ lines = [line_format.format(ids[0], ids[1]) for ids in ids_set]
+ return '# Electron Cash hardware wallet rules file\n' + '\n'.join(lines) + '\n'
+
+ def _runScriptAsRoot(self, script: str) -> bool:
+ assert script
+
+ with tempfile.NamedTemporaryFile(mode='w', prefix='electroncash') as tf:
+ tf.write(script)
+ tf.flush()
+
+ if os.getuid() == 0:
+ if os.spawnvp(os.P_WAIT, 'sh', ['sh', tf.name]) == 0:
+ return True
+ return False
+
+ for sudo in self.GRAPHICAL_SUDOS:
+ if os.spawnvp(os.P_WAIT, sudo, [sudo, 'sh', tf.name]) == 0:
+ return True
+
+ return False
+
+ def _addUdevAdmCommands(self, script: str) -> str:
+ # The below udevadm trigger line is here in case we decide we need it.
+ # It appears unnecessary on most distros, according to @EchtarAgo (Axel Gembe)
+ # If you find it is necessary, comment it back in.
+ # Also note: on Tails Linux it did cause a system shutdown as well.
+ #script = script + 'udevadm trigger\n'
+ script = script + 'udevadm control --reload-rules\n'
+ return script
+
+ def installClicked(self):
+ script = 'set -e\n'
+ script += 'umask 022\n'
+ script += 'cat << EOF > "{}"\n'.format(self.UDEV_RULES_FILE)
+ script += self.generateRulesFile()
+ script += 'EOF\n'
+ script = self._addUdevAdmCommands(script)
+ self.print_error(script)
+ success = self._runScriptAsRoot(script)
+ self.updateStatus()
+ if success:
+ msg = _('HW wallet udev rules have been successfully installed!')
+ info = (
+ _('Note: You may now need to disconnect & reconnect your HW wallet.')
+ # Commented the below out as it's no longer relevant after our
+ # removal of `udevadm trigger` above.
+ #+ "\n\n" + _('(Your display resolution may also have changed as a result of this process. This is harmless; simply set it back.)')
+ )
+ self.show_message(msg, informative_text=info, rich_text=True)
+ else:
+ msg = _('Error installing udev rules and/or user canceled.')
+ self.show_warning(msg)
+
+
+ def uninstallClicked(self):
+ script = 'rm -f "{}"\n'.format(self.UDEV_RULES_FILE)
+ script = self._addUdevAdmCommands(script)
+ self.print_error(script)
+ success = self._runScriptAsRoot(script)
+ self.updateStatus()
+ if success:
+ msg = _('HW wallet udev rules have been successfully uninstalled!')
+ self.show_message(msg)
+ else:
+ msg = _('Error uninstalling udev rules and/or user canceled.')
+ self.show_warning(msg)
diff --git a/gui/qt/update_checker.py b/electroncash_gui/qt/update_checker.py
similarity index 98%
rename from gui/qt/update_checker.py
rename to electroncash_gui/qt/update_checker.py
index 3c90989a577f..e539aa08c2b9 100644
--- a/gui/qt/update_checker.py
+++ b/electroncash_gui/qt/update_checker.py
@@ -93,8 +93,8 @@ def __init__(self, parent=None):
self.content.addWidget(self.pb)
versions = QHBoxLayout()
- versions.addWidget(QLabel(_("Current version: {}".format(version.PACKAGE_VERSION))))
- self.latest_version_label = QLabel(_("Latest version: {}".format(" ")))
+ versions.addWidget(QLabel(_("Current version: {}").format(version.PACKAGE_VERSION)))
+ self.latest_version_label = QLabel(_("Latest version: {}").format(" "))
versions.addWidget(self.latest_version_label)
self.content.addLayout(versions)
@@ -216,7 +216,7 @@ def _update_view(self, latest_version):
elif latest_version:
self.pb.hide()
self.cancel_or_check_button.setText(_("Check Again"))
- self.latest_version_label.setText(_("Latest version: {}".format("" + latest_version + "")))
+ self.latest_version_label.setText(_("Latest version: {}").format("" + latest_version + ""))
if self.is_newer(latest_version):
self.heading_label.setText('' + _("There is a new update available") + '
')
url = '{u}'.format(u=UpdateChecker.download_url)
@@ -328,7 +328,7 @@ def run(self):
self.checker._req_finished.emit(self)
def _do_request(self, url):
- response = requests.get(url, allow_redirects=True, timeout=5.0) # will raise requests.exceptions.Timeout on timeout
+ response = requests.get(url, allow_redirects=True, timeout=30.0) # will raise requests.exceptions.Timeout on timeout
if response.status_code != 200:
raise RuntimeError(response.status_code, response.text)
diff --git a/gui/qt/util.py b/electroncash_gui/qt/util.py
similarity index 54%
rename from gui/qt/util.py
rename to electroncash_gui/qt/util.py
index df8542450c0b..e07fd0dc4495 100644
--- a/gui/qt/util.py
+++ b/electroncash_gui/qt/util.py
@@ -4,18 +4,22 @@
import platform
import queue
import threading
+import os
+import weakref
+import webbrowser
from collections import namedtuple
from functools import partial, wraps
+from locale import atof
-from electroncash.i18n import _
from electroncash.address import Address
-from electroncash.util import print_error, PrintError, Weak
+from electroncash.util import print_error, PrintError, Weak, finalization_print_error
+from electroncash.wallet import Abstract_Wallet
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
if platform.system() == 'Windows':
- MONOSPACE_FONT = 'Lucida Console'
+ MONOSPACE_FONT = 'Consolas'
elif platform.system() == 'Darwin':
MONOSPACE_FONT = 'Monaco'
else:
@@ -24,19 +28,16 @@
dialogs = []
-from electroncash.paymentrequest import PR_UNPAID, PR_PAID, PR_EXPIRED
+from electroncash.paymentrequest import PR_UNCONFIRMED, PR_UNPAID, PR_PAID, PR_EXPIRED
pr_icons = {
- PR_UNPAID:":icons/unpaid.png",
- PR_PAID:":icons/confirmed.png",
- PR_EXPIRED:":icons/expired.png"
+ PR_UNPAID:":icons/unpaid.svg",
+ PR_PAID:":icons/confirmed.svg",
+ PR_EXPIRED:":icons/expired.svg",
+ PR_UNCONFIRMED: ":icons/unconfirmed.svg"
}
-pr_tooltips = {
- PR_UNPAID:_('Pending'),
- PR_PAID:_('Paid'),
- PR_EXPIRED:_('Expired')
-}
+def _(message): return message
expiration_values = [
(_('1 hour'), 60*60),
@@ -45,6 +46,10 @@
(_('Never'), None)
]
+del _
+from electroncash.i18n import _
+
+
class EnterButton(QPushButton):
def __init__(self, text, func):
@@ -55,6 +60,8 @@ def __init__(self, text, func):
def keyPressEvent(self, e):
if e.key() == Qt.Key_Return:
self.func()
+ else:
+ super().keyPressEvent(e)
class ThreadedButton(QPushButton):
@@ -82,42 +89,62 @@ class WWLabel(QLabel):
def __init__ (self, text="", parent=None):
QLabel.__init__(self, text, parent)
self.setWordWrap(True)
+ self.setTextInteractionFlags(self.textInteractionFlags() | Qt.TextSelectableByMouse)
+# --- Help widgets
+class HelpMixin:
+ def __init__(self, help_text, *, custom_parent=None):
+ assert isinstance(self, QWidget), "HelpMixin must be a QWidget instance!"
+ self.help_text = help_text
+ self.custom_parent = custom_parent
+ if isinstance(self, QLabel):
+ self.setTextInteractionFlags(
+ (self.textInteractionFlags() | Qt.TextSelectableByMouse)
+ & ~Qt.TextSelectableByKeyboard)
-class HelpLabel(QLabel):
+ def show_help(self):
+ QMessageBox.information(self.custom_parent or self, _('Help'), self.help_text)
- def __init__(self, text, help_text):
+class HelpLabel(HelpMixin, QLabel):
+ def __init__(self, text, help_text, *, custom_parent=None):
QLabel.__init__(self, text)
- self.help_text = help_text
- self.app = QCoreApplication.instance()
- self.font = QFont()
+ HelpMixin.__init__(self, help_text, custom_parent=custom_parent)
+ self.setCursor(QCursor(Qt.PointingHandCursor))
+ self.font = self.font()
def mouseReleaseEvent(self, x):
- QMessageBox.information(self, 'Help', self.help_text)
+ self.show_help()
def enterEvent(self, event):
self.font.setUnderline(True)
self.setFont(self.font)
- self.app.setOverrideCursor(QCursor(Qt.PointingHandCursor))
return QLabel.enterEvent(self, event)
def leaveEvent(self, event):
self.font.setUnderline(False)
self.setFont(self.font)
- self.app.setOverrideCursor(QCursor(Qt.ArrowCursor))
return QLabel.leaveEvent(self, event)
-
-class HelpButton(QPushButton):
- def __init__(self, text):
- QPushButton.__init__(self, '?')
- self.help_text = text
+class HelpButton(HelpMixin, QPushButton):
+ def __init__(self, text, *, button_text='?', fixed_size=True, icon=None,
+ tool_tip=None, custom_parent=None):
+ QPushButton.__init__(self, button_text or '')
+ HelpMixin.__init__(self, text, custom_parent=custom_parent)
+ self.setToolTip(tool_tip or _("Show help"))
+ self.setCursor(QCursor(Qt.PointingHandCursor))
self.setFocusPolicy(Qt.NoFocus)
- self.setFixedWidth(20)
- self.clicked.connect(self.onclick)
+ if fixed_size:
+ self.setFixedWidth(20)
+ if icon:
+ self.setIcon(icon)
+ self.clicked.connect(self.show_help)
+ # The below is for older plugins that may have relied on the existence
+ # of this method. The older version of this class provided this method.
+ # Delete this line some day.
+ self.onclick = self.show_help
+
+# --- /Help widgets
- def onclick(self):
- QMessageBox.information(self, 'Help', self.help_text)
class Buttons(QHBoxLayout):
def __init__(self, *buttons):
@@ -128,13 +155,13 @@ def __init__(self, *buttons):
class CloseButton(QPushButton):
def __init__(self, dialog):
- QPushButton.__init__(self, _("Close"))
+ QPushButton.__init__(self, _("C&lose"))
self.clicked.connect(dialog.close)
self.setDefault(True)
class CopyButton(QPushButton):
def __init__(self, text_getter, app=None, callback=None):
- QPushButton.__init__(self, _("Copy"))
+ QPushButton.__init__(self, _("&Copy"))
if not app:
app = QApplication.instance()
self.clicked.connect(lambda: app.clipboard().setText(text_getter()))
@@ -143,29 +170,30 @@ def __init__(self, text_getter, app=None, callback=None):
class CopyCloseButton(QPushButton):
def __init__(self, text_getter, app, dialog):
- QPushButton.__init__(self, _("Copy and Close"))
+ QPushButton.__init__(self, _("&Copy and Close"))
self.clicked.connect(lambda: app.clipboard().setText(text_getter()))
self.clicked.connect(dialog.close)
self.setDefault(True)
class OkButton(QPushButton):
def __init__(self, dialog, label=None):
- QPushButton.__init__(self, label or _("OK"))
+ QPushButton.__init__(self, label or _("&OK"))
self.clicked.connect(dialog.accept)
self.setDefault(True)
class CancelButton(QPushButton):
def __init__(self, dialog, label=None):
- QPushButton.__init__(self, label or _("Cancel"))
+ QPushButton.__init__(self, label or _("C&ancel"))
self.clicked.connect(dialog.reject)
class MessageBoxMixin:
def top_level_window_recurse(self, window=None):
window = window or self
- classes = (WindowModalDialog, QMessageBox)
for n, child in enumerate(window.children()):
- # Test for visibility as old closed dialogs may not be GC-ed
- if isinstance(child, classes) and child.isVisible():
+ if (isinstance(child, QWidget) and child.isWindow()
+ and child.windowModality() != Qt.NonModal
+ # Test for visibility as old closed dialogs may not be GC-ed
+ and child.isVisible()):
return self.top_level_window_recurse(child)
return window
@@ -174,7 +202,8 @@ def top_level_window(self):
def question(self, msg, parent=None, title=None, icon=None, defaultButton=QMessageBox.No, **kwargs):
Yes, No = QMessageBox.Yes, QMessageBox.No
- retval = self.msg_box(icon or QMessageBox.Question,
+ if icon is None: icon = QMessageBox.Question
+ retval = self.msg_box(icon,
parent, title or '',
msg, buttons=Yes|No, defaultButton=defaultButton, **kwargs)
if isinstance(retval, (list, tuple)):
@@ -189,19 +218,27 @@ def question(self, msg, parent=None, title=None, icon=None, defaultButton=QMessa
return retval
def show_warning(self, msg, parent=None, title=None, **kwargs):
- return self.msg_box(QMessageBox.Warning, parent,
+ icon = kwargs.pop('icon', None) # may be 0
+ if icon is None: icon = QMessageBox.Warning
+ return self.msg_box(icon, parent,
title or _('Warning'), msg, **kwargs)
- def show_error(self, msg, parent=None, **kwargs):
- return self.msg_box(QMessageBox.Warning, parent,
- _('Error'), msg, **kwargs)
+ def show_error(self, msg, parent=None, title=None, **kwargs):
+ icon = kwargs.pop('icon', None) # may be 0
+ if icon is None: icon = QMessageBox.Warning
+ return self.msg_box(icon, parent,
+ title or _('Error'), msg, **kwargs)
def show_critical(self, msg, parent=None, title=None, **kwargs):
- return self.msg_box(QMessageBox.Critical, parent,
+ icon = kwargs.pop('icon', None) # may be 0
+ if icon is None: icon = QMessageBox.Critical
+ return self.msg_box(icon, parent,
title or _('Critical Error'), msg, **kwargs)
def show_message(self, msg, parent=None, title=None, **kwargs):
- return self.msg_box(QMessageBox.Information, parent,
+ icon = kwargs.pop('icon', None) # may be 0
+ if icon is None: icon = QMessageBox.Information
+ return self.msg_box(icon, parent,
title or _('Information'), msg, **kwargs)
def msg_box(self, icon, parent, title, text,
@@ -209,7 +246,8 @@ def msg_box(self, icon, parent, title, text,
defaultButton=QMessageBox.NoButton, # IFF buttons is a list, use a string appearing in the list to specify this
rich_text=False, detail_text=None, informative_text=None,
checkbox_text=None, checkbox_ischecked=False, # If checkbox_text is set, will add a checkbox, and return value becomes a tuple (result(), isChecked())
- escapeButton=QMessageBox.NoButton # IFF buttons is a list, use a string appearing in the list to specify this
+ escapeButton=QMessageBox.NoButton, # IFF buttons is a list, use a string appearing in the list to specify this
+ app_modal=False # IFF true, set the popup window to be application modal
):
''' Note about 'new' msg_box API (this applies to all of the above functions that call into this as well):
- `icon' may not be either a standard QMessageBox.Icon or a QPixmap for a custom icon.
@@ -221,7 +259,7 @@ def msg_box(self, icon, parent, title, text,
'''
parent = parent or self.top_level_window()
d = QMessageBoxMixin(parent)
- d.setWindowModality(Qt.WindowModal)
+ d.setWindowModality(Qt.ApplicationModal if app_modal else Qt.WindowModal)
d.setWindowTitle(title)
if isinstance(buttons, (list, tuple)):
# new! We support a button list, which specifies button text
@@ -250,7 +288,7 @@ def msg_box(self, icon, parent, title, text,
if informative_text and isinstance(informative_text, str):
d.setInformativeText(informative_text)
if rich_text:
- d.setTextInteractionFlags(Qt.TextSelectableByMouse|Qt.LinksAccessibleByMouse)
+ d.setTextInteractionFlags(d.textInteractionFlags()|Qt.TextSelectableByMouse|Qt.LinksAccessibleByMouse)
d.setTextFormat(Qt.RichText)
else:
d.setTextInteractionFlags(Qt.TextSelectableByMouse)
@@ -259,13 +297,20 @@ def msg_box(self, icon, parent, title, text,
if checkbox_text and isinstance(checkbox_text, str):
chk = QCheckBox(checkbox_text)
d.setCheckBox(chk)
+ def on_chk(b):
+ nonlocal checkbox_ischecked
+ checkbox_ischecked = bool(b)
chk.setChecked(bool(checkbox_ischecked))
- d.exec_()
- ret = d.result(), chk.isChecked() # new API returns a tuple if a checkbox is specified
+ chk.clicked.connect(on_chk)
+ res = d.exec_()
+ ret = res, checkbox_ischecked # new API returns a tuple if a checkbox is specified
else:
- d.exec_()
- ret = d.result() # old/no checkbox api
- d.setParent(None) # Force GC sooner rather than later.
+ ret = d.exec_() # old/no checkbox api
+ try:
+ d.setParent(None) # Force GC sooner rather than later.
+ except RuntimeError as e:
+ # C++ object deleted -- can happen with misbehaving client code that kills parent from dialog ok
+ print_error("MsgBoxMixin WARNING: client code is killing the dialog box's parent before function return:", str(e))
return ret
class QMessageBoxMixin(QMessageBox, MessageBoxMixin):
@@ -283,44 +328,133 @@ def __init__(self, parent, title=None):
if title:
self.setWindowTitle(title)
+class AppModalDialog(MessageBoxMixin, QDialog):
+ ''' Convenience class -- like the WindowModalDialog but is app-modal.
+ Has all the MessageBoxMixin convenience methods. Is always top-level and
+ parentless.'''
+ def __init__(self, parent=None, title=None, windowFlags=None):
+ QDialog.__init__(self, parent=parent)
+ self.setWindowModality(Qt.ApplicationModal)
+ if title:
+ self.setWindowTitle(title)
+ if windowFlags is not None:
+ self.setWindowFlags(windowFlags)
+
class WaitingDialog(WindowModalDialog):
'''Shows a please wait dialog whilst runnning a task. It is not
- necessary to maintain a reference to this dialog.'''
- def __init__(self, parent, message, task, on_success=None, on_error=None, auto_cleanup=True):
+ necessary to maintain a reference to this dialog.
+
+ Note if disable_escape_key is not set, user can hit cancel to prematurely
+ close the dialog. Sometimes this is desirable, and sometimes it isn't, hence
+ why the option is offered.'''
+
+ _update_progress_sig = pyqtSignal(int)
+
+ def __init__(self, parent, message, task, on_success=None, on_error=None, auto_cleanup=True,
+ *, auto_show=True, auto_exec=False, title=None, disable_escape_key=False,
+ progress_bar=None, progress_min=0, progress_max=0):
assert parent
if isinstance(parent, MessageBoxMixin):
parent = parent.top_level_window()
- WindowModalDialog.__init__(self, parent, _("Please wait"))
- vbox = QVBoxLayout(self)
- vbox.addWidget(QLabel(message))
+ WindowModalDialog.__init__(self, parent, title or _("Please wait"))
+ self.auto_cleanup = auto_cleanup
+ self.disable_escape_key = disable_escape_key
+ self._vbox = vbox = QVBoxLayout(self)
+ self._label = label = QLabel(message)
+ vbox.addWidget(label)
self.accepted.connect(self.on_accepted)
- self.show() # Bug here -- user can hit ESC key and kill the dialog before it's done. TODO: FIX!
+ self.rejected.connect(self.on_rejected)
+ self._pbar = None
+ if progress_bar:
+ self._pbar = p =QProgressBar()
+ p.setMinimum(progress_min)
+ p.setMaximum(progress_max)
+ if isinstance(progress_bar, str):
+ p.setTitle(progress_bar)
+ self._update_progress_sig.connect(p.setValue)
+ vbox.addWidget(p)
+ if auto_show and not auto_exec:
+ self.open()
self.thread = TaskThread(self)
self.thread.add(task, on_success, self.accept, on_error)
- self.auto_cleanup = auto_cleanup
+ if auto_exec:
+ self.exec_()
+ finalization_print_error(self) # track object lifecycle
def wait(self):
self.thread.wait()
+ def update_progress(self, progress: int):
+ if not self._pbar:
+ return
+ try:
+ progress = int(progress)
+ except (ValueError, TypeError):
+ return
+ else:
+ self._update_progress_sig.emit(progress)
+
def on_accepted(self):
self.thread.stop()
if self.auto_cleanup:
self.wait() # wait for thread to complete so that we can get cleaned up
self.setParent(None) # this causes GC to happen sooner rather than later. Before this call was added the WaitingDialogs would stick around in memory until the ElectrumWindow was closed and would never get GC'd before then. (as of PyQt5 5.11.3)
+ def on_rejected(self):
+ if self.auto_cleanup:
+ self.setParent(None)
+
+ def keyPressEvent(self, e):
+ ''' The user can hit Cancel to close the dialog before the task is done.
+ If self.disable_escape_key, then we suppress this unwanted behavior.
+ Note: Do not enable self.disable_escape_key for extremely long
+ operations.'''
+ if e.matches(QKeySequence.Cancel) and self.disable_escape_key:
+ e.ignore()
+ else:
+ super().keyPressEvent(e)
+
+
-def line_dialog(parent, title, label, ok_label, default=None):
+def line_dialog(parent, title, label, ok_label, default=None,
+ *, linkActivated=None, placeholder=None, disallow_empty=False,
+ icon=None, line_edit_widget=None):
dialog = WindowModalDialog(parent, title)
+ dialog.setObjectName('WindowModalDialog - ' + title)
+ destroyed_print_error(dialog) # track object lifecycle
dialog.setMinimumWidth(500)
l = QVBoxLayout()
dialog.setLayout(l)
- l.addWidget(QLabel(label))
- txt = QLineEdit()
+ if isinstance(icon, QIcon):
+ hbox = QHBoxLayout()
+ hbox.setContentsMargins(0,0,0,0)
+ ic_lbl = QLabel()
+ ic_lbl.setPixmap(icon.pixmap(50))
+ hbox.addWidget(ic_lbl)
+ hbox.addItem(QSpacerItem(10, 1))
+ t_lbl = QLabel("" + title + "")
+ hbox.addWidget(t_lbl, 0, Qt.AlignLeft)
+ hbox.addStretch(1)
+ l.addLayout(hbox)
+ lbl = WWLabel(label)
+ l.addWidget(lbl)
+ if linkActivated:
+ lbl.linkActivated.connect(linkActivated)
+ lbl.setTextInteractionFlags(lbl.textInteractionFlags()|Qt.LinksAccessibleByMouse)
+ txt = line_edit_widget or QLineEdit()
if default:
txt.setText(default)
+ if placeholder:
+ txt.setPlaceholderText(placeholder)
l.addWidget(txt)
- l.addLayout(Buttons(CancelButton(dialog), OkButton(dialog, ok_label)))
+ okbut = OkButton(dialog, ok_label)
+ l.addLayout(Buttons(CancelButton(dialog), okbut))
+ if disallow_empty:
+ def on_text_changed():
+ okbut.setEnabled(bool(txt.text()))
+ txt.textChanged.connect(on_text_changed)
+ on_text_changed() # initially enable/disable it.
if dialog.exec_():
return txt.text()
@@ -383,23 +517,26 @@ def address_combo(addresses):
return hbox, addr_combo
-def filename_field(parent, config, defaultname, select_msg):
+def filename_field(config, defaultname, select_msg):
+ gb = QGroupBox(_("Format"))
vbox = QVBoxLayout()
- vbox.addWidget(QLabel(_("Format")))
- gb = QGroupBox("format", parent)
- b1 = QRadioButton(gb)
+ gb.setLayout(vbox)
+ b1 = QRadioButton()
b1.setText(_("CSV"))
- b1.setChecked(True)
- b2 = QRadioButton(gb)
- b2.setText(_("json"))
+ b2 = QRadioButton()
+ b2.setText(_("JSON"))
+ if defaultname.endswith(".json"):
+ b2.setChecked(True)
+ else:
+ b1.setChecked(True)
vbox.addWidget(b1)
vbox.addWidget(b2)
hbox = QHBoxLayout()
directory = config.get('io_dir', os.path.expanduser('~'))
- path = os.path.join( directory, defaultname )
+ path = os.path.join(directory, defaultname)
filename_e = QLineEdit()
filename_e.setText(path)
@@ -424,7 +561,7 @@ def set_csv(v):
b1.clicked.connect(lambda: set_csv(True))
b2.clicked.connect(lambda: set_csv(False))
- return vbox, filename_e, b1
+ return gb, filename_e, b1
class ElectrumItemDelegate(QStyledItemDelegate):
def createEditor(self, parent, option, index):
@@ -432,8 +569,35 @@ def createEditor(self, parent, option, index):
class MyTreeWidget(QTreeWidget):
+ class SortSpec(namedtuple("SortSpec", "column, qt_sort_order")):
+ ''' Used to specify member: default_sort '''
+
+ # Specify this in subclasses to apply a default sort order to the widget.
+ # If None, nothing is applied (items are presented in the order they are
+ # added).
+ default_sort : SortSpec = None
+
+ # Specify this in subclasses to enable substring search/filtering (Ctrl+F)
+ # (if this and filter_data_columns are both empty, no search is applied)
+ filter_columns = []
+ # Like the above but rather than search the item .text() field, it searches
+ # for *data* in columns, e.g. item.data(col, Qt.UserRole). The data must
+ # live in filter_data_role (Qt.UserRole by default) in the specified
+ # column(s) and be a str. Leave empty to disable this facility. Note that
+ # data matches for the Ctrl+F filter must be a full string match (no
+ # substring matching is done) -- this is in contrast to filter_columns
+ # matching above which does substring matching. This reason we match on full
+ # strings is this facility was initially added to allow for searching the
+ # history_list by txid. If this criterion doesn't suit your use-case when
+ # inheriting from this, you may always override this class's `filter`
+ # method.
+ filter_data_columns = []
+ # the QTreeWidgetItem data role to use when searching data columns
+ filter_data_role : int = Qt.UserRole
+
def __init__(self, parent, create_menu, headers, stretch_column=None,
- editable_columns=None):
+ editable_columns=None,
+ *, deferred_updates=False, save_sort_settings=False):
QTreeWidget.__init__(self, parent)
self.parent = parent
self.config = self.parent.config
@@ -444,6 +608,9 @@ def __init__(self, parent, create_menu, headers, stretch_column=None,
# extend the syntax for consistency
self.addChild = self.addTopLevelItem
self.insertChild = self.insertTopLevelItem
+ self.deferred_updates = deferred_updates
+ self.deferred_update_ct, self._forced_update = 0, False
+ self._save_sort_settings = save_sort_settings
# Control which columns are editable
self.editor = None
@@ -456,6 +623,31 @@ def __init__(self, parent, create_menu, headers, stretch_column=None,
self.update_headers(headers)
self.current_filter = ""
+ self._setup_save_sort_mechanism()
+
+ def _setup_save_sort_mechanism(self):
+ if (self._save_sort_settings
+ and isinstance(getattr(self.parent, 'wallet', None), Abstract_Wallet)):
+ storage = self.parent.wallet.storage
+ key = f'mytreewidget_default_sort_{type(self).__name__}'
+ default = (storage and storage.get(key, None)) or self.default_sort
+ if default and isinstance(default, (tuple, list)) and len(default) >= 2 and all(isinstance(i, int) for i in default):
+ self.setSortingEnabled(True)
+ self.sortByColumn(default[0], default[1])
+ if storage:
+ # Paranoia; hold a weak reference just in case subclass code
+ # does unusual things.
+ weakStorage = Weak.ref(storage)
+ def save_sort(column, qt_sort_order):
+ storage = weakStorage()
+ if storage:
+ storage.put(key, [column, qt_sort_order])
+ self.header().sortIndicatorChanged.connect(save_sort)
+ elif self.default_sort:
+ self.setSortingEnabled(True)
+ self.sortByColumn(self.default_sort[0], self.default_sort[1])
+
+
def update_headers(self, headers):
self.setColumnCount(len(headers))
self.setHeaderLabels(headers)
@@ -473,10 +665,12 @@ def editItem(self, item, column):
item.setFlags(item.flags() & ~Qt.ItemIsEditable)
def keyPressEvent(self, event):
- if event.key() in [ Qt.Key_F2, Qt.Key_Return ] and self.editor is None:
- self.on_activated(self.currentItem(), self.currentColumn())
+ if event.key() in {Qt.Key_F2, Qt.Key_Return} and self.editor is None:
+ item, col = self.currentItem(), self.currentColumn()
+ if item and col > -1:
+ self.on_activated(item, col)
else:
- QTreeWidget.keyPressEvent(self, event)
+ super().keyPressEvent(event)
def permit_edit(self, item, column):
return (column in self.editable_columns
@@ -523,6 +717,7 @@ def editing_finished(self):
if self.editor is None and self.pending_update:
self.pending_update = False
self.on_update()
+ self.deferred_update_ct = 0
def on_edited(self, item, column, prior):
'''Called only when the text actually changes'''
@@ -531,29 +726,60 @@ def on_edited(self, item, column, prior):
self.parent.wallet.set_label(key, text)
self.parent.update_labels()
+ def should_defer_update_incr(self):
+ ret = (self.deferred_updates and not self.isVisible()
+ and not self._forced_update )
+ if ret:
+ self.deferred_update_ct += 1
+ return ret
+
def update(self):
# Defer updates if editing
if self.editor:
self.pending_update = True
else:
+ # Deferred update mode won't actually update the GUI if it's
+ # not on-screen, and will instead update it the next time it is
+ # shown. This has been found to radically speed up large wallets
+ # on initial synch or when new TX's arrive.
+ if self.should_defer_update_incr():
+ return
self.setUpdatesEnabled(False)
scroll_pos_val = self.verticalScrollBar().value() # save previous scroll bar position
self.on_update()
+ self.deferred_update_ct = 0
+ weakSelf = Weak.ref(self)
def restoreScrollBar():
- self.updateGeometry()
- self.verticalScrollBar().setValue(scroll_pos_val) # restore scroll bar to previous
- self.setUpdatesEnabled(True)
- QTimer.singleShot(1.0, restoreScrollBar) # need to do this from a timer some time later due to Qt quirks
+ slf = weakSelf()
+ if slf:
+ slf.updateGeometry()
+ slf.verticalScrollBar().setValue(scroll_pos_val) # restore scroll bar to previous
+ slf.setUpdatesEnabled(True)
+ QTimer.singleShot(0, restoreScrollBar) # need to do this from a timer some time later due to Qt quirks
if self.current_filter:
self.filter(self.current_filter)
def on_update(self):
+ # Reimplemented in subclasses
pass
- def get_leaves(self, root):
+ def showEvent(self, e):
+ super().showEvent(e)
+ if e.isAccepted() and self.deferred_update_ct:
+ self._forced_update = True
+ self.update()
+ self._forced_update = False
+ # self.deferred_update_ct will be set right after on_update is called because some subclasses use @rate_limiter on the update() method
+
+ def get_leaves(self, root=None):
+ if root is None:
+ root = self.invisibleRootItem()
child_count = root.childCount()
if child_count == 0:
- yield root
+ if root is not self.invisibleRootItem():
+ yield root
+ else:
+ return
for i in range(child_count):
item = root.child(i)
for x in self.get_leaves(item):
@@ -561,97 +787,195 @@ def get_leaves(self, root):
def filter(self, p):
columns = self.__class__.filter_columns
+ data_columns = self.__class__.filter_data_columns
+ if not columns and not data_columns:
+ return
p = p.lower()
self.current_filter = p
+ bad_data_column = False
+ data_role = self.__class__.filter_data_role
for item in self.get_leaves(self.invisibleRootItem()):
- item.setHidden(all([item.text(column).lower().find(p) == -1
- for column in columns]))
+ no_match_text = all(item.text(column).lower().find(p) == -1
+ for column in columns)
+ no_match_data = True
+ if no_match_text and not bad_data_column and data_columns:
+ try:
+ # data matching is different -- it must match exactly the
+ # specified search string. This was originally designed
+ # to allow for tx-hash searching of the history list.
+ no_match_data = all(item.data(column, data_role).strip().lower() != p
+ for column in data_columns)
+ except (AttributeError, TypeError, ValueError):
+ # flag so we don't keep raising for each iteration of this
+ # loop. Programmer error here in subclass, silently ignore.
+ bad_data_column = True
+ item.setHidden(no_match_text and no_match_data)
+
+
+class OverlayControlMixin:
+ STYLE_SHEET_COMMON = '''
+ QPushButton { border-width: 1px; padding: 0px; margin: 0px; }
+ '''
+ STYLE_SHEET_LIGHT = '''
+ QPushButton { border: 1px solid transparent; }
+ QPushButton:hover { border: 1px solid #3daee9; }
+ '''
-class ButtonsWidget(QWidget):
+ STYLE_SHEET_MAC = '''
+ QPushButton { border-width: 1px; padding: 0px; margin: 2px; }
+ QPushButton { border: 1px solid transparent; }
+ QPushButton:hover { border: 1px solid #3daee9; }
+ '''
- def __init__(self):
- super(QWidget, self).__init__()
- self.buttons = []
-
- def resizeButtons(self):
- frameWidth = self.style().pixelMetric(QStyle.PM_DefaultFrameWidth)
- x = self.rect().right() - frameWidth
- y = self.rect().bottom() - frameWidth
- for button in self.buttons:
- sz = button.sizeHint()
- x -= sz.width()
- button.move(x, y - sz.height())
-
- def addButton(self, icon_name, on_click, tooltip):
- button = QToolButton(self)
- button.setIcon(QIcon(icon_name))
- button.setStyleSheet("QToolButton { border: none; hover {border: 1px} pressed {border: 1px} padding: 0px; }")
- button.setVisible(True)
+ def __init__(self, middle: bool = False):
+ assert isinstance(self, QWidget)
+ self.middle = middle
+ self.overlay_widget = QWidget(self)
+ self._updateSverlayStyleSheet()
+ self.overlay_layout = QHBoxLayout(self.overlay_widget)
+ self.overlay_layout.setContentsMargins(0, 0, 0, 0)
+ self.overlay_layout.setSpacing(1)
+ self._updateOverlayPos()
+
+ def _updateSverlayStyleSheet(self):
+ if sys.platform in ('darwin',):
+ # On Mac, in Mojave dark mode, we get some strange button spacing
+ # if we use the regular common sheet, so we must use a custom sheet.
+ style_sheet = self.STYLE_SHEET_MAC
+ else:
+ style_sheet = self.STYLE_SHEET_COMMON
+ if not ColorScheme.dark_scheme:
+ style_sheet = style_sheet + self.STYLE_SHEET_LIGHT
+ self.overlay_widget.setStyleSheet(style_sheet)
+
+ def showEvent(self, e):
+ super().showEvent(e)
+ self._updateSverlayStyleSheet()
+
+ def resizeEvent(self, e):
+ super().resizeEvent(e)
+ self._updateOverlayPos()
+
+ def _updateOverlayPos(self):
+ frame_width = self.style().pixelMetric(QStyle.PM_DefaultFrameWidth)
+ overlay_size = self.overlay_widget.sizeHint()
+ x = self.rect().right() - frame_width - overlay_size.width()
+ y = self.rect().bottom() - overlay_size.height()
+ middle = self.middle
+ if hasattr(self, 'document'):
+ # Keep the buttons centered if we have less than 2 lines in the editor
+ line_spacing = QFontMetrics(self.document().defaultFont()).lineSpacing()
+ if self.rect().height() < (line_spacing * 2):
+ middle = True
+ y = (y / 2) + frame_width if middle else y - frame_width
+ if hasattr(self, 'verticalScrollBar') and self.verticalScrollBar().isVisible():
+ scrollbar_width = self.style().pixelMetric(QStyle.PM_ScrollBarExtent)
+ x -= scrollbar_width
+ self.overlay_widget.move(int(x), int(y))
+
+ def addWidget(self, widget: QWidget, index: int = None):
+ if index is not None:
+ self.overlay_layout.insertWidget(index, widget)
+ else:
+ self.overlay_layout.addWidget(widget)
+
+ def addButton(self, icon_name: str, on_click, tooltip: str, index : int = None,
+ *, text : str = None) -> QAbstractButton:
+ ''' icon_name may be None but then you must define text (which is
+ hopefully then some nice Unicode character). Both cannot be None.
+
+ `on_click` is the callable to connect to the button.clicked signal.
+
+ Use `index` to insert it not at the end of the layout by anywhere in the
+ layout. If None, it will be appended to the right of the layout. '''
+ button = QPushButton(self.overlay_widget)
button.setToolTip(tooltip)
+ button.setCursor(QCursor(Qt.PointingHandCursor))
+ if icon_name:
+ button.setIcon(QIcon(icon_name))
+ elif text:
+ button.setText(text)
+ if not icon_name and not text:
+ raise AssertionError('OverlayControlMixin.addButton: Button must have either icon_name or text defined!')
button.clicked.connect(on_click)
- self.buttons.append(button)
+ self.addWidget(button, index)
return button
- def addCopyButton(self, app):
- self.app = app
- self.addButton(":icons/copy.png", self.on_copy, _("Copy to clipboard"))
+ def addCopyButton(self) -> QAbstractButton:
+ return self.addButton(":icons/copy.png", self.on_copy, _("Copy to clipboard"))
def on_copy(self):
- self.app.clipboard().setText(self.text())
+ QApplication.instance().clipboard().setText(self.text())
QToolTip.showText(QCursor.pos(), _("Text copied to clipboard"), self)
-class ButtonsLineEdit(QLineEdit, ButtonsWidget):
+ def keyPressEvent(self, e):
+ if not self.hasFocus():
+ # Ignore keypress when we're not focused like when the focus is on a button
+ e.ignore()
+ return
+ super().keyPressEvent(e)
+
+ def keyReleaseEvent(self, e):
+ if not self.hasFocus():
+ e.ignore()
+ return
+ super().keyReleaseEvent(e)
+
+class ButtonsLineEdit(OverlayControlMixin, QLineEdit):
def __init__(self, text=None):
QLineEdit.__init__(self, text)
- self.buttons = []
-
- def resizeEvent(self, e):
- o = QLineEdit.resizeEvent(self, e)
- self.resizeButtons()
- return o
+ OverlayControlMixin.__init__(self, middle=True)
-class ButtonsTextEdit(QPlainTextEdit, ButtonsWidget):
+class ButtonsTextEdit(OverlayControlMixin, QPlainTextEdit):
def __init__(self, text=None):
QPlainTextEdit.__init__(self, text)
+ OverlayControlMixin.__init__(self)
self.setText = self.setPlainText
self.text = self.toPlainText
- self.buttons = []
-
- def resizeEvent(self, e):
- o = QPlainTextEdit.resizeEvent(self, e)
- self.resizeButtons()
- return o
-
-class TaskThread(QThread):
+class TaskThread(PrintError, QThread):
'''Thread that runs background tasks. Callbacks are guaranteed
to happen in the context of its parent.'''
Task = namedtuple("Task", "task cb_success cb_done cb_error")
doneSig = pyqtSignal(object, object, object)
- def __init__(self, parent, on_error=None):
- super(TaskThread, self).__init__(parent)
+ def __init__(self, parent, on_error=None, *, name=None):
+ QThread.__init__(self, parent)
+ if name is not None:
+ self.setObjectName(name)
self.on_error = on_error
self.tasks = queue.Queue()
self.doneSig.connect(self.on_done)
+ Weak.finalization_print_error(self) # track task thread lifecycle in debug log
self.start()
def add(self, task, on_success=None, on_done=None, on_error=None):
on_error = on_error or self.on_error
self.tasks.put(TaskThread.Task(task, on_success, on_done, on_error))
+ def diagnostic_name(self):
+ name = self.__class__.__name__
+ o = self.objectName() or ''
+ if o:
+ name += '/' + o
+ return name
+
def run(self):
- while True:
- task = self.tasks.get()
- if not task:
- break
- try:
- result = task.task()
- self.doneSig.emit(result, task.cb_done, task.cb_success)
- except BaseException:
- self.doneSig.emit(sys.exc_info(), task.cb_done, task.cb_error)
+ self.print_error("started")
+ try:
+ while True:
+ task = self.tasks.get()
+ if not task:
+ break
+ try:
+ result = task.task()
+ self.doneSig.emit(result, task.cb_done, task.cb_success)
+ except:
+ self.doneSig.emit(sys.exc_info(), task.cb_done, task.cb_error)
+ finally:
+ self.print_error("exiting")
def on_done(self, result, cb_done, cb):
# This runs in the parent's thread.
@@ -660,8 +984,13 @@ def on_done(self, result, cb_done, cb):
if cb:
cb(result)
- def stop(self):
+ def stop(self, *, waitTime = None):
+ ''' pass optional time to wait in seconds (float). If no waitTime
+ specified, will not wait. '''
self.tasks.put(None)
+ if waitTime is not None and self.isRunning():
+ if not self.wait(int(waitTime * 1e3)): # secs -> msec
+ self.print_error(f"wait timed out after {waitTime} seconds")
class ColorSchemeItem:
@@ -680,26 +1009,56 @@ def as_color(self, background=False):
color = self._get_color(background)
return QColor(color)
+ def get_html(self, background=False):
+ return self._get_color(background)
-class ColorScheme:
- dark_scheme = False
- GREEN = ColorSchemeItem("#117c11", "#8af296")
- YELLOW = ColorSchemeItem("#897b2a", "#ffff00")
- RED = ColorSchemeItem("#7c1111", "#f18c8c")
- BLUE = ColorSchemeItem("#123b7c", "#8cb3f2")
- DEFAULT = ColorSchemeItem("black", "white")
+class _ColorScheme:
+ def __init__(self):
+ self._dark_scheme = False
+
+ from .utils import darkdetect
+ self._dark_detector = darkdetect.isDark
+
+ self.DEEPGREEN = ColorSchemeItem("#335c33", "#7ac276")
+ self.GREEN = ColorSchemeItem("#117c11", "#8af296")
+ self.SLPGREEN = ColorSchemeItem("#25863f", "#8af296") # darker alternative: ColorSchemeItem("#25863f", "#60bc70")
+ self.YELLOW = ColorSchemeItem("#897b2a", "#ffff00")
+ self.PINK = ColorSchemeItem("#9c4444", "#ffbaba")
+ self.RED = ColorSchemeItem("#7c1111", "#f18c8c")
+ self.BLUE = ColorSchemeItem("#123b7c", "#8cb3f2")
+ self.DEFAULT = ColorSchemeItem("black", "white")
+ if sys.platform.startswith("win"):
+ self.GRAY = ColorSchemeItem("#6a6864", "#a0a0a4") # darkGray, gray
+ else:
+ self.GRAY = ColorSchemeItem("#777777", "#a0a0a4") # darkGray, gray
- @staticmethod
- def has_dark_background(widget):
+ def has_dark_background(self, widget):
brightness = sum(widget.palette().color(QPalette.Background).getRgb()[0:3])
return brightness < (255*3/2)
- @staticmethod
- def update_from_widget(widget, *, force_dark=False):
- if force_dark or ColorScheme.has_dark_background(widget):
- ColorScheme.dark_scheme = True
+ def update_from_widget(self, widget, *, force_dark=False):
+ self.dark_scheme = bool(force_dark or self.has_dark_background(widget))
+
+ @property
+ def dark_scheme(self):
+ '''Getter. We rely on the _dark_detector function. If it returns None
+ we know the _dark_detector is invalid so we just use the cached
+ setting.'''
+ detected = self._dark_detector()
+ if detected is not None:
+ return detected
+ else:
+ return self._dark_scheme
+
+ @dark_scheme.setter
+ def dark_scheme(self, b):
+ '''Note that the setter may not actually take effect if using the
+ system-specific dark detector (MacOS Mojave+ only).'''
+ self._dark_scheme = b
+
+ColorScheme = _ColorScheme()
class SortableTreeWidgetItem(QTreeWidgetItem):
DataRole = Qt.UserRole + 1
@@ -712,20 +1071,11 @@ def __lt__(self, other):
# We have set custom data to sort by
return self_data < other_data
try:
- # Is the value something numeric?
- self_text = self.text(column).replace(',', '')
- other_text = other.text(column).replace(',', '')
- return float(self_text) < float(other_text)
+ return atof(self.text(column)) < atof(other.text(column))
except ValueError:
# If not, we will just do string comparison
return self.text(column) < other.text(column)
-class OPReturnError(Exception):
- """ thrown when the OP_RETURN for a tx not of the right format """
-
-class OPReturnTooLarge(OPReturnError):
- """ thrown when the OP_RETURN for a tx is >220 bytes """
-
class RateLimiter(PrintError):
''' Manages the state of a @rate_limited decorated function, collating
multiple invocations. This class is not intented to be used directly. Instead,
@@ -756,9 +1106,20 @@ def diagnostic_name(self):
def kill_timer(self):
if self.timer:
#self.print_error("deleting timer")
- self.timer.stop()
- self.timer.deleteLater()
- self.timer = None
+ try:
+ self.timer.stop()
+ self.timer.deleteLater()
+ except RuntimeError as e:
+ if 'c++ object' in str(e).lower():
+ # This can happen if the attached object which actually owns
+ # QTimer is deleted by Qt before this call path executes.
+ # This call path may be executed from a queued connection in
+ # some circumstances, hence the crazyness (I think).
+ self.print_error("advisory: QTimer was already deleted by Qt, ignoring...")
+ else:
+ raise
+ finally:
+ self.timer = None
@classmethod
def attr_name(cls, func): return "__{}__{}".format(func.__name__, cls.__name__)
@@ -796,7 +1157,7 @@ def _invoke(self, args, kwargs):
self.timer.timeout.connect(self._doIt)
#self.timer.destroyed.connect(lambda x=None,qn=self.qn: print(qn,"Timer deallocated"))
self.timer.setSingleShot(True)
- self.timer.start(diff*1e3)
+ self.timer.start(int(diff*1e3))
#self.print_error("deferring")
else:
# We had a timer active, which means as future call will occur. So return early and let that call happenin the future.
@@ -939,10 +1300,16 @@ def wrapper(*args, **kwargs):
return wrapper
return wrapper0
+
+debug_destroyed = False # Set this to True to debug QObject "destroyed" signals using destroyed_print_error
+
+
def destroyed_print_error(qobject, msg=None):
- ''' Supply a message to be printed via print_error when obj is
- destroyed (Qt C++ deleted). This is useful for debugging memory leaks. '''
+ """ Supply a message to be printed via print_error when obj is destroyed (Qt C++ deleted).
+ This is useful for debugging memory leaks. Note that this function is a no-op unless debug_destroyed is True."""
assert isinstance(qobject, QObject), "destroyed_print_error can only be used on QObject instances!"
+ if not debug_destroyed:
+ return
if msg is None:
# Generate a useful message if none is supplied.
if isinstance(qobject, PrintError):
@@ -960,8 +1327,71 @@ def destroyed_print_error(qobject, msg=None):
except:
pass # some of the code in this project overrites .parent or it may not have a parent
name += qobject.__class__.__qualname__
- msg = "[{}] destroyed".format(name)
- qobject.destroyed.connect(lambda x=None,msg=msg: print_error(msg))
+ msg = f"[{name}] destroyed"
+
+ def on_destroyed(obj_ignored):
+ print_error(msg)
+
+ qobject.destroyed.connect(on_destroyed)
+
+
+def webopen(url: str):
+ if (sys.platform == 'linux' and os.environ.get('APPIMAGE')
+ and os.environ.get('LD_LIBRARY_PATH') is not None):
+ # When on Linux webbrowser.open can fail in AppImage because it can't find the correct libdbus.
+ # We just fork the process and unset LD_LIBRARY_PATH before opening the URL.
+ # See https://github.com/spesmilo/electrum/issues/5425
+ if os.fork() == 0:
+ del os.environ['LD_LIBRARY_PATH']
+ webbrowser.open(url)
+ os._exit(0) # Python docs advise doing this after forking to prevent atexit handlers from executing.
+ else:
+ webbrowser.open(url)
+
+
+class TextBrowserKeyboardFocusFilter(QTextBrowser):
+ """
+ This is a QTextBrowser that only enables keyboard text selection when the focus reason is
+ keyboard shortcuts or when a key is pressed while focused. Any other focus reason will
+ deactivate keyboard text selection.
+ """
+
+ def __init__(self, parent: QWidget = None):
+ super().__init__(parent)
+
+ def focusInEvent(self, e: QFocusEvent):
+ if e.reason() in (Qt.TabFocusReason, Qt.BacktabFocusReason, Qt.ShortcutFocusReason):
+ # Focused because of Tab, Shift+Tab or keyboard accelerator
+ self.setTextInteractionFlags(self.textInteractionFlags() | Qt.TextSelectableByKeyboard)
+ else:
+ self.setTextInteractionFlags(self.textInteractionFlags() & ~Qt.TextSelectableByKeyboard)
+ super().focusInEvent(e)
+
+ def keyPressEvent(self, e: QKeyEvent):
+ self.setTextInteractionFlags(self.textInteractionFlags() | Qt.TextSelectableByKeyboard)
+ super().keyPressEvent(e)
+
+
+class OnDestroyedMixin:
+ """A mixin class designed to be used with any QObject. It will call the on_destroyed method (which can be
+ overridden), and it offers the property is_destroyed. Used in network_dialog.py. """
+ def __init__(self):
+ assert isinstance(self, QObject)
+ self.is_destroyed = False
+ weak_self = weakref.ref(self)
+
+ def handler(obj):
+ strong_self = weak_self()
+ if strong_self:
+ strong_self.on_destroyed(obj)
+
+ self.destroyed.connect(lambda obj: handler(obj))
+
+ def on_destroyed(self, obj):
+ if self.is_destroyed:
+ return
+ self.is_destroyed = True
+ print_error(f"OnDestroyedMixin, object destroyed: {self!r}")
if __name__ == "__main__":
diff --git a/electroncash_gui/qt/utils/__init__.py b/electroncash_gui/qt/utils/__init__.py
new file mode 100644
index 000000000000..a50487a2bfd9
--- /dev/null
+++ b/electroncash_gui/qt/utils/__init__.py
@@ -0,0 +1,31 @@
+#!/usr/bin/env python3
+#
+# Electron Cash - lightweight Bitcoin client
+# Copyright (C) 2019 Axel Gembe
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from .aspect_layout import FixedAspectRatioLayout
+from .aspect_svg_widget import FixedAspectRatioSvgWidget
+from .image_effect import ImageGraphicsEffect
+from .color_utils import QColorLerp
+from .user_port_validator import PortValidator, UserPortValidator
+from . import qblockies
diff --git a/electroncash_gui/qt/utils/aspect_layout.py b/electroncash_gui/qt/utils/aspect_layout.py
new file mode 100644
index 000000000000..9debe3c97815
--- /dev/null
+++ b/electroncash_gui/qt/utils/aspect_layout.py
@@ -0,0 +1,112 @@
+#!/usr/bin/env python3
+#
+# Electron Cash - lightweight Bitcoin client
+# Copyright (C) 2019 Axel Gembe
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from typing import List
+
+from PyQt5.QtWidgets import QLayout, QWidget, QLayoutItem
+from PyQt5.QtCore import Qt, QSize, QRect, QPoint
+
+class FixedAspectRatioLayout(QLayout):
+ def __init__(self, parent: QWidget = None, aspect_ratio: float = 1.0):
+ super().__init__(parent)
+ self.aspect_ratio = aspect_ratio
+ self.items: List[QLayoutItem] = []
+
+ def set_aspect_ratio(self, aspect_ratio: float = 1.0):
+ self.aspect_ratio = aspect_ratio
+ self.update()
+
+ def addItem(self, item: QLayoutItem):
+ self.items.append(item)
+
+ def count(self) -> int:
+ return len(self.items)
+
+ def itemAt(self, index: int) -> QLayoutItem:
+ if index >= len(self.items):
+ return None
+ return self.items[index]
+
+ def takeAt(self, index: int) -> QLayoutItem:
+ if index >= len(self.items):
+ return None
+ return self.items.pop(index)
+
+ def _get_contents_margins_size(self) -> QSize:
+ margins = self.contentsMargins()
+ return QSize(margins.left() + margins.right(), margins.top() + margins.bottom())
+
+ def setGeometry(self, rect: QRect):
+ super().setGeometry(rect)
+ if not self.items:
+ return
+
+ contents = self.contentsRect()
+ if contents.height() > 0:
+ c_aratio = contents.width() / contents.height()
+ else:
+ c_aratio = 1
+ s_aratio = self.aspect_ratio
+ item_rect = QRect(QPoint(0, 0), QSize(
+ contents.width() if c_aratio < s_aratio else int(contents.height() * s_aratio),
+ contents.height() if c_aratio > s_aratio else int(contents.width() / s_aratio)
+ ))
+
+ content_margins = self.contentsMargins()
+ free_space = contents.size() - item_rect.size()
+
+ for item in self.items:
+ if free_space.width() > 0 and not item.alignment() & Qt.AlignLeft:
+ if item.alignment() & Qt.AlignRight:
+ item_rect.moveRight(contents.width() + content_margins.right())
+ else:
+ item_rect.moveLeft(content_margins.left() + (free_space.width() // 2))
+ else:
+ item_rect.moveLeft(content_margins.left())
+
+ if free_space.height() > 0 and not item.alignment() & Qt.AlignTop:
+ if item.alignment() & Qt.AlignBottom:
+ item_rect.moveBottom(contents.height() + content_margins.bottom())
+ else:
+ item_rect.moveTop(content_margins.top() + (free_space.height() // 2))
+ else:
+ item_rect.moveTop(content_margins.top())
+
+ item.widget().setGeometry(item_rect)
+
+ def sizeHint(self) -> QSize:
+ result = QSize()
+ for item in self.items:
+ result = result.expandedTo(item.sizeHint())
+ return self._get_contents_margins_size() + result
+
+ def minimumSize(self) -> QSize:
+ result = QSize()
+ for item in self.items:
+ result = result.expandedTo(item.minimumSize())
+ return self._get_contents_margins_size() + result
+
+ def expandingDirections(self) -> Qt.Orientations:
+ return Qt.Horizontal | Qt.Vertical
diff --git a/electroncash_gui/qt/utils/aspect_svg_widget.py b/electroncash_gui/qt/utils/aspect_svg_widget.py
new file mode 100644
index 000000000000..22fbe0a87aaf
--- /dev/null
+++ b/electroncash_gui/qt/utils/aspect_svg_widget.py
@@ -0,0 +1,41 @@
+#!/usr/bin/env python3
+#
+# Electron Cash - lightweight Bitcoin client
+# Copyright (C) 2019 Axel Gembe
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from PyQt5.QtCore import QObject, QSize
+from PyQt5.QtSvg import QSvgWidget
+
+class FixedAspectRatioSvgWidget(QSvgWidget):
+ def __init__(self, width: int, file: str = None, parent: QObject = None):
+ if file:
+ super().__init__(file, parent)
+ else:
+ super().__init__(parent)
+ self._width = width
+
+ def sizeHint(self) -> QSize:
+ svg_size = super().sizeHint()
+ aspect_ratio = svg_size.width() / svg_size.height()
+ size_hint = QSize(int(self._width), int(self._width / aspect_ratio))
+ return size_hint
diff --git a/electroncash_gui/qt/utils/color_utils.py b/electroncash_gui/qt/utils/color_utils.py
new file mode 100644
index 000000000000..eae5206100f8
--- /dev/null
+++ b/electroncash_gui/qt/utils/color_utils.py
@@ -0,0 +1,39 @@
+#!/usr/bin/env python3
+#
+# Electron Cash - lightweight Bitcoin client
+# Copyright (C) 2019 Axel Gembe
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from PyQt5.QtGui import QColor
+
+def QColorLerp(a: QColor, b: QColor, t: float):
+ """
+ Blends two QColors. t=0 returns a. t=1 returns b. t=0.5 returns evenly mixed.
+ """
+ t = max(min(t, 1.0), 0.0)
+ i_t = 1.0 - t
+ return QColor(
+ int((a.red() * i_t) + (b.red() * t)),
+ int((a.green() * i_t) + (b.green() * t)),
+ int((a.blue() * i_t) + (b.blue() * t)),
+ int((a.alpha() * i_t) + (b.alpha() * t)),
+ )
diff --git a/electroncash_gui/qt/utils/darkdetect/__init__.py b/electroncash_gui/qt/utils/darkdetect/__init__.py
new file mode 100644
index 000000000000..4cce20073d5d
--- /dev/null
+++ b/electroncash_gui/qt/utils/darkdetect/__init__.py
@@ -0,0 +1,22 @@
+#-----------------------------------------------------------------------------
+# Copyright (C) 2019 Alberto Sottile
+#
+# Distributed under the terms of the 3-clause BSD License.
+#-----------------------------------------------------------------------------
+
+__version__ = '0.1.1'
+
+import sys
+import platform
+
+if sys.platform != "darwin":
+ from ._dummy import *
+else:
+ from distutils.version import LooseVersion as V
+ if V(platform.mac_ver()[0]) < V("10.14"):
+ from ._dummy import *
+ else:
+ from ._detect import *
+ del V
+
+del sys, platform
\ No newline at end of file
diff --git a/electroncash_gui/qt/utils/darkdetect/_detect.py b/electroncash_gui/qt/utils/darkdetect/_detect.py
new file mode 100644
index 000000000000..9a79f7c269d2
--- /dev/null
+++ b/electroncash_gui/qt/utils/darkdetect/_detect.py
@@ -0,0 +1,64 @@
+#-----------------------------------------------------------------------------
+# Copyright (C) 2019 Alberto Sottile
+#
+# Distributed under the terms of the 3-clause BSD License.
+#-----------------------------------------------------------------------------
+
+import ctypes
+import ctypes.util
+
+appkit = ctypes.cdll.LoadLibrary(ctypes.util.find_library('AppKit'))
+objc = ctypes.cdll.LoadLibrary(ctypes.util.find_library('objc'))
+
+void_p = ctypes.c_void_p
+ull = ctypes.c_uint64
+
+objc.objc_getClass.restype = void_p
+objc.sel_registerName.restype = void_p
+objc.objc_msgSend.restype = void_p
+objc.objc_msgSend.argtypes = [void_p, void_p]
+
+msg = objc.objc_msgSend
+
+def _utf8(s):
+ if not isinstance(s, bytes):
+ s = s.encode('utf8')
+ return s
+
+def n(name):
+ return objc.sel_registerName(_utf8(name))
+
+def C(classname):
+ return objc.objc_getClass(_utf8(classname))
+
+def theme():
+ NSAutoreleasePool = objc.objc_getClass('NSAutoreleasePool')
+ pool = msg(NSAutoreleasePool, n('alloc'))
+ pool = msg(pool, n('init'))
+
+ NSUserDefaults = C('NSUserDefaults')
+ stdUserDef = msg(NSUserDefaults, n('standardUserDefaults'))
+
+ NSString = C('NSString')
+
+ key = msg(NSString, n("stringWithUTF8String:"), _utf8('AppleInterfaceStyle'))
+ appearanceNS = msg(stdUserDef, n('stringForKey:'), void_p(key))
+ appearanceC = msg(appearanceNS, n('UTF8String'))
+
+ if appearanceC is not None:
+ out = ctypes.string_at(appearanceC)
+ else:
+ out = None
+
+ msg(pool, n('release'))
+
+ if out is not None:
+ return out.decode('utf-8')
+ else:
+ return 'Light'
+
+def isDark():
+ return theme() == 'Dark'
+
+def isLight():
+ return theme() == 'Light'
diff --git a/electroncash_gui/qt/utils/darkdetect/_dummy.py b/electroncash_gui/qt/utils/darkdetect/_dummy.py
new file mode 100644
index 000000000000..db96255e873e
--- /dev/null
+++ b/electroncash_gui/qt/utils/darkdetect/_dummy.py
@@ -0,0 +1,14 @@
+#-----------------------------------------------------------------------------
+# Copyright (C) 2019 Alberto Sottile
+#
+# Distributed under the terms of the 3-clause BSD License.
+#-----------------------------------------------------------------------------
+
+def theme():
+ return None
+
+def isDark():
+ return None
+
+def isLight():
+ return None
diff --git a/electroncash_gui/qt/utils/image_effect.py b/electroncash_gui/qt/utils/image_effect.py
new file mode 100644
index 000000000000..76692e623320
--- /dev/null
+++ b/electroncash_gui/qt/utils/image_effect.py
@@ -0,0 +1,52 @@
+#!/usr/bin/env python3
+#
+# Electron Cash - lightweight Bitcoin client
+# Copyright (C) 2019 Axel Gembe
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from PyQt5.QtWidgets import QGraphicsEffect, QGraphicsScene, QGraphicsPixmapItem
+from PyQt5.QtGui import QImage, QPainter, QPixmap
+from PyQt5.QtCore import QObject, Qt
+
+class ImageGraphicsEffect(QObject):
+ """
+ Applies a QGraphicsEffect to a QImage
+ """
+
+ def __init__(self, parent: QObject, effect: QGraphicsEffect):
+ super().__init__(parent)
+ assert effect, 'effect must be set'
+ self.effect = effect
+ self.graphics_scene = QGraphicsScene()
+ self.graphics_item = QGraphicsPixmapItem()
+ self.graphics_item.setGraphicsEffect(effect)
+ self.graphics_scene.addItem(self.graphics_item)
+
+ def apply(self, image: QImage):
+ assert image, 'image must be set'
+ result = QImage(image.size(), QImage.Format_ARGB32)
+ result.fill(Qt.transparent)
+ painter = QPainter(result)
+ self.graphics_item.setPixmap(QPixmap.fromImage(image))
+ self.graphics_scene.render(painter)
+ self.graphics_item.setPixmap(QPixmap())
+ return result
diff --git a/electroncash_gui/qt/utils/qblockies.py b/electroncash_gui/qt/utils/qblockies.py
new file mode 100755
index 000000000000..08948976ec39
--- /dev/null
+++ b/electroncash_gui/qt/utils/qblockies.py
@@ -0,0 +1,131 @@
+#!/usr/bin/env python3
+"""
+Create a QImage deterministically from any string.
+Based on: https://github.com/tristan/blockies
+LICENSE: WTFPL (public domain)
+Adapted to Qt by: Calin A. Culianu
+"""
+import ctypes
+import math
+from random import random
+from typing import Optional
+
+from PyQt5.QtCore import Qt, QPoint, QRect, QSize
+from PyQt5.QtGui import QColor, QImage, QPainter
+
+DEFAULT_SIZE = 8 # Number of pixels in image, create 8x8 base blocks
+DEFAULT_SCALE = 4 # Size of image is size * scale = 32 x 32 by default
+
+DEFAULT_RANDSEED_LEN = 4
+
+
+def zero_fill_right_shift(num, shift):
+ if num < 0:
+ num += 4294967296
+ if num > 4294967295:
+ num = int(bin(num)[-32:], 2)
+ return num >> shift
+
+
+def int32(num):
+ return ctypes.c_int32(num).value
+
+
+class Context:
+
+ def __init__(self, seed: str, randseed_len=DEFAULT_RANDSEED_LEN):
+ assert str
+ randseed = self.randseed = [0] * randseed_len
+ for i in range(len(seed)):
+ randseed[i % randseed_len] = int32(randseed[i % randseed_len] << 5) - randseed[i % randseed_len]\
+ + ord(seed[i])
+
+ def rand(self) -> float:
+ """Returns a deterministically random number from 0.0 to 1.0"""
+ randseed = self.randseed
+ t = int32(randseed[0] ^ (randseed[0] << 11))
+
+ for i in range(0, len(randseed) - 1):
+ randseed[i] = randseed[i + 1]
+
+ idx = len(randseed) - 1
+ randseed[idx] = int32(randseed[idx]) ^ (int32(randseed[idx]) >> 19) ^ t ^ (t >> 8)
+ return zero_fill_right_shift(randseed[idx], 0) / zero_fill_right_shift((1 << 31), 0)
+
+ def create_color(self) -> QColor:
+ h = math.floor(self.rand() * 360) / 360.0
+ s = ((self.rand() * 60) + 40) / 100.0
+ l = ((self.rand() + self.rand() + self.rand() + self.rand()) * 25) / 100.0
+ return QColor.fromHslF(h, s, l)
+
+ def create_image_data(self, size):
+ width = size
+ height = size
+
+ data_width = math.ceil(width / 2)
+ mirror_width = size - data_width
+
+ data = []
+
+ for y in range(0, height):
+ row = [math.floor(self.rand() * 2.3) for _ in range(data_width)]
+ r = row[:mirror_width]
+ r.reverse()
+ row.extend(r)
+ data.extend(row)
+
+ return data
+
+
+def create(seed: Optional[str] = None,
+ color: Optional[QColor] = None,
+ bgcolor: Optional[QColor] = None,
+ size=DEFAULT_SIZE,
+ scale=DEFAULT_SCALE,
+ spotcolor: Optional[QColor] = None) -> QImage:
+
+ seed = seed or hex(math.floor(random() * math.pow(10, 16)))
+ ctx = Context(seed)
+ color = color or ctx.create_color()
+ bgcolor = bgcolor or ctx.create_color()
+ spotcolor = spotcolor or ctx.create_color()
+
+ image_data = ctx.create_image_data(size)
+
+ width = math.sqrt(len(image_data))
+ width = int(width)
+ render_size = width * scale
+ image = QImage(render_size, render_size, QImage.Format_RGB32)
+ image.fill(bgcolor)
+ painter = QPainter(image)
+ try:
+ painter.setBackgroundMode(Qt.OpaqueMode)
+ pen = painter.pen()
+ pen.setStyle(Qt.NoPen)
+ pen.setWidth(0)
+ painter.setPen(pen)
+ brush = painter.brush()
+ brush.setStyle(Qt.SolidPattern)
+ painter.setBrush(brush)
+
+ for i, val in enumerate(image_data):
+ if val == 0:
+ continue
+
+ row = i // width
+ col = i % width
+
+ fillcolor = color if val == 1 else spotcolor
+
+ brush.setColor(fillcolor)
+ painter.setBrush(brush)
+
+ rect_topleft = QPoint(int(col * scale), int(row * scale))
+ rect_size = QSize(scale, scale)
+ rect = QRect(rect_topleft, rect_size)
+ painter.drawRect(rect)
+ finally:
+ # In case an exception is raised, we must explicitly call painter.end()
+ # before popping stack else PyQt5 crashes with a segmentation fault!
+ painter.end()
+ return image
diff --git a/electroncash_gui/qt/utils/user_port_validator.py b/electroncash_gui/qt/utils/user_port_validator.py
new file mode 100644
index 000000000000..9541edb1abae
--- /dev/null
+++ b/electroncash_gui/qt/utils/user_port_validator.py
@@ -0,0 +1,68 @@
+# Electron Cash - lightweight Bitcoin client
+# Copyright (C) 2020 Axel Gembe
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from PyQt5.QtCore import pyqtSignal
+from PyQt5.QtGui import QIntValidator, QValidator
+from PyQt5.QtWidgets import QLineEdit
+
+import warnings
+
+class PortValidator(QIntValidator):
+ ''' A generic IP port validator. Accepts any number in the range [1,65535]
+ by default. '''
+ stateChanged = pyqtSignal(QValidator.State)
+ def __init__(self, parent, minimum=1, accept_zero=False):
+ super().__init__(0, 65535, parent)
+ if not isinstance(parent, QLineEdit):
+ warnings.warn(RuntimeWarning('PortValidator must be passed a QLineEdit parent'))
+ self.minimum = minimum
+ self.accept_zero = accept_zero
+ self.stateChanged.connect(self.setRedBorder)
+
+ def validate(self, inputStr: str, pos: int) -> QValidator.State:
+ res = list(super().validate(inputStr, pos))
+ if res[0] == QValidator.Acceptable:
+ try:
+ value = int(inputStr)
+ if value < self.minimum and (not self.accept_zero or value != 0):
+ res[0] = QValidator.Intermediate
+ except (ValueError, TypeError):
+ res[0] = QValidator.Invalid
+ self.stateChanged.emit(res[0])
+ return tuple(res)
+
+ def setRedBorder(self, state):
+ parent = self.parent()
+ if isinstance(parent, QLineEdit):
+ if state == QValidator.Acceptable:
+ parent.setStyleSheet('')
+ else:
+ parent.setStyleSheet('QLineEdit { border: 1px solid red }')
+
+class UserPortValidator(PortValidator):
+ """
+ Checks that a given port is either a high port (from 1024 to 65535) or zero.
+ Additionally provides a callback for when the validation state changes.
+ """
+ def __init__(self, parent, accept_zero=False):
+ super().__init__(parent, 1024, accept_zero)
diff --git a/electroncash_gui/qt/utxo_list.py b/electroncash_gui/qt/utxo_list.py
new file mode 100644
index 000000000000..1219e5477483
--- /dev/null
+++ b/electroncash_gui/qt/utxo_list.py
@@ -0,0 +1,397 @@
+#!/usr/bin/env python3
+#
+# Electrum - lightweight Bitcoin client
+# Copyright (C) 2015 Thomas Voegtlin
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation files
+# (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge,
+# publish, distribute, sublicense, and/or sell copies of the Software,
+# and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+from .util import *
+from electroncash.i18n import _, ngettext
+from electroncash.plugins import run_hook
+from electroncash.address import Address
+from electroncash.bitcoin import COINBASE_MATURITY
+from electroncash import cashacct
+from collections import defaultdict
+from functools import wraps
+from enum import IntEnum
+
+
+class UTXOList(MyTreeWidget):
+ class Col(IntEnum):
+ '''Column numbers. This is to make code in on_update easier to read.
+ If you modify these, make sure to modify the column header names in
+ the MyTreeWidget constructor.'''
+ address = 0
+ label = 1
+ amount = 2
+ height = 3
+ output_point = 4
+ class DataRoles(IntEnum):
+ '''Data roles. Again, to make code in on_update easier to read.'''
+ name = Qt.UserRole + 0
+ frozen_flags = Qt.UserRole + 1
+ address = Qt.UserRole + 2
+ cash_account = Qt.UserRole + 3 # this may not always be there for a particular item
+ slp_token = Qt.UserRole + 4 # this is either a tuple of (token_id, qty) or None
+ cash_token = Qt.UserRole + 5 # this is either a token.OutputData or None
+
+ filter_columns = [Col.address, Col.label]
+ default_sort = MyTreeWidget.SortSpec(Col.amount, Qt.DescendingOrder) # sort by amount, descending
+
+ def __init__(self, parent=None):
+ columns = [ _('Address'), _('Label'), _('Amount'), _('Height'), _('Output point') ]
+ MyTreeWidget.__init__(self, parent, self.create_menu, columns,
+ stretch_column = UTXOList.Col.label,
+ deferred_updates = True, save_sort_settings = True)
+ self.setSelectionMode(QAbstractItemView.ExtendedSelection)
+ self.setSortingEnabled(True)
+ self.wallet = self.parent.wallet
+ self.parent.ca_address_default_changed_signal.connect(self._ca_on_address_default_change)
+ self.parent.gui_object.cashaddr_toggled_signal.connect(self.update)
+ self.utxos = list()
+ # cache some values to avoid constructing Qt objects for every pass through self.on_update (this is important for large wallets)
+ self.monospaceFont = QFont(MONOSPACE_FONT)
+ self.lightBlue = QColor('lightblue') if not ColorScheme.dark_scheme else QColor('blue')
+ self.blue = ColorScheme.BLUE.as_color(True)
+ self.cyanBlue = QColor('#3399ff')
+ self.slpBG = ColorScheme.SLPGREEN.as_color(True)
+ self.cashTokenBG = QColor(self.slpBG)
+ self.cashTokenBG.setAlpha(0x77)
+ self.immatureColor = ColorScheme.BLUE.as_color(False)
+ self.output_point_prefix_text = columns[self.Col.output_point]
+
+ self.cleaned_up = False
+
+ def clean_up(self):
+ self.cleaned_up = True
+ try: self.parent.ca_address_default_changed_signal.disconnect(self._ca_on_address_default_change)
+ except TypeError: pass
+ try: self.parent.gui_object.cashaddr_toggled_signal.disconnect(self.update)
+ except TypeError: pass
+
+ def if_not_dead(func):
+ '''Boilerplate: Check if cleaned up, and if so, don't execute method'''
+ @wraps(func)
+ def wrapper(self, *args, **kwargs):
+ if self.cleaned_up or not self.wallet or not self.parent:
+ return
+ else:
+ func(self, *args, **kwargs)
+ return wrapper
+
+ def get_name(self, x):
+ return x.get('prevout_hash') + ":%d"%x.get('prevout_n')
+
+ def get_name_short(self, x):
+ return x.get('prevout_hash')[:10] + '...' + ":%d"%x.get('prevout_n')
+
+ @rate_limited(1.0, ts_after=True) # performance tweak -- limit updates to no more than once per second
+ def update(self):
+ if self.cleaned_up:
+ # short-cut return if window was closed and wallet is stopped
+ return
+ super().update()
+
+ @if_not_dead
+ def on_update(self):
+ local_maturity_height = (self.wallet.get_local_height()+1) - COINBASE_MATURITY
+ prev_selection = self.get_selected() # cache previous selection, if any
+ self.clear()
+ ca_by_addr = defaultdict(list)
+ if self.show_cash_accounts:
+ addr_set = set()
+ self.utxos = self.wallet.get_utxos(addr_set_out=addr_set, exclude_slp=False, exclude_tokens=False)
+ # grab all cash accounts so that we may add the emoji char
+ for info in self.wallet.cashacct.get_cashaccounts(addr_set):
+ ca_by_addr[info.address].append(info)
+ del info
+ for ca_list in ca_by_addr.values():
+ ca_list.sort(key=lambda info: ((info.number or 0), str(info.collision_hash))) # sort the ca_lists by number, required by cashacct.get_address_default
+ del ca_list # reference still exists inside ca_by_addr dict, this is just deleted here because we re-use this name below.
+ del addr_set # clean-up. We don't want the below code to ever depend on the existence of this cell.
+ else:
+ self.utxos = self.wallet.get_utxos(exclude_slp=False, exclude_tokens=False)
+ for x in self.utxos:
+ address = x['address']
+ address_text = address.to_ui_string()
+ ca_info = None
+ ca_list = ca_by_addr.get(address)
+ tool_tip0 = None
+ if ca_list:
+ ca_info = self.wallet.cashacct.get_address_default(ca_list)
+ address_text = f'{ca_info.emoji} {address_text}' # prepend the address emoji char
+ tool_tip0 = self.wallet.cashacct.fmt_info(ca_info, emoji=True)
+ height = x['height']
+ is_immature = x['coinbase'] and height > local_maturity_height
+ name = self.get_name(x)
+ name_short = self.get_name_short(x)
+ label = self.wallet.get_label(x['prevout_hash'])
+ amount = self.parent.format_amount(x['value'], is_diff=False, whitespaces=True)
+ utxo_item = SortableTreeWidgetItem([address_text, label, amount,
+ str(height), name_short])
+ if label:
+ utxo_item.setToolTip(1, label) # just in case it doesn't fit horizontally, we also provide it as a tool tip where hopefully it won't be elided
+ if tool_tip0:
+ utxo_item.setToolTip(0, tool_tip0)
+ utxo_item.setToolTip(4, name) # just in case they like to see lots of hex digits :)
+ utxo_item.DataRole = Qt.UserRole+100 # set this here to avoid sorting based on Qt.UserRole+1
+ utxo_item.setFont(0, self.monospaceFont)
+ utxo_item.setFont(2, self.monospaceFont)
+ utxo_item.setFont(4, self.monospaceFont)
+ utxo_item.setData(0, self.DataRoles.name, name)
+ a_frozen = self.wallet.is_frozen(address)
+ c_frozen = x['is_frozen_coin']
+ toolTipMisc = ''
+ slp_token = x['slp_token']
+ cash_token = x['token_data']
+ if is_immature:
+ for colNum in range(self.columnCount()):
+ if colNum == self.Col.label:
+ continue # don't color the label column
+ utxo_item.setForeground(colNum, self.immatureColor)
+ toolTipMisc = _('Coin is not yet mature')
+ elif slp_token:
+ utxo_item.setBackground(0, self.slpBG)
+ toolTipMisc = _('Coin contains an SLP token')
+ elif a_frozen and not c_frozen:
+ # address is frozen, coin is not frozen
+ # emulate the "Look" off the address_list .py's frozen entry
+ utxo_item.setBackground(0, self.lightBlue)
+ toolTipMisc = _("Address is frozen")
+ elif c_frozen and not a_frozen:
+ # coin is frozen, address is not frozen
+ utxo_item.setBackground(0, self.blue)
+ toolTipMisc = _("Coin is frozen")
+ elif c_frozen and a_frozen:
+ # both coin and address are frozen so color-code it to indicate that.
+ utxo_item.setBackground(0, self.lightBlue)
+ utxo_item.setForeground(0, self.cyanBlue)
+ toolTipMisc = _("Coin & Address are frozen")
+ elif cash_token:
+ utxo_item.setBackground(0, self.cashTokenBG)
+ toolTipMisc = _('Coin contains a CashToken')
+ # save the address-level-frozen and coin-level-frozen flags to the data item for retrieval later in create_menu() below.
+ utxo_item.setData(0, self.DataRoles.frozen_flags, "{}{}{}{}{}".format(
+ ("a" if a_frozen else ""), ("c" if c_frozen else ""), ("s" if slp_token else ""),
+ ("i" if is_immature else ""), ("t" if cash_token else "")))
+ # store the address
+ utxo_item.setData(0, self.DataRoles.address, address)
+ # store the ca_info for this address -- if any
+ if ca_info:
+ utxo_item.setData(0, self.DataRoles.cash_account, ca_info)
+ # store the slp_token
+ utxo_item.setData(0, self.DataRoles.slp_token, slp_token)
+ # store the cash token
+ utxo_item.setData(0, self.DataRoles.cash_token, cash_token)
+ if toolTipMisc:
+ utxo_item.setToolTip(0, toolTipMisc)
+ run_hook("utxo_list_item_setup", self, utxo_item, x, name)
+ self.addChild(utxo_item)
+ if name in prev_selection:
+ # NB: This needs to be here after the item is added to the widget. See #979.
+ utxo_item.setSelected(True) # restore previous selection
+ self._update_utxo_count_display(len(self.utxos))
+
+ def _update_utxo_count_display(self, num_utxos: int):
+ headerItem = self.headerItem()
+ if headerItem:
+ if num_utxos:
+ output_point_text = self.output_point_prefix_text + f" ({num_utxos})"
+ else:
+ output_point_text = self.output_point_prefix_text
+ headerItem.setText(self.Col.output_point, output_point_text)
+
+ def get_selected(self):
+ # dict of "name" -> frozen flags string (eg: "ac")
+ return {x.data(0, self.DataRoles.name): x.data(0, self.DataRoles.frozen_flags)
+ for x in self.selectedItems()}
+
+ @if_not_dead
+ def create_menu(self, position):
+ menu = QMenu()
+ selected = self.get_selected()
+
+ def create_menu_inner():
+ if not selected:
+ return
+ coins = list(filter(lambda x: self.get_name(x) in selected, self.utxos))
+ if not coins:
+ return
+ # Spendable coins are ones that have NO frozen_flags
+ spendable_coins = list(filter(lambda x: not selected.get(self.get_name(x), ''), coins))
+ # Sendable cash tokens have only "frozen" flag 't'
+ sendable_cash_tokens = list(filter(lambda x: selected.get(self.get_name(x), '') == 't', coins))
+ # Unconditionally add the "Spend" option but leave it disabled if there are no spendable_coins
+ spend_action = menu.addAction(_("Spend"), lambda: self.parent.spend_coins(spendable_coins))
+ spend_action.setEnabled(bool(spendable_coins))
+ if sendable_cash_tokens:
+ num_utxos = len(sendable_cash_tokens)
+ menu.addAction(QIcon(":icons/tab_send.png"),
+ ngettext("Send Token", "Send Tokens", num_utxos)
+ + (f" ({num_utxos})" if num_utxos > 1 else "") + "...",
+ lambda: self.parent.send_tokens(sendable_cash_tokens))
+
+ if len(selected) == 1:
+ # "Copy ..."
+ item = self.itemAt(position)
+ if not item:
+ return
+
+ col = self.currentColumn()
+ column_title = self.headerItem().text(col)
+ alt_column_title, alt_copy_text = None, None
+ slp_token = item.data(0, self.DataRoles.slp_token)
+ cash_token = item.data(0, self.DataRoles.cash_token)
+ ca_info = None
+ token_text = None
+ if col == self.Col.output_point:
+ copy_text = item.data(0, self.DataRoles.name)
+ elif col == self.Col.address:
+ addr = item.data(0, self.DataRoles.address)
+ # Determine the "alt copy text" "Legacy Address" or "Cash Address"
+ copy_text = addr.to_full_ui_string()
+ if Address.FMT_UI == Address.FMT_LEGACY:
+ alt_copy_text, alt_column_title = addr.to_full_string(Address.FMT_CASHADDR), _('Cash Address')
+ else:
+ alt_copy_text, alt_column_title = addr.to_full_string(Address.FMT_LEGACY), _('Legacy Address')
+ ca_info = item.data(0, self.DataRoles.cash_account) # may be None
+ token_text = addr.to_full_token_string()
+ if token_text in (copy_text, alt_copy_text):
+ token_text = None
+ del addr
+ else:
+ copy_text = item.text(col)
+ if copy_text:
+ copy_text = copy_text.strip() # make sure formatted amount is not whitespaced
+ menu.addAction(_("Copy {}").format(column_title), lambda: QApplication.instance().clipboard().setText(copy_text))
+ if alt_copy_text and alt_column_title:
+ menu.addAction(_("Copy {}").format(alt_column_title), lambda: QApplication.instance().clipboard().setText(alt_copy_text))
+ if token_text:
+ menu.addAction(_("Copy {}").format(_("Token Address")), lambda: QApplication.instance().clipboard().setText(token_text))
+ if ca_info:
+ self.wallet.cashacct.fmt_info(ca_info) # paranoia: pre-cache minimal chash (may go out to network)
+ menu.addAction(_("Copy Cash Account"), lambda: self.wallet and QApplication.instance().clipboard().setText(self.wallet.cashacct.fmt_info(ca_info, emoji=True)))
+
+ # single selection, offer them the "Details" option and also coin/address "freeze" status, if any
+ txid = list(selected.keys())[0].split(':')[0]
+ frozen_flags = list(selected.values())[0]
+ tx = self.wallet.transactions.get(txid)
+ if tx:
+ label = self.wallet.get_label(txid) or None
+ menu.addAction(_("Details"), lambda: self.parent.show_transaction(tx, label))
+ act = None
+ needsep = True
+ if 'c' in frozen_flags:
+ menu.addSeparator()
+ menu.addAction(_("Coin is frozen"), lambda: None).setEnabled(False)
+ menu.addAction(_("Unfreeze Coin"), lambda: self.set_frozen_coins(list(selected.keys()), False))
+ menu.addSeparator()
+ needsep = False
+ else:
+ menu.addAction(_("Freeze Coin"), lambda: self.set_frozen_coins(list(selected.keys()), True))
+ if 'a' in frozen_flags:
+ if needsep: menu.addSeparator()
+ menu.addAction(_("Address is frozen"), lambda: None).setEnabled(False)
+ menu.addAction(_("Unfreeze Address"), lambda: self.set_frozen_addresses_for_coins(list(selected.keys()), False))
+ else:
+ menu.addAction(_("Freeze Address"), lambda: self.set_frozen_addresses_for_coins(list(selected.keys()), True))
+ if not spend_action.isEnabled():
+ if slp_token:
+ spend_action.setText(_("SLP Token: Spend Locked"))
+ elif 'i' in frozen_flags: # immature coinbase
+ spend_action.setText(_("Immature Coinbase: Spend Locked"))
+ else:
+ # multi-selection
+ menu.addSeparator()
+ if any(['c' not in flags for flags in selected.values()]):
+ # they have some coin-level non-frozen in the selection, so add the menu action "Freeze coins"
+ menu.addAction(_("Freeze Coins"), lambda: self.set_frozen_coins(list(selected.keys()), True))
+ if any(['c' in flags for flags in selected.values()]):
+ # they have some coin-level frozen in the selection, so add the menu action "Unfreeze coins"
+ menu.addAction(_("Unfreeze Coins"), lambda: self.set_frozen_coins(list(selected.keys()), False))
+ if any(['a' not in flags for flags in selected.values()]):
+ # they have some address-level non-frozen in the selection, so add the menu action "Freeze addresses"
+ menu.addAction(_("Freeze Addresses"), lambda: self.set_frozen_addresses_for_coins(list(selected.keys()), True))
+ if any(['a' in flags for flags in selected.values()]):
+ # they have some address-level frozen in the selection, so add the menu action "Unfreeze addresses"
+ menu.addAction(_("Unfreeze Addresses"), lambda: self.set_frozen_addresses_for_coins(list(selected.keys()), False))
+
+ create_menu_inner()
+
+ run_hook('utxo_list_context_menu_setup', self, menu, selected)
+
+ # add optional toggle actions
+ menu.addSeparator()
+ def toggle():
+ self.show_cash_accounts = not self.show_cash_accounts
+ a = menu.addAction(_("Show Cash Accounts"), toggle)
+ a.setCheckable(True)
+ a.setChecked(self.show_cash_accounts)
+
+ menu.exec_(self.viewport().mapToGlobal(position))
+
+ def on_permit_edit(self, item, column):
+ # disable editing fields in this tab (labels)
+ return False
+
+ @if_not_dead
+ def set_frozen_coins(self, coins, b):
+ self.parent.set_frozen_coin_state(coins, b)
+
+ @if_not_dead
+ def set_frozen_addresses_for_coins(self, coins, b):
+ addrs = set()
+ for utxo in self.utxos:
+ name = self.get_name(utxo)
+ if name in coins:
+ addrs.add(utxo['address'])
+ if addrs:
+ self.parent.set_frozen_state(list(addrs), b)
+
+ @if_not_dead
+ def update_labels(self):
+ if self.should_defer_update_incr():
+ return
+ root = self.invisibleRootItem()
+ child_count = root.childCount()
+ for i in range(child_count):
+ item = root.child(i)
+ try:
+ txid = item.data(0, self.DataRoles.name).split(':', 1)[0]
+ except IndexError:
+ continue # name is iinvalid. should be txid:prevout_n
+ label = self.wallet.get_label(txid)
+ item.setText(1, label)
+
+ def _ca_on_address_default_change(self, info):
+ if self.show_cash_accounts:
+ self.update()
+
+ @property
+ def show_cash_accounts(self):
+ return bool(self.wallet.storage.get('utxo_list_show_cash_accounts', False))
+
+ @show_cash_accounts.setter
+ def show_cash_accounts(self, b):
+ b = bool(b)
+ was = self.show_cash_accounts
+ if was != b:
+ self.wallet.storage.put('utxo_list_show_cash_accounts', b)
+ self.update()
diff --git a/gui/stdio.py b/electroncash_gui/stdio.py
similarity index 92%
rename from gui/stdio.py
rename to electroncash_gui/stdio.py
index f950695a18a2..90b7bb48fd4c 100644
--- a/gui/stdio.py
+++ b/electroncash_gui/stdio.py
@@ -46,7 +46,7 @@ def __init__(self, config, daemon, plugins):
_("[r] - show own receipt addresses"), \
_("[c] - display contacts"), \
_("[b] - print server banner"), \
- _("[q] - quit") ]
+ _("[q] - quit")]
self.num_commands = len(self.commands)
def on_network(self, event, *args):
@@ -101,7 +101,7 @@ def print_history(self):
label = self.wallet.get_label(tx_hash)
messages.append( format_str%( time_str, label, format_satoshis(delta, whitespaces=True), format_satoshis(balance, whitespaces=True) ) )
- self.print_list(messages[::-1], format_str%( _("Date"), _("Description"), _("Amount"), _("Balance")))
+ self.print_list(messages[::-1], format_str%(_("Date"), _("Description"), _("Amount"), _("Balance")))
def print_balance(self):
@@ -110,7 +110,7 @@ def print_balance(self):
def get_balance(self):
if self.wallet.network.is_connected():
if not self.wallet.up_to_date:
- msg = _( "Synchronizing..." )
+ msg = _("Synchronizing...")
else:
c, u, x = self.wallet.get_balance()
msg = _("Balance")+": %f "%(PyDecimal(c) / COIN)
@@ -119,14 +119,16 @@ def get_balance(self):
if x:
msg += " [%f unmatured]"%(PyDecimal(x) / COIN)
else:
- msg = _( "Not connected" )
+ msg = _("Not connected")
return(msg)
def print_contacts(self):
- messages = map(lambda x: "%20s %45s "%(x[0], x[1][1]), self.contacts.items())
- self.print_list(messages, "%19s %25s "%("Key", "Value"))
+ def print_contact(contact):
+ return "%-20s %-45s "%(contact.name, contact.address)
+ messages = [print_contact(x) for x in self.contacts.get_all()]
+ self.print_list(messages, "%-20s %-45s "%("Name", "Address"))
def print_addresses(self):
messages = map(lambda addr: "%30s %30s "%(addr, self.wallet.labels.get(addr,"")), self.wallet.get_addresses())
@@ -146,8 +148,8 @@ def send_order(self):
self.do_send()
def print_banner(self):
- for i, x in enumerate( self.wallet.network.banner.split('\n') ):
- print( x )
+ for i, x in enumerate(self.wallet.network.banner.split('\n')):
+ print(x)
def print_list(self, lst, firstline):
lst = list(lst)
@@ -203,8 +205,6 @@ def do_send(self):
if status:
print(_('Payment sent.'))
- #self.do_clear()
- #self.update_contacts_tab()
else:
print(_('Error'))
diff --git a/gui/text.py b/electroncash_gui/text.py
similarity index 87%
rename from gui/text.py
rename to electroncash_gui/text.py
index d598d5f55a61..57b354f71980 100644
--- a/gui/text.py
+++ b/electroncash_gui/text.py
@@ -3,7 +3,7 @@
from decimal import Decimal as PyDecimal
import getpass
-import electrum
+import electroncash
from electroncash.address import Address
from electroncash.util import format_satoshis, set_verbosity
from electroncash.bitcoin import COIN, TYPE_ADDRESS
@@ -21,8 +21,7 @@ def __init__(self, config, daemon, plugins):
self.network = daemon.network
storage = WalletStorage(config.get_wallet_path())
if not storage.file_exists():
- print("Wallet not found. try 'electron-cash create'")
- exit()
+ sys.exit("Wallet not found. try 'electron-cash create'")
if storage.is_encrypted():
password = getpass.getpass('Password:', stream=None)
storage.decrypt(password)
@@ -80,7 +79,7 @@ def verify_seed(self):
def get_string(self, y, x):
self.set_cursor(1)
curses.echo()
- self.stdscr.addstr( y, x, " "*20, curses.A_REVERSE)
+ self.stdscr.addstr(y, x, " "*20, curses.A_REVERSE)
s = self.stdscr.getstr(y,x)
curses.noecho()
self.set_cursor(0)
@@ -101,7 +100,7 @@ def print_history(self):
if self.history is None:
self.update_history()
- self.print_list(self.history[::-1], format_str%( _("Date"), _("Description"), _("Amount"), _("Balance")))
+ self.print_list(self.history[::-1], format_str%(_("Date"), _("Description"), _("Amount"), _("Balance")))
def update_history(self):
width = [20, 40, 14, 14]
@@ -142,10 +141,10 @@ def print_balance(self):
else:
msg = _("Not connected")
- self.stdscr.addstr( self.maxy -1, 3, msg)
+ self.stdscr.addstr(self.maxy -1, 3, msg)
for i in range(self.num_tabs):
- self.stdscr.addstr( 0, 2 + 2*i + len(''.join(self.tab_names[0:i])), ' '+self.tab_names[i]+' ', curses.A_BOLD if self.tab == i else 0)
+ self.stdscr.addstr(0, 2 + 2*i + len(''.join(self.tab_names[0:i])), ' '+self.tab_names[i]+' ', curses.A_BOLD if self.tab == i else 0)
self.stdscr.addstr(self.maxy -1, self.maxx-30, ' '.join([_("Settings"), _("Network"), _("Quit")]))
@@ -155,18 +154,20 @@ def print_receive(self):
self.print_qr(addr)
def print_contacts(self):
- messages = map(lambda x: "%20s %45s "%(x[0], x[1][1]), self.contacts.items())
- self.print_list(messages, "%19s %15s "%("Key", "Value"))
+ def print_contact(contact):
+ return "%-20s %-45s "%(contact.name, contact.address)
+ messages = [print_contact(x) for x in self.contacts.get_all()]
+ self.print_list(messages, "%-20s %-45s "%("Name", "Address"))
def print_addresses(self):
- fmt = "%-35s %-30s"
+ fmt = "%-45s %-30s"
messages = map(lambda addr: fmt % (addr, self.wallet.labels.get(addr,"")), self.wallet.get_addresses())
self.print_list(messages, fmt % ("Address", "Label"))
def print_edit_line(self, y, label, text, index, size):
- text += " "*(size - len(text) )
- self.stdscr.addstr( y, 2, label)
- self.stdscr.addstr( y, 15, text, curses.A_REVERSE if self.pos%6==index else curses.color_pair(1))
+ text += " "*(size - len(text))
+ self.stdscr.addstr(y, 2, label)
+ self.stdscr.addstr(y, 15, text, curses.A_REVERSE if self.pos%6==index else curses.color_pair(1))
def print_send_tab(self):
self.stdscr.clear()
@@ -174,8 +175,8 @@ def print_send_tab(self):
self.print_edit_line(5, _("Description"), self.str_description, 1, 40)
self.print_edit_line(7, _("Amount"), self.str_amount, 2, 15)
self.print_edit_line(9, _("Fee"), self.str_fee, 3, 15)
- self.stdscr.addstr( 12, 15, _("[Send]"), curses.A_REVERSE if self.pos%6==4 else curses.color_pair(2))
- self.stdscr.addstr( 12, 25, _("[Clear]"), curses.A_REVERSE if self.pos%6==5 else curses.color_pair(2))
+ self.stdscr.addstr(12, 15, _("[Send]"), curses.A_REVERSE if self.pos%6==4 else curses.color_pair(2))
+ self.stdscr.addstr(12, 25, _("[Clear]"), curses.A_REVERSE if self.pos%6==5 else curses.color_pair(2))
self.maxpos = 6
def print_banner(self):
@@ -205,13 +206,13 @@ def print_list(self, lst, firstline = None):
if not self.maxpos: return
if firstline:
firstline += " "*(self.maxx -2 - len(firstline))
- self.stdscr.addstr( 1, 1, firstline )
+ self.stdscr.addstr(1, 1, firstline)
for i in range(self.maxy-4):
msg = lst[i] if i < len(lst) else ""
msg += " "*(self.maxx - 2 - len(msg))
m = msg[0:self.maxx - 2]
m = m.encode(self.encoding)
- self.stdscr.addstr( i+2, 1, m, curses.A_REVERSE if i == (self.pos % self.maxpos) else 0)
+ self.stdscr.addstr(i+2, 1, m, curses.A_REVERSE if i == (self.pos % self.maxpos) else 0)
def refresh(self):
if self.tab == -1: return
@@ -281,15 +282,16 @@ def run_receive_tab(self, c):
def run_contacts_tab(self, c):
if c == 10 and self.contacts:
out = self.run_popup('Address', ["Copy", "Pay to", "Edit label", "Delete"]).get('button')
- key = list(self.contacts.keys())[self.pos%len(self.contacts.keys())]
+ contacts = self.contacts.get_all(nocopy=True)
+ contact = contacts[self.pos%len(contacts)]
if out == "Pay to":
self.tab = 1
- self.str_recipient = key
+ self.str_recipient = contact.address
self.pos = 2
elif out == "Edit label":
s = self.get_string(6 + self.pos, 18)
if s:
- self.wallet.labels[key] = s
+ self.wallet.labels[contact.address] = s
def run_banner_tab(self, c):
self.show_message(repr(c))
@@ -399,7 +401,7 @@ def network_dialog(self):
def settings_dialog(self):
fee = str(PyDecimal(self.config.fee_per_kb()) / COIN)
out = self.run_dialog('Settings', [
- {'label':'Default fee', 'type':'satoshis', 'value': fee }
+ {'label':'Default fee', 'type':'satoshis', 'value': fee}
], buttons = 1)
if out:
if out.get('Default fee'):
@@ -417,13 +419,13 @@ def password_dialog(self):
def run_dialog(self, title, items, interval=2, buttons=None, y_pos=3):
self.popup_pos = 0
- self.w = curses.newwin( 5 + len(list(items))*interval + (2 if buttons else 0), 50, y_pos, 5)
+ self.w = curses.newwin(5 + len(list(items))*interval + (2 if buttons else 0), 50, y_pos, 5)
w = self.w
out = {}
while True:
w.clear()
w.border(0)
- w.addstr( 0, 2, title)
+ w.addstr(0, 2, title)
num = len(list(items))
@@ -449,14 +451,14 @@ def run_dialog(self, title, items, interval=2, buttons=None, y_pos=3):
value += ' '*(20-len(value))
if 'value' in item:
- w.addstr( 2+interval*i, 2, label)
- w.addstr( 2+interval*i, 15, value, curses.A_REVERSE if self.popup_pos%numpos==i else curses.color_pair(1) )
+ w.addstr(2+interval*i, 2, label)
+ w.addstr(2+interval*i, 15, value, curses.A_REVERSE if self.popup_pos%numpos==i else curses.color_pair(1))
else:
- w.addstr( 2+interval*i, 2, label, curses.A_REVERSE if self.popup_pos%numpos==i else 0)
+ w.addstr(2+interval*i, 2, label, curses.A_REVERSE if self.popup_pos%numpos==i else 0)
if buttons:
- w.addstr( 5+interval*i, 10, "[ ok ]", curses.A_REVERSE if self.popup_pos%numpos==(numpos-2) else curses.color_pair(2))
- w.addstr( 5+interval*i, 25, "[cancel]", curses.A_REVERSE if self.popup_pos%numpos==(numpos-1) else curses.color_pair(2))
+ w.addstr(5+interval*i, 10, "[ ok ]", curses.A_REVERSE if self.popup_pos%numpos==(numpos-2) else curses.color_pair(2))
+ w.addstr(5+interval*i, 25, "[cancel]", curses.A_REVERSE if self.popup_pos%numpos==(numpos-1) else curses.color_pair(2))
w.refresh()
diff --git a/plugins/README.rst b/electroncash_plugins/README.rst
similarity index 99%
rename from plugins/README.rst
rename to electroncash_plugins/README.rst
index 63f555f68d3b..8769f0e3144f 100644
--- a/plugins/README.rst
+++ b/electroncash_plugins/README.rst
@@ -142,8 +142,8 @@ The ``manifest.json`` file has required fields:
packages, or even looking around to distinguish between the one Python
package and other data directories.
- ``available_for``: This is a list of keywords which map to supported
- Electron Cash plugin interfaces. Valid values to include are ``qt``,
- ``kivy`` and ``cmdline``.
+ Electron Cash plugin interfaces. Valid values to include are ``qt`` and
+ ``cmdline``.
If you do not include these fields in your manifest file, then the user will
see an error message when they try and install it.
diff --git a/plugins/__init__.py b/electroncash_plugins/__init__.py
similarity index 100%
rename from plugins/__init__.py
rename to electroncash_plugins/__init__.py
diff --git a/plugins/audio_modem/__init__.py b/electroncash_plugins/audio_modem/__init__.py
similarity index 86%
rename from plugins/audio_modem/__init__.py
rename to electroncash_plugins/audio_modem/__init__.py
index 4c776b1c9f83..4d4a4547e93e 100644
--- a/plugins/audio_modem/__init__.py
+++ b/electroncash_plugins/audio_modem/__init__.py
@@ -1,7 +1,7 @@
from electroncash.i18n import _
fullname = _('Audio MODEM')
-description = _('Provides support for air-gapped transaction signing.')
+description = _('Provides support for air-gapped transaction signing.') + ' ' + _('Linux only.')
requires = [('amodem', 'http://github.com/romanz/amodem/')]
available_for = ['qt']
diff --git a/plugins/audio_modem/qt.py b/electroncash_plugins/audio_modem/qt.py
similarity index 83%
rename from plugins/audio_modem/qt.py
rename to electroncash_plugins/audio_modem/qt.py
index 8973eae1e972..1f839f27b717 100644
--- a/plugins/audio_modem/qt.py
+++ b/electroncash_plugins/audio_modem/qt.py
@@ -14,16 +14,29 @@
from PyQt5.QtCore import *
from PyQt5.QtWidgets import (QComboBox, QGridLayout, QLabel, QPushButton)
-try:
- import amodem.audio
- import amodem.main
- import amodem.config
- print_error('Audio MODEM is available.')
- amodem.log.addHandler(amodem.logging.StreamHandler(sys.stderr))
- amodem.log.setLevel(amodem.logging.INFO)
-except ImportError:
+
+PLATFORM_LIBS = {
+ 'Linux': 'libportaudio.so',
+}
+
+err_reason = 'Audio MODEM is available.'
+
+if platform.system() in PLATFORM_LIBS:
+ try:
+ import amodem.audio
+ import amodem.main
+ import amodem.config
+ print_error(err_reason)
+ amodem.log.addHandler(amodem.logging.StreamHandler(sys.stderr))
+ amodem.log.setLevel(amodem.logging.INFO)
+ except ImportError:
+ amodem = None
+ err_reason = 'Audio MODEM is not found.'
+ print_error(err_reason)
+else:
amodem = None
- print_error('Audio MODEM is not found.')
+ err_reason = "Audio modem plugin is not available for this platform"
+ print_error(err_reason)
class Plugin(BasePlugin):
@@ -32,9 +45,7 @@ def __init__(self, parent, config, name):
BasePlugin.__init__(self, parent, config, name)
if self.is_available():
self.modem_config = amodem.config.slowest()
- self.library_name = {
- 'Linux': 'libportaudio.so'
- }[platform.system()]
+ self.library_name = PLATFORM_LIBS[platform.system()]
def is_available(self):
return amodem is not None
@@ -46,6 +57,9 @@ def settings_widget(self, window):
return EnterButton(_('Settings'), partial(self.settings_dialog, window))
def settings_dialog(self, window):
+ if not self.is_available():
+ window.show_error(err_reason)
+ return
d = WindowModalDialog(window, _("Audio Modem Settings"))
layout = QGridLayout(d)
diff --git a/plugins/cosigner_pool/__init__.py b/electroncash_plugins/cosigner_pool/__init__.py
similarity index 92%
rename from plugins/cosigner_pool/__init__.py
rename to electroncash_plugins/cosigner_pool/__init__.py
index 5895b93f528e..914f89432499 100644
--- a/plugins/cosigner_pool/__init__.py
+++ b/electroncash_plugins/cosigner_pool/__init__.py
@@ -1,9 +1,9 @@
from electroncash.i18n import _
fullname = _('Cosigner Pool')
-description = ' '.join([
+description = [
_("This plugin facilitates the use of multi-signatures wallets."),
_("It sends and receives partially signed transactions from/to your cosigner wallet."),
_("Transactions are encrypted and stored on a remote server.")
-])
+]
#requires_wallet_type = ['2of2', '2of3']
available_for = ['qt']
diff --git a/plugins/cosigner_pool/qt.py b/electroncash_plugins/cosigner_pool/qt.py
similarity index 100%
rename from plugins/cosigner_pool/qt.py
rename to electroncash_plugins/cosigner_pool/qt.py
diff --git a/plugins/digitalbitbox/__init__.py b/electroncash_plugins/digitalbitbox/__init__.py
similarity index 100%
rename from plugins/digitalbitbox/__init__.py
rename to electroncash_plugins/digitalbitbox/__init__.py
diff --git a/plugins/digitalbitbox/cmdline.py b/electroncash_plugins/digitalbitbox/cmdline.py
similarity index 100%
rename from plugins/digitalbitbox/cmdline.py
rename to electroncash_plugins/digitalbitbox/cmdline.py
diff --git a/plugins/digitalbitbox/digitalbitbox.py b/electroncash_plugins/digitalbitbox/digitalbitbox.py
similarity index 99%
rename from plugins/digitalbitbox/digitalbitbox.py
rename to electroncash_plugins/digitalbitbox/digitalbitbox.py
index 947758cf43f8..92e5faef4f0e 100644
--- a/plugins/digitalbitbox/digitalbitbox.py
+++ b/electroncash_plugins/digitalbitbox/digitalbitbox.py
@@ -509,7 +509,7 @@ def sign_message(self, sequence, message, password):
return sig
- def sign_transaction(self, tx, password):
+ def sign_transaction(self, tx, password, *, use_cache=False):
if tx.is_complete():
return
@@ -542,10 +542,9 @@ def sign_transaction(self, tx, password):
# Build pubkeyarray from outputs
for _type, address, amount in tx.outputs():
- assert _type == TYPE_ADDRESS
info = tx.output_info.get(address)
if info is not None:
- index, xpubs, m = info
+ index, xpubs, m, script_type = info
changePath = self.get_derivation() + "/%d/%d" % index
changePubkey = self.derive_pubkey(index[0], index[1])
pubkeyarray_i = {'pubkey': changePubkey, 'keypath': changePath}
@@ -557,7 +556,7 @@ def sign_transaction(self, tx, password):
if p2pkhTransaction:
class CustomTXSerialization(Transaction):
@classmethod
- def input_script(self, txin, estimate_size=False):
+ def input_script(self, txin, estimate_size=False, sign_schnorr=False):
if txin['type'] == 'p2pkh':
return Transaction.get_preimage_script(txin)
if txin['type'] == 'p2sh':
@@ -652,7 +651,7 @@ def input_script(self, txin, estimate_size=False):
sig_r = int(signed['sig'][:64], 16)
sig_s = int(signed['sig'][64:], 16)
sig = sigencode_der(sig_r, sig_s, generator_secp256k1.order())
- txin['signatures'][ii] = to_hexstr(sig) + int_to_hex(Transaction.nHashType() & 255, 1)
+ txin['signatures'][ii] = to_hexstr(sig) + '41'
tx._inputs[i] = txin
except UserCancelled:
raise
diff --git a/plugins/digitalbitbox/qt.py b/electroncash_plugins/digitalbitbox/qt.py
similarity index 100%
rename from plugins/digitalbitbox/qt.py
rename to electroncash_plugins/digitalbitbox/qt.py
diff --git a/plugins/email_requests/__init__.py b/electroncash_plugins/email_requests/__init__.py
similarity index 100%
rename from plugins/email_requests/__init__.py
rename to electroncash_plugins/email_requests/__init__.py
diff --git a/plugins/email_requests/qt.py b/electroncash_plugins/email_requests/qt.py
similarity index 64%
rename from plugins/email_requests/qt.py
rename to electroncash_plugins/email_requests/qt.py
index f590395f950d..69369e8025f0 100644
--- a/plugins/email_requests/qt.py
+++ b/electroncash_plugins/email_requests/qt.py
@@ -25,6 +25,7 @@
import time
import threading
+import queue
import base64
from functools import partial
@@ -35,29 +36,35 @@
from email.mime.base import MIMEBase
from email.encoders import encode_base64
-from PyQt5.QtGui import *
from PyQt5.QtCore import *
-import PyQt5.QtGui as QtGui
-from PyQt5.QtWidgets import (QVBoxLayout, QLabel, QGridLayout, QLineEdit)
+from PyQt5.QtGui import *
+from PyQt5.QtWidgets import *
from electroncash.plugins import BasePlugin, hook
from electroncash.paymentrequest import PaymentRequest
from electroncash.i18n import _
from electroncash_gui.qt.util import EnterButton, Buttons, CloseButton
from electroncash_gui.qt.util import OkButton, WindowModalDialog
-from electroncash.util import Weak
+from electroncash.util import Weak, PrintError
-class Processor(threading.Thread):
+class Processor(threading.Thread, PrintError):
polling_interval = 5*60
- def __init__(self, imap_server, username, password, callback):
+ instance = None
+
+ def __init__(self, imap_server, username, password, callback, error_callback):
threading.Thread.__init__(self)
+ Processor.instance = self
self.daemon = True
self.username = username
self.password = password
self.imap_server = imap_server
self.on_receive = callback
+ self.on_error = error_callback
+ self.q = queue.Queue()
+
+ def diagnostic_name(self): return "Email.Processor"
def poll(self):
try:
@@ -82,13 +89,26 @@ def poll(self):
self.on_receive(pr_str)
def run(self):
- self.M = imaplib.IMAP4_SSL(self.imap_server)
- self.M.login(self.username, self.password)
- while True:
- self.poll()
- time.sleep(self.polling_interval)
- self.M.close()
- self.M.logout()
+ try:
+ self.M = imaplib.IMAP4_SSL(self.imap_server)
+ self.M.login(self.username, self.password)
+ except Exception as e:
+ self.print_error("Exception encountered, stopping plugin thread:", repr(e))
+ self.on_error(_("Email plugin could not connect to {server} as {username}, IMAP receive thread stopped.").format(server=self.imap_server, username=self.username))
+ return
+ try:
+ while Processor.instance is self:
+ self.poll()
+ try:
+ self.q.get(timeout=self.polling_interval) # sleep for polling_interval seconds
+ return # if we get here, we were stopped
+ except queue.Empty:
+ ''' If we get here, we slept for polling_interval seconds '''
+ self.M.close()
+ self.M.logout()
+ except Exception as e:
+ self.print_error("Exception encountered, stopping plugin thread:", repr(e))
+ self.on_error(_("Email plugin encountered an error, plugin stopped."))
def send(self, recipient, message, payment_request):
msg = MIMEMultipart()
@@ -106,8 +126,9 @@ def send(self, recipient, message, payment_request):
s.quit()
-class QEmailSignalObject(QObject):
+class EmailSignalObject(QObject):
email_new_invoice_signal = pyqtSignal()
+ email_error = pyqtSignal(str)
class Plugin(BasePlugin):
@@ -127,36 +148,61 @@ def __init__(self, parent, config, name):
self.username = self.config.get('email_username', '')
self.password = self.config.get('email_password', '')
if self.imap_server and self.username and self.password:
- self.processor = Processor(self.imap_server, self.username, self.password, self.on_receive)
+ self.processor = Processor(self.imap_server, self.username, self.password, self.on_receive, self.on_error)
self.processor.start()
- self.obj = QEmailSignalObject()
+ else:
+ self.processor = None
+ self.obj = EmailSignalObject()
self.obj.email_new_invoice_signal.connect(self.new_invoice)
+ self.obj.email_error.connect(self.on_error_qt)
+
+ def on_close(self):
+ ''' called on plugin close '''
+ Processor.instance = None # tells thread that it is defunct
+ if self.processor and self.processor.is_alive():
+ self.processor.q.put(None) # signal stop
+ self.processor.join(timeout=1.0)
def on_receive(self, pr_str):
self.print_error('received payment request')
self.pr = PaymentRequest(pr_str)
self.obj.email_new_invoice_signal.emit()
+ def on_error(self, err):
+ self.obj.email_error.emit(err)
+
+ def on_error_qt(self, err):
+ QMessageBox.warning(None, _("Email Error"), err)
+
def new_invoice(self):
self.parent.invoices.add(self.pr)
#window.update_invoices_list()
@hook
def receive_list_menu(self, menu, addr):
- window = menu.parentWidget()
+ window = menu.parentWidget().parent # Grr. Electrum programmers overwrote parent() method.
menu.addAction(_("Send via e-mail"), lambda: self.send(window, addr))
def send(self, window, addr):
+ if not self.processor:
+ window.show_warning(_('The email plugin is enabled but not configured. Please go to its settings and configure it, or disable it if you do not wish to use it.'))
+ return
from electroncash import paymentrequest
r = window.wallet.receive_requests.get(addr)
message = r.get('memo', '')
- if r.get('signature'):
- pr = paymentrequest.serialize_request(r)
- else:
- pr = paymentrequest.make_request(self.config, r)
+ try:
+ if r.get('signature'):
+ pr = paymentrequest.serialize_request(r)
+ else:
+ pr = paymentrequest.make_request(self.config, r)
+ except ValueError as e:
+ ''' Bad data such as out-of-range amount, see #1738 '''
+ self.print_error('Error serializing request:', repr(e))
+ window.show_error(str(e))
+ return
if not pr:
return
- recipient, ok = QtGui.QInputDialog.getText(window, 'Send request', 'Email invoice to:')
+ recipient, ok = QInputDialog.getText(window, _('Send request'), _('Email invoice to:'))
if not ok:
return
recipient = str(recipient)
@@ -164,8 +210,13 @@ def send(self, window, addr):
self.print_error('sending mail to', recipient)
try:
self.processor.send(recipient, message, payload)
- except BaseException as e:
- window.show_message(str(e))
+ except Exception as e:
+ self.print_error("Exception sending:", repr(e))
+ # NB; we don't want to actually display the exception message here
+ # because it may contain text from the server, which could be a
+ # potential phishing attack surface. So instead we show the user
+ # the exception name which is something like ConnectionRefusedError.
+ window.show_error(_("Could not send email to {recipient}: {reason}").format(recipient=recipient, reason=type(e).__name__))
return
window.show_message(_('Request sent.'))
@@ -185,7 +236,7 @@ def settings_dialog(self, windowRef):
d.setMinimumSize(500, 200)
vbox = QVBoxLayout(d)
- vbox.addWidget(QLabel(_('Server hosting your email acount')))
+ vbox.addWidget(QLabel(_('Server hosting your email account')))
grid = QGridLayout()
vbox.addLayout(grid)
grid.addWidget(QLabel('Server (IMAP)'), 0, 0)
@@ -217,3 +268,4 @@ def settings_dialog(self, windowRef):
password = str(password_e.text())
self.config.set_key('email_password', password)
+ window.show_message(_('Please restart the plugin to activate the new settings'))
diff --git a/electroncash_plugins/fusion/Cash Fusion Logo - No Text Gray.svg b/electroncash_plugins/fusion/Cash Fusion Logo - No Text Gray.svg
new file mode 100644
index 000000000000..758a378db91c
--- /dev/null
+++ b/electroncash_plugins/fusion/Cash Fusion Logo - No Text Gray.svg
@@ -0,0 +1 @@
+