From 8c02532e28491d06e6ff14664bd4c0c6f827e207 Mon Sep 17 00:00:00 2001 From: Julian Freeman Date: Thu, 27 Jun 2024 23:10:46 -0400 Subject: [PATCH] =?UTF-8?q?windows=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- gbx_extension.py | 58 +++ gbx_search_engine.py | 34 ++ gbx_setting.py | 33 ++ images/browsers/brave_32.png | Bin 0 -> 1406 bytes images/browsers/chrome_32.png | Bin 0 -> 1405 bytes images/browsers/edge_32.png | Bin 0 -> 1654 bytes images/policies_gen_128.png | Bin 0 -> 9350 bytes main.py | 19 + mw_policies_gen.py | 166 ++++++ policies_gen.qrc | 8 + policies_gen_128.ico | Bin 0 -> 67758 bytes rc_policies_gen.py | 935 ++++++++++++++++++++++++++++++++++ templates/brave.json | 225 ++++++++ templates/chrome.json | 181 +++++++ templates/edge.json | 271 ++++++++++ utils.py | 10 + wg_browser_page.py | 98 ++++ 18 files changed, 2039 insertions(+), 1 deletion(-) create mode 100644 gbx_extension.py create mode 100644 gbx_search_engine.py create mode 100644 gbx_setting.py create mode 100644 images/browsers/brave_32.png create mode 100644 images/browsers/chrome_32.png create mode 100644 images/browsers/edge_32.png create mode 100644 images/policies_gen_128.png create mode 100644 main.py create mode 100644 mw_policies_gen.py create mode 100644 policies_gen.qrc create mode 100644 policies_gen_128.ico create mode 100644 rc_policies_gen.py create mode 100644 templates/brave.json create mode 100644 templates/chrome.json create mode 100644 templates/edge.json create mode 100644 utils.py create mode 100644 wg_browser_page.py diff --git a/.gitignore b/.gitignore index 82f9275..7b6caf3 100644 --- a/.gitignore +++ b/.gitignore @@ -159,4 +159,4 @@ cython_debug/ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ +.idea/ diff --git a/gbx_extension.py b/gbx_extension.py new file mode 100644 index 0000000..51bbdc5 --- /dev/null +++ b/gbx_extension.py @@ -0,0 +1,58 @@ +# coding: utf8 +from PySide6 import QtCore, QtWidgets + + +class ExtensionModesListModel(QtCore.QAbstractListModel): + + def __init__(self, modes_info: dict, parent=None): + super().__init__(parent) + self.modes = [] + self.display_modes = [] + for k, v in modes_info.items(): + self.modes.append(k) + self.display_modes.append(v) + + def rowCount(self, parent: QtCore.QModelIndex = ...): + return len(self.modes) + + def data(self, index: QtCore.QModelIndex, role: int = ...): + row = index.row() + + if role == QtCore.Qt.ItemDataRole.DisplayRole: + return self.display_modes[row] + if role == QtCore.Qt.ItemDataRole.UserRole: + return self.modes[row] + + +class GbxExtension(QtWidgets.QGroupBox): + + def __init__(self, extension_info: dict, parent=None): + super().__init__(parent) + self.vly_m = QtWidgets.QVBoxLayout() + self.setLayout(self.vly_m) + self.setTitle(extension_info["name"]) + self.setCheckable(True) + self.setChecked(extension_info["enabled"]) + + self.lb_desc = QtWidgets.QLabel(extension_info["description"], self) + self.vly_m.addWidget(self.lb_desc) + + self.lb_modes = QtWidgets.QLabel("安装模式:", self) + self.cmbx_modes = QtWidgets.QComboBox(self) + modes_model = ExtensionModesListModel(extension_info["modes"], self) + self.cmbx_modes.setModel(modes_model) + self.cmbx_modes.setCurrentIndex(modes_model.modes.index(extension_info["default_mode"])) + self.lb_update_url = QtWidgets.QLabel("更新链接:", self) + self.lne_update_url = QtWidgets.QLineEdit(extension_info["update_url"], self) + + self.hly_modes = QtWidgets.QHBoxLayout() + self.vly_m.addLayout(self.hly_modes) + self.hly_modes.addWidget(self.lb_modes) + self.hly_modes.addWidget(self.cmbx_modes) + self.hly_modes.addStretch(1) + self.hly_update_url = QtWidgets.QHBoxLayout() + self.vly_m.addLayout(self.hly_update_url) + self.hly_update_url.addWidget(self.lb_update_url) + self.hly_update_url.addWidget(self.lne_update_url) + + self.id = extension_info["id"] diff --git a/gbx_search_engine.py b/gbx_search_engine.py new file mode 100644 index 0000000..b1a954f --- /dev/null +++ b/gbx_search_engine.py @@ -0,0 +1,34 @@ +# coding: utf8 +from PySide6 import QtWidgets + + +class GbxSearchEngine(QtWidgets.QGroupBox): + + def __init__(self, search_engines_info: dict, parent=None): + super().__init__(parent) + self.vly_m = QtWidgets.QVBoxLayout() + self.setLayout(self.vly_m) + self.setTitle(f'搜索引擎:{search_engines_info["number"]}') + self.setCheckable(True) + self.setChecked(search_engines_info["enabled"]) + + self.gly_info = QtWidgets.QGridLayout() + self.vly_m.addLayout(self.gly_info) + + self.lb_name = QtWidgets.QLabel("名称:", self) + self.lne_name = QtWidgets.QLineEdit(search_engines_info["name"], self) + self.lb_keyword = QtWidgets.QLabel("关键词:", self) + self.lne_keyword = QtWidgets.QLineEdit(search_engines_info["keyword"], self) + self.lb_search_url = QtWidgets.QLabel("搜索链接:", self) + self.lne_search_url = QtWidgets.QLineEdit(search_engines_info["search_url"], self) + self.lne_search_url.setCursorPosition(0) + self.gly_info.addWidget(self.lb_name, 0, 0) + self.gly_info.addWidget(self.lne_name, 0, 1) + self.gly_info.addWidget(self.lb_keyword, 1, 0) + self.gly_info.addWidget(self.lne_keyword, 1, 1) + self.gly_info.addWidget(self.lb_search_url, 2, 0) + self.gly_info.addWidget(self.lne_search_url, 2, 1) + + self.rbn_default = QtWidgets.QRadioButton("设为默认", self) + self.vly_m.addWidget(self.rbn_default) + self.rbn_default.setChecked(search_engines_info["is_default"]) diff --git a/gbx_setting.py b/gbx_setting.py new file mode 100644 index 0000000..dddf0a9 --- /dev/null +++ b/gbx_setting.py @@ -0,0 +1,33 @@ +# coding: utf8 +from PySide6 import QtWidgets, QtCore, QtGui + + +class GbxSetting(QtWidgets.QGroupBox): + + def __init__(self, setting_info: dict, parent=None): + super().__init__(parent) + self.vly_m = QtWidgets.QVBoxLayout() + self.setLayout(self.vly_m) + self.setTitle(setting_info["display_name"]) + self.setCheckable(True) + self.setChecked(setting_info["enabled"]) + + self.bgp_radios = QtWidgets.QButtonGroup(self) + self.bgp_radios.setExclusive(True) + + for i, name in setting_info["values"].items(): + value = int(i) + rbn_1 = QtWidgets.QRadioButton(name, self) + self.bgp_radios.addButton(rbn_1, id=value) + self.vly_m.addWidget(rbn_1) + if setting_info["default_value"] == value: + rbn_1.setChecked(True) + + self.allow_recommend = setting_info["allow_recommend"] + if self.allow_recommend: + self.cbx_recommend = QtWidgets.QCheckBox("设置为推荐", self) + self.vly_m.addWidget(self.cbx_recommend) + self.cbx_recommend.setChecked(True) + self.cbx_recommend.setLayoutDirection(QtCore.Qt.LayoutDirection.RightToLeft) + + self.name = setting_info["name"] diff --git a/images/browsers/brave_32.png b/images/browsers/brave_32.png new file mode 100644 index 0000000000000000000000000000000000000000..551243eb94e0e0135e966a42b82ea230f81bca11 GIT binary patch literal 1406 zcmV-^1%djBP)A5S9>1OWi|aWwXBFyCY>0000@A`cV^ z1Ofp7o<|?pVJh8YD=icVQ6vzxQ6nM`1_lBF7YYQSNFVooMcZO4_HHosZZJ+G53f!l z6$u1iDiQ(#0I5tNHN;MCgA{_kTywbV=lXPv~ea-FQj&bvoaBPU&eb_jy3~c|iAXG5`Pn_V^q4s}C{LZ=f>*fCZ z`}A!v=7Uz_fmGvxRr~ew`J8g%iD3Kn^ZUuN@u-IHZ87lF$Ncs2<#Im#`S|(p>*j)0 z<&bIo*vR&8G39bS_HHrp*2(#rZvFcB@uh;~k!tX3FXD+|@N6;r$FJ$Sr0{Gne zd`*o2wsN#K2_<>90ntAtjJotrC>A0fgXDj zTJ4u`@0fAoqlfs6Ti}Ue{ovB^fll(QjQN&n^uw+E&${oKasK)C;E7=w2jr#z003Wf zQchC<;UuwR2>kx(5@90;uj1kZWS{~CC9?kE{rzH;Bt!_4>qChK1?sQ@>H;{TLuEpT z1vdU!TZoAf0Ra@(*)2O0T+Dvs5YBwhD>4D(&tAp$%{jw2$~-RMG50Os=;!_j1>XPw z0sBcrK~y-)V_={nFcD9L0%KEb@*x57a1a%QF6$Z=9T$%TV#Dn%kmVf$mt@7GfUNl* z)<_CMV|I4oiM&0#cW#J}k3h&rvc<=5Nk9R+*2c4W!4(9@ z$8Q1(7N|{|wLeas)xd(P6EM5?w?gv%i5+6Su zr14OG!Q+I4O9lCRLAU>GbnG7JK7APQt6j}N}{=|i=*X5kOaC&pj zs#%lkfC9Qm3RE?L0#g<(Uk@^V#K(3++a*7cGIVx%1GH?)11$iM}2PMfVNrA+Y z=d4Ibm^m#O#FmspQJ`VK4mP8szN@hl#9~+0LQS=XEF9o;mX-#l)bvC!lD(`tJ1jM_ zi-}^(81m8(L*h9ES#jhoZeE}v?95EKa~}^EBOePZ-VDmgNotk`0R5Qec?Z5xC;$Ke M07*qoM6N<$g6w<6>i_@% literal 0 HcmV?d00001 diff --git a/images/browsers/chrome_32.png b/images/browsers/chrome_32.png new file mode 100644 index 0000000000000000000000000000000000000000..f00d8a82c15920dd772ef31d8b255dfcc622e024 GIT binary patch literal 1405 zcmX9+2~<-@6b*p@2}^>N(rRrv7F~H;xrh;K))zpg`CJ zqYzLwZD}g8h!!ItUuAd2%>#p|T3_w&sB#^m*Km-=Jj#(zlTo7n>k!fBWXkO04#rYHs zv@EIAz;dmPqo=b!6Nc8;6{H=din1K}iHs(?O9$CyTSf4E2ld%)Qe*Dk!6u(YDHVS$ z6hv8yJvP!+dd*`(;%k~jCFHQLHqaEm`GVd3a^8cQVAIt>X5UMA;jVa+$DC5aemRJF z84oWEW&FrdRroHIk=jGZ>Z=rR@s+77IvH(@>9aCb<)4pOR!0h>$da)quVX{Mt3W!R z!z*3;9}UCu30SMhSYFmF3cQsSMXN(x?W@%6Cyk%iL@5~F17omLA$OtJbH1hdRu4R1 z=z-k#m=`zluONeDx0yK@US3?4ADk6HbNQ~n^uk>)V9l~>c|@p|xXssJdi4e#nuJ-G zkyn1+<8NV2o6863{<#9Tpkky}3eV=bsD_7DrfZfZL~S4CqzFlFKs3`Gz3vV#>0SdQ z;#5OjL>Z#Uza$-o8M#Q@HDpe;D3Zb|wdU)(7+9@T9Og~lsOcSrWnNAKiT_vShrnNm zxR*aKgDeZUDcv>e9a0c5v!HAngfH~e4o|{n`2nwIVYZNsOq7I|BBv##r<(o2#}8~u zAMRpF`r-6uWb7?0xyLduYrqq7EBwCRY+Vzh~P>k)~SWX2-M@Zn>tc*B`+g6ZPu zcJ#>Ot>XBPvX4RW5i$#lPw~v-^v$2znep`F5u4Z6w4c_%W3&$8o>=#YcC8WCJ;5{b zM7ZDCZ|zYiJq1J~^E~@w`PLY1@_F%{^C=Hvu9QD(OL8*MH;S@wG(C2VsH50ecmA~F z*BzW(!xwG>@$wm^6p_`ktqJjH9h>tJNv= zpUZYjyV03xOZbGzh;UPMy0wn*x}>C}vO5RY?{snxI!h%?vZ5YH#&I%yIS*}!Gs8L; zM!tyu-*7X>Qg#5NXN|EvV^p*)M`jfi6p(Gl)VJg7+vn!_CT?jFHA&5GUHq~|WP@~> zXJ<}*Z-XHdFt*QbPa``k*jaW=w4HIbU9NG20ax?ygmY6SPlWdHY04W4QxSAK@!wFD zRWW3}XiU)F8}VIGvDN zM1I?;`!Bkn^sZ(SlxSFFNb9u9T}>gjR-Ze4-Vc(6aI{2kBvxJ>)}EsC e!YHb2l*y>IT6(WZTHP+tVJL_mKx?7!Gyexht*cZ3 literal 0 HcmV?d00001 diff --git a/images/browsers/edge_32.png b/images/browsers/edge_32.png new file mode 100644 index 0000000000000000000000000000000000000000..f8507c4fa24dae61a00bc231cdbab75073216ed1 GIT binary patch literal 1654 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 literal 0 HcmV?d00001 diff --git a/main.py b/main.py new file mode 100644 index 0000000..7a3e47d --- /dev/null +++ b/main.py @@ -0,0 +1,19 @@ +# coding: utf8 +import sys +from PySide6 import QtWidgets +from mw_policies_gen import MwPoliciesGen + +import rc_policies_gen + +version = (0, 1, 0, 20240627) + + +def main(): + app = QtWidgets.QApplication(sys.argv) + win = MwPoliciesGen(version) + win.show() + return app.exec() + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/mw_policies_gen.py b/mw_policies_gen.py new file mode 100644 index 0000000..96840e3 --- /dev/null +++ b/mw_policies_gen.py @@ -0,0 +1,166 @@ +# coding: utf8 +import sys +from PySide6 import QtWidgets, QtCore, QtGui + +from wg_browser_page import WgBrowserPage + + +class BrowsersListModel(QtCore.QAbstractListModel): + + def __init__(self, parent=None): + super().__init__(parent) + self.browsers = ["Chrome", "Edge", "Brave"] + self.browser_vars = ["chrome", "edge", "brave"] + self.icons = [ + QtGui.QIcon(":/images/browsers/chrome_32.png"), + QtGui.QIcon(":/images/browsers/edge_32.png"), + QtGui.QIcon(":/images/browsers/brave_32.png"), + ] + + def rowCount(self, parent: QtCore.QModelIndex = ...): + return len(self.browsers) + + def data(self, index: QtCore.QModelIndex, role: int = ...): + row = index.row() + + if role == QtCore.Qt.ItemDataRole.DisplayRole: + return self.browsers[row] + if role == QtCore.Qt.ItemDataRole.DecorationRole: + return self.icons[row] + if role == QtCore.Qt.ItemDataRole.UserRole: + return self.browser_vars[row] + + +class AppStyleListModel(QtCore.QAbstractListModel): + + def __init__(self, parent=None): + super().__init__(parent) + if sys.platform == "win32": + self.styles = ["fusion", "windowsvista", "windows11", "windows"] + elif sys.platform == "darwin": + self.styles = ["fusion", "macos", "windows"] + else: + self.styles = [] + + def rowCount(self, parent: QtCore.QModelIndex = ...): + return len(self.styles) + + def data(self, index: QtCore.QModelIndex, role: int = ...): + row = index.row() + + if role == QtCore.Qt.ItemDataRole.DisplayRole: + return self.styles[row] + + +class UiMwPoliciesGen(object): + + def __init__(self, window: QtWidgets.QWidget): + self.vly_m = QtWidgets.QVBoxLayout() + window.setLayout(self.vly_m) + + self.hly_top = QtWidgets.QHBoxLayout() + self.vly_m.addLayout(self.hly_top) + + self.cmbx_browsers = QtWidgets.QComboBox(window) + self.hly_top.addWidget(self.cmbx_browsers) + + self.vln_1 = QtWidgets.QFrame(window) + self.vln_1.setFrameShape(QtWidgets.QFrame.Shape.VLine) + self.vln_1.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.hly_top.addWidget(self.vln_1) + + self.pbn_export = QtWidgets.QPushButton("导出", window) + self.hly_top.addWidget(self.pbn_export) + self.pbn_about = QtWidgets.QPushButton("关于", window) + self.hly_top.addWidget(self.pbn_about) + + self.hly_top.addStretch(1) + self.lb_styles = QtWidgets.QLabel("主题:", window) + self.hly_top.addWidget(self.lb_styles) + self.cmbx_styles = QtWidgets.QComboBox(window) + self.hly_top.addWidget(self.cmbx_styles) + + self.sw_policies = QtWidgets.QStackedWidget(window) + self.vly_m.addWidget(self.sw_policies) + + # ============== Stacks =========================== + + self.sa_chrome_page = QtWidgets.QScrollArea(self.sw_policies) + self.sa_edge_page = QtWidgets.QScrollArea(self.sw_policies) + self.sa_brave_page = QtWidgets.QScrollArea(self.sw_policies) + + self.sw_policies.addWidget(self.sa_chrome_page) + self.sw_policies.addWidget(self.sa_edge_page) + self.sw_policies.addWidget(self.sa_brave_page) + + # =============== Page ====================== + + self.wg_chrome_page = WgBrowserPage("chrome", + "HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Google\\Chrome", + self.sa_chrome_page) + self.sa_chrome_page.setWidget(self.wg_chrome_page) + self.sa_chrome_page.setWidgetResizable(True) + + self.wg_edge_page = WgBrowserPage("edge", + "HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Edge", + self.sa_edge_page) + self.sa_edge_page.setWidget(self.wg_edge_page) + self.sa_edge_page.setWidgetResizable(True) + + self.wg_brave_page = WgBrowserPage("brave", + "HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\BraveSoftware\\Brave", + self.sa_brave_page) + self.sa_brave_page.setWidget(self.wg_brave_page) + self.sa_brave_page.setWidgetResizable(True) + + +class MwPoliciesGen(QtWidgets.QWidget): + + def __init__(self, version: tuple[int, ...], parent=None): + super().__init__(parent) + self.ui = UiMwPoliciesGen(self) + self.setWindowTitle("浏览器策略生成器") + self.setWindowIcon(QtGui.QIcon(":/images/policies_gen_128.png")) + + self.version = version + + self.ui.cmbx_browsers.setModel(BrowsersListModel(self)) + self.ui.cmbx_browsers.currentIndexChanged.connect(self.ui.sw_policies.setCurrentIndex) + + self.ui.cmbx_styles.setModel(AppStyleListModel(self)) + self.ui.cmbx_styles.currentIndexChanged.connect(self.on_cmbx_styles_current_index_changed) + # 手动触发 + self.on_cmbx_styles_current_index_changed(0) + self.ui.pbn_export.clicked.connect(self.on_pbn_export_clicked) + self.ui.pbn_about.clicked.connect(self.on_pbn_about_clicked) + + def on_cmbx_styles_current_index_changed(self, index: int): + model = self.ui.cmbx_styles.model() + idx = model.index(index, 0) + style = model.data(idx, QtCore.Qt.ItemDataRole.DisplayRole) + QtWidgets.QApplication.setStyle(style) + + def sizeHint(self): + return QtCore.QSize(800, 600) + + def on_pbn_export_clicked(self): + reg_text = ["Windows Registry Editor Version 5.00"] + pages = [self.ui.wg_chrome_page, self.ui.wg_edge_page, self.ui.wg_brave_page] + for page in pages: + reg_text.append(page.get_recommended_settings()) + reg_text.append(page.get_settings()) + reg_text.append(page.get_extensions()) + reg_text.append(page.get_search_engines()) + + filename, _ = QtWidgets.QFileDialog.getSaveFileName(self, "保存", "..", "注册表文件(*.reg);;所有文件(*)") + if len(filename) == 0: + return + + with open(filename, "w", encoding="utf-8") as f: + f.write("\n\n".join(reg_text)) + QtWidgets.QMessageBox.information(self, "信息", "已导出注册表文件。") + + def on_pbn_about_clicked(self): + ver = f"{self.version[0]}.{self.version[1]}.{self.version[2]}" + msg = f"一个用于生成以 Chromium 为内核的浏览器策略的注册表文件的工具。\n\n版本:{ver},{self.version[-1]}" + QtWidgets.QMessageBox.about(self, "关于", msg) diff --git a/policies_gen.qrc b/policies_gen.qrc new file mode 100644 index 0000000..95621d6 --- /dev/null +++ b/policies_gen.qrc @@ -0,0 +1,8 @@ + + + images/browsers/chrome_32.png + images/browsers/edge_32.png + images/browsers/brave_32.png + images/policies_gen_128.png + + \ No newline at end of file diff --git a/policies_gen_128.ico b/policies_gen_128.ico new file mode 100644 index 0000000000000000000000000000000000000000..5567485bd98a9d39426636b0b56f75e1c617928c GIT binary patch literal 67758 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 V23$4ZssUFGxN5*v1NN?g{|9kP#nS)) literal 0 HcmV?d00001 diff --git a/rc_policies_gen.py b/rc_policies_gen.py new file mode 100644 index 0000000..7464ac0 --- /dev/null +++ b/rc_policies_gen.py @@ -0,0 +1,935 @@ +# Resource object code (Python 3) +# Created by: object code +# Created by: The Resource Compiler for Qt version 6.7.2 +# WARNING! All changes made in this file will be lost! + +from PySide6 import QtCore + +qt_resource_data = b"\ +\x00\x00$\x86\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3>a\xcb\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00 \ +\x00IDATx\x9c\xed\x9dwx\x15U\xfa\xc7?\ +g\x82@\x0a\x09\x97\x16\x8a\xa4\xd0Q \xc1\x05T \ +\x01\x14\x90\x1a\x05\x16WA`]\x7f\x16\x10\xd4\xd5]\ +V@\x10\x95\xa6\xee\xae\xae(\xd8p]\xaa\x05\x15!\ +\x04D\x90\x12\x14\x05\x95\x04\x02\x02\x814\xa4$\x10\xd3\ +\x0b\x089\xbf?\xa6\xdc\x99[\x92\x9b\x90\x84\xa0\xf9>\ +O\x9e\xc9\xdcy\xe7\x94\xf7\xbc\xe7{\xdeSGP\x15\ +\x1886\xc0\xeb:\xaf1\x0a\xa2+\x82@\x10\x81\x08\ +\x02\x11\x22P \x9a \x84*\xa7\xa8W!\x14$ \ +\x840\xae\xe6\xe7\xaa\xbc\xb0<7\xe4\x84\xfe\x1c\x10\x8a\ +&\xee g\x09\xc7\x85\x9c\xe2\x10\xaf\x16\x9f./\x84\ +@\x0a\x17\xe9\xd3\xc2AK\x87\xcb\xf4\x99\xc2\xb1\xe7\xd7\ +QN1\x9eK\xc9y\x04\xe9@\xba\x22\x94\xb3\x12\xd2\ +\x81\x84\xbc\xcb%\x9f\xf0\xe2\xd39\x15)\x8e\xd2 *\ +-\xa4;\xc66\xf2\x92\xe2.!\xc4\x1fA\x0cT\x14\ +q\x9d\x91Ia\xca\xa4\xb0\x16\x86U\xb9\xc2\xa1\x10L\ +r\x8aYi\xcer\xd6\xe7n\xe2s*$\x87pL\ +\xc6d\x0e\xc7\xbdQZ\xc3qml.\x8c\x5c8\x1a\ +\x9b~\x15n\x8dM\x22~\x15\x82\xadR\xc8\x8f\x85\xe2\ +\xf5y\xee\xdc'\x7f\xf1\xb8lJ\xc1\x95\x1b\xc0\xc01\ +\xdd\xeb\x08\xaf\xe7\x84`\xa4ke\x0b\xa7\xcc\xd42\x80\ +{\x060\xa7\xd3\xa5\xb1j\xf9\x95\xc8\xf5\x97\x85x\xa1\ +p\xee\x93\xdf{RL\xeePq\x03\xe8?\xb6\x9d\x97\ +\x97\x5c(\x14\xc6\x08\xa1\x08\x975\x1b\xb3\xf2j\x19\xe0\ +J\x18\xc0IN\x11\x94\x80T\x84X[\x22/?\x93\ +7\xf7\xa9c\xa5\x15\x97;\x94\xdf\x00\x22F\xb7\xf0\xba\ +N<\x87\x90\xf7+\x8aW\x1d\xb7\x89\xace\x80*e\ +\x00K~\xe0\x92\x84\xf7.S\xe7\xb9\xc2\xb9\xd3N\xbb\ +,77(\x97\x01x\xf5\x1f5Bx)\xab\x00\x7f\ +\xabr\x85S\xa2j\x19\xa0\xea\x19\xc0\xc9\xd8$\xb9%\ +\x8a\x1c\x9f7\xfb\x89h7E\xe8\x04\xc5C9Q\xa7\ +\xff]s\x11\xacGJ\x7f\x00\x89T#\x97\x9a\x84\xfe\ +\x8fvU\x9f\xa3&\x0e\x81tx\x8e\x94 49\x84\ +~k\x95\x13jH\x08\xfd\xd6\x85\x9c\xf1\x5c\x8d\xc9.\ +\xa7\xa5\xc3\x1c\x0e\x8er\xf6\xe7\x12\x87\xf4K49\xa9\ +\xcaY\xe2\xd1\x05\xec\xf97\xf2k\x8e\xd7\x88VX\xe2\ +1\xa7_O\x0f\xc6\xc5\xfe\xbbUN\x0d\x07\xedb~\ +\xdf\x9e\x0f\xe1\x0f\xcaz\xffy\xaf\xcdAJ\x8f*w\ +\xd9B7\x0f\xf5\xf7\xf2\xae\xb7J(\xca\x08pG\xaf\ +\xb5\x0cP#\x18\xc0$'\x85\x12\x9d{\xa9d)\xbfd\xb3\xf7\xe4i\ +\xcd\x07\xb0\xeb\xcb~\xb5\x1a\x954\x95\x87]\xce\xc4\xc8\ +\xf6\x82\x19\x1ap]\x93\x059\xf0t\xa9I5\xc3\xab\ +o\xd4X\xe1%>R\xe9\xc6\xda\x96V\xc4\x07\x10\x8a\ + \xb2\xeb\x0d\x8c\xee\xd3\x8b\xd1}z\xd2\xaca\x80k\ +\xc5\xfd\xce\x91\x9eW\xc0\xfaCG\xf9\xe4\xe0\x11\xbeM\ +;E\x89\x13\xe3\xe8\xd7\xb2}\x00\x14k3\x87\xe0\x9e\ +\x9c\x19\x8f~\xe8\x18\xa7\xb3\x01DD\xf5\xf1\x12|\x89\ +\x10\xde\xa5:\x22\x1e\xf8\x00>\xf5\xea\xf1\xc8\x88\xc1<\ +>j(-\x1a\xd9\xae@5\xbf?\x9c\xca\xc9c\xe9\ +\x9e\x1fx\xe7\xbb\xfd\x14_\xba\x5c!\x1f\xc0*'\x8b\ +\x84\xf0\xea\x93=c\xf2~s\xef<\xf9\x08s&\x8c\ +\xa5\xeeun;\x16\xb5\xb8B\xd4\xad\xe3E\xd4\x0d\xed\ +i\xd3\xb8![\x12\x93\xb9\xac\x8d\x06\x96\x87\x01\x80\x16\ +\xde\xdf\xec\x8f+\xde\x1a}\x04\x0c\x06\x18\xeb\x85\xa2\xcc\ +6\x02+\x07\x03\xdc\xd4>\x94\xef\x97\xbe\xc4\xb8\xdb#\ +\xaa2\xef\xb50\xe1O\xdd:\xb3\xf3\xa1\xf1tj\xda\ +\xa8\xdc\x0c\xa0\x96o\x89\xc1\x02\xaa\x01\xdcZ\xdc\x1eh\ +\xa3\xbek\x1f$\xd1\xfb\xa3\xe8\x81b\x1a\x83F\xa2(\ +\x0a/\xdc\x7f/m[6\xaf\xfa\x5c\xd7\xc2\x82\xce\xcd\ +\x1a3oP$X\xe6\x0c\xf4.\x9fp./\x93\x9c\ +\x10\xe2\xa6\x06\x0b\xdf\xee\x08\x9a\x01(\xca\xe5\xbb,\x96\ +\xe2!\x03\xbc\xfc\xf0D\x06\xf7\x08\xaf\x86\xec\xd6\xc2\x15\ +\x06\xb5\x0fa\xee\xc0\xbe\xe5f\x00\xa4\xc4\xcb\x8b!\xa0\ +\x19\x80\x10\xe2.\x8b\xa5x\xc0\x00\x0f\x8e\x18\xc4c\xa3\ +\x87WC6kQ\x1a\x9e\xe8\xd3\x83\xd17\xb4/\x17\ +\x03 \x04%\x94\x0c\x01\x10\xdc<\xd4_\xa9\xa3d+\ +\x8a\x22\x5cO\xb48\x8f\x034m\x18\xc0\x89\xd5K\xa9\ +_\xb7nu\xe6\xb5\x16n\x90S|\x81\x9eKV\x90\ +QPX\xfa8\x00vF\x90\x88\x8b\x0a\xa2\x99\xe2\xe5\ +\xa5\x0c\x13B\x88\xf20\xc0?\xc6\x8d\xae-\xfc\x1a\x84\ +\x80\xfa\xf5\xf8k\x9f\x1e\x94\x87\x01\x10\xd4\xbd\x8c\x18\xaa\ +H\xc4-\xea;\x9e\xf9\x00\xa1-\x02yh\xc4\xa0j\ +\xcb\x5c-<\xc3\xfd\x7f\xe8B3_o\x8f}\x00\x01\ +(J\xc9-\x0a\x944W\xdf\xf1\x8c\x01\x9e\x990\xb6\ +\xb6\xf6\xd7@\xd4\xafS\x87\x19\xfdn\xf1\x98\x01$ \ +\x11\xcd\x15\xa1(\xcd\xd5w\xcaf\x80\x06>\xde\xdcs\ +[\xdf\xea\xccW-\xca\x81\xf1\xe1\x9d\x09\xa8W\xd7c\ +\x06@\xca\x86\x8a\x94\x9e3\xc0\xd0\x9bo\xa2\xeeu\xd7\ +Uk\xa6j\xe19\xeazy1\xb0m\xb0\xc7\x0c \ +\xa0\xb9\x02JC\xf0\x8c\x01\xee\xecss\xf5\xe6\xa8\x16\ +\xe5\xc6\xc0v\xc1\x1e3\x80D4W\xa0\xa4!\x94\xcd\ +\x00\xd7yy1\xa4W\xf7j\xceN-\xca\x8b\x01\xa1\ +\xad=f\x00\x84l\xa8\x08\xa1\xd4\x83\xb2\x19\xa0e\x93\ +F\xf8\xfb\xfaTonjQn\xb4h\xe0G\x90\xbf\ +\x9fg>\x00\xa2\xae\xe2\xd2R\x5c0@H`\xd3\xea\ +\xccG-\xae\x00A\xb6\x00\xcf\x18\x00P\x5cZ\x8a\x0b\ +\x06\x08n\x11X}9\xb8B\xec\x9b\xc1\xfc\x0f\xd6!\ +\x81eO<\x04@\x5cR*\x0f\xbe\xfe\x1e\x07\xd3~\ +\xe6\x8b\xb9\x7f\xc7\xe6\xe7\xcb\xe7{\xf7\xb3d\xf3W\xda\ +J&\x8c=\x14\x80y\x1e\x9c\x7f\xac\xf9\x8cnA\xad\ +\x08\x0f\xbe\x9e\x97\xef\xb9\x8b{\x96\xbc\xcf\xca=?\xf0\ +\xc1\x94I\x844iDPc\x1b\xd3\xd7F\x13\xd2\xb8\ +\x11Sn\xeb\x83\xcd\xc7\xfbjd\xfb\x8a\xd0\xcc\xcf\xc7\ +y\x1f\x87y\xff\x80\xa2\x94\x9f\x01\x0a/\x5c\xac\xd6L\ +d\xe5\x15\xf0\xc2\xeaO\xb9\xf9\x89\xd9H\xa4Q\xf8\xcb\ +\xb7\xc52x\xce\x8b\x1cL\xfd\x99\xfb\xfa\xf5\xa6_\x97\ +Nd\xe5\x17\xf0\xf0\xd2\xff\x99\xbb\xbf.\x19\x00 \xa7\ +\xa8\x98G\x96\xad\x01 \xea\xa6\xaeDth\xcb\xc1\x93\ +\xa7\xe8\xfd\xc2\xab\xec\x80\xbdjU-\x9ezk9\x83g\xcc'-\ +#\x93.\xa1A\xfc\xeb\xa1\x09\x00\xfco\xeb.\x1eZ\ +\xfc\xaef\xc9\x92\x09\x03\xfa\x10\x12\xd8\x94\x94\xf4\xf3\xbc\ +\x11\xb3\xcd\x9e\xee2\x18@o\x1f\x16~\xbe\x05\x80~\ +\x9d\xda\xd1\xb7C\xa8\xf1\xc2\xe4\xe5kY\x1f\x97\x80\xcd\ +\xd7\x9bMO\ +\x10\x80\xc5\x1b\xbfD\xdf+\xe7)\x03\x80 5\xf3\x17\ +V\xec\xde\x0b\xc0\xa3\xb7G\x1a/H)yd\xf9Z\ +\xe2O\x9e\xc6\xe6\xe3\xcd\x07\x0f\x8d7^[\xb0y;\ +\xf7\xbc\xbb\x86\xac\xc2\xa2*\xd5E\xa5\xe0Zb\x80\xb8\ +\xe3\xc9\x0c\x9a\xfe<\x07\x92R\x8d\xdd\xb1\xcb\xfe\xfa\x08\ +\xa1\xcd\x9b\x91|6\x83\xbb\x17\xfe\xc7\xa8\xb9B\x08\xba\ +\x04_Ox\x9b`\xb2\xf2\x0bX\xb9s\x0f\xfa:\xf9\ +\xf20\x80@0\x7f\xfd\x17\x00D\xdd\xd4\x85\xd6\xda\xd6\ +5!\x049E\xc5\x0c{\xf5]\xb2\x0a\x8b\x08k\xdd\ +\x92\x19C\x06\x18\x8e\xe5\xc6\x84#\x0c\x7f\xe3\x7f5\xdf\ +\x08\xae\x15\x06\xd8\x7f<\x99A\x7f\x7f\x8e\xf8\xa4T5\ +\x1a$#o\xf9\x03w\xf6\xee\x09\xc0\xd8\xf9\xaf\x92S\ +Pd\xd4\x5c)%\x13\xb5)\xe9\x0d{\xf7\x93SP\ +X!\x06\x90HNff\xb3\xf3\xc8q\x00\xee\xeb\xfd\ +\x07\x8b\x1e\xb2\x0b\x8b\x98\xbcb-\x00\xb3\x86\xdfN\x9f\ +\xb6!Z>\xfcSk\xf7\x9f_\xf5\x09\x07\ +SN\xa2Uq#=\x13\x06\xf4\x01`\xfd\xde\xfd\xe8\ +\xd6Z\x11\x06\x90HV~\xbd\x0f\x80\xfb4\x833\xeb\ +!\xfa\xc0O\xac\xd8\xa3\x8e=\xbc8f\xa89\x19$\ +\x9cIg\xdc{\x1f\xd5\x5c&\xa8\xe9\x0c\x90\x95\x97\xcf\ +\xd8g_\x22[\x1bt\xd1C\x9fv\xd7P\x83\xfa_\ +_\xff\x05\xf63t\xd4\xeb\xf0\x9e\xe1\xd8\xfc|\xc9\xca\ +/ \xfa\xfb8tk\xad\x08\x03\x08\x04\xd1q\x09\x00\ +\x844iD\xebF\x0d-z\x00\xf8\xc7'1jS\ +p}K\xc6\xf5\x0a\xc7\x9e\x1cIZv\x0e\xc3\x97.\ +\xaf\x99FP\xd3\x19`\xd0\xdf\x9e%5\xfd\x1c\xe6\x0a\ +\xeb\xef\xe3\xcd\xb4\xbb\x86\x020o\xf5\xa7Z\xd7N\xab\ +r\xda\xb5_\x97N\x80J\xff\x9aI_\x11\x03\xe4\x16\ +]0\x9a\x81\x91\xe17Z\xf4\x00\x90[\x5c\xcc\x82\x98\ +\xaf\x00\x989\xd4\xee\x0b\x08-\xde\x83g2\x98\xfc\xe1\ +\x86J\xd5M\xa5\xa0&3\xc0___F\xfc\xf1\x14\ +5X\xed7\x09<6j\x18\xb6\x06~$\x9f\xcd`\ +\xc5\xb6]\x96\x1d/z\xd5\x8b\xd4\x0c`g\xc2\x11\xbd\ +j_\x11\x03H$\xd1q\x87\x00\x88\xe8\xd0\xd6\x89\x01\ +\xa4\x84\xa5;\xf7\x90\x92\x99EHc\x1b\xf7\xf6\x083\ +\xe2\xd3\xe3\xdfx\xf8\x18\xf3\xbf\xd8Yi\xfa\xa9\x14x\ +\xc8\x00upa!\xf6\x9a\xa4\x1e;\xa2\x09TZ\xda\ +^\x99\xfa\x00\x8f\x8d\x19Aj\xfa9\xb2\xf3\x0b8\xa0\ +9\x80z\xed_\xbf\xe7{\x82\x9b6!\xf5\xfc/&\ +\x06P\x08j\xda\x88\xf06\xc1\x00D\xef\x8bS\x0bY\ +\xd1\x18@\xd1\xd2\xad\xefw.\x93\x01\x14\xcd\x08\x14b\ +\x8f\x9d\x00 \xaa{\x17kM\xd1\xc4\xbb\xb4lN\xf4\ +\x81\x9f\x98:\xa073\x87\x0e \xb8\xb1\x0d\x84 B\ +s\x0c\x83l\x0d\x09i|u\x86\xca\xdd\xc2U\xb9b\ +b\x00\xed\xde\xe3\xb9\x80\xca\xf6\x01B[\x04\x12\xaaM\ +1\xdf\xd5\xd7\xba\xd4\xec\xf1Q\xc3x|\xd40\xa7w\ +\xe24C\x01\xf8p\xfa\xa3\xf6BE\xf5\xda\x0f\xa4\x9e\ +\xc4(y\xd3\xb3Yw\x0dQw\xcd\x22@@D\xa7\ +\xf6N2:\xbe\x9e9\x8d\xb0\xa0Vn\xd3\x1d\xd2\xd8\ +\xc6\xac\xa1\x03\xca\xcc\xdfU\x87\x87s\x01\xd5\xca\x00\xcf\ +\xfdw\x0d\xf3V|L\x80\xaf\x0f\xe1\x1d\xda\x10\xe0\xeb\ +Kx\xbbP\x10\x82\xd9\x13\xc6\x02\x10w<\x85\xe0\xc0\ +&\xd8\x1a\xf89\xbd\xaf\xd7~\x80\xfe];;=\xbf\ +\xd3\xcd\x92\xb5g\xc6x\xbe\x85\xcd]\xe1\xa7df\x01\ +\xaa\x01\xa4df\xb1\xfa\xfbx@\x10\x9b\x94\x0a\x08\x12\ +\xce\xa4\x93]|\x81E#\x07\xf1hD/\x8f\xe3\xab\ +2\xd44\x06\xc8\xca\xcbg\xf1'\xd1H)\xc9)(\ +dg\xdc!\x10B\xa5\xfb\xc0\xa6\x86\x01\x8c}\xe1_\ +\xa4\x9e\xcb\x04\x01\xfa\xf9\x03amCh\xe8\xeb\xc3\xcb\ +\xff7\x9e\xf06\xc1\xbc\xf0\xc1:v\x1d:J\xbf\xae\ +\x9d@\xab\xd5\x96\xab\xa6\x00\xbd\xe0\xe7\x7f\x1aca\x00\ +\xc7wb\x8f&1\xbew\x0f&\xf4\xe9\xc9\xce\xa3'\ +X\xb8q\x1b\xd9E\xc5$\x9c>\xabz\x0a\xda18\ +][\xb7`\xcf\xf4)\x844\xb6\xf1\xfa\x8e=\xe4]\ +\xfcU\x8d\xcb\xd8\x86\xa5\xb0pk,\xe3\xfe\xd0\x0d\x9b\ +O\xfd+\xd2\xd7\x15\xa3\xa61\xc0S\xaf/#'\xbf\ +\x00a(\x0b}i2QZ\x1f<\xeex2i\x19\ +\xe7A\x08\xcc\xe7\xe9\x1dHN\x05\xa1\x10\xdc\xac\x09\xa0\ +:\x80\xbb\x7fJ$\xf6\xf01\xbb\xf2\xb5L\x19g\x16\ +)v\x03\x98\xf7\xd9&\xcb\xefj\xfc\x8a\xfd\x04S\xa1\ +\xf6@&\xf4\xe9IC\xef\xfa\xc4&&\x19\xbf\x9b]\ +\x87\x83?\x9f%\xfe\xe73\x84]\xdf\x82\x91];\xb3\ +\xfa\xfb\x03V\x1f\x04I\xee\x85\x8b,\xfdz\x1f3\x07\ +]\xe5\xf3\x12j\x12\x03$\x9fNg\xf9\xe6\xaf\xec\x16\ +\xa8\x19\x19\x9a\x11L\x1c\xdc\x1f\x80\xe5_\xee\xc48'\ +O\xf7\xd2\xa5j\x84\xfe\xde\xf5\xb1\xf9\xf9\x02\xb0\xfb\xf0\ +1{aK\xa9}iC\xda\x1dA\xcdo4t\x01\ +\x96|\xf8\xfb\xf8\xd0-\xa8\x95\x9a\x0e\xcd\x08\x02\xb4\x1a\ +\x1b\x16\xd4\x8a\xbe\xed\xd5\xc9!\xd5H\x85\xe9 ,H\ +\xfd%\x9b\xb0\xeb[0\xbeg\x18\xa9Y\xda\x07^o\x19\x893\x8f\xb0\x01D\x86\xdd\x08\xc0\xce\ +\x03\x87\xd5\xdf\xb5\x98\xad\xe7\xea\x0b\xc3\x0143@y\ +F\x02\xfbth\x0b\xc0\x81\xb4S\xe4\x14\x15[F\x02\ +\xedu\xdd}:\x1d\x06$]\xc7o\xe8\xcb\x9e\x10c\ +\x04\x0ek\xc2\x8cX\x8d\x9f]\x8f\xd8\xadIp{\xd0\ +w\xe9\xa8)s\x01\x07O\xa48\x8c\xac\xd9\x19\x00\xa0\ +\x7fx\x17\x00c4\xd08-\xdb\x81\x01\x82\xb5e\xe9\ +\x07RNb\x9c\x06\xae\xf3\xa7td.\x5c0\x80E\ +;F\xe1\x9b\x88\xd8I\x0f\xe6t\xea\xcd\x8a\xfd\xea\x22\ +~C_\xf6\x84\x185\x0fk\xc2\x9c\xe8\xdfE\x8dE\ +Jr\xf5\xaefy\xe1\xaa\x5cM\xe1\xea\xd1V)\x03\ +d\xe5\xe5\x13\x97\x98\xe4\x96\x01\xcc[\xcd\xcc\xeb\x01\xf4\ +\xab\x99\x01\xf4\xf8\xb3\xf3\x0b*\xc4\x00\xd6\xe4[\xe7\x02\ +j2\x03T\xd8\xf7\xaa\x09\x0c\x10\x9f\x98d\xb5<\xcb\ +U\x1d\xe0\x01\xd5\x01\xb4\xd7\x0f\xd7\x0c\xd0\xbf\xdb\x0d\xf6\ +\xf4\xfd\x8e\x18\xa0\xa2\xcc[#\x18`\xe7\xfe\x83V\xcb\ +\xb3\x5c\xed\xbb\x8dR\xcff\x98\xea\x87\x1b\x06\xd0\x90\x9a\ +q\xbe\x96\x01<\x81\x87\x0cP\xa5\xbd\x80\x943\xe9\xa5\ +2\x80\xbe\xdb\xc8\xba.\xc0u/@G\xda\xb9L\xbb\ +\x97.)G/\xc0\xa2\x1d\xcc\xb3\x81 \x991b0\ +\x11\x1d\xdb\xb0\xfbX2\x0bb\xb61s\xf8\xedDt\ +\x08%61\x99\x85\x9bw0\xfe\xe6p\xc6\xf7\xea\xce\ +\x81\xd3\xe9\xc4\x1eO\xe1\xd1~\xb7\x90\x9a\x95\xc3\xd3\xeb\ +\xb7\xd0\xb5esf\x0e\x8e$5+\x87\x19\xd1\xdb\x08\ +\xb2\x05\xb0h\xe4@r\x8a/\xb0t\xcf\x0fL\xee\xfd\ +\x07@\xb0h\xfb\x1e\x10\x82\xa7\x07\xdc\x8a\x00\x16\xee\xfa\ +\x8e\x939y,\x89\x1aD@\xfdz,\xda\xbd\x8fo\ +N\x9e\xb12\x80\xde\xab(/<\xec\x05T\xe98@\ +\xea\xd9s\xd6\xfe\xa7\xe5j\x92K?g\xaa\x87\xea\x7f\ +\x8e\xe3\x00F\xd1i\xf7\xe5\x1f\x07\xb0h\xc7(|\x89\ +dDX\x17\x9e\x89\x1a\x0c@\xbf\x8e\xed\x90\xc0\xac\x11\ +\xea\xaa\xe3\xc8\x0em\x09\xf0\xf1f\xaa\xb6\x0c-\xb2C\ +\x1b\xa6\xf6\xbf\xd5\x08)\xa7\xa8\x98\xf1=\xc3\xec;\x88\ +\x04D\xb4\x09&D\xdbI5\xf2\xc6\x0e\x86l\x90\xcd\ +\x9f\xb4\xec\x5cFvn\x07@\xd7\xe6M9\x90~\x9e\ +\x11\x9d\xd4\x1eJ\xd7\xc0&\x84\xbc\xb2\xcc\xae'E\xb9\ +2\x06p,WS\xb8\xd5\xc2\x00\xba\x0f\xe1\x96\x01L\ +\x1bN=e\x00{[[y\x0c\x10\xe00q\xf3\xcc\ +H\xeb)hz\xe1\xbb\xc2\xd4~\xb7X\xee'\xf4\x08\ +s+\x1b\xd6\x22\x900\xd3.\xeb`[\x00\xc16\xeb\ +\xd7S\x9c|\x80*f\x80*\xf5\x01v\xc5\x1f*\xdd\ +\x070m8-\xcd\x07\x88\xb8\xb1\x93]\xce\xdc\xd6V\ +\x92\x0f\xb01\xeep\xb9\xf2\xa5O\x0d{$\xfbK\xb6\ +\xc7\xb2\x1b\x8f%\xff\xb6|\x80K\xb1\x9e\xad\x95\x9b3\ +\xf1n\xe6L\xbc\xdb#\xd9\x0b\xeb\xde/w:\x0aW\ +,v\xf8\xc5\xca\x009EE\xac\xdf\x9f@T\xf7.\ +e\x86\x15\xff\xf3\x19V\xed\x8d\xe3\xa5\xd1C=\x8a\xfb\ +\xd1\xcf6\xb3\xf1\x81{<\x92\xddx,\xf9\xb7\xc5\x00\ +5\x17\xce\xbd\x80\x0d\xda\xea\xe0\xb2\xb0\xf2\xbb\xfdl\xf4\ +ptn\xc3\xa1c\xc4&\xa5\x11\x7f:\xbdL\xd9\xec\ +\xa2bb\x12\x7fc\x0cP\xa7\xef\x08\xd3<\xbd\xe3\x18\ +\xb9`\xcb?\x9f\xa3\x7fx\x17\x9e_\xfe\x11\xf3V}\ +\x02\xc2:\x16\xae_#\xbatb\xeb\xc2Y\x00\xd4\x1f\ +u\xbf\xf5K\xa4\xa5\xac\x07(Z\xb5\x04\x00\xef\x09\xd3\ +\x88\xe8\xdc\x8e-3\x1f\xd7\xb5\xe3\xd4\x0b\xd8\x18w\x98\ +\xac\x82Ble\x9c\x83\x14s\xe8(i\xbf\xe4\x18\xeb\ +\x02JC\xf4\xe1D\x84\x10\xac\xda\x9f@X\xcb\xd2O\ +X\xd9x,Y\xcd\xc7o\x89\x01\x22\xc3\xbb\x96\xea\x03\ +\xc4\x9fH1dK\xf3\x01b\x0f\xd9k\x5cU\xf8\x00\ +\xa0\xee\x0e\x8e\xd6&\xa4\xdcaWb\x12\xa9\x99\xd9 \ +\xe0\x0d\xd3\x09$\xae\x90UT\xcc\x9a\xfd\x09H)\xd9\ +\xf4\xd3\xf1Re\x016\x1e=a\xca_\xf51@\x15\ +\xcf\x05\x94\xde\x0b\xc8\xce/0$\xcd\xbd\x00\xfdZz\ +/\xc0\xc5H\x9c4%\xb3\xcc^\x80\xf3H\xe0\xaa=\ +?\x98\x85\x98\xbe\xd6\xfa\x11\xee\x95\xdf\xc5\x19]\xcc\x98\ +\x84\xa3\x96\x0d!+\xf7\xc5[\xee7\x1e>f\xa47\ +5;\x97]I\xf6cl\xe2\xcfd\x10m2\x8a\xd4\ +\xec\x1cb\x12SL\xf931@\x15\x8f\x04V\xe98\ +@p\x8b@v\xc5\x1f*s\x1c 8\xb0\xe9U\x1d\ +\x07\xd0\x9b\x81\xd8cI\xcc\xdf\xf0%\x11\x1d\xdb\x12{\ +,\x89%\xdb\xbf\x01\x04#\xc3n 61\x99\xd5\xfb\ +\xe2T\xad(j\x9b=\xee\xfd\x8f\x989\xb8\x9f1 \ +\xb4t\xf7>\x16E\x0d\x22-;\x97\x19\xd1\xdbL\xe9\ +\x15\xcc\xd8\xb4\x9d\x19\xb7\xa9\xdd\xc9E;\xbf%-;\ +\x0f!\x04\xfe\xf5\xeb1\xf3\xcbXK\xbf\xfd73\x0e\ +\x10\xd2\xbcY\xa9\x0c\x90zV]:\x15\x1c\xd8\xd4\xe3\ +q\x80\xe0fMH=\x9fY\xa9\xe3\x00Z@\x00,\ +\xdc\xb8\x8d\x051\xdb\xd0\xe7\xef\x97\xec\xf8\x86%;\xf7\ +h\xe9P\x0b_\x8fo\xf7\xf1T\x86%\xad\xd0~\x17\ +\x1c8\x93\xce\xf0wV\xabQ8\x9c\xd7\x9fp\xf6<\ +\xe3\xd7|\x8ey=\xc0\xb8\x8f\xa2\xd5p\xf5?\x87r\ +\xb8\xe6}\x80~\xddK\xf7\x01R\xd2\xcf\x01\xea\x90p\ +i>\x80\xb94\x83\x9a6\xae\x12\x1f@\x7f\xe1\xf76\ +\x17P\xa5>@X\xbb6\xa52\xc0\x01\xcd\x09\x0cm\ +\xde\xacL\x1f`\xc7\xc1\x9f\xec\xe9\xab\x22\x1f\xc0Q\x0f\ +\xe6l\xebDd\xbf\xba\x88\xdf\xd0\x97=!\xbf\xeb\xd9\ +@\x9b\xbf\x1f]\xdb\x04\xbbe\x80\x1c\xd3ql}\xb5\ +\x8d\x1ee\xad\x07\xa8e\x00\x0fQ\x13\x18\x00\xa0\xdfM\ +\xdd\xdc2\x00\xc0\x0e}{\xb66/\xe0\x8e\x01R3\ +\xce\xabr\xcd\x9a\xfc\xae\x18\xc0\xbf^\x05?\xceQ\x13\ +\x18\x00`\xe2\x90\xdb\xdc2\x00\xc0N\xad\xef\x1d\xa9-\ +\xf8p\xc7\x00\xba\x01\x04\xf8\xfaT\x88\x01b\xb5-\xe0\ +\xdd\x82Z\xe1\xef\xed}\xcd0\xc0\xbd]\xec\xb3\x89\xe5\ +\x82\x87\x0cP\xe5\xab\x82\xbbwhK\xeb\xc0\xa6\x9c\xd4\ +\xce\xea5\xd7,\x89\xdd\x0f\xe8\xa7-\x0eu\xd7\x0b\xd0\ +\x0f\x92\x08\x0b\x0d\xa2\xa2\xab\x82\x17o\xde\xce\xb4!\x03\ +\xf8\xe9\xe5\xd9\x1cH;\xa5\xc9\x98\x04\x859~\x9c\x9f\ +;\xe9A8=v\xd2\x93\x9b{\x01\xf6\xedj\xa6\xe0\ +\x1c\x03\x8c\x08v\xbfQ\xb5Tx\xd8\x0b\xa8\x96}\x01\ +\x8f\x8f\x8d\xe2\xa97\xde\xc3i\x1c@\xd8W\x03\x876\ +oFP\xb3&\xa4\x9d;\x8f\xa5\x8d\x96ja\xeb\x8b\ +F\x83\x9a5\xb1\xff^\xce}\x01\x0b>\xff\x02\xa1\x08\ +\xa6\x0e\xeeO\xbf\xce\xed+\x9c\x9fk\x02\xae\xca\xd5(\ +\xdfj\xde\x19\x14\xd5\xf7\x16\xfe\xb6\xe4\xbfFV\xe1\xbd\x819E\xc5\ +\xec:z\x1c\xf3&\x90\xe1\xda\xa2\x90\xf8\xb4S\xc4&\ +&\xa9\xb9\xd7\xbf\xa2n\x9a`Z:~\x14\x00+\xf7\ +\xc5\xb1[?\xaf\xc0\xb4;X\x0a\x981\xb0\x06|H\ +\xbb&1\x00\xc0cc\xa3x\xed\x93hr\x8b\x8a\x8d\ +\xe0\xf4\xb6v\xc3\x9e\xef\xf9\xf7\x94\xfb\x09o\x17Jp\ +\xb3\xa6\xa4\x9e\xcb4\x18 R?\x07@\xa8\x8e\xa0\xcd\ +\xcf\x97\xfbn\xebc\x1c\x15cv\xd3\x03|}\x08\x0b\ +i\xad\xdd\xdb\xe3\xde4c\x9aQ\x83ug\xd0\xea\xde\ +CD\xc7\xb6\x86|\xdf\xf6\xa1\x08\x04\xd9\xc5\xc5$h\ +S\xb9B\xc0\x8d-\x02\x09i\xac\x9e'\x18\x93p\xd4\ +\x99\x81\x90\x04\xd4\xf7fr\x9f\x1eW\xa4\xabJAM\ +b\x00\x00[\x03?\x1e\xfb\xe3H^X\xfe\x11am\ +C\x08h\xe0GX\xbbP\x1a\xfa\xf9\xd2P\xdb\xf5\x0b\ +\xb0\xe5\xc5\xd9\x84\x96q4\xfd\xa4\xdb\xcaW\xc3\xfa\xdd\ +`\xf7\xa4\xcbj\xfb\xc3\x82Z\xb9\xdd\x1c\xaaO\xf6d\ +\x15\x1619\xe2f\x10\x82\xb4\xaclR\xb3sI\xfb\ +%\x87\x9fs\xf2X8\xf2\xf6\x9aq\xc2xMc\x00\ +\x80g\xef\xbf\x97g\xef\xbf\xb7T\x19W\x85\x9f\x9c\x9e\ +AZF\xa6z\xb2\x88\xb6Kxq\xf4\x97\xda!\x91\ +\x0e\xe3\x14\xa6\xabq>\xc0\xa71\x86\xef\xe1J.\xc0\ +\xa7>S\x07F\x02\x10{,\x09\x09t\xbd\xbe\x85S\ +A\xea\xf76\x1f\xef\x9a\x7fLLMc\x00G\xecO\ +L\x22\xb7\xb0\x88\x94\xb3\x19\xa4e\x9cG\xa2\x1e\x12e\ +k\xe0\xc7\xf3+\xd72o\xcd\xa7\xe8'\x84\xe8\x8bI\ +\x02\x1a\xf8\x91\xa1-\xf2x\xfe\x83u\xe4\x15\x17\xa3\xb7\ +\xcd\x966[\x08\x8b\x01,\xf8lS\xa9\x1bA\xbb\xb6\ +n\xc5\xd4\x81\x91d\x15\x142\xe4_o9\x87\xa7\x08\ +\x96\x8e\x1f\xcd\x84[nR\x8f\x87\xd9\x17\x0f@\xb7V\ +\xcd\x09\xf0\xaeO\xebF\x0d\x8dU\xc05\x065\x91\x01\ +t\xfc\xf5\xf5e\xbc\xb1.\xc6RXz\xf8s&\x8c\ +e\xc2\xc0H\xe6\xaf\xf9\xcc\xd2\x0b@(\xe4\x14\x14\x10\ +\x97\x94Jx\x9b`\xfau\xe9\xa4\x9e\x14V\x09\xa7\x84\ +Evl\x03\xa8\xb5\xdfy\xee\x02\xfc\xeb\xd7cD7\ +\xd5\x17Y\xb8y;\xab\xf7\x1dp\xda\x1d\xbc\xe8\xceA\ +<\x1aQ\x83\xbe\xab\xe8!\x03\x5c\x955\x81\xafL}\ +\x80\xae\xa1*\x95\x9b\xc7\xc7\x16\xaf\xdbDV^>\xa1\ +\xcd\x9b1\xfe\xf6\xbe\x96\x91@\xbd\xdb\xb0+\xe1\x08\x00\ +#{u\xd7\xdd{<\x19\x09\xb4\xe6\xc3:\x17\x10\xd1\ +A]\xa7\x1f{\xec\x84\xcb\x91\xc0G\xfb\xf7\xc6\xe6\xe3\ +MJf\x16\xab\xf6\xc6\x1b\xf1\xe9\xf1\x0f\xbb\xb1C\xcd\ +*|\xa89s\x01\xee\xb0\xf5\xdf\xcf\xd3M\x9b(\x02\ +5\xbe\x9c\x82B\x16\xaf\xdb\x04\xc0\xecqch\xe0\xe3\ +mb\x00\xf5\xbaK[\x1e\x16\xd5\xab{9\xe7\x02\x1c\ +\x19@\xf3\xda\xbd\xbd\x89\xbaI]\x0d\x1c\x1d\x7f\xd8\xa2\ +\x07\x80\x00\xefzL\x19\xa0\xee\xcf_\xb0i;\xf6\xe4\ +\xa8\xf1vi\x19\xc8\x9b\x7f\x1aY\xa9\xba\xa9\x14\xb8*\ +WL\x0c\xa0\x89]\xb5U\xc1\xb6\x06~\xac}n:\ +\x0d|\xd4E\x98z\xe8\x8b?\xdfD\xf2\xd9\x0cB\x9b\ +7\xe3\xb1;\x8781\xc0\x86\xef~$%\xfd\x1c6\ +?_F\xf4\x0a\xbfb\x06\x18\x11\xae\x0eA\xc7\xa7\x9d\ +\x22-3\xcb\x89\x01\xde\xbco\x0c6\x1fo\xe2O\x9e\ +f\xf5\xbe8\xcb\x5c@\x97\x96\x81\xc4L\x9eX3\xbc\ +~G\xd4t\x06\x00\xf5\xb0\xc8m\xff\x9a\x8b\xbf\x8f\xb7\ +a\x91\xb9\x05E<\xf8\xca[\x00\xcc\x19?F;\x1a\ +\xc6\xce\x00B\x08\xd6\xef\xfd\x11\x80\xa8\x9e\xdd\xaf\x98\x01\ +\xee\xeb\xa3\x9eP\xb6R\xfbT\x8cY\x0f\xc3\xbbv&\ +J3\x90\xa7?\xdbdN\x06][5g\xcd\xfdw\ +\xd7\xcc\xc2\x87\x9a\xcf\x00:\xc2\xdb\x85\x92\xb8\xe2\x0d\x93\ +O \xd9u\xf0'\xd6}\xa3\x1e\xe3\xfe\xf1\xac'\xf0\ +\xf7\xf1\xb1\xd7\x5c)Y\xb9\xfd\x1b\x00&\xde\xd6\x17\x7f\ +\xef\xfa\x15f\x80\xa0\xc6\x8d\xe8\xd7Im\xff\xf5\x15\xc1\ +\xba\xdc\xf5\xb6\x00\xde\x9c\xa8\x0e\xe7\xce\xdf\xb8\x8d\xd8\xc4\ +\x14\x83\x88\xba\xb4\x0a$f\xca$cP\xa8F\xe2Z\ +`\x00\x1d\xb6\x06~l}y\x0e\x11];\x1b\xb3c\ +\x0f\xbd\xfa\xb6\xd1\x14|<\xf3q\x0b\x03\xc4\xa7\xa4\x19\ +\xc7\xc6N\x1b>\xb0\xc2\x0c0S\xdb\x10\xba\xfe\xc7\x83\ +\xa4ef\x1b\xf9\xf7\xaf_\x8f\x0f\x1f\x99`P\xff\xc2\ +\xcd\xf6\xb6\x7f|\xaf0b\x1e\xfds\xcd\xad\xf9:\xae\ +\x15\x06\xd0ak\xe0\xc7\xb6\x97\x9fe\xd6\xb8\xd1\x00d\ +\x17\x14p\xf7\xfcW\xc9\xca/\xa0\x7f\xb7\x1bx{\xda\ +\x03Fz\x04\x82\xc5\xd1_\x020u\xf8@\xfc}\xbc\ +\xcb\xcd\x00\xd77n\xc8\xc4\xbe\xea\x91\xaeK\xb6\xed6\ +^\x90R\xf2\xd6\xa4\xb1\x84\xb5nIVa\x11\xf7\xbc\ +\xbd\xcaxm\xd1\xa8!\xbc5~t\xcd/|\xb8\xb6\ +\x18\xc0\x8c9\x13\xc6\xb2e\xe1,\x82\x9b6!>9\ +\x8d\xbf\xbf\xab\x16\xc0\xa4\x81\x91\xbc=\xed/\xe8+o\ +V\xed\xdcc8\x83\xd3\x86\xdd^n\x06x\xe6\xce!\ +\x00\xec\xc4\ +\x84\xde\xeaD\xce?>\x8e&5\xf3\x17\x16\x8e\x1e\xc6\ +\xe6\xc7\xff\xaff\xb7\xf7\xaep\xad2\x80\x19s\xc6\x8f\ +!\xf1\xbdW\xf1\xf7\xf5\xe6\xc9wV\x020\xe9\xf6\x08\ +\xb6\xde\xbc\xf5\x80:\x1f\ +\xb1|\xf7^v\x1fM\xa2o\x87P\xf6\xcc\xfe+\xfd\ +:\xb6#\xab\xa0\x90\x07\xff\xf7\x11\xc1\x8dm\x1cza\ +:\xd3ns\x7f6@\x8dFe3@\xeeU\xfa\xa0\ +\xb2\xcd\xcf\x97\x7f?8\x81\xd9\xf7\x8e2\x96\x86\x87\xb7\ +\x09f\xcb\xf3\xd3\x99u\xf7H\xfe\xf6\xdf\x0f\xc8\xca/\ +\xa0\xdf\x8d\x1dy{\xf2\xa42\x19\xe0\xa5{G\x11\x1e\ +|=)\xe72Y\xb0~\x0b\x8b\xfe4\x92/\xfe>\ +\x85\x90&\x8d\x00H\xcb\xcc\xe2\x9dIw3k\xc4\xc0\ +k\xa3\xadw\x81\xcc\xc2\x22\x8f\x19\xc0\xe3\xb9\x80Tm\ +\x13\xc7\xd5\x82\xcd\xcf\xd7\xf2\x8d\x00\x9b\x9f/\xb3\xfft\ +\x17S\x87\x0f\x22\xf5\x5c&6?_&\xf6\xefM\xea\ +\xb9L\x16|\x1a\xe3\xc4\x00\x01>\xde\xbc4n\x0c\x13\ +\xb5!\xdb\x03'O\xb3\xe7\xd9'\x9dv\x03\x97\xf6\xb1\ +\x88k\x05\xe9\xf9\x85\xb8,W\x9c\xe7\x02<\x9e\x0d<\ +[\x8eS1\xaa\x136?_\xe3\x14q\x80\xd9cG\ +2\xb2g8\xafo\xfa\xca\xf8\xed\xbe\xbe\xbd\x985z\ +\x18!\xdag\xe6A\xfdp\xf4o\x15\xe9\x05\x85T\xfa\ +l\xe0\xd9,\xcf\x8f:\xb9\xda\x08\x0fi\xcd\xbb\x93'\ +\x19\xf7\xef<<\xe1*\xa6\xa6\xfa\x91\x91_\xe01\x03\ +x\xec\x03\xc4'&Uw>jQA\x1cL?_\ +\xf9\xbd\x80\xd4\x8c\xf3\x1c=y\xaa\xfarQ\x8b\x0a!\ +13\x8b\xb4\xec\x5c\xcf{\x01\xb2D\xa6\x83g\xe3\x00\ +_\xec\xdd_}9\xa9E\x85\xb0\xf5D*\xe6\x01\x91\ +R\x19@\x92\xa1 \xc4Y\xf0l\x1c`g\x19G\xa8\ +\xd4\xe2\xeac\xeb\x89TLN\x5c\xa9\x0c \x90g\x15\ +!\xe5Y\xf0\x8c\x01v\xc6%p\xa1\xa2\xc7\x97\xd7\xa2\ +\xcaq\xe1\xd2ev\xa5\xfc\xec9\x03\x08R\x14)\xf0\ +\x98\x01r\x0a\x0aY\xbee{\xb5f\xaa\x16\x9ecu\ +\xfca~\xbd\x5c\xe21\x03H\xc4Y\x05\x89\xc7\x0c\x00\ +\xf0\xdc\xfb\x1fR|\xf1b5f\xab\x16\x9e\xa0\xf8\xd2\ +%\xe6\xef\xf8N\xab\xd9\x9e1\x80\x90\x9cUJ\xa4\xf2\ +\xad\xfa\x8egs\x01\x19\xd99\xbc\xf6\xe9\xc6j\xcbX\ +-<\xc3\x9b\xdf\xc5q\xbe\xb0P-7\x0f\x19\x00\x88\ +S\xb8X\xb4]\x22/x\xca\x00RJ^\x5c\xf3\x19\ +9\x05\xf6#\xdejqu\x91{\xe1\x02\xff\x8c\xdd\x07\ +\x08\x8f\x19\xa0DrQH\xb6+\xfc\xb05G\xc0\x0e\ +O\x19@\x08AnA!S\xff\xf3n5f\xb1\x16\ +\xa5\xe1\xb1\x0d\xdb\xc8\xff\xf5W\xd4\x95Nx\xc6\x00B\ +n\xcfz\xfa\xe1\x1cE\x93\xdf\x5c\x1e\x06\x00\xf8`{\ +,/\x7f\xb8\xaezrX\x0b\xb7x\xe5\xeb\xefYw\ +8\x11}\xf5\xb4\xa7\x0c\x00b\x1dh\x87\xe3\x95\x94(\ +\x9b\xcb\xc3\x00\xa0N\x14\xcdZ\xb6\x9a\x98\xef~\xac\x86\ +l\xd6\xc2\x15\xbeLL\xe1\xf9m_[vPy\xcc\ +\x00%r3\xe8\xa7#\xee\xd9p\xa4\xa4D\x1eU\xdf\ +\xf5\x8c\x01\xf43o&,\xfc\x0fGj\x87\x88\xab\x1d\ +\x89\xe7\x7f\xe1/\x9f\xc4Pb\xae\xd9\x1e2\x80\x14\x1c\ +\xcd\x9e19\x05t\x03\x00\x84\x22\x9eV\xdf\xf5\x9c\x01\ +\xa4\x94\xe4\x15\x15\xd1\xe7\xb1Yl\xdb\x7f\xb0\xaa\xf3\x5c\ +\x0b\x0d;\x93\xd2\xb8\xed\x9d\x0f\xc8\xbdp\xd1Z\xb3=\ +d\x00\x81|Z\x0f\xcbK\xffG\xa6\x1d;\xa2\x04u\ +\x18\x08\x04\x99w\xd9:/\xa8\xd4\xae\x02\xf4\xdd\xbb\x17\ +/]\xe2\x83\xafvS\xaf\xeeu\xf41}\xdd\xa3\x16\ +\x95\x8f\xd7\xbe\xfe\x9e\xc9\x9f\x7fA\xf1\xa5K.\xa6|\ +\xf5\x13O\x5c\x94\x97&W\x02\xdf\xe4<=e\xba\x1e\ +\x9e\x979p\x19\xd4!\xd9KQ\xfel\x14\xbaV\xc8\ +\x8e\x81X\x22\xd5e\xe0\xa2N\x00\x00\x044IDA\ +Tv\xc7J\xe0\xab\xfd\x09$\x9e>\xcb\xf0^7\xe1\ +\xe5U\xc13nk\xe1\x12\x17/]\xe6\x81\xb51,\ +\xf9\xf6G\xb5\x82+.\xdav\xd3\x15\xa7o5\xabr\ +R\xc8{.n\x8d9\xa9\x87k1\x00\xd2\x8e\xa5\x88\ +\xa0\xf6\xb7\x0aE\xb4+\x0f\x03\x98\x9f'$\xa7\xb1\xf2\ +\xabX\x84\x22\xe8\x12\x12D\xdd:u*]\x19\xbf'\ +\x14^\xfc\x95e{\xe3\xf9\xcb\xda\x18\xf6\x9e<\xa3\xb6\ +\xcd.j\xb6g\x0c\xc0\xe7\xb93\x1e}\xd9\x1c\xbe\xc0\ +\x11}F\x04)\x8a\xb2OQ\x84z\x80\xaf\x0b\x06\xb0\ +\xac0\xd1\xf7\xc9\xbbHTC?_\xa6D\xdd\xc1\x9f\ +\x07\xf5\xb3|!\xac\x16e#-+\x87\x15?&\xf0\ +\xf6w\xfb\xc9.*v\xd0\xaf\xe9k\xe5\xee*\xa9\xc3\ +i\xe5\x08\x91qAx\xf5,~\xfa\xe14s<\xce\ +\x06\x00\x10\x19\x15\xa9 \xb6+\x8aP\xca\xcb\x00\xd6\xe7\ +v_\xa2\xc3\xf5-\xb9\xa3G\x18w\xdc\xd4\x8d\x88.\ +\x9d\xa8_\xf7\xba+T\xd1o\x0b\xc5\x97.\xf1u\xf2\ +I\xb6&&\xb3-1\x85#\x19\xe7\x1d*\x9b~\x98\ +\x06\xe5f\x00\x09%%\x92\x01\xf9\xcfL\xdd\xe5\x18\xaf\ +k\x03\x00\x94\xc8;\x9fV\x14\x16^\x09\x03\x18r.\ +|\x89NA\xad\xe8\xdc\xba\x15\x9d[\xb7\xa4S\xeb\x96\ +\xb4\xb05\xb4/\x91\xa3\x15E1\xa7\xb2\x96\x01\xaa\x89\x01\ +\xa4\x10\x12\xe4\xa7\x92:s\xf2\xe7>V\xbeO\xa0k\ +\xa8\xb8\x01\xe8\x188\xa6{\x1d\xa1\xcc\x15\x8a\x12\xe56\ +\xf1\xc2\x94IW\xf4\xe5`,.\xe5<\xf0\x01\x5c*\ +\xd5\xa5Q\xba\x09\xc7\xa4\x5cs8\xee\x8d\xd2\x85\x91;\ +\x19\x9b\x0b#\x17.*\x83\xd9\xc8]\x1a\x9b\x83q*\ +b\xfd%\xa5dn\xe1\x9c\xa7\xaeh\xb7\xce\x95\x1b\x80\ +\x8e\xc1\x13|\xbd\xc4\xc5\x81 \x87(B\x19\x8a \xb8\ +\x96\x01*\x93\x018!P6K\xd8\x9cW\xc7\xef\xab\ +\xb2\xbc{OQy\x06\xe0\x88A\xe3\xda{)\xb2\xbb\ +\xf0\xa2\xad\x806\x08\xa5\xad\x10\xa2-B\x04\xa91\xd7\ +2\x80\xb3\x9c@@J\x89 I(\xe2\x04\x92\x13R\ +\x88$\xe5r\x9d\xfd\xb9\x8b\x9e,\xfb\x0b\xd4\x15\xc0\xff\ +\x03\xacS*H\xf17=\x8e\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +\x00\x00\x05~\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x03\x00\x00\x00D\xa4\x8a\xc6\ +\x00\x00\x00\x09pHYs\x00\x00\x0e\xc4\x00\x00\x0e\xc4\ +\x01\x95+\x0e\x1b\x00\x00\x02\xbePLTEGpL\ +\xd7`*\x17\x0a\x04\xa0G\x1fO#\x0f\x04\x01\x00\xf7\ +q4\xf6n0\xdfd,\x00\x00\x00M\x22\x0f\x14\x09\ +\x04\x02\x01\x00\x9eG\x1f\xd8a*\xddc+-\x14\x08\ +Q$\x10\xb5Q#\x22\x0f\x06\x06\x02\x01\x17\x0a\x04\xa1\ +H\x1f\xf7}E\xdbb+\xf6n0\xf5n0N#\ +\x0f\xafN\x22\x15\x09\x04_*\x12\x02\x01\x00\xa9L!\ +\xe4f-X'\x11}8\x182\x16\x09&\x11\x07\xe0\ +d,\x9fG\x1f\x09\x03\x01\xe3f-\x0c\x05\x02b,\ +\x13\xb8R$m1\x15Q$\x10b+\x13z7\x18\ +\x04\x01\x00W'\x11\xf8}E\xf4\x85S\xf7\x86R\xa1\ +H\x1f\xa7K!\xbeiB \x0e\x06)\x12\x08\xd5u\ +I\xd3_)\xd5`*W'\x11\xcdrH\xc6mD\ +\xf2\x82O\xf7~G\xa0G\x1f\xf7x>\xb6e@\xcc\ +\x5c(\x98D\x1e\xf8\x7fHK!\x0e\xe6|K\x97R\ +4\xf7w=\xcf])\xf6\x83O\xf7|C\xf7v;\ +\xf8\x80I\xee\x82Q\xf7|D\xe8\x7fO\xf7\x7fG\xd0\ +tI\xe4~O\xe8h.\xddxI\xf7u:\xdf{\ +N\xe9i.\xf7y@\xf7y@\xf7o1\xff\xff\xff\ +\xf8}E\xf6n0\xf5n0\xfe\xfe\xfe\xfe\xf0\xea\xea\ +i.\xf7p2\xfa\xf0\xec\xfc\xf6\xf3\xf7x>\xfe\xf3\ +\xee\xe3{K\xdfg0\xf8\x8d\x5c\xfb\xbd\xa1\xf6\x7fI\ +\xfc\xce\xb9\xf8\xeb\xe5\xfe\xfc\xfb\xf4m0\xe6\x83V\xe3\ +\x81T\xe3\x81U\xfb\xf5\xf2\xf9\x9cr\xe2\x89`\xfb\xf5\ +\xf3\xfb\xc9\xb2\xf1\xa8\x86\xefm1\xf0\xd4\xc7\xfc\xf5\xf1\ +\xe5r>\xfd\xf9\xf8\xf9\xf0\xeb\xe6\x82U\xe5\x90i\xfc\ +\xd8\xc8\xf6o1\xe5r=\xf6n1\xf1\xd6\xc9\xf9\x9a\ +n\xfd\xfa\xf8\xf1\xa5\x82\xe4\x91j\xf0k/\xe2\x89a\ +\xf0l1\xfb\xc7\xaf\xe9\xba\xa4\xf0l/\xe3\x97t\xe2\ +|M\xfc\xd6\xc5\xe4g/\xf7\xe8\xe1\xf8\xeb\xe6\xf9\xc2\ +\xa8\xe2}N\xf8\x81K\xe4\x9ay\xf7v<\xf8\x85Q\ +\xe9\xb8\xa2\xe4g.\xfe\xfa\xf8\xf7v;\xfe\xf7\xf4\xfc\ +\xf7\xf4\xf8\xbd\xa3\xf7\xe7\xe1\xfe\xfa\xf9\xe4\xaa\x8f\xf8\xec\ +\xe6\xfa\xae\x8c\xf7o2\xe5\xac\x92\xfe\xf9\xf7\xf7{C\ +\xfc\xcd\xb8\xfa\xa6\x80\xfa\xb7\x99\xfc\xd2\xbf\xf7zB\xf9\ +\xa3|\xfd\xea\xe1\xf5\xe3\xdb\xfd\xec\xe3\xfc\xd7\xc6\xfd\xdd\ +\xce\xfa\xaf\x8d\xfe\xf2\xed\xfc\xd9\xc9\xfa\xae\x8b\xe1\x96s\ +\xe3\xa9\x8e\xfe\xf2\xec\xdfxH\xfd\xfa\xf9\xe1\x97t\xdf\ +vF\xf6\xe7\xdf\xf9\xa4}\xe3\xa8\x8d\xfa\xf1\xed\xfe\xee\ +\xe7\xe2\x8bc\xfa\xb5\x96\xfe\xfc\xfc\xe2\x8ce\xfe\xed\xe6\ +\xfd\xfb\xfa\xf2\xad\x8d\xfd\xdf\xd1\xfe\xf8\xf6\xfe\xef\xe9\xe2\ +\xa5\x8a\xed\x95l\xf1\x82O\xf4\xc2\xab\xf9\x95g\xf8\x8c\ +Z\xed\x97p\xef\x98q\xe2\xa3\x87\xf8\x8c[\xe0\x89b\ +\xfd\xe0\xd2\xf1\x81N\xf2\xac\x8c\xf9\x96i\xf4\xc3\xad\xfc\ +\xcf\xba\xef\x99q\xfe\xf9\xf6\xe0\x89a\x19\x07\xe4\xa6\x00\ +\x00\x00_tRNS\x00\xe1$\xb1c\x08\xfc\xfe\xe9\ +\x12a#\x07\xaf\xe2\xe2\x03d\xa0\x02\x05%\xb2\xfe\xe1\ +\xfd\xfdb\x94$D\x08\x93\xebC\x89\x06\x05\xea\xb0\x02\ +\xea\x028\xa2CeB\x87\x056\xfeY[\x88\x89\x11\ +\x01\x01\x14\xd7\xd9-;\x13\x5c\xcc~\xe3\x10\xce|\xcf\ ++2\x01\xe4\xcf^\xc5\xf6\xcd9\xc37\xca<.\xe0\ +1\xf7-\xdf\xe8\xe7\xfe\x08\x05\xdf\x00\x00\x01\xfbID\ +AT8\xcbc`\xa0\x220\x11O\x84\x02cSl\ +\xf2!\x01\xf1p\x10\x15\x84.\xeb\x1a\x16\x1d\x17\x8f\x04\ +b\xc3\xed-\x90\xe5\x1d\x02\x97d\xc5\xa3\x80\xac\xf9\x1e\ +\xd6H\x0aB\xe3\xb1\x00'$\x051\xf1\xf1[\xb7\xef\ +\xdb\x9f\xb7mcvv\xe1\x89\xbc=\xbbwn\x88\x8f\ +\x8f@\xc8G\xb2\xc5\xc7oI@\x01\xbb\xd6\xc6\xb3y\ +\xc1\x15\x04\xc7\xc7o\x02\x0a\x16\xa7@e\x8f\x00\x19k\ +\xe2\xe3\xfd\xbd\xa1\xf2\x8e\xe9\xf1s\x97&\x1c?\x9a{\ +\xecdQBB\xd1\xc1\xc3\xb9\x07v$,^\x10\x9f\ +\xee\x07U\xe0\x12\x1f?\x1d\xa4\xf1P~\xc1\xe3\x84\x84\ +K\x05\xf9{A\xbc\xb6\xf8x\x1f\xa8\x02\xb7\xf8\xf8\x06\ +\x88\xd9\x0f\x0b\x13\x12\x9e]\x86\xb03\xdb\xe3}\xa1\x0a\ +\xdc\xe3\xe3[\x9b\xc0\x82O\xaf&$\xa4\xde\x043{\ +\xfa\xe2\xe3\x9d\xa1\x0a<\xd9\xe3\x93\xab*@\xa2wA\ +\xc4s\x10Q=!9\x9e\xdd\x0e\xaa\xc0\xd2&>>\ +\xa9\xac9!!\xe5\xc6\x83{\xd7^>:\x97\x90\x90\ +Q\x9e\x14\x1fok\x05\xf3\xa6\x190\xdc\x92Z\x80\xfa\ +R\xef\xc7\xc7\xdfN\x052J\x81\xf2\xf1\xe6\xf0p0\ +\x02\x85l7\xc8\xe4\x17On]\x01\xd1\x95 \x11m\ +\xb8\x02a\x09 w\x12H\xa2\xf8\xce\xf5\x8b \xba\x06\ +(\xc0/\x80\x08k\x05 \xbf\x17(~\xea|I\xc9\ +\x99\x0c \xa3\x16( \x83\x14Y\xfa@\xfe\xc4\x85\xab\ +\xd7\xe5\x9c\xbdpzs\xce\xaaY\x93\xeb\x80\x02\xbaH\ +\x0aT5\x81\x02S\x16-_\x0f2~\xe5\xec\x19\xfd\ +@\xae\xa2\x0ar\x8a\x11\x029*i\xde2p\x10N\ +\x05y!^\x07%\xc9)I\x81\xc4\x92\xe7\xacHH\ +\x989-\x19\xc4\x96\x94CQ\xa0a\xc0\x0e6\xa3\xa3\ +\xbe\xab\xb1\x13\xc4bW\xd6BM\xb5\x86,\x1c\xe0t\ +\x96\x96\x06\xa6\xd4\xf4D0\x92\xbd\xac:;,5\xb2\ +\x8b\x89b\xcb\x18\xf2\xd2\x10C\xe29\x04Yq\xe4-\ +n^\xa0!\xec\xccL\xb8s\x1f\x0f\x17#\x1f\x0b+\ +\xde\x0c\xca\xc9Ij\x96\x06\x00\xfd\x98\xe6y\x07\xbeQ\ +(\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x05}\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x03\x00\x00\x00D\xa4\x8a\xc6\ +\x00\x00\x02\xe2PLTEGpL\xfc\xceI\xfc\xce\ +I\xec\xc1D\xdcJ=\xdcJ=\x0f\x93S\xfc\xceI\ +\xfc\xceI\xfc\xceI\x9e5,\xdbI<\x0f\x98V\xf4\ +\xc7F\x0cvC\x96{+\xdcJ=\x0buB\xf6\xc9\ +G\x10\x9dY\xdbI<\xcf\xa9<\xdbI<\x10\x9dY\ +\xdcJ=\x9f\x82.\x0ac8\x86-%\x9e5,\x10\ +\x9dY\xbc\x996\xdcJ=\x0f\x99V\xbd\x9b7\x10\x9d\ +Y\x0d\x81I\x0f\x98V\x10\x9dY\xb7=2\xdcJ=\ +\x10\x9dY\xb7=2\xf5\xc8G\x09]5\xdbJ<\xdc\ +J=\xb6=2\xdbI<\xaa\x840\xf0\xa0D\xdaJ\ +<\xb6=2\x0bk=\x10\x9dY\xdcJ=\xc3A6\ +\x5c9(\xdcJ=\x10\x9dY\xc3A6\xdcJ=\x18\ +\x98W\x10\x9dY\xdcJ=\xdcJ=\xf1\xc5E\x0f\x9b\ +W\xf9\xcbH\x10\x9dY\x9d4+\x0ac8\xdcJ=\ +\xd9I<\xc3A6\xd9I<\xc3A6\x9d4+\x10\ +\x9dY\xfc\xceI\x0d\x82J\x0e\x91R\x0d\x80H\x0e\x90\ +R\x0e\x95T\x0ah;\x8f\xcc\xae\xeb\xed\xee\xfc\xceI\ +4\xa1hE~L\x13\x9bX\xa5\xa2\x8c}gC\xa0\ +\x83.`rG\xa8E3\xbdA3\x1d\x96V\xe8\xbd\ +C\xd1\xab<\xa7\x880\xcd\xa8;\xea\xbfC\x0f\x9cX\ +\x0f\x9cX\x94y+\x09\x5c4\xbf\x9c7\xdc\xb4?\x0c\ +wC\x10\x87L\x9a\xa6D\xd9\xb1?\xdcJ=F\x87\ +\xf3\xfc\xceI\x10\x9dY\xfb\xcdH\xc7\xd7\xf1\xe9\xb5\xb0\ +\xddTH\xde\xe5\xf1F\x87\xf2\x0e\x94T\x0f\x9bXG\ +\x85P\xed\x96?\xeb\x94<\xb9WA\xee\x9aB\xdbI\ +<\xf6\xde\x97\xf9\xc9D\xdaH;\xf6\xde\x99M\x8b\xf2\ +\x15\x9e\x5c\x9b]A\xb4\xda\xc8\xdfcX_\x96\xf2\xc1\ +\xd3\xf1\xf6\xc2>\xc0\xd2\xf1\xcf\xdc\xf1\xf8\xd9\x81\xef\xef\ +\xf0\xea\x91:\xe5\x96\x8f\xfb\xd0S\xf8\xd8|\x84\xc8\xa7\ +\x16\x9f]\xd9G:\xcc\xda\xf1/\x8eS\xe9\x908\xe8\ +\xae\xa9\xaa\xc5\xf1\xe8\x8e7\xf2\xba7\xe8\xb0\xa7`\x97\ +\xf2\xcdA5\xe1\xe7\xf1\xf1\xef\xea\xfb\xcfO\xe6\x91I\ +\xe7\x8b4\xad\xc6\xf1\xc2\xd4\xf1\xf0\xef\xed\xef\xd5\x9b\xee\ +\xb45\xe8\xa5\x86\xd8\xe2\xf1\xd0\xdd\xf1J\x89\xf2\xd8F\ +:\xdb\xe3\xf1\xf0\xb73\xf4\xbf>\xe7\x8c5U\x90\xf2\ +\xa1\xbf\xf1\xe6\x8a3\xed\xd2\xd0\xf6\xe0\x9f\xef\xb41\xf8\ +\xc7Bn\xa0\xf2x\xa6\xf2\xf0\xe0\xbd\xc66-\xd7E\ +9\xcc<1\xde\xa6\xa2[\x94\xf2\xd9\x8b\x86\xbf\xd2\xf1\ +G\x88\xf2h\x9c\xf2\xe7\xed\xea\xa0\xbf\xf1\xed\xee\xf0\x1e\ +\xa2b\xf1\xee\xe5\xd9^T\xdd\xa3\x9f\xc6\xd6\xf1\xc99\ +/\x91\xb4M\x1c\x95Q\x0e\x95T[\xb8\x8b\xe8\xc9I\ +\x15\x8cSy\xc3\x9f\x0f\x98V\x10\x8cN\xe1\xe9\xe5\xb7\ +\xcd\xf1{\xc5\xa1\xd2\xdd\xf1\x0d\x8bN\xdf\xe6\xf1L\x9b\ +L\xf2\xdc\x92Z\x93\xf2p\xb4\x93o\xa9M\x0f\x9cX\ +R\xa8~\xd2\xc2J\xb4\xcb\xf1~\xa9\xf2\xda\xe3\xf1\xb4\ +\xb8J\x0e\x8eP\xf7\xcdJ\xbf\xd3\xb3y\xa6\xf2\xf6\xcc\ +I1\x9fS\xb3\xbdMN\xa9TT\xbb$\xa6\x00\x00\ +\x00qtRNS\x00\xb4\xf6l\xde||\xa5\xcc\xdb\ +\x09aZQ\x11\x04\xbe\x10Q\xe6e\x14j\xd6\xe6\x04\ +\x09\x02\x0c\xd5\x0b\xeaa\x0b\xb0\x1be\xb4\x17\xb4\xe1\x11\ +U\x06\xbe\xc4\x17k\x06\xe1Z\x10\x0c\xea\xd6\x22\x02\xd5\ +\xc4\x1b\xb0k\xfc\xc9\xfcUk[\xc9\x11\x11\xfdkH\ +jE\x14\xfd\xb9HkEj[\x14\xfe\xfe\xf8\xfd\xfe\ +\xfe\xfe\xfe\x07\xfe\xfe\xfe\xfeZ8\x096[\xb9\xf8\x07\ +\x096l8\x5cmZFt#+\x00\x00\x01\xd9I\ +DAT8\xcbc` \x05\xf8xz\xb0\xb2zy\ +\xbbb\x97\x95\xd1\xb7w/\x04\x03\x07]\x11.\x0ci\ +i1\xf9B$ \xc1\x8d&\xaf&P\x88\x06\xd45\ +\x91\xe5\xcdY\x0a1\x80\x995B^\x0f\x8b|a\xa1\ +\xa51L\xdeB\xa7\x10+\xb0\x81)\xb0mh\xc2\xae\ +\xc2\x08\x22obZ\xdb\x0a\x15\xe9\x9e2w\xe1\xba\xe5\ +;Wl\x9b?gr}]\xa3\xa1\x01X\x81SI\ +I\xe7L\x90tE\xf9\xa4\xb2y+7\xac^\xb3v\ +\xcf\x96\x05}-\xa5\xa5\xc5\xce`\x05.%%\xb3\x17\ +o\x02\xca\xef*\xeb)\x02\x82}\xeb\x0fl\xdd[Z\ +\x0c\x02~ \xf9\x10\xdf\x92\x92\x92\x98\xc3\x87\x0a\xcb/\ +n,\x02\x83\xed\x9bw\x17C@x\x0aP\x81?P\ +\xbe$1\xe1\xd2\xf93G\x8b\xa0`\xff\xd2\xa9P\x15\ +\xc9@\x05\x01 \x05%q\x07\x8f\x1d\x87\xc9\x17UU\ +N\x84*H\x03*`\x03+\x88\x8a?r\x1a\xae\xa0\ +\xa8\xbf\x0d\xaa\x80\x19\xae\xa0$\xf2\xc2\x0e\x84\x82\xdef\ +$\x05A\x10\x05%\xd1\xab\xe0\xf2'\x96L\x83*H\ +\x02*\x08\x84*\x88\x08[\x04S\xf0\xfa\xdc2\xa8\x82\ +T\xa0\x027;\xa8\x8a\xd0Y\xed\x10\xf9'\x0f\x1fC\ +\xe5\x99bA\x01a\x05U0\xa3k\xc2I\x90\x17>\ +V~x\x0fU\xc0\x08\x0eI\x15\xa8\x82\x92\x8e\xe9\xa7\ +\xee\xbf\xba\xfb\xe6\xce\xd3\xb7P\xf9b-\xb0\x02)a\ +\x98\x8a\x92\xb3\xd7\xee\xdd|q\xe3\x11L\x9eS\x12\x12\ +\x9d\x0a%H\xe0\xd6\x83\xdb/a\x0a\x84`\x09B\x15\ +I\xc1\xd5w\xcf`\xf2\xec\xf0$\xc7'\x8ePP}\ +\xe5:T\x9eC\x11\x91(\x95ea\xf2\xcf\xab/\xc3\ +\xe4E\x91\x93\xb5\xa0\x12TA\xcd\xe7OP\xf3\xe5\xd0\ +r\x06\x8f\x06D\xc1\x17\x88\xfby1\xb3\x9evpz\ +FI\xc9WP\xf81:\xf2c\xcf\x9eY\xb9y\xf9\ +9\x05\xd9\x99$\xe5x\x00\xfe\xa1E\xc6\x0b}\xa2(\ +\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x06v\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x03\x00\x00\x00D\xa4\x8a\xc6\ +\x00\x00\x00\x09pHYs\x00\x00\x0e\xc4\x00\x00\x0e\xc4\ +\x01\x95+\x0e\x1b\x00\x00\x03\x00PLTEGpL\ +C\x96\xbbs\xdeB'W\x9e#[\xa70\x81\xd51\ +\x84\xdb!U\x9f9tr%H\x8c)E\x8c*G\ +\x92`\xbb>'H\x8f.~\xda(E\x87f\xc5D\ +1\x83\xdb5\x83\xbcP\xb1\xe20WuV\xc0\xf03\ +}\xb0 J\x8a N\x94s\xdeBS\xa4Rs\xde\ +C/\x80\xd2,z\xdar\xdaD,E\x901\x84\xd8\ +\x22C\x86o\xd7K+s\xcfX\xc2\xe4,x\xdaY\ +\xb9\x95h\xce{h\xd2\x83d\xcd\x97g\xd0\x8b-y\ +\xc9Z\xbe\xad#O\x96'L\x95P\xb3\xe4$K\x92\ +p\xdaU_\xc8\xbeZ\xb0NU\xa48e\xc39$\ +O\x99d\xcd\x9e,y\xcd0\x81\xdbq\xdaG\x22Q\ +\x9at\xdeAt\xdfBq\xdbO^\xbaZo\xd9Z\ +`\xc2yk\xd4v'K\x92b\xcb\xab-y\xd1V\ +\xbf\xf3(P\x9f!J\x8a)>~t\xdeA(G\ +\x8bV\xbf\xf2'I\x8c+P\x9b*r\xc8\x22J\x8c\ +)H\x91#Q\x9d)H\x91/}\xd1'g\xa6&\ +d\xb4/|\xd1(i\xb8a\xc5~-M\x9f&c\ +\xb1,v\xce0J\xa26\x85\xba&U\xa2^\xc7\xc4\ +!\x5c\xa2V\xbf\xf1?\x90\xa1c\xca\x8e+t\xc1+\ +u\xc1\x5c\xc3\xb9E\x9b\xafV\xbf\xef^\xc3\x9c.|\ +\xdaF\xa1\xcb1j\xb7=\x90\xba-v\xb8V\xbf\xf2\ +K\xa6\xba<\x8e\xc1m\xd6jU\xbb\xdcK\xa8\xd3W\ +\xc0\xed.w\xbaX\xc1\xe71}\xbb,x\xd4W\xc0\ +\xeb>\x93\xc6V\xbc\xe0Q\xb4\xd9 P\x960{\xba\ +T\xb4\xbc$a\xa0n\xd7cY\xc1\xe3%h\xbaS\ +\xb8\xd9[\xc4\xd47\x87\xbfq\xdbM-/qp\xda\ +ST\xbb\xe9Z\xc3\xd83\x86\xdaW\xc0\xecW\xc0\xe9\ +Y\xc2\xdcP\xae\xc3L\xab\xcc;\x8e\xc00~\xc74\ +\x82\xbf,y\xda%Z\xa9(m\xc4!S\x9a'g\ +\xbe'h\xbe+x\xda*r\xd1+x\xda+w\xd9\ +2\x86\xdb3\x88\xdb0\x83\xdb3\x87\xdb\x1fK\x8c2\ +\x85\xdb\x1fN\x93/\x80\xdb\x1fQ\x99t\xdfA L\ +\x8f M\x91\x1fI\x8a\x1fO\x95q\xdbPX\xc1\xe5\ + J\x8b1\x84\xdb\x1fP\x97.\x7f\xda R\x9an\ +\xd8dq\xdcLo\xd9\x5cp\xdaV-|\xdar\xdc\ +J\x1fK\x8dY\xc2\xe1Y\xc3\xddk\xd5tl\xd6n\ +g\xd1\x8aa\xcb\xb0b\xcc\xabd\xce\x9d_\xc9\xb8i\ +\xd3\x82h\xd2\x86m\xd6jc\xcd\xa5`\xca\xb4s\xdd\ +Cp\xd9Y3\x88\xdap\xdaSs\xddFX\xc1\xe9\ +/}\xc8,z\xda3\x87\xdak\xd5rj\xd3|j\ +\xd4xi\xd3~W\xc0\xeff\xd0\x91g\xd0\x8e_\xc8\ +\xbcf\xcf\x94m\xd7ge\xcf\x96c\xcd\xa1s\xdcG\ +^\xc7\xc1n\xd8an\xd8_W\xc0\xea]\xc7\xc7\x5c\ +\xc6\xcc]\xc6\xc9W\xc0\xec\x5c\xc5\xd1\x5c\xc5\xce[\xc4\ +\xd53\x86\xd5Z\xc3\xda[\xc4\xd3/~\xceZ\xc4\xd7\ +1\x83\xd12\x85\xd8e\xce\x99s\xddD R\x9ca\ +\xcb\xa7_\xc8\xbf0\x80\xcd,w\xc4^\xc7\xc4/|\ +\xc5-x\xc01\x83\xd53\x88\xd9.{\xc2|7\x1f\ +\xe1\x00\x00\x00\xa1tRNS\x00\x16\xc1\x1a\xfd\xfe\xfe\ +\xfd\x04\xc12\x8d3\x80\xf8I.\xb7\xfd7\x09\xfd\xfd\ +\xfe\xfc\xcd\x0d\xa8g\xa0\xd9g\xbe\x0fX\xfd\xc9\xfe%\ +H\xfcXhG;\xd8\x9f?\xe3\xf7\xa5B\x1b$\xcc\ +\xf4B\xect\xe7\xb0\xec\xf4P\x84\x91\xe7\xae\xb8N\xac\ +\x91\xf5)\x80_\xe4v[:\xf4\x9a\xdf\x87\xfdF\xfd\ +\xfd\xfc\xf7o\xfc\xfdh\xfd\xbb\xf3\x12\xf2\xf9\xfd\xa2`\ +\xfd\xfc\xec\xfd\xe3\xfdm\xfd\xfd\xb6\xfd\xfd\x89\xfd#\xcd\ +\xfe\xf3\xfd\xfdz\xfc\xfe\xfd\xfd\xfdC\x1f\xf0\x86.\xe8\ +y\xfc\xca\x1f\x9b_\xa2\x9d\x93\xb6\xbdG\x8a\xbc\xcf\xd5\ +\xf5\x99Q\xfd\xba\xfc\xb2\xc9\x8b\xc8u|\x80\xe1\x00\x00\ +\x02oIDAT8\xcbc` \x010\xf6\xf4O\ +PQ\x99\xd8\xdb\xde(\x82MZ\xbf@\xf4\xc5\x85\x0d\ +{\xf7}x\xf7\xeay\x82\x91\x0e\x86n7\xd1\x1bO\ +\x80\xd2o_\xbf|\xf6\xf4\xe1\xed\xa3\x87\x5c\xd4P\xe4\ +\x85}n\xc0\xb5\xff\xfa~\xf4\xd4\xa1\xc3'\xcd5\x91\ +\xe5\x93P\xb5\x1f>y\xff\xc8\xbd\x9bZp\xf9\xd2L\ +t\xedG>\xdf\xb9uPC\x1d*\xcfQ\x86\xac\xfd\ +\xd4\xe1o \xed\x07\x8f\x1f\xbb\xea$\x05QP}a\ +CIN\x91\x90P\x5c^a:H\xfb}\x90\xf6c\ +\xd7\xaf\xed?P\x0c\xf1@EmM\xf9\xff\x8b?~\ +\xfc\xb8\xf8'?\x03\xae\xfd\xda\x95\x03w\x9b\xc1F\xb4\ +\xd4U\xfe\xfe\xf8\xe6\xdf\xbf\xb3\xff>\xfd}\xffS,\ +\x0b\xa8\xfd8H\xfb\x89m\x8fv(\x81\x5c\xd0\xd6p\ +\xf1\xcd\xd9E@\xb0d\xc9\xc2O\xac?\xc5R\xa0\xda\ +\xb7=>\xb3\xb3\x1b\xa8`R\xc7o\xb8\xfcBA\x99\ +\xb4\xd4d\xb0\xf6\xbb\x8fv\x9c9\xb7\xbe\x13\xa8`\xf2\ +\x9f\x8fg\xa1\xd2\xac\xb9 +C#\xc1\xdaw\xec<\ +\xb7~\xb7\x1c\x90?\xe5\xe2'\xa8|H<\xc4W\x8e\ +`\xed;\xd7o\xdf}^\x12\xc8\x9d\xf6\xe3\x1fXz\ +\x19+{\x14D\x81=D\xfb\xf6\x07_NK\x03\xb9\ +S?^\x06\xcb/\x8b\xde\x1a\x0bQ`\x0c\xd1\xfe\xe0\ +\xcb\xaaU _(|\x02Ko\x0a_\xf9\xd5\x1d\xa2\ +\xc0\x01\xa4}\xf7\xf9\xd3\xabV\xc9q\x00\xb9}\x0b\xc1\ +\xf2\x8b#V~\x0d\x02\xf1\x19\x04\x0c\xc1\xda\x81\xf2\xb6\ +\x02 \xbe\x0cHz\xd3\xe2\xc5,[\xb7n\xf5\x03\x09\ +\xf0\xd8A\xb4\xafb2\x05\x1b\xd8\xc4\x06\xd4\x0e\x04\xec\ ++\xb7n\xb5f\x06\x89\x98XI3I\xdax\xf1\xc0\ +\x22[\x01,\xbf\x02\xa8`\xe5J3E,\x89Q\x9b\ +\x0d(\xbdb\x05\xcb\xe6\x95+7o\xd6\xe5\xc2\xa2B\ +\x10$\xbf%l\xdd\xe6\xcd\x9b\xd7\xad\x93\xd0\x83)\x11\ +\x91\xe7\x86\xb2\x98-\x81\xf2[b\xd6\xac\x03\x82\xe5\xcb\ +\xd7\xac1p\xe6\xe6\x0d\x0e\xe4\x0c\x10\xe7\x87\x19a\xc1\ +\xb7e\xcb\x96],k\x96/\x07\xc9\xafY\xbdz\xcf\ +\x9e\xa5\x1b7\x8a\xfb\x22,q\xe5\xdb\xb5kWU\xfd\ +\x9a5\xcbA\xd2\xab\xf7,\x05\xc9\xf3\x22;\xc3?\x1b\ +\xa8BYb\xcf\xea\xd5P\xed\x1b=\xbcQ\x1d\x9a(\ +\xbb\xeb\xd2%e\xf6\x8dKA\x00\xa8\x9d\xd3\x13\xc3/\ +\xad\xb2\xd3UU\xe7\xcc\x12_\xbbv\xad8'?\xd6\ +\xcc\xab8s\xfe\xdc\x05\xf3f\xcf\x90\xef\x22%\xcb\x03\ +\x00/\xab\x8c\xa71\xf3a\xb4\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +" + +qt_resource_name = b"\ +\x00\x06\ +\x07\x03}\xc3\ +\x00i\ +\x00m\x00a\x00g\x00e\x00s\ +\x00\x14\ +\x0e^\x13\x87\ +\x00p\ +\x00o\x00l\x00i\x00c\x00i\x00e\x00s\x00_\x00g\x00e\x00n\x00_\x001\x002\x008\x00.\ +\x00p\x00n\x00g\ +\x00\x08\ +\x09n\x91\xb3\ +\x00b\ +\x00r\x00o\x00w\x00s\x00e\x00r\x00s\ +\x00\x0c\ +\x0fTN'\ +\x00b\ +\x00r\x00a\x00v\x00e\x00_\x003\x002\x00.\x00p\x00n\x00g\ +\x00\x0d\ +\x01\x97\x91\x87\ +\x00c\ +\x00h\x00r\x00o\x00m\x00e\x00_\x003\x002\x00.\x00p\x00n\x00g\ +\x00\x0b\ +\x02\xb2\x0c'\ +\x00e\ +\x00d\x00g\x00e\x00_\x003\x002\x00.\x00p\x00n\x00g\ +" + +qt_resource_struct = b"\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x02\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00@\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x01\x90\x5c\xbe[\x16\ +\x00\x00\x00t\x00\x00\x00\x00\x00\x01\x00\x00*\x0c\ +\x00\x00\x01\x8dk\xd3\x84\x86\ +\x00\x00\x00\x94\x00\x00\x00\x00\x00\x01\x00\x00/\x8d\ +\x00\x00\x01\x8dk\xd3\x84\x87\ +\x00\x00\x00V\x00\x00\x00\x00\x00\x01\x00\x00$\x8a\ +\x00\x00\x01\x8dk\xd3\x84\x84\ +" + +def qInitResources(): + QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) + +def qCleanupResources(): + QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) + +qInitResources() diff --git a/templates/brave.json b/templates/brave.json new file mode 100644 index 0000000..f3bcbc1 --- /dev/null +++ b/templates/brave.json @@ -0,0 +1,225 @@ +{ + "SingleValues": [ + { + "name": "AutofillAddressEnabled", + "values": { + "0": "禁止使用“自动填充”功能填写地址", + "1": "自动填充地址信息" + }, + "default_value": 0, + "display_name": "自动填充地址信息", + "allow_recommend": true, + "enabled": true + }, + { + "name": "AutofillCreditCardEnabled", + "values": { + "0": "禁止使用“自动填充”功能填写信用卡信息", + "1": "允许使用“自动填充”功能填写信用卡信息" + }, + "default_value": 0, + "display_name": "允许使用“自动填充”功能填写信用卡信息", + "allow_recommend": true, + "enabled": true + }, + { + "name": "DefaultGeolocationSetting", + "values": { + "1": "允许网站跟踪用户的地理位置", + "2": "不允许任何网站跟踪用户的地理位置", + "3": "每次网站尝试跟踪用户的地理位置时都询问我" + }, + "default_value": 2, + "display_name": "默认地理位置设置", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PasswordManagerEnabled", + "values": { + "0": "禁止使用密码管理器保存密码", + "1": "允许使用密码管理器保存密码" + }, + "default_value": 0, + "display_name": "允许将密码保存到密码管理器", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PaymentMethodQueryEnabled", + "values": { + "0": "始终告诉网站,没有任何已保存的付款方式", + "1": "允许网站检查用户是否有已保存的付款方式" + }, + "default_value": 0, + "display_name": "允许网站查询可用的付款方式", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PrivacySandboxAdMeasurementEnabled", + "values": { + "0": "为您的用户停用 Privacy Sandbox 广告衡量设置", + "1": "允许用户在其设备上开启或关闭 Privacy Sandbox 广告衡量设置" + }, + "default_value": 0, + "display_name": "选择是否可以停用 Privacy Sandbox 广告衡量设置", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PrivacySandboxAdTopicsEnabled", + "values": { + "0": "为您的用户停用 Privacy Sandbox 广告主题设置", + "1": "允许用户在其设备上开启或关闭 Privacy Sandbox 广告主题设置" + }, + "default_value": 0, + "display_name": "选择是否可以停用 Privacy Sandbox 广告主题设置", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PrivacySandboxPromptEnabled", + "values": { + "0": "不向用户显示 Privacy Sandbox 提示", + "1": "允许 Google Chrome 确定是否显示 Privacy Sandbox 提示" + }, + "default_value": 0, + "display_name": "选择是否可向用户显示 Privacy Sandbox 提示", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PrivacySandboxSiteEnabledAdsEnabled", + "values": { + "0": "为您的用户停用 Privacy Sandbox 网站建议采用的广告设置", + "1": "允许用户在其设备上开启或关闭 Privacy Sandbox 网站建议采用的广告设置" + }, + "default_value": 0, + "display_name": "选择是否可以停用 Privacy Sandbox 网站建议采用的广告设置", + "allow_recommend": true, + "enabled": true + }, + { + "name": "TorDisabled", + "values": { + "0": "开启 Tor", + "1": "禁用 Tor" + }, + "default_value": 1, + "display_name": "Tor", + "allow_recommend": false, + "enabled": true + }, + { + "name": "BraveRewardsDisabled", + "values": { + "0": "开启 Brave 奖励", + "1": "禁用 Brave 奖励" + }, + "default_value": 1, + "display_name": "Brave 奖励", + "allow_recommend": false, + "enabled": true + }, + { + "name": "BraveWalletDisabled", + "values": { + "0": "开启 Brave 钱包", + "1": "禁用 Brave 钱包" + }, + "default_value": 1, + "display_name": "Brave 钱包", + "allow_recommend": false, + "enabled": true + }, + { + "name": "BraveVPNDisabled", + "values": { + "0": "开启 Brave VPN", + "1": "禁用 Brave VPN" + }, + "default_value": 1, + "display_name": "Brave VPN", + "allow_recommend": false, + "enabled": true + } + ], + "ExtensionSettings": [ + { + "id": "cjpalhdlnbpafiamejdnhcphjbkeiagm", + "name": "uBlock Origin", + "description": "一款高效的网络请求过滤工具,占用极低的内存和 CPU。", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://clients2.google.com/service/update2/crx", + "enabled": true + }, + { + "id": "cfnpidifppmenkapgihekkeednfoenal", + "name": "TrafficLight", + "description": "Bitdefender TrafficLight adds a strong and non-intrusive layer of security to your browsing experience.", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://clients2.google.com/service/update2/crx", + "enabled": true + }, + { + "id": "ghgabhipcejejjmhhchfonmamedcbeod", + "name": "Click&Clean", + "description": "当浏览器关闭时,这款应用程序删除你的浏览历史,防止他人跟踪你的网上活动。", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://clients2.google.com/service/update2/crx", + "enabled": true + }, + { + "id": "aapbdbdomjkkjkaonfhkkikfgjllcleb", + "name": "Google 翻译", + "description": "浏览网页时可轻松查看翻译版本。由Google翻译小组提供。", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://clients2.google.com/service/update2/crx", + "enabled": false + }, + { + "id": "mlpapfcfoakknnhkfpencomejbcecdfp", + "name": "IP Domain Country Flag", + "description": "Shows country flag and other IP / domain information in the location bar.", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://clients2.google.com/service/update2/crx", + "enabled": false + } + ] +} \ No newline at end of file diff --git a/templates/chrome.json b/templates/chrome.json new file mode 100644 index 0000000..5f35e1b --- /dev/null +++ b/templates/chrome.json @@ -0,0 +1,181 @@ +{ + "SingleValues": [ + { + "name": "AutofillAddressEnabled", + "values": { + "0": "禁止使用“自动填充”功能填写地址", + "1": "自动填充地址信息" + }, + "default_value": 0, + "display_name": "自动填充地址信息", + "allow_recommend": true, + "enabled": true + }, + { + "name": "AutofillCreditCardEnabled", + "values": { + "0": "禁止使用“自动填充”功能填写信用卡信息", + "1": "允许使用“自动填充”功能填写信用卡信息" + }, + "default_value": 0, + "display_name": "允许使用“自动填充”功能填写信用卡信息", + "allow_recommend": true, + "enabled": true + }, + { + "name": "DefaultGeolocationSetting", + "values": { + "1": "允许网站跟踪用户的地理位置", + "2": "不允许任何网站跟踪用户的地理位置", + "3": "每次网站尝试跟踪用户的地理位置时都询问我" + }, + "default_value": 2, + "display_name": "默认地理位置设置", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PasswordManagerEnabled", + "values": { + "0": "禁止使用密码管理器保存密码", + "1": "允许使用密码管理器保存密码" + }, + "default_value": 0, + "display_name": "允许将密码保存到密码管理器", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PaymentMethodQueryEnabled", + "values": { + "0": "始终告诉网站,没有任何已保存的付款方式", + "1": "允许网站检查用户是否有已保存的付款方式" + }, + "default_value": 0, + "display_name": "允许网站查询可用的付款方式", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PrivacySandboxAdMeasurementEnabled", + "values": { + "0": "为您的用户停用 Privacy Sandbox 广告衡量设置", + "1": "允许用户在其设备上开启或关闭 Privacy Sandbox 广告衡量设置" + }, + "default_value": 0, + "display_name": "选择是否可以停用 Privacy Sandbox 广告衡量设置", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PrivacySandboxAdTopicsEnabled", + "values": { + "0": "为您的用户停用 Privacy Sandbox 广告主题设置", + "1": "允许用户在其设备上开启或关闭 Privacy Sandbox 广告主题设置" + }, + "default_value": 0, + "display_name": "选择是否可以停用 Privacy Sandbox 广告主题设置", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PrivacySandboxPromptEnabled", + "values": { + "0": "不向用户显示 Privacy Sandbox 提示", + "1": "允许 Google Chrome 确定是否显示 Privacy Sandbox 提示" + }, + "default_value": 0, + "display_name": "选择是否可向用户显示 Privacy Sandbox 提示", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PrivacySandboxSiteEnabledAdsEnabled", + "values": { + "0": "为您的用户停用 Privacy Sandbox 网站建议采用的广告设置", + "1": "允许用户在其设备上开启或关闭 Privacy Sandbox 网站建议采用的广告设置" + }, + "default_value": 0, + "display_name": "选择是否可以停用 Privacy Sandbox 网站建议采用的广告设置", + "allow_recommend": true, + "enabled": true + } + ], + "ExtensionSettings": [ + { + "id": "cjpalhdlnbpafiamejdnhcphjbkeiagm", + "name": "uBlock Origin", + "description": "一款高效的网络请求过滤工具,占用极低的内存和 CPU。", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://clients2.google.com/service/update2/crx", + "enabled": true + }, + { + "id": "cfnpidifppmenkapgihekkeednfoenal", + "name": "TrafficLight", + "description": "Bitdefender TrafficLight adds a strong and non-intrusive layer of security to your browsing experience.", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://clients2.google.com/service/update2/crx", + "enabled": true + }, + { + "id": "ghgabhipcejejjmhhchfonmamedcbeod", + "name": "Click&Clean", + "description": "当浏览器关闭时,这款应用程序删除你的浏览历史,防止他人跟踪你的网上活动。", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://clients2.google.com/service/update2/crx", + "enabled": true + }, + { + "id": "aapbdbdomjkkjkaonfhkkikfgjllcleb", + "name": "Google 翻译", + "description": "浏览网页时可轻松查看翻译版本。由Google翻译小组提供。", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://clients2.google.com/service/update2/crx", + "enabled": false + }, + { + "id": "mlpapfcfoakknnhkfpencomejbcecdfp", + "name": "IP Domain Country Flag", + "description": "Shows country flag and other IP / domain information in the location bar.", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://clients2.google.com/service/update2/crx", + "enabled": false + } + ] +} \ No newline at end of file diff --git a/templates/edge.json b/templates/edge.json new file mode 100644 index 0000000..f8bcce8 --- /dev/null +++ b/templates/edge.json @@ -0,0 +1,271 @@ +{ + "SingleValues": [ + { + "name": "AlternateErrorPagesEnabled", + "values": { + "0": "不会调用 Web 服务,并且将显示标准错误页", + "1": "使用 Web 服务针对网络错误生成 URL 和搜索建议" + }, + "default_value": 0, + "display_name": "找不到网页时建议类似页面", + "allow_recommend": true, + "enabled": true + }, + { + "name": "AutofillAddressEnabled", + "values": { + "0": "不会建议或填写地址信息", + "1": "使用以前存储的信息自动填写 Web 表单中的地址信息" + }, + "default_value": 0, + "display_name": "启用地址自动填充", + "allow_recommend": true, + "enabled": true + }, + { + "name": "AutofillCreditCardEnabled", + "values": { + "0": "不会建议、填充或推荐新的付款方式", + "1": "允许用户使用以前存储的信息在 Web 窗体中自动完成信用卡或借记卡等付款方式" + }, + "default_value": 0, + "display_name": "启用付款方式自动填充", + "allow_recommend": true, + "enabled": true + }, + { + "name": "AutofillMembershipsEnabled", + "values": { + "0": "无法在使用 Microsoft Edge 时自动保存其成员身份信息并用于填写表单字段", + "1": "自动保存其成员身份信息,并在使用 Microsoft Edge 时用于填写表单字段" + }, + "default_value": 0, + "display_name": "保存和填充成员身份", + "allow_recommend": true, + "enabled": true + }, + { + "name": "ConfigureDoNotTrack", + "values": { + "0": "不会发送请求", + "1": "始终向要求跟踪信息的网站发送 Do Not Track 请求" + }, + "default_value": 1, + "display_name": "配置 Do Not Track", + "allow_recommend": true, + "enabled": true + }, + { + "name": "ControlDefaultStateOfAllowExtensionFromOtherStoresSettingEnabled", + "values": { + "0": "无效果", + "1": "启用来自其他商店的允许扩展" + }, + "default_value": 1, + "display_name": "配置“允许来自其他商店的扩展”设置的默认状态", + "allow_recommend": true, + "enabled": true + }, + { + "name": "DefaultGeolocationSetting", + "values": { + "1": "允许网站跟踪用户的物理位置", + "2": "不允许任何网站跟踪用户的物理位置", + "3": "每当网站想要跟踪用户的物理位置时询问" + }, + "default_value": 2, + "display_name": "默认地理位置设置", + "allow_recommend": true, + "enabled": true + }, + { + "name": "DiagnosticData", + "values": { + "0": "关闭", + "1": "必需数据", + "2": "可选数据" + }, + "default_value": 1, + "display_name": "发送有关浏览器使用情况的必需和可选诊断数据", + "allow_recommend": true, + "enabled": true + }, + { + "name": "EdgeShoppingAssistantEnabled", + "values": { + "0": "不会自动针对零售域应用价格比较、优惠券、折扣和快速结帐等购物功能", + "1": "价格比较、优惠券、折扣和快速结帐等购物功能将自动应用于零售域" + }, + "default_value": 0, + "display_name": "已启用在 Microsoft Edge 中购物的功能", + "allow_recommend": true, + "enabled": true + }, + { + "name": "EdgeWalletCheckoutEnabled", + "values": { + "0": "用户在 Microsoft Edge 上购物时无法使用电子钱包结帐", + "1": "可以选择在 Microsoft Edge 上购物时是否使用电子钱包结帐" + }, + "default_value": 0, + "display_name": "启用电子钱包结帐功能", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PasswordManagerEnabled", + "values": { + "0": "无法保存并添加新密码", + "1": "可以在 Microsoft Edge 中保存并添加其密码" + }, + "default_value": 0, + "display_name": "允许将密码保存到密码管理器", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PaymentMethodQueryEnabled", + "values": { + "0": "禁止检查可用的付款方式", + "1": "可以检查用户是否保存了付款方式" + }, + "default_value": 0, + "display_name": "允许网站查询可用的付款方式", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PersonalizationReportingEnabled", + "values": { + "0": "禁止将浏览数据发送给 Microsoft", + "1": "允许将浏览数据发送给 Microsoft" + }, + "default_value": 0, + "display_name": "允许将浏览数据发送给 Microsoft", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PrimaryPasswordSetting", + "values": { + "0": "自动", + "1": "使用设备密码", + "2": "使用自定义主密码", + "3": "自动填充关闭" + }, + "default_value": 3, + "display_name": "配置要求用户在使用密码自动填充时输入设备密码的设置", + "allow_recommend": true, + "enabled": true + }, + { + "name": "RelatedMatchesCloudServiceEnabled", + "values": { + "0": "可以在受限网站上的“查找页面”中接收相关匹配项", + "1": "可以在所有网站上的“查找页面”中接收相关匹配项" + }, + "default_value": 0, + "display_name": "在“在页面查找”中配置相关匹配项", + "allow_recommend": true, + "enabled": true + }, + { + "name": "ResolveNavigationErrorsUseWebService", + "values": { + "0": "使用本机 API 尝试解决网络连接和导航问题", + "1": "使用 Web 服务执行网络连接测试" + }, + "default_value": 0, + "display_name": "启用使用 Web 服务解决导航错误", + "allow_recommend": true, + "enabled": true + }, + { + "name": "ShowMicrosoftRewards", + "values": { + "0": "禁用 Microsoft Rewards 体验", + "1": "开启 Microsoft Rewards 体验" + }, + "default_value": 0, + "display_name": "展示 Microsoft Rewards体验", + "allow_recommend": true, + "enabled": true + }, + { + "name": "TabServicesEnabled", + "values": { + "0": "不会向选项卡组织服务发送任何数据", + "1": "用户创建选项卡组或激活某些“组相似选项卡”功能时,Microsoft Edge 会将选项卡数据发送到其选项卡组织服务" + }, + "default_value": 0, + "display_name": "启用选项卡组织建议", + "allow_recommend": true, + "enabled": true + } + ], + "ExtensionSettings": [ + { + "id": "odfafepnkmbhccpbejgmiehpchacaeak", + "name": "uBlock Origin", + "description": "一款高效的网络请求过滤工具,占用极低的内存和 CPU。", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://edge.microsoft.com/extensionwebstorebase/v1/crx", + "enabled": true + }, + { + "id": "dacknjoogbepndbemlmljdobinliojbk", + "name": "Click&Clean", + "description": "当浏览器关闭时,这款应用程序删除你的浏览历史,防止他人跟踪你的网上活动。", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://edge.microsoft.com/extensionwebstorebase/v1/crx", + "enabled": true + }, + { + "id": "mhjnajgcbhkdhnfgcfjimgdddjjondoc", + "name": "IP Domain Country Flag", + "description": "Shows country flag and other IP / domain information in the location bar.", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://edge.microsoft.com/extensionwebstorebase/v1/crx", + "enabled": false + } + ], + "SearchEngines": [ + { + "number": "1", + "name": "Google", + "keyword": "google.com", + "is_default": true, + "search_url": "{google:baseURL}search?q={searchTerms}&{google:RLZ}{google:originalQueryForSuggestion}{google:assistedQueryStats}{google:searchboxStats}{google:searchFieldtrialParameter}{google:iOSSearchLanguage}{google:prefetchSource}{google:searchClient}{google:sourceId}{google:contextualSearchVersion}ie={inputEncoding}", + "enabled": true + }, + { + "number": "2", + "name": "Bing", + "keyword": "bing.com", + "is_default": false, + "search_url": "{bing:baseURL}search?q={searchTerms}&{bing:cvid}{bing:msb}{google:assistedQueryStats}", + "enabled": false + } + ] +} \ No newline at end of file diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..c226dbb --- /dev/null +++ b/utils.py @@ -0,0 +1,10 @@ +# coding: utf8 +import json +from pathlib import Path + + +def read_template(browser: str) -> dict: + filepath = Path(__file__).parent / "templates" / f"{browser}.json" + if not filepath.exists(): + return {} + return json.loads(filepath.read_text("utf8")) diff --git a/wg_browser_page.py b/wg_browser_page.py new file mode 100644 index 0000000..d377178 --- /dev/null +++ b/wg_browser_page.py @@ -0,0 +1,98 @@ +# coding: utf8 +from PySide6 import QtWidgets, QtCore +from utils import read_template +from gbx_setting import GbxSetting +from gbx_extension import GbxExtension +from gbx_search_engine import GbxSearchEngine + + +class WgBrowserPage(QtWidgets.QWidget): + + def __init__(self, browser: str, pre_path: str, parent=None): + super().__init__(parent) + self.browser = browser + self.pre_path = pre_path + + self.vly_m = QtWidgets.QVBoxLayout() + self.setLayout(self.vly_m) + temp = read_template(browser) + + self.gbx_settings = [] + self.gbx_extensions = [] + self.gbx_search_engines = [] + + if "SingleValues" in temp: + for setting in temp["SingleValues"]: + gbx_set = GbxSetting(setting, self) + self.vly_m.addWidget(gbx_set) + self.gbx_settings.append(gbx_set) + + if "ExtensionSettings" in temp: + for extension in temp["ExtensionSettings"]: + gbx_ext = GbxExtension(extension, self) + self.vly_m.addWidget(gbx_ext) + self.gbx_extensions.append(gbx_ext) + + if "SearchEngines" in temp: + self.bgp_search_engines_default = QtWidgets.QButtonGroup(self) + self.bgp_search_engines_default.setExclusive(True) + + for search_engine in temp["SearchEngines"]: + gbx_search_engine = GbxSearchEngine(search_engine, self) + self.vly_m.addWidget(gbx_search_engine) + self.gbx_search_engines.append(gbx_search_engine) + self.bgp_search_engines_default.addButton(gbx_search_engine.rbn_default) + + def get_recommended_settings(self): + recommended_settings = [f"[{self.pre_path}\\Recommended]"] + for wg_set in self.gbx_settings: + if wg_set.isChecked() and wg_set.allow_recommend and wg_set.cbx_recommend.isChecked(): + recommended_settings.append(f"\"{wg_set.name}\"=dword:0000000{wg_set.bgp_radios.checkedId()}") + if len(recommended_settings) == 1: + return "" + else: + return "\n".join(recommended_settings) + + def get_settings(self): + settings = [f"[{self.pre_path}]"] + for wg_set in self.gbx_settings: + if wg_set.isChecked(): + if (wg_set.allow_recommend and not wg_set.cbx_recommend.isChecked()) or (not wg_set.allow_recommend): + settings.append(f"\"{wg_set.name}\"=dword:0000000{wg_set.bgp_radios.checkedId()}") + if len(settings) == 1: + return "" + else: + return "\n".join(settings) + + def get_extensions(self): + path_head = f"{self.pre_path}\\ExtensionSettings" + extensions = [] + for wg_ext in self.gbx_extensions: + if wg_ext.isChecked(): + extensions.append(f"[{path_head}\\{wg_ext.id}]") + mode = wg_ext.cmbx_modes.currentData(QtCore.Qt.ItemDataRole.UserRole) + extensions.append(f"\"installation_mode\"=\"{mode}\"") + extensions.append(f"\"update_url\"=\"{wg_ext.lne_update_url.text()}\"") + if len(extensions) == 0: + return "" + else: + return "\n".join(extensions) + + def get_search_engines(self): + # 只生成推荐的 + path_head = f"{self.pre_path}\\Recommended\\ManagedSearchEngines" + search_engines = [] + i = 1 + for wg_se in self.gbx_search_engines: + if wg_se.isChecked(): + search_engines.append(f"[{path_head}\\{i}]") + is_default = "1" if wg_se.rbn_default.isChecked() else "0" + search_engines.append(f"\"is_default\"=dword:0000000{is_default}") + search_engines.append(f"\"keyword\"=\"{wg_se.lne_keyword.text()}\"") + search_engines.append(f"\"name\"=\"{wg_se.lne_name.text()}\"") + search_engines.append(f"\"search_url\"=\"{wg_se.lne_search_url.text()}\"") + i += 1 + if len(search_engines) == 0: + return "" + else: + return "\n".join(search_engines)