Hello community, here is the log from the commit of package anki for openSUSE:Factory checked in at 2019-06-01 09:47:51 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/anki (Old) and /work/SRC/openSUSE:Factory/.anki.new.5148 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "anki" Sat Jun 1 09:47:51 2019 rev:10 rq:705905 version:2.1.13 Changes: -------- --- /work/SRC/openSUSE:Factory/anki/anki.changes 2019-05-22 11:18:27.410447206 +0200 +++ /work/SRC/openSUSE:Factory/.anki.new.5148/anki.changes 2019-06-01 09:47:54.723356809 +0200 @@ -1,0 +2,22 @@ +Tue May 28 10:49:24 UTC 2019 - mvetter@suse.com + +- Update to 2.1.13: + * Fix formatting getting lost when copying&pasting between fields on macOS. + * Fix some issues that cause the main window to get stuck. + * Fix an empty deck list sometimes appearing when restoring from a backup. + * Fix Anki hanging after an error occurs during startup. + * Fix error caused by profile with trailing space on Windows. + * Fix error message when syncing with an unconfirmed email address. + * Use jsonschema for add-on manifests (thanks to Erez). + * Warn in DB check when high due numbers are encountered. + * Improve error messages on full disk and failed add-on deletion. + * Fix relearning cards being given learning step count in V2 scheduler. + * Fix preview window failing to appear when show both sides enabled. + * Removing trailing BR tag when pasting into an empty field. + * Don’t throw an error when non-Latin text in the Javascript console can’t be shown. + * Double click on add-ons to edit their configuration (thanks to lovac42). + * Fix the window icon in a few screens (thanks to John). + * Don’t highlight the deck selection button in the add screen on Windows. + * Improve the default type in the answer note type. + +------------------------------------------------------------------- Old: ---- anki-2.1.12-source.tgz New: ---- anki-2.1.13-source.tgz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ anki.spec ++++++ --- /var/tmp/diff_new_pack.dz6OmW/_old 2019-06-01 09:47:55.451356560 +0200 +++ /var/tmp/diff_new_pack.dz6OmW/_new 2019-06-01 09:47:55.451356560 +0200 @@ -12,13 +12,13 @@ # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. -# Please submit bugfixes or comments via https://bugs.opensuse.org/ +# Please submit bugfixes or comments via http://bugs.opensuse.org/ # %bcond_without tests Name: anki -Version: 2.1.12 +Version: 2.1.13 Release: 0 Summary: Spaced-Repetition Memory Training Program License: AGPL-3.0-only @@ -35,14 +35,19 @@ BuildRequires: python3-Send2Trash BuildRequires: python3-beautifulsoup4 BuildRequires: python3-decorator +BuildRequires: python3-jsonschema +BuildRequires: python3-mock BuildRequires: python3-qt5-devel +BuildRequires: python3-qtwebengine-qt5 BuildRequires: python3-requests Requires: python3-Markdown Requires: python3-PyAudio Requires: python3-Send2Trash Requires: python3-beautifulsoup4 Requires: python3-decorator +Requires: python3-jsonschema Requires: python3-qt5 +Requires: python3-qtwebengine-qt5 Requires: python3-requests Suggests: lame Suggests: mpv ++++++ anki-2.1.12-source.tgz -> anki-2.1.13-source.tgz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/README.development new/anki-2.1.13/README.development --- old/anki-2.1.12/README.development 2019-02-26 00:45:07.000000000 +0100 +++ new/anki-2.1.13/README.development 2019-04-29 04:40:16.000000000 +0200 @@ -58,10 +58,10 @@ If you get any errors, please make sure you don't have an older version of Anki installed in a system location. -To run the unit tests, you will need to install nose from your distro, or -with pip: +To run the unit tests, you will need to install nose and mock from your +distro, or with pip: -$ pip3 install nose +$ pip3 install nose mock Before contributing code, please read README.contributing. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/anki/__init__.py new/anki-2.1.13/anki/__init__.py --- old/anki-2.1.12/anki/__init__.py 2019-04-15 04:17:36.000000000 +0200 +++ new/anki-2.1.13/anki/__init__.py 2019-04-29 06:51:16.000000000 +0200 @@ -10,6 +10,6 @@ if sys.getfilesystemencoding().lower() in ("ascii", "ansi_x3.4-1968"): raise Exception("Anki requires a UTF-8 locale.") -version="2.1.12" # build scripts grep this line, so preserve formatting +version="2.1.13" # build scripts grep this line, so preserve formatting from anki.storage import Collection __all__ = ["Collection"] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/anki/buildhash.py new/anki-2.1.13/anki/buildhash.py --- old/anki-2.1.12/anki/buildhash.py 2019-04-21 12:03:30.000000000 +0200 +++ new/anki-2.1.13/anki/buildhash.py 2019-05-17 07:32:19.000000000 +0200 @@ -1 +1 @@ -build='eef86bf3' +build='3ba55990' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/anki/collection.py new/anki-2.1.13/anki/collection.py --- old/anki-2.1.12/anki/collection.py 2019-04-21 09:58:45.000000000 +0200 +++ new/anki-2.1.13/anki/collection.py 2019-04-29 10:14:24.000000000 +0200 @@ -754,6 +754,7 @@ def fixIntegrity(self): "Fix possible problems and rebuild caches." problems = [] + curs = self.db.cursor() self.save() oldSize = os.stat(self.path)[stat.ST_SIZE] if self.db.scalar("pragma integrity_check") != "ok": @@ -847,10 +848,13 @@ # field cache for m in self.models.all(): self.updateFieldCache(self.models.nids(m)) - # new cards can't have a due position > 32 bits - self.db.execute(""" -update cards set due = 1000000, mod = ?, usn = ? where due > 1000000 -and type = 0""", intTime(), self.usn()) + # new cards can't have a due position > 32 bits, so wrap items over + # 2 million back to 1 million + curs.execute(""" +update cards set due=1000000+due%1000000,mod=?,usn=? where due>=1000000 +and type=0""", [intTime(), self.usn()]) + if curs.rowcount: + problems.append("Found %d new cards with a due number >= 1,000,000 - consider repositioning them in the Browse screen." % curs.rowcount) # new card position self.conf['nextPos'] = self.db.scalar( "select max(due)+1 from cards where type = 0") or 0 @@ -863,8 +867,6 @@ "update cards set due = ?, ivl = 1, mod = ?, usn = ? where id in %s" % ids2str(ids), self.sched.today, intTime(), self.usn()) # v2 sched had a bug that could create decimal intervals - curs = self.db.cursor() - curs.execute("update cards set ivl=round(ivl),due=round(due) where ivl!=round(ivl) or due!=round(due)") if curs.rowcount: problems.append("Fixed %d cards with v2 scheduler bug." % curs.rowcount) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/anki/mpv.py new/anki-2.1.13/anki/mpv.py --- old/anki-2.1.12/anki/mpv.py 2019-04-21 10:07:23.000000000 +0200 +++ new/anki-2.1.13/anki/mpv.py 2019-04-29 06:39:10.000000000 +0200 @@ -197,6 +197,7 @@ """Start up the communication threads. """ self._thread = threading.Thread(target=self._reader) + self._thread.daemon = True self._thread.start() def _stop_thread(self): @@ -450,6 +451,7 @@ """ super()._start_thread() self._event_thread = threading.Thread(target=self._event_reader) + self._event_thread.daemon = True self._event_thread.start() def _stop_thread(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/anki/schedv2.py new/anki-2.1.13/anki/schedv2.py --- old/anki-2.1.12/anki/schedv2.py 2019-03-09 23:22:42.000000000 +0100 +++ new/anki-2.1.13/anki/schedv2.py 2019-04-30 01:26:42.000000000 +0200 @@ -658,7 +658,7 @@ card.type = 2 def _startingLeft(self, card): - if card.type == 2: + if card.type == 3: conf = self._lapseConf(card) else: conf = self._lrnConf(card) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/anki/sound.py new/anki-2.1.13/anki/sound.py --- old/anki-2.1.12/anki/sound.py 2019-04-15 04:17:36.000000000 +0200 +++ new/anki-2.1.13/anki/sound.py 2019-04-29 06:39:10.000000000 +0200 @@ -135,6 +135,7 @@ mpvManager = MpvManager() _player = mpvManager.queueFile _queueEraser = mpvManager.clearQueue + atexit.register(cleanupMPV) def cleanupMPV(): global mpvManager, _player, _queueEraser diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/anki/stdmodels.py new/anki-2.1.13/anki/stdmodels.py --- old/anki-2.1.12/anki/stdmodels.py 2019-02-26 00:45:07.000000000 +0100 +++ new/anki-2.1.13/anki/stdmodels.py 2019-05-14 09:05:15.000000000 +0200 @@ -37,8 +37,8 @@ fm = mm.newField(_("Back")) mm.addField(m, fm) t = mm.newTemplate(_("Card 1")) - t['qfmt'] = "{{"+_("Front")+"}}\n{{type:"+_("Back")+"}}" - t['afmt'] = "{{FrontSide}}\n\n<hr id=answer>\n\n"+"{{"+_("Back")+"}}" + t['qfmt'] = "{{"+_("Front")+"}}\n\n{{type:"+_("Back")+"}}" + t['afmt'] = "{{"+_("Front")+"}}\n\n<hr id=answer>\n\n{{type:"+_("Back")+"}}" mm.addTemplate(m, t) mm.add(m) return m diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/aqt/addons.py new/anki-2.1.13/aqt/addons.py --- old/anki-2.1.12/aqt/addons.py 2019-04-16 09:37:00.000000000 +0200 +++ new/anki-2.1.13/aqt/addons.py 2019-05-15 08:09:11.000000000 +0200 @@ -8,6 +8,8 @@ from collections import defaultdict import markdown from send2trash import send2trash +import jsonschema +from jsonschema.exceptions import ValidationError from aqt.qt import * from aqt.utils import showInfo, openFolder, isWin, openLink, \ @@ -24,12 +26,19 @@ class AddonManager: ext = ".ankiaddon" - # todo?: use jsonschema package _manifest_schema = { - "package": {"type": str, "req": True, "meta": False}, - "name": {"type": str, "req": True, "meta": True}, - "mod": {"type": int, "req": False, "meta": True}, - "conflicts": {"type": list, "req": False, "meta": True} + "type": "object", + "properties": { + "package": {"type": "string", "meta": False}, + "name": {"type": "string", "meta": True}, + "mod": {"type": "number", "meta": True}, + "conflicts": { + "type": "array", + "items": {"type": "string"}, + "meta": True + } + }, + "required": ["package", "name"] } def __init__(self, mw): @@ -161,18 +170,15 @@ # Installing and deleting add-ons ###################################################################### - def _readManifestFile(self, zfile): + def readManifestFile(self, zfile): try: with zfile.open("manifest.json") as f: data = json.loads(f.read()) - manifest = {} # build new manifest from recognized keys - for key, attrs in self._manifest_schema.items(): - if not attrs["req"] and key not in data: - continue - val = data[key] - assert isinstance(val, attrs["type"]) - manifest[key] = val - except (KeyError, json.decoder.JSONDecodeError, AssertionError): + jsonschema.validate(data, self._manifest_schema) + # build new manifest from recognized keys + schema = self._manifest_schema["properties"] + manifest = {key: data[key] for key in data.keys() & schema.keys()} + except (KeyError, json.decoder.JSONDecodeError, ValidationError): # raised for missing manifest, invalid json, missing/invalid keys return {} return manifest @@ -187,7 +193,7 @@ return False, "zip" with zfile: - file_manifest = self._readManifestFile(zfile) + file_manifest = self.readManifestFile(zfile) if manifest: file_manifest.update(manifest) manifest = file_manifest @@ -200,7 +206,7 @@ meta = self.addonMeta(package) self._install(package, zfile) - schema = self._manifest_schema + schema = self._manifest_schema["properties"] manifest_meta = {k: v for k, v in manifest.items() if k in schema and schema[k]["meta"]} meta.update(manifest_meta) @@ -213,7 +219,9 @@ base = self.addonsFolder(dir) if os.path.exists(base): self.backupUserFiles(dir) - self.deleteAddon(dir) + if not self.deleteAddon(dir): + self.restoreUserFiles(dir) + return os.mkdir(base) self.restoreUserFiles(dir) @@ -230,8 +238,15 @@ continue zfile.extract(n, base) + # true on success def deleteAddon(self, dir): - send2trash(self.addonsFolder(dir)) + try: + send2trash(self.addonsFolder(dir)) + return True + except OSError as e: + showWarning(_("Unable to update or delete add-on. Please start Anki while holding down the shift key to temporarily disable add-ons, then try again.\n\nDebug info: %s") % e, + textFormat="plain") + return False # Processing local add-on files ###################################################################### @@ -453,6 +468,7 @@ f.viewFiles.clicked.connect(self.onViewFiles) f.delete_2.clicked.connect(self.onDelete) f.config.clicked.connect(self.onConfig) + self.form.addonList.itemDoubleClicked.connect(self.onConfig) self.form.addonList.currentRowChanged.connect(self._onAddonItemSelected) self.setAcceptDrops(True) self.redrawAddons() @@ -557,7 +573,8 @@ dict(num=len(selected))): return for dir in selected: - self.mgr.deleteAddon(dir) + if not self.mgr.deleteAddon(dir): + break self.form.addonList.clearSelection() self.redrawAddons() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/aqt/browser.py new/anki-2.1.13/aqt/browser.py --- old/anki-2.1.12/aqt/browser.py 2019-04-15 04:19:10.000000000 +0200 +++ new/anki-2.1.13/aqt/browser.py 2019-05-17 07:15:41.000000000 +0200 @@ -1300,9 +1300,9 @@ self.previewShowBothSides.setShortcut(QKeySequence("B")) self.previewShowBothSides.setToolTip(_("Shortcut key: %s" % "B")) bbox.addButton(self.previewShowBothSides, QDialogButtonBox.ActionRole) - self.previewShowBothSides.toggled.connect(self._onPreviewShowBothSides) self._previewBothSides = self.col.conf.get("previewBothSides", False) self.previewShowBothSides.setChecked(self._previewBothSides) + self.previewShowBothSides.toggled.connect(self._onPreviewShowBothSides) self._setupPreviewWebview() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/aqt/deckbrowser.py new/anki-2.1.13/aqt/deckbrowser.py --- old/anki-2.1.12/aqt/deckbrowser.py 2019-03-09 23:22:42.000000000 +0100 +++ new/anki-2.1.13/aqt/deckbrowser.py 2019-04-29 08:53:59.000000000 +0200 @@ -85,6 +85,7 @@ def _renderPage(self, reuse=False): if not reuse: self._dueTree = self.mw.col.sched.deckDueTree() + self.__renderPage(None) self.web.evalWithCallback("window.pageYOffset", self.__renderPage) def __renderPage(self, offset): @@ -96,7 +97,8 @@ js=["jquery.js", "jquery-ui.js", "deckbrowser.js"]) self.web.key = "deckBrowser" self._drawButtons() - self._scrollToOffset(offset) + if offset is not None: + self._scrollToOffset(offset) def _scrollToOffset(self, offset): self.web.eval("$(function() { window.scrollTo(0, %d, 'instant'); });" % offset) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/aqt/deckchooser.py new/anki-2.1.13/aqt/deckchooser.py --- old/anki-2.1.12/aqt/deckchooser.py 2019-03-09 23:22:42.000000000 +0100 +++ new/anki-2.1.13/aqt/deckchooser.py 2019-05-15 06:48:40.000000000 +0200 @@ -27,6 +27,7 @@ self.addWidget(self.deckLabel) # decks box self.deck = QPushButton(clicked=self.onDeckChange) + self.deck.setAutoDefault(False) self.deck.setToolTip(shortcut(_("Target Deck (Ctrl+D)"))) s = QShortcut(QKeySequence(_("Ctrl+D")), self.widget, activated=self.onDeckChange) self.addWidget(self.deck) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/aqt/editor.py new/anki-2.1.13/aqt/editor.py --- old/anki-2.1.12/aqt/editor.py 2019-04-16 10:53:44.000000000 +0200 +++ new/anki-2.1.13/aqt/editor.py 2019-05-14 09:00:13.000000000 +0200 @@ -991,7 +991,7 @@ # add a comment in the clipboard html so we can tell text is copied # from us and doesn't need to be stripped clip = self.editor.mw.app.clipboard() - if not clip.ownsClipboard(): + if not isMac and not clip.ownsClipboard(): return mime = clip.mimeData() if not mime.hasHtml(): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/aqt/errors.py new/anki-2.1.13/aqt/errors.py --- old/anki-2.1.12/aqt/errors.py 2019-04-15 04:17:36.000000000 +0200 +++ new/anki-2.1.13/aqt/errors.py 2019-04-29 10:35:59.000000000 +0200 @@ -80,7 +80,7 @@ return showWarning(self.tempFolderMsg()) if "Beautiful Soup is not an HTTP client" in error: return - if "database or disk is full" in error: + if "database or disk is full" in error or "Errno 28" in error: return showWarning(_("Your computer's storage may be full. Please delete some unneeded files, then try again.")) if "disk I/O error" in error: return showWarning(_("""\ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/aqt/forms/addcards.py new/anki-2.1.13/aqt/forms/addcards.py --- old/anki-2.1.12/aqt/forms/addcards.py 2019-03-04 08:53:14.000000000 +0100 +++ new/anki-2.1.13/aqt/forms/addcards.py 2019-05-17 07:26:24.000000000 +0200 @@ -13,6 +13,9 @@ def setupUi(self, Dialog): Dialog.setObjectName("Dialog") Dialog.resize(453, 366) + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap(":/icons/anki.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + Dialog.setWindowIcon(icon) self.verticalLayout = QtWidgets.QVBoxLayout(Dialog) self.verticalLayout.setContentsMargins(12, 6, 12, 12) self.verticalLayout.setSpacing(3) @@ -57,3 +60,4 @@ _translate = QtCore.QCoreApplication.translate Dialog.setWindowTitle(_("Add")) +from . import icons_rc diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/aqt/forms/browser.py new/anki-2.1.13/aqt/forms/browser.py --- old/anki-2.1.12/aqt/forms/browser.py 2019-03-11 04:34:30.000000000 +0100 +++ new/anki-2.1.13/aqt/forms/browser.py 2019-05-17 07:26:24.000000000 +0200 @@ -14,6 +14,9 @@ Dialog.setObjectName("Dialog") Dialog.resize(750, 493) Dialog.setMinimumSize(QtCore.QSize(400, 400)) + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap(":/icons/anki.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + Dialog.setWindowIcon(icon) self.centralwidget = QtWidgets.QWidget(Dialog) self.centralwidget.setObjectName("centralwidget") self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.centralwidget) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/aqt/forms/editcurrent.py new/anki-2.1.13/aqt/forms/editcurrent.py --- old/anki-2.1.12/aqt/forms/editcurrent.py 2019-03-04 08:53:15.000000000 +0100 +++ new/anki-2.1.13/aqt/forms/editcurrent.py 2019-05-17 07:26:24.000000000 +0200 @@ -13,6 +13,9 @@ def setupUi(self, Dialog): Dialog.setObjectName("Dialog") Dialog.resize(400, 300) + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap(":/icons/anki.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + Dialog.setWindowIcon(icon) self.verticalLayout = QtWidgets.QVBoxLayout(Dialog) self.verticalLayout.setContentsMargins(12, 12, 12, 12) self.verticalLayout.setSpacing(3) @@ -35,3 +38,4 @@ _translate = QtCore.QCoreApplication.translate Dialog.setWindowTitle(_("Dialog")) +from . import icons_rc diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/aqt/forms/icons_rc.py new/anki-2.1.13/aqt/forms/icons_rc.py --- old/anki-2.1.12/aqt/forms/icons_rc.py 2019-04-21 12:02:41.000000000 +0200 +++ new/anki-2.1.13/aqt/forms/icons_rc.py 2019-05-17 07:31:20.000000000 +0200 @@ -2,217 +2,13 @@ # Resource object code # -# Created by: The Resource Compiler for PyQt5 (Qt v5.12.1) +# Created by: The Resource Compiler for PyQt5 (Qt v5.12.3) # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore qt_resource_data = b"\ -\x00\x00\x02\xd7\ -\x89\ -\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x00\x3c\x00\x00\x00\x3c\x08\x06\x00\x00\x00\x3a\xfc\xd9\x72\ -\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ -\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ -\x79\x71\xc9\x65\x3c\x00\x00\x02\x79\x49\x44\x41\x54\x78\xda\xec\ -\x9a\xd1\x6d\xc2\x30\x10\x40\x0d\x62\x80\x6c\x40\x3a\x01\xde\xa0\ -\x19\x21\x23\xa4\x13\xc0\x06\xf5\x06\xa8\x13\xa4\x1b\xa4\x1b\x44\ -\x4c\x10\x98\x20\x6c\x10\x36\x68\x8d\xe4\x48\xc8\x75\x82\xef\xb0\ -\x0f\x87\xf8\xa4\xfb\x31\x89\xc3\xf3\x9d\xed\xbb\xb3\x17\x8c\x56\ -\xb8\xd4\x5c\xea\x46\x6a\xa2\xda\x2e\x52\x4f\x52\x7f\xa4\x1e\xd9\ -\x8b\xc8\x15\xb2\x91\xfa\x7b\x47\x5b\xf5\xec\x64\xe5\x6a\xc5\xca\ -\x02\x54\xd7\xea\xc6\x03\x26\x05\xdb\x20\x60\x7b\x6d\xd4\x14\x98\ -\x05\x6c\xaf\xdd\x54\x2c\xed\x02\xf6\xd6\xd2\x41\x8b\x70\x08\xdb\ -\xab\x08\x15\x36\xf5\x00\xdb\x6b\x1a\x22\x70\xe9\x11\xb8\x9e\x93\ -\x75\x9d\x59\x79\xe9\x10\x78\x4b\x30\xa8\xdb\x90\x2c\xdc\x12\x58\ -\xb8\x0b\x05\x96\x13\xc0\xf6\xca\x43\x70\xe9\x8c\x38\x2e\x47\xcb\ -\xea\x0e\x04\x57\x19\xcc\x59\xe9\x90\x6c\x08\x81\x37\x3e\x81\x3f\ -\xb5\xb6\x2b\xfc\x97\xd4\x6f\xc3\x0a\x4d\xb9\x1b\xe8\x61\x6c\xae\ -\xda\xfb\xb4\x93\xab\xb4\xf3\x0d\x02\x3c\x34\x57\xd3\x27\xbb\x34\ -\x1f\xd8\xff\x4d\xf1\x3c\x68\x0e\xbf\x0f\xb4\x87\x96\xa4\x5f\x7c\ -\x2f\x5a\x17\x36\x61\x59\xb2\x99\xc9\x12\x61\xc9\xf4\x55\x81\x4f\ -\x13\x01\x4e\x7c\xbb\xf4\xfa\xc9\x0b\xd9\xd1\x62\xd5\x1e\xfc\x4f\ -\x4b\x40\xc7\x63\x1f\x38\x3f\x71\x55\xe6\x90\x29\x89\x05\x4e\x2c\ -\xdd\xdf\x87\x1c\x2c\x23\xaf\x03\xa6\xf3\x6e\x20\x80\xcf\x0d\x81\ -\x07\x55\xf2\x90\x21\xff\xa3\x95\x0c\xd5\x94\x4b\xc0\xe0\xf8\x4c\ -\x0f\xf3\x91\x67\x51\xd5\xce\x02\xd0\x61\x49\x00\x5c\x5a\x7e\x13\ -\x5d\xe9\x4c\x98\x7d\x25\x91\x13\xbb\xf3\x58\x49\x69\xf7\xc8\x22\ -\x51\x31\xfb\x22\x79\x4d\x58\xc4\x2b\x7d\xd5\xbe\x32\x80\x95\xb3\ -\x00\xac\x5b\xfa\xae\x57\x71\x82\xb9\x5c\x01\x3c\xc9\x49\xaa\x3a\ -\xb6\x1a\x36\x9a\x6b\x27\x8e\x0b\x7a\xad\xd6\xbf\x60\x44\xb5\xeb\ -\x1a\xe0\x46\xdc\xd1\x36\xd5\x69\x1e\x94\xfb\x2c\xf0\x41\x2b\x93\ -\xae\xa1\x75\xd8\x7b\xfd\xed\x7d\x84\x75\x02\x01\x8d\x39\x49\x6c\ -\x80\xb0\x2d\xf3\x78\xac\x5a\x33\xd8\xe9\x7d\xa2\x06\xaa\xb3\xb4\ -\xaa\xd0\xde\x2f\x98\xe7\x5a\xb5\x4d\x30\xd2\x58\x2c\x34\x99\xe1\ -\xbd\x42\x0d\x48\xab\x3d\x5b\xa9\xdf\xf4\x81\xb2\xb9\x2e\x51\x50\ -\x55\x0e\x3b\xcb\xed\x04\x13\x04\xec\x2c\xfb\x17\x94\x95\x06\xc8\ -\xa2\x54\x1b\x2c\x68\xea\x6f\x0f\xe8\x13\x15\x60\x2c\x1e\x84\x4e\ -\x95\x15\x21\x73\xe8\x6c\x28\x18\x40\x83\x85\x0f\xf6\xff\x30\x80\ -\xb4\xa6\x84\xb9\x9a\x84\xdd\xaa\x82\xb9\xc7\xb5\x63\x7e\x73\xe2\ -\x9a\x05\x78\xa3\x27\xf1\x10\x4b\x4f\xe2\x76\x5e\xaa\xc0\x1f\xb1\ -\x78\x43\xb5\xe5\xb8\xb6\x78\xa1\xe0\x5b\x4b\x6b\x0a\x36\xa1\x1b\ -\x78\xd8\xbc\x9a\x6c\x5f\x8d\x67\x4b\x11\x38\x02\x47\xe0\x08\x1c\ -\x81\x03\x92\x15\xf2\x3d\x8e\x88\x6b\x6d\x82\x89\x35\x22\x73\x32\ -\x65\x5f\xe4\x65\x1e\x4a\x15\xd1\xa5\x23\x70\x04\x9e\x8f\xfc\x09\ -\x30\x00\xa0\x1c\x74\x67\x26\xea\x15\x76\x00\x00\x00\x00\x49\x45\ -\x4e\x44\xae\x42\x60\x82\ -\x00\x00\x05\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\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\x77\x69\ -\x64\x74\x68\x3d\x22\x31\x30\x30\x25\x22\x20\x68\x65\x69\x67\x68\ -\x74\x3d\x22\x31\x30\x30\x25\x22\x20\x76\x69\x65\x77\x42\x6f\x78\ -\x3d\x22\x30\x20\x30\x20\x36\x30\x20\x36\x30\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\x20\x78\x6d\x6c\x3a\x73\x70\x61\ -\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x20\x73\x74\ -\x79\x6c\x65\x3d\x22\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\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\x31\x2e\x35\x3b\x22\x3e\x0a\x20\x20\x20\ -\x20\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\ -\x61\x74\x72\x69\x78\x28\x31\x2c\x30\x2c\x30\x2c\x31\x2c\x2d\x32\ -\x31\x30\x2c\x30\x29\x22\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ -\x3c\x67\x20\x69\x64\x3d\x22\x64\x65\x63\x6b\x22\x20\x74\x72\x61\ -\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\x28\x31\ -\x2c\x30\x2c\x30\x2c\x31\x2c\x2d\x31\x34\x38\x31\x2c\x30\x29\x22\ -\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x72\ -\x65\x63\x74\x20\x78\x3d\x22\x31\x36\x39\x31\x22\x20\x79\x3d\x22\ -\x30\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x36\x30\x22\x20\x68\x65\ -\x69\x67\x68\x74\x3d\x22\x36\x30\x22\x20\x73\x74\x79\x6c\x65\x3d\ -\x22\x66\x69\x6c\x6c\x3a\x6e\x6f\x6e\x65\x3b\x22\x2f\x3e\x0a\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x67\x20\x74\x72\ -\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\x28\ -\x31\x2e\x33\x34\x36\x35\x34\x2c\x30\x2e\x30\x30\x33\x33\x35\x39\ -\x30\x34\x2c\x2d\x30\x2e\x30\x30\x33\x39\x36\x31\x30\x32\x2c\x31\ -\x2e\x35\x38\x37\x38\x36\x2c\x38\x32\x39\x2e\x30\x31\x39\x2c\x2d\ -\x33\x2e\x39\x30\x35\x38\x29\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\x36\x37\x33\x2c\x37\x4c\x36\x35\x32\x2c\x37\x4c\ -\x36\x35\x32\x2c\x31\x30\x2e\x39\x31\x4c\x36\x36\x38\x2e\x32\x30\ -\x31\x2c\x31\x31\x2e\x30\x31\x33\x4c\x36\x36\x38\x2e\x32\x34\x33\ -\x2c\x33\x32\x2e\x39\x30\x33\x4c\x36\x37\x33\x2c\x33\x32\x2e\x39\ -\x30\x33\x4c\x36\x37\x33\x2c\x37\x5a\x22\x20\x73\x74\x79\x6c\x65\ -\x3d\x22\x66\x69\x6c\x6c\x3a\x6e\x6f\x6e\x65\x3b\x73\x74\x72\x6f\ -\x6b\x65\x3a\x62\x6c\x61\x63\x6b\x3b\x73\x74\x72\x6f\x6b\x65\x2d\ -\x77\x69\x64\x74\x68\x3a\x31\x2e\x38\x34\x70\x78\x3b\x22\x2f\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\x67\ -\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\ -\x69\x78\x28\x31\x2e\x33\x34\x36\x35\x34\x2c\x30\x2e\x30\x30\x33\ -\x33\x35\x39\x30\x34\x2c\x2d\x30\x2e\x30\x30\x33\x39\x36\x31\x30\ -\x32\x2c\x31\x2e\x35\x38\x37\x38\x36\x2c\x38\x33\x36\x2e\x30\x39\ -\x36\x2c\x2d\x31\x30\x2e\x33\x34\x32\x29\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\x36\x37\x33\x2c\x37\x4c\x36\x35\x32\ -\x2c\x37\x4c\x36\x35\x32\x2c\x31\x30\x2e\x39\x31\x4c\x36\x36\x38\ -\x2e\x32\x30\x31\x2c\x31\x31\x2e\x30\x31\x33\x4c\x36\x36\x38\x2e\ -\x32\x34\x33\x2c\x33\x32\x2e\x39\x30\x33\x4c\x36\x37\x33\x2c\x33\ -\x32\x2e\x39\x30\x33\x4c\x36\x37\x33\x2c\x37\x5a\x22\x20\x73\x74\ -\x79\x6c\x65\x3d\x22\x66\x69\x6c\x6c\x3a\x6e\x6f\x6e\x65\x3b\x73\ -\x74\x72\x6f\x6b\x65\x3a\x62\x6c\x61\x63\x6b\x3b\x73\x74\x72\x6f\ -\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x31\x2e\x38\x34\x70\x78\x3b\ -\x22\x2f\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\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\ -\x61\x74\x72\x69\x78\x28\x31\x2e\x33\x34\x36\x35\x34\x2c\x30\x2e\ -\x30\x30\x33\x33\x35\x39\x30\x34\x2c\x2d\x30\x2e\x30\x30\x33\x39\ -\x36\x31\x30\x32\x2c\x31\x2e\x35\x38\x37\x38\x36\x2c\x38\x32\x32\ -\x2e\x35\x34\x31\x2c\x32\x2e\x35\x32\x30\x39\x31\x29\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\x36\x37\x33\x2c\x37\x4c\ -\x36\x35\x32\x2c\x37\x4c\x36\x35\x32\x2c\x33\x32\x2e\x39\x30\x33\ -\x4c\x36\x37\x33\x2c\x33\x32\x2e\x39\x30\x33\x4c\x36\x37\x33\x2c\ -\x37\x5a\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\x6c\x6c\x3a\ -\x6e\x6f\x6e\x65\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x62\x6c\x61\x63\ -\x6b\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x31\ -\x2e\x38\x34\x70\x78\x3b\x22\x2f\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\x3c\x2f\x67\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x67\x3e\ -\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\ -\x00\x00\x04\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\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\x77\x69\ -\x64\x74\x68\x3d\x22\x31\x30\x30\x25\x22\x20\x68\x65\x69\x67\x68\ -\x74\x3d\x22\x31\x30\x30\x25\x22\x20\x76\x69\x65\x77\x42\x6f\x78\ -\x3d\x22\x30\x20\x30\x20\x36\x30\x20\x36\x30\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\x20\x78\x6d\x6c\x3a\x73\x70\x61\ -\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x20\x73\x74\ -\x79\x6c\x65\x3d\x22\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\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\x31\x2e\x35\x3b\x22\x3e\x0a\x20\x20\x20\ -\x20\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\ -\x61\x74\x72\x69\x78\x28\x31\x2c\x30\x2c\x30\x2c\x31\x2c\x2d\x32\ -\x38\x30\x2c\x30\x29\x22\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ -\x3c\x67\x20\x69\x64\x3d\x22\x68\x65\x61\x72\x74\x22\x20\x74\x72\ -\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\x28\ -\x31\x2c\x30\x2c\x30\x2c\x31\x2c\x2d\x31\x34\x31\x31\x2c\x30\x29\ -\x22\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\ -\x72\x65\x63\x74\x20\x78\x3d\x22\x31\x36\x39\x31\x22\x20\x79\x3d\ -\x22\x30\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x36\x30\x22\x20\x68\ -\x65\x69\x67\x68\x74\x3d\x22\x36\x30\x22\x20\x73\x74\x79\x6c\x65\ -\x3d\x22\x66\x69\x6c\x6c\x3a\x6e\x6f\x6e\x65\x3b\x22\x2f\x3e\x0a\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x67\x20\x74\ -\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\ -\x28\x30\x2e\x39\x36\x30\x32\x34\x31\x2c\x30\x2c\x30\x2c\x30\x2e\ -\x39\x36\x30\x32\x34\x31\x2c\x31\x34\x33\x31\x2e\x30\x31\x2c\x33\ -\x2e\x31\x34\x37\x30\x31\x29\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\x33\x30\x32\x2c\x31\x30\x2e\x38\x43\x33\x30\x37\ -\x2e\x36\x38\x34\x2c\x30\x20\x33\x31\x39\x2e\x30\x35\x33\x2c\x30\ -\x20\x33\x32\x34\x2e\x37\x33\x37\x2c\x35\x2e\x34\x43\x33\x33\x30\ -\x2e\x34\x32\x31\x2c\x31\x30\x2e\x38\x20\x33\x33\x30\x2e\x34\x32\ -\x31\x2c\x32\x31\x2e\x36\x20\x33\x32\x34\x2e\x37\x33\x37\x2c\x33\ -\x32\x2e\x34\x43\x33\x32\x30\x2e\x37\x35\x38\x2c\x34\x30\x2e\x35\ -\x20\x33\x31\x30\x2e\x35\x32\x36\x2c\x34\x38\x2e\x36\x20\x33\x30\ -\x32\x2c\x35\x34\x43\x32\x39\x33\x2e\x34\x37\x34\x2c\x34\x38\x2e\ -\x36\x20\x32\x38\x33\x2e\x32\x34\x32\x2c\x34\x30\x2e\x35\x20\x32\ -\x37\x39\x2e\x32\x36\x33\x2c\x33\x32\x2e\x34\x43\x32\x37\x33\x2e\ -\x35\x37\x39\x2c\x32\x31\x2e\x36\x20\x32\x37\x33\x2e\x35\x37\x39\ -\x2c\x31\x30\x2e\x38\x20\x32\x37\x39\x2e\x32\x36\x33\x2c\x35\x2e\ -\x34\x43\x32\x38\x34\x2e\x39\x34\x37\x2c\x30\x20\x32\x39\x36\x2e\ -\x33\x31\x36\x2c\x30\x20\x33\x30\x32\x2c\x31\x30\x2e\x38\x5a\x22\ -\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\x6c\x6c\x3a\x6e\x6f\x6e\ -\x65\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x62\x6c\x61\x63\x6b\x3b\x73\ -\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x32\x2e\x38\x32\ -\x70\x78\x3b\x22\x2f\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\ -\x3c\x2f\x67\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x67\x3e\x0a\x3c\x2f\ -\x73\x76\x67\x3e\x0a\ \x00\x00\x06\xb8\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ @@ -323,6 +119,136 @@ \xf0\x09\xd0\xde\xc7\xe9\xb6\x11\x7f\x4b\x80\x25\xa0\xdc\xca\x39\ \xc0\xff\x00\x27\xf2\xcd\xbe\x4f\x7b\xc5\xe3\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x05\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\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\x77\x69\ +\x64\x74\x68\x3d\x22\x31\x30\x30\x25\x22\x20\x68\x65\x69\x67\x68\ +\x74\x3d\x22\x31\x30\x30\x25\x22\x20\x76\x69\x65\x77\x42\x6f\x78\ +\x3d\x22\x30\x20\x30\x20\x36\x30\x20\x36\x30\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\x20\x78\x6d\x6c\x3a\x73\x70\x61\ +\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x20\x73\x74\ +\x79\x6c\x65\x3d\x22\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\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\x31\x2e\x35\x3b\x22\x3e\x0a\x20\x20\x20\ +\x20\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\ +\x61\x74\x72\x69\x78\x28\x31\x2c\x30\x2c\x30\x2c\x31\x2c\x2d\x32\ +\x31\x30\x2c\x30\x29\x22\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ +\x3c\x67\x20\x69\x64\x3d\x22\x64\x65\x63\x6b\x22\x20\x74\x72\x61\ +\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\x28\x31\ +\x2c\x30\x2c\x30\x2c\x31\x2c\x2d\x31\x34\x38\x31\x2c\x30\x29\x22\ +\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x72\ +\x65\x63\x74\x20\x78\x3d\x22\x31\x36\x39\x31\x22\x20\x79\x3d\x22\ +\x30\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x36\x30\x22\x20\x68\x65\ +\x69\x67\x68\x74\x3d\x22\x36\x30\x22\x20\x73\x74\x79\x6c\x65\x3d\ +\x22\x66\x69\x6c\x6c\x3a\x6e\x6f\x6e\x65\x3b\x22\x2f\x3e\x0a\x20\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x67\x20\x74\x72\ +\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\x28\ +\x31\x2e\x33\x34\x36\x35\x34\x2c\x30\x2e\x30\x30\x33\x33\x35\x39\ +\x30\x34\x2c\x2d\x30\x2e\x30\x30\x33\x39\x36\x31\x30\x32\x2c\x31\ +\x2e\x35\x38\x37\x38\x36\x2c\x38\x32\x39\x2e\x30\x31\x39\x2c\x2d\ +\x33\x2e\x39\x30\x35\x38\x29\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\x36\x37\x33\x2c\x37\x4c\x36\x35\x32\x2c\x37\x4c\ +\x36\x35\x32\x2c\x31\x30\x2e\x39\x31\x4c\x36\x36\x38\x2e\x32\x30\ +\x31\x2c\x31\x31\x2e\x30\x31\x33\x4c\x36\x36\x38\x2e\x32\x34\x33\ +\x2c\x33\x32\x2e\x39\x30\x33\x4c\x36\x37\x33\x2c\x33\x32\x2e\x39\ +\x30\x33\x4c\x36\x37\x33\x2c\x37\x5a\x22\x20\x73\x74\x79\x6c\x65\ +\x3d\x22\x66\x69\x6c\x6c\x3a\x6e\x6f\x6e\x65\x3b\x73\x74\x72\x6f\ +\x6b\x65\x3a\x62\x6c\x61\x63\x6b\x3b\x73\x74\x72\x6f\x6b\x65\x2d\ +\x77\x69\x64\x74\x68\x3a\x31\x2e\x38\x34\x70\x78\x3b\x22\x2f\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\x67\ +\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\ +\x69\x78\x28\x31\x2e\x33\x34\x36\x35\x34\x2c\x30\x2e\x30\x30\x33\ +\x33\x35\x39\x30\x34\x2c\x2d\x30\x2e\x30\x30\x33\x39\x36\x31\x30\ +\x32\x2c\x31\x2e\x35\x38\x37\x38\x36\x2c\x38\x33\x36\x2e\x30\x39\ +\x36\x2c\x2d\x31\x30\x2e\x33\x34\x32\x29\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\x36\x37\x33\x2c\x37\x4c\x36\x35\x32\ +\x2c\x37\x4c\x36\x35\x32\x2c\x31\x30\x2e\x39\x31\x4c\x36\x36\x38\ +\x2e\x32\x30\x31\x2c\x31\x31\x2e\x30\x31\x33\x4c\x36\x36\x38\x2e\ +\x32\x34\x33\x2c\x33\x32\x2e\x39\x30\x33\x4c\x36\x37\x33\x2c\x33\ +\x32\x2e\x39\x30\x33\x4c\x36\x37\x33\x2c\x37\x5a\x22\x20\x73\x74\ +\x79\x6c\x65\x3d\x22\x66\x69\x6c\x6c\x3a\x6e\x6f\x6e\x65\x3b\x73\ +\x74\x72\x6f\x6b\x65\x3a\x62\x6c\x61\x63\x6b\x3b\x73\x74\x72\x6f\ +\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x31\x2e\x38\x34\x70\x78\x3b\ +\x22\x2f\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\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\ +\x61\x74\x72\x69\x78\x28\x31\x2e\x33\x34\x36\x35\x34\x2c\x30\x2e\ +\x30\x30\x33\x33\x35\x39\x30\x34\x2c\x2d\x30\x2e\x30\x30\x33\x39\ +\x36\x31\x30\x32\x2c\x31\x2e\x35\x38\x37\x38\x36\x2c\x38\x32\x32\ +\x2e\x35\x34\x31\x2c\x32\x2e\x35\x32\x30\x39\x31\x29\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\x36\x37\x33\x2c\x37\x4c\ +\x36\x35\x32\x2c\x37\x4c\x36\x35\x32\x2c\x33\x32\x2e\x39\x30\x33\ +\x4c\x36\x37\x33\x2c\x33\x32\x2e\x39\x30\x33\x4c\x36\x37\x33\x2c\ +\x37\x5a\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\x6c\x6c\x3a\ +\x6e\x6f\x6e\x65\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x62\x6c\x61\x63\ +\x6b\x3b\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x31\ +\x2e\x38\x34\x70\x78\x3b\x22\x2f\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\x3c\x2f\x67\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x67\x3e\ +\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\ +\x00\x00\x02\x68\ +\x00\ +\x00\x10\x25\x78\x9c\xed\x97\x5b\x6f\xd3\x30\x14\xc7\xdf\xf7\x29\ +\x8c\x25\x24\x90\x52\x5f\x13\x3b\xce\x9a\x4d\xda\x85\x09\x69\xc0\ +\x24\x36\x10\xbc\x85\xc4\x6b\xcd\xd2\x24\x4a\xb2\xb6\xfb\xf6\x9c\ +\x64\xed\xb4\x6e\xd5\x40\x88\xf1\xb2\xb4\x55\xeb\x73\x72\x7c\x2e\ +\x3f\xfb\xff\xd0\xf1\xfe\x72\x96\xa3\xb9\xad\x1b\x57\x16\x31\xe6\ +\x84\x61\x64\x8b\xb4\xcc\x5c\x31\x89\xf1\xc5\xf9\xbb\x51\x88\x51\ +\xd3\x26\x45\x96\xe4\x65\x61\x63\x5c\x94\x78\x7f\x6f\x67\xfc\xea\ +\xe8\xd3\xe1\xf9\xb7\xb3\x63\xd4\xcc\x27\xe8\xec\xe2\xe0\xf4\xfd\ +\x21\xc2\x23\x4a\xbf\xca\x43\x4a\x8f\xce\x8f\xd0\xe7\x2f\x27\x88\ +\x13\x4e\xe9\xf1\x47\x8c\xf0\xb4\x6d\xab\x88\xd2\xc5\x62\x41\x16\ +\x92\x94\xf5\x84\x9e\xd4\x49\x35\x75\x69\x43\x21\x90\x76\x81\xb0\ +\x89\x42\x32\xce\x49\xd6\x66\x18\x4a\x74\x99\x17\x2e\x6b\xa7\xd0\ +\x16\x63\xaf\x31\x9a\x5a\x37\x99\xb6\x6b\x6b\xee\xec\xe2\xa0\x5c\ +\xc6\x98\x21\x86\x54\xf7\xc1\xf7\xe7\xe0\x18\xc1\x64\x45\x13\x6f\ +\xa9\x2d\x18\x63\x5d\xad\x55\x48\xb4\xcc\x5d\x71\xb5\x2d\x90\x1b\ +\x63\x68\xff\xb4\x0f\x8d\x9a\x2a\x49\x81\x41\x55\xdb\xc6\xd6\x73\ +\xdb\x91\xb9\xc9\xc1\x71\xe9\xf2\x7c\x54\x5f\xe7\x36\xb2\x73\x5b\ +\x94\x59\xb6\x9b\xe6\xae\xda\xf4\x34\x6d\x5d\x5e\xd9\x11\x24\xb3\ +\x69\x52\x45\x75\x79\x5d\x6c\x38\x7f\x96\xae\xd8\xf4\xce\x5c\x6b\ +\xeb\xdc\xc1\x4f\xc4\x49\xb0\x0b\x4c\x10\xbc\xc6\x13\xd4\xd6\x49\ +\xd1\x5c\x96\xf5\x2c\xc6\xb3\xa4\xad\xdd\xf2\x0d\xf7\x18\xbc\xb9\ +\x37\xf2\xb9\xf6\xd8\xdb\x55\xe8\x2a\xdc\x65\x31\x4e\xcb\x3c\xb7\ +\x69\x0b\x70\xf0\x53\xdb\xb9\xd0\xfe\xe6\xfe\x3e\x47\x0d\x5b\x11\ +\xa0\xe6\xca\x00\xd7\x1b\x60\x8e\xd7\x47\xd3\x61\x5f\x1f\x4c\xb7\ +\xbe\x47\x24\x2a\xe0\xc6\xec\x62\xfa\x20\xd9\xb6\xfe\x19\x31\x7e\ +\xe0\x4b\xd9\xf7\x71\x67\x18\x41\x94\x62\xdc\x13\x84\x2b\xa5\xcc\ +\xc3\xb6\x9e\xc8\xa6\x82\x80\x73\xc8\x46\x18\xe3\x4a\xfa\x42\x78\ +\xa3\x7e\x6d\x84\x66\x06\xdc\x5a\x8b\x00\x48\x71\x61\x0c\x31\xd2\ +\x13\x21\x91\xa1\x0e\xb7\x15\xe8\x8b\x54\x49\x3b\x45\x40\xf1\x83\ +\xd2\xd2\xd3\xa7\x2a\x10\xab\x6f\x0e\xbd\xf2\x53\xa5\x42\x22\xa0\ +\x4f\xb8\xbb\x8c\xcb\x5b\xd3\x97\x9e\x14\xc4\x30\x30\xf5\xc6\x52\ +\x7f\xdf\x02\xe9\xf6\xc4\xa3\x1f\x79\x92\x5e\xad\x8f\xbf\x07\x1c\ +\xf9\xd5\xf2\x11\xc2\xbe\x27\x3a\xf9\xe7\x34\x24\x93\xc0\xc1\x13\ +\x01\x11\x81\x0a\x5e\x3a\x0d\x61\x14\xd1\xa1\x27\x41\x7b\xdc\xff\ +\x0b\x1a\xff\x77\xe0\xc7\x8e\x3f\xd7\x99\x52\x83\xce\x06\x9d\x0d\ +\x3a\x7b\x6e\x9d\xc1\xa0\x4c\x19\xe5\x8d\x84\x26\x42\x85\x6a\x10\ +\xda\x33\x5f\xad\x41\x68\x2f\x53\x68\x1a\xe6\xf7\x75\x30\x08\x6d\ +\x10\xda\x20\xb4\xdf\x0d\xbc\xe1\xb8\x33\xfa\xc5\xb8\xfb\x97\xbc\ +\xb7\xf3\x0b\x46\x33\xee\x37\ \x00\x00\x04\x30\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ @@ -480,47 +406,121 @@ \x20\x20\x3c\x2f\x67\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\x0a\ -\x00\x00\x02\x68\ -\x00\ -\x00\x10\x25\x78\x9c\xed\x97\x5b\x6f\xd3\x30\x14\xc7\xdf\xf7\x29\ -\x8c\x25\x24\x90\x52\x5f\x13\x3b\xce\x9a\x4d\xda\x85\x09\x69\xc0\ -\x24\x36\x10\xbc\x85\xc4\x6b\xcd\xd2\x24\x4a\xb2\xb6\xfb\xf6\x9c\ -\x64\xed\xb4\x6e\xd5\x40\x88\xf1\xb2\xb4\x55\xeb\x73\x72\x7c\x2e\ -\x3f\xfb\xff\xd0\xf1\xfe\x72\x96\xa3\xb9\xad\x1b\x57\x16\x31\xe6\ -\x84\x61\x64\x8b\xb4\xcc\x5c\x31\x89\xf1\xc5\xf9\xbb\x51\x88\x51\ -\xd3\x26\x45\x96\xe4\x65\x61\x63\x5c\x94\x78\x7f\x6f\x67\xfc\xea\ -\xe8\xd3\xe1\xf9\xb7\xb3\x63\xd4\xcc\x27\xe8\xec\xe2\xe0\xf4\xfd\ -\x21\xc2\x23\x4a\xbf\xca\x43\x4a\x8f\xce\x8f\xd0\xe7\x2f\x27\x88\ -\x13\x4e\xe9\xf1\x47\x8c\xf0\xb4\x6d\xab\x88\xd2\xc5\x62\x41\x16\ -\x92\x94\xf5\x84\x9e\xd4\x49\x35\x75\x69\x43\x21\x90\x76\x81\xb0\ -\x89\x42\x32\xce\x49\xd6\x66\x18\x4a\x74\x99\x17\x2e\x6b\xa7\xd0\ -\x16\x63\xaf\x31\x9a\x5a\x37\x99\xb6\x6b\x6b\xee\xec\xe2\xa0\x5c\ -\xc6\x98\x21\x86\x54\xf7\xc1\xf7\xe7\xe0\x18\xc1\x64\x45\x13\x6f\ -\xa9\x2d\x18\x63\x5d\xad\x55\x48\xb4\xcc\x5d\x71\xb5\x2d\x90\x1b\ -\x63\x68\xff\xb4\x0f\x8d\x9a\x2a\x49\x81\x41\x55\xdb\xc6\xd6\x73\ -\xdb\x91\xb9\xc9\xc1\x71\xe9\xf2\x7c\x54\x5f\xe7\x36\xb2\x73\x5b\ -\x94\x59\xb6\x9b\xe6\xae\xda\xf4\x34\x6d\x5d\x5e\xd9\x11\x24\xb3\ -\x69\x52\x45\x75\x79\x5d\x6c\x38\x7f\x96\xae\xd8\xf4\xce\x5c\x6b\ -\xeb\xdc\xc1\x4f\xc4\x49\xb0\x0b\x4c\x10\xbc\xc6\x13\xd4\xd6\x49\ -\xd1\x5c\x96\xf5\x2c\xc6\xb3\xa4\xad\xdd\xf2\x0d\xf7\x18\xbc\xb9\ -\x37\xf2\xb9\xf6\xd8\xdb\x55\xe8\x2a\xdc\x65\x31\x4e\xcb\x3c\xb7\ -\x69\x0b\x70\xf0\x53\xdb\xb9\xd0\xfe\xe6\xfe\x3e\x47\x0d\x5b\x11\ -\xa0\xe6\xca\x00\xd7\x1b\x60\x8e\xd7\x47\xd3\x61\x5f\x1f\x4c\xb7\ -\xbe\x47\x24\x2a\xe0\xc6\xec\x62\xfa\x20\xd9\xb6\xfe\x19\x31\x7e\ -\xe0\x4b\xd9\xf7\x71\x67\x18\x41\x94\x62\xdc\x13\x84\x2b\xa5\xcc\ -\xc3\xb6\x9e\xc8\xa6\x82\x80\x73\xc8\x46\x18\xe3\x4a\xfa\x42\x78\ -\xa3\x7e\x6d\x84\x66\x06\xdc\x5a\x8b\x00\x48\x71\x61\x0c\x31\xd2\ -\x13\x21\x91\xa1\x0e\xb7\x15\xe8\x8b\x54\x49\x3b\x45\x40\xf1\x83\ -\xd2\xd2\xd3\xa7\x2a\x10\xab\x6f\x0e\xbd\xf2\x53\xa5\x42\x22\xa0\ -\x4f\xb8\xbb\x8c\xcb\x5b\xd3\x97\x9e\x14\xc4\x30\x30\xf5\xc6\x52\ -\x7f\xdf\x02\xe9\xf6\xc4\xa3\x1f\x79\x92\x5e\xad\x8f\xbf\x07\x1c\ -\xf9\xd5\xf2\x11\xc2\xbe\x27\x3a\xf9\xe7\x34\x24\x93\xc0\xc1\x13\ -\x01\x11\x81\x0a\x5e\x3a\x0d\x61\x14\xd1\xa1\x27\x41\x7b\xdc\xff\ -\x0b\x1a\xff\x77\xe0\xc7\x8e\x3f\xd7\x99\x52\x83\xce\x06\x9d\x0d\ -\x3a\x7b\x6e\x9d\xc1\xa0\x4c\x19\xe5\x8d\x84\x26\x42\x85\x6a\x10\ -\xda\x33\x5f\xad\x41\x68\x2f\x53\x68\x1a\xe6\xf7\x75\x30\x08\x6d\ -\x10\xda\x20\xb4\xdf\x0d\xbc\xe1\xb8\x33\xfa\xc5\xb8\xfb\x97\xbc\ -\xb7\xf3\x0b\x46\x33\xee\x37\ +\x00\x00\x02\xd7\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x3c\x00\x00\x00\x3c\x08\x06\x00\x00\x00\x3a\xfc\xd9\x72\ +\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ +\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ +\x79\x71\xc9\x65\x3c\x00\x00\x02\x79\x49\x44\x41\x54\x78\xda\xec\ +\x9a\xd1\x6d\xc2\x30\x10\x40\x0d\x62\x80\x6c\x40\x3a\x01\xde\xa0\ +\x19\x21\x23\xa4\x13\xc0\x06\xf5\x06\xa8\x13\xa4\x1b\xa4\x1b\x44\ +\x4c\x10\x98\x20\x6c\x10\x36\x68\x8d\xe4\x48\xc8\x75\x82\xef\xb0\ +\x0f\x87\xf8\xa4\xfb\x31\x89\xc3\xf3\x9d\xed\xbb\xb3\x17\x8c\x56\ +\xb8\xd4\x5c\xea\x46\x6a\xa2\xda\x2e\x52\x4f\x52\x7f\xa4\x1e\xd9\ +\x8b\xc8\x15\xb2\x91\xfa\x7b\x47\x5b\xf5\xec\x64\xe5\x6a\xc5\xca\ +\x02\x54\xd7\xea\xc6\x03\x26\x05\xdb\x20\x60\x7b\x6d\xd4\x14\x98\ +\x05\x6c\xaf\xdd\x54\x2c\xed\x02\xf6\xd6\xd2\x41\x8b\x70\x08\xdb\ +\xab\x08\x15\x36\xf5\x00\xdb\x6b\x1a\x22\x70\xe9\x11\xb8\x9e\x93\ +\x75\x9d\x59\x79\xe9\x10\x78\x4b\x30\xa8\xdb\x90\x2c\xdc\x12\x58\ +\xb8\x0b\x05\x96\x13\xc0\xf6\xca\x43\x70\xe9\x8c\x38\x2e\x47\xcb\ +\xea\x0e\x04\x57\x19\xcc\x59\xe9\x90\x6c\x08\x81\x37\x3e\x81\x3f\ +\xb5\xb6\x2b\xfc\x97\xd4\x6f\xc3\x0a\x4d\xb9\x1b\xe8\x61\x6c\xae\ +\xda\xfb\xb4\x93\xab\xb4\xf3\x0d\x02\x3c\x34\x57\xd3\x27\xbb\x34\ +\x1f\xd8\xff\x4d\xf1\x3c\x68\x0e\xbf\x0f\xb4\x87\x96\xa4\x5f\x7c\ +\x2f\x5a\x17\x36\x61\x59\xb2\x99\xc9\x12\x61\xc9\xf4\x55\x81\x4f\ +\x13\x01\x4e\x7c\xbb\xf4\xfa\xc9\x0b\xd9\xd1\x62\xd5\x1e\xfc\x4f\ +\x4b\x40\xc7\x63\x1f\x38\x3f\x71\x55\xe6\x90\x29\x89\x05\x4e\x2c\ +\xdd\xdf\x87\x1c\x2c\x23\xaf\x03\xa6\xf3\x6e\x20\x80\xcf\x0d\x81\ +\x07\x55\xf2\x90\x21\xff\xa3\x95\x0c\xd5\x94\x4b\xc0\xe0\xf8\x4c\ +\x0f\xf3\x91\x67\x51\xd5\xce\x02\xd0\x61\x49\x00\x5c\x5a\x7e\x13\ +\x5d\xe9\x4c\x98\x7d\x25\x91\x13\xbb\xf3\x58\x49\x69\xf7\xc8\x22\ +\x51\x31\xfb\x22\x79\x4d\x58\xc4\x2b\x7d\xd5\xbe\x32\x80\x95\xb3\ +\x00\xac\x5b\xfa\xae\x57\x71\x82\xb9\x5c\x01\x3c\xc9\x49\xaa\x3a\ +\xb6\x1a\x36\x9a\x6b\x27\x8e\x0b\x7a\xad\xd6\xbf\x60\x44\xb5\xeb\ +\x1a\xe0\x46\xdc\xd1\x36\xd5\x69\x1e\x94\xfb\x2c\xf0\x41\x2b\x93\ +\xae\xa1\x75\xd8\x7b\xfd\xed\x7d\x84\x75\x02\x01\x8d\x39\x49\x6c\ +\x80\xb0\x2d\xf3\x78\xac\x5a\x33\xd8\xe9\x7d\xa2\x06\xaa\xb3\xb4\ +\xaa\xd0\xde\x2f\x98\xe7\x5a\xb5\x4d\x30\xd2\x58\x2c\x34\x99\xe1\ +\xbd\x42\x0d\x48\xab\x3d\x5b\xa9\xdf\xf4\x81\xb2\xb9\x2e\x51\x50\ +\x55\x0e\x3b\xcb\xed\x04\x13\x04\xec\x2c\xfb\x17\x94\x95\x06\xc8\ +\xa2\x54\x1b\x2c\x68\xea\x6f\x0f\xe8\x13\x15\x60\x2c\x1e\x84\x4e\ +\x95\x15\x21\x73\xe8\x6c\x28\x18\x40\x83\x85\x0f\xf6\xff\x30\x80\ +\xb4\xa6\x84\xb9\x9a\x84\xdd\xaa\x82\xb9\xc7\xb5\x63\x7e\x73\xe2\ +\x9a\x05\x78\xa3\x27\xf1\x10\x4b\x4f\xe2\x76\x5e\xaa\xc0\x1f\xb1\ +\x78\x43\xb5\xe5\xb8\xb6\x78\xa1\xe0\x5b\x4b\x6b\x0a\x36\xa1\x1b\ +\x78\xd8\xbc\x9a\x6c\x5f\x8d\x67\x4b\x11\x38\x02\x47\xe0\x08\x1c\ +\x81\x03\x92\x15\xf2\x3d\x8e\x88\x6b\x6d\x82\x89\x35\x22\x73\x32\ +\x65\x5f\xe4\x65\x1e\x4a\x15\xd1\xa5\x23\x70\x04\x9e\x8f\xfc\x09\ +\x30\x00\xa0\x1c\x74\x67\x26\xea\x15\x76\x00\x00\x00\x00\x49\x45\ +\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x04\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\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\x77\x69\ +\x64\x74\x68\x3d\x22\x31\x30\x30\x25\x22\x20\x68\x65\x69\x67\x68\ +\x74\x3d\x22\x31\x30\x30\x25\x22\x20\x76\x69\x65\x77\x42\x6f\x78\ +\x3d\x22\x30\x20\x30\x20\x36\x30\x20\x36\x30\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\x20\x78\x6d\x6c\x3a\x73\x70\x61\ +\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x20\x73\x74\ +\x79\x6c\x65\x3d\x22\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\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\x31\x2e\x35\x3b\x22\x3e\x0a\x20\x20\x20\ +\x20\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\ +\x61\x74\x72\x69\x78\x28\x31\x2c\x30\x2c\x30\x2c\x31\x2c\x2d\x32\ +\x38\x30\x2c\x30\x29\x22\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ +\x3c\x67\x20\x69\x64\x3d\x22\x68\x65\x61\x72\x74\x22\x20\x74\x72\ +\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\x28\ +\x31\x2c\x30\x2c\x30\x2c\x31\x2c\x2d\x31\x34\x31\x31\x2c\x30\x29\ +\x22\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\ +\x72\x65\x63\x74\x20\x78\x3d\x22\x31\x36\x39\x31\x22\x20\x79\x3d\ +\x22\x30\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x36\x30\x22\x20\x68\ +\x65\x69\x67\x68\x74\x3d\x22\x36\x30\x22\x20\x73\x74\x79\x6c\x65\ +\x3d\x22\x66\x69\x6c\x6c\x3a\x6e\x6f\x6e\x65\x3b\x22\x2f\x3e\x0a\ +\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x67\x20\x74\ +\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\x69\x78\ +\x28\x30\x2e\x39\x36\x30\x32\x34\x31\x2c\x30\x2c\x30\x2c\x30\x2e\ +\x39\x36\x30\x32\x34\x31\x2c\x31\x34\x33\x31\x2e\x30\x31\x2c\x33\ +\x2e\x31\x34\x37\x30\x31\x29\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\x33\x30\x32\x2c\x31\x30\x2e\x38\x43\x33\x30\x37\ +\x2e\x36\x38\x34\x2c\x30\x20\x33\x31\x39\x2e\x30\x35\x33\x2c\x30\ +\x20\x33\x32\x34\x2e\x37\x33\x37\x2c\x35\x2e\x34\x43\x33\x33\x30\ +\x2e\x34\x32\x31\x2c\x31\x30\x2e\x38\x20\x33\x33\x30\x2e\x34\x32\ +\x31\x2c\x32\x31\x2e\x36\x20\x33\x32\x34\x2e\x37\x33\x37\x2c\x33\ +\x32\x2e\x34\x43\x33\x32\x30\x2e\x37\x35\x38\x2c\x34\x30\x2e\x35\ +\x20\x33\x31\x30\x2e\x35\x32\x36\x2c\x34\x38\x2e\x36\x20\x33\x30\ +\x32\x2c\x35\x34\x43\x32\x39\x33\x2e\x34\x37\x34\x2c\x34\x38\x2e\ +\x36\x20\x32\x38\x33\x2e\x32\x34\x32\x2c\x34\x30\x2e\x35\x20\x32\ +\x37\x39\x2e\x32\x36\x33\x2c\x33\x32\x2e\x34\x43\x32\x37\x33\x2e\ +\x35\x37\x39\x2c\x32\x31\x2e\x36\x20\x32\x37\x33\x2e\x35\x37\x39\ +\x2c\x31\x30\x2e\x38\x20\x32\x37\x39\x2e\x32\x36\x33\x2c\x35\x2e\ +\x34\x43\x32\x38\x34\x2e\x39\x34\x37\x2c\x30\x20\x32\x39\x36\x2e\ +\x33\x31\x36\x2c\x30\x20\x33\x30\x32\x2c\x31\x30\x2e\x38\x5a\x22\ +\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\x6c\x6c\x3a\x6e\x6f\x6e\ +\x65\x3b\x73\x74\x72\x6f\x6b\x65\x3a\x62\x6c\x61\x63\x6b\x3b\x73\ +\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3a\x32\x2e\x38\x32\ +\x70\x78\x3b\x22\x2f\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\ +\x3c\x2f\x67\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x67\x3e\x0a\x3c\x2f\ +\x73\x76\x67\x3e\x0a\ " qt_resource_name = b"\ @@ -528,22 +528,18 @@ \x00\x6f\xa6\x53\ \x00\x69\ \x00\x63\x00\x6f\x00\x6e\x00\x73\ -\x00\x10\ -\x08\x12\xae\xa7\ -\x00\x6d\ -\x00\x65\x00\x64\x00\x69\x00\x61\x00\x2d\x00\x72\x00\x65\x00\x63\x00\x6f\x00\x72\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\ -\x00\x08\ -\x0b\x9e\x57\x87\ -\x00\x64\ -\x00\x65\x00\x63\x00\x6b\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x09\ -\x08\x97\x87\xa7\ -\x00\x68\ -\x00\x65\x00\x61\x00\x72\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x08\ \x05\x1c\x5a\x47\ \x00\x61\ \x00\x6e\x00\x6b\x00\x69\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x08\ +\x0b\x9e\x57\x87\ +\x00\x64\ +\x00\x65\x00\x63\x00\x6b\x00\x2e\x00\x73\x00\x76\x00\x67\ +\x00\x0e\ +\x04\x44\x35\x07\ +\x00\x63\ +\x00\x6f\x00\x6c\x00\x6c\x00\x65\x00\x63\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x07\ \x0a\x7a\x5a\x27\ \x00\x74\ @@ -552,22 +548,26 @@ \x0e\xcd\x03\x47\ \x00\x6e\ \x00\x6f\x00\x74\x00\x65\x00\x74\x00\x79\x00\x70\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x0e\ -\x04\x44\x35\x07\ -\x00\x63\ -\x00\x6f\x00\x6c\x00\x6c\x00\x65\x00\x63\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\ +\x00\x10\ +\x08\x12\xae\xa7\ +\x00\x6d\ +\x00\x65\x00\x64\x00\x69\x00\x61\x00\x2d\x00\x72\x00\x65\x00\x63\x00\x6f\x00\x72\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x09\ +\x08\x97\x87\xa7\ +\x00\x68\ +\x00\x65\x00\x61\x00\x72\x00\x74\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\x07\x00\x00\x00\x02\ -\x00\x00\x00\xac\x00\x01\x00\x00\x00\x01\x00\x00\x1c\x9b\ -\x00\x00\x00\x64\x00\x00\x00\x00\x00\x01\x00\x00\x0c\x52\ +\x00\x00\x00\x3c\x00\x01\x00\x00\x00\x01\x00\x00\x0c\x29\ \x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x00\x4c\x00\x00\x00\x00\x00\x01\x00\x00\x08\x48\ -\x00\x00\x00\x7a\x00\x00\x00\x00\x00\x01\x00\x00\x13\x0e\ -\x00\x00\x00\x36\x00\x00\x00\x00\x00\x01\x00\x00\x02\xdb\ -\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x01\x00\x00\x17\x42\ +\x00\x00\x00\x90\x00\x00\x00\x00\x00\x01\x00\x00\x18\x22\ +\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x01\x00\x00\x1a\xfd\ +\x00\x00\x00\x5e\x00\x00\x00\x00\x00\x01\x00\x00\x0e\x95\ +\x00\x00\x00\x26\x00\x00\x00\x00\x00\x01\x00\x00\x06\xbc\ +\x00\x00\x00\x72\x00\x00\x00\x00\x00\x01\x00\x00\x12\xc9\ " qt_resource_struct_v2 = b"\ @@ -575,19 +575,19 @@ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x07\x00\x00\x00\x02\ \x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\xac\x00\x01\x00\x00\x00\x01\x00\x00\x1c\x9b\ +\x00\x00\x00\x3c\x00\x01\x00\x00\x00\x01\x00\x00\x0c\x29\ \x00\x00\x01\x5f\xb2\xe6\x4b\xb0\ -\x00\x00\x00\x64\x00\x00\x00\x00\x00\x01\x00\x00\x0c\x52\ -\x00\x00\x01\x37\x58\x6b\x1d\xa0\ \x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x01\x37\x58\x6b\x1d\xa0\ +\x00\x00\x00\x90\x00\x00\x00\x00\x00\x01\x00\x00\x18\x22\ \x00\x00\x01\x5f\xb2\xe6\x4b\xb0\ -\x00\x00\x00\x4c\x00\x00\x00\x00\x00\x01\x00\x00\x08\x48\ +\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x01\x00\x00\x1a\xfd\ \x00\x00\x01\x5f\xb2\xe6\x4b\xb0\ -\x00\x00\x00\x7a\x00\x00\x00\x00\x00\x01\x00\x00\x13\x0e\ +\x00\x00\x00\x5e\x00\x00\x00\x00\x00\x01\x00\x00\x0e\x95\ \x00\x00\x01\x5f\xb2\xe6\x4b\xb0\ -\x00\x00\x00\x36\x00\x00\x00\x00\x00\x01\x00\x00\x02\xdb\ +\x00\x00\x00\x26\x00\x00\x00\x00\x00\x01\x00\x00\x06\xbc\ \x00\x00\x01\x5f\xb2\xe6\x4b\xb0\ -\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x01\x00\x00\x17\x42\ +\x00\x00\x00\x72\x00\x00\x00\x00\x00\x01\x00\x00\x12\xc9\ \x00\x00\x01\x5f\xb2\xe6\x4b\xb0\ " diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/aqt/forms/profiles.py new/anki-2.1.13/aqt/forms/profiles.py --- old/anki-2.1.12/aqt/forms/profiles.py 2019-03-04 08:53:16.000000000 +0100 +++ new/anki-2.1.13/aqt/forms/profiles.py 2019-05-17 07:18:55.000000000 +0200 @@ -13,6 +13,9 @@ def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(423, 356) + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap(":/icons/anki.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + MainWindow.setWindowIcon(icon) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.centralwidget) @@ -74,3 +77,4 @@ self.quit.setText(_("Quit")) self.openBackup.setText(_("Open Backup...")) +from . import icons_rc diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/aqt/importing.py new/anki-2.1.13/aqt/importing.py --- old/anki-2.1.12/aqt/importing.py 2019-03-09 23:22:42.000000000 +0100 +++ new/anki-2.1.13/aqt/importing.py 2019-04-29 08:47:12.000000000 +0200 @@ -384,10 +384,8 @@ the file you're importing. Are you sure?"""), msgfunc=QMessageBox.warning, defaultno=True): return False - # schedule replacement; don't do it immediately as we may have been - # called as part of the startup routine - mw.progress.timer( - 100, lambda mw=mw, f=importer.file: replaceWithApkg(mw, f, mw.restoringBackup), False) + + replaceWithApkg(mw, importer.file, mw.restoringBackup) def replaceWithApkg(mw, file, backup): mw.unloadCollection(lambda: _replaceWithApkg(mw, file, backup)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/aqt/main.py new/anki-2.1.13/aqt/main.py --- old/anki-2.1.12/aqt/main.py 2019-04-21 10:55:29.000000000 +0200 +++ new/anki-2.1.13/aqt/main.py 2019-04-29 08:38:17.000000000 +0200 @@ -189,9 +189,8 @@ return not checkInvalidFilename(str) def onAddProfile(self): - name = getOnlyText(_("Name:")) + name = getOnlyText(_("Name:")).strip() if name: - name = name.strip() if name in self.pm.profiles(): return showWarning(_("Name exists.")) if not self.profileNameOk(name): @@ -201,7 +200,7 @@ self.refreshProfilesList() def onRenameProfile(self): - name = getOnlyText(_("New name:"), default=self.pm.name) + name = getOnlyText(_("New name:"), default=self.pm.name).strip() if not name: return if name == self.pm.name: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/aqt/mediasrv.py new/anki-2.1.13/aqt/mediasrv.py --- old/anki-2.1.12/aqt/mediasrv.py 2019-03-09 23:22:42.000000000 +0100 +++ new/anki-2.1.13/aqt/mediasrv.py 2019-04-29 06:39:10.000000000 +0200 @@ -47,6 +47,7 @@ _port = None _ready = threading.Event() + daemon = True def __init__(self, mw, *args, **kwargs): super().__init__(*args, **kwargs) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/aqt/sync.py new/anki-2.1.13/aqt/sync.py --- old/anki-2.1.12/aqt/sync.py 2019-04-21 10:41:00.000000000 +0200 +++ new/anki-2.1.13/aqt/sync.py 2019-04-29 10:25:10.000000000 +0200 @@ -400,7 +400,8 @@ elif ret == "success": self.fireEvent("success") elif ret == "serverAbort": - pass + self.syncMsg = self.client.syncMsg + return else: self.fireEvent("error", "Unknown sync return code.") self.syncMsg = self.client.syncMsg diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/aqt/webview.py new/anki-2.1.13/aqt/webview.py --- old/anki-2.1.12/aqt/webview.py 2019-04-21 11:11:27.000000000 +0200 +++ new/anki-2.1.13/aqt/webview.py 2019-05-17 07:15:43.000000000 +0200 @@ -63,8 +63,10 @@ def javaScriptConsoleMessage(self, lvl, msg, line, srcID): # not translated because console usually not visible, # and may only accept ascii text - sys.stdout.write("JS error on line %(a)d: %(b)s" % - dict(a=line, b=msg+"\n")) + buf = "JS error on line %(a)d: %(b)s" % dict(a=line, b=msg+"\n") + # ensure we don't try to write characters the terminal can't handle + buf = buf.encode(sys.stdout.encoding, "backslashreplace").decode(sys.stdout.encoding) + sys.stdout.write(buf) def acceptNavigationRequest(self, url, navType, isMainFrame): if not isMainFrame: @@ -170,6 +172,9 @@ pass def setHtml(self, html): + # discard any previous pending actions + self._pendingActions = [] + self._domDone = True self._queueAction("setHtml", html) def _setHtml(self, html): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/designer/addcards.ui new/anki-2.1.13/designer/addcards.ui --- old/anki-2.1.12/designer/addcards.ui 2019-03-04 08:53:12.000000000 +0100 +++ new/anki-2.1.13/designer/addcards.ui 2019-05-17 07:20:26.000000000 +0200 @@ -13,6 +13,10 @@ <property name="windowTitle"> <string>Add</string> </property> + <property name="windowIcon"> + <iconset resource="icons.qrc"> + <normaloff>:/icons/anki.png</normaloff>:/icons/anki.png</iconset> + </property> <layout class="QVBoxLayout" name="verticalLayout"> <property name="spacing"> <number>3</number> @@ -87,7 +91,9 @@ <tabstops> <tabstop>buttonBox</tabstop> </tabstops> - <resources/> + <resources> + <include location="icons.qrc"/> + </resources> <connections> <connection> <sender>buttonBox</sender> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/designer/browser.ui new/anki-2.1.13/designer/browser.ui --- old/anki-2.1.12/designer/browser.ui 2019-03-11 04:33:54.000000000 +0100 +++ new/anki-2.1.13/designer/browser.ui 2019-05-17 07:26:12.000000000 +0200 @@ -16,6 +16,10 @@ <height>400</height> </size> </property> + <property name="windowIcon"> + <iconset resource="icons.qrc"> + <normaloff>:/icons/anki.png</normaloff>:/icons/anki.png</iconset> + </property> <widget class="QWidget" name="centralwidget"> <layout class="QVBoxLayout" name="verticalLayout_3"> <property name="spacing"> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/designer/editcurrent.ui new/anki-2.1.13/designer/editcurrent.ui --- old/anki-2.1.12/designer/editcurrent.ui 2019-03-04 08:53:12.000000000 +0100 +++ new/anki-2.1.13/designer/editcurrent.ui 2019-05-17 07:20:55.000000000 +0200 @@ -13,6 +13,10 @@ <property name="windowTitle"> <string>Dialog</string> </property> + <property name="windowIcon"> + <iconset resource="icons.qrc"> + <normaloff>:/icons/anki.png</normaloff>:/icons/anki.png</iconset> + </property> <layout class="QVBoxLayout" name="verticalLayout"> <property name="spacing"> <number>3</number> @@ -35,7 +39,9 @@ </item> </layout> </widget> - <resources/> + <resources> + <include location="icons.qrc"/> + </resources> <connections> <connection> <sender>buttonBox</sender> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/designer/profiles.ui new/anki-2.1.13/designer/profiles.ui --- old/anki-2.1.12/designer/profiles.ui 2019-03-04 08:53:12.000000000 +0100 +++ new/anki-2.1.13/designer/profiles.ui 2019-05-17 07:18:44.000000000 +0200 @@ -13,6 +13,10 @@ <property name="windowTitle"> <string>Profiles</string> </property> + <property name="windowIcon"> + <iconset resource="icons.qrc"> + <normaloff>:/icons/anki.png</normaloff>:/icons/anki.png</iconset> + </property> <widget class="QWidget" name="centralwidget"> <layout class="QVBoxLayout" name="verticalLayout_3"> <item> @@ -109,6 +113,8 @@ </property> </widget> </widget> - <resources/> + <resources> + <include location="icons.qrc"/> + </resources> <connections/> </ui> Binary files old/anki-2.1.12/locale/af/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/af/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/ar/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/ar/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/az/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/az/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/bg/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/bg/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/bn/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/bn/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/ca/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/ca/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/ca@valencia/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/ca@valencia/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/cs/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/cs/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/da/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/da/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/de/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/de/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/el/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/el/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/en_GB/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/en_GB/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/eo/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/eo/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/es/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/es/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/et/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/et/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/eu/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/eu/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/fa/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/fa/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/fi/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/fi/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/fr/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/fr/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/fr_CA/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/fr_CA/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/ga/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/ga/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/gl/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/gl/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/gu/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/gu/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/he/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/he/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/hr/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/hr/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/hu/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/hu/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/hy/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/hy/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/ia/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/ia/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/is/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/is/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/it/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/it/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/ja/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/ja/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/jbo/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/jbo/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/kab/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/kab/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/km/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/km/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/ko/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/ko/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/ku/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/ku/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/la/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/la/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/lt/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/lt/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/lv/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/lv/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/mn/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/mn/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/mr/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/mr/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/ms/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/ms/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/nb/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/nb/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/nl/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/nl/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/oc/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/oc/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/pl/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/pl/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/pt/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/pt/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/pt_BR/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/pt_BR/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/ro/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/ro/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/ru/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/ru/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/sco/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/sco/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/sk/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/sk/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/sl/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/sl/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/sr/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/sr/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/sv/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/sv/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/szl/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/szl/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/th/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/th/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/tlh/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/tlh/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/tr/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/tr/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/uk/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/uk/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/ur/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/ur/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/vi/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/vi/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/wo/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/wo/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/zh_CN/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/zh_CN/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/zh_HK/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/zh_HK/LC_MESSAGES/anki.mo differ Binary files old/anki-2.1.12/locale/zh_TW/LC_MESSAGES/anki.mo and new/anki-2.1.13/locale/zh_TW/LC_MESSAGES/anki.mo differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/requirements.txt new/anki-2.1.13/requirements.txt --- old/anki-2.1.12/requirements.txt 2019-03-09 23:22:42.000000000 +0100 +++ new/anki-2.1.13/requirements.txt 2019-04-29 04:39:48.000000000 +0200 @@ -4,5 +4,6 @@ requests decorator markdown +jsonschema psutil; sys_platform == "win32" distro; sys_platform != "win32" and sys_platform != "darwin" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/tests/test_addons.py new/anki-2.1.13/tests/test_addons.py --- old/anki-2.1.12/tests/test_addons.py 1970-01-01 01:00:00.000000000 +0100 +++ new/anki-2.1.13/tests/test_addons.py 2019-04-29 04:35:05.000000000 +0200 @@ -0,0 +1,83 @@ +import os.path +from nose.tools import assert_equals +from mock import MagicMock +from tempfile import TemporaryDirectory +from zipfile import ZipFile + +from aqt.addons import AddonManager + + +def test_readMinimalManifest(): + assertReadManifest( + '{"package": "yes", "name": "no"}', + {"package": "yes", "name": "no"} + ) + + +def test_readExtraKeys(): + assertReadManifest( + '{"package": "a", "name": "b", "mod": 3, "conflicts": ["d", "e"]}', + {"package": "a", "name": "b", "mod": 3, "conflicts": ["d", "e"]} + ) + + +def test_invalidManifest(): + assertReadManifest( + '{"one": 1}', + {} + ) + + +def test_mustHaveName(): + assertReadManifest( + '{"package": "something"}', + {} + ) + + +def test_mustHavePackage(): + assertReadManifest( + '{"name": "something"}', + {} + ) + + +def test_invalidJson(): + assertReadManifest( + 'this is not a JSON dictionary', + {} + ) + + +def test_missingManifest(): + assertReadManifest( + '{"package": "what", "name": "ever"}', + {}, + nameInZip="not-manifest.bin" + ) + + +def test_ignoreExtraKeys(): + assertReadManifest( + '{"package": "a", "name": "b", "game": "c"}', + {"package": "a", "name": "b"} + ) + + +def test_conflictsMustBeStrings(): + assertReadManifest( + '{"package": "a", "name": "b", "conflicts": ["c", 4, {"d": "e"}]}', + {} + ) + + +def assertReadManifest(contents, expectedManifest, nameInZip="manifest.json"): + with TemporaryDirectory() as td: + zfn = os.path.join(td, "addon.zip") + with ZipFile(zfn, "w") as zfile: + zfile.writestr(nameInZip, contents) + + adm = AddonManager(MagicMock()) + + with ZipFile(zfn, "r") as zfile: + assert_equals(adm.readManifestFile(zfile), expectedManifest) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/anki-2.1.12/web/editor.js new/anki-2.1.13/web/editor.js --- old/anki-2.1.12/web/editor.js 2019-04-16 10:50:33.000000000 +0200 +++ new/anki-2.1.13/web/editor.js 2019-05-17 05:38:55.000000000 +0200 @@ -342,7 +342,13 @@ var pasteHTML = function (html, internal, extendedMode) { html = filterHTML(html, internal, extendedMode); - setFormat("inserthtml", html); + if (html !== "") { + // remove trailing <br> in empty field + if (currentField && currentField.innerHTML === "<br>") { + currentField.innerHTML = ""; + } + setFormat("inserthtml", html); + } }; var filterHTML = function (html, internal, extendedMode) {