Merge pull request #255 from loathingKernel/fixups

HiDPI and CSS
This commit is contained in:
Dummerle 2022-11-04 16:29:28 +01:00 committed by GitHub
commit 7f002b99e7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
55 changed files with 1719 additions and 1858 deletions

View File

@ -1,16 +1,48 @@
#!/bin/sh
#!/bin/bash
cwd="$(pwd)"
cd "$(dirname "$0")"/../ || exit
pyrcc5 -compress 6 \
rare/resources/resources.qrc \
-o rare/resources/resources.py
pyrcc5 -compress 6 \
rare/resources/stylesheets/RareStyle/stylesheet.qrc \
-o rare/resources/stylesheets/RareStyle/__init__.py
pyrcc5 -compress 6 \
rare/resources/stylesheets/ChildOfMetropolis/stylesheet.qrc \
-o rare/resources/stylesheets/ChildOfMetropolis/__init__.py
resources=(
"rare/resources/images/"
"rare/resources/colors/"
"rare/resources/resources.qrc"
)
resources_changed=0
for r in "${resources[@]}"
do
if [[ $(git diff --name-only HEAD "$r") ]]
then
resources_changed=1
fi
done
if [[ $resources_changed -eq 1 ]]
then
echo "Re-compiling main resources"
pyrcc5 -compress 6 \
rare/resources/resources.qrc \
-o rare/resources/resources.py
fi
if [[ $(git diff --name-only HEAD "rare/resources/stylesheets/RareStyle/") ]]
then
echo "Re-compiling RareStyle stylesheet resources"
pyrcc5 -compress 6 \
rare/resources/stylesheets/RareStyle/stylesheet.qrc \
-o rare/resources/stylesheets/RareStyle/__init__.py
fi
if [[ $(git diff --name-only HEAD "rare/resources/stylesheets/ChildOfMetropolis/") ]]
then
echo "Re-compiling ChildOfMetropolis stylesheet resources"
pyrcc5 -compress 6 \
rare/resources/stylesheets/ChildOfMetropolis/stylesheet.qrc \
-o rare/resources/stylesheets/ChildOfMetropolis/__init__.py
fi
cd "$cwd" || exit

View File

@ -8,7 +8,7 @@ from datetime import datetime
from typing import Optional
import requests.exceptions
from PyQt5.QtCore import QThreadPool, QTimer, pyqtSlot
from PyQt5.QtCore import QThreadPool, QTimer, pyqtSlot, Qt
from PyQt5.QtWidgets import QApplication, QMessageBox
from requests import HTTPError
@ -128,6 +128,8 @@ def start(args):
sys.excepthook = excepthook
while True:
QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True)
QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps, True)
app = App(args)
exit_code = app.exec_()
# if not restart

View File

@ -5,23 +5,33 @@ from typing import Tuple, List, Union, Optional
from PyQt5.QtCore import Qt, QObject, QRunnable, QThreadPool, pyqtSignal, pyqtSlot, QSettings
from PyQt5.QtGui import QCloseEvent, QKeyEvent
from PyQt5.QtWidgets import QDialog, QFileDialog, QCheckBox, QLayout
from PyQt5.QtWidgets import QDialog, QFileDialog, QCheckBox, QLayout, QWidget, QVBoxLayout, QApplication
from legendary.models.downloading import ConditionCheckResult
from legendary.models.game import Game
from legendary.utils.selective_dl import get_sdl_appname
from rare.lgndr.api_arguments import LgndrInstallGameArgs
from rare.lgndr.api_exception import LgndrException
from rare.lgndr.api_monkeys import LgndrIndirectStatus
from rare.lgndr.cli import LegendaryCLI
from rare.lgndr.core import LegendaryCore
from rare.lgndr.glue.arguments import LgndrInstallGameArgs
from rare.lgndr.glue.exception import LgndrException
from rare.lgndr.glue.monkeys import LgndrIndirectStatus
from rare.models.install import InstallDownloadModel, InstallQueueItemModel
from rare.shared import LegendaryCoreSingleton, ApiResultsSingleton, ArgumentsSingleton
from rare.ui.components.dialogs.install_dialog import Ui_InstallDialog
from rare.ui.components.dialogs.install_dialog_advanced import Ui_InstallDialogAdvanced
from rare.utils import config_helper
from rare.utils.extra_widgets import PathEdit
from rare.utils.misc import get_size
from rare.widgets.collabsible_widget import CollabsibleWidget
from rare.widgets.collapsible_widget import CollapsibleFrame
class InstallDialogAdvanced(CollapsibleFrame):
def __init__(self, parent=None):
widget = QWidget()
title = widget.tr("Advanced Options")
self.ui = Ui_InstallDialogAdvanced()
self.ui.setupUi(widget)
super(InstallDialogAdvanced, self).__init__(widget=widget, title=title, parent=parent)
class InstallDialog(QDialog):
@ -43,11 +53,12 @@ class InstallDialog(QDialog):
if not self.dl_item.options.overlay
else Game(app_name=self.app_name, app_title="Epic Overlay")
)
self.ui.advanced_layout.setParent(None)
self.advanced_widget = CollabsibleWidget(
child_layout=self.ui.advanced_layout, title=self.tr("Advanced options"), parent=self
)
self.ui.collapsible_layout.addWidget(self.advanced_widget)
self.advanced = InstallDialogAdvanced(parent=self)
self.ui.advanced_layout.addWidget(self.advanced)
self.selectable = CollapsibleFrame(widget=None, title=self.tr("Optional downloads"), parent=self)
self.ui.selectable_layout.addWidget(self.selectable)
self.game_path = self.game.metadata.get("customAttributes", {}).get("FolderName", {}).get("value", "")
@ -64,7 +75,7 @@ class InstallDialog(QDialog):
header = self.tr("Update") if update else self.tr("Install")
self.ui.install_dialog_label.setText(f'<h3>{header} "{self.game.app_title}"</h3>')
self.setWindowTitle(f'{self.windowTitle()} - {header} "{self.game.app_title}"')
self.setWindowTitle(f'{QApplication.instance().applicationName()} - {header} "{self.game.app_title}"')
if not self.dl_item.options.base_path:
self.dl_item.options.base_path = self.core.lgd.config.get(
@ -112,19 +123,23 @@ class InstallDialog(QDialog):
if pf.system() == "Darwin" and "Mac" in platforms:
self.ui.platform_combo.setCurrentIndex(platforms.index("Mac"))
self.ui.max_workers_spin.setValue(self.core.lgd.config.getint("Legendary", "max_workers", fallback=0))
self.ui.max_workers_spin.valueChanged.connect(self.option_changed)
self.advanced.ui.max_workers_spin.setValue(self.core.lgd.config.getint("Legendary", "max_workers", fallback=0))
self.advanced.ui.max_workers_spin.valueChanged.connect(self.option_changed)
self.ui.max_memory_spin.setValue(self.core.lgd.config.getint("Legendary", "max_memory", fallback=0))
self.ui.max_memory_spin.valueChanged.connect(self.option_changed)
self.advanced.ui.max_memory_spin.setValue(self.core.lgd.config.getint("Legendary", "max_memory", fallback=0))
self.advanced.ui.max_memory_spin.valueChanged.connect(self.option_changed)
self.ui.dl_optimizations_check.stateChanged.connect(self.option_changed)
self.ui.force_download_check.stateChanged.connect(self.option_changed)
self.ui.ignore_space_check.stateChanged.connect(self.option_changed)
self.ui.download_only_check.stateChanged.connect(lambda: self.non_reload_option_changed("download_only"))
self.ui.shortcut_check.stateChanged.connect(lambda: self.non_reload_option_changed("shortcut"))
self.advanced.ui.dl_optimizations_check.stateChanged.connect(self.option_changed)
self.advanced.ui.force_download_check.stateChanged.connect(self.option_changed)
self.advanced.ui.ignore_space_check.stateChanged.connect(self.option_changed)
self.advanced.ui.download_only_check.stateChanged.connect(
lambda: self.non_reload_option_changed("download_only")
)
self.ui.shortcut_check.stateChanged.connect(
lambda: self.non_reload_option_changed("shortcut")
)
self.sdl_list_cbs: List[TagCheckBox] = []
self.selectable_checks: List[TagCheckBox] = []
self.config_tags: Optional[List[str]] = None
self.setup_sdl_list("Mac" if pf.system() == "Darwin" and "Mac" in platforms else "Windows")
@ -133,23 +148,24 @@ class InstallDialog(QDialog):
if self.dl_item.options.overlay:
self.ui.platform_label.setVisible(False)
self.ui.platform_combo.setVisible(False)
self.ui.ignore_space_label.setVisible(False)
self.ui.ignore_space_check.setVisible(False)
self.ui.download_only_label.setVisible(False)
self.ui.download_only_check.setVisible(False)
self.advanced.ui.ignore_space_label.setVisible(False)
self.advanced.ui.ignore_space_check.setVisible(False)
self.advanced.ui.download_only_label.setVisible(False)
self.advanced.ui.download_only_check.setVisible(False)
self.ui.shortcut_label.setVisible(False)
self.ui.shortcut_check.setVisible(False)
self.ui.sdl_list_label.setVisible(False)
self.ui.sdl_list_frame.setVisible(False)
self.selectable.setVisible(False)
if pf.system() == "Darwin":
self.ui.shortcut_check.setDisabled(True)
self.ui.shortcut_check.setChecked(False)
self.ui.shortcut_check.setToolTip(self.tr("Creating a shortcut is not supported on MacOS"))
self.ui.install_prereqs_label.setEnabled(False)
self.ui.install_prereqs_check.setEnabled(False)
self.ui.install_prereqs_check.stateChanged.connect(lambda: self.non_reload_option_changed("install_prereqs"))
self.advanced.ui.install_prereqs_label.setEnabled(False)
self.advanced.ui.install_prereqs_check.setEnabled(False)
self.advanced.ui.install_prereqs_check.stateChanged.connect(
lambda: self.non_reload_option_changed("install_prereqs")
)
self.non_reload_option_changed("shortcut")
@ -157,7 +173,7 @@ class InstallDialog(QDialog):
self.ui.verify_button.clicked.connect(self.verify_clicked)
self.ui.install_button.clicked.connect(self.install_clicked)
self.ui.install_prereqs_check.setChecked(self.dl_item.options.install_prereqs)
self.advanced.ui.install_prereqs_check.setChecked(self.dl_item.options.install_prereqs)
self.ui.install_dialog_layout.setSizeConstraint(QLayout.SetFixedSize)
@ -171,20 +187,22 @@ class InstallDialog(QDialog):
@pyqtSlot(str)
def setup_sdl_list(self, platform="Windows"):
for cb in self.sdl_list_cbs:
for cb in self.selectable_checks:
cb.disconnect()
cb.deleteLater()
self.sdl_list_cbs.clear()
self.selectable_checks.clear()
if config_tags := self.core.lgd.config.get(self.game.app_name, 'install_tags', fallback=None):
self.config_tags = config_tags.split(",")
config_disable_sdl = self.core.lgd.config.getboolean(self.game.app_name, 'disable_sdl', fallback=False)
sdl_name = get_sdl_appname(self.game.app_name)
if not config_disable_sdl and sdl_name is not None:
self.ui.sdl_list_text.hide()
# FIXME: this should be updated whenever platform changes
sdl_data = self.core.get_sdl_data(sdl_name, platform=platform)
if sdl_data:
widget = QWidget(self.selectable)
layout = QVBoxLayout(widget)
layout.setSpacing(0)
for tag, info in sdl_data.items():
cb = TagCheckBox(info["name"], info["tags"])
if tag == "__required":
@ -193,30 +211,29 @@ class InstallDialog(QDialog):
if self.config_tags is not None:
if all(elem in self.config_tags for elem in info["tags"]):
cb.setChecked(True)
self.ui.sdl_list_layout.addWidget(cb)
self.sdl_list_cbs.append(cb)
for cb in self.sdl_list_cbs:
layout.addWidget(cb)
self.selectable_checks.append(cb)
for cb in self.selectable_checks:
cb.stateChanged.connect(self.option_changed)
self.selectable.setWidget(widget)
else:
self.ui.sdl_list_text.show()
self.ui.sdl_list_label.setEnabled(False)
self.ui.sdl_list_frame.setEnabled(False)
self.selectable.setDisabled(True)
def get_options(self):
self.dl_item.options.base_path = self.install_dir_edit.text() if not self.update else None
self.dl_item.options.max_workers = self.ui.max_workers_spin.value()
self.dl_item.options.shared_memory = self.ui.max_memory_spin.value()
self.dl_item.options.order_opt = self.ui.dl_optimizations_check.isChecked()
self.dl_item.options.force = self.ui.force_download_check.isChecked()
self.dl_item.options.ignore_space = self.ui.ignore_space_check.isChecked()
self.dl_item.options.no_install = self.ui.download_only_check.isChecked()
self.dl_item.options.max_workers = self.advanced.ui.max_workers_spin.value()
self.dl_item.options.shared_memory = self.advanced.ui.max_memory_spin.value()
self.dl_item.options.order_opt = self.advanced.ui.dl_optimizations_check.isChecked()
self.dl_item.options.force = self.advanced.ui.force_download_check.isChecked()
self.dl_item.options.ignore_space = self.advanced.ui.ignore_space_check.isChecked()
self.dl_item.options.no_install = self.advanced.ui.download_only_check.isChecked()
self.dl_item.options.platform = self.ui.platform_combo.currentText()
self.dl_item.options.install_prereqs = self.ui.install_prereqs_check.isChecked()
self.dl_item.options.install_prereqs = self.advanced.ui.install_prereqs_check.isChecked()
self.dl_item.options.create_shortcut = self.ui.shortcut_check.isChecked()
if self.sdl_list_cbs:
if self.selectable_checks:
self.dl_item.options.install_tag = [""]
for cb in self.sdl_list_cbs:
for cb in self.selectable_checks:
if data := cb.isChecked():
# noinspection PyTypeChecker
self.dl_item.options.install_tag.extend(data)
@ -253,12 +270,12 @@ class InstallDialog(QDialog):
def non_reload_option_changed(self, option: str):
if option == "download_only":
self.dl_item.options.no_install = self.ui.download_only_check.isChecked()
self.dl_item.options.no_install = self.advanced.ui.download_only_check.isChecked()
elif option == "shortcut":
QSettings().setValue("create_shortcut", self.ui.shortcut_check.isChecked())
self.dl_item.options.create_shortcut = self.ui.shortcut_check.isChecked()
elif option == "install_prereqs":
self.dl_item.options.install_prereqs = self.ui.install_prereqs_check.isChecked()
self.dl_item.options.install_prereqs = self.advanced.ui.install_prereqs_check.isChecked()
def cancel_clicked(self):
if self.config_tags:
@ -292,13 +309,13 @@ class InstallDialog(QDialog):
self.ui.cancel_button.setEnabled(True)
if pf.system() == "Windows" or ArgumentsSingleton().debug:
if dl_item.igame.prereq_info and not dl_item.igame.prereq_info.get("installed", False):
self.ui.install_prereqs_check.setEnabled(True)
self.ui.install_prereqs_label.setEnabled(True)
self.ui.install_prereqs_check.setChecked(True)
self.advanced.ui.install_prereqs_check.setEnabled(True)
self.advanced.ui.install_prereqs_label.setEnabled(True)
self.advanced.ui.install_prereqs_check.setChecked(True)
prereq_name = dl_item.igame.prereq_info.get("name", "")
prereq_path = os.path.split(dl_item.igame.prereq_info.get("path", ""))[-1]
prereq_desc = prereq_name if prereq_name else prereq_path
self.ui.install_prereqs_check.setText(
self.advanced.ui.install_prereqs_check.setText(
self.tr("Also install: {}").format(prereq_desc)
)
if self.silent:
@ -333,7 +350,7 @@ class InstallDialog(QDialog):
self.threadpool.clear()
self.threadpool.waitForDone()
self.result_ready.emit(self.dl_item)
a0.accept()
super(InstallDialog, self).closeEvent(a0)
def keyPressEvent(self, e: QKeyEvent) -> None:
if e.key() == Qt.Key_Escape:
@ -403,7 +420,4 @@ class TagCheckBox(QCheckBox):
self.tags = tags
def isChecked(self) -> Union[bool, List[str]]:
if super(TagCheckBox, self).isChecked():
return self.tags
else:
return False
return self.tags if super(TagCheckBox, self).isChecked() else False

View File

@ -1,4 +1,4 @@
from PyQt5.QtCore import QSize, pyqtSignal
from PyQt5.QtCore import QSize, pyqtSignal, pyqtSlot
from PyQt5.QtWidgets import QMenu, QTabWidget, QWidget, QWidgetAction, QShortcut, QMessageBox
from rare.shared import LegendaryCoreSingleton, GlobalSignalsSingleton, ArgumentsSingleton
@ -23,9 +23,7 @@ class TabWidget(QTabWidget):
self.args = ArgumentsSingleton()
disabled_tab = 3 if not self.args.offline else 1
self.setTabBar(MainTabBar(disabled_tab))
# lk: Figure out why this adds a white line at the top
# lk: despite setting qproperty-drawBase to 0 in the stylesheet
# self.setDocumentMode(True)
# Generate Tabs
self.games_tab = GamesTab()
self.addTab(self.games_tab, self.tr("Games"))
@ -53,12 +51,10 @@ class TabWidget(QTabWidget):
self.addTab(QWidget(), "")
self.setTabEnabled(disabled_tab, False)
# Button
self.account = QWidget()
self.addTab(self.account, "")
self.addTab(QWidget(), "")
self.setTabEnabled(disabled_tab + 1, False)
self.account_widget = AccountWidget(self)
self.account_widget.exit_app.connect(self.exit_app)
self.account_widget.logout.connect(self.logout)
account_action = QWidgetAction(self)
account_action.setDefaultWidget(self.account_widget)
@ -115,6 +111,7 @@ class TabWidget(QTabWidget):
self.tabBar().setMinimumWidth(self.width())
super(TabWidget, self).resizeEvent(event)
@pyqtSlot()
def logout(self):
# FIXME: Don't allow logging out if there are active downloads
if self.downloads_tab.is_download_active:
@ -135,4 +132,4 @@ class TabWidget(QTabWidget):
if reply == QMessageBox.Yes:
self.core.lgd.invalidate_userdata()
self.exit_app(-133742) # restart exit code
self.exit_app.emit(-133742) # restart exit code

View File

@ -8,16 +8,12 @@ from rare.utils.misc import icon
class AccountWidget(QWidget):
# int: exit code
exit_app: pyqtSignal = pyqtSignal(int)
logout = pyqtSignal()
logout: pyqtSignal = pyqtSignal()
def __init__(self, parent):
super(AccountWidget, self).__init__(parent=parent)
self.core = LegendaryCoreSingleton()
self.signals = GlobalSignalsSingleton()
# FIXME: This is why widgets should be decoupled from procedures.
# FIXME: pass downloads tab as argument to check if there are active downloads
username = self.core.lgd.userdata.get("display_name")
if not username:
@ -30,7 +26,7 @@ class AccountWidget(QWidget):
)
)
self.logout_button = QPushButton(self.tr("Logout"))
self.logout_button.clicked.connect(lambda: self.logout.emit())
self.logout_button.clicked.connect(self.logout)
layout = QVBoxLayout(self)
layout.addWidget(QLabel(self.tr("Account")))

View File

@ -17,7 +17,7 @@ from legendary.models.game import Game, InstalledGame
from rare.components.dialogs.install_dialog import InstallDialog
from rare.components.tabs.downloads.dl_queue_widget import DlQueueWidget, DlWidget
from rare.components.tabs.downloads.download_thread import DownloadThread
from rare.lgndr.downloading import UIUpdate
from rare.lgndr.models.downloading import UIUpdate
from rare.models.install import InstallOptionsModel, InstallQueueItemModel
from rare.shared import LegendaryCoreSingleton, GlobalSignalsSingleton
from rare.ui.components.tabs.downloads.downloads_tab import Ui_DownloadsTab

View File

@ -10,9 +10,9 @@ from typing import List, Optional, Dict
from PyQt5.QtCore import QThread, pyqtSignal, QProcess
from legendary.core import LegendaryCore
from rare.lgndr.api_monkeys import DLManagerSignals
from rare.lgndr.cli import LegendaryCLI
from rare.lgndr.downloading import UIUpdate
from rare.lgndr.glue.monkeys import DLManagerSignals
from rare.lgndr.models.downloading import UIUpdate
from rare.models.install import InstallQueueItemModel
from rare.shared import GlobalSignalsSingleton, ArgumentsSingleton

View File

@ -26,7 +26,7 @@ from .game_widgets.installing_game_widget import InstallingGameWidget
from .game_widgets.uninstalled_icon_widget import UninstalledIconWidget
from .game_widgets.uninstalled_list_widget import UninstalledListWidget
from .head_bar import GameListHeadBar
from .import_sync import ImportSyncTabs
from .integrations import IntegrationsTabs
logger = getLogger("GamesTab")
@ -60,8 +60,9 @@ class GamesTab(QStackedWidget):
self.addWidget(self.games)
self.head_bar = GameListHeadBar(parent=self.games)
self.head_bar.import_clicked.connect(self.show_import)
self.head_bar.egl_sync_clicked.connect(self.show_egl_sync)
self.head_bar.goto_import.connect(self.show_import)
self.head_bar.goto_egl_sync.connect(self.show_egl_sync)
self.head_bar.goto_eos_ubisoft.connect(self.show_eos_ubisoft)
self.games.layout().addWidget(self.head_bar)
self.game_info_tabs = GameInfoTabs(self.dlcs, self.game_utils, self)
@ -73,9 +74,9 @@ class GamesTab(QStackedWidget):
)
self.game_info_tabs.info.uninstalled.connect(lambda x: self.setCurrentWidget(self.games))
self.import_sync_tabs = ImportSyncTabs(self)
self.import_sync_tabs.back_clicked.connect(lambda: self.setCurrentWidget(self.games))
self.addWidget(self.import_sync_tabs)
self.integrations_tabs = IntegrationsTabs(self)
self.integrations_tabs.back_clicked.connect(lambda: self.setCurrentWidget(self.games))
self.addWidget(self.integrations_tabs)
for i in self.game_list:
if i.app_name.startswith("UE_4"):
@ -193,13 +194,20 @@ class GamesTab(QStackedWidget):
i_widget.leaveEvent(None)
l_widget.update_text()
@pyqtSlot()
def show_import(self):
self.setCurrentWidget(self.import_sync_tabs)
self.import_sync_tabs.show_import()
self.setCurrentWidget(self.integrations_tabs)
self.integrations_tabs.show_import()
def show_egl_sync(self, idx):
self.setCurrentWidget(self.import_sync_tabs)
self.import_sync_tabs.show_egl_sync()
@pyqtSlot()
def show_egl_sync(self):
self.setCurrentWidget(self.integrations_tabs)
self.integrations_tabs.show_egl_sync()
@pyqtSlot()
def show_eos_ubisoft(self):
self.setCurrentWidget(self.integrations_tabs)
self.integrations_tabs.show_eos_ubisoft()
def show_game_info(self, app_name):
self.game_info_tabs.update_game(app_name)

View File

@ -1,12 +1,12 @@
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QKeyEvent
from rare.components.tabs.games.game_utils import GameUtils
from rare.shared import LegendaryCoreSingleton, GlobalSignalsSingleton
from rare.utils.extra_widgets import SideTabWidget
from .game_dlc import GameDlc
from .game_info import GameInfo
from .game_settings import GameSettings
from ..game_utils import GameUtils
class GameInfoTabs(SideTabWidget):

View File

@ -4,7 +4,7 @@ from PyQt5.QtWidgets import (
QPushButton,
QWidget,
QHBoxLayout,
QComboBox,
QComboBox, QToolButton, QMenu, QAction,
)
from qtawesome import IconWidget
@ -14,7 +14,10 @@ from rare.utils.misc import icon
class GameListHeadBar(QWidget):
filterChanged = pyqtSignal(str)
filterChanged: pyqtSignal = pyqtSignal(str)
goto_import: pyqtSignal = pyqtSignal()
goto_egl_sync: pyqtSignal = pyqtSignal()
goto_eos_ubisoft: pyqtSignal = pyqtSignal()
def __init__(self, parent=None):
super(GameListHeadBar, self).__init__(parent=parent)
@ -58,13 +61,24 @@ class GameListHeadBar(QWidget):
self.filter.currentIndexChanged.connect(self.filter_changed)
self.import_game = QPushButton(icon("mdi.import", "fa.arrow-down"), self.tr("Import Game"))
self.import_clicked = self.import_game.clicked
integrations_menu = QMenu(self)
import_action = QAction(icon("mdi.import", "fa.arrow-down"), self.tr("Import Game"), integrations_menu)
self.egl_sync = QPushButton(icon("mdi.sync", "fa.refresh"), self.tr("Sync with EGL"))
self.egl_sync_clicked = self.egl_sync.clicked
# FIXME: Until it is ready
# self.egl_sync.setEnabled(False)
import_action.triggered.connect(self.goto_import)
egl_sync_action = QAction(icon("mdi.sync", "fa.refresh"), self.tr("Sync with EGL"), integrations_menu)
egl_sync_action.triggered.connect(self.goto_egl_sync)
eos_ubisoft_action = QAction(icon("mdi.rocket", "fa.rocket"), self.tr("Epic Overlay and Ubisoft"), integrations_menu)
eos_ubisoft_action.triggered.connect(self.goto_eos_ubisoft)
integrations_menu.addAction(import_action)
integrations_menu.addAction(egl_sync_action)
integrations_menu.addAction(eos_ubisoft_action)
integrations = QToolButton(self)
integrations.setText(self.tr("Integrations"))
integrations.setMenu(integrations_menu)
integrations.setPopupMode(QToolButton.InstantPopup)
self.search_bar = ButtonLineEdit("fa.search", placeholder_text=self.tr("Search Game"))
self.search_bar.setObjectName("search_bar")
@ -97,10 +111,9 @@ class GameListHeadBar(QWidget):
layout = QHBoxLayout()
layout.setContentsMargins(0, 5, 0, 5)
layout.addWidget(self.filter)
layout.addStretch(1)
layout.addWidget(self.import_game)
layout.addWidget(self.egl_sync)
layout.addStretch(2)
layout.addStretch(0)
layout.addWidget(integrations)
layout.addStretch(5)
layout.addWidget(self.search_bar)
layout.addStretch(2)
layout.addWidget(self.installed_icon)

View File

@ -1,45 +0,0 @@
from PyQt5.QtWidgets import QVBoxLayout, QWidget, QLabel, QSpacerItem, QSizePolicy
from rare.utils.extra_widgets import SideTabWidget
from .egl_sync_group import EGLSyncGroup
from .import_group import ImportGroup
class ImportSyncTabs(SideTabWidget):
def __init__(self, parent=None):
super(ImportSyncTabs, self).__init__(show_back=True, parent=parent)
self.import_widget = ImportSyncWidget(
ImportGroup(self),
self.tr("To import games from Epic Games Store, please enable EGL Sync."),
self,
)
self.addTab(self.import_widget, self.tr("Import Games"))
self.egl_sync_widget = ImportSyncWidget(
EGLSyncGroup(self),
self.tr("To import EGL games from directories, please use Import Game."),
self,
)
self.addTab(self.egl_sync_widget, self.tr("Sync with EGL"))
self.tabBar().setCurrentIndex(1)
def show_import(self):
self.setCurrentIndex(1)
def show_egl_sync(self):
self.setCurrentIndex(2)
class ImportSyncWidget(QWidget):
def __init__(self, widget: QWidget, info: str, parent=None):
super(ImportSyncWidget, self).__init__(parent=parent)
self.info = QLabel(f"<h4>{info}</h4>")
layout = QVBoxLayout()
layout.addWidget(widget)
layout.addWidget(self.info)
layout.addItem(
QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
)
self.setLayout(layout)

View File

@ -0,0 +1,66 @@
from typing import Optional
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QVBoxLayout, QWidget, QLabel, QSpacerItem, QSizePolicy
from rare.utils.extra_widgets import SideTabWidget
from .egl_sync_group import EGLSyncGroup
from .import_group import ImportGroup
from .eos_group import EOSGroup
from .ubisoft_group import UbisoftGroup
class IntegrationsTabs(SideTabWidget):
def __init__(self, parent=None):
super(IntegrationsTabs, self).__init__(show_back=True, parent=parent)
self.import_widget = IntegrationsWidget(
ImportGroup(self),
self.tr("To import games from Epic Games Store, please enable EGL Sync."),
self,
)
self.addTab(self.import_widget, self.tr("Import Games"))
self.egl_sync_widget = IntegrationsWidget(
EGLSyncGroup(self),
self.tr("To import EGL games from directories, please use Import Game."),
self,
)
self.addTab(self.egl_sync_widget, self.tr("Sync with EGL"))
self.eos_ubisoft = IntegrationsWidget(
None,
self.tr(""),
self,
)
self.eos_ubisoft.addWidget(UbisoftGroup(self.eos_ubisoft))
self.eos_ubisoft.addWidget(EOSGroup(self.eos_ubisoft))
self.addTab(self.eos_ubisoft, self.tr("Epic Overlay and Ubisoft"))
self.tabBar().setCurrentIndex(1)
def show_import(self):
self.setCurrentIndex(1)
def show_egl_sync(self):
self.setCurrentIndex(2)
def show_eos_ubisoft(self):
self.setCurrentIndex(3)
class IntegrationsWidget(QWidget):
def __init__(self, widget: Optional[QWidget], info: str, parent=None):
super(IntegrationsWidget, self).__init__(parent=parent)
self.info = QLabel(f"<b>{info}</b>")
layout = QVBoxLayout()
if widget is not None:
layout.addWidget(widget)
layout.addWidget(self.info)
layout.addItem(
QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
)
self.setLayout(layout)
def addWidget(self, widget: QWidget, stretch: int = 0, alignment: Qt.AlignmentFlag = Qt.Alignment()):
self.layout().insertWidget(self.layout().count() - 2, widget, stretch, alignment)

View File

@ -4,17 +4,17 @@ from logging import getLogger
from typing import Tuple, Iterable, List
from PyQt5.QtCore import Qt, QThreadPool, QRunnable, pyqtSlot, pyqtSignal
from PyQt5.QtWidgets import QGroupBox, QListWidgetItem, QFileDialog, QMessageBox
from PyQt5.QtWidgets import QGroupBox, QListWidgetItem, QFileDialog, QMessageBox, QFrame
from rare.lgndr.api_exception import LgndrException
from rare.lgndr.glue.exception import LgndrException
from rare.shared import LegendaryCoreSingleton, GlobalSignalsSingleton
from rare.ui.components.tabs.games.import_sync.egl_sync_group import Ui_EGLSyncGroup
from rare.ui.components.tabs.games.import_sync.egl_sync_list_group import (
from rare.ui.components.tabs.games.integrations.egl_sync_group import Ui_EGLSyncGroup
from rare.ui.components.tabs.games.integrations.egl_sync_list_group import (
Ui_EGLSyncListGroup,
)
from rare.utils.extra_widgets import PathEdit
from rare.utils.models import PathSpec
from rare.utils.misc import WineResolver
from rare.utils.models import PathSpec
logger = getLogger("EGLSync")
@ -207,51 +207,50 @@ class EGLSyncListItem(QListWidgetItem):
return self.game.app_title
class EGLSyncListGroup(QGroupBox, Ui_EGLSyncListGroup):
class EGLSyncListGroup(QGroupBox):
action_errors = pyqtSignal(list)
def __init__(self, export: bool, parent=None):
super(EGLSyncListGroup, self).__init__(parent=parent)
self.setupUi(self)
self.ui = Ui_EGLSyncListGroup()
self.ui.setupUi(self)
self.ui.list.setFrameShape(QFrame.NoFrame)
self.core = LegendaryCoreSingleton()
self.signals = GlobalSignalsSingleton()
self.list.setProperty("noBorder", 1)
# TODO: Convert the CSS and the code to adhere to NoFrame
# self.list.setFrameShape(self.list.NoFrame)
self.export = export
if export:
self.setTitle(self.tr("Exportable games"))
self.label.setText(self.tr("No games to export to EGL"))
self.action_button.setText(self.tr("Export"))
self.ui.label.setText(self.tr("No games to export to EGL"))
self.ui.action_button.setText(self.tr("Export"))
self.list_func = self.core.egl_get_exportable
else:
self.setTitle(self.tr("Importable games"))
self.label.setText(self.tr("No games to import from EGL"))
self.action_button.setText(self.tr("Import"))
self.ui.label.setText(self.tr("No games to import from EGL"))
self.ui.action_button.setText(self.tr("Import"))
self.list_func = self.core.egl_get_importable
self.list.itemDoubleClicked.connect(
self.ui.list.itemDoubleClicked.connect(
lambda item: item.setCheckState(Qt.Unchecked)
if item.checkState() != Qt.Unchecked
else item.setCheckState(Qt.Checked)
)
self.list.itemChanged.connect(self.has_selected)
self.ui.list.itemChanged.connect(self.has_selected)
self.select_all_button.clicked.connect(lambda: self.mark(Qt.Checked))
self.select_none_button.clicked.connect(lambda: self.mark(Qt.Unchecked))
self.ui.select_all_button.clicked.connect(lambda: self.mark(Qt.Checked))
self.ui.select_none_button.clicked.connect(lambda: self.mark(Qt.Unchecked))
self.action_button.clicked.connect(self.action)
self.ui.action_button.clicked.connect(self.action)
self.action_errors.connect(self.show_errors)
def has_selected(self):
for item in self.items:
if item.is_checked():
self.action_button.setEnabled(True)
self.ui.action_button.setEnabled(True)
return
self.action_button.setEnabled(False)
self.ui.action_button.setEnabled(False)
def mark(self, state):
for item in self.items:
@ -259,17 +258,17 @@ class EGLSyncListGroup(QGroupBox, Ui_EGLSyncListGroup):
def populate(self, enabled: bool):
if enabled:
self.list.clear()
self.ui.list.clear()
for item in self.list_func():
try:
i = EGLSyncListItem(item, self.export, self.list)
i = EGLSyncListItem(item, self.export, self.ui.list)
except AttributeError:
logger.error(f"{item.app_name} does not work. Ignoring")
else:
self.list.addItem(i)
self.label.setVisible(not enabled or not bool(self.list.count()))
self.list.setVisible(enabled and bool(self.list.count()))
self.buttons_widget.setVisible(enabled and bool(self.list.count()))
self.ui.list.addItem(i)
self.ui.label.setVisible(not enabled or not bool(self.ui.list.count()))
self.ui.list.setVisible(enabled and bool(self.ui.list.count()))
self.ui.buttons_widget.setVisible(enabled and bool(self.ui.list.count()))
def action(self):
imported: List = []
@ -280,7 +279,7 @@ class EGLSyncListGroup(QGroupBox, Ui_EGLSyncListGroup):
errors.append(e)
else:
imported.append(item.app_name)
self.list.takeItem(self.list.row(item))
self.ui.list.takeItem(self.ui.list.row(item))
if not self.export and imported:
self.signals.update_gamelist.emit(imported)
self.populate(True)
@ -301,7 +300,7 @@ class EGLSyncListGroup(QGroupBox, Ui_EGLSyncListGroup):
def items(self) -> Iterable[EGLSyncListItem]:
# for i in range(self.list.count()):
# yield self.list.item(i)
return [self.list.item(i) for i in range(self.list.count())]
return [self.ui.list.item(i) for i in range(self.ui.list.count())]
class EGLSyncWorker(QRunnable):

View File

@ -5,11 +5,11 @@ from typing import List
from PyQt5.QtCore import QRunnable, QObject, pyqtSignal, QThreadPool
from PyQt5.QtWidgets import QGroupBox, QMessageBox
from legendary.lfs import eos
from rare.shared import LegendaryCoreSingleton, GlobalSignalsSingleton
from rare.ui.components.tabs.settings.widgets.eos_widget import Ui_EosWidget
from rare.models.install import InstallOptionsModel
from rare.shared import LegendaryCoreSingleton, GlobalSignalsSingleton
from rare.ui.components.tabs.games.integrations.eos_widget import Ui_EosWidget
logger = getLogger("EOS")
@ -42,9 +42,9 @@ class CheckForUpdateWorker(QRunnable):
self.signals.update_available.emit(self.core.overlay_update_available)
class EosWidget(QGroupBox, Ui_EosWidget):
def __init__(self):
super(EosWidget, self).__init__()
class EOSGroup(QGroupBox, Ui_EosWidget):
def __init__(self, parent=None):
super(EOSGroup, self).__init__(parent=parent)
self.setupUi(self)
self.core = LegendaryCoreSingleton()
self.signals = GlobalSignalsSingleton()
@ -55,7 +55,6 @@ class EosWidget(QGroupBox, Ui_EosWidget):
self.uninstall_button.clicked.connect(self.uninstall_overlay)
self.update_button.setVisible(False)
self.update_info_lbl.setVisible(False)
self.overlay = self.core.lgd.get_overlay_install_info()
self.signals.overlay_installation_finished.connect(self.overlay_installation_finished)
@ -66,12 +65,12 @@ class EosWidget(QGroupBox, Ui_EosWidget):
self.update_button.clicked.connect(lambda: self.install_overlay(True))
if self.overlay: # installed
self.installed_version_lbl.setText(self.overlay.version)
self.installed_path_lbl.setText(self.overlay.install_path)
self.info_stack.setCurrentIndex(0)
self.installed_version_lbl.setText(f"<b>{self.overlay.version}</b>")
self.installed_path_lbl.setText(f"<b>{self.overlay.install_path}</b>")
self.overlay_stack.setCurrentIndex(0)
else:
self.info_stack.setCurrentIndex(1)
self.enable_gb.setDisabled(True)
self.overlay_stack.setCurrentIndex(1)
self.enable_frame.setDisabled(True)
if platform.system() == "Windows":
self.current_prefix = None
@ -84,7 +83,7 @@ class EosWidget(QGroupBox, Ui_EosWidget):
for pfx in pfxs:
self.select_pfx_combo.addItem(pfx.replace(os.path.expanduser("~/"), "~/"))
if not pfxs:
self.enable_gb.setDisabled(True)
self.enable_frame.setDisabled(True)
else:
self.select_pfx_combo.setCurrentIndex(0)
@ -111,7 +110,6 @@ class EosWidget(QGroupBox, Ui_EosWidget):
def check_for_update(self):
def worker_finished(update_available):
self.update_button.setVisible(update_available)
self.update_info_lbl.setVisible(update_available)
self.update_check_button.setDisabled(False)
if not update_available:
self.update_check_button.setText(self.tr("No update available"))
@ -129,14 +127,13 @@ class EosWidget(QGroupBox, Ui_EosWidget):
QMessageBox.warning(self, "Error", self.tr("Something went wrong, when installing overlay"))
return
self.info_stack.setCurrentIndex(0)
self.installed_version_lbl.setText(self.overlay.version)
self.installed_path_lbl.setText(self.overlay.install_path)
self.overlay_stack.setCurrentIndex(0)
self.installed_version_lbl.setText(f"<b>{self.overlay.version}</b>")
self.installed_path_lbl.setText(f"<b>{self.overlay.install_path}</b>")
self.update_button.setVisible(False)
self.update_info_lbl.setVisible(False)
self.enable_gb.setEnabled(True)
self.enable_frame.setEnabled(True)
def update_select_combo(self, i: None):
if i is None:
@ -215,8 +212,8 @@ class EosWidget(QGroupBox, Ui_EosWidget):
base_path = os.path.expanduser("~/legendary/.overlay")
if update:
if not self.overlay:
self.info_stack.setCurrentIndex(1)
self.enable_gb.setDisabled(True)
self.overlay_stack.setCurrentIndex(1)
self.enable_frame.setDisabled(True)
QMessageBox.warning(self, "Warning", self.tr("Overlay is not installed. Could not update"))
return
base_path = self.overlay.install_path
@ -229,7 +226,7 @@ class EosWidget(QGroupBox, Ui_EosWidget):
def uninstall_overlay(self):
if not self.core.is_overlay_installed():
logger.error('No legendary-managed overlay installation found.')
self.info_stack.setCurrentIndex(1)
self.overlay_stack.setCurrentIndex(1)
return
if QMessageBox.No == QMessageBox.question(
@ -248,6 +245,6 @@ class EosWidget(QGroupBox, Ui_EosWidget):
logger.warning(f"{prefix}: {e}")
self.core.remove_overlay_install()
self.info_stack.setCurrentIndex(1)
self.overlay_stack.setCurrentIndex(1)
self.enable_gb.setDisabled(True)
self.enable_frame.setDisabled(True)

View File

@ -10,11 +10,11 @@ from PyQt5.QtCore import Qt, QModelIndex, pyqtSignal, QRunnable, QObject, QThrea
from PyQt5.QtGui import QStandardItemModel
from PyQt5.QtWidgets import QFileDialog, QGroupBox, QCompleter, QTreeView, QHeaderView, QMessageBox
from rare.lgndr.api_arguments import LgndrImportGameArgs
from rare.lgndr.api_monkeys import LgndrIndirectStatus
from rare.lgndr.cli import LegendaryCLI
from rare.lgndr.glue.arguments import LgndrImportGameArgs
from rare.lgndr.glue.monkeys import LgndrIndirectStatus
from rare.shared import LegendaryCoreSingleton, GlobalSignalsSingleton, ApiResultsSingleton
from rare.ui.components.tabs.games.import_sync.import_group import Ui_ImportGroup
from rare.ui.components.tabs.games.integrations.import_group import Ui_ImportGroup
from rare.utils.extra_widgets import IndicatorLineEdit, PathEdit
from rare.widgets.elide_label import ElideLabel
@ -173,7 +173,7 @@ class ImportGroup(QGroupBox):
self.path_edit = PathEdit(
self.core.get_default_install_dir(),
QFileDialog.DirectoryOnly,
edit_func=self.path_edit_cb,
edit_func=self.path_edit_callback,
parent=self,
)
self.path_edit.textChanged.connect(self.path_changed)
@ -184,7 +184,7 @@ class ImportGroup(QGroupBox):
completer=AppNameCompleter(
app_names=[(i.app_name, i.app_title) for i in self.api_results.game_list]
),
edit_func=self.app_name_edit_cb,
edit_func=self.app_name_edit_callback,
parent=self,
)
self.app_name_edit.textChanged.connect(self.app_name_changed)
@ -192,6 +192,7 @@ class ImportGroup(QGroupBox):
self.ui.import_folder_check.stateChanged.connect(self.import_folder_changed)
self.ui.import_dlcs_check.setEnabled(False)
self.ui.import_dlcs_check.stateChanged.connect(self.import_dlcs_changed)
self.ui.import_button.setEnabled(False)
self.ui.import_button.clicked.connect(
@ -203,7 +204,7 @@ class ImportGroup(QGroupBox):
self.threadpool = QThreadPool.globalInstance()
def path_edit_cb(self, path) -> Tuple[bool, str, str]:
def path_edit_callback(self, path) -> Tuple[bool, str, str]:
if os.path.exists(path):
if os.path.exists(os.path.join(path, ".egstore")):
return True, path, ""
@ -213,7 +214,8 @@ class ImportGroup(QGroupBox):
return False, path, PathEdit.reasons.dir_not_exist
return False, path, ""
def path_changed(self, path):
@pyqtSlot(str)
def path_changed(self, path: str):
self.info_label.setText("")
self.ui.import_folder_check.setCheckState(Qt.Unchecked)
if self.path_edit.is_valid:
@ -221,7 +223,7 @@ class ImportGroup(QGroupBox):
else:
self.app_name_edit.setText("")
def app_name_edit_cb(self, text) -> Tuple[bool, str, str]:
def app_name_edit_callback(self, text) -> Tuple[bool, str, str]:
if not text:
return False, text, ""
if text in self.app_name_list:
@ -229,6 +231,7 @@ class ImportGroup(QGroupBox):
else:
return False, text, IndicatorLineEdit.reasons.game_not_installed
@pyqtSlot(str)
def app_name_changed(self, app_name: str):
self.info_label.setText("")
self.ui.import_dlcs_check.setCheckState(Qt.Unchecked)
@ -241,7 +244,8 @@ class ImportGroup(QGroupBox):
self.ui.import_dlcs_check.setEnabled(False)
self.ui.import_button.setEnabled(False)
def import_folder_changed(self, state):
@pyqtSlot(int)
def import_folder_changed(self, state: Qt.CheckState):
self.app_name_edit.setEnabled(not state)
self.ui.import_dlcs_check.setCheckState(Qt.Unchecked)
self.ui.import_dlcs_check.setEnabled(
@ -250,6 +254,10 @@ class ImportGroup(QGroupBox):
)
self.ui.import_button.setEnabled(state or (not state and self.app_name_edit.is_valid))
@pyqtSlot(int)
def import_dlcs_changed(self, state: Qt.CheckState):
self.ui.import_button.setEnabled(self.ui.import_folder_check.isChecked() or self.app_name_edit.is_valid)
def import_pressed(self, path=None):
if not path:
path = self.path_edit.text()

View File

@ -3,7 +3,7 @@ import webbrowser
from logging import getLogger
from PyQt5.QtCore import QObject, pyqtSignal, QRunnable, QThreadPool, QSize
from PyQt5.QtWidgets import QWidget, QLabel, QHBoxLayout, QSizePolicy, QPushButton
from PyQt5.QtWidgets import QWidget, QLabel, QHBoxLayout, QSizePolicy, QPushButton, QGroupBox, QVBoxLayout
from legendary.models.game import Game
from rare.shared import LegendaryCoreSingleton, ArgumentsSingleton
@ -82,6 +82,7 @@ class UbiLinkWidget(QWidget):
super(UbiLinkWidget, self).__init__()
self.args = ArgumentsSingleton()
layout = QHBoxLayout()
layout.setContentsMargins(0, 0, 0, 0)
self.game = game
self.ubi_account_id = ubi_account_id
@ -130,12 +131,13 @@ class UbiLinkWidget(QWidget):
self.link_button.setDisabled(False)
class UbiActivationHelper(QObject):
def __init__(self, widget: QWidget):
super(UbiActivationHelper, self).__init__()
class UbisoftGroup(QGroupBox):
def __init__(self, parent=None):
super(UbisoftGroup, self).__init__(parent=parent)
self.setTitle(self.tr("Link Ubisoft Games"))
self.setLayout(QVBoxLayout())
self.core = LegendaryCoreSingleton()
self.args = ArgumentsSingleton()
self.widget = widget
self.thread_pool = QThreadPool.globalInstance()
worker = UbiGetInfoWorker()
@ -147,7 +149,7 @@ class UbiActivationHelper(QObject):
logger.error(
"No linked ubisoft account found! Link your accounts via your browser and try again."
)
self.widget.layout().addWidget(
self.layout().addWidget(
QLabel(
self.tr(
"Your account is not linked with Ubisoft. Please link your account first"
@ -158,10 +160,10 @@ class UbiActivationHelper(QObject):
open_browser_button.clicked.connect(
lambda: webbrowser.open("https://www.epicgames.com/id/link/ubisoft")
)
self.widget.layout().addWidget(open_browser_button)
self.layout().addWidget(open_browser_button)
return
elif ubi_account_id == "error":
self.widget.layout().addWidget(QLabel(self.tr("An error occurred")))
self.layout().addWidget(QLabel(self.tr("An error occurred")))
return
games = self.core.get_game_list(False)
@ -195,13 +197,13 @@ class UbiActivationHelper(QObject):
if not uplay_games:
if activated >= 1:
self.widget.layout().addWidget(
self.layout().addWidget(
QLabel(
self.tr("All your Ubisoft games have already been activated")
)
)
else:
self.widget.layout().addWidget(
self.layout().addWidget(
QLabel(self.tr("You don't own any Ubisoft games"))
)
if self.args.debug:
@ -209,10 +211,10 @@ class UbiActivationHelper(QObject):
Game(app_name="Test", app_title="This is a test game"),
ubi_account_id,
)
self.widget.layout().addWidget(widget)
self.layout().addWidget(widget)
return
logger.info(f"Found {len(uplay_games)} game(s) to redeem")
for game in uplay_games:
widget = UbiLinkWidget(game, ubi_account_id)
self.widget.layout().addWidget(widget)
self.layout().addWidget(widget)

View File

@ -6,8 +6,6 @@ from typing import Tuple
from PyQt5.QtCore import Qt, QRunnable, QObject, pyqtSignal, QThreadPool, QSettings
from PyQt5.QtWidgets import QSizePolicy, QWidget, QFileDialog, QMessageBox
from rare.components.tabs.settings.widgets.eos import EosWidget
from rare.components.tabs.settings.widgets.ubisoft_activation import UbiActivationHelper
from rare.shared import LegendaryCoreSingleton
from rare.ui.components.tabs.settings.legendary import Ui_LegendarySettings
from rare.utils.extra_widgets import PathEdit, IndicatorLineEdit
@ -87,10 +85,6 @@ class LegendarySettings(QWidget, Ui_LegendarySettings):
)
self.locale_layout.addWidget(self.locale_edit)
self.ubi_helper = UbiActivationHelper(self.ubisoft_gb)
self.eos_widget = EosWidget()
self.left_layout.insertWidget(3, self.eos_widget, alignment=Qt.AlignTop)
self.win32_cb.setChecked(self.settings.value("win32_meta", False, bool))
self.win32_cb.stateChanged.connect(lambda: self.settings.setValue("win32_meta", self.win32_cb.isChecked()))

View File

@ -7,9 +7,10 @@ from argparse import Namespace
from logging import getLogger
from typing import Union, Optional
from PyQt5.QtCore import QObject, QProcess, pyqtSignal, QUrl, QRunnable, QThreadPool, QSettings
from PyQt5.QtCore import QObject, QProcess, pyqtSignal, QUrl, QRunnable, QThreadPool, QSettings, Qt
from PyQt5.QtGui import QDesktopServices
from PyQt5.QtNetwork import QLocalServer, QLocalSocket
from PyQt5.QtWidgets import QApplication
from rare.lgndr.core import LegendaryCore
from rare.widgets.rare_app import RareApp
@ -217,6 +218,9 @@ class GameProcessApp(RareApp):
def start_game(args: Namespace):
args = InitArgs.from_argparse(args)
QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True)
QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps, True)
app = GameProcessApp(args)
app.setQuitOnLastWindowClosed(True)

View File

@ -11,7 +11,9 @@ from legendary.models.game import Game, InstalledGame, VerifyResult
from legendary.lfs.utils import validate_files
from legendary.utils.selective_dl import get_sdl_appname
from .api_arguments import (
from rare.lgndr.core import LegendaryCore
from rare.lgndr.downloader.mp.manager import DLManager
from rare.lgndr.glue.arguments import (
LgndrInstallGameArgs,
LgndrImportGameArgs,
LgndrVerifyGameArgs,
@ -19,9 +21,7 @@ from .api_arguments import (
LgndrInstallGameRealArgs,
LgndrInstallGameRealRet,
)
from .api_monkeys import LgndrIndirectStatus, LgndrIndirectLogger
from .core import LegendaryCore
from .manager import DLManager
from rare.lgndr.glue.monkeys import LgndrIndirectStatus, LgndrIndirectLogger
# fmt: off

View File

@ -1,4 +1,3 @@
from hashlib import sha1
from multiprocessing import Queue
# On Windows the monkeypatching of `run_real` below doesn't work like on Linux
@ -10,8 +9,8 @@ from legendary.models.downloading import AnalysisResult
from legendary.models.game import Game, InstalledGame
from legendary.models.manifest import ManifestMeta
from .api_exception import LgndrException, LgndrCoreLogHandler
from .manager import DLManager
from rare.lgndr.downloader.mp.manager import DLManager
from rare.lgndr.glue.exception import LgndrException, LgndrCoreLogHandler
legendary.core.DLManager = DLManager

View File

View File

@ -11,8 +11,8 @@ from legendary.downloader.mp.manager import DLManager as DLManagerReal
from legendary.downloader.mp.workers import DLWorker, FileWorker
from legendary.models.downloading import ChunkTask, SharedMemorySegment, TerminateWorkerTask
from .downloading import UIUpdate
from .api_monkeys import DLManagerSignals
from rare.lgndr.glue.monkeys import DLManagerSignals
from rare.lgndr.models.downloading import UIUpdate
# fmt: off

View File

View File

@ -2,14 +2,14 @@ from dataclasses import dataclass
from enum import IntEnum
from typing import Callable, List, Optional, Dict
from .api_monkeys import (
from rare.lgndr.glue.monkeys import (
LgndrIndirectStatus,
GetBooleanChoiceProtocol,
get_boolean_choice,
verify_stdout,
DLManagerSignals
)
from .downloading import UIUpdate
from rare.lgndr.models.downloading import UIUpdate
"""
@dataclass(kw_only=True)

View File

@ -1,5 +1,5 @@
import logging
import warnings
# import warnings
class LgndrException(RuntimeError):

View File

View File

@ -6,7 +6,7 @@ from typing import List, Optional, Callable, Dict
from legendary.models.downloading import AnalysisResult, ConditionCheckResult
from legendary.models.game import Game, InstalledGame
from rare.lgndr.manager import DLManager
from rare.lgndr.downloader.mp.manager import DLManager
@dataclass

View File

@ -2,13 +2,28 @@
# Resource object code
#
# Created by: The Resource Compiler for PyQt5 (Qt v5.15.2)
# Created by: The Resource Compiler for PyQt5 (Qt v5.15.6)
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore
qt_resource_data = b"\
\x00\x00\x00\xce\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x37\x33\x36\x22\
\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x37\x33\
\x36\x20\x37\x33\x36\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x37\x33\
\x36\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\
\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\
\x2f\x73\x76\x67\x22\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\
\x20\x64\x3d\x22\x6d\x33\x36\x38\x20\x31\x32\x30\x63\x2d\x31\x33\
\x37\x20\x30\x2d\x32\x34\x38\x20\x31\x31\x31\x2d\x32\x34\x38\x20\
\x32\x34\x38\x73\x31\x31\x31\x20\x32\x34\x38\x20\x32\x34\x38\x20\
\x32\x34\x38\x20\x32\x34\x38\x2d\x31\x31\x31\x20\x32\x34\x38\x2d\
\x32\x34\x38\x2d\x31\x31\x31\x2d\x32\x34\x38\x2d\x32\x34\x38\x2d\
\x32\x34\x38\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x46\x41\
\x41\x43\x45\x22\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
\x00\x00\x00\xf4\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x36\x34\x30\x22\
@ -27,6 +42,23 @@ qt_resource_data = b"\
\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\
\x3d\x22\x23\x45\x37\x42\x44\x35\x34\x22\x2f\x3e\x0a\x3c\x2f\x73\
\x76\x67\x3e\
\x00\x00\x00\xe2\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x36\x38\x38\x22\
\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x36\x38\
\x38\x20\x36\x38\x38\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x36\x38\
\x38\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\
\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\
\x2f\x73\x76\x67\x22\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\
\x20\x64\x3d\x22\x6d\x35\x32\x30\x20\x31\x32\x30\x68\x2d\x33\x35\
\x32\x63\x2d\x32\x36\x2e\x35\x20\x30\x2d\x34\x38\x20\x32\x31\x2e\
\x35\x2d\x34\x38\x20\x34\x38\x76\x33\x35\x32\x63\x30\x20\x32\x36\
\x2e\x35\x20\x32\x31\x2e\x35\x20\x34\x38\x20\x34\x38\x20\x34\x38\
\x6c\x34\x30\x30\x2d\x34\x30\x30\x63\x30\x2d\x32\x36\x2e\x35\x2d\
\x32\x31\x2e\x35\x2d\x34\x38\x2d\x34\x38\x2d\x34\x38\x7a\x22\x0a\
\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\
\x23\x41\x38\x41\x41\x41\x42\x22\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\
\x3e\
\x00\x00\x00\xce\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x37\x33\x36\x22\
@ -40,8 +72,26 @@ qt_resource_data = b"\
\x32\x34\x38\x73\x31\x31\x31\x20\x32\x34\x38\x20\x32\x34\x38\x20\
\x32\x34\x38\x20\x32\x34\x38\x2d\x31\x31\x31\x20\x32\x34\x38\x2d\
\x32\x34\x38\x2d\x31\x31\x31\x2d\x32\x34\x38\x2d\x32\x34\x38\x2d\
\x32\x34\x38\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x46\x41\
\x41\x43\x45\x22\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
\x32\x34\x38\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x41\x38\x41\
\x41\x41\x42\x22\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
\x00\x00\x00\xf8\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x36\x38\x38\x22\
\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x36\x38\
\x38\x20\x36\x38\x38\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x36\x38\
\x38\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\
\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\
\x2f\x73\x76\x67\x22\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\
\x20\x64\x3d\x22\x6d\x35\x32\x30\x20\x31\x32\x30\x68\x2d\x33\x35\
\x32\x63\x2d\x32\x36\x2e\x35\x20\x30\x2d\x34\x38\x20\x32\x31\x2e\
\x35\x2d\x34\x38\x20\x34\x38\x76\x33\x35\x32\x63\x30\x20\x32\x36\
\x2e\x35\x20\x32\x31\x2e\x35\x20\x34\x38\x20\x34\x38\x20\x34\x38\
\x68\x33\x35\x32\x63\x32\x36\x2e\x35\x20\x30\x20\x34\x38\x2d\x32\
\x31\x2e\x35\x20\x34\x38\x2d\x34\x38\x76\x2d\x33\x35\x32\x63\x30\
\x2d\x32\x36\x2e\x35\x2d\x32\x31\x2e\x35\x2d\x34\x38\x2d\x34\x38\
\x2d\x34\x38\x7a\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
\x66\x69\x6c\x6c\x3d\x22\x23\x41\x38\x41\x41\x41\x42\x22\x2f\x3e\
\x0a\x3c\x2f\x73\x76\x67\x3e\
\x00\x00\x00\xf3\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x33\x32\x30\x22\
@ -60,6 +110,23 @@ qt_resource_data = b"\
\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\
\x22\x23\x45\x37\x42\x44\x35\x34\x22\x2f\x3e\x0a\x3c\x2f\x73\x76\
\x67\x3e\
\x00\x00\x00\xe2\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x36\x38\x38\x22\
\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x36\x38\
\x38\x20\x36\x38\x38\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x36\x38\
\x38\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\
\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\
\x2f\x73\x76\x67\x22\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\
\x20\x64\x3d\x22\x6d\x35\x32\x30\x20\x31\x32\x30\x68\x2d\x33\x35\
\x32\x63\x2d\x32\x36\x2e\x35\x20\x30\x2d\x34\x38\x20\x32\x31\x2e\
\x35\x2d\x34\x38\x20\x34\x38\x76\x33\x35\x32\x63\x30\x20\x32\x36\
\x2e\x35\x20\x32\x31\x2e\x35\x20\x34\x38\x20\x34\x38\x20\x34\x38\
\x6c\x34\x30\x30\x2d\x34\x30\x30\x63\x30\x2d\x32\x36\x2e\x35\x2d\
\x32\x31\x2e\x35\x2d\x34\x38\x2d\x34\x38\x2d\x34\x38\x7a\x22\x0a\
\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\
\x23\x46\x46\x41\x41\x43\x45\x22\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\
\x3e\
\x00\x00\x01\x0d\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x33\x32\x30\x22\
@ -95,282 +162,215 @@ qt_resource_data = b"\
\x31\x2e\x35\x20\x34\x38\x2d\x34\x38\x76\x2d\x33\x35\x32\x63\x30\
\x2d\x32\x36\x2e\x35\x2d\x32\x31\x2e\x35\x2d\x34\x38\x2d\x34\x38\
\x2d\x34\x38\x7a\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
\x66\x69\x6c\x6c\x3d\x22\x23\x41\x38\x41\x41\x41\x42\x22\x2f\x3e\
\x0a\x3c\x2f\x73\x76\x67\x3e\
\x00\x00\x00\xe2\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x36\x38\x38\x22\
\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x36\x38\
\x38\x20\x36\x38\x38\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x36\x38\
\x38\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\
\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\
\x2f\x73\x76\x67\x22\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\
\x20\x64\x3d\x22\x6d\x35\x32\x30\x20\x31\x32\x30\x68\x2d\x33\x35\
\x32\x63\x2d\x32\x36\x2e\x35\x20\x30\x2d\x34\x38\x20\x32\x31\x2e\
\x35\x2d\x34\x38\x20\x34\x38\x76\x33\x35\x32\x63\x30\x20\x32\x36\
\x2e\x35\x20\x32\x31\x2e\x35\x20\x34\x38\x20\x34\x38\x20\x34\x38\
\x6c\x34\x30\x30\x2d\x34\x30\x30\x63\x30\x2d\x32\x36\x2e\x35\x2d\
\x32\x31\x2e\x35\x2d\x34\x38\x2d\x34\x38\x2d\x34\x38\x7a\x22\x0a\
\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\
\x23\x41\x38\x41\x41\x41\x42\x22\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\
\x3e\
\x00\x00\x00\xce\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x37\x33\x36\x22\
\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x37\x33\
\x36\x20\x37\x33\x36\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x37\x33\
\x36\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\
\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\
\x2f\x73\x76\x67\x22\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\
\x20\x64\x3d\x22\x6d\x33\x36\x38\x20\x31\x32\x30\x63\x2d\x31\x33\
\x37\x20\x30\x2d\x32\x34\x38\x20\x31\x31\x31\x2d\x32\x34\x38\x20\
\x32\x34\x38\x73\x31\x31\x31\x20\x32\x34\x38\x20\x32\x34\x38\x20\
\x32\x34\x38\x20\x32\x34\x38\x2d\x31\x31\x31\x20\x32\x34\x38\x2d\
\x32\x34\x38\x2d\x31\x31\x31\x2d\x32\x34\x38\x2d\x32\x34\x38\x2d\
\x32\x34\x38\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x41\x38\x41\
\x41\x41\x42\x22\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
\x00\x00\x00\xe2\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x36\x38\x38\x22\
\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x36\x38\
\x38\x20\x36\x38\x38\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x36\x38\
\x38\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\
\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\
\x2f\x73\x76\x67\x22\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\
\x20\x64\x3d\x22\x6d\x35\x32\x30\x20\x31\x32\x30\x68\x2d\x33\x35\
\x32\x63\x2d\x32\x36\x2e\x35\x20\x30\x2d\x34\x38\x20\x32\x31\x2e\
\x35\x2d\x34\x38\x20\x34\x38\x76\x33\x35\x32\x63\x30\x20\x32\x36\
\x2e\x35\x20\x32\x31\x2e\x35\x20\x34\x38\x20\x34\x38\x20\x34\x38\
\x6c\x34\x30\x30\x2d\x34\x30\x30\x63\x30\x2d\x32\x36\x2e\x35\x2d\
\x32\x31\x2e\x35\x2d\x34\x38\x2d\x34\x38\x2d\x34\x38\x7a\x22\x0a\
\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\
\x23\x46\x46\x41\x41\x43\x45\x22\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\
\x3e\
\x00\x00\x0c\xcf\
\x00\
\x00\x46\xb6\x78\x9c\xc5\x1c\x6b\x6f\xdb\xb6\xf6\xbb\x7f\x05\x6f\
\x8c\x02\x6d\xae\x5d\x3f\x64\xc7\x8e\x8b\x7e\x88\xe3\x66\xbb\xc0\
\x8a\xad\x4b\x70\xf7\x21\x28\x0a\x59\x62\x6c\xa1\xb2\xe4\x4a\x72\
\xd3\x6e\xc8\x7f\xbf\x87\x4f\x91\x14\x29\x59\x49\xda\x9b\x61\x8b\
\x43\x1e\xf2\x3c\x78\xde\xa4\x37\x38\xed\xdc\xde\xe0\x6f\xc5\xc7\
\x4e\x92\x66\x3b\x3f\x5e\x20\xf8\xe9\x62\xfa\x83\xba\xde\x99\x77\
\xee\x5d\x91\x21\xd4\xef\xa3\x9d\x1f\x25\xe8\x2e\x4d\x0a\x14\xa4\
\x71\x9a\x75\xc2\x28\xf7\xd7\x31\x0e\x61\x4d\x77\xe2\x4d\x66\x93\
\x10\x75\x67\x67\xb3\xd9\x6c\x2e\x56\x08\x08\x75\x15\xaa\xfc\x64\
\x9b\xb5\xff\x12\x9d\xcd\x7a\x08\xcd\x46\xe4\x3f\xf0\x69\x3a\x7d\
\xf1\x0a\xbd\x7d\x8b\xba\xab\x8b\xd5\x6a\xf5\xee\xc8\x55\x63\xb1\
\xea\x62\x7e\x71\x71\xb1\xec\xdc\x2e\xfd\xe0\xf3\x26\x4b\x0f\x49\
\xa8\x33\x38\x1e\x8e\xc7\xe3\x29\xea\x5e\x8e\x2f\x27\x97\x53\x8d\
\xc1\xb5\x5c\xc2\x09\xc6\x61\x54\x10\x2e\x08\x9b\x1e\xfc\x4c\x26\
\x82\x2a\xb1\xce\x5c\x02\xec\x66\x28\xc3\x7e\x50\x44\x5f\xf1\x40\
\xac\x47\xf7\x51\xb8\xc1\x45\x8e\x5e\x12\x81\xbf\x83\xd1\xbc\x87\
\xfe\xc8\xd2\x4d\x86\xf3\x7c\xe9\x67\x39\xc2\x45\xf0\xaa\xb3\x4d\
\xbf\xe2\x8c\x52\x09\x64\xc2\x8f\xe7\xa1\xee\x72\xbc\xf2\x6a\xd0\
\xdd\x6f\x71\x82\xe8\xba\x28\xd9\x20\xf2\x5b\x62\x2f\x91\x2e\x0f\
\x45\x91\x26\x80\xf2\x57\xec\x87\x38\xcb\x5f\x75\x72\x1c\x63\x00\
\x4a\x93\x05\x60\xba\x9b\xc0\x3f\x70\x7e\xa3\xd5\xc5\xac\x9e\x31\
\xb6\x4c\xe5\xa8\xe3\xc7\x05\xce\x12\xbf\xc0\x64\xa7\xf9\xd8\x1f\
\x83\xee\x2c\x2f\x97\xef\x96\x57\xb5\x3b\x89\x65\x84\xea\x2c\xbd\
\xcf\x11\x88\xff\xb7\x28\x2f\x06\x37\x19\xc6\x83\x1b\x82\xe2\xbf\
\x11\x86\x71\x3f\x09\xe9\x82\xeb\x20\x4b\xe3\x98\xc8\xaa\x03\x67\
\x9b\x66\xc0\x87\x7e\xae\x93\xb9\x17\xce\xd7\xa8\x3b\xbd\x5c\x79\
\x57\x25\x72\x0a\xa9\x20\xde\xa5\x79\x21\x89\x77\xa9\xd6\x6c\x0c\
\x5a\x75\x06\xaa\x35\xf2\xce\x15\xd5\x62\x67\xa1\x69\x85\x43\x78\
\x26\xd6\xb6\x8a\x10\x6d\xb6\x31\xfc\x5b\x80\x50\xa7\xe3\xc9\x99\
\x3f\x6c\xe4\x2b\xcc\xd2\x7d\x98\xde\x27\x02\x43\x0f\xf9\x68\x1d\
\x15\x88\x6e\x03\x90\xc5\xd6\x4f\xc4\x2a\x26\x87\x0c\xc3\x79\xee\
\xfd\xcc\x27\x7a\x70\x84\x45\x2b\x8b\xa5\x71\xdb\xb4\xc0\x0b\xbc\
\xbb\xc9\x08\x0c\xd1\x5b\x81\x25\x3a\x09\xde\x64\x7e\x18\x61\xf0\
\x0d\xa5\x7e\xe4\x28\x95\xf4\x03\xe1\x9f\x31\x02\x45\x60\x2a\xf0\
\x47\xba\x3f\xec\xc9\xd1\x5f\xef\x71\x10\xf9\xf1\xc7\x4e\x94\xdc\
\xa5\x7d\x45\x01\xa8\x12\xac\xd7\xa0\x01\x93\xd5\x74\x38\x3d\x67\
\x68\x09\xd4\x6f\xfe\x1a\xc7\x00\x9f\x17\x7e\x1c\x6b\x4b\xba\xc3\
\x19\x48\xf6\xea\xfc\x62\x46\x25\x4b\xe1\x29\x94\x84\x56\x4c\x12\
\xa0\xa7\x00\xbd\x5c\xce\x56\x4b\x07\xb4\x22\x44\x80\x1e\x03\xf4\
\x6c\x35\xf5\xe6\x43\x1d\xfa\x90\x54\x69\xe9\xce\x86\x84\x92\xab\
\xe5\x70\x3e\x65\xd0\x12\x4a\x81\x2f\xa9\xe9\x4e\x09\xfc\xf2\x6a\
\x3e\x39\x9b\xb8\xe1\x4b\x7a\xc0\xed\x01\xfc\x7c\x38\x9d\x4f\x3c\
\x13\xfe\x74\xd0\xe9\x9c\xa2\x7f\xa8\x35\xd0\xf3\x59\x08\xf7\xff\
\x86\x8e\xb1\xa3\xeb\x8b\x29\xa6\x88\x7c\x4a\x9e\x9d\x9c\x66\x7e\
\xf5\x4d\xe7\xa1\x73\xba\x10\xf8\x7b\xf0\x59\x5a\x8d\x54\x1e\x1d\
\x23\x53\x36\x2b\x46\x6d\xaa\x0e\x63\xe7\x03\x3d\xeb\x1e\xff\x6d\
\xa2\xe2\xdb\x82\x86\x15\xdb\x05\x1a\xee\xbf\xb9\xb6\x2c\x32\x3f\
\xc9\xc1\x34\x40\x3d\x19\xc8\xde\x0f\x43\x70\x55\xca\x22\xe9\x41\
\xfb\x16\x8a\x98\x37\x20\x14\x31\x42\x6e\xa5\x1a\xbe\x3d\x19\x9d\
\x7c\x34\x38\x67\xfa\xca\xb6\x25\xd1\xb2\x9f\x17\xdf\x89\x77\x01\
\x79\xc5\x51\xa0\x8c\xdf\x63\xe6\x13\x98\xda\x50\x86\x3b\x1f\xde\
\xe3\xe4\x40\x18\x06\xe7\x49\x3c\xa6\xf2\x71\xb1\x88\x0a\xbc\x83\
\x01\xe2\x53\xf9\x9c\xf8\x58\xce\x09\x57\xab\x7e\x96\xb3\x2c\x60\
\xb0\xa1\x9c\xf1\xab\xc2\x21\xf6\xf1\x32\xcd\x12\x9c\xb1\x28\xa3\
\xc2\x5d\x65\xfe\x0e\xdf\xde\x91\xff\x5e\x6f\xfd\x3d\x7e\x7b\x72\
\x76\xf2\x91\x12\x98\x60\xe2\xfb\xc8\x56\xdc\x0d\x92\x8f\xd1\x4e\
\x8c\xae\xc0\x93\x28\x1f\x95\x99\x9b\x34\x8d\x97\xe9\x37\xf8\x74\
\x99\xee\xd6\xa9\xfe\x51\xea\x98\x32\x86\x3e\x5c\xac\x73\x38\xcf\
\xa0\xf8\x0f\xb0\xc4\x19\xbd\xde\x47\x09\x5b\xba\x4a\x0f\x00\x5f\
\xfe\xad\xf8\x62\x02\x27\x82\x8e\x55\x81\x46\x52\x81\xd8\x30\x3f\
\xb6\x3c\x8d\xa3\x50\x9b\x20\x9e\xee\x90\x2f\xd0\x58\x2c\x90\xea\
\x44\x47\x1e\x9e\x2a\xe7\x27\xc8\xf3\x67\x8b\xce\xb4\x10\x87\x49\
\xb3\x24\xab\xa5\xa5\x3d\x5d\x0a\x2d\xf8\xfb\xe3\x90\x6f\xd9\x49\
\x70\x06\xb7\xdc\x38\x47\xaf\xbd\x21\xde\x51\x8a\xa8\xb2\xda\x61\
\x46\x02\xc6\x6a\x23\xba\xcc\x84\xfa\x4c\xb8\xb2\xb0\x25\x49\xca\
\xb2\x20\xea\x51\x14\xab\xaf\x4c\xb0\x93\xb8\x80\xb4\xb0\x3a\x55\
\x80\x44\x71\xf8\x17\x0d\xb9\xfa\xac\xf5\xd8\x34\xbf\xf8\xa0\x68\
\xca\x3f\x4d\x07\xa9\x00\x57\xbc\x72\x75\x15\xcb\xe1\xf5\x55\xff\
\x92\x01\x84\x46\x41\xf7\x62\x96\xa5\xb1\x00\x44\xfd\xd8\x82\x69\
\x10\x09\x43\x35\xba\xcd\x37\x3c\x52\xdb\x60\x6b\x92\x71\xf5\x49\
\xca\xd5\xd3\xfe\x52\x2c\x09\x86\x0f\xfb\xfe\x9a\x6a\x00\x03\x82\
\x79\xfe\xb7\x40\x77\x58\x07\xe0\xda\xe1\x84\xfa\x69\x16\x6d\x22\
\x48\xc8\x99\xc8\xdf\x3c\xab\xc3\xe1\xe3\x05\xd0\x18\xe3\xbb\x42\
\x02\x0c\x0d\x80\x75\x0a\xb4\xed\x2c\x30\x3a\xc7\x5a\x60\xb7\xb0\
\xae\xcf\x4b\x19\x18\xcb\x4a\x61\x38\x02\xf5\x71\xf1\xdf\x50\x4a\
\x95\xa0\xaa\x90\xf7\x69\x1e\xb1\xba\x07\x64\x81\x32\x62\x8e\xcd\
\x49\x0e\x9b\xa2\x42\x31\xe6\xd1\xe0\x54\x66\xe6\x22\xd3\x86\x74\
\xea\xe1\x09\x1a\xd1\xce\x51\xb2\x24\xfb\x48\x8d\xe4\x18\x84\x36\
\x4d\xc4\xe1\x47\x3b\x7f\x03\x7a\x74\xc8\xe2\x97\x27\x8b\x01\xd5\
\xaa\x7c\x8b\x21\x09\x1f\x5c\x6e\xa3\x38\xfc\xfd\xee\x3d\x06\xe1\
\xed\x41\xcd\xf2\x81\xdc\xf5\x75\xfe\x75\x73\xf2\x8a\x63\x6e\x62\
\x4a\x45\x49\x64\x36\x3a\x43\xff\x46\xe3\x53\x50\x68\x4d\xc5\xd1\
\x5b\x34\x9a\xc2\x18\x8f\x8f\x00\xe3\xd1\xbf\x32\x5a\x27\xb0\x0a\
\x42\x88\x57\xa2\x3c\xee\x90\x09\x56\x31\x8e\xfc\x02\xea\x21\x5c\
\xce\x42\x2a\x46\x22\x2b\xd9\xbb\x6a\x0c\x82\xf6\xf6\xb2\xca\xd3\
\xac\xe8\x1f\xf6\x9a\xa4\x6a\x5d\x40\x49\x38\xc3\xed\xa0\x5d\x9d\
\xb4\x93\x4e\x0c\xfd\x89\x74\xeb\x67\xac\x46\x3f\x4e\x77\x01\x41\
\xb6\x0f\x19\xea\x06\xc8\x0d\xe0\x80\x88\xcf\xd2\x01\x17\x8b\x60\
\x7b\x48\x3e\xeb\x3a\x30\x7e\xc1\x08\xda\xf9\x19\x75\x77\xc3\x17\
\x4e\xe5\x56\x82\xbb\x23\x9d\xd0\x42\xa3\x96\x59\x8d\xdc\xd9\x3d\
\xef\x4f\xe8\xfb\x2e\x20\xa6\x14\x51\xe0\xc7\x86\xc6\x8e\x78\xd0\
\x2d\x01\xb7\xe0\xa8\xff\x86\x03\x93\xa0\x32\xaa\x57\x61\x17\x40\
\x4e\x3f\x86\xc4\x44\x6e\xdf\xd3\xa6\xe1\xec\xeb\xa6\xe5\xea\x12\
\xa7\x63\x7d\x85\x28\x26\x20\x52\x2b\x24\xf8\x8d\x46\xa6\xa5\xee\
\xa9\x46\xf6\x3a\x16\x1a\x0c\xee\x8d\x2b\xb0\xb1\x13\x37\xb7\xaf\
\x88\xa0\xd9\x2c\x5a\x62\xb0\x48\xb1\x0e\x87\x12\x14\xda\x33\x71\
\x1c\x0a\x12\x4a\x5a\x62\xd8\xfa\x49\x28\x3d\xf8\x23\xd3\x82\x23\
\x2b\x78\x35\xf9\x76\x25\x14\xbb\x28\xe9\x0b\x85\xf2\x86\xea\x28\
\x27\xca\xe3\x69\x83\x5a\xdb\x70\xea\xf5\x62\xda\x5e\xfd\x54\x05\
\x59\x2d\xc1\x99\xa0\x68\x5c\xae\x8e\x66\xdc\x26\x6b\x50\x18\x0a\
\xe7\x44\x00\x3a\x5d\x1d\x64\x9a\x58\x8f\xa0\xe4\x61\x71\x17\x65\
\x79\xc1\x11\x69\x74\x1f\x43\xa0\x6d\x35\x25\x4a\x2c\x56\x8a\x7f\
\xb5\xd6\x97\xe5\x23\x5b\x99\x1e\x0a\xaa\xa3\x68\xc8\x38\xd9\x64\
\x51\x48\x06\x2a\x7e\x91\x2a\xe6\x36\xbd\xef\x87\x18\xa2\x0b\xed\
\x0f\xf6\x45\x0e\x2d\x57\xd7\x25\xca\x95\xfe\x49\x4d\xd7\x86\x4c\
\xcb\xf6\xa1\x2d\xe9\x2e\xbd\x75\x4d\x6b\x83\x0d\xe8\x22\xd2\x55\
\x00\x62\xe8\x0d\xc4\x7c\x26\x4a\xa0\x7d\x47\x72\x8a\x28\x87\x78\
\x0a\x45\xd0\x96\x64\x1b\x45\x4a\xb3\x02\x55\x61\x21\xaa\x0e\x4e\
\x15\x49\xde\x06\x87\x8c\x70\x75\x99\xc6\x87\x5d\xf2\xf6\x64\x78\
\xf2\xd1\x86\x59\x3f\xda\xca\xea\x3f\xd3\x7b\xe7\x52\xf5\x5c\x01\
\xbb\xc1\x31\xab\x7d\x2a\x7c\x97\xc3\x7a\x07\x47\x2f\x95\x5a\x39\
\x81\xb2\x8a\x32\x49\x50\xaa\x29\x83\x0a\x75\xc6\x20\x44\x4c\x3d\
\x8a\x96\x32\x0f\x50\xeb\xee\x9e\xa5\xc0\xae\xaf\x40\xcb\xb5\x4a\
\x25\xa2\x6c\xd2\xae\x32\x55\x76\x93\xe2\x2f\xb7\x12\x43\x76\xbf\
\x70\x64\x01\xdb\xc4\xed\x0f\x69\x47\x29\x23\x5c\x91\xcf\xcc\x61\
\x6e\x59\x67\x5c\xc1\x15\x49\x2c\xc0\xac\x0e\xfd\x28\x09\xc1\x6f\
\x15\x69\xd6\x18\x67\x65\xe6\xe8\x08\x86\x1c\x23\x9b\x67\xd4\xf4\
\xcd\xaa\x96\x33\xca\x32\x1d\x8d\x9c\x2e\xa1\xa6\xc1\xbd\x57\x8b\
\xe0\x86\xfd\x3e\xd9\xca\xb5\xe6\x9e\xb2\x2c\xd5\xd4\xec\x72\x2e\
\xe0\x65\x0e\x39\xaf\xc8\x54\x45\xda\xa4\x3a\x56\x65\xbf\xe5\x8d\
\x7e\xd1\xf5\x51\xb6\xe6\x33\x06\x4b\xd5\x7d\xd9\x15\x49\xdd\xbe\
\x52\xe1\x9d\xbb\x37\xaa\x3d\xbd\x58\xa9\xc5\xa1\x58\xad\x1b\x4d\
\xb3\x11\xb3\x4b\x19\x13\x93\xbc\x10\xb1\xc8\x49\xce\x35\x4b\x8a\
\x5e\xe1\xd4\xef\x6d\x93\x95\x89\xa1\x51\x5a\xf4\xea\xa7\x01\x8f\
\x5d\x5e\x15\x54\xcd\x12\x63\x17\x47\xa6\x62\xe6\x87\x20\x80\x4a\
\xcf\xb5\x2a\x8e\x76\x15\x03\xe2\x98\x71\xf8\xe9\x78\xad\x86\x72\
\x12\x27\xcc\xfb\xff\x02\x13\x7b\xde\xf4\xdf\xe2\xe0\x33\xfb\xf8\
\x27\x38\xb4\xb4\x21\x0e\x98\x05\x8e\xd8\x09\xe2\x93\x70\x56\xca\
\xa6\xfa\xa8\xb2\xbf\x3e\xa1\x44\x46\x65\x54\x89\x8a\xea\xa8\x12\
\x11\x0d\xf7\x58\xd7\xf2\x69\xeb\xe2\xeb\xae\xc7\xfe\x4f\xec\x69\
\xa5\xb4\xe6\xec\x44\x86\x64\x39\x0c\x55\x77\x2d\x64\xab\xd3\x76\
\xfa\x55\x08\x0b\x23\x5a\x06\x50\xe5\x48\x9b\xb6\xb0\x76\x64\xc7\
\xf2\xc1\x45\x9d\xbd\x8d\x31\x7d\xd1\x5a\x37\x9f\x57\x05\xb5\xd4\
\xc0\x71\x30\x01\xa1\xc3\x79\x2e\xe5\xac\x4d\xe8\xe5\xac\x4d\xe6\
\xca\xac\x4d\xe4\x7c\xba\x86\x62\x32\xde\xaa\xd1\xf5\xe5\x00\x1e\
\x41\xe9\x72\xd9\xf8\x85\x4f\x18\x52\x14\xa8\x6d\xa1\x40\x71\x70\
\x6d\xc2\xd8\x78\x37\x61\x6c\x12\xa8\xc0\xd8\xe4\xa0\x01\x3d\xa3\
\x34\xb6\x7e\x7c\xd7\xaf\x88\xc4\x61\x5d\xb5\x87\x31\x7d\xd1\x1e\
\x7b\x10\x65\x41\xdc\x74\x16\x1c\x6b\x93\x73\xb0\x80\xd5\x68\x63\
\x93\x2b\xb0\x81\xd5\xe8\xa7\xe9\x1a\xda\x2b\xa4\x7c\xb7\xd1\x46\
\x33\x9b\x64\xe2\x04\x6e\xd4\xd5\x26\xf9\xb8\x81\x1b\xb5\xf7\x29\
\xb2\x52\xd4\xd5\x26\xb0\x7a\xbd\x7d\x0a\x62\xa6\xa9\x16\x9c\x5a\
\x7e\x22\x3e\x76\x49\x38\xde\xab\x03\x39\x2e\xc8\xbb\xb7\xfc\x13\
\x7b\xea\xc4\x29\xd0\x5e\x78\xac\xd3\x38\xb4\xf4\xa0\x5e\x4f\x31\
\x6f\x7e\x0e\x4e\x8d\xf6\x17\x9d\x22\xc3\xbf\xdf\xdd\x01\x02\xd1\
\xcc\x20\xb3\xc6\xdd\xc0\x63\xcb\x45\xb3\xc7\xce\x5b\x15\xaf\xc7\
\xfc\x26\xbb\x64\xd8\xdf\x61\xce\xdb\xa7\x28\x90\x39\x99\x28\xb7\
\xcc\xf2\xcd\x2c\x9d\x2a\xed\x41\xfe\xe6\x63\xb1\x28\xfc\x75\x4f\
\xb5\x84\x22\x2a\x64\x4b\xb4\xe1\x22\xd5\x79\x3b\x44\x5b\xb1\xae\
\xcb\xa1\x67\x90\x5e\xe5\xca\x75\x62\xac\xe4\xb7\x4c\xb4\x1a\x76\
\x02\xd9\x1a\x25\xd5\xab\x8e\xc1\x69\xa5\xaf\xff\x85\x34\xf8\x40\
\xf0\xfc\xb1\xdd\x4b\x0a\x40\x7e\xbe\x8d\x48\x25\xdd\x43\xdf\xe1\
\xf7\xb0\x57\x0e\x8f\x17\x08\x8d\x60\x18\x7e\x8f\xca\xe1\x9c\xe9\
\x9f\x20\xc0\x9c\x18\x89\x2c\xf3\x15\x23\x44\x88\xac\xb6\xb7\x61\
\x9c\xe3\x93\xee\x80\x95\xbe\x4c\xe7\xc3\x75\xf4\x37\xfe\x25\x8b\
\xf6\xba\x69\x97\x17\x21\xfc\x08\x27\x66\x3a\xca\xdf\x57\x74\xba\
\x60\xe4\x85\x6e\x9c\xd5\x6b\xb5\xb1\x00\xce\x41\xbc\xc1\xf6\xd3\
\x5a\x5e\x4d\xc9\x73\xf1\x8c\x43\x94\xd1\xb1\xa6\x49\x50\x16\xf0\
\xd4\x7d\xb2\x97\x19\x8b\xc5\xde\x4f\x88\xa2\x3f\x68\x83\x60\x0e\
\x7d\x86\x96\x8d\x97\xb7\x63\x5f\xf6\xe0\xab\x70\x56\x7c\xef\x87\
\x99\x7f\xbf\xf4\x73\xd6\xf4\x95\x60\x74\xad\x61\x96\x66\x17\xe4\
\x91\x97\x0b\xee\xa7\x73\xe2\xf9\x8a\x42\xc2\x02\x04\xda\xd3\x47\
\xf8\xdd\xa6\x26\x4a\xd1\x4f\xad\xb4\xa7\x44\x87\x77\x6c\xdf\x5a\
\x6d\x8b\x1a\x08\x8e\xee\x8c\x56\xef\xfe\xab\xcd\x6d\x7e\xbc\xd4\
\x82\x1d\xe5\xa6\x41\x99\x53\xad\x4c\x9d\x21\x53\xb6\x06\x92\xee\
\x3c\xea\xfb\xa8\x0d\x5e\x60\xc8\x9c\x40\x7f\xa4\x7b\x81\x21\x73\
\x02\x56\x2f\xc0\x28\xa9\xf3\x02\x0f\x35\xa7\x6a\xbd\x5e\xaf\x63\
\xdc\x72\x20\x06\xe3\x9a\x68\x5a\x32\x3e\xb6\xf2\x3d\x7c\x0e\xb6\
\xa5\x0e\x56\xda\x12\xcf\x7f\x26\xcd\x9e\xd9\x7a\x26\x4f\xa2\xef\
\x78\xd1\xb5\xa6\x8e\xcc\xb7\xb8\x34\xb0\x69\x45\xcd\x2d\x94\xde\
\x16\xb1\x48\xa5\x35\x6a\x45\x5f\x1f\x85\x97\xf0\x6b\x8f\x80\x0e\
\x55\xb7\xd3\x6d\xdf\xc2\xe6\x45\x6a\xe4\xdd\x10\x8a\x1b\xfd\x50\
\x9d\xf3\x33\xe4\xdb\x1e\x95\x4b\xd0\x06\x1e\xe2\xb1\x0d\xcf\xcf\
\x2e\x1c\xf4\xc8\x42\xd5\xb0\x12\x57\xc4\xe5\xae\x2d\xae\xd0\x58\
\x64\x0b\x2c\x2c\x18\xb5\x8b\x2b\xb5\x5a\xd3\x56\xb4\x34\x5b\xd5\
\x30\xd3\xb0\xe5\x70\xb0\xda\x73\x36\x8b\x9c\xb5\x70\xf6\xb8\xc8\
\xd2\x1f\xd5\xe6\x97\xcf\xe2\x62\xd5\x43\xd5\x28\x77\xb0\xad\xb3\
\x65\xe1\xdb\xf6\xcc\xaf\x1d\xdb\xf6\xac\xfa\x39\xe3\x4a\xa9\x83\
\x6d\x1d\xf7\x23\x8e\xa4\xb5\xeb\xb6\x18\xc2\x0f\x13\x5d\x6b\xe2\
\xa8\xe8\x5a\x7b\x77\x77\x6e\x67\xb2\xe7\xf2\xef\x4c\x28\xad\x11\
\xd7\x27\x9e\x47\xe0\xa5\xfc\xda\x9d\xac\xdd\x14\xac\x74\xdb\x37\
\xb0\xba\x90\x3a\x79\xb7\xf7\xf6\x47\x27\xd5\xba\x7c\xdb\x23\x72\
\x0a\x9a\x57\x62\x80\xa8\xfb\xde\x8f\x12\xad\xce\x7a\xe6\x52\xa9\
\x39\xa9\x6f\x5b\xe1\x8b\x3c\xd2\x7b\xce\xdc\x9e\x8c\xd2\x57\xb8\
\x55\xb9\xd4\xcb\xfd\x48\x86\x2b\x9a\xa4\x22\xa8\x54\xae\xbc\x38\
\x94\x7e\x5e\x7f\xfc\x53\x53\x56\x3c\x42\xfc\xb2\x96\xa5\x25\xfc\
\x03\x7f\x1a\x64\xa1\x90\xa6\x53\xf4\xa9\x51\xcf\x09\xc2\x93\x0c\
\xe7\xcb\x30\xb3\x20\x67\xa3\x76\x1b\xb0\xe2\x8f\xfd\x23\xd0\x13\
\x20\xeb\xb3\x29\x13\x3d\x1f\xd6\xf1\x93\x17\x4a\x35\x14\x58\x92\
\x21\x5b\x5d\x57\xcf\xc6\x13\xab\x80\xaa\x63\xec\x5e\x47\x21\xfe\
\x09\x76\xec\xce\xa0\x5a\x37\xea\xbc\x1f\x90\x48\x55\xcc\xb8\x14\
\xcb\xe3\xcc\xb8\x21\x9e\xa8\xfb\x57\xad\x98\x92\x67\x1a\xb1\xc8\
\xc3\x3d\xd3\xdc\x8c\xad\x58\x94\x31\xec\xcd\x84\x61\x0a\xec\x7a\
\x4a\x69\xaa\x3b\x1d\x74\x18\x9b\x15\xbb\x6e\x6d\x76\xe4\x55\x63\
\x13\x1c\xda\xbf\x88\x53\x63\x6e\x26\x02\xfb\xb7\x6a\x5d\x47\x75\
\xfc\x3b\xcd\x4a\x2c\xbc\x2e\xfc\xe2\x90\xff\x68\xdb\xf9\x79\xed\
\x1f\x7b\x68\x7c\x6c\x9a\xce\x6e\x2b\x6e\xa2\xfd\xb3\x48\xc7\x9a\
\x8a\x36\x7f\xe5\x21\xdd\xfb\x41\x54\x7c\x87\x74\x7a\x38\x64\x44\
\x2d\xfd\x38\x4e\xd3\xa4\xa4\xcb\xfa\x3d\xef\xfa\x47\xba\x3f\x9d\
\x15\x20\x7c\x70\x8a\xfe\xca\xfc\xfd\x1e\x93\xff\xf7\x04\xbb\x35\
\x43\x04\x13\x79\xae\x4b\x8c\x41\x79\x59\xc4\xe1\x58\x73\xdc\xf6\
\x4c\xb2\xf6\x8d\x9c\x6d\x79\x53\x12\x59\x3e\x05\x2d\xbf\x62\x29\
\xf6\xb9\xe6\xd4\xb2\x99\x47\x7d\xb5\xcb\xf6\x2d\x15\xfb\xf6\x8a\
\x31\xd6\x6e\x43\xbf\x81\x6e\x6e\x41\x07\x7f\xf8\x83\x52\x41\xcd\
\xf9\xf9\xb9\x55\x3b\x8e\x96\xc5\xff\x00\xf7\x07\x68\x36\
\x00\x00\x00\xf8\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x36\x38\x38\x22\
\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x36\x38\
\x38\x20\x36\x38\x38\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x36\x38\
\x38\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\
\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\
\x2f\x73\x76\x67\x22\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\
\x20\x64\x3d\x22\x6d\x35\x32\x30\x20\x31\x32\x30\x68\x2d\x33\x35\
\x32\x63\x2d\x32\x36\x2e\x35\x20\x30\x2d\x34\x38\x20\x32\x31\x2e\
\x35\x2d\x34\x38\x20\x34\x38\x76\x33\x35\x32\x63\x30\x20\x32\x36\
\x2e\x35\x20\x32\x31\x2e\x35\x20\x34\x38\x20\x34\x38\x20\x34\x38\
\x68\x33\x35\x32\x63\x32\x36\x2e\x35\x20\x30\x20\x34\x38\x2d\x32\
\x31\x2e\x35\x20\x34\x38\x2d\x34\x38\x76\x2d\x33\x35\x32\x63\x30\
\x2d\x32\x36\x2e\x35\x2d\x32\x31\x2e\x35\x2d\x34\x38\x2d\x34\x38\
\x2d\x34\x38\x7a\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
\x66\x69\x6c\x6c\x3d\x22\x23\x46\x46\x41\x41\x43\x45\x22\x2f\x3e\
\x0a\x3c\x2f\x73\x76\x67\x3e\
\x00\x00\x0c\xc2\
\x00\
\x00\x46\xc2\x78\x9c\xcd\x1c\x6b\x6f\xdb\xb6\xf6\xbb\x7f\x85\x6e\
\x8c\x02\x6d\xae\x5d\x3f\x64\xc7\x8e\x8b\x7e\x88\xe3\x66\xbb\xc0\
\x8a\xad\x4b\x70\xf7\x21\x28\x0a\x59\x62\x6c\xa1\xb2\xe4\x4a\x72\
\xd3\x6e\xc8\x7f\xbf\x87\x4f\x91\x14\x49\x59\x49\x5a\xdc\x0c\x5b\
\x1c\xf2\x90\xe7\xc1\xf3\x26\xbd\xc1\x69\xe7\xf6\x06\x7d\x2b\x3f\
\x76\xd2\x2c\xdf\x05\xc9\xc2\x83\x9f\x2e\x22\x3f\x5e\xd7\x3f\xf3\
\xcf\xfd\x2b\x3c\xe4\xf5\xfb\xde\x2e\x88\x53\xef\x2e\x4b\x4b\x2f\
\xcc\x92\x2c\xef\x44\x71\x11\xac\x13\x14\xc1\x9a\xee\xc4\x9f\xcc\
\x26\x91\xd7\x9d\x9d\xcd\x66\xb3\x39\x5f\xc1\x21\xe4\x55\x5e\xed\
\x27\xdf\xac\x83\x97\xde\xd9\xac\xe7\x79\xb3\x11\xfe\x0f\x7c\x9a\
\x4e\x5f\xbc\xf2\xde\xbe\xf5\xba\xab\x8b\xd5\x6a\xf5\xee\xc8\x55\
\x63\xbe\xea\x62\x7e\x71\x71\xb1\xec\xdc\x2e\x83\xf0\xf3\x26\xcf\
\x0e\x69\xa4\x32\x38\x1e\x8e\xc7\xe3\xa9\xd7\xbd\x1c\x5f\x4e\x2e\
\xa7\x0a\x83\x6b\xb1\x84\x11\x8c\xa2\xb8\xc4\x5c\x60\x36\x7d\xf8\
\x99\x4c\x38\x55\x7c\x9d\xbe\x04\xd8\xcd\xbd\x1c\x05\x61\x19\x7f\
\x45\x03\xbe\xde\xbb\x8f\xa3\x0d\x2a\x0b\xef\x25\x16\xf8\x3b\x18\
\x2d\x7a\xde\x1f\x79\xb6\xc9\x51\x51\x2c\x83\xbc\xf0\x50\x19\xbe\
\xea\x6c\xb3\xaf\x28\x27\x54\x02\x99\xf0\xe3\xfb\x5e\x77\x39\x5e\
\xf9\x0e\x74\xf7\x5b\x94\x7a\x64\x5d\x9c\x6e\x3c\xfc\x5b\x60\xaf\
\x90\x2e\x0f\x65\x99\xa5\x80\xf2\x57\x14\x44\x28\x2f\x5e\x75\x0a\
\x94\x20\x00\xca\xd2\x05\x60\xba\x9b\xc0\x3f\x70\x7e\xa3\xd5\xc5\
\xcc\xcd\x18\x5d\x26\x73\xd4\x09\x92\x12\xe5\x69\x50\x22\xbc\xd3\
\x7c\x1c\x8c\x41\x77\x96\x97\xcb\x77\xcb\x2b\xe7\x4e\x7c\x19\xa6\
\x3a\xcf\xee\x0b\x0f\xc4\xff\x5b\x5c\x94\x83\x9b\x1c\xa1\xc1\x0d\
\x46\xf1\xdf\x18\xc1\x78\x90\x46\x64\xc1\x75\x98\x67\x49\x82\x65\
\xd5\x81\xb3\xcd\x72\xe0\x43\x3d\xd7\xc9\xdc\x8f\xe6\x6b\xaf\x3b\
\xbd\x5c\xf9\x57\x15\x72\x02\x29\x21\xde\x65\x45\x29\x88\xb7\xa9\
\xd6\x6c\x0c\x5a\x75\x06\xaa\x35\xf2\xcf\x25\xd5\xa2\x67\xa1\x68\
\x85\x45\x78\x3a\xd6\xb6\x8a\x10\x6f\xb6\x09\xfc\x5b\x82\x50\xa7\
\xe3\xc9\x59\x30\x6c\xe4\x2b\xca\xb3\x7d\x94\xdd\xa7\x1c\x43\xcf\
\x0b\xbc\x75\x5c\x7a\x64\x1b\x80\x2c\xb7\x41\xca\x57\x51\x39\xe4\
\x08\xce\x73\x1f\xe4\x01\xd6\x83\x23\x2c\x5a\x5a\x2c\x8c\xdb\xa4\
\x05\x7e\xe8\xdf\x4d\x46\x60\x88\xfe\x0a\x2c\xd1\x4a\xf0\x26\x0f\
\xa2\x18\x81\x6f\xa8\xf4\xa3\xf0\x32\x41\x3f\x10\xfe\x19\x79\xa0\
\x08\x54\x05\xfe\xc8\xf6\x87\x3d\x3e\xfa\xeb\x3d\x0a\xe3\x20\xf9\
\xd8\x89\xd3\xbb\xac\x2f\x29\x00\x51\x82\xf5\x1a\x34\x60\xb2\x9a\
\x0e\xa7\xe7\x14\x2d\x86\xfa\x2d\x58\xa3\x04\xe0\x8b\x32\x48\x12\
\x65\x49\x77\x38\x03\xc9\x5e\x9d\x5f\xcc\x88\x64\x09\x3c\x81\x12\
\xd0\x92\x49\x02\xf4\x14\xa0\x97\xcb\xd9\x6a\x69\x81\x96\x84\x08\
\xd0\x63\x80\x9e\xad\xa6\xfe\x7c\xa8\x42\x1f\xd2\x3a\x2d\xdd\xd9\
\x10\x53\x72\xb5\x1c\xce\xa7\x14\x5a\x40\x49\xf0\x15\x35\xdd\x29\
\x86\x5f\x5e\xcd\x27\x67\x13\x3b\x7c\x45\x0f\xb8\x3d\x80\x9f\x0f\
\xa7\xf3\x89\xaf\xc3\x9f\x0e\x3a\x9d\x53\xef\x1f\x62\x0d\xe4\x7c\
\x16\xdc\xfd\xbf\x21\x63\xf4\xe8\xfa\x7c\x8a\x2a\x22\x9b\x12\x67\
\x27\xa6\xa9\x5f\x7d\xd3\x79\xe8\x9c\x2e\x38\xfe\x1e\x7c\x16\x56\
\x23\x94\x47\xc5\x48\x95\xcd\x88\x51\x99\x72\x61\xec\x7c\x20\x67\
\xdd\x63\xbf\x75\x54\x6c\x5b\xd0\xb0\x72\xbb\xf0\x86\xfb\x6f\xb6\
\x2d\xcb\x3c\x48\x0b\x30\x0d\x50\x4f\x0a\xb2\x0f\xa2\x08\x5c\x95\
\xb4\x48\x78\xd0\xbe\x81\x22\xea\x0d\x30\x45\x94\x90\x5b\xa1\x86\
\x6f\x4f\x46\x27\x1f\x35\xce\xa9\xbe\xd2\x6d\x71\xb4\xec\x17\xe5\
\x77\xec\x5d\x40\x5e\x49\x1c\x4a\xe3\xf7\x88\xfa\x04\xaa\x36\x84\
\xe1\xce\x87\xf7\x28\x3d\x60\x86\xc1\x79\x62\x8f\x29\x7d\x5c\x2c\
\xe2\x12\xed\x60\x00\xfb\x54\x36\xc7\x3f\x56\x73\xdc\xd5\xca\x9f\
\xc5\x2c\x0d\x18\x74\xa8\xa0\xfc\xca\x70\x1e\xfd\x78\x99\xe5\x29\
\xca\x69\x94\x91\xe1\xae\xf2\x60\x87\x6e\xef\xf0\x7f\xaf\xb7\xc1\
\x1e\xbd\x3d\x39\x3b\xf9\x08\xe3\xbf\x80\xb4\xf6\xcb\xec\x1b\xa1\
\x35\x45\xd8\x0d\xe2\x5d\x99\x47\xc4\x1f\xe3\x1d\x1f\x5d\x81\x53\
\x91\x3e\x4a\x33\x37\x59\x96\xd0\x4d\x2e\xb3\xdd\x3a\x53\x3f\x0a\
\x75\x93\xc6\xbc\x0f\x17\xeb\x02\x8e\x36\x2c\xff\x03\xdc\x31\x9e\
\xaf\xf7\x71\x4a\x97\xae\xb2\x03\xc0\x57\x7f\x4b\x6e\x19\xc3\xf1\
\xf8\x63\xd4\xa5\x91\xd0\x25\x3a\xcc\x4e\xb0\xc8\x92\x38\x52\x26\
\xb0\xd3\x3b\x14\x0b\x6f\xcc\x17\x08\xcd\x22\x23\x0f\x4f\x15\xf9\
\x13\xe4\xf9\xb3\x45\xa7\x1b\x8b\xc5\xba\x69\xbe\xd5\xd2\xe8\x9e\
\x2e\x85\x16\xfc\xfd\x71\x28\xb6\xf4\x24\x18\x83\x5b\x66\xa7\xa3\
\xd7\xfe\x10\xed\x08\x45\x44\x59\xcd\x30\x23\x0e\x53\x37\x97\xa1\
\xf0\x15\x06\xd7\x65\x5c\x71\xa6\xaf\xe0\x0a\x37\x61\x4b\xc4\x89\
\xfe\xd3\x24\x70\x09\xb8\xe6\x48\xeb\xab\x68\xda\xad\xae\xfa\x97\
\xf0\xf9\x24\x70\xd9\x17\xd3\xc4\x8a\xc6\x0c\xe2\x7a\x16\xf4\xa4\
\x71\xe4\x70\xe8\x20\xdb\xf0\x48\xad\x80\xad\x71\x92\xd4\xc7\x59\
\x52\x4f\xf9\x4b\xd2\x78\x18\x3e\xec\xfb\x6b\x72\x52\x14\x08\xe6\
\xd9\xdf\x1c\xdd\x61\x1d\x82\x37\x06\x9d\xee\x67\x79\xbc\x89\x21\
\x87\xa6\xb2\x7e\xf3\xac\x8e\x81\x8d\x97\x40\x63\x82\xee\x4a\x01\
\x30\xd4\x00\xd6\x19\xd0\xb6\x33\xc0\xa8\x1c\x2b\xb1\xd8\xc0\xba\
\x3a\x2f\x64\xa0\x2d\xab\x84\x61\x89\xad\xc7\x85\x6c\x25\xbe\xaa\
\x74\xd6\x85\xbc\xcf\x8a\x98\x96\x2a\x20\x0b\x2f\xc7\x66\xd3\x9c\
\x97\xd0\x29\x22\x14\x6d\xde\x1b\x9c\x8a\x64\x9a\x27\xc7\x90\x01\
\x3d\x3c\x41\x23\xda\x39\x34\x9a\x17\x1f\xa9\x91\x0c\x03\xd7\xa6\
\x09\x3f\xfc\x78\x17\x6c\x40\x8f\x0e\x79\xf2\xf2\x64\x31\x20\x5a\
\x55\x6c\x11\xe4\xcd\x83\xcb\x6d\x9c\x44\xbf\xdf\xbd\x47\x20\xbc\
\x3d\xa8\x59\x31\x10\xbb\xbe\x2e\xbe\x6e\x4e\x5e\x31\xcc\x4d\x4c\
\xc9\x28\xb1\xcc\x46\x67\xde\xbf\xbd\xf1\x29\x28\xb4\xa2\xe2\xde\
\x5b\x6f\x34\x85\x31\x16\xc7\x00\xc6\x27\x7f\xe5\x24\xb5\xa7\x49\
\x3f\x17\xaf\x40\x79\xdc\x21\x63\xac\x7c\xdc\x0b\x4a\x28\x61\x50\
\x35\x0b\xd9\x13\x8e\x80\x78\xef\xba\x31\x70\xda\xdb\xcb\xaa\xc8\
\xf2\xb2\x7f\xd8\x2b\x92\x72\xba\x80\x8a\x70\x8a\xdb\x42\xbb\x3c\
\x69\x26\x1d\x1b\xfa\x13\xe9\x56\xcf\x58\x8e\x52\x8c\xee\x12\x82\
\x61\x1f\x92\xca\x0d\x90\x1b\xc2\x01\x61\x9f\xa5\x02\x2e\x16\xe1\
\xf6\x90\x7e\x56\x75\x60\xfc\x82\x12\xb4\x0b\x72\xe2\xee\x86\x2f\
\xac\xca\x2d\x05\x61\x4b\xd8\x57\x02\x92\x92\x01\x8d\xec\x09\x39\
\x6b\x29\xa8\xfb\x2e\x20\xa6\x94\x71\x18\x24\x9a\xc6\x8e\x58\xa8\
\xab\x00\xb7\xe0\xa8\xff\x86\x03\x13\xa0\x22\xfa\xd6\x61\x17\x40\
\x4e\x3f\x81\x04\x42\x6c\xdf\x53\xa6\xe1\xec\x5d\xd3\x62\x75\x85\
\xd3\xb2\xbe\x46\x14\x15\x10\x4e\xef\x53\xf4\x46\x21\xd3\x50\xaa\
\xd4\x9c\xa8\x93\x85\x06\x83\x7b\x63\x0b\x6c\xf4\xc4\xf5\xed\x6b\
\x22\x68\x36\x8b\x96\x18\x0c\x52\x74\xe1\x90\x82\x42\x7b\x26\x8e\
\x43\x81\x43\x49\x4b\x0c\xdb\x20\x8d\x84\x07\x7f\x64\x5a\x70\x64\
\xd1\x2d\x27\xc9\xb6\x84\x62\x17\xa7\x7d\xae\x50\xfe\x50\x1e\x65\
\x44\xf9\x2c\x6d\x90\x6b\x10\x46\xbd\x5a\xff\x9a\xab\x94\xba\x20\
\xeb\x55\x33\x15\x14\x89\xcb\xf5\xd1\x9c\xd9\xa4\x03\x85\xa6\x70\
\x56\x04\xa0\xd3\xf5\x41\xaa\x89\x6e\x04\x15\x0f\x8b\xbb\x38\x2f\
\x4a\x86\x48\xa1\xfb\x18\x02\x4d\xab\x09\x51\x7c\xb1\x54\xaf\xcb\
\xe5\xb9\x28\xf3\xe8\xca\xec\x50\x12\x1d\xf5\x86\x94\x93\x4d\x1e\
\x47\x78\xa0\xe6\x17\x89\x62\x6e\xb3\xfb\x7e\x84\x20\xba\x90\x96\
\x5e\x9f\xe7\xd0\x62\xb5\x2b\x51\xae\xb5\x3c\x1c\x8d\x16\x3c\x2d\
\x3a\x7e\xa6\xa4\xbb\xf2\xd6\x8e\x6e\x04\x1d\x50\x45\xa4\xaa\x00\
\xc4\xd0\x1b\x88\xf9\x54\x94\x40\xfb\x0e\xe7\x14\x71\x01\xf1\xb4\
\x0c\xc2\x2d\xce\x36\xca\x8c\x64\x05\xb2\xc2\x42\x54\x1d\x9c\x4a\
\x92\xbc\x0d\x0f\x39\xe6\xea\x32\x4b\x0e\xbb\x94\xd4\x54\x26\xcc\
\xea\xd1\xd6\x56\xff\x99\xdd\x5b\x97\xca\xe7\x0a\xd8\x35\x8e\x69\
\xed\x53\xe3\xbb\x1a\x56\x9b\x2e\x6a\xa9\xd4\xca\x09\x54\x55\x94\
\x4e\x82\x54\x4d\x69\x54\xc8\x33\x1a\x21\x7c\xea\x51\xb4\x54\x79\
\x80\x5c\x1f\xf7\x0c\x85\xb0\xbb\x02\xad\xd6\x4a\x95\x88\xb4\x49\
\xbb\xca\x54\xda\x4d\x88\xbf\xda\x8a\x0f\x99\xfd\xc2\x91\x05\x6c\
\x13\xb7\x3f\xa4\x6d\x24\x8d\x30\x45\x3e\xd3\x87\x99\x65\x9d\x31\
\x05\x97\x24\xb1\x00\xb3\x3a\xf4\xe3\x34\x02\xbf\x55\x66\x79\x63\
\x9c\x15\x99\xa3\x25\x18\x32\x8c\x74\x9e\x52\xd3\xd7\xab\x5a\xc6\
\x28\xcd\x74\x14\x72\xba\x98\x9a\x06\xf7\x5e\x2f\x82\x1b\xf6\xfb\
\x64\x2a\xd7\x9a\xdb\xc0\xa2\x54\x93\xb3\xcb\x39\x87\x17\x39\xe4\
\xbc\x26\x53\x19\x69\x93\xea\x18\x95\xfd\x96\xf5\xe6\x49\xbb\x58\
\x69\x31\x75\xd9\x8c\xc6\x52\x7d\x5f\x7a\xab\xe1\xda\x57\x28\xbc\
\x75\xf7\x46\xb5\x27\x77\x21\x4e\x1c\x92\xd5\xda\xd1\x34\x1b\x31\
\xbd\x47\xd1\x31\x89\x3b\x0c\x83\x9c\xc4\x5c\xb3\xa4\xc8\xad\x8b\
\x7b\x6f\x93\xac\x74\x0c\x8d\xd2\x22\xb7\x35\x0d\x78\xcc\xf2\xaa\
\xa1\x6a\x96\x18\xbd\xeb\xd1\x15\xb3\x38\x84\x21\x54\x7a\xb6\x55\
\x49\xbc\xab\x19\x10\xc3\x8c\xa2\x4f\xc7\x6b\x35\x94\x93\x28\xa5\
\xde\x5f\x6a\xf6\x5f\x6e\x51\xf8\x99\x7e\xfc\x13\x1c\x5a\xd6\x10\
\x07\xf4\x02\x87\xef\x04\xf1\x89\x3b\x2b\x69\x53\x75\x54\xda\x5f\
\x9d\x90\x22\xa3\x34\x2a\x45\x45\x79\x54\x8a\x88\x9a\x7b\x74\xb5\
\x7c\xda\xba\x78\xd7\x8d\xd6\xff\x15\xd3\x4a\x81\xad\xb8\x40\x9e\
\x37\x19\xa8\xd5\x7d\xb9\x03\x54\x56\x7e\x03\x87\xf2\xb4\x99\x55\
\x19\xc2\xc0\xb3\x92\x42\xd4\x99\x57\xa6\x0d\x52\x38\xb2\xe5\xf9\
\x60\xa3\xce\xdc\x07\x99\xbe\x68\x7d\xce\xcf\xab\xc3\x4a\x6e\x61\
\x39\x98\x10\xd3\x61\x3d\x97\x6a\xd6\x24\xf4\x6a\xd6\x24\x73\x69\
\xd6\x24\x72\x36\xed\xa0\x18\x8f\xb7\xea\x94\x7d\x39\x80\x4b\x91\
\xda\x64\x26\x7e\xe1\x13\x82\x1c\x07\x8a\x63\xa8\x70\x2c\x5c\xeb\
\x30\x26\xde\x75\x18\x93\x04\x6a\x30\x26\x39\x28\x40\xcf\x28\x8d\
\x6d\x90\xdc\xf5\x6b\x22\xb1\x58\x97\xf3\x30\xa6\x2f\xda\x63\x0f\
\xe3\x3c\x4c\x9a\xce\x82\x61\x6d\x72\x0e\x06\x30\x87\x36\x36\xb9\
\x02\x13\x98\x43\x3f\x75\xd7\xd0\x5e\x21\xc5\x5b\x8d\x36\x9a\xd9\
\x24\x13\x2b\x70\xa3\xae\x36\xc9\xc7\x0e\xdc\xa8\xbd\x4f\x91\x95\
\xa4\xae\x26\x81\xb9\xf5\xf6\x29\x88\xa9\xa6\x1a\x70\x2a\x09\x0e\
\xff\xd8\xc5\xf1\x7c\x2f\x0f\x14\xa8\xc4\x6f\xdd\x8a\x4f\xf4\x79\
\x13\xa3\x40\x79\xd5\xb1\xce\x92\xc8\xd0\xc4\x7a\x3d\x45\xac\x7b\
\x3a\x38\xd5\xfa\x67\x64\x0a\x0f\xff\x7e\x77\x07\x08\x78\x37\x04\
\xcf\x6a\x97\x0b\x8f\xad\x37\xf5\x26\x3d\xeb\x75\xbc\x1e\xb3\x2b\
\xeb\x8a\xe1\x60\x87\x18\x6f\x9f\xe2\x50\x24\x75\xbc\x5e\xd3\xeb\
\x3f\xbd\xf6\xaa\xf5\x17\xd9\xe3\x8e\xc5\xa2\x0c\xd6\x3d\xd9\x12\
\xca\xb8\x14\x3d\xd5\x86\x9b\x58\xeb\xf5\x12\xe9\xe5\xda\x6e\x97\
\x9e\x41\x7a\xb5\x3b\xdb\x89\xb6\x92\x5d\x53\x91\x72\xda\x0a\x64\
\xea\xb4\xd4\xef\x4a\x06\xa7\xb5\x8b\x81\x2f\xb8\x43\x08\x82\x67\
\x0f\xec\x5e\x12\x00\xfc\xf3\x6d\x84\x4b\xf1\x9e\xf7\x1d\x7e\x0f\
\x7b\xd5\xf0\x78\xe1\x79\x23\x18\x86\xdf\xa3\x6a\xb8\xa0\xfa\xc7\
\x09\xd0\x27\x46\x3c\x4d\x7d\x45\x09\xe1\x22\x73\x36\x47\xe4\x63\
\x95\xbd\x86\x76\xbe\x4f\xba\x5c\x96\x1a\x3e\x9d\x0f\xd7\xf1\xdf\
\xe8\x97\x3c\xde\xab\x26\x5f\xdd\xb0\xb0\xa3\x9d\xe8\x19\x2d\x7b\
\x2e\xd1\xe9\x82\xf1\x97\xaa\xd1\xd6\xef\xeb\xc6\x1c\xb8\x00\xb1\
\x87\xdb\x4f\xeb\xa0\x96\xf5\xfa\xda\xe1\x8a\xa8\xe9\xe8\x3e\x54\
\x9d\x01\xe2\x56\xff\x22\x44\x2c\x16\xfb\x20\xc5\x06\xf0\xa0\x0c\
\x82\x3c\xfb\x14\x2d\x1d\xaf\xae\xdd\xbe\xec\xc1\x87\xa1\xbc\xfc\
\xde\x8f\xf2\xe0\x7e\x19\x14\xb4\x9b\x2c\xc0\xc8\x5a\xcd\x5c\xf5\
\xf6\xca\x23\x6f\x2d\xec\xcf\xe8\xf8\x6b\x14\x89\x84\x05\x08\xb4\
\xa7\x8e\xb0\x4b\x53\x45\x94\xbc\x51\x5b\xeb\x7b\xf1\xd6\xf1\xd8\
\xbc\xb5\xdc\x6f\xd5\x10\x1c\xdd\x72\xad\x3f\x2a\xa8\x77\xcd\xd9\
\xf1\x12\xcb\xb6\xd4\xb1\x1a\x65\x56\xb5\xd2\x75\x06\x4f\x99\x3a\
\x53\xaa\x53\x71\x37\x68\x1b\xbc\xc3\x90\x3a\x87\xfe\x48\xf5\x0e\
\x43\xea\x1c\x8c\xde\x81\x52\xe2\xf2\x0e\x0f\x8e\x53\x35\xde\xdb\
\xbb\x18\x37\x1c\x88\xc6\xb8\x22\x9a\x96\x8c\x8f\x8d\x7c\x0f\x9f\
\x83\x6d\xa1\x83\xb5\x7e\xc7\xf3\x9f\x49\xb3\xc7\x36\x9e\xc9\x93\
\xe8\x3b\x5e\x74\xad\xa9\xc3\xf3\x2d\x6e\x23\x4c\x5a\xe1\xb8\xde\
\x52\xfb\x2d\x06\xa9\xb4\x46\x2d\xe9\xeb\xa3\xf0\x62\x7e\xcd\x11\
\xd0\xa2\xea\x66\xba\xcd\x5b\x98\xbc\x88\x43\xde\x0d\xa1\xb8\xd1\
\x0f\xb9\x9c\x9f\x26\xdf\xf6\xa8\x6c\x82\xd6\xf0\x60\x8f\xad\x79\
\x7e\x7a\x93\xa1\x46\x16\xa2\x86\xb5\xb8\xc2\x6f\x8d\x4d\x71\x85\
\xc4\x22\x53\x60\xa1\xc1\xa8\x5d\x5c\x71\x6a\x4d\x5b\xd1\x92\x2c\
\x56\xc1\x4c\xc2\x96\xc5\xc1\x2a\xef\xe4\x0c\x72\x56\xc2\xd9\xe3\
\x22\x4b\x7f\xe4\xcc\x3b\x9f\xc5\xc5\xca\x87\xaa\x50\x6e\x61\x5b\
\x65\xcb\xc0\xb7\xe9\xfd\x60\x3b\xb6\xcd\xd9\xf6\x73\xc6\x95\x4a\
\x07\xdb\x3a\xee\x47\x1c\x49\x6b\xd7\x6d\x30\x84\x1f\x26\xba\xd6\
\xc4\x11\xd1\xb5\xf6\xee\xf6\xdc\x4e\x67\xcf\xe6\xdf\xa9\x50\x5a\
\x23\x76\x27\x9e\x47\xe0\x25\xfc\x9a\x9d\xac\xd9\x14\x8c\x74\x9b\
\x37\x30\xba\x10\x97\xbc\xdb\x7b\xfb\xa3\x93\x6a\x55\xbe\xed\x11\
\x59\x05\xcd\x2a\x31\x40\xd4\x7d\x1f\xc4\xa9\x52\x67\x3d\x73\xa9\
\xd4\x9c\xd4\xb7\xad\xfc\x79\x1e\xe9\x3f\x67\x6e\x8f\x47\xc9\xf3\
\xde\xba\x5c\xdc\x72\x3f\x92\xe1\x9a\x26\xc9\x08\x6a\x95\x2b\x2b\
\x0e\x85\x9f\x57\x5f\x15\x39\xca\x8a\x47\x88\x5f\xd4\xb2\xa4\x84\
\x7f\x60\x6f\x8e\x0c\x14\x92\x74\x8a\xbc\x61\xea\x59\x41\x58\x92\
\x61\x7d\x72\xa6\x17\xe4\x74\xd4\x6c\x03\x46\xfc\x49\x70\x04\x7a\
\x0c\x64\x7c\x8f\xa5\xa3\x67\xc3\x2a\x7e\xfc\xf4\xc9\x41\x81\x21\
\x19\x32\xd5\x75\x6e\x36\x9e\x58\x05\xd4\x1d\x63\xf7\x3a\x8e\xd0\
\x4f\xb0\x63\x7b\x06\xd5\xba\x81\xe7\xff\x80\x44\xaa\x66\xc6\x95\
\x58\x1e\x67\xc6\x0d\xf1\x44\xde\xbf\x6e\xc5\x84\x3c\xdd\x88\x79\
\x1e\xee\xeb\xe6\xa6\x6d\x45\xa3\x8c\x66\x6f\x3a\x0c\x55\x60\xdb\
\x1b\x4d\x5d\xdd\xc9\xa0\xc5\xd8\x8c\xd8\x55\x6b\x33\x23\xaf\x1b\
\x1b\xe7\xd0\xfc\x0d\x1f\x87\xb9\xe9\x08\xcc\xdf\xb0\xb5\x1d\xd5\
\xf1\x0f\x40\x6b\xb1\xf0\xba\x0c\xca\x43\xf1\xa3\x6d\xe7\xe7\xb5\
\x7f\xcc\xa1\xf1\xb1\x69\x3a\x6d\x77\xdf\xc4\xfb\x67\x91\x8e\x31\
\x15\x6d\xfe\x2e\x45\xb6\x0f\xc2\xb8\xfc\x0e\xe9\xf4\x70\x48\x89\
\x5a\x06\x49\x92\x65\x69\x45\x97\xf1\x3b\xdf\xee\xd7\xbf\x3f\x9d\
\x15\x20\x7c\x70\xea\xfd\x95\x07\xfb\x3d\xc2\xff\x1f\x0a\x7a\x9b\
\xe6\x61\x4c\xf8\x1d\x30\x36\x06\xe9\xc9\x12\x83\xa3\xcd\x71\xd3\
\xfb\x4b\xe7\xe3\x3b\xd3\xf2\xa6\x24\xb2\x7a\x63\x4a\xbf\x00\x70\
\x91\xa3\x80\xef\x73\xcd\xa8\xa5\x33\x8f\xfa\xce\x98\xe9\xeb\x2f\
\xe6\xed\x25\x63\x74\x6e\x43\xbe\x8d\xae\x6f\x41\x06\x7f\xf8\x4b\
\x55\x4e\xcd\xf9\xf9\xb9\x51\x3b\x8e\x96\xc5\xff\x00\xbd\x3f\x6b\
\xa0\
"
qt_resource_name = b"\
@ -383,27 +383,14 @@ qt_resource_name = b"\
\x00\x43\
\x00\x68\x00\x69\x00\x6c\x00\x64\x00\x4f\x00\x66\x00\x4d\x00\x65\x00\x74\x00\x72\x00\x6f\x00\x70\x00\x6f\x00\x6c\x00\x69\x00\x73\
\
\x00\x0d\
\x02\x0d\x3c\x07\
\x00\x64\
\x00\x72\x00\x6f\x00\x70\x00\x2d\x00\x64\x00\x6f\x00\x77\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
\x00\x0a\
\x0a\x2d\x1b\xc7\
\x00\x63\
\x00\x69\x00\x72\x00\x63\x00\x6c\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
\x00\x0d\
\x02\x33\xbc\x47\
\x00\x73\
\x00\x6f\x00\x72\x00\x74\x00\x2d\x00\x64\x00\x6f\x00\x77\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
\x00\x0b\
\x04\x37\x88\x27\
\x00\x73\
\x00\x6f\x00\x72\x00\x74\x00\x2d\x00\x75\x00\x70\x00\x2e\x00\x73\x00\x76\x00\x67\
\x00\x13\
\x0f\xf8\x57\x27\
\x00\x73\
\x00\x71\x00\x75\x00\x61\x00\x72\x00\x65\x00\x2d\x00\x64\x00\x69\x00\x73\x00\x61\x00\x62\x00\x6c\x00\x65\x00\x64\x00\x2e\x00\x73\
\x00\x76\x00\x67\
\x02\x0d\x3c\x07\
\x00\x64\
\x00\x72\x00\x6f\x00\x70\x00\x2d\x00\x64\x00\x6f\x00\x77\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
\x00\x18\
\x08\xb9\x19\xc7\
\x00\x68\
@ -414,34 +401,47 @@ qt_resource_name = b"\
\x00\x63\
\x00\x69\x00\x72\x00\x63\x00\x6c\x00\x65\x00\x2d\x00\x64\x00\x69\x00\x73\x00\x61\x00\x62\x00\x6c\x00\x65\x00\x64\x00\x2e\x00\x73\
\x00\x76\x00\x67\
\x00\x13\
\x0f\xf8\x57\x27\
\x00\x73\
\x00\x71\x00\x75\x00\x61\x00\x72\x00\x65\x00\x2d\x00\x64\x00\x69\x00\x73\x00\x61\x00\x62\x00\x6c\x00\x65\x00\x64\x00\x2e\x00\x73\
\x00\x76\x00\x67\
\x00\x0d\
\x02\x33\xbc\x47\
\x00\x73\
\x00\x6f\x00\x72\x00\x74\x00\x2d\x00\x64\x00\x6f\x00\x77\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
\x00\x0f\
\x0d\xb0\xb1\xa7\
\x00\x68\
\x00\x61\x00\x6c\x00\x66\x00\x2d\x00\x73\x00\x71\x00\x75\x00\x61\x00\x72\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
\x00\x0e\
\x03\xc2\xd5\xc3\
\x00\x0b\
\x04\x37\x88\x27\
\x00\x73\
\x00\x74\x00\x79\x00\x6c\x00\x65\x00\x73\x00\x68\x00\x65\x00\x65\x00\x74\x00\x2e\x00\x71\x00\x73\x00\x73\
\x00\x6f\x00\x72\x00\x74\x00\x2d\x00\x75\x00\x70\x00\x2e\x00\x73\x00\x76\x00\x67\
\x00\x0a\
\x08\x8b\x0b\xa7\
\x00\x73\
\x00\x71\x00\x75\x00\x61\x00\x72\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
\x00\x0e\
\x03\xc2\xd5\xc3\
\x00\x73\
\x00\x74\x00\x79\x00\x6c\x00\x65\x00\x73\x00\x68\x00\x65\x00\x65\x00\x74\x00\x2e\x00\x71\x00\x73\x00\x73\
"
qt_resource_struct_v1 = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\
\x00\x00\x00\x1c\x00\x02\x00\x00\x00\x0a\x00\x00\x00\x03\
\x00\x00\x00\x44\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x00\x5e\x00\x00\x00\x00\x00\x01\x00\x00\x00\xd2\
\x00\x00\x01\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x04\x7e\
\x00\x00\x01\x86\x00\x01\x00\x00\x00\x01\x00\x00\x08\x68\
\x00\x00\x01\x50\x00\x00\x00\x00\x00\x01\x00\x00\x06\x5b\
\x00\x00\x01\x6c\x00\x00\x00\x00\x00\x01\x00\x00\x07\x6c\
\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x01\x00\x00\x01\xca\
\x00\x00\x01\x6c\x00\x01\x00\x00\x00\x01\x00\x00\x07\x6c\
\x00\x00\x00\x9e\x00\x00\x00\x00\x00\x01\x00\x00\x02\xc1\
\x00\x00\x01\x8e\x00\x00\x00\x00\x00\x01\x00\x00\x14\x3f\
\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x01\x00\x00\x04\xce\
\x00\x00\x00\x64\x00\x00\x00\x00\x00\x01\x00\x00\x00\xf8\
\x00\x00\x01\x48\x00\x00\x00\x00\x00\x01\x00\x00\x06\x86\
\x00\x00\x01\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x05\xb4\
\x00\x00\x00\xba\x00\x00\x00\x00\x00\x01\x00\x00\x03\xd2\
\x00\x00\x00\x44\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x01\x2c\x00\x00\x00\x00\x00\x01\x00\x00\x05\x75\
\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x01\x00\x00\x02\xb0\
\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x01\x00\x00\x03\x82\
"
qt_resource_struct_v2 = b"\
@ -451,26 +451,26 @@ qt_resource_struct_v2 = b"\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x1c\x00\x02\x00\x00\x00\x0a\x00\x00\x00\x03\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x44\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x01\x80\xe6\xa2\xfc\x1c\
\x00\x00\x00\x5e\x00\x00\x00\x00\x00\x01\x00\x00\x00\xd2\
\x00\x00\x01\x81\xe9\xd2\x95\xcb\
\x00\x00\x01\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x04\x7e\
\x00\x00\x01\x81\xe9\xd2\x95\xcb\
\x00\x00\x01\x86\x00\x01\x00\x00\x00\x01\x00\x00\x08\x68\
\x00\x00\x01\x84\x19\x91\x75\xb8\
\x00\x00\x01\x50\x00\x00\x00\x00\x00\x01\x00\x00\x06\x5b\
\x00\x00\x01\x81\xe9\xd2\x95\xcb\
\x00\x00\x01\x6c\x00\x00\x00\x00\x00\x01\x00\x00\x07\x6c\
\x00\x00\x01\x81\xe9\xd2\x95\xcb\
\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x01\x00\x00\x01\xca\
\x00\x00\x01\x80\xe6\xa2\xfc\x24\
\x00\x00\x01\x6c\x00\x01\x00\x00\x00\x01\x00\x00\x07\x6c\
\x00\x00\x01\x80\xe6\x95\xab\x1b\
\x00\x00\x00\x9e\x00\x00\x00\x00\x00\x01\x00\x00\x02\xc1\
\x00\x00\x01\x80\xe6\xa2\xfc\x2d\
\x00\x00\x01\x8e\x00\x00\x00\x00\x00\x01\x00\x00\x14\x3f\
\x00\x00\x01\x80\xe6\xa8\xbf\x73\
\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x01\x00\x00\x04\xce\
\x00\x00\x01\x80\xe6\xa7\xdb\x35\
\x00\x00\x00\x64\x00\x00\x00\x00\x00\x01\x00\x00\x00\xf8\
\x00\x00\x01\x80\xe6\xa8\xbf\x79\
\x00\x00\x01\x48\x00\x00\x00\x00\x00\x01\x00\x00\x06\x86\
\x00\x00\x01\x80\xe6\xa8\xbf\x6a\
\x00\x00\x01\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x05\xb4\
\x00\x00\x01\x80\xe6\xa7\xdb\x3d\
\x00\x00\x00\xba\x00\x00\x00\x00\x00\x01\x00\x00\x03\xd2\
\x00\x00\x01\x80\xe6\xa7\xdb\x44\
\x00\x00\x01\x81\xe9\xd2\x95\xcb\
\x00\x00\x00\x44\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x01\x81\xe9\xd2\x95\xcb\
\x00\x00\x01\x2c\x00\x00\x00\x00\x00\x01\x00\x00\x05\x75\
\x00\x00\x01\x81\xe9\xd2\x95\xcb\
\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x01\x00\x00\x02\xb0\
\x00\x00\x01\x81\xe9\xd2\x95\xcb\
\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x01\x00\x00\x03\x82\
\x00\x00\x01\x81\xe9\xd2\x95\xcb\
"
qt_version = [int(v) for v in QtCore.qVersion().split('.')]

View File

@ -65,6 +65,7 @@ QTableView::item,
QHeaderView::section,
QTableView QTableCornerButton::section,
QFrame[frameShape="6"],
QGroupBox,
QLineEdit,
QTextEdit,
QTimeEdit,
@ -115,15 +116,12 @@ QPushButton {
QToolButton {
height: 1.10em;
}
QFrame[frameShape="0"] {
border-width: 0px;
}
QFrame[frameShape="6"] {
border-radius: 4px;
}
QFrame[noBorder="1"],
QListView[noBorder="1"],
QScrollArea[noBorder="1"],
QStackedWidget[noBorder="1"] {
border-color: transparent;
}
QComboBox {
background-color: #DADDDE;
}
@ -383,6 +381,7 @@ QTableView::indicator {
border-style: solid;
background-color: #C2C4C5;
}
QGroupBox::indicator,
QCheckBox::indicator,
QRadioButton::indicator,
QListView::indicator,
@ -391,6 +390,9 @@ QTableView::indicator {
width: 11px;
height: 11px;
}
QGroupBox::indicator {
padding: 1px;
}
QGroupBox::indicator:disabled,
QCheckBox::indicator:disabled,
QRadioButton::indicator:disabled,
@ -482,6 +484,7 @@ QGroupBox::title {
*/
background-color: #B2D3DE;
}
QToolBox::tab:disabled,
QGroupBox::title:disabled {
border-color: #767778;
background-color: #A8AAAB;

View File

@ -2,323 +2,222 @@
# Resource object code
#
# Created by: The Resource Compiler for PyQt5 (Qt v5.15.2)
# Created by: The Resource Compiler for PyQt5 (Qt v5.15.6)
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore
qt_resource_data = b"\
\x00\x00\x00\xf8\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x36\x38\x38\x22\
\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x36\x38\
\x38\x20\x36\x38\x38\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x36\x38\
\x38\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\
\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\
\x2f\x73\x76\x67\x22\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\
\x20\x64\x3d\x22\x6d\x35\x32\x30\x20\x31\x32\x30\x68\x2d\x33\x35\
\x32\x63\x2d\x32\x36\x2e\x35\x20\x30\x2d\x34\x38\x20\x32\x31\x2e\
\x35\x2d\x34\x38\x20\x34\x38\x76\x33\x35\x32\x63\x30\x20\x32\x36\
\x2e\x35\x20\x32\x31\x2e\x35\x20\x34\x38\x20\x34\x38\x20\x34\x38\
\x68\x33\x35\x32\x63\x32\x36\x2e\x35\x20\x30\x20\x34\x38\x2d\x32\
\x31\x2e\x35\x20\x34\x38\x2d\x34\x38\x76\x2d\x33\x35\x32\x63\x30\
\x2d\x32\x36\x2e\x35\x2d\x32\x31\x2e\x35\x2d\x34\x38\x2d\x34\x38\
\x2d\x34\x38\x7a\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
\x66\x69\x6c\x6c\x3d\x22\x23\x34\x38\x33\x64\x38\x62\x22\x2f\x3e\
\x0a\x3c\x2f\x73\x76\x67\x3e\
\x00\x00\x00\xf8\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x36\x38\x38\x22\
\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x36\x38\
\x38\x20\x36\x38\x38\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x36\x38\
\x38\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\
\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\
\x2f\x73\x76\x67\x22\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\
\x20\x64\x3d\x22\x6d\x35\x32\x30\x20\x31\x32\x30\x68\x2d\x33\x35\
\x32\x63\x2d\x32\x36\x2e\x35\x20\x30\x2d\x34\x38\x20\x32\x31\x2e\
\x35\x2d\x34\x38\x20\x34\x38\x76\x33\x35\x32\x63\x30\x20\x32\x36\
\x2e\x35\x20\x32\x31\x2e\x35\x20\x34\x38\x20\x34\x38\x20\x34\x38\
\x68\x33\x35\x32\x63\x32\x36\x2e\x35\x20\x30\x20\x34\x38\x2d\x32\
\x31\x2e\x35\x20\x34\x38\x2d\x34\x38\x76\x2d\x33\x35\x32\x63\x30\
\x2d\x32\x36\x2e\x35\x2d\x32\x31\x2e\x35\x2d\x34\x38\x2d\x34\x38\
\x2d\x34\x38\x7a\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
\x66\x69\x6c\x6c\x3d\x22\x23\x34\x33\x34\x37\x34\x64\x22\x2f\x3e\
\x0a\x3c\x2f\x73\x76\x67\x3e\
\x00\x00\x00\xce\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x37\x33\x36\x22\
\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x37\x33\
\x36\x20\x37\x33\x36\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x37\x33\
\x36\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\
\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\
\x2f\x73\x76\x67\x22\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\
\x20\x64\x3d\x22\x6d\x33\x36\x38\x20\x31\x32\x30\x63\x2d\x31\x33\
\x37\x20\x30\x2d\x32\x34\x38\x20\x31\x31\x31\x2d\x32\x34\x38\x20\
\x32\x34\x38\x73\x31\x31\x31\x20\x32\x34\x38\x20\x32\x34\x38\x20\
\x32\x34\x38\x20\x32\x34\x38\x2d\x31\x31\x31\x20\x32\x34\x38\x2d\
\x32\x34\x38\x2d\x31\x31\x31\x2d\x32\x34\x38\x2d\x32\x34\x38\x2d\
\x32\x34\x38\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x34\x38\x33\
\x64\x38\x62\x22\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
\x00\x00\x00\xe2\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x36\x38\x38\x22\
\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x36\x38\
\x38\x20\x36\x38\x38\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x36\x38\
\x38\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\
\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\
\x2f\x73\x76\x67\x22\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\
\x20\x64\x3d\x22\x6d\x35\x32\x30\x20\x31\x32\x30\x68\x2d\x33\x35\
\x32\x63\x2d\x32\x36\x2e\x35\x20\x30\x2d\x34\x38\x20\x32\x31\x2e\
\x35\x2d\x34\x38\x20\x34\x38\x76\x33\x35\x32\x63\x30\x20\x32\x36\
\x2e\x35\x20\x32\x31\x2e\x35\x20\x34\x38\x20\x34\x38\x20\x34\x38\
\x6c\x34\x30\x30\x2d\x34\x30\x30\x63\x30\x2d\x32\x36\x2e\x35\x2d\
\x32\x31\x2e\x35\x2d\x34\x38\x2d\x34\x38\x2d\x34\x38\x7a\x22\x0a\
\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\
\x23\x34\x33\x34\x37\x34\x64\x22\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\
\x3e\
\x00\x00\x00\xe2\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x36\x38\x38\x22\
\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x36\x38\
\x38\x20\x36\x38\x38\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x36\x38\
\x38\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\
\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\
\x2f\x73\x76\x67\x22\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\
\x20\x64\x3d\x22\x6d\x35\x32\x30\x20\x31\x32\x30\x68\x2d\x33\x35\
\x32\x63\x2d\x32\x36\x2e\x35\x20\x30\x2d\x34\x38\x20\x32\x31\x2e\
\x35\x2d\x34\x38\x20\x34\x38\x76\x33\x35\x32\x63\x30\x20\x32\x36\
\x2e\x35\x20\x32\x31\x2e\x35\x20\x34\x38\x20\x34\x38\x20\x34\x38\
\x6c\x34\x30\x30\x2d\x34\x30\x30\x63\x30\x2d\x32\x36\x2e\x35\x2d\
\x32\x31\x2e\x35\x2d\x34\x38\x2d\x34\x38\x2d\x34\x38\x7a\x22\x0a\
\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\
\x23\x34\x38\x33\x64\x38\x62\x22\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\
\x3e\
\x00\x00\x0c\xf8\
\x00\x00\x0c\xea\
\x00\
\x00\x4c\x88\x78\x9c\xc5\x1c\x59\x6f\xdb\x46\xfa\x5d\xbf\x62\xd6\
\x46\x80\xd8\x95\xa2\x5b\x76\x64\xf8\xa1\x4e\xbb\xdd\x05\x5a\x34\
\x89\x8d\xed\x83\x11\x04\x94\x38\x96\x88\x50\xa4\x42\x52\x71\xd2\
\xc2\xff\x7d\xbf\x39\x39\x27\x0f\x49\x4e\x64\x58\xa6\xe6\xfa\x8e\
\xf9\xee\x19\xb9\x7f\xde\xb9\xbf\xc3\x5f\x8b\x0f\x9d\x24\xcd\x36\
\x41\x3c\x47\xf0\x3a\xc5\xf4\x85\xb2\xd5\xe2\xe5\x68\x7c\xd9\x45\
\xe2\xed\x8c\xf4\xa2\x5e\x0f\x6d\x82\x28\x41\x0f\x69\x52\xa0\x65\
\x1a\xa7\x59\x27\x8c\xf2\x60\x11\xe3\x10\xa6\x9f\x4e\xc6\x93\x8b\
\x49\x48\x27\xa3\xd9\x45\x17\xa1\x8b\x21\x79\xbb\x90\x93\xc5\x60\
\x75\x01\x64\xbd\x60\x7e\xa0\x2f\xd0\x45\xd3\xe9\x8b\x33\x74\x7d\
\xcd\xd6\x9e\x42\xeb\x74\x02\xbf\xaf\xcf\x1a\x4e\x1f\xa9\xd3\x27\
\xd0\x3a\x19\xc3\xef\xc5\x59\xe7\xfe\x26\x58\x7e\x5a\x65\xe9\x2e\
\x09\x75\x46\x8c\x06\xa3\xd1\x68\xca\x26\x8c\x47\xb0\xcc\x78\x42\
\xde\x2e\x74\x46\x2c\xe4\x6c\x4e\x0d\x0e\xa3\x82\x90\x48\xd8\x31\
\x86\xd7\x64\x52\xa2\xcc\xde\x66\x25\x2f\xcd\xd9\xc0\x96\x0c\x65\
\x38\x58\x16\xd1\x17\xdc\x17\x4b\xa1\xc7\x28\x5c\xe1\x22\x47\x2f\
\xc9\x76\xfd\x0a\xad\x79\x17\xbd\xcd\xd2\x55\x86\xf3\xfc\x26\xc8\
\x72\x84\x8b\xe5\x59\x67\x9d\x7e\xc1\x19\xc5\x1d\x90\x87\xd7\x78\
\xcc\x91\x9f\x08\xe4\xa7\x43\x3f\xe4\xc7\x35\x4e\x10\x5d\x22\x4a\
\x56\x88\xfc\x95\x88\x94\xf0\x6f\x76\x45\x91\x26\x00\xfd\x3f\x38\
\x08\x71\x96\x9f\x75\x72\x1c\x63\x18\x94\x26\x73\x00\xfa\x30\x81\
\x1f\xce\x62\xca\xfd\xd7\xf4\xad\x9a\x5c\xb6\x82\x4a\x67\x27\x88\
\x0b\x9c\x25\x41\x81\xc9\xa2\x97\xa3\x60\x84\xf9\xa2\x03\x58\x6f\
\x42\xf6\x62\x32\xab\x5e\x54\xac\x40\x68\xc9\xd2\xc7\x1c\xc1\x56\
\xfd\x1e\xe5\x45\xff\x2e\xc3\xb8\x7f\x47\xa0\xfd\x2f\xc2\xd0\x1e\
\x24\x21\x9d\x70\xbb\xcc\xd2\x38\x26\xcc\xec\x80\x48\xa4\x19\x50\
\xa7\x8b\xc3\xe4\x72\x1c\x5e\x2e\x18\x1e\x17\x04\x85\x19\xec\xe5\
\x70\xac\x10\x47\x27\x29\x38\x6c\xd2\xbc\x90\x24\xf9\xa4\x54\x5d\
\xca\x94\x52\xe8\x22\x14\xcf\xc6\x67\x9a\x54\xd5\xb3\xd9\xc4\xa4\
\xad\x20\x45\xab\x75\x0c\xbf\x05\xb0\x7f\x3a\x9a\xcc\x82\x01\x03\
\x76\x49\x70\xbd\x00\x8c\x86\xb3\x81\x1f\x58\x98\xa5\xdb\x30\x7d\
\x4c\x04\xb0\x2e\x0a\xd0\x22\x2a\x10\x5d\x11\x46\x16\xeb\x20\x11\
\xb3\x18\x9b\x32\x0c\x42\xb0\x0d\xb2\x80\xc8\x51\x3b\x7b\xa2\xac\
\x23\x4d\x8b\x4b\x8a\xc6\xcb\xf1\xc3\x64\xc8\x17\x22\x52\x34\x1b\
\x93\xb7\xa9\x9f\x8c\x55\x16\x84\x11\x06\x23\x55\xca\x57\x8e\x52\
\x49\x15\x90\xf3\x09\x23\x10\x24\x26\x42\x6f\xd3\xed\x6e\x4b\x44\
\xe7\x76\x8b\x97\x51\x10\x7f\xe8\x44\xc9\x43\xda\x53\x04\x88\x0a\
\xd1\x62\xc1\x24\x68\x78\x09\xc4\x88\xb7\x33\x86\x01\x99\xf0\x7b\
\xb0\xc0\x31\x4c\xcd\x8b\x20\x8e\xb5\xd9\xa7\x83\x0b\xbe\x0b\x88\
\x6c\xc0\x90\x6c\x39\x1a\xc8\xa9\x74\x82\x9c\xa8\x58\x02\x98\x38\
\x55\x26\xa2\xcb\x69\xd5\x44\x85\xf7\x30\x71\xa4\x4e\xa4\x06\xc4\
\x9a\xb8\x4b\x6c\x64\x4f\x2f\x06\x6c\xa2\xc0\x52\x9d\x28\x27\x28\
\x53\x4b\x74\x4f\xa7\x03\x21\x6b\xd3\x46\x53\x4b\x84\xc1\x5e\x0f\
\x14\x7b\xe7\x9b\x7a\xde\xef\x74\xce\xd1\x3f\x54\x1f\xe9\x66\xcf\
\x1d\xae\xee\x8a\x76\x33\x91\xe8\x29\xa3\x74\xc5\xe7\xa3\xa4\x78\
\x68\x23\x35\x8f\x71\xd5\x79\xea\x9c\xcf\x05\xae\x5d\x78\x96\xfa\
\x2c\xa5\xd6\x42\x49\x17\x78\x2f\x4a\xae\x51\x0d\x51\xea\xbc\xa3\
\xf2\xd6\xe5\x7f\x4d\x5c\x38\x30\x10\xf8\x62\x3d\x47\x83\xed\x57\
\xdf\xea\x45\x16\x24\x39\xe8\x2f\x68\x0b\x1b\xb2\x0d\xc2\x10\x2c\
\xaf\x32\x49\xba\x89\x9e\x07\x39\xcd\x90\x11\xe4\x18\x4e\xf7\x52\
\x2b\xae\x4f\x86\x27\x1f\x6c\x2e\xe9\x9a\xc4\x80\x91\xd8\xa2\x97\
\x17\xdf\x88\xb9\x04\x36\xc7\xd1\x52\x69\x7f\xc4\xcc\xb2\x31\x79\
\xa5\x6c\xe8\xbc\xfb\x03\x27\x3b\xc2\x06\xf0\x10\xc4\x2d\x28\x8f\
\xf3\x79\x54\xe0\x0d\x34\x10\xc7\xc1\xfb\xc4\x63\xd9\x27\xfc\x89\
\xfa\x2c\x7b\x99\xaf\x64\x4d\x39\xe3\x82\x3a\x0e\xb1\xc7\x37\x69\
\x96\xe0\x8c\x39\x58\x75\xdc\xbf\xb3\x60\x83\xef\x1f\xc8\xfb\xed\
\x3a\xd8\xe2\xeb\x93\xd9\xc9\x07\x8a\x60\x82\x89\x05\x27\x4b\x71\
\x63\x4e\x1e\xa3\x8d\x68\xfd\x05\x2c\x9f\xf2\xa8\xf4\xdc\xa5\x69\
\x7c\x93\x7e\x85\xa7\x37\xe9\x66\x91\xea\x8f\x52\x34\x95\x36\xf4\
\xee\xe7\x45\x0e\xbb\xbc\x2c\xfe\x0b\x24\x71\x42\x6f\xb7\x51\xc2\
\xa6\xfe\x92\xee\x60\x7c\xf9\x59\xf1\x28\x64\x9c\xf0\xac\x4e\xb1\
\x1a\x4a\xb1\x62\xcd\x7c\xdb\xf2\x34\x8e\x42\xad\x83\x98\xe3\x5d\
\x3e\x47\x23\x31\x41\x0a\x19\x6d\x79\x3a\x94\xcf\x07\xf0\xf3\x7b\
\xb3\xae\x42\x6f\x2a\xd4\x5f\x0b\x40\xf7\xd7\xca\xc3\xd9\xd4\x82\
\x01\x6f\x77\xf9\x9a\x6d\x15\xe7\xc0\x9a\x6b\xef\xf0\xd5\x78\x80\
\x37\x14\x23\x2a\xcd\xee\x31\x43\x31\xc6\xa9\x44\x3a\x53\x85\x7c\
\x4d\xb8\x34\xb1\x29\x49\xca\x62\x41\x6a\x7d\x14\xb3\x60\x75\xb0\
\xad\xfa\x19\x42\x66\xbb\xab\x00\xe6\xe2\xf0\x2f\x1a\x38\xe8\xbd\
\xce\x7d\xd5\xcc\xe9\x93\x22\x4a\xff\xd4\x6d\x2f\x4f\x89\xb4\x59\
\x96\x55\xf7\xec\x74\x99\x12\xe9\xd3\xff\x25\x5d\x15\x75\xd3\xd5\
\xab\x68\xa9\x06\xf3\x7a\xd4\x0a\xce\x99\xa4\x11\xdf\x57\xa1\x19\
\x7c\xed\xf6\x52\x09\x50\x48\xd4\xd9\x23\x61\x67\x57\xfb\xa4\xa8\
\x24\x34\xef\xb6\xbd\x05\x95\x14\x36\x08\xfa\xf9\x67\x01\x79\xb7\
\x58\x82\x8f\x80\x9d\xec\xa5\x59\xb4\x8a\x20\xa9\x61\x5b\x73\x75\
\x54\xcb\xc5\xdb\x0b\xc0\x31\xc6\x0f\x85\x1c\x30\x30\x06\x2c\x52\
\xc0\x6d\xe3\x18\xa3\x53\xac\x05\x16\x0e\xd2\xf5\x7e\xc9\x03\x63\
\x5a\xc9\x0c\x4f\x1c\xd0\x3a\xe8\x30\xe4\x58\xc5\xcd\xe6\xf7\x36\
\xcd\x23\x96\x46\x02\x5b\x50\x46\x34\xb8\x55\x14\xc6\x46\x51\x56\
\xa9\x43\xb5\x94\xe5\x0a\xf5\xcf\x5d\x09\x9c\xc8\x4c\x20\x36\x7c\
\x3a\x40\x7a\x0e\xb2\xce\x5a\x52\xd2\x50\xa6\x39\x5c\x21\x8f\x13\
\x21\x3e\xd1\x26\x58\x81\x24\xee\xb2\xf8\xe5\xc9\xbc\x4f\xe5\x32\
\x5f\x63\x48\x5a\xfa\xef\x61\x37\x6e\xc9\xe7\xbe\x5c\xed\x55\xfe\
\x65\x75\x22\x20\xd6\x91\xa8\x82\x22\xcc\x1c\xce\xd0\x4f\x68\x74\
\x0e\xaa\xa0\x29\x07\xba\x46\xc3\x29\xb4\x71\x17\x0d\x63\xc6\xf4\
\x53\x46\xf3\x29\x96\x69\x09\x66\x4b\x90\xcd\x64\x82\x40\x15\xed\
\x28\x28\x20\x9b\xc4\x65\x2f\x04\x86\xc4\xb9\x93\xb5\x6d\x35\x12\
\xb8\x37\xe7\x51\x9e\x66\x45\x6f\xb7\xd5\x38\x54\x69\x34\x4a\x84\
\x19\x4c\x0f\xce\x6a\xa7\x1b\x65\x62\x1a\xf6\xc4\x57\xdf\x53\xd5\
\x9f\x72\x7c\x0b\x70\xdb\x3d\x08\x8a\x57\x80\xe6\x12\x36\x84\x58\
\x37\x7d\xe0\x7c\xbe\x5c\xef\x92\x4f\xfa\x9e\x8f\x5e\x30\x44\x36\
\x41\x46\x0d\xe3\xe0\x45\xa5\x3c\xdb\x91\x83\x27\x98\xd1\xfc\xae\
\x16\xd7\x0d\xfd\x19\x87\x5d\x0d\xd2\x41\xcc\xc1\x53\x15\xd1\x32\
\x88\x0d\xb9\x1d\x72\xe7\x5e\x0e\x5c\x83\xa1\xff\x1b\xb6\x4f\x0e\
\x95\xd1\x83\x3d\x76\x0e\x98\xf5\x62\x08\x80\xe4\xf2\x5d\xad\x1b\
\x24\xa1\xaa\x5b\xce\x2e\x61\x7a\xe6\x5b\x48\x31\x5e\x91\xa4\x25\
\xc1\x57\x1a\x9a\x8e\xb4\xcc\x8e\x20\xaa\x48\xa8\x51\xbb\x2b\x9f\
\x63\x64\x72\x60\x2e\x6f\xb1\xa0\x5e\x49\x5a\x42\x70\x70\xb1\x0a\
\x86\xe2\x49\xda\x13\xd1\x0c\x04\x71\x3a\x2d\x21\xac\x83\x24\x94\
\xf6\x7b\xcf\xb0\x62\xbf\xba\x84\x23\x0b\xf0\x85\x29\x9b\x28\xe9\
\x09\x31\x1b\x0f\xd4\x56\x8e\xea\x98\x07\x23\x6a\xea\xc5\x69\xd2\
\x2b\x00\xee\xe4\xcc\x66\xaf\x5d\x37\x60\xec\xa3\x7e\xdd\x6e\xcd\
\xb8\xa6\x56\x80\x30\xc4\xd0\x0b\x00\x24\xdd\x6e\x64\xf2\x59\x0d\
\xa0\xa4\x61\xfe\x10\x65\x79\xc1\x01\x69\x78\x37\x41\xd0\x35\x9b\
\x22\x25\x26\x2b\xb5\x09\xb5\x14\x21\xb3\x5b\x36\x33\xdd\x15\x54\
\x72\xd1\x80\x51\xb2\xca\xa2\x90\x34\x54\x19\x4e\x2a\xb9\xeb\xf4\
\xb1\x17\x62\x70\x46\xb4\x08\xdb\x13\xf1\xba\x5c\xa8\x2a\x28\xb7\
\xea\x3f\xcd\x0a\x50\x64\xa4\xac\xd1\x7a\x63\x7d\xd3\xc8\x57\x94\
\x66\x58\x83\xce\x43\x5d\x46\xc0\x11\xdf\x41\xc0\xc0\x78\x0d\x14\
\x6d\x48\x40\x12\xe5\xe0\x94\x21\x47\x5b\x93\x50\xa5\x48\x69\x48\
\xa1\x4a\x34\xb8\xe6\xfe\xb9\xc2\xea\xfb\xe5\x2e\x23\xb4\xbe\x49\
\xe3\xdd\x26\xb9\x3e\x19\x9c\x7c\x70\x41\xd6\xf7\xde\x9a\xfd\x3e\
\x7d\xf4\x4e\x55\x37\x1e\xa0\x1b\x14\xb3\x44\xcc\xa2\xbb\x6c\xd6\
\x2b\x50\x7a\xde\x76\x50\x4d\xd3\xcc\xee\x4c\xc4\x94\x2c\xcf\xc0\
\x4d\xed\x31\xd0\x13\x5d\xc7\xc0\xd0\x8a\x3a\xd4\x12\x42\xd7\x51\
\x2b\x68\x98\x4c\x97\x8b\x28\x59\x93\xb2\xda\x9e\x49\xb6\xb2\xac\
\xdc\xbc\x72\x4d\xd1\xe4\x36\x3b\xed\x73\xf1\x3a\x56\x3c\x4b\x5d\
\x4e\x69\xe1\x1a\x31\x33\x9b\xb9\x8a\xce\xb8\xa6\x28\x4c\x99\x83\
\x7e\xee\x7a\x51\x12\x82\x85\x2c\xd2\xac\xd6\xcf\xcb\x78\xd6\xe3\
\x8c\x39\x44\xd6\xcf\xb0\xe9\x99\x59\x39\x27\x94\x45\x5a\x1a\x3a\
\xa7\x04\x9b\x1a\x47\x62\x27\xf1\x35\xeb\x7d\x74\xa5\x90\xf5\x25\
\x77\x57\xce\xa8\x06\xba\x97\x62\xaa\x0c\x67\x2f\x2d\xf6\xaa\xf0\
\x9b\x08\x94\x11\x3a\x68\x6b\xdd\xf3\xf3\x15\x51\xf3\x52\xa0\xf0\
\x1e\x83\x50\x37\x08\xed\x6c\xab\x0a\x84\x54\x0e\x2f\xa0\x26\x14\
\x69\x27\x62\x95\xe0\x14\xad\xf7\x43\x6c\x66\x04\xb4\xd3\x34\x13\
\xa8\x3c\xa8\x72\x30\x52\xf6\x35\x61\xa5\x7e\xf6\x56\x0d\xc6\xc5\
\x4c\x13\x58\x13\x76\x6a\x67\x76\x35\x20\xdd\x0c\xb5\xa0\x36\x63\
\xa9\x76\xe2\x67\x4a\x79\xbe\x5b\x2e\x21\xaf\xf5\x2d\x10\x47\x1b\
\x4b\x31\x39\x12\x38\xfc\xd8\x5c\x45\x20\x79\xc6\x09\x73\x39\xbf\
\x41\xc7\x96\x9f\xaa\xac\xf1\xf2\x13\x7b\x7c\x0f\x86\x32\xad\x71\
\x3e\x66\xe2\x26\x56\x02\x57\x29\x8c\xa0\xb2\xa8\xde\xaa\xac\xaf\
\x77\x28\x4e\x5a\x69\x55\x1c\xb4\xda\xaa\x38\x67\xc3\xec\x36\x2c\
\x6f\xb5\xf5\x22\x0d\xcf\x2a\x7f\x10\xd1\x5a\xe1\x40\xb3\xa7\x22\
\xb0\x73\x6c\x91\x2a\xdc\x0e\xb4\xd5\x6e\x37\xfe\xea\x08\x07\x21\
\x5a\x0c\x62\x53\xa4\x75\x3b\x48\x6b\x5f\xdf\x7d\xf2\x21\xea\x2e\
\xe5\x4c\x5f\xb4\x16\xde\xe3\xca\xa8\x16\x93\x78\xf6\x68\x49\xf0\
\xf0\x6e\x51\xd9\xeb\xe2\x7f\xd9\xeb\x62\xbf\xd2\xeb\xe2\x3e\xef\
\xae\xc0\x98\xb4\x37\xaa\xf7\x7d\xde\xc1\xb3\x52\xec\x73\xd1\x09\
\x4f\x18\x62\x22\x48\xdb\x21\xcb\xf2\x50\x6b\x8e\x71\xd1\x6c\x8e\
\x71\x51\x6e\x8d\x71\xd1\xaf\x0d\x3a\x02\x17\xd6\x41\xfc\xd0\xb3\
\x58\xe1\x51\xac\x4a\xe6\x4f\x5f\x34\x87\xba\x8c\xb2\x65\x5c\xc7\
\x7b\x0e\xad\xce\x1e\x38\x86\x55\x48\x5d\x9d\xf6\xbb\x86\x55\xc8\
\xa1\x69\x0d\x9a\x0b\x9e\xbc\x7c\xd3\x46\x02\xeb\x78\xe1\x1d\x5c\
\x2b\x93\x75\x7c\xf1\x0f\xae\x95\xd2\x7d\x78\xa4\x88\xa5\x8b\x51\
\xd5\xf2\xb9\x0f\x40\x26\x91\x0e\x58\x5a\x40\x22\x1e\x4f\x89\xd3\
\xdd\xaa\x0d\x39\x2e\xc8\x75\xc9\xfc\x23\xbb\xe1\xc6\x21\x6b\x77\
\x66\x16\x69\x1c\x3a\xca\x66\xaf\xa6\x98\x57\x71\xfb\xe7\x46\xc5\
\x8e\x76\x91\xe6\x3f\x1f\x1e\x00\x80\x28\xaf\x90\x5e\xe3\xc8\x63\
\xdf\xbc\xd3\x3c\x37\xe0\xc5\x93\x57\x23\x7e\xf4\x5f\x12\x1c\x6c\
\x30\xa7\xed\x63\xb4\x94\x41\x98\xc8\xdb\xcc\x3c\xd0\xcc\xc1\xac\
\x8a\x26\xbf\x45\x33\x9f\x17\xc1\xa2\xab\x4a\x7e\x11\x15\xb2\xb6\
\x5b\x73\xa2\xec\x3d\xec\xa2\x35\x65\xdf\x59\xd7\x11\xb8\x67\x9d\
\x3d\x4f\x8c\x99\xfc\xd0\x8c\xa6\xd5\xde\x41\x35\x45\x1a\xfb\x24\
\xa7\x7f\x6e\x9d\x55\x7c\x26\xe5\x49\xd8\x03\x7e\xdd\xf2\x25\x1d\
\x40\x5e\x5f\x87\x24\x3b\xef\xa2\x6f\xf0\x77\xd0\x2d\x9b\x47\x73\
\x84\x00\xcc\x37\xf8\x3b\x2c\x9b\x73\x26\x8a\x0e\x5c\xcc\x31\x43\
\x47\x84\xc9\x11\x16\x3c\xf5\x54\x6f\xca\xfb\xb8\x86\xad\xa3\x3b\
\x7e\xac\x63\x73\x57\xa5\xa8\xf3\xee\x36\xfa\x1b\xff\x96\x45\x5b\
\xdd\x20\x94\xe7\x41\x5c\x00\x26\x66\x9c\xca\xaf\xb3\x74\x4e\x63\
\xb0\x9f\xba\x6a\xdb\x67\x8d\x23\x31\x38\x87\x1d\x59\xae\x3f\x2e\
\xe4\x61\x9d\xdc\xca\xb1\x21\x02\xd2\x77\xd6\xd4\x2a\xac\xe2\x01\
\xb5\xbb\xec\x4e\xcc\x7c\xbe\x0d\x12\xa2\x31\x4f\x5a\x23\xe8\x55\
\x8f\x61\xc0\xda\xcb\xa3\xc3\xcf\xdb\x2c\xdd\xe2\xac\xf8\xd6\x0b\
\xb3\xe0\xf1\x26\xc8\x59\xc1\x5b\x0e\xa3\x73\x0d\xfd\x36\xeb\x32\
\x7b\x1e\xb7\xf8\xef\x3a\x8a\x8b\x43\x0a\x0a\x73\xe0\x6d\x57\x6f\
\xe1\x67\xbf\x1a\x57\x45\xa9\xd8\x2a\x98\x89\xe2\xf5\xc8\xbd\xb4\
\x5a\xf1\x35\x00\xec\x53\xf4\xb5\xaf\x50\xd8\x85\x7d\xbe\xe9\xd4\
\x2a\x78\x72\x56\x03\x49\xaf\xb0\x99\x92\x44\xba\x6a\xaa\x5b\xba\
\x6d\x6a\x5c\x22\xae\x31\x32\x03\x66\x63\x7a\x43\xdd\xc8\x0c\x98\
\x8d\xf1\x1a\x19\x0d\xbf\x86\x46\xe6\xa9\x42\x18\x9c\xb7\x15\xea\
\x98\xe4\xdf\x47\x07\x93\x5c\x1c\x6d\xc9\xa4\x91\x93\x47\x83\xe7\
\x63\x91\x14\x73\xab\x66\xf2\x3c\xbb\xba\x8f\xeb\x70\xee\xea\x41\
\x58\xb7\x63\xf3\x11\x70\x26\x43\xf7\x3b\x88\x71\x49\x5b\xc5\x81\
\xa0\xb7\xbe\xe3\xe0\xe0\x21\x08\x29\x8a\x72\x28\x36\x84\x37\x6e\
\xdf\x5e\xaf\x63\x6e\xc2\xdc\xab\xd5\x18\xc0\x8a\x1d\x6b\x12\x7a\
\x34\xb4\xa6\x55\xd6\xdc\xd8\x96\x83\xa0\xfa\xf6\xc7\x00\x49\xbc\
\x91\xe1\xe0\xd8\x49\x8f\xee\x40\xa9\xa4\x5b\xee\x53\x9c\xdf\xbb\
\xdc\x27\x75\xb9\x2e\xff\xc9\x7c\xee\xde\xee\xb3\x52\xee\xda\x32\
\x9c\x06\xfa\x1a\x12\xd4\x3b\x7b\x7c\x83\x75\xf9\xd1\xcf\x7d\xcd\
\x81\x1f\xec\x40\x7b\xc3\xca\x28\xfd\x19\xbd\x83\x2a\x0b\x1a\x69\
\x1e\x16\xd9\x74\xfb\x79\x64\xb1\xf3\x10\x16\xb9\xf3\x98\xe7\x77\
\x9f\xa5\x98\xb7\xf5\x44\x7b\x6e\xea\x11\x7c\x91\x43\x03\x9f\x95\
\xcd\x47\x40\x99\xb2\xf9\x10\x77\xe5\x8f\xa8\x4d\xfa\x1b\x38\x2c\
\xc6\xc0\x43\xd0\xa9\x4e\x02\xda\x61\x43\x79\xe3\x76\x15\xb5\xea\
\xe8\x24\xcc\xbd\x56\x9d\xf5\xab\xda\xb1\x83\x3c\x59\xe3\x64\x48\
\xdf\x96\x83\x60\x7a\xf7\x87\xe7\xd5\x00\xf3\xf4\x8f\x20\x4a\xb4\
\xac\xf9\xc8\x89\x6f\xab\x64\xac\x6d\xe1\x47\x44\xef\xe3\xe7\xcf\
\xc9\xc8\x00\x7a\x19\xdd\x66\x5c\xf5\x1e\xb5\xe0\x88\x4f\x16\x55\
\x58\x56\xcd\x82\x97\x05\xa4\x0f\xd3\x6f\xb4\x55\x64\x86\x87\x6d\
\x95\x2c\x68\xd0\x92\xce\x13\xbf\xfa\xe6\x40\x96\x86\xa0\xf4\x2a\
\x5d\xd7\x3b\x84\x87\x60\xde\xab\x91\x66\x55\x86\xb5\xba\xb5\xc8\
\x09\x3f\x0e\x1a\x80\x27\x83\x9c\xd7\x02\x4d\xf0\xbc\x59\x87\x4f\
\x6e\xe0\x55\x60\xe0\x08\x15\x6b\xb2\xf4\x6a\x8a\x8e\x97\x86\x55\
\x1a\xe7\xd3\xdb\x28\xc4\xdf\xc1\x3e\x34\x0a\x35\x5b\xd7\x85\xc7\
\xdf\x2d\xe2\xb4\xcc\x43\xc9\xb7\xfd\xcc\x43\x73\xa7\xa7\x82\xb2\
\xad\x03\x45\xda\x34\x0e\x22\xe5\x19\x9b\xba\x6b\x2c\xc5\xfc\x9f\
\xa1\xbc\xe6\x18\xa6\x0d\xbe\x8b\xc9\xa6\xee\xd0\x46\x8f\xe6\x3a\
\xa1\xeb\xaa\xeb\x06\x6e\x6b\xae\xa0\xd0\xfd\x65\xb9\x0a\xdd\x35\
\x01\xb8\xbf\x79\xef\xdb\xb5\xe6\x57\x9d\x2d\x7f\x7c\x5b\x04\xc5\
\x2e\x7f\x6e\x3d\xfb\xd1\x95\x41\xb7\xa7\x3e\x6e\x6a\xc3\x0e\xdd\
\xee\xa2\xed\x51\x38\x59\x17\x92\xd7\x7f\x31\x29\xdd\x06\xcb\xa8\
\xf8\x06\x79\xc7\x60\xc0\xf0\xbb\x09\xe2\x38\x4d\x93\x12\xc5\xba\
\xff\x31\xd1\xf8\xa6\xfc\x8f\xa4\x15\x28\xeb\x9f\xa3\xbf\xb2\x60\
\xbb\xc5\xe4\x1f\xf6\xb0\x83\x62\x44\x80\x92\x3b\xf3\x44\xc9\x94\
\xdb\x73\x7c\x1c\x3b\xc6\x71\x5d\x31\x6e\x76\xd3\xda\xb5\x4e\x83\
\xa0\xd9\xbc\x63\x5d\x7e\x31\x5b\x2c\x78\xcb\xf1\x67\x3d\xc7\xf8\
\xf2\x66\xc5\x37\xd1\xdc\x40\x15\x63\xd0\x74\x45\xfa\x4f\x30\xcc\
\xd5\x68\xe3\xb3\xdf\xdf\xe6\x88\x9d\xbe\x7e\xfd\xda\x2b\x5b\x07\
\x30\xeb\xff\xd8\xbb\x81\xb5\
\x00\x00\x00\xce\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x37\x33\x36\x22\
\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x37\x33\
\x36\x20\x37\x33\x36\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x37\x33\
\x36\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\
\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\
\x2f\x73\x76\x67\x22\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\
\x20\x64\x3d\x22\x6d\x33\x36\x38\x20\x31\x32\x30\x63\x2d\x31\x33\
\x37\x20\x30\x2d\x32\x34\x38\x20\x31\x31\x31\x2d\x32\x34\x38\x20\
\x32\x34\x38\x73\x31\x31\x31\x20\x32\x34\x38\x20\x32\x34\x38\x20\
\x32\x34\x38\x20\x32\x34\x38\x2d\x31\x31\x31\x20\x32\x34\x38\x2d\
\x32\x34\x38\x2d\x31\x31\x31\x2d\x32\x34\x38\x2d\x32\x34\x38\x2d\
\x32\x34\x38\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x34\x33\x34\
\x37\x34\x64\x22\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
\x00\x4c\x94\x78\x9c\xcd\x1c\x69\x6f\xdb\x38\xf6\xbb\x7f\x05\x37\
\x46\x81\x26\x6b\xd7\xb7\x93\x3a\xe8\x87\x49\x67\x77\x76\x81\x19\
\x6c\xdb\x04\x3b\x1f\x82\xa2\x90\x65\xc6\x16\x2a\x4b\xae\x24\x37\
\xed\x0c\xf2\xdf\xf7\xf1\x14\x4f\x1d\xb6\xd3\xd9\x14\x4d\x1d\x92\
\x8f\xef\xe0\xbb\xc9\x74\x70\xd1\xb9\xbf\xc3\xdf\x8a\x8f\x9d\x24\
\xcd\xb6\x41\xbc\x40\xf0\xd5\xc5\xf4\x0b\x65\xeb\xe5\xcb\xf1\xe4\
\xaa\x87\xc4\xb7\x73\x32\x8b\xfa\x7d\xb4\x0d\xa2\x04\x3d\xa4\x49\
\x81\xc2\x34\x4e\xb3\xce\x2a\xca\x83\x65\x8c\x57\x00\xde\x9d\x4e\
\xa6\x97\xd3\x15\x05\x46\xf3\xcb\x1e\x42\x97\x23\xf2\xed\x52\x02\
\x8b\xc5\xea\x06\xc8\xfa\x02\xf8\x40\xdf\xa0\x87\x66\xb3\x17\xe7\
\xe8\xcd\x1b\xb6\xf7\x0c\x46\x67\x53\xf8\xfb\xfa\xbc\x21\xf8\x58\
\x05\x9f\xc2\xe8\x74\x02\x7f\x2f\xcf\x3b\xf7\x37\x41\xf8\x79\x9d\
\xa5\xfb\x64\xa5\x0b\x62\x3c\x1c\x8f\xc7\x33\x06\x30\x19\xc3\x36\
\x93\x29\xf9\x76\xa9\x0b\x62\x29\xa1\x39\x37\x78\x15\x15\x84\x45\
\x22\x8e\x09\x7c\x4d\xa7\x25\xc9\xec\xdb\xbc\x94\xa5\x09\x0d\x62\
\xc9\x50\x86\x83\xb0\x88\xbe\xe2\x81\xd8\x0a\x3d\x46\xab\x35\x2e\
\x72\xf4\x92\x1c\xd7\x3f\x60\x34\xef\xa1\x77\x59\xba\xce\x70\x9e\
\xdf\x04\x59\x8e\x70\x11\x9e\x77\x36\xe9\x57\x9c\x51\xda\x81\x78\
\xf8\x9a\x4c\x38\xf1\x53\x41\xfc\x6c\xe4\xc7\xfc\xb8\xc1\x09\xa2\
\x5b\x44\xc9\x1a\x91\x7f\x25\x21\x25\xfe\x9b\x7d\x51\xa4\x09\x60\
\xff\x17\x0e\x56\x38\xcb\xcf\x3b\x39\x8e\x31\x2c\x4a\x93\x05\x20\
\x7d\x98\xc2\x1f\x2e\x62\x2a\xfd\xd7\xf4\x5b\x35\xbb\x6c\x07\x95\
\xcf\x4e\x10\x17\x38\x4b\x82\x02\x93\x4d\xaf\xc6\xc1\x18\xf3\x4d\
\x87\xb0\xdf\x94\x9c\xc5\x74\x5e\xbd\xa9\xd8\x81\xf0\x92\xa5\x8f\
\x39\x82\xa3\xfa\x35\xca\x8b\xc1\x5d\x86\xf1\xe0\x8e\x60\xfb\x6f\
\x84\x61\x3c\x48\x56\x14\xe0\x36\xcc\xd2\x38\x26\xc2\xec\x80\x4a\
\xa4\x19\x70\xa7\xab\xc3\xf4\x6a\xb2\xba\x5a\x32\x3a\x2e\x09\x09\
\x73\x38\xcb\xd1\x44\x61\x8e\x02\x29\x34\x6c\xd3\xbc\x90\x2c\xf9\
\xb4\x54\xdd\xca\xd4\x52\x98\x22\x1c\xcf\x27\xe7\x9a\x56\xd5\x8b\
\xd9\xa4\xa4\xad\x22\x45\xeb\x4d\x0c\x7f\x0b\x10\xff\x6c\x3c\x9d\
\x07\x43\x86\xec\x8a\xd0\x7a\x09\x14\x8d\xe6\x43\x3f\xb2\x55\x96\
\xee\x56\xe9\x63\x22\x90\xf5\x50\x80\x96\x51\x81\xe8\x8e\xb0\xb2\
\xd8\x04\x89\x80\x62\x62\xca\x30\x28\xc1\x2e\xc8\x02\xa2\x47\xed\
\xfc\x89\xb2\x8f\x74\x2d\x2e\x2d\x9a\x84\x93\x87\xe9\x88\x6f\x44\
\xb4\x68\x3e\x21\xdf\x66\x7e\x36\xd6\x59\xb0\x8a\x30\x38\xa9\x52\
\xbf\x72\x94\x4a\xae\x80\x9d\xcf\x18\x81\x22\x31\x15\x7a\x97\xee\
\xf6\x3b\xa2\x3a\xb7\x3b\x1c\x46\x41\xfc\xb1\x13\x25\x0f\x69\x5f\
\x51\x20\xaa\x44\xcb\x25\xd3\xa0\xd1\x15\x30\x23\xbe\x9d\x33\x0a\
\x08\xc0\xaf\xc1\x12\xc7\x00\x9a\x17\x41\x1c\x6b\xd0\xdd\xe1\x25\
\x3f\x05\x44\x0e\x60\x44\x8e\x1c\x0d\x25\x28\x05\x90\x80\x8a\x27\
\x00\xc0\x99\x02\x88\xae\x66\x55\x80\x8a\xec\x01\x70\xac\x02\x52\
\x07\x62\x01\xee\x13\x9b\xd8\xee\xe5\x90\x01\x0a\x2a\x55\x40\x09\
\xa0\x80\x96\xe4\x76\x67\x43\xa1\x6b\xb3\x46\xa0\x25\xc1\xe0\xaf\
\x87\x8a\xbf\xf3\x81\x5e\x0c\x3a\x9d\x0b\xf4\x27\xb5\x47\x7a\xd8\
\x0b\x47\xa8\xbb\xa6\xd3\x4c\x25\xfa\xca\x2a\xdd\xf0\xf9\x2a\xa9\
\x1e\xda\x4a\x2d\x62\x5c\x77\x9e\x3a\x17\x0b\x41\x6b\x0f\x3e\x4b\
\x7b\x96\x5a\x6b\x91\xa4\x2b\xbc\x97\x24\xd7\xaa\x86\x24\x75\xde\
\x53\x7d\xeb\xf1\x7f\x4d\x5a\x38\x32\x50\xf8\x62\xb3\x40\xc3\xdd\
\x37\xdf\xee\x45\x16\x24\x39\xd8\x2f\x58\x0b\x5b\xb2\x0b\x56\x2b\
\xf0\xbc\x0a\x90\x0c\x13\x7d\x0f\x71\x9a\x23\x23\xc4\x31\x9a\xee\
\xa5\x55\xbc\x39\x1b\x9d\x7d\xb4\xa5\xa4\x5b\x12\x43\x46\x72\x8b\
\x7e\x5e\x7c\x27\xee\x12\xc4\x1c\x47\xa1\x32\xfe\x88\x99\x67\x63\
\xfa\x4a\xc5\xd0\x79\xff\x1b\x4e\xf6\x44\x0c\x10\x21\x48\x58\x50\
\x3e\x2e\x16\x51\x81\xb7\x30\x40\x02\x07\x9f\x13\x1f\xcb\x39\x11\
\x4f\xd4\xcf\x72\x96\xc5\x4a\x36\x94\x33\x29\xa8\xeb\x10\xfb\xf8\
\x36\xcd\x12\x9c\xb1\x00\xab\xae\xfb\x67\x16\x6c\xf1\xfd\x03\xf9\
\x7e\xbb\x09\x76\xf8\xcd\xd9\xfc\xec\x23\x8c\xff\x02\x32\xdc\xdd\
\xa4\xdf\x28\xad\x09\x26\xce\x9c\xec\xca\xfd\x3a\xf9\x18\x6d\xc5\
\xe8\xcf\xe0\x04\x95\x8f\xca\xcc\x5d\x9a\xc6\x6c\x93\xb7\xe9\x76\
\x99\xea\x1f\xa5\x96\x2a\x63\xe8\xfd\x4f\xcb\x1c\x0e\x3c\x2c\xfe\
\x0d\xdc\x71\x9e\x6f\x77\x51\xc2\x40\x7f\x4e\xf7\xb0\xbe\xfc\x59\
\x09\x2e\x64\x9d\x08\xb2\x4e\x0d\x1b\x49\x0d\x63\xc3\xfc\x04\xf3\
\x34\x8e\x56\xda\x04\xf1\xcc\xfb\x7c\x81\xc6\x02\x40\xea\x1b\x1d\
\x79\x3a\x56\xe4\x47\xc8\xf3\x47\x8b\xae\xc2\x84\x2a\x3c\x81\x96\
\x8b\x1e\x6e\xa0\xc7\x8b\xa9\x85\x00\xde\xed\xf3\x0d\x3b\x2a\x2e\
\x81\x0d\x37\xe4\xd1\xab\xc9\x10\x6f\x29\x45\x54\x9b\xdd\x6b\x46\
\x62\x8d\x6d\x4f\x43\xe9\x57\x1c\x1e\xcf\x09\x31\x37\x21\x84\x46\
\x4e\x39\x88\x3c\xf2\x3f\xeb\x8e\x81\x57\x31\x1a\x94\xe5\x88\x3d\
\x27\x52\x56\x31\x3a\xf8\xdf\x64\x74\xa1\x91\xb5\x7a\x17\xad\x3a\
\x60\x81\x8a\x3a\xae\x05\xd3\x08\x12\xae\x2a\x34\x98\xef\xdd\x5e\
\x7b\x00\x0b\x49\x14\xfb\x24\x53\xec\x69\x3f\x29\xa6\x03\xc3\xfb\
\x5d\x7f\x49\x4f\x94\x2d\x82\x79\xfe\xb3\xc0\xbc\x5f\x86\xe0\xd6\
\xc1\x38\xfa\x69\x16\xad\x23\xa8\x43\xd8\x99\x5c\x9f\xd4\xc3\xf0\
\xf1\x02\x68\x8c\xf1\x43\x21\x17\x0c\x8d\x05\xcb\x14\x68\xdb\x3a\
\xd6\xe8\x1c\x6b\xb9\x80\x83\x75\x7d\x5e\xca\xc0\x00\x2b\x85\xe1\
\x09\xdd\xad\xf3\x04\x2d\x92\xeb\x24\xdb\xf2\xde\xa5\x79\xc4\x2a\
\x3f\x10\x0b\xca\x88\xa5\xb5\x4a\x9c\xd8\x2a\x2a\x2a\x75\xa9\x56\
\x65\x5c\xa3\xc1\x85\xab\xe6\x12\xc5\x04\xa4\x73\x4f\x47\x68\xcf\
\x51\x5e\x54\xab\x23\x1a\xea\x34\xc7\x2b\xf4\x71\x2a\xd4\x27\xda\
\x06\x6b\xd0\xc4\x7d\x16\xbf\x3c\x5b\x0c\xa8\x5e\xe6\x1b\x0c\x75\
\xc6\xe0\x03\x9c\xc6\x2d\xf9\x79\x20\x77\x7b\x95\x7f\x5d\x9f\x09\
\x8c\x75\x2c\xaa\xa8\x88\x30\x47\x73\xf4\x77\x34\xbe\x00\x53\xd0\
\x8c\x03\xbd\x41\xa3\x19\x8c\xf1\x50\x0a\x6b\x26\xf4\xa7\x8c\x96\
\x40\xac\x38\x12\xc2\x96\x28\x9b\xe9\x04\xc1\x2a\xc6\x51\x50\x40\
\x01\x88\xcb\x59\xc8\xe5\x48\x10\x26\x7b\xdb\x66\x24\x68\x6f\x2e\
\xa3\x3c\xcd\x8a\xfe\x7e\xa7\x49\xa8\xd2\x69\x94\x04\x33\x9c\x1e\
\x9a\xd5\x49\x37\xc9\xc4\x35\x1c\x48\xaf\x7e\xa6\x6a\xdc\xe3\xf4\
\x16\x10\x5e\xfb\x90\xc7\xae\x81\xcc\x10\x0e\x84\x78\x37\x7d\xe1\
\x62\x11\x6e\xf6\xc9\x67\xfd\xcc\xc7\x2f\x18\x21\xdb\x20\xa3\x8e\
\x71\xf8\xa2\x52\x9f\xed\x08\xef\x49\x3a\xb4\x68\xa7\xe5\x5f\x23\
\x7f\x91\x60\x37\x70\x74\x14\x0b\x88\x54\x45\x14\x06\xb1\xa1\xb7\
\x23\x1e\x52\xcb\x85\x1b\x70\xf4\x7f\xc0\xf1\xc9\xa5\x32\xca\xdb\
\x6b\x17\x40\x59\x3f\x86\x44\x45\x6e\xdf\xd3\xa6\x41\x13\xaa\xa6\
\x25\x74\x89\xd3\x03\x6f\x11\xc5\x64\x45\xea\x8c\x04\x5f\x6b\x64\
\x3a\x2a\x29\xcb\xf3\x56\xb2\x50\x63\x76\xd7\xbe\xc0\xc8\xf4\xc0\
\xdc\xde\x12\x41\xbd\x91\xb4\xc4\xe0\x90\x62\x15\x0e\x25\x92\xb4\
\x67\xa2\x19\x0a\x12\x74\x5a\x62\xd8\x04\xc9\x4a\xfa\xef\x03\xd3\
\x8a\xc3\x5a\x09\x8e\x6c\xdd\x97\xa6\x6c\xa3\xa4\x2f\xd4\x6c\x32\
\x54\x47\x39\xa9\x13\x9e\x8c\xa8\x25\x12\xe7\x49\x2f\xda\xdd\x45\
\x94\x2d\x5e\xbb\xd4\x67\xe2\xa3\x71\xdd\x1e\xcd\xb8\xa5\x56\xa0\
\x30\xd4\xd0\x8b\x00\x34\xdd\x1e\x64\xfa\x59\x8d\xa0\xe4\x61\xf1\
\x10\x65\x79\xc1\x11\x69\x74\x37\x21\xd0\x05\x4d\x89\x12\xc0\x4a\
\x3b\x41\xed\x1e\xc8\x2a\x94\x41\xa6\xfb\x82\x6a\x2e\x1a\x32\x4e\
\xd6\x59\xb4\x22\x03\x55\x8e\x93\x6a\xee\x26\x7d\xec\xaf\x30\x04\
\x23\xda\x37\xed\x8b\x7c\x5d\x6e\x54\x95\x94\x5b\x2d\x9b\x66\x3d\
\x23\xb2\x52\xb6\x55\xbd\xb9\xbe\xe9\xe4\x2b\xba\x29\x6c\x40\x97\
\xa1\xae\x23\x10\x88\xef\x20\x61\x60\xb2\x06\x8e\xb6\x24\x21\x89\
\x72\x08\xca\x45\x10\x6e\x48\xaa\x52\xa4\x34\xa5\x50\x35\x1a\x42\
\xf3\xe0\x42\x11\xf5\x7d\xb8\xcf\x08\xaf\x6f\xd3\x78\xbf\x4d\x68\
\xc9\xe7\xc2\xac\x9f\xbd\x05\xfd\x21\x7d\xf4\x82\xaa\x07\x0f\xd8\
\x0d\x8e\x59\x21\x66\xf1\x5d\x0e\xeb\x4d\x23\xbd\x6e\x3b\xaa\x0d\
\x69\x56\x77\x26\x61\x4a\x95\x67\xd0\xa6\xce\x18\xe4\x89\xa9\x53\
\x50\x68\x65\x1d\x6a\xa9\xdf\x73\xd4\xf4\x0d\x8b\xe9\x72\x13\xa5\
\x6a\x52\x76\x3b\xb0\xc8\x56\xb6\x95\x87\x57\xee\x29\x86\xdc\x6e\
\xa7\x7d\x2d\x5e\x27\x8a\x67\xe9\x9f\x29\x23\xdc\x22\xe6\xe6\x30\
\x37\xd1\x39\xb7\x14\x45\x28\x0b\xb0\xcf\x7d\x3f\x4a\x56\xe0\x21\
\x8b\x34\xab\x8d\xf3\x32\x9f\xf5\x04\x63\x8e\x91\xcd\x33\x6a\xfa\
\x66\x55\xce\x19\x65\x99\x96\x46\x4e\x97\x50\x53\x13\x48\xec\x22\
\xbe\x66\xbf\x4f\xae\x12\xb2\xbe\x4b\xee\xaa\x19\xd5\x44\xf7\x4a\
\x80\xca\x74\xf6\xca\x12\xaf\x8a\xbf\x89\x42\x19\xa9\x83\xb6\xd7\
\x3d\xbf\x12\xa1\x8d\x75\xad\xc1\xd6\xe5\x33\x06\xa3\x6e\x14\xda\
\x75\x54\x15\x0a\x69\x1c\x5e\x44\x4d\x38\xd2\x2e\xb1\x2a\xd1\x29\
\x56\xef\xc7\xd8\xcc\x09\x68\x17\x60\x26\x52\x79\xb7\xe4\x10\xa4\
\x9c\x6b\x22\x4a\xfd\xba\xac\x1a\x8d\x4b\x98\x26\xb2\x26\xe2\xd4\
\xae\xd9\x6a\x50\xba\x05\x6a\x61\x6d\x26\x52\xed\x92\xce\xd4\xf2\
\x7c\x1f\x86\x50\xd7\xfa\x36\x88\xa3\xad\x65\x98\x9c\x08\xbc\xfa\
\xd4\xdc\x44\xa0\x78\xc6\x09\x0b\x39\xca\x6d\xca\xdb\x0d\x0e\x3f\
\xb3\x8f\x1f\xc0\x51\xa6\x35\xc1\xc7\x2c\xdc\xc4\x4e\x10\x2a\x85\
\x13\x54\x36\xd5\x47\x95\xfd\xf5\x09\x25\x48\x2b\xa3\x4a\x80\x56\
\x47\x95\xe0\x6c\xb8\xdd\x86\xed\xad\xb6\x51\xa4\xe1\xf5\xe2\xff\
\x95\x28\xb4\x76\x82\xe6\x65\x45\xba\xe7\xa0\xd6\x57\x19\x39\x96\
\xaa\xd6\xe1\xe0\x50\x9d\x76\xb3\xaa\xae\x70\xf0\xac\x25\x31\x36\
\xf3\xda\xb4\x43\x0a\xed\x1b\xc4\x4f\x3e\x42\xdd\xbd\xa0\xd9\x8b\
\xd6\x47\x7e\x5a\x25\xd7\x92\x1a\xcf\x19\x85\x84\x0e\xef\x11\x95\
\xb3\x2e\xf9\x97\xb3\x2e\xf1\x2b\xb3\x2e\xe9\xf3\xe9\x0a\x8a\xc9\
\x78\xa3\x86\xe1\x97\x3d\x7c\x56\xba\x85\x2e\x3e\xe1\x13\x86\xa4\
\x0a\xea\x7e\x28\xd3\x3c\xdc\x9a\x6b\x5c\x3c\x9b\x6b\x5c\x9c\x5b\
\x6b\x5c\xfc\x6b\x8b\x4e\x20\x85\x4d\x10\x3f\xf4\x2d\x51\x78\x0c\
\xab\x52\xf8\xb3\x17\xcd\xb1\x86\x51\x16\xc6\x75\xb2\xe7\xd8\xea\
\xfc\x81\x63\x59\x85\xd6\xd5\x59\xbf\x6b\x59\x85\x1e\x9a\xde\xa0\
\xb9\xe2\xc9\x07\x37\x6d\x34\xb0\x4e\x16\xde\xc5\xb5\x3a\x59\x27\
\x17\xff\xe2\x5a\x2d\x3d\x44\x46\x8a\x5a\xba\x04\x55\xad\x9f\x87\
\x20\x64\x1a\xe9\xc0\xa5\x65\x34\xe2\x63\x97\x44\xed\x9d\x3a\x90\
\xe3\x82\x3c\x91\xcc\x3f\xb1\x57\x6d\x1c\xb3\xf6\x4e\x66\x99\xc6\
\x2b\x47\xdf\xed\xd5\x0c\xf3\x36\xf0\xe0\xc2\x68\xf9\xd1\x29\x32\
\xfc\x9f\x87\x07\x40\x20\xfa\x33\x64\xd6\xb8\x33\x39\xb4\x70\x35\
\x2f\x1e\x78\xf7\xe5\xd5\x98\xdf\xf1\x97\x0c\x07\x5b\xcc\x79\xfb\
\x14\x85\x32\x8b\x13\x85\x9f\x59\x48\x9a\x45\x9c\x15\xf8\xf9\x73\
\x99\xc5\xa2\x08\x96\x3d\x55\xf3\x8b\xa8\x90\xcd\xe1\x9a\x2b\x69\
\xef\x6d\x19\x6d\x4a\xfb\x2e\xcb\x4e\x20\x3d\xeb\xf2\x7a\x6a\x40\
\xf2\x5b\x37\x5a\x97\x7b\x17\xd5\x74\x79\xec\xab\xa0\xc1\x85\x75\
\xd9\xf1\x85\xf4\x37\xe1\x0c\xf8\x13\xcb\x97\x74\x01\xf9\xfa\x36\
\x22\xe5\x7d\x0f\x7d\x87\x7f\x87\xbd\x72\x78\xbc\x40\x08\xd0\x7c\
\x87\x7f\x47\xe5\x70\xce\x54\xd1\x41\x8b\xb9\x66\xe4\x48\x51\x39\
\xc1\x42\xa6\x9e\xf6\x4f\xf9\x06\xd7\x52\x00\xd5\x9f\x18\x9a\x70\
\xaa\xfb\x78\x57\x0b\xaa\xf3\xfe\x36\xfa\x03\xff\x92\x45\x3b\xdd\
\x51\x94\x17\x4d\x5c\x31\xa6\x66\xaa\xcb\x5f\xa7\x74\xba\x31\xf8\
\x55\xdd\xe4\xed\x4b\xcc\xb1\x58\x9c\xc3\x49\x85\x9b\x4f\xcb\xc0\
\x4a\x87\x27\x86\x6a\xc8\x98\x5a\xd3\x04\xb1\xba\x12\xd4\x1f\xff\
\x4e\xe9\x59\x2c\x76\x41\x42\x2c\xe9\x49\x1b\x04\x71\xf7\x19\x05\
\x6c\xbc\xbc\x93\xfc\xb2\xcb\xd2\x1d\xce\x8a\xef\xfd\x55\x16\x3c\
\xde\x04\x39\xeb\xa4\xcb\x65\x14\xd6\xb0\x7b\xb3\xe1\x73\xe0\x3d\
\x8e\xff\xdd\xa3\x78\x07\xa4\x90\xb0\x00\xd9\xf6\xf4\x11\x7e\xa9\
\xac\x49\x55\xf4\xa0\xad\x4e\x9c\xe8\x8a\x8f\xdd\x5b\xab\xad\x64\
\x03\xc1\x21\xdd\x64\xfb\x6d\x86\x7d\x63\xc0\x0f\x9d\x7a\x0b\x4f\
\x31\x6c\x10\xe9\x55\x36\x53\x93\xc8\x54\x4d\xdb\x4c\xf7\x59\x8d\
\x7b\xcf\x35\xce\x67\xc8\x7c\x4f\x7f\xa4\x3b\x9f\x21\xf3\x3d\x5e\
\xe7\xa3\xd1\xd7\xd0\xf9\x3c\x55\x28\x83\xf3\x19\x44\x9d\x90\xfc\
\xe7\xe8\x10\x92\x4b\xa2\x2d\x85\x34\x76\xca\x68\xf8\x7c\x22\x92\
\x6a\x6e\x35\x63\x9e\xe7\x54\x0f\x09\x29\xce\x53\x3d\x8a\xea\x76\
\x62\x3e\x01\xcd\x64\xe9\x61\x37\x3c\x2e\x6d\xab\xb8\x69\xf4\x36\
\x8e\x1c\x12\x3c\x86\x20\xc5\x50\x8e\xa5\x86\xc8\xc6\x1d\xdb\xeb\
\x6d\xcc\xcd\x98\x7b\xb7\x1a\x07\x58\x71\x62\x4d\x52\x8f\x86\xde\
\xb4\xca\x9b\x1b\xc7\x72\x14\x56\xdf\xf9\x18\x28\x49\x34\x32\x02\
\x1c\xbb\x42\xd2\x03\x28\xd5\x74\x2b\x7c\x8a\x87\x01\xae\xf0\x49\
\x43\xae\x2b\x7e\xb2\x98\x7b\x70\xf8\xac\xd4\xbb\xb6\x02\xa7\x05\
\x80\x46\x04\x8d\xce\x9e\xd8\x60\xbd\xaa\xf4\x4b\x5f\x0b\xe0\x47\
\x07\xd0\xfe\xa8\x32\x7b\x7f\xc6\xe8\xa0\xea\x82\xc6\x9a\x47\x44\
\x36\xdf\x7e\x19\x59\xe2\x3c\x46\x44\xee\xfa\xe6\xf9\xc3\x67\xa9\
\xe6\x6d\x23\xd1\x81\x87\x7a\x82\x58\xe4\xb0\xc0\x67\x15\xf3\x09\
\x48\xa6\x62\x3e\x26\x5c\xf9\x33\x6a\x93\xff\x06\x01\x8b\x09\xf0\
\x18\x72\xaa\x8b\x80\x76\xd4\x50\xd9\xb8\x43\x45\xad\x39\x3a\x19\
\x73\xef\x55\xe7\xfd\xaa\x4e\xec\xa8\x48\xd6\xb8\x18\xd2\x8f\xe5\
\x28\x9c\xde\xf3\xe1\x75\x35\xe0\xec\xfe\x16\x44\x89\x56\x35\x9f\
\xb8\xf0\x6d\x55\x8c\xb5\x6d\x08\x89\xec\x7d\xf2\xfc\x35\x19\x59\
\x40\x5f\xb9\xdb\x82\xab\x3e\xa3\x16\x12\xf1\xe9\xa2\x8a\xcb\xea\
\x59\xf0\xb6\x80\x8c\x61\xfa\x53\xb9\x8a\xca\xf0\xb8\xa3\x92\x0d\
\x0d\xda\xd2\x79\xe2\x6f\xea\x1c\xc4\xd2\x14\x94\xbe\xd1\xeb\x79\
\x97\xf0\x14\xcc\xfb\xe6\xd2\xec\xca\xb0\x51\xb7\x15\x39\xf1\xc7\
\x41\x03\xf4\x64\x91\xf3\xbd\xa1\x89\x9e\x0f\xeb\xf8\xc9\xd3\xbe\
\x0a\x0a\x1c\xa9\x62\x4d\x95\x5e\xcd\xd1\xe9\xca\xb0\x4a\xe7\xdc\
\xbd\x8d\x56\xf8\x07\xf8\x87\x46\xa9\x66\xeb\x7e\xf1\xe4\x87\x65\
\x9c\x96\x7b\x28\xe5\x76\x98\x7b\x68\x1e\xf4\x54\x54\xb6\x77\xa0\
\x44\x9b\xce\x41\x94\x3c\x13\xd3\x76\x8d\xad\x58\xfc\x33\x8c\xd7\
\x5c\xc3\xac\xc1\xf7\xe2\xd9\xb4\x1d\x3a\xe8\xb1\x5c\x27\x76\xdd\
\x74\xdd\xc8\x6d\xcb\x15\x1c\xba\x7f\x0b\xaf\xc2\x76\x4d\x04\xee\
\xdf\xc2\xf7\x9d\x5a\xf3\x37\xd4\x56\x3c\xbe\x2d\x82\x62\x9f\x3f\
\xb7\x9d\xfd\xd5\x9d\x41\x77\xa4\x3e\x6d\x69\xc3\xee\x62\xee\xa2\
\xdd\x49\x24\x59\x97\x92\xd7\xff\xc6\x53\xba\x0b\xc2\xa8\xf8\x0e\
\x75\xc7\x70\xc8\xe8\xbb\x09\xe2\x38\x4d\x93\x92\xc4\xba\xff\x6f\
\xa2\xf1\x13\xfc\xbf\x92\x57\xe0\x6c\x70\x81\x7e\xcf\x82\xdd\x0e\
\x93\xff\xbc\x87\x5d\x20\x23\x82\x94\x3c\xc6\x27\x46\xa6\x3c\xcb\
\xe3\xeb\xd8\x35\x8e\xeb\xed\x72\xb3\x27\xdc\xae\x7d\x1a\x24\xcd\
\xe6\xe3\x6d\xf6\xeb\x3c\x3f\x65\x38\x10\x1b\xde\x72\xfa\xd9\xcc\
\x29\x7e\x2b\xb4\xe2\x57\xdc\xdc\x48\x15\x67\xd0\x74\x47\xfa\x1f\
\x62\x98\xbb\xd1\xc1\x67\x7f\x18\xce\x09\xeb\xbe\x7e\xfd\xda\xab\
\x5b\x47\x08\xeb\x7f\x4b\xc7\x85\x1e\
\x00\x00\x00\xf1\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x36\x34\x30\x22\
@ -356,6 +255,41 @@ qt_resource_data = b"\
\x2d\x31\x36\x2e\x39\x20\x34\x31\x7a\x22\x0a\x20\x20\x20\x20\x20\
\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\x23\x65\x65\x65\x22\
\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
\x00\x00\x00\xf8\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x36\x38\x38\x22\
\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x36\x38\
\x38\x20\x36\x38\x38\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x36\x38\
\x38\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\
\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\
\x2f\x73\x76\x67\x22\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\
\x20\x64\x3d\x22\x6d\x35\x32\x30\x20\x31\x32\x30\x68\x2d\x33\x35\
\x32\x63\x2d\x32\x36\x2e\x35\x20\x30\x2d\x34\x38\x20\x32\x31\x2e\
\x35\x2d\x34\x38\x20\x34\x38\x76\x33\x35\x32\x63\x30\x20\x32\x36\
\x2e\x35\x20\x32\x31\x2e\x35\x20\x34\x38\x20\x34\x38\x20\x34\x38\
\x68\x33\x35\x32\x63\x32\x36\x2e\x35\x20\x30\x20\x34\x38\x2d\x32\
\x31\x2e\x35\x20\x34\x38\x2d\x34\x38\x76\x2d\x33\x35\x32\x63\x30\
\x2d\x32\x36\x2e\x35\x2d\x32\x31\x2e\x35\x2d\x34\x38\x2d\x34\x38\
\x2d\x34\x38\x7a\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
\x66\x69\x6c\x6c\x3d\x22\x23\x34\x38\x33\x64\x38\x62\x22\x2f\x3e\
\x0a\x3c\x2f\x73\x76\x67\x3e\
\x00\x00\x00\xe2\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x36\x38\x38\x22\
\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x36\x38\
\x38\x20\x36\x38\x38\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x36\x38\
\x38\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\
\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\
\x2f\x73\x76\x67\x22\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\
\x20\x64\x3d\x22\x6d\x35\x32\x30\x20\x31\x32\x30\x68\x2d\x33\x35\
\x32\x63\x2d\x32\x36\x2e\x35\x20\x30\x2d\x34\x38\x20\x32\x31\x2e\
\x35\x2d\x34\x38\x20\x34\x38\x76\x33\x35\x32\x63\x30\x20\x32\x36\
\x2e\x35\x20\x32\x31\x2e\x35\x20\x34\x38\x20\x34\x38\x20\x34\x38\
\x6c\x34\x30\x30\x2d\x34\x30\x30\x63\x30\x2d\x32\x36\x2e\x35\x2d\
\x32\x31\x2e\x35\x2d\x34\x38\x2d\x34\x38\x2d\x34\x38\x7a\x22\x0a\
\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\
\x23\x34\x38\x33\x64\x38\x62\x22\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\
\x3e\
\x00\x00\x00\xf0\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x33\x32\x30\x22\
@ -373,6 +307,71 @@ qt_resource_data = b"\
\x31\x2d\x34\x2e\x34\x2d\x34\x31\x20\x31\x37\x2d\x34\x31\x7a\x22\
\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\
\x22\x23\x65\x65\x65\x22\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
\x00\x00\x00\xe2\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x36\x38\x38\x22\
\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x36\x38\
\x38\x20\x36\x38\x38\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x36\x38\
\x38\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\
\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\
\x2f\x73\x76\x67\x22\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\
\x20\x64\x3d\x22\x6d\x35\x32\x30\x20\x31\x32\x30\x68\x2d\x33\x35\
\x32\x63\x2d\x32\x36\x2e\x35\x20\x30\x2d\x34\x38\x20\x32\x31\x2e\
\x35\x2d\x34\x38\x20\x34\x38\x76\x33\x35\x32\x63\x30\x20\x32\x36\
\x2e\x35\x20\x32\x31\x2e\x35\x20\x34\x38\x20\x34\x38\x20\x34\x38\
\x6c\x34\x30\x30\x2d\x34\x30\x30\x63\x30\x2d\x32\x36\x2e\x35\x2d\
\x32\x31\x2e\x35\x2d\x34\x38\x2d\x34\x38\x2d\x34\x38\x7a\x22\x0a\
\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\
\x23\x34\x33\x34\x37\x34\x64\x22\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\
\x3e\
\x00\x00\x00\xf8\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x36\x38\x38\x22\
\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x36\x38\
\x38\x20\x36\x38\x38\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x36\x38\
\x38\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\
\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\
\x2f\x73\x76\x67\x22\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\
\x20\x64\x3d\x22\x6d\x35\x32\x30\x20\x31\x32\x30\x68\x2d\x33\x35\
\x32\x63\x2d\x32\x36\x2e\x35\x20\x30\x2d\x34\x38\x20\x32\x31\x2e\
\x35\x2d\x34\x38\x20\x34\x38\x76\x33\x35\x32\x63\x30\x20\x32\x36\
\x2e\x35\x20\x32\x31\x2e\x35\x20\x34\x38\x20\x34\x38\x20\x34\x38\
\x68\x33\x35\x32\x63\x32\x36\x2e\x35\x20\x30\x20\x34\x38\x2d\x32\
\x31\x2e\x35\x20\x34\x38\x2d\x34\x38\x76\x2d\x33\x35\x32\x63\x30\
\x2d\x32\x36\x2e\x35\x2d\x32\x31\x2e\x35\x2d\x34\x38\x2d\x34\x38\
\x2d\x34\x38\x7a\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
\x66\x69\x6c\x6c\x3d\x22\x23\x34\x33\x34\x37\x34\x64\x22\x2f\x3e\
\x0a\x3c\x2f\x73\x76\x67\x3e\
\x00\x00\x00\xce\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x37\x33\x36\x22\
\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x37\x33\
\x36\x20\x37\x33\x36\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x37\x33\
\x36\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\
\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\
\x2f\x73\x76\x67\x22\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\
\x20\x64\x3d\x22\x6d\x33\x36\x38\x20\x31\x32\x30\x63\x2d\x31\x33\
\x37\x20\x30\x2d\x32\x34\x38\x20\x31\x31\x31\x2d\x32\x34\x38\x20\
\x32\x34\x38\x73\x31\x31\x31\x20\x32\x34\x38\x20\x32\x34\x38\x20\
\x32\x34\x38\x20\x32\x34\x38\x2d\x31\x31\x31\x20\x32\x34\x38\x2d\
\x32\x34\x38\x2d\x31\x31\x31\x2d\x32\x34\x38\x2d\x32\x34\x38\x2d\
\x32\x34\x38\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x34\x38\x33\
\x64\x38\x62\x22\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
\x00\x00\x00\xce\
\x3c\
\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x37\x33\x36\x22\
\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x37\x33\
\x36\x20\x37\x33\x36\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x37\x33\
\x36\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\
\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\
\x2f\x73\x76\x67\x22\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\
\x20\x64\x3d\x22\x6d\x33\x36\x38\x20\x31\x32\x30\x63\x2d\x31\x33\
\x37\x20\x30\x2d\x32\x34\x38\x20\x31\x31\x31\x2d\x32\x34\x38\x20\
\x32\x34\x38\x73\x31\x31\x31\x20\x32\x34\x38\x20\x32\x34\x38\x20\
\x32\x34\x38\x20\x32\x34\x38\x2d\x31\x31\x31\x20\x32\x34\x38\x2d\
\x32\x34\x38\x2d\x31\x31\x31\x2d\x32\x34\x38\x2d\x32\x34\x38\x2d\
\x32\x34\x38\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x34\x33\x34\
\x37\x34\x64\x22\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
"
qt_resource_name = b"\
@ -384,10 +383,35 @@ qt_resource_name = b"\
\x08\xaa\x11\x25\
\x00\x52\
\x00\x61\x00\x72\x00\x65\x00\x53\x00\x74\x00\x79\x00\x6c\x00\x65\
\x00\x0e\
\x03\xc2\xd5\xc3\
\x00\x73\
\x00\x74\x00\x79\x00\x6c\x00\x65\x00\x73\x00\x68\x00\x65\x00\x65\x00\x74\x00\x2e\x00\x71\x00\x73\x00\x73\
\x00\x0d\
\x02\x0d\x3c\x07\
\x00\x64\
\x00\x72\x00\x6f\x00\x70\x00\x2d\x00\x64\x00\x6f\x00\x77\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
\x00\x0b\
\x04\x37\x88\x27\
\x00\x73\
\x00\x6f\x00\x72\x00\x74\x00\x2d\x00\x75\x00\x70\x00\x2e\x00\x73\x00\x76\x00\x67\
\x00\x0a\
\x08\x8b\x0b\xa7\
\x00\x73\
\x00\x71\x00\x75\x00\x61\x00\x72\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
\x00\x0f\
\x0d\xb0\xb1\xa7\
\x00\x68\
\x00\x61\x00\x6c\x00\x66\x00\x2d\x00\x73\x00\x71\x00\x75\x00\x61\x00\x72\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
\x00\x0d\
\x02\x33\xbc\x47\
\x00\x73\
\x00\x6f\x00\x72\x00\x74\x00\x2d\x00\x64\x00\x6f\x00\x77\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
\x00\x18\
\x08\xb9\x19\xc7\
\x00\x68\
\x00\x61\x00\x6c\x00\x66\x00\x2d\x00\x73\x00\x71\x00\x75\x00\x61\x00\x72\x00\x65\x00\x2d\x00\x64\x00\x69\x00\x73\x00\x61\x00\x62\
\x00\x6c\x00\x65\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
\x00\x13\
\x0f\xf8\x57\x27\
\x00\x73\
@ -397,52 +421,27 @@ qt_resource_name = b"\
\x0a\x2d\x1b\xc7\
\x00\x63\
\x00\x69\x00\x72\x00\x63\x00\x6c\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
\x00\x18\
\x08\xb9\x19\xc7\
\x00\x68\
\x00\x61\x00\x6c\x00\x66\x00\x2d\x00\x73\x00\x71\x00\x75\x00\x61\x00\x72\x00\x65\x00\x2d\x00\x64\x00\x69\x00\x73\x00\x61\x00\x62\
\x00\x6c\x00\x65\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
\x00\x0f\
\x0d\xb0\xb1\xa7\
\x00\x68\
\x00\x61\x00\x6c\x00\x66\x00\x2d\x00\x73\x00\x71\x00\x75\x00\x61\x00\x72\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
\x00\x0e\
\x03\xc2\xd5\xc3\
\x00\x73\
\x00\x74\x00\x79\x00\x6c\x00\x65\x00\x73\x00\x68\x00\x65\x00\x65\x00\x74\x00\x2e\x00\x71\x00\x73\x00\x73\
\x00\x13\
\x0d\xf4\xfe\xa7\
\x00\x63\
\x00\x69\x00\x72\x00\x63\x00\x6c\x00\x65\x00\x2d\x00\x64\x00\x69\x00\x73\x00\x61\x00\x62\x00\x6c\x00\x65\x00\x64\x00\x2e\x00\x73\
\x00\x76\x00\x67\
\x00\x0d\
\x02\x0d\x3c\x07\
\x00\x64\
\x00\x72\x00\x6f\x00\x70\x00\x2d\x00\x64\x00\x6f\x00\x77\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
\x00\x0b\
\x04\x37\x88\x27\
\x00\x73\
\x00\x6f\x00\x72\x00\x74\x00\x2d\x00\x75\x00\x70\x00\x2e\x00\x73\x00\x76\x00\x67\
\x00\x0d\
\x02\x33\xbc\x47\
\x00\x73\
\x00\x6f\x00\x72\x00\x74\x00\x2d\x00\x64\x00\x6f\x00\x77\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
"
qt_resource_struct_v1 = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\
\x00\x00\x00\x1c\x00\x02\x00\x00\x00\x0a\x00\x00\x00\x03\
\x00\x00\x01\x3c\x00\x00\x00\x00\x00\x01\x00\x00\x12\x64\
\x00\x00\x01\x78\x00\x00\x00\x00\x00\x01\x00\x00\x14\x67\
\x00\x00\x00\xee\x00\x01\x00\x00\x00\x01\x00\x00\x04\x96\
\x00\x00\x01\x5c\x00\x00\x00\x00\x00\x01\x00\x00\x13\x59\
\x00\x00\x00\x34\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x00\x94\x00\x00\x00\x00\x00\x01\x00\x00\x02\xca\
\x00\x00\x00\x7a\x00\x00\x00\x00\x00\x01\x00\x00\x01\xf8\
\x00\x00\x00\xca\x00\x00\x00\x00\x00\x01\x00\x00\x03\xb0\
\x00\x00\x01\x10\x00\x00\x00\x00\x00\x01\x00\x00\x11\x92\
\x00\x00\x00\x4e\x00\x00\x00\x00\x00\x01\x00\x00\x00\xfc\
\x00\x00\x00\x56\x00\x00\x00\x00\x00\x01\x00\x00\x0c\xee\
\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x01\x00\x00\x10\xd3\
\x00\x00\x00\x34\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x00\x76\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xe3\
\x00\x00\x00\x92\x00\x00\x00\x00\x00\x01\x00\x00\x0e\xf1\
\x00\x00\x00\xf0\x00\x00\x00\x00\x00\x01\x00\x00\x11\xc7\
\x00\x00\x01\x52\x00\x00\x00\x00\x00\x01\x00\x00\x13\xa9\
\x00\x00\x00\xac\x00\x00\x00\x00\x00\x01\x00\x00\x0f\xed\
\x00\x00\x01\x6c\x00\x00\x00\x00\x00\x01\x00\x00\x14\x7b\
\x00\x00\x01\x26\x00\x00\x00\x00\x00\x01\x00\x00\x12\xad\
"
qt_resource_struct_v2 = b"\
@ -452,25 +451,25 @@ qt_resource_struct_v2 = b"\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x1c\x00\x02\x00\x00\x00\x0a\x00\x00\x00\x03\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x01\x3c\x00\x00\x00\x00\x00\x01\x00\x00\x12\x64\
\x00\x00\x00\x56\x00\x00\x00\x00\x00\x01\x00\x00\x0c\xee\
\x00\x00\x01\x80\xe6\x9d\x20\xec\
\x00\x00\x01\x78\x00\x00\x00\x00\x00\x01\x00\x00\x14\x67\
\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x01\x00\x00\x10\xd3\
\x00\x00\x01\x80\xe6\x9b\xf7\xc0\
\x00\x00\x00\xee\x00\x01\x00\x00\x00\x01\x00\x00\x04\x96\
\x00\x00\x01\x80\xe5\xcc\xf8\xd0\
\x00\x00\x01\x5c\x00\x00\x00\x00\x00\x01\x00\x00\x13\x59\
\x00\x00\x00\x34\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x01\x84\x19\x90\x42\x45\
\x00\x00\x00\x76\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xe3\
\x00\x00\x01\x80\xe6\x9c\x02\x96\
\x00\x00\x00\x34\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x00\x92\x00\x00\x00\x00\x00\x01\x00\x00\x0e\xf1\
\x00\x00\x01\x80\xe6\x9c\x3e\xe9\
\x00\x00\x00\x94\x00\x00\x00\x00\x00\x01\x00\x00\x02\xca\
\x00\x00\x00\xf0\x00\x00\x00\x00\x00\x01\x00\x00\x11\xc7\
\x00\x00\x01\x80\xbe\xdc\x4e\x35\
\x00\x00\x00\x7a\x00\x00\x00\x00\x00\x01\x00\x00\x01\xf8\
\x00\x00\x01\x52\x00\x00\x00\x00\x00\x01\x00\x00\x13\xa9\
\x00\x00\x01\x80\xe6\x9b\xde\xfc\
\x00\x00\x00\xca\x00\x00\x00\x00\x00\x01\x00\x00\x03\xb0\
\x00\x00\x00\xac\x00\x00\x00\x00\x00\x01\x00\x00\x0f\xed\
\x00\x00\x01\x80\xe6\x9b\xed\x87\
\x00\x00\x01\x10\x00\x00\x00\x00\x00\x01\x00\x00\x11\x92\
\x00\x00\x01\x6c\x00\x00\x00\x00\x00\x01\x00\x00\x14\x7b\
\x00\x00\x01\x80\xbe\xdc\x4e\x35\
\x00\x00\x00\x4e\x00\x00\x00\x00\x00\x01\x00\x00\x00\xfc\
\x00\x00\x01\x26\x00\x00\x00\x00\x00\x01\x00\x00\x12\xad\
\x00\x00\x01\x80\xbe\xdc\x4e\x35\
"

View File

@ -65,6 +65,7 @@ QTableView::item,
QHeaderView::section,
QTableView QTableCornerButton::section,
QFrame[frameShape="6"],
QGroupBox,
QLineEdit,
QTextEdit,
QTimeEdit,
@ -115,15 +116,12 @@ QPushButton {
QToolButton {
height: 1.10em;
}
QFrame[frameShape="0"] {
border-width: 0px;
}
QFrame[frameShape="6"] {
border-radius: 4px;
}
QFrame[noBorder="1"],
QListView[noBorder="1"],
QScrollArea[noBorder="1"],
QStackedWidget[noBorder="1"] {
border-color: transparent;
}
QComboBox {
background-color: rgb( 51, 54, 59);
}
@ -383,6 +381,7 @@ QTableView::indicator {
border-style: solid;
background-color: rgb( 32, 34, 37);
}
QGroupBox::indicator,
QCheckBox::indicator,
QRadioButton::indicator,
QListView::indicator,
@ -391,6 +390,9 @@ QTableView::indicator {
width: 11px;
height: 11px;
}
QGroupBox::indicator {
padding: 0px;
}
QGroupBox::indicator:disabled,
QCheckBox::indicator:disabled,
QRadioButton::indicator:disabled,
@ -482,6 +484,7 @@ QGroupBox::title {
*/
background-color: rgb( 42, 40, 63);
}
QToolBox::tab:disabled,
QGroupBox::title:disabled {
border-color: rgb( 67, 71, 77);
background-color: rgb( 41, 43, 47);

View File

@ -14,8 +14,8 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_InstallDialog(object):
def setupUi(self, InstallDialog):
InstallDialog.setObjectName("InstallDialog")
InstallDialog.resize(383, 438)
InstallDialog.setWindowTitle("Rare")
InstallDialog.resize(324, 224)
InstallDialog.setWindowTitle("InstallDialog")
self.install_dialog_layout = QtWidgets.QFormLayout(InstallDialog)
self.install_dialog_layout.setLabelAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
self.install_dialog_layout.setObjectName("install_dialog_layout")
@ -47,119 +47,12 @@ class Ui_InstallDialog(object):
self.shortcut_check.setText("")
self.shortcut_check.setObjectName("shortcut_check")
self.install_dialog_layout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.shortcut_check)
self.sdl_list_label = QtWidgets.QLabel(InstallDialog)
self.sdl_list_label.setObjectName("sdl_list_label")
self.install_dialog_layout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.sdl_list_label)
self.sdl_list_frame = QtWidgets.QFrame(InstallDialog)
self.sdl_list_frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.sdl_list_frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.sdl_list_frame.setObjectName("sdl_list_frame")
self.sdl_list_layout = QtWidgets.QVBoxLayout(self.sdl_list_frame)
self.sdl_list_layout.setSizeConstraint(QtWidgets.QLayout.SetFixedSize)
self.sdl_list_layout.setContentsMargins(-1, 0, -1, 0)
self.sdl_list_layout.setSpacing(0)
self.sdl_list_layout.setObjectName("sdl_list_layout")
self.sdl_list_text = QtWidgets.QLabel(self.sdl_list_frame)
self.sdl_list_text.setObjectName("sdl_list_text")
self.sdl_list_layout.addWidget(self.sdl_list_text)
self.install_dialog_layout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.sdl_list_frame)
self.collapsible_layout = QtWidgets.QVBoxLayout()
self.collapsible_layout.setObjectName("collapsible_layout")
self.advanced_layout = QtWidgets.QFormLayout()
self.advanced_layout.setLabelAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
self.selectable_layout = QtWidgets.QVBoxLayout()
self.selectable_layout.setObjectName("selectable_layout")
self.install_dialog_layout.setLayout(4, QtWidgets.QFormLayout.SpanningRole, self.selectable_layout)
self.advanced_layout = QtWidgets.QVBoxLayout()
self.advanced_layout.setObjectName("advanced_layout")
self.max_workers_label = QtWidgets.QLabel(InstallDialog)
self.max_workers_label.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
self.max_workers_label.setObjectName("max_workers_label")
self.advanced_layout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.max_workers_label)
self.max_workers_layout = QtWidgets.QHBoxLayout()
self.max_workers_layout.setObjectName("max_workers_layout")
self.max_workers_spin = QtWidgets.QSpinBox(InstallDialog)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.max_workers_spin.sizePolicy().hasHeightForWidth())
self.max_workers_spin.setSizePolicy(sizePolicy)
self.max_workers_spin.setObjectName("max_workers_spin")
self.max_workers_layout.addWidget(self.max_workers_spin)
self.max_workers_info_label = QtWidgets.QLabel(InstallDialog)
font = QtGui.QFont()
font.setItalic(True)
self.max_workers_info_label.setFont(font)
self.max_workers_info_label.setObjectName("max_workers_info_label")
self.max_workers_layout.addWidget(self.max_workers_info_label)
self.advanced_layout.setLayout(0, QtWidgets.QFormLayout.FieldRole, self.max_workers_layout)
self.max_memory_label = QtWidgets.QLabel(InstallDialog)
self.max_memory_label.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
self.max_memory_label.setObjectName("max_memory_label")
self.advanced_layout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.max_memory_label)
self.max_memory_layout = QtWidgets.QHBoxLayout()
self.max_memory_layout.setObjectName("max_memory_layout")
self.max_memory_spin = QtWidgets.QSpinBox(InstallDialog)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.max_memory_spin.sizePolicy().hasHeightForWidth())
self.max_memory_spin.setSizePolicy(sizePolicy)
self.max_memory_spin.setMinimum(0)
self.max_memory_spin.setMaximum(10240)
self.max_memory_spin.setSingleStep(128)
self.max_memory_spin.setProperty("value", 1024)
self.max_memory_spin.setObjectName("max_memory_spin")
self.max_memory_layout.addWidget(self.max_memory_spin)
self.max_memory_info_label = QtWidgets.QLabel(InstallDialog)
font = QtGui.QFont()
font.setItalic(True)
self.max_memory_info_label.setFont(font)
self.max_memory_info_label.setObjectName("max_memory_info_label")
self.max_memory_layout.addWidget(self.max_memory_info_label)
self.advanced_layout.setLayout(1, QtWidgets.QFormLayout.FieldRole, self.max_memory_layout)
self.install_prereqs_label = QtWidgets.QLabel(InstallDialog)
self.install_prereqs_label.setObjectName("install_prereqs_label")
self.advanced_layout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.install_prereqs_label)
self.install_prereqs_check = QtWidgets.QCheckBox(InstallDialog)
font = QtGui.QFont()
font.setItalic(True)
self.install_prereqs_check.setFont(font)
self.install_prereqs_check.setText("")
self.install_prereqs_check.setChecked(False)
self.install_prereqs_check.setObjectName("install_prereqs_check")
self.advanced_layout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.install_prereqs_check)
self.dl_optimizations_label = QtWidgets.QLabel(InstallDialog)
self.dl_optimizations_label.setObjectName("dl_optimizations_label")
self.advanced_layout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.dl_optimizations_label)
self.dl_optimizations_check = QtWidgets.QCheckBox(InstallDialog)
self.dl_optimizations_check.setText("")
self.dl_optimizations_check.setChecked(False)
self.dl_optimizations_check.setObjectName("dl_optimizations_check")
self.advanced_layout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.dl_optimizations_check)
self.force_download_label = QtWidgets.QLabel(InstallDialog)
self.force_download_label.setObjectName("force_download_label")
self.advanced_layout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.force_download_label)
self.force_download_check = QtWidgets.QCheckBox(InstallDialog)
self.force_download_check.setText("")
self.force_download_check.setObjectName("force_download_check")
self.advanced_layout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.force_download_check)
self.ignore_space_label = QtWidgets.QLabel(InstallDialog)
self.ignore_space_label.setObjectName("ignore_space_label")
self.advanced_layout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.ignore_space_label)
self.ignore_space_check = QtWidgets.QCheckBox(InstallDialog)
font = QtGui.QFont()
font.setItalic(True)
self.ignore_space_check.setFont(font)
self.ignore_space_check.setObjectName("ignore_space_check")
self.advanced_layout.setWidget(5, QtWidgets.QFormLayout.FieldRole, self.ignore_space_check)
self.download_only_label = QtWidgets.QLabel(InstallDialog)
self.download_only_label.setObjectName("download_only_label")
self.advanced_layout.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.download_only_label)
self.download_only_check = QtWidgets.QCheckBox(InstallDialog)
font = QtGui.QFont()
font.setItalic(True)
self.download_only_check.setFont(font)
self.download_only_check.setObjectName("download_only_check")
self.advanced_layout.setWidget(6, QtWidgets.QFormLayout.FieldRole, self.download_only_check)
self.collapsible_layout.addLayout(self.advanced_layout)
self.install_dialog_layout.setLayout(5, QtWidgets.QFormLayout.SpanningRole, self.collapsible_layout)
self.install_dialog_layout.setLayout(5, QtWidgets.QFormLayout.SpanningRole, self.advanced_layout)
self.download_size_label = QtWidgets.QLabel(InstallDialog)
self.download_size_label.setObjectName("download_size_label")
self.install_dialog_layout.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.download_size_label)
@ -215,20 +108,6 @@ class Ui_InstallDialog(object):
self.install_dir_label.setText(_translate("InstallDialog", "Install directory"))
self.platform_label.setText(_translate("InstallDialog", "Platform"))
self.shortcut_label.setText(_translate("InstallDialog", "Create shortcut"))
self.sdl_list_label.setText(_translate("InstallDialog", "Optional packs"))
self.sdl_list_text.setText(_translate("InstallDialog", "None"))
self.max_workers_label.setText(_translate("InstallDialog", "Max workers"))
self.max_workers_info_label.setText(_translate("InstallDialog", "Less is slower. (0: Default)"))
self.max_memory_label.setText(_translate("InstallDialog", "Max shared memory"))
self.max_memory_spin.setSuffix(_translate("InstallDialog", "MiB"))
self.max_memory_info_label.setText(_translate("InstallDialog", "Less is slower (0: Default)"))
self.install_prereqs_label.setText(_translate("InstallDialog", "Install prerequisites"))
self.dl_optimizations_label.setText(_translate("InstallDialog", "Enable reordering"))
self.force_download_label.setText(_translate("InstallDialog", "Force redownload"))
self.ignore_space_label.setText(_translate("InstallDialog", "Ignore free space"))
self.ignore_space_check.setText(_translate("InstallDialog", "Use with caution!"))
self.download_only_label.setText(_translate("InstallDialog", "Download only"))
self.download_only_check.setText(_translate("InstallDialog", "Do not try to install."))
self.download_size_label.setText(_translate("InstallDialog", "Download size"))
self.download_size_text.setText(_translate("InstallDialog", "Click verify..."))
self.install_size_label.setText(_translate("InstallDialog", "Total install size"))

View File

@ -6,12 +6,12 @@
<rect>
<x>0</x>
<y>0</y>
<width>383</width>
<height>438</height>
<width>324</width>
<height>224</height>
</rect>
</property>
<property name="windowTitle">
<string notr="true">Rare</string>
<string notr="true">InstallDialog</string>
</property>
<layout class="QFormLayout" name="install_dialog_layout">
<property name="labelAlignment">
@ -68,232 +68,11 @@
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="sdl_list_label">
<property name="text">
<string>Optional packs</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QFrame" name="sdl_list_frame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QVBoxLayout" name="sdl_list_layout">
<property name="spacing">
<number>0</number>
</property>
<property name="sizeConstraint">
<enum>QLayout::SetFixedSize</enum>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="sdl_list_text">
<property name="text">
<string>None</string>
</property>
</widget>
</item>
</layout>
</widget>
<item row="4" column="0" colspan="2">
<layout class="QVBoxLayout" name="selectable_layout"/>
</item>
<item row="5" column="0" colspan="2">
<layout class="QVBoxLayout" name="collapsible_layout">
<item>
<layout class="QFormLayout" name="advanced_layout">
<property name="labelAlignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<item row="0" column="0">
<widget class="QLabel" name="max_workers_label">
<property name="text">
<string>Max workers</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="1">
<layout class="QHBoxLayout" name="max_workers_layout">
<item>
<widget class="QSpinBox" name="max_workers_spin">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="max_workers_info_label">
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>Less is slower. (0: Default)</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QLabel" name="max_memory_label">
<property name="text">
<string>Max shared memory</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="max_memory_layout">
<item>
<widget class="QSpinBox" name="max_memory_spin">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="suffix">
<string>MiB</string>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>10240</number>
</property>
<property name="singleStep">
<number>128</number>
</property>
<property name="value">
<number>1024</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="max_memory_info_label">
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>Less is slower (0: Default)</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0">
<widget class="QLabel" name="install_prereqs_label">
<property name="text">
<string>Install prerequisites</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="install_prereqs_check">
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string notr="true"/>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="dl_optimizations_label">
<property name="text">
<string>Enable reordering</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="dl_optimizations_check">
<property name="text">
<string notr="true"/>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="force_download_label">
<property name="text">
<string>Force redownload</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="force_download_check">
<property name="text">
<string notr="true"/>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="ignore_space_label">
<property name="text">
<string>Ignore free space</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QCheckBox" name="ignore_space_check">
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>Use with caution!</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="download_only_label">
<property name="text">
<string>Download only</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QCheckBox" name="download_only_check">
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>Do not try to install.</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
<layout class="QVBoxLayout" name="advanced_layout"/>
</item>
<item row="6" column="0">
<widget class="QLabel" name="download_size_label">

View File

@ -15,6 +15,7 @@ class Ui_InstallDialogAdvanced(object):
def setupUi(self, InstallDialogAdvanced):
InstallDialogAdvanced.setObjectName("InstallDialogAdvanced")
InstallDialogAdvanced.resize(379, 208)
InstallDialogAdvanced.setWindowTitle("InstallDialogAdvanced")
self.install_dialog_advanced_layout = QtWidgets.QFormLayout(InstallDialogAdvanced)
self.install_dialog_advanced_layout.setObjectName("install_dialog_advanced_layout")
self.max_workers_label = QtWidgets.QLabel(InstallDialogAdvanced)
@ -31,12 +32,12 @@ class Ui_InstallDialogAdvanced(object):
self.max_workers_spin.setSizePolicy(sizePolicy)
self.max_workers_spin.setObjectName("max_workers_spin")
self.max_workers_layout.addWidget(self.max_workers_spin)
self.max_workers_info_label = QtWidgets.QLabel(InstallDialogAdvanced)
self.max_workers_info = QtWidgets.QLabel(InstallDialogAdvanced)
font = QtGui.QFont()
font.setItalic(True)
self.max_workers_info_label.setFont(font)
self.max_workers_info_label.setObjectName("max_workers_info_label")
self.max_workers_layout.addWidget(self.max_workers_info_label)
self.max_workers_info.setFont(font)
self.max_workers_info.setObjectName("max_workers_info")
self.max_workers_layout.addWidget(self.max_workers_info)
self.install_dialog_advanced_layout.setLayout(0, QtWidgets.QFormLayout.FieldRole, self.max_workers_layout)
self.max_memory_label = QtWidgets.QLabel(InstallDialogAdvanced)
self.max_memory_label.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
@ -56,16 +57,16 @@ class Ui_InstallDialogAdvanced(object):
self.max_memory_spin.setProperty("value", 1024)
self.max_memory_spin.setObjectName("max_memory_spin")
self.max_memory_layout.addWidget(self.max_memory_spin)
self.max_memory_info_label = QtWidgets.QLabel(InstallDialogAdvanced)
self.max_memory_info = QtWidgets.QLabel(InstallDialogAdvanced)
font = QtGui.QFont()
font.setItalic(True)
self.max_memory_info_label.setFont(font)
self.max_memory_info_label.setObjectName("max_memory_info_label")
self.max_memory_layout.addWidget(self.max_memory_info_label)
self.max_memory_info.setFont(font)
self.max_memory_info.setObjectName("max_memory_info")
self.max_memory_layout.addWidget(self.max_memory_info)
self.install_dialog_advanced_layout.setLayout(1, QtWidgets.QFormLayout.FieldRole, self.max_memory_layout)
self.install_prereqs_lbl = QtWidgets.QLabel(InstallDialogAdvanced)
self.install_prereqs_lbl.setObjectName("install_prereqs_lbl")
self.install_dialog_advanced_layout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.install_prereqs_lbl)
self.install_prereqs_label = QtWidgets.QLabel(InstallDialogAdvanced)
self.install_prereqs_label.setObjectName("install_prereqs_label")
self.install_dialog_advanced_layout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.install_prereqs_label)
self.install_prereqs_check = QtWidgets.QCheckBox(InstallDialogAdvanced)
font = QtGui.QFont()
font.setItalic(True)
@ -113,13 +114,12 @@ class Ui_InstallDialogAdvanced(object):
def retranslateUi(self, InstallDialogAdvanced):
_translate = QtCore.QCoreApplication.translate
InstallDialogAdvanced.setWindowTitle(_translate("InstallDialogAdvanced", "Form"))
self.max_workers_label.setText(_translate("InstallDialogAdvanced", "Max workers"))
self.max_workers_info_label.setText(_translate("InstallDialogAdvanced", "Less is slower. (0: Default)"))
self.max_workers_info.setText(_translate("InstallDialogAdvanced", "Less is slower. (0: Default)"))
self.max_memory_label.setText(_translate("InstallDialogAdvanced", "Max shared memory"))
self.max_memory_spin.setSuffix(_translate("InstallDialogAdvanced", "MiB"))
self.max_memory_info_label.setText(_translate("InstallDialogAdvanced", "Less is slower (0: Default)"))
self.install_prereqs_lbl.setText(_translate("InstallDialogAdvanced", "Install prerequisites"))
self.max_memory_info.setText(_translate("InstallDialogAdvanced", "Less is slower (0: Default)"))
self.install_prereqs_label.setText(_translate("InstallDialogAdvanced", "Install prerequisites"))
self.dl_optimizations_label.setText(_translate("InstallDialogAdvanced", "Enable reordering"))
self.force_download_label.setText(_translate("InstallDialogAdvanced", "Force redownload"))
self.ignore_space_label.setText(_translate("InstallDialogAdvanced", "Ignore free space"))

View File

@ -11,7 +11,7 @@
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
<string notr="true">InstallDialogAdvanced</string>
</property>
<layout class="QFormLayout" name="install_dialog_advanced_layout">
<item row="0" column="0">
@ -37,7 +37,7 @@
</widget>
</item>
<item>
<widget class="QLabel" name="max_workers_info_label">
<widget class="QLabel" name="max_workers_info">
<property name="font">
<font>
<italic>true</italic>
@ -88,7 +88,7 @@
</widget>
</item>
<item>
<widget class="QLabel" name="max_memory_info_label">
<widget class="QLabel" name="max_memory_info">
<property name="font">
<font>
<italic>true</italic>
@ -102,7 +102,7 @@
</layout>
</item>
<item row="2" column="0">
<widget class="QLabel" name="install_prereqs_lbl">
<widget class="QLabel" name="install_prereqs_label">
<property name="text">
<string>Install prerequisites</string>
</property>

View File

@ -0,0 +1,152 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'rare/ui/components/tabs/games/import_sync/eos_widget.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_EosWidget(object):
def setupUi(self, EosWidget):
EosWidget.setObjectName("EosWidget")
EosWidget.resize(586, 146)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Maximum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(EosWidget.sizePolicy().hasHeightForWidth())
EosWidget.setSizePolicy(sizePolicy)
EosWidget.setWindowTitle("GroupBox")
self.eos_layout = QtWidgets.QHBoxLayout(EosWidget)
self.eos_layout.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint)
self.eos_layout.setObjectName("eos_layout")
self.overlay_stack = QtWidgets.QStackedWidget(EosWidget)
self.overlay_stack.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.overlay_stack.setFrameShadow(QtWidgets.QFrame.Raised)
self.overlay_stack.setObjectName("overlay_stack")
self.overlay_info_page = QtWidgets.QWidget()
self.overlay_info_page.setObjectName("overlay_info_page")
self.formLayout_3 = QtWidgets.QFormLayout(self.overlay_info_page)
self.formLayout_3.setLabelAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
self.formLayout_3.setFormAlignment(QtCore.Qt.AlignBottom|QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft)
self.formLayout_3.setObjectName("formLayout_3")
self.installed_version_info_lbl = QtWidgets.QLabel(self.overlay_info_page)
self.installed_version_info_lbl.setObjectName("installed_version_info_lbl")
self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.installed_version_info_lbl)
self.installed_version_lbl = QtWidgets.QLabel(self.overlay_info_page)
self.installed_version_lbl.setText("error")
self.installed_version_lbl.setObjectName("installed_version_lbl")
self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.installed_version_lbl)
self.installed_path_info_lbl = QtWidgets.QLabel(self.overlay_info_page)
self.installed_path_info_lbl.setObjectName("installed_path_info_lbl")
self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.installed_path_info_lbl)
self.installed_path_lbl = QtWidgets.QLabel(self.overlay_info_page)
self.installed_path_lbl.setText("error")
self.installed_path_lbl.setObjectName("installed_path_lbl")
self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.installed_path_lbl)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem)
self.uninstall_button = QtWidgets.QPushButton(self.overlay_info_page)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.uninstall_button.sizePolicy().hasHeightForWidth())
self.uninstall_button.setSizePolicy(sizePolicy)
self.uninstall_button.setMaximumSize(QtCore.QSize(150, 16777215))
self.uninstall_button.setObjectName("uninstall_button")
self.horizontalLayout.addWidget(self.uninstall_button)
self.update_check_button = QtWidgets.QPushButton(self.overlay_info_page)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.update_check_button.sizePolicy().hasHeightForWidth())
self.update_check_button.setSizePolicy(sizePolicy)
self.update_check_button.setMaximumSize(QtCore.QSize(150, 16777215))
self.update_check_button.setObjectName("update_check_button")
self.horizontalLayout.addWidget(self.update_check_button)
self.update_button = QtWidgets.QPushButton(self.overlay_info_page)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.update_button.sizePolicy().hasHeightForWidth())
self.update_button.setSizePolicy(sizePolicy)
self.update_button.setMaximumSize(QtCore.QSize(150, 16777215))
self.update_button.setObjectName("update_button")
self.horizontalLayout.addWidget(self.update_button)
self.formLayout_3.setLayout(3, QtWidgets.QFormLayout.SpanningRole, self.horizontalLayout)
spacerItem1 = QtWidgets.QSpacerItem(6, 6, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.formLayout_3.setItem(2, QtWidgets.QFormLayout.SpanningRole, spacerItem1)
self.overlay_stack.addWidget(self.overlay_info_page)
self.overlay_install_page = QtWidgets.QWidget()
self.overlay_install_page.setObjectName("overlay_install_page")
self.formLayout = QtWidgets.QFormLayout(self.overlay_install_page)
self.formLayout.setLabelAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
self.formLayout.setFormAlignment(QtCore.Qt.AlignBottom|QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft)
self.formLayout.setObjectName("formLayout")
self.label = QtWidgets.QLabel(self.overlay_install_page)
self.label.setObjectName("label")
self.formLayout.setWidget(0, QtWidgets.QFormLayout.SpanningRole, self.label)
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout_3.addItem(spacerItem2)
self.install_button = QtWidgets.QPushButton(self.overlay_install_page)
self.install_button.setObjectName("install_button")
self.horizontalLayout_3.addWidget(self.install_button)
self.formLayout.setLayout(2, QtWidgets.QFormLayout.SpanningRole, self.horizontalLayout_3)
spacerItem3 = QtWidgets.QSpacerItem(6, 6, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.formLayout.setItem(1, QtWidgets.QFormLayout.SpanningRole, spacerItem3)
self.overlay_stack.addWidget(self.overlay_install_page)
self.eos_layout.addWidget(self.overlay_stack)
self.enable_frame = QtWidgets.QFrame(EosWidget)
self.enable_frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.enable_frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.enable_frame.setObjectName("enable_frame")
self.verticalLayout = QtWidgets.QVBoxLayout(self.enable_frame)
self.verticalLayout.setObjectName("verticalLayout")
self.select_pfx_combo = QtWidgets.QComboBox(self.enable_frame)
self.select_pfx_combo.setObjectName("select_pfx_combo")
self.verticalLayout.addWidget(self.select_pfx_combo)
self.enabled_cb = QtWidgets.QCheckBox(self.enable_frame)
self.enabled_cb.setObjectName("enabled_cb")
self.verticalLayout.addWidget(self.enabled_cb)
self.enabled_info_label = QtWidgets.QLabel(self.enable_frame)
font = QtGui.QFont()
font.setItalic(True)
self.enabled_info_label.setFont(font)
self.enabled_info_label.setText("")
self.enabled_info_label.setObjectName("enabled_info_label")
self.verticalLayout.addWidget(self.enabled_info_label)
self.eos_layout.addWidget(self.enable_frame)
self.retranslateUi(EosWidget)
self.overlay_stack.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(EosWidget)
def retranslateUi(self, EosWidget):
_translate = QtCore.QCoreApplication.translate
EosWidget.setTitle(_translate("EosWidget", "Epic Overlay"))
self.installed_version_info_lbl.setText(_translate("EosWidget", "Version"))
self.installed_path_info_lbl.setText(_translate("EosWidget", "Location"))
self.uninstall_button.setText(_translate("EosWidget", "Uninstall"))
self.update_check_button.setText(_translate("EosWidget", "Check for update"))
self.update_button.setText(_translate("EosWidget", "Update"))
self.label.setText(_translate("EosWidget", "Epic Overlay Services is not installed"))
self.install_button.setText(_translate("EosWidget", "Install"))
self.enabled_cb.setText(_translate("EosWidget", "Activated"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
EosWidget = QtWidgets.QGroupBox()
ui = Ui_EosWidget()
ui.setupUi(EosWidget)
EosWidget.show()
sys.exit(app.exec_())

View File

@ -0,0 +1,259 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>EosWidget</class>
<widget class="QGroupBox" name="EosWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>586</width>
<height>146</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string notr="true">GroupBox</string>
</property>
<property name="title">
<string>Epic Overlay</string>
</property>
<layout class="QHBoxLayout" name="eos_layout" stretch="0,0">
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
</property>
<item>
<widget class="QStackedWidget" name="overlay_stack">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="overlay_info_page">
<layout class="QFormLayout" name="formLayout_3">
<property name="labelAlignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="formAlignment">
<set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
</property>
<item row="0" column="0">
<widget class="QLabel" name="installed_version_info_lbl">
<property name="text">
<string>Version</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="installed_version_lbl">
<property name="text">
<string notr="true">error</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="installed_path_info_lbl">
<property name="text">
<string>Location</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="installed_path_lbl">
<property name="text">
<string notr="true">error</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="uninstall_button">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>150</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>Uninstall</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="update_check_button">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>150</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>Check for update</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="update_button">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>150</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>Update</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0" colspan="2">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>6</width>
<height>6</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="overlay_install_page">
<layout class="QFormLayout" name="formLayout">
<property name="labelAlignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="formAlignment">
<set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
</property>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label">
<property name="text">
<string>Epic Overlay Services is not installed</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="install_button">
<property name="text">
<string>Install</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0" colspan="2">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>6</width>
<height>6</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<widget class="QFrame" name="enable_frame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QComboBox" name="select_pfx_combo"/>
</item>
<item>
<widget class="QCheckBox" name="enabled_cb">
<property name="text">
<string>Activated</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="enabled_info_label">
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -2,7 +2,7 @@
# Form implementation generated from reading ui file 'rare/ui/components/tabs/settings/legendary.ui'
#
# Created by: PyQt5 UI code generator 5.15.6
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
@ -98,12 +98,6 @@ class Ui_LegendarySettings(object):
self.disable_https_check.setObjectName("disable_https_check")
self.download_layout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.disable_https_check)
self.left_layout.addWidget(self.download_group, 0, QtCore.Qt.AlignTop)
self.ubisoft_gb = QtWidgets.QGroupBox(LegendarySettings)
self.ubisoft_gb.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
self.ubisoft_gb.setObjectName("ubisoft_gb")
self.verticalLayout = QtWidgets.QVBoxLayout(self.ubisoft_gb)
self.verticalLayout.setObjectName("verticalLayout")
self.left_layout.addWidget(self.ubisoft_gb, 0, QtCore.Qt.AlignTop)
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.left_layout.addItem(spacerItem)
self.legendary_layout.addLayout(self.left_layout)
@ -165,7 +159,6 @@ class Ui_LegendarySettings(object):
self.preferred_cdn_label.setText(_translate("LegendarySettings", "Preferred CDN"))
self.preferred_cdn_line.setPlaceholderText(_translate("LegendarySettings", "Default"))
self.disable_https_label.setText(_translate("LegendarySettings", "Disable HTTPS"))
self.ubisoft_gb.setTitle(_translate("LegendarySettings", "Link Ubisoft Games"))
self.locale_group.setTitle(_translate("LegendarySettings", "Locale"))
self.cleanup_group.setTitle(_translate("LegendarySettings", "Cleanup"))
self.clean_keep_manifests_button.setText(_translate("LegendarySettings", "Clean, but keep manifests"))

View File

@ -166,17 +166,6 @@
</layout>
</widget>
</item>
<item alignment="Qt::AlignTop">
<widget class="QGroupBox" name="ubisoft_gb">
<property name="title">
<string>Link Ubisoft Games</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
<layout class="QVBoxLayout" name="verticalLayout"/>
</widget>
</item>
<item>
<spacer name="left_vspacer">
<property name="orientation">

View File

@ -1,170 +0,0 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'rare/ui/components/tabs/settings/widgets/eos_widget.ui'
#
# Created by: PyQt5 UI code generator 5.15.6
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_EosWidget(object):
def setupUi(self, EosWidget):
EosWidget.setObjectName("EosWidget")
EosWidget.resize(364, 218)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Maximum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(EosWidget.sizePolicy().hasHeightForWidth())
EosWidget.setSizePolicy(sizePolicy)
EosWidget.setWindowTitle("GroupBox")
self.eos_layout = QtWidgets.QHBoxLayout(EosWidget)
self.eos_layout.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint)
self.eos_layout.setObjectName("eos_layout")
self.info_stack = QtWidgets.QStackedWidget(EosWidget)
self.info_stack.setObjectName("info_stack")
self.installed_info_page = QtWidgets.QWidget()
self.installed_info_page.setObjectName("installed_info_page")
self.installed_info_page_layout = QtWidgets.QVBoxLayout(self.installed_info_page)
self.installed_info_page_layout.setContentsMargins(0, 0, 0, 0)
self.installed_info_page_layout.setObjectName("installed_info_page_layout")
self.installed_info_gb = QtWidgets.QGroupBox(self.installed_info_page)
self.installed_info_gb.setObjectName("installed_info_gb")
self.installed_info_layout = QtWidgets.QFormLayout(self.installed_info_gb)
self.installed_info_layout.setLabelAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
self.installed_info_layout.setObjectName("installed_info_layout")
self.installed_version_info_lbl = QtWidgets.QLabel(self.installed_info_gb)
self.installed_version_info_lbl.setObjectName("installed_version_info_lbl")
self.installed_info_layout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.installed_version_info_lbl)
self.installed_version_lbl = QtWidgets.QLabel(self.installed_info_gb)
self.installed_version_lbl.setText("TextLabel")
self.installed_version_lbl.setObjectName("installed_version_lbl")
self.installed_info_layout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.installed_version_lbl)
self.installed_path_info_lbl = QtWidgets.QLabel(self.installed_info_gb)
self.installed_path_info_lbl.setObjectName("installed_path_info_lbl")
self.installed_info_layout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.installed_path_info_lbl)
self.installed_path_lbl = QtWidgets.QLabel(self.installed_info_gb)
self.installed_path_lbl.setText("TextLabel")
self.installed_path_lbl.setObjectName("installed_path_lbl")
self.installed_info_layout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.installed_path_lbl)
self.update_available_info_label = QtWidgets.QLabel(self.installed_info_gb)
self.update_available_info_label.setObjectName("update_available_info_label")
self.installed_info_layout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.update_available_info_label)
self.update_check_button = QtWidgets.QPushButton(self.installed_info_gb)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.update_check_button.sizePolicy().hasHeightForWidth())
self.update_check_button.setSizePolicy(sizePolicy)
self.update_check_button.setMaximumSize(QtCore.QSize(150, 16777215))
self.update_check_button.setObjectName("update_check_button")
self.installed_info_layout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.update_check_button)
self.uninstall_info_label = QtWidgets.QLabel(self.installed_info_gb)
self.uninstall_info_label.setObjectName("uninstall_info_label")
self.installed_info_layout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.uninstall_info_label)
self.uninstall_button = QtWidgets.QPushButton(self.installed_info_gb)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.uninstall_button.sizePolicy().hasHeightForWidth())
self.uninstall_button.setSizePolicy(sizePolicy)
self.uninstall_button.setMaximumSize(QtCore.QSize(150, 16777215))
self.uninstall_button.setObjectName("uninstall_button")
self.installed_info_layout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.uninstall_button)
self.update_button = QtWidgets.QPushButton(self.installed_info_gb)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.update_button.sizePolicy().hasHeightForWidth())
self.update_button.setSizePolicy(sizePolicy)
self.update_button.setMaximumSize(QtCore.QSize(150, 16777215))
self.update_button.setObjectName("update_button")
self.installed_info_layout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.update_button)
self.update_info_lbl = QtWidgets.QLabel(self.installed_info_gb)
self.update_info_lbl.setObjectName("update_info_lbl")
self.installed_info_layout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.update_info_lbl)
self.installed_info_page_layout.addWidget(self.installed_info_gb, 0, QtCore.Qt.AlignTop)
self.info_stack.addWidget(self.installed_info_page)
self.install_overlay_page = QtWidgets.QWidget()
self.install_overlay_page.setObjectName("install_overlay_page")
self.install_overlay_page_layout = QtWidgets.QVBoxLayout(self.install_overlay_page)
self.install_overlay_page_layout.setContentsMargins(0, 0, 0, 0)
self.install_overlay_page_layout.setObjectName("install_overlay_page_layout")
self.install_overlay_gb = QtWidgets.QGroupBox(self.install_overlay_page)
self.install_overlay_gb.setObjectName("install_overlay_gb")
self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.install_overlay_gb)
self.verticalLayout_4.setObjectName("verticalLayout_4")
self.label = QtWidgets.QLabel(self.install_overlay_gb)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Maximum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
self.label.setSizePolicy(sizePolicy)
self.label.setObjectName("label")
self.verticalLayout_4.addWidget(self.label)
self.install_button = QtWidgets.QPushButton(self.install_overlay_gb)
self.install_button.setMinimumSize(QtCore.QSize(120, 0))
self.install_button.setObjectName("install_button")
self.verticalLayout_4.addWidget(self.install_button, 0, QtCore.Qt.AlignRight)
self.install_overlay_page_layout.addWidget(self.install_overlay_gb, 0, QtCore.Qt.AlignTop)
self.info_stack.addWidget(self.install_overlay_page)
self.eos_layout.addWidget(self.info_stack)
self.enable_gb = QtWidgets.QGroupBox(EosWidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.enable_gb.sizePolicy().hasHeightForWidth())
self.enable_gb.setSizePolicy(sizePolicy)
self.enable_gb.setObjectName("enable_gb")
self.enable_layout = QtWidgets.QVBoxLayout(self.enable_gb)
self.enable_layout.setObjectName("enable_layout")
self.select_pfx_combo = QtWidgets.QComboBox(self.enable_gb)
self.select_pfx_combo.setObjectName("select_pfx_combo")
self.enable_layout.addWidget(self.select_pfx_combo)
self.enabled_cb = QtWidgets.QCheckBox(self.enable_gb)
self.enabled_cb.setObjectName("enabled_cb")
self.enable_layout.addWidget(self.enabled_cb)
self.enabled_info_label = QtWidgets.QLabel(self.enable_gb)
font = QtGui.QFont()
font.setItalic(True)
self.enabled_info_label.setFont(font)
self.enabled_info_label.setText("")
self.enabled_info_label.setObjectName("enabled_info_label")
self.enable_layout.addWidget(self.enabled_info_label, 0, QtCore.Qt.AlignTop)
self.enable_layout.setStretch(2, 1)
self.eos_layout.addWidget(self.enable_gb)
self.retranslateUi(EosWidget)
self.info_stack.setCurrentIndex(1)
QtCore.QMetaObject.connectSlotsByName(EosWidget)
def retranslateUi(self, EosWidget):
_translate = QtCore.QCoreApplication.translate
EosWidget.setTitle(_translate("EosWidget", "Epic Overlay settings"))
self.installed_info_gb.setTitle(_translate("EosWidget", "Installed Info"))
self.installed_version_info_lbl.setText(_translate("EosWidget", "Installed version"))
self.installed_path_info_lbl.setText(_translate("EosWidget", "Installed path"))
self.update_available_info_label.setText(_translate("EosWidget", "Updates"))
self.update_check_button.setText(_translate("EosWidget", "Check for Update"))
self.uninstall_info_label.setText(_translate("EosWidget", "Uninstall"))
self.uninstall_button.setText(_translate("EosWidget", "Uninstall"))
self.update_button.setText(_translate("EosWidget", "Update"))
self.update_info_lbl.setText(_translate("EosWidget", "Install Update"))
self.install_overlay_gb.setTitle(_translate("EosWidget", "Install Overlay"))
self.label.setText(_translate("EosWidget", "No overlays are installed"))
self.install_button.setText(_translate("EosWidget", "Install"))
self.enable_gb.setTitle(_translate("EosWidget", "Enable / Disable"))
self.enabled_cb.setText(_translate("EosWidget", "Activated"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
EosWidget = QtWidgets.QGroupBox()
ui = Ui_EosWidget()
ui.setupUi(EosWidget)
EosWidget.show()
sys.exit(app.exec_())

View File

@ -1,262 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>EosWidget</class>
<widget class="QGroupBox" name="EosWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>364</width>
<height>218</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string notr="true">GroupBox</string>
</property>
<property name="title">
<string>Epic Overlay settings</string>
</property>
<layout class="QHBoxLayout" name="eos_layout">
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
</property>
<item>
<widget class="QStackedWidget" name="info_stack">
<property name="currentIndex">
<number>1</number>
</property>
<widget class="QWidget" name="installed_info_page">
<layout class="QVBoxLayout" name="installed_info_page_layout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item alignment="Qt::AlignTop">
<widget class="QGroupBox" name="installed_info_gb">
<property name="title">
<string>Installed Info</string>
</property>
<layout class="QFormLayout" name="installed_info_layout">
<property name="labelAlignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<item row="0" column="0">
<widget class="QLabel" name="installed_version_info_lbl">
<property name="text">
<string>Installed version</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="installed_version_lbl">
<property name="text">
<string notr="true">TextLabel</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="installed_path_info_lbl">
<property name="text">
<string>Installed path</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="installed_path_lbl">
<property name="text">
<string notr="true">TextLabel</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="update_available_info_label">
<property name="text">
<string>Updates</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="update_check_button">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>150</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>Check for Update</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="uninstall_info_label">
<property name="text">
<string>Uninstall</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QPushButton" name="uninstall_button">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>150</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>Uninstall</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QPushButton" name="update_button">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>150</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>Update</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="update_info_lbl">
<property name="text">
<string>Install Update</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="install_overlay_page">
<layout class="QVBoxLayout" name="install_overlay_page_layout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item alignment="Qt::AlignTop">
<widget class="QGroupBox" name="install_overlay_gb">
<property name="title">
<string>Install Overlay</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>No overlays are installed</string>
</property>
</widget>
</item>
<item alignment="Qt::AlignRight">
<widget class="QPushButton" name="install_button">
<property name="minimumSize">
<size>
<width>120</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Install</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<widget class="QGroupBox" name="enable_gb">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Enable / Disable</string>
</property>
<layout class="QVBoxLayout" name="enable_layout" stretch="0,0,1">
<item>
<widget class="QComboBox" name="select_pfx_combo"/>
</item>
<item>
<widget class="QCheckBox" name="enabled_cb">
<property name="text">
<string>Activated</string>
</property>
</widget>
</item>
<item alignment="Qt::AlignTop">
<widget class="QLabel" name="enabled_info_label">
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -5,9 +5,9 @@ from logging import getLogger
from PyQt5.QtCore import pyqtSignal, QObject, QRunnable, QStandardPaths
from legendary.core import LegendaryCore
from rare.lgndr.api_arguments import LgndrVerifyGameArgs, LgndrUninstallGameArgs
from rare.lgndr.api_monkeys import LgndrIndirectStatus
from rare.lgndr.cli import LegendaryCLI
from rare.lgndr.glue.arguments import LgndrVerifyGameArgs, LgndrUninstallGameArgs
from rare.lgndr.glue.monkeys import LgndrIndirectStatus
from rare.shared import LegendaryCoreSingleton, ArgumentsSingleton
from rare.utils import config_helper

View File

@ -1,85 +0,0 @@
from PyQt5.QtCore import QParallelAnimationGroup, Qt, QPropertyAnimation, QAbstractAnimation
from PyQt5.QtWidgets import QWidget, QFrame, QToolButton, QGridLayout, QSizePolicy, QLayout
from rare.utils.misc import icon
# https://newbedev.com/how-to-make-an-expandable-collapsable-section-widget-in-qt
class CollabsibleWidget(QWidget):
def __init__(
self, child_layout: QLayout = None, title: str = "", animation_duration: int = 200, parent=None
):
"""
References:
# Adapted from c++ version
https://stackoverflow.com/questions/32476006/how-to-make-an-expandable-collapsable-section-widget-in-qt
"""
super(CollabsibleWidget, self).__init__(parent=parent)
self.animationDuration = animation_duration
self.toggleAnimation = QParallelAnimationGroup()
self.contentArea = QWidget()
self.headerLine = QFrame()
self.toggleButton = QToolButton()
self.mainLayout = QGridLayout()
toggleButton = self.toggleButton
toggleButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
toggleButton.setIcon(icon("fa.arrow-right"))
toggleButton.setText(str(title))
toggleButton.setCheckable(True)
toggleButton.setChecked(False)
headerLine = self.headerLine
headerLine.setFrameShape(QFrame.StyledPanel)
headerLine.setFrameShadow(QFrame.Plain)
headerLine.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Maximum)
self.contentArea.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
# start out collapsed
self.contentArea.setMaximumHeight(0)
self.contentArea.setMinimumHeight(0)
# let the entire widget grow and shrink with its content
toggleAnimation = self.toggleAnimation
toggleAnimation.addAnimation(QPropertyAnimation(self, b"minimumHeight"))
toggleAnimation.addAnimation(QPropertyAnimation(self, b"maximumHeight"))
toggleAnimation.addAnimation(QPropertyAnimation(self.contentArea, b"maximumHeight"))
# don't waste space
mainLayout = self.mainLayout
mainLayout.setVerticalSpacing(0)
mainLayout.setContentsMargins(0, 0, 0, 0)
row = 0
mainLayout.addWidget(self.toggleButton, row, 0, 1, 1, Qt.AlignLeft)
mainLayout.addWidget(self.headerLine, row, 2, 1, 1)
row += 1
mainLayout.addWidget(self.contentArea, row, 0, 1, 3)
self.setLayout(self.mainLayout)
def start_animation(checked):
arrow_type = icon("fa.arrow-down") if checked else icon("fa.arrow-right")
direction = QAbstractAnimation.Forward if checked else QAbstractAnimation.Backward
toggleButton.setIcon(arrow_type)
self.toggleAnimation.setDirection(direction)
self.toggleAnimation.start()
self.toggleButton.clicked.connect(start_animation)
if child_layout:
self.setContentLayout(child_layout)
def setContentLayout(self, content_layout: QLayout):
# Not sure if this is equivalent to self.contentArea.destroy()
self.contentArea.destroy()
self.contentArea.setLayout(content_layout)
collapsedHeight = self.sizeHint().height() - self.contentArea.maximumHeight()
contentHeight = content_layout.sizeHint().height()
for i in range(self.toggleAnimation.animationCount() - 1):
spoilerAnimation = self.toggleAnimation.animationAt(i)
spoilerAnimation.setDuration(self.animationDuration)
spoilerAnimation.setStartValue(collapsedHeight)
spoilerAnimation.setEndValue(collapsedHeight + contentHeight)
contentAnimation = self.toggleAnimation.animationAt(self.toggleAnimation.animationCount() - 1)
contentAnimation.setDuration(self.animationDuration)
contentAnimation.setStartValue(0)
contentAnimation.setEndValue(contentHeight)

View File

@ -0,0 +1,238 @@
from abc import abstractmethod
from typing import Optional
from PyQt5.QtCore import QParallelAnimationGroup, Qt, QPropertyAnimation, QAbstractAnimation, QSize
from PyQt5.QtWidgets import QWidget, QFrame, QToolButton, QGridLayout, QSizePolicy, QGroupBox, QLabel
from rare.utils.misc import icon
class CollapsibleBase(object):
"""
References:
# Adapted from c++ version
https://stackoverflow.com/questions/32476006/how-to-make-an-expandable-collapsable-section-widget-in-qt
# Adapted from python version
https://newbedev.com/how-to-make-an-expandable-collapsable-section-widget-in-qt
"""
def __init__(self):
self.animation_duration = None
self.toggle_animation = None
self.content_area = None
self.content_toggle_animation = None
def setup(self, animation_duration: int = 200):
self.animation_duration = animation_duration
self.content_area: Optional[QWidget] = None
self.content_toggle_animation: Optional[QPropertyAnimation] = None
# let the entire widget grow and shrink with its content
self.toggle_animation = QParallelAnimationGroup(self)
self.toggle_animation.addAnimation(QPropertyAnimation(self, b"minimumHeight"))
self.toggle_animation.addAnimation(QPropertyAnimation(self, b"maximumHeight"))
@abstractmethod
def isChecked(self) -> bool:
...
@abstractmethod
def click(self) -> None:
...
@abstractmethod
def addToLayout(self, widget: QWidget) -> None:
...
@abstractmethod
def sizeHint(self) -> QSize:
...
def animationStart(self, checked):
direction = QAbstractAnimation.Forward if checked else QAbstractAnimation.Backward
self.toggle_animation.setDirection(direction)
self.toggle_animation.start()
def setWidget(self, widget: QWidget):
if widget is None or widget is self.content_area:
return
is_checked = self.isChecked()
if self.content_area is not None:
# Collapse the parent before replacing the child
if is_checked:
self.click()
self.toggle_animation.removeAnimation(self.content_toggle_animation)
self.content_area.setParent(None)
self.content_area.deleteLater()
self.content_area = widget
self.content_area.setParent(self)
self.content_area.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
# start out collapsed
if not is_checked:
self.content_area.setMaximumHeight(0)
self.content_area.setMinimumHeight(0)
self.content_toggle_animation = QPropertyAnimation(self.content_area, b"maximumHeight")
self.toggle_animation.addAnimation(self.content_toggle_animation)
self.addToLayout(self.content_area)
collapsed_height = self.sizeHint().height()
content_height = self.content_area.sizeHint().height()
for i in range(self.toggle_animation.animationCount() - 1):
spoiler_animation = self.toggle_animation.animationAt(i)
spoiler_animation.setDuration(self.animation_duration)
spoiler_animation.setStartValue(collapsed_height)
spoiler_animation.setEndValue(collapsed_height + content_height)
content_animation = self.toggle_animation.animationAt(self.toggle_animation.animationCount() - 1)
content_animation.setDuration(self.animation_duration)
content_animation.setStartValue(0)
content_animation.setEndValue(content_height)
if is_checked:
self.click()
class CollapsibleFrame(QFrame, CollapsibleBase):
def __init__(
self, widget: QWidget = None, title: str = "", button_text: str = "", animation_duration: int = 200, parent=None
):
super(CollapsibleFrame, self).__init__(parent=parent)
self.setup(animation_duration)
self.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken)
self.toggle_button = QToolButton(self)
self.toggle_button.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
self.toggle_button.setIcon(icon("fa.arrow-right"))
self.toggle_button.setText(button_text)
self.toggle_button.setCheckable(True)
self.toggle_button.setChecked(False)
self.title_label = QLabel(title)
font = self.title_label.font()
font.setBold(True)
self.title_label.setFont(font)
self.title_label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
# don't waste space
self.main_layout = QGridLayout(self)
self.main_layout.setVerticalSpacing(0)
self.main_layout.setContentsMargins(0, 0, 0, 0)
self.main_layout.addWidget(self.toggle_button, 0, 0, 1, 1, Qt.AlignLeft)
self.main_layout.addWidget(self.title_label, 0, 1, 1, 1)
self.main_layout.setColumnStretch(1, 1)
self.main_layout.setRowStretch(0, 0)
self.main_layout.setRowStretch(1, 1)
self.setLayout(self.main_layout)
self.toggle_button.clicked.connect(self.animationStart)
if widget is not None:
self.setWidget(widget)
def isChecked(self) -> bool:
return self.toggle_button.isChecked()
def click(self) -> None:
self.toggle_button.click()
def addToLayout(self, widget: QWidget) -> None:
self.main_layout.addWidget(widget, 1, 0, 1, 2)
def sizeHint(self) -> QSize:
return super(CollapsibleFrame, self).sizeHint()
def animationStart(self, checked):
arrow_type = icon("fa.arrow-down") if checked else icon("fa.arrow-right")
self.toggle_button.setIcon(arrow_type)
super(CollapsibleFrame, self).animationStart(checked)
class CollapsibleGroupBox(QGroupBox, CollapsibleBase):
def __init__(
self, widget: QWidget = None, title: str = "", animation_duration: int = 200, parent=None
):
super(CollapsibleGroupBox, self).__init__(parent=parent)
self.setup(animation_duration)
self.setTitle(title)
self.setCheckable(True)
self.setChecked(False)
# don't waste space
self.main_layout = QVBoxLayout(self)
self.main_layout.setSpacing(0)
self.main_layout.setContentsMargins(0, 0, 0, -1)
self.setLayout(self.main_layout)
self.toggled.connect(self.animationStart)
if widget is not None:
self.setWidget(widget)
def isChecked(self) -> bool:
return super(CollapsibleGroupBox, self).isChecked()
def click(self) -> None:
self.setChecked(not self.isChecked())
def addToLayout(self, widget: QWidget) -> None:
self.main_layout.addWidget(widget)
def sizeHint(self) -> QSize:
return super(CollapsibleGroupBox, self).sizeHint()
if __name__ == "__main__":
import sys
from PyQt5.QtWidgets import QApplication, QDialog, QVBoxLayout
from rare.ui.components.dialogs.install_dialog_advanced import Ui_InstallDialogAdvanced
from rare.utils.misc import set_style_sheet
from rare.resources.stylesheets import RareStyle
app = QApplication(sys.argv)
set_style_sheet("RareStyle")
ui_frame = Ui_InstallDialogAdvanced()
widget_frame = QWidget()
ui_frame.setupUi(widget_frame)
collapsible_frame = CollapsibleFrame(widget_frame, title="Frame me!")
collapsible_frame.setDisabled(False)
def replace_func_frame(state):
widget2_frame = QWidget()
ui2_frame = Ui_InstallDialogAdvanced()
ui2_frame.setupUi(widget2_frame)
if state:
ui2_frame.install_dialog_advanced_layout.removeRow(3)
ui2_frame.install_dialog_advanced_layout.removeRow(4)
collapsible_frame.setWidget(widget2_frame)
ui_group = Ui_InstallDialogAdvanced()
widget_group = QWidget()
ui_group.setupUi(widget_group)
collapsible_group = CollapsibleGroupBox(widget_group, title="Group me!")
collapsible_group.setDisabled(False)
def replace_func_group(state):
widget2_group = QWidget()
ui2_group = Ui_InstallDialogAdvanced()
ui2_group.setupUi(widget2_group)
if state:
ui2_group.install_dialog_advanced_layout.removeRow(3)
ui2_group.install_dialog_advanced_layout.removeRow(4)
collapsible_group.setWidget(widget2_group)
replace_button = QToolButton()
replace_button.setText("Replace me!")
replace_button.setCheckable(True)
replace_button.setChecked(False)
replace_button.clicked.connect(replace_func_frame)
replace_button.clicked.connect(replace_func_group)
dialog = QDialog()
dialog.setLayout(QVBoxLayout())
dialog.layout().addWidget(replace_button)
dialog.layout().addWidget(collapsible_frame)
dialog.layout().addWidget(collapsible_group)
dialog.layout().setSizeConstraint(QVBoxLayout.SetFixedSize)
dialog.show()
sys.exit(app.exec_())

View File

@ -6,7 +6,7 @@ import time
from argparse import Namespace
import legendary
from PyQt5.QtCore import Qt, QSettings, QTranslator, QT_VERSION_STR, PYQT_VERSION_STR
from PyQt5.QtCore import QSettings, QTranslator, QT_VERSION_STR, PYQT_VERSION_STR
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication
@ -21,8 +21,6 @@ class RareApp(QApplication):
def __init__(self, args: Namespace, log_file: str):
super(RareApp, self).__init__(sys.argv)
self.setQuitOnLastWindowClosed(False)
if hasattr(Qt, "AA_UseHighDpiPixmaps"):
self.setAttribute(Qt.AA_UseHighDpiPixmaps)
self.setApplicationName("Rare")
self.setOrganizationName("Rare")