diff --git a/zip_build/!README.txt b/zip_build/!README.txt deleted file mode 100644 index ed775d9..0000000 --- a/zip_build/!README.txt +++ /dev/null @@ -1,2 +0,0 @@ -Any files placed in this directory will be lost during zip generation! -The qlyrx directory contains the files that make up your plugin and were used to create the zip file. diff --git a/zip_build/qlyrx.zip b/zip_build/qlyrx.zip deleted file mode 100644 index 2512416..0000000 Binary files a/zip_build/qlyrx.zip and /dev/null differ diff --git a/zip_build/qlyrx/__init__.py b/zip_build/qlyrx/__init__.py deleted file mode 100644 index 1387f43..0000000 --- a/zip_build/qlyrx/__init__.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -""" -/*************************************************************************** - qlyrx - A QGIS plugin - Apply Arcgis Pro .lyrx style - Generated by Plugin Builder: http://g-sherman.github.io/Qgis-Plugin-Builder/ - ------------------- - begin : 2019-04-09 - copyright : (C) 2019 by arc2qgis - email : dror.bogin@gmail.com - git sha : $Format:%H$ - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - This script initializes the plugin, making it known to QGIS. -""" - - -# noinspection PyPep8Naming -def classFactory(iface): # pylint: disable=invalid-name - """Load qlyrx class from file qlyrx. - - :param iface: A QGIS interface instance. - :type iface: QgsInterface - """ - # - from .qlyrx import qlyrx - return qlyrx(iface) diff --git a/zip_build/qlyrx/icon.png b/zip_build/qlyrx/icon.png deleted file mode 100644 index de230e2..0000000 Binary files a/zip_build/qlyrx/icon.png and /dev/null differ diff --git a/zip_build/qlyrx/metadata.txt b/zip_build/qlyrx/metadata.txt deleted file mode 100644 index 00e23cc..0000000 --- a/zip_build/qlyrx/metadata.txt +++ /dev/null @@ -1,39 +0,0 @@ -# This file contains metadata for your plugin. Since -# version 2.0 of QGIS this is the proper way to supply -# information about a plugin. The old method of -# embedding metadata in __init__.py will -# is no longer supported since version 2.0. - -# This file should be included when you package your plugin.# Mandatory items: - -[general] -name=qlyrx -qgisMinimumVersion=3.0 -description=Apply Arcgis Pro .lyrx style -version=0.1 -author=arc2qgis -email=dror.bogin@gmail.com - -about=Apply Arcgis Pro .lyrx style to vector layers in QGIS - -tracker=https://github.com/arc2qgis/lyrxtoqml/issues -repository=https://github.com/arc2qgis/lyrxtoqml -# End of mandatory metadata - -# Recommended items: - -# Uncomment the following line and add your changelog: -# changelog= - -# Tags are comma separated with spaces allowed -tags=python - -homepage=https://github.com/arc2qgis/lyrxtoqml -category=Plugins -icon=icon.png -# experimental flag -experimental=True - -# deprecated flag (applies to the whole plugin, not just a single version) -deprecated=False - diff --git a/zip_build/qlyrx/qlyrx.py b/zip_build/qlyrx/qlyrx.py deleted file mode 100644 index 83e63b8..0000000 --- a/zip_build/qlyrx/qlyrx.py +++ /dev/null @@ -1,1502 +0,0 @@ -# -*- coding: utf-8 -*- -""" -/*************************************************************************** - qlyrx - A QGIS plugin - Apply Arcgis Pro .lyrx style - Generated by Plugin Builder: http://g-sherman.github.io/Qgis-Plugin-Builder/ - ------------------- - begin : 2019-04-09 - git sha : $Format:%H$ - copyright : (C) 2019 by arc2qgis - email : dror.bogin@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -""" -from PyQt5.QtCore import QSettings, QTranslator, qVersion, QCoreApplication -from PyQt5.QtCore import * -from PyQt5.QtGui import * -from PyQt5.QtWidgets import * -from qgis.core import * -from qgis.utils import * -import json -import re -import qgis.utils - -# Initialize Qt resources from file resources.py -from .resources import * -# Import the code for the dialog -from .qlyrx_dialog import qlyrxDialog -import os -import os.path -from collections import OrderedDict - -capStyles ={"Round" : 32, "Square" : 1, "Butt": 0} -joinStyles = {"Miter": 0, "Bevel" : 64, "Round": 128} -point2mm = 0.352778 -paths_to_shapes_array = { - "Cross2" : {"paths" : [ - [ - [ - -0.5, - 0.5 - ], - [ - 0.5, - -0.5 - ] - ], - [ - [ - -0.5, - -0.5 - ], - [ - 0.5, - 0.5 - ] - ] - ]}, - "Line" : {"paths" : [ - [ - [ - 3, - 0 - ], - [ - -3, - 0 - ] - ] - ] - } -} - -circle_rings = { - "curveRings" : [ - [ - [ - 1.2246467991473532e-16, - 2 - ], - { - "a" : [ - [ - 1.2246467991473532e-16, - 2 - ], - [ - 0, - 0 - ], - 0, - 1 - ] - } - ] - ] - } - - - -class qlyrx: - """QGIS Plugin Implementation.""" - - def __init__(self, iface): - """Constructor. - - :param iface: An interface instance that will be passed to this class - which provides the hook by which you can manipulate the QGIS - application at run time. - :type iface: QgsInterface - """ - # Save reference to the QGIS interface - self.iface = iface - self.mb = self.iface.messageBar() - # initialize plugin directory - self.plugin_dir = os.path.dirname(__file__) - # initialize locale - locale = QSettings().value('locale/userLocale')[0:2] - locale_path = os.path.join( - self.plugin_dir, - 'i18n', - 'qlyrx_{}.qm'.format(locale)) - - if os.path.exists(locale_path): - self.translator = QTranslator() - self.translator.load(locale_path) - - if qVersion() > '4.3.3': - QCoreApplication.installTranslator(self.translator) - - self.dlg = qlyrxDialog() - - # Declare instance attributes - self.actions = [] - self.menu = self.tr(u'&qlyrx') - - # Check if plugin was started the first time in current QGIS session - # Must be set in initGui() to survive plugin reloads - self.first_start = None - - - def tr(self, message): - """Get the translation for a string using Qt translation API. - - We implement this ourselves since we do not inherit QObject. - - :param message: String for translation. - :type message: str, QString - - :returns: Translated version of message. - :rtype: QString - """ - # noinspection PyTypeChecker,PyArgumentList,PyCallByClass - return QCoreApplication.translate('qlyrx', message) - - - def add_action( - self, - icon_path, - text, - callback, - enabled_flag=True, - add_to_menu=True, - add_to_toolbar=True, - status_tip=None, - whats_this=None, - parent=None): - """Add a toolbar icon to the toolbar. - - :param icon_path: Path to the icon for this action. Can be a resource - path (e.g. ':/plugins/foo/bar.png') or a normal file system path. - :type icon_path: str - - :param text: Text that should be shown in menu items for this action. - :type text: str - - :param callback: Function to be called when the action is triggered. - :type callback: function - - :param enabled_flag: A flag indicating if the action should be enabled - by default. Defaults to True. - :type enabled_flag: bool - - :param add_to_menu: Flag indicating whether the action should also - be added to the menu. Defaults to True. - :type add_to_menu: bool - - :param add_to_toolbar: Flag indicating whether the action should also - be added to the toolbar. Defaults to True. - :type add_to_toolbar: bool - - :param status_tip: Optional text to show in a popup when mouse pointer - hovers over the action. - :type status_tip: str - - :param parent: Parent widget for the new action. Defaults None. - :type parent: QWidget - - :param whats_this: Optional text to show in the status bar when the - mouse pointer hovers over the action. - - :returns: The action that was created. Note that the action is also - added to self.actions list. - :rtype: QAction - """ - - icon = QIcon(icon_path) - action = QAction(icon, text, parent) - action.triggered.connect(callback) - action.setEnabled(enabled_flag) - - if status_tip is not None: - action.setStatusTip(status_tip) - - if whats_this is not None: - action.setWhatsThis(whats_this) - - if add_to_toolbar: - # Adds plugin icon to Plugins toolbar - self.iface.addToolBarIcon(action) - - if add_to_menu: - self.iface.addPluginToMenu( - self.menu, - action) - - self.actions.append(action) - - return action - - def initGui(self): - """Create the menu entries and toolbar icons inside the QGIS GUI.""" - - icon_path = ':/plugins/qlyrx/icon.png' - self.add_action( - icon_path, - text=self.tr(u'Apply lyrx symbology'), - callback=self.run, - parent=self.iface.mainWindow()) - # will be set False in run() - self.first_start = True - - - - def load_vectors(self): - """ - Populate the layer selection with vector layers only - """ - self.dlg.layer_select.clear() - layers = [layer for layer in QgsProject.instance().mapLayers().values()] - vector_layers = [] - for layer in layers: - if layer.type() == QgsMapLayer.VectorLayer: - vector_layers.append(layer.name()) - self.dlg.layer_select.addItems(vector_layers) - - - def enableQmlSaving(self): - if self.dlg.saveQmlCheck.isChecked(): - self.dlg.QMLSaveLocation.setEnabled(True) - self.dlg.qmlLabel.setEnabled(True) - else: - self.dlg.QMLSaveLocation.setDisabled(True) - self.dlg.qmlLabel.setDisabled(True) - - - def saveQML(self,layer): - try: - if(len(self.dlg.QMLSaveLocation.filePath())) > 0: - QmlPath = self.dlg.QMLSaveLocation.filePath() - layer.saveNamedStyle(QmlPath) - else: - self.mb.pushWarning('QML Not Saved','missing Path') - except Exception as e: - self.mb.pushCritical('Error',"Something went wrong with saving the QML, please send us the following error: {}".format(e)) - - - def read_lyrx(self, file=None): - with open(file, mode="r", encoding="utf-8") as json_file: - data = json.load(json_file) - return data - - - def getSymbolLayers(self, obj): - return obj['symbol']['symbol']['symbolLayers'] - - - def getSymbolHalo(self, obj): - halo = '' - if 'haloSymbol' in obj['symbol']['symbol']: - halo = obj['symbol']['symbol']['haloSymbol'] - return halo - - - def readValueDef(self, obj): - return obj['symbol']['symbol']['symbolLayers'] - - - def checkSymbolType(self, obj): - obj_arr = {} - sl_idx = 0 - count_disabled = 0 - for o in obj: - if not 'desc' in obj_arr : - obj_arr['desc'] = [] - type = o['type'] - if not type in obj_arr : - obj_arr[type] = 0 - obj_arr[type] = obj_arr[type] + 1 - o['sl_idx'] = sl_idx - obj_arr['desc'].append(o) - if 'enable' in o and not o['enable']: - count_disabled = count_disabled + 1 - #print('disabled layer') - sl_idx = sl_idx + 1 - #print(sl_idx) - obj_arr['layer_count'] = sl_idx - count_disabled - if 'CIMHatchFill' in obj_arr: - obj_arr['template'] = 'hatch' - obj_arr['template_hatch_num'] = obj_arr['CIMHatchFill'] - else: - obj_arr['template'] = 'simple' - - if 'CIMLineSymbol' in obj_arr: - obj_arr['template_line_num'] = obj_arr['CIMLineSymbol'] - if 'CIMSolidFill' in obj_arr: - obj_arr['template_solid_num'] = obj_arr['CIMSolidFill'] - if 'CIMSolidStroke' in obj_arr: - obj_arr['template_stroke_num'] = obj_arr['CIMSolidStroke'] - if 'CIMCharacterMarker' in obj_arr: - obj_arr['template_font_num'] = obj_arr['CIMCharacterMarker'] - - return obj_arr - - - def tweakHaloSymbol(self, layers, haloDef, layer): - if not haloDef == '': - #halo_symbol_def = checkSymbolType(haloDef[0]) - new_layer = layers[len(layers) - 1].clone() - new_layer.setSize(new_layer.size()*1.1) - symbolHalo = haloDef['symbolLayers'] - halo_symbol_def = self.checkSymbolType(symbolHalo) - hallo_arr = self.parseSolidFill(halo_symbol_def, layer) - newFillSymbol = hallo_arr[0] - newStroke = self.parseStroke(halo_symbol_def, newFillSymbol, layer) - #for h in symbolHalo: - #print("halo symbol layer is " + h['type']) - if newFillSymbol != '': - new_layer.setStrokeColor(newFillSymbol.color()) - new_layer.setStrokeWidth(0.5) - if not newStroke == '': - #new_layer.setColor(newFillSymbol.color()) - new_layer.setStrokeColor(newStroke[0].color()) - layers.append(new_layer) - return layers - - - def parseSymbolLayerSolidFill(self, layers): - colors = [] - for l in layers: - if l['type'] == 'CIMSolidFill': - temp_color = l['color']['values'] - new_color = self.colorToRgbArray(temp_color, l['color']['type']) - colors.append(new_color) - return colors - - def generalise_geom_type(self, layer): - geometry_type_str = QgsWkbTypes.displayString(int(layer.wkbType())) - geometry_type = layer.wkbType() - geometry_general_type_str = geometry_type_str.replace('Multi', '').lower() - geometry_general_type_str = geometry_general_type_str.replace('string', '') - return geometry_general_type_str - - def parseRasterData(self, obj, layer): - #print(obj['colorizer']) - colorizer = obj['colorizer'] - renderer = '' - if 'Classify' in colorizer['type']: - print('classify') - self.parseRasterClassBreaks(colorizer, layer) - print("after parse rend") - elif 'Unique' in colorizer['type']: - print('unique') - self.parseRasterGroups(colorizer, layer) - print("after parse") - - #return renderer - #return '' - - def parseRasterGroups(self, obj, layer): - groups = obj['groups'] - renderer = '' - col_array = [] - val_array = [] - rampArray = [] - stats = self.getRasterLayerStats(layer) - print(stats) - min= stats.minimumValue - max = stats.maximumValue - initMin = False - classes = groups[0]['classes'] - - for gr in classes: - color = self.colorToRgbArray(gr['color']['values'], gr['color']['type']) - label = gr['label'] - col_array.append(color) - vals = gr['values'] if 'values' in gr else [] - val_arr = [] - for gr_val in vals: - val_arr.append(float(gr_val)) - rampArray.append(QgsColorRampShader.ColorRampItem(float(gr_val), color,label )) - - try: - fcn = QgsColorRampShader() - fcn.setColorRampType(QgsColorRampShader.Exact) - fcn.setColorRampItemList(rampArray) - cRamp = QgsPresetSchemeColorRamp(col_array) - fcn.setSourceColorRamp(cRamp) - - shader = QgsRasterShader() - shader.setRasterShaderFunction(fcn) - - renderer = QgsSingleBandPseudoColorRenderer(layer.dataProvider(), layer.type(), shader) - layer.setRenderer(renderer) - layer.renderer().setClassificationMin(min) - layer.renderer().setClassificationMax(max) - layer.renderer().shader().rasterShaderFunction().setColorRampItemList(rampArray) - layer.triggerRepaint() - print("after raster repaint") - - except Exception as e: - print(e) - - - def parseRasterClassBreaks(self, obj, layer): - classBreaks = obj['classBreaks'] - #print(classBreaks) - col_array = [] - val_array = [] - rampArray = [] - stats = self.getRasterLayerStats(layer) - min= stats.minimumValue - max = stats.maximumValue - initMin = False - for cb in classBreaks: - color = self.colorToRgbArray(cb['color']['values'], cb['color']['type']) - col_array.append(color) - val = cb['upperBound'] if 'upperBound' in cb else 0 - val_array.append(val) - label = cb['label'] - #print(str(val)) - if not initMin: - rampArray.append(QgsColorRampShader.ColorRampItem(val, color, label)) - initMin = True - if len(val_array) > 1: - rampArray.append(QgsColorRampShader.ColorRampItem(val, color, label)) - - try: - - fcn = QgsColorRampShader() - fcn.setColorRampType(QgsColorRampShader.Discrete) - fcn.setColorRampItemList(rampArray) - cRamp = QgsPresetSchemeColorRamp(col_array) - fcn.setSourceColorRamp(cRamp) - - shader = QgsRasterShader() - shader.setRasterShaderFunction(fcn) - - renderer = QgsSingleBandPseudoColorRenderer(layer.dataProvider(), layer.type(), shader) - layer.setRenderer(renderer) - layer.renderer().setClassificationMin(min) - layer.renderer().setClassificationMax(max) - layer.renderer().shader().rasterShaderFunction().setColorRampItemList(rampArray) - layer.triggerRepaint() - print("after raster repaint") - - except Exception as e: - print(e) - - #return '' - - def getRasterLayerStats(self, layer): - rend = layer.renderer() - provider = layer.dataProvider() - ver = provider.hasStatistics(1, QgsRasterBandStats.All) - stats = provider.bandStatistics(1, QgsRasterBandStats.All,layer.extent(), 0) - if ver is not False: - print("minimumValue = ", stats.minimumValue) - print("maximumValue = ", stats.maximumValue) - return(stats) - - def parseSolidFill(self, obj, layer): - symbol = "" - i = 0 - solid_index = -1 - for ls in obj['desc']: - if ls['type'] == 'CIMSolidFill' and ls['enable']: - temp_color = ls['color']['values'] - new_color = self.colorToRgbArray(temp_color, ls['color']['type']) - symbol = QgsSymbol.defaultSymbol(layer.geometryType()) - symbol.setColor(new_color) - ### TODO add lock - #print("solid index " + str(ls['sl_idx'])) - #symbol.setStrokeColor(new_color) - solid_index = ls['sl_idx'] if 'sl_idx' in ls else 0 - i = i + 1 - if i > 1: - print("Extra " + str(i) + " solid fills") - # Add default shape fill. - if symbol == '' or self.generalise_geom_type(layer) == 'line': - symbol = QgsSymbol.defaultSymbol(layer.geometryType()) - new_color = self.colorToRgbArray([255,255,255,0], 'CIMRGBColor') - symbol.setColor(new_color) - - #symbol['order'] = 0 - return [symbol, solid_index] - - - def parseLineCap(self, obj): - lineCap = 1 - #print(obj['capStyle']) - if 'capStyle' in obj: - lineCap = capStyles[obj['capStyle']] - return lineCap - - - def parseLineJoin(self, obj): - lineJoin = 1 - - if 'joinStyle' in obj: - #print(obj['joinStyle']) - lineJoin = joinStyles[obj['joinStyle']] - #print(lineJoin) - return lineJoin - - - def parseStroke(self, obj, symb, layer): - layers = [] - i = 0 - layers_obj = {} - firstWidth = 0 - firstColor = '' - geometry_general_type_str = self.generalise_geom_type(layer) - for ls in obj['desc']: - firstDash = False - if ls['type'] == 'CIMSolidStroke' and ls['enable']: - ## Check dash effects - dp = self.parseStrokeEffects(ls) - new_color = self.colorToRgbArray(ls['color']['values'], ls['color']['type']) - stroke_width = ls['width']*point2mm - cap = self.parseLineCap(ls) - join = self.parseLineJoin(ls) - stroke_order = ls['sl_idx'] if 'sl_idx' in ls else 0 - if i == 0 and dp == '' and not geometry_general_type_str == 'line': - #Change the first symbol layer stroke by layer type - symb.symbolLayer(0).setStrokeColor(new_color) - symb.symbolLayer(0).setStrokeWidth(stroke_width) - - cleanStrokeSymbol = symbol_layer = QgsSimpleLineSymbolLayer() - cleanStrokeSymbol.setColor(new_color) - cleanStrokeSymbol.setWidth(stroke_width) - firstWidth = stroke_width - firstColor = cleanStrokeSymbol.color() - cleanStrokeSymbol.setPenCapStyle(cap) - cleanStrokeSymbol.setPenJoinStyle(join) - ## Fix stroke offset - if not geometry_general_type_str == 'line': - cleanStrokeSymbol.setOffset(stroke_width/2) - - layers_obj[stroke_order] = cleanStrokeSymbol - else : - if (i == 0): - firstDash = True - # Add simple line symbol layer (stroke) - symbol_layer = QgsSimpleLineSymbolLayer() - symbol_layer.setColor(new_color) - symbol_layer.setWidth(stroke_width) - if firstWidth < stroke_width: - if symbol_layer.color() == firstColor: - if 0 in layers_obj: - layers_obj[0].setWidth(stroke_width) - if not geometry_general_type_str == 'line': - layers_obj[0].setOffset(stroke_width/2) - - symbol_layer.setPenCapStyle(cap) - symbol_layer.setPenJoinStyle(join) - ## Fix stroke offset - if not geometry_general_type_str == 'line': - symbol_layer.setOffset(stroke_width/2) - # Add dash pattern - if not dp == '': - #print("dp in " + str(i) + " stroke symbol") - symbol_layer.setUseCustomDashPattern(True) - symbol_layer.setCustomDashVector(dp) - symbol_layer = self.changeColorLock(symbol_layer, ls) - #print("stroke symbol idx is " + str(ls['sl_idx'])) - symb.appendSymbolLayer(symbol_layer) - layers_obj[stroke_order] = symbol_layer - i = i + 1 - return [symb, layers_obj, firstDash] - - - def parseStrokeEffects(self, obj): - dash_pattern = '' - temp_array = [] - if 'effects' in obj: - if obj['effects'][0]['type'] == 'CIMGeometricEffectDashes' : - temp_pattern = obj['effects'][0]['dashTemplate'] - for tp in temp_pattern: - temp_array.append(tp*point2mm) - dash_pattern = temp_array - return dash_pattern - - - def parseLineFill(self, obj, layer): - isDoubleHatch = False - isOffsetEqFirstWidth = True - symbol = "" - layers = [] - layers_obj = {} - i = 0 - first_width = 0 - prev_hatch = 0 - geometry_general_type_str = self.generalise_geom_type(layer) - for ls in obj['desc']: - if ls['type'] == 'CIMHatchFill' and ls['enable']: - #print(ls['sl_idx']) - sd_num = 0 - full_symbol_layer = '' - for sd in reversed(ls['lineSymbol']['symbolLayers']): - #print(sd) - symb_def = sd - #print("Line symbol sl num is " + str(sd_num) + "From " + str(len(ls['lineSymbol']['symbolLayers']))) - ## New definitions - angle = ls['rotation'] if 'rotation' in ls else 0 - temp_color = symb_def['color']['values'] - new_color = self.colorToRgbArray(temp_color, symb_def['color']['type']) - ## Hatch definitions - fill_width = symb_def['width'] if 'width' in symb_def else 1 - fill_width = fill_width*point2mm - fill_distance = ls['separation'] if 'separation' in ls else 0 - fill_distance = fill_distance*point2mm - if fill_distance <= 0.6 and not fill_distance == 0: - # TODO: add user interaction - print("QGIS problem with line fill small distances") - widthRatio = fill_width/point2mm/fill_distance - if widthRatio < 1: - widthRatio = 1/widthRatio - #print(widthRatio) - fill_distance = max(fill_distance*2,0.8) - fill_width = fill_width/point2mm*widthRatio - if fill_width > fill_distance: - # TODO: add user interaction - print("Fill width error") - - fill_offset = ls['offsetX'] if 'offsetX' in ls else 0 - #fill_offset = fill_offset*point2mm - ## Create symbol and set properties - symbol_layer = QgsLinePatternFillSymbolLayer() #if symbol_layer == '' else QgsSimpleLineSymbolLayer() - if sd_num == 0: - full_symbol_layer = symbol_layer - else: - symbol_layer = QgsSimpleLineSymbolLayer() - - dp = self.parseStrokeEffects(symb_def) - - symbol_layer.setColor(new_color) - if sd_num >= 0: - #print("before def") - if sd_num == 0: - symbol_layer.setLineAngle(angle) - symbol_layer.setLineWidth(fill_width) - symbol_layer.setDistance(fill_distance) - symbol_layer = self.changeColorLock(symbol_layer, ls) - else: - #symbol_layer.setAngle(angle) - try: - # TODO: add user interaction - print("Try width") - symbol_layer.setWidth(fill_width) - except: - # TODO: add user interaction - print("set width error") - - - if not dp == '': - #print("Dash pattern Fill is ") - #print(dp) - symbol_layer.subSymbol().symbolLayer(0).setUseCustomDashPattern(True) - symbol_layer.subSymbol().symbolLayer(0).setCustomDashVector(dp) - #print(symbol_layer.subSymbol().symbolLayer(0).__class__.__name__) - ## Tweak save the first hatch width and use as offset - # TODO: Real fix, mark problematic files and unusual offsets - if prev_hatch > 0 and sd_num == 0: - symbol_layer.setLineWidth(fill_width) - symbol_layer.setOffset(fill_width) - #isOffsetEqFirstWidth = fill_width == prev_hatch - isDoubleHatch = True - elif not fill_offset == 0 and not dp == '' : - symbol_layer.setOffset(fill_offset) - - if not sd_num == 0: - try: - full_symbol_layer.subSymbol().appendSymbolLayer(symbol_layer) - - except: - # TODO: add user interaction - print("Failed append subsymbol") - print(full_symbol_layer.__class__.__name__) - print(full_symbol_layer.subSymbol().__class__.__name__) - - sd_num = sd_num + 1 - - #print(full_symbol_layer.__class__.__name__) - layers.append(full_symbol_layer) - if 'sl_idx' in ls: - layers_obj[ls['sl_idx']] = full_symbol_layer - - if i == 0: - prev_hatch = fill_width - i = i + 1 - - - if len(layers) > 0: - return [layers, layers_obj] - else: - return symbol - - - def cmyk2Rgb(self, cmyk_array): - c = cmyk_array[0] - m = cmyk_array[1] - y = cmyk_array[2] - k = cmyk_array[3] - - r = int((1 - ((c + k)/100)) * 255) - g = int((1 - ((m + k)/100)) * 255) - b = int((1 - ((y + k)/100)) * 255) - - return [r, g, b] - - - def changeColorLock(self, sl, symbol_def): - color_lock = symbol_def['colorLocked'] if 'colorLocked' in symbol_def else '' - if not color_lock == '': - #print("locked") - sl.setLocked(True) - return sl - - - def colorToRgbArray(self, color_array, type): - opacity = 255 - if len(color_array) > 2 and type == 'CIMRGBColor': - opacity = color_array[3]/100*255 - new_color = QColor.fromRgb(color_array[0],color_array[1], color_array[2], opacity) - #print(opacity) - else: - new_color = QColor.fromRgb(color_array[0],color_array[1], color_array[2]) - if type == 'CIMHSVColor': - new_color = QColor.fromHsvF(color_array[0]/360,color_array[1]/100, color_array[2]/100,1) - elif type == 'CIMCMYKColor': - temp_color = self.cmyk2Rgb(color_array) - new_color = QColor.fromRgb(temp_color[0],temp_color[1], temp_color[2]) - return new_color - - - def parseSimpleRenderer(self, obj, layer): - - symbol = '' - symb_def = obj['symbol']['symbol']['symbolLayers'][0] - - if 'characterIndex' in symb_def and symb_def['type'] == 'CIMCharacterMarker': - symbol_ret = self.parseCharacterFill(symb_def, 0, layer) - symbol = symbol_ret[0] - - if symb_def['type'] == 'CIMVectorMarker': - vector_layers = self.parseVectorSymbolLine(symb_def, True, layer) - #print(vector_layers) - if not vector_layers == '': - vl_idx = vector_layers - for vl in vector_layers: - v_symb = vl[0] - v_ord = vl[1] - #allSymbolLayers[v_ord] = v_symb - symbol = v_symb - #print("After simple vector") - print(layer.geometryType()) - if layer.geometryType() == 2: - #print(obj['symbol']['symbol']['symbolLayers']) - #print(symb_def) - solid_array = self.parseSolidFill({"desc": [symb_def]}, layer) - #print(solid_array) - symbol = solid_array[0] - for sl in obj['symbol']['symbol']['symbolLayers']: - lines_ret = self.parseLineFill({'desc': [sl]} , layer) - #print(lines_ret) - if not lines_ret == '': - line_ret = lines_ret[0] - print("hatch number is " + str(len(line_ret))) - for line in line_ret: - try: - print("append layer") - solid_array[0].appendSymbolLayer(line) - except: - print(line.__class__.__name__) - - stroke = self.parseStroke({"desc": [symb_def], "sl_idx": 0}, solid_array[0], layer) - - if(stroke): - symbol = stroke[0] - if len(stroke[1]): - symbol.appendSymbolLayer(stroke[1][0]) - - return symbol - - - def parseCharacterFill(self, symb_def, max_size, layer): - #print(symb_def['sl_idx']) - ret_val = '' - symbol = QgsFontMarkerSymbolLayer() - symbol.setFontFamily(symb_def['fontFamilyName']) - symbol.setCharacter(chr(symb_def['characterIndex'])) - new_size = symb_def['size']*point2mm - symbol.setSize(symb_def['size']*point2mm) - geometry_general_type_str = self.generalise_geom_type(layer) - - if 'rotation' in symb_def: - new_angle = symb_def['rotation'] - negative_angle = new_angle < 0 - if (new_angle < 0 and new_angle <= -90) or new_angle == -45: - new_angle = abs(new_angle) - elif new_angle < 0 and new_angle > -90: - new_angle = new_angle - - if abs(new_angle) > 180: - new_angle = 360 - new_angle - if negative_angle: - new_angle = new_angle*-1 - #print("180 correction to " + str(new_angle)) - symbol.setAngle(new_angle) - - # Fix offset - rotation twaek - #symbol.setOffset(QPointF(0.3,0.0)) - #offset_tweak = (max_size - new_size)/2 if max_size > new_size else 0 - #print(offset_tweak) - #if offset_tweak > 0: - # symbol.setOffset(QPointF(0,0)) - #print(symb_def['characterIndex']) - # Check fill color - if 'symbol' in symb_def : - if 'symbolLayers' in symb_def['symbol']: - color = self.parseSymbolLayerSolidFill(symb_def['symbol']['symbolLayers']) - #print(color) - symbol.setColor(color[0]) - ## Check offset - offset_def = symb_def['anchorPoint'] if 'anchorPoint' in symb_def else '' - if 'x' in offset_def: - offsetX = offset_def['x']*point2mm - offsetY = offset_def['y']*point2mm - symbol.setOffset(QPointF(offsetX,offsetY)) - - ### TODO Fix offset after rotation - #print(symbol.markerOffsetWithWidthAndHeight(symbol, 8, 8)) - - if not geometry_general_type_str == 'point': - symbol_base = QgsPointPatternFillSymbolLayer() - if geometry_general_type_str == 'line': - symbol_base = QgsMarkerLineSymbolLayer() - ## Change to line symbol when diplacement is along line - if 'markerPlacement' in symb_def and 'type' in symb_def['markerPlacement']: - if symb_def['markerPlacement']['type'] == 'CIMMarkerPlacementAlongLineSameSize': - symbol_base = QgsMarkerLineSymbolLayer() - #print("Special fill " + geometry_general_type_str) - ## Fill pattern - if 'markerPlacement' in symb_def and 'stepX' in symb_def['markerPlacement']: - symbol_base.setDistanceX(symb_def['markerPlacement']['stepX']*point2mm) - symbol_base.setDistanceY(symb_def['markerPlacement']['stepY']*point2mm) - - marker = QgsMarkerSymbol() - marker.changeSymbolLayer(0, symbol) - symbol_base.setSubSymbol(marker) - ret_val = symbol_base - else: - ret_val = symbol - ret_val = self.changeColorLock(ret_val, symb_def) - - #join = parseLineJoin(symb_def) - #ret_val.setPenJoinStyle(join) - sym_ord = symb_def['sl_idx'] if 'sl_idx' in symb_def else -2 - return [ret_val, sym_ord] - - - def parseVectorSymbolLine(self, obj, simple, layer): - #print(obj) - vector_idx = 0 - vector_symbols = [] - vector_sl_array = [] - symb_idx = -1 - base_symbol = '' - order = '' - geometry_general_type_str = self.generalise_geom_type(layer) - if not 'desc' in obj: - obj['desc'] = [obj] - for ls in obj['desc']: - if ls['type'] == 'CIMVectorMarker' and ls['enable']: - - order = ls['sl_idx'] if 'sl_idx' in ls else -3 - if 'markerGraphics' in ls: - mg = ls['markerGraphics'] - #print("order is "+ str(ls['sl_idx'])) - #print(mg) - #print("mg len is " + str(len(mg))) - #if 'geometry' in mg[0]: - # print(mg) - placement = 1 - markerDistanceX = '' - markerDistanceY = '' - if 'markerPlacement' in ls and 'placementTemplate' in ls['markerPlacement']: - placement = ls['markerPlacement']['placementTemplate'][0] - #print("placement " + str(placement)) - placement = placement*point2mm - if 'markerPlacement' in ls and 'stepX' in ls['markerPlacement']: - markerDistanceX = ls['markerPlacement']['stepX']*point2mm - markerDistanceY = ls['markerPlacement']['stepY']*point2mm - - symbol_size = ls['size']*point2mm - - for mgs in mg: - #print(mgs) - if 'geometry' in mgs and 'x' in mgs['geometry']: - #print("geom is xy") - mgs_sl = mgs['symbol']['symbolLayers'] - vector_symbols = [] - #print(mgs_sl) - for sl in mgs_sl: - if sl['type'] == 'CIMCharacterMarker': - parsed_symb = self.parseCharacterFill(sl, 0, layer) - if not parsed_symb[0] == '': - symb_type = parsed_symb[0].__class__.__name__ - if 'MarkerLine' in symb_type: - parsed_symb[0].setInterval(placement) - else: - if not markerDistanceX == '': - parsed_symb[0].setDistanceX(markerDistanceX) - parsed_symb[0].setDistanceY(markerDistanceY) - vector_symbols.append(parsed_symb[0]) - if len(vector_symbols) > 1: - base_symbol = vector_symbols[0].clone() - vs_idx = 0 - for vs in vector_symbols: - if vs_idx > 0: - subSymbLayer = vs.subSymbol().symbolLayer(0).clone() - origFirstSubSymbLayer = base_symbol.subSymbol().symbolLayer(0).clone() - #print(subSymbLayer) - #print("append more") - base_symbol.subSymbol().appendSymbolLayer(origFirstSubSymbLayer) - base_symbol.subSymbol().changeSymbolLayer(0, subSymbLayer) - #print("Count sub: " + str(base_symbol.subSymbol().symbolLayerCount())) - vs_idx = vs_idx + 1 - vector_sl_array.append([base_symbol, order]) - else: - #print("append first") - vector_sl_array.append([vector_symbols[0], order]) - - else: - #print("geom is ") - #print(mgs['geometry']) - geom = mgs['geometry'] - ## Finding matching pattern - if 'paths' in geom: - for path_obj in paths_to_shapes_array: - #print(path_obj) - path_pattern = [] - for path_p in geom['paths']: - pair = [] - for path_pair in path_p: - #print(path_pair) - new_str = ",".join(map(str, path_pair)) - new_str = re.sub('[1-9]', '3', new_str) - new_str = new_str.split(',') - try: - new_str = [int(i) for i in new_str] - except: - new_str = [float(i) for i in new_str] - #print("no change") - #print(new_str) - pair.append(new_str) - - path_pattern.append(pair) - - alt_path_object = {"paths": path_pattern} - #print(alt_path_object) - if paths_to_shapes_array[path_obj] == geom or paths_to_shapes_array[path_obj] == alt_path_object: - #print("Found geom!!!!!!!!!!!!!!!!!!!!!!!!!!!!") - #print(QgsSimpleMarkerSymbolLayerBase.decodeShape(path_obj)) - shape_id, isShape = QgsSimpleMarkerSymbolLayerBase.decodeShape(path_obj) - main_sym = QgsMarkerLineSymbolLayer.create() - vect_symb = QgsSimpleMarkerSymbolLayer.create() - vect_symb.setShape(shape_id) - vect_symb.setSize(symbol_size) - #print(vect_symb) - main_sym.subSymbol().changeSymbolLayer(0, vect_symb) - main_sym.setInterval(placement) - vector_sl_array.append([main_sym, order]) - elif 'curveRings' in geom: - vect_symb = QgsSimpleMarkerSymbolLayer.create() - vect_symb.setSize(symbol_size) - #print(vect_symb) - if not geometry_general_type_str == 'point': - main_sym = QgsMarkerLineSymbolLayer.create() - main_sym.subSymbol().changeSymbolLayer(0, vect_symb) - main_sym.setInterval(placement) - vector_sl_array.append([main_sym, order]) - else: - vector_sl_array.append([vect_symb, order]) - #print(base_symbol) - #if not base_symbol == '': - # print(base_symbol.subSymbol().symbolLayerCount()) - if len(vector_sl_array) == 0: - vector_sl_array = '' - else: - #print(vector_sl_array) - print("vector array length " + str(len(vector_sl_array))) - return vector_sl_array - - - def parsePictureFill(self, obj, appendix): - pic_idx = 0 - svg_symbol = '' - symb_idx = -1 - for ls in obj['desc']: - if ls['type'] == 'CIMPictureFill' and ls['enable']: - #print("Picture url is " + ls["url"]) - url_data = ls['url'] - url_data_array = url_data.split(",") - plugin_path = os.path.dirname(os.path.realpath(__file__)) - svg_path = plugin_path+"\\img" - svg_paths = QgsSettings().value('svg/searchPathsForSVG') - if plugin_path not in svg_paths: - QgsSettings().setValue('svg/searchPathsForSVG', svg_paths + [plugin_path, svg_path]) - - template_f = open(plugin_path+"/img/svg_template.svg") - template_str = template_f.read() - template_str = str(template_str) - - template_str = template_str.replace("image_url", str(url_data)) - - f = open(str(pic_idx)+appendix + ".svg","w") - name = f.name - #print(name) - f.write(template_str) - #print(f) - template_f.close() - f.close() - svg_symbol = QgsSVGFillSymbolLayer.create() - svg_symbol.setSvgFilePath( name ) - #print(svg_symbol) - #print(svg_symbol.svgFilePath()) - new_color = self.colorToRgbArray([80,80,80,100], 'CIMRGBColor') - svg_symbol.setSvgFillColor(new_color) - svg_symbol.setSvgStrokeColor(new_color) - symb_idx = ls['sl_idx'] - pic_idx = pic_idx + 1 - - return [svg_symbol, symb_idx] - - - def unload(self): - """Removes the plugin menu item and icon from QGIS GUI.""" - for action in self.actions: - self.iface.removePluginMenu( - self.tr(u'&qlyrx'), - action) - self.iface.removeToolBarIcon(action) - - def getLabelField(self, labelObj): - label_exp = '' - if 'expression' in labelObj: - label_exp = labelObj['expression'] - return label_exp - - def parseLabels(self, labelSymbArr, labelExpArr, layer, layerId = 0): - #print(layerId) - #print(labelExpArr) - #print(labelSymbArr) - label = '' - labelExp = labelExpArr[layerId] - ## Parse label expression - by default - one label with brackets (VB syntax) - ##TODO: Generelize - if "[" in labelExp: - labelExp = labelExp[1:-1] - - labelParse = labelSymbArr[layerId][0] - labelSymbol = labelParse['textSymbol'] - - ## Init properties - try: - fontFamily = labelSymbol['symbol']['fontFamilyName'] if labelSymbol['symbol']['fontFamilyName'] else 'David' - fontSize = labelSymbol['symbol']['height'] if labelSymbol['symbol']['height'] else 12 - color = labelSymbol['symbol']['symbol']['symbolLayers'][0]['color'] - ptColor = self.colorToRgbArray(color['values'], color['type']) - fontWeight = labelSymbol['symbol']['fontStyleName'] if labelSymbol['symbol']['fontStyleName'] else 'Regular' - minimumScale = labelParse['minimumScale'] if 'minimumScale' in labelParse else '' - except Exception as e: - print(e) - - # Create label settings - label_settings = QgsPalLayerSettings() - # Create font settings - text_format = QgsTextFormat() - text_format.setFont(QFont(fontFamily, fontSize)) - text_format.setSize(fontSize) - text_format.setColor(ptColor) - text_format.setNamedStyle(fontWeight) -# buffer_settings = QgsTextBufferSettings() -# buffer_settings.setEnabled(True) -# buffer_settings.setSize(0.30) -# buffer_settings.setColor(QColor("black")) -# text_format.setBuffer(buffer_settings) - - label_settings.setFormat(text_format) - label_settings.fieldName = labelExp - - ## Default label placement - ## TODO: create conversion object to all placement properties - label_settings.placement = 1 - label_settings.centroidInside = 1 - label_settings.centroidWhole = 1 - ## Scale visibility - try: - label_settings.scaleVisibility = True if not minimumScale == '' else False - label_settings.minimumScale = minimumScale if not minimumScale == '' else 0 - except Exception as e: - print(e) - ## Label visibility - label_settings.enabled = True - label_settings = QgsVectorLayerSimpleLabeling(label_settings) - layer.setLabelsEnabled(True) - ## - #layer.setLabeling(label_settings) - - return label_settings - - def apply_lyrx_symbols(self, layer, lyrx_data, geometry_general_type_str): - simple_symbol = False - raster_symbol = False - label_symbol = False - layerDef = lyrx_data['layerDefinitions'] - renderer = '' - renderers = []; - renderers_symb_type = [] - dataset_names = [] - raster_data = '' - label_symb_array = [] - label_expessions = [] - labels = '' - - for p in layerDef : - #print(p) - if 'type' in p: - print(p['type']) - if p['type'] == 'CIMRasterLayer': - raster_symbol = True - raster_data = p - ## Check for renderers - temp_renderer = p['renderer'] if 'renderer' in p else '' - renderers.append(temp_renderer) - temp_label = p['labelClasses'] if 'labelClasses' in p else '' - label_symb_array.append(temp_label) - try: - label_expr = self.getLabelField(temp_label[0]) if len(temp_label) else '' - #print(label_expr) - if label_expr: - label_symbol = True - label_expessions.append(label_expr) - else: - label_expessions.append('') - ## Get lyrx shape type and original names - if not temp_renderer == '' and not raster_symbol: - rend_type = temp_renderer['symbol']['type'] if 'symbol' in temp_renderer else temp_renderer['defaultSymbol']['symbol']['type'] - renderers_symb_type.append(rend_type.lower()) - dataset = p['featureTable']['dataConnection']['dataset'] - dataset_names.append(dataset) - except Exception as e: - print(e) - print("there are " + str(len(label_symb_array)) + " label def") - - - # Find a renderer with the active layer field attribute - rend_to_check = [] - x = 0 - for r in renderers_symb_type: - #print(r) - if geometry_general_type_str in r: - rend_to_check.append(x) - x = x + 1 - - rend_idx = -1 - #print(rend_to_check) - ## Check in the active layers for matching classification fields - for z in rend_to_check: - #print(renderers[z]['fields'][0]) - #print(layer.fields()) - ## Check for matching column names - field_exist = layer.fields().indexFromName(renderers[z]['fields'][0]) - if field_exist > -1: - rend_idx = z - - # Check simple symbol - if rend_idx < 0 and not raster_symbol: - active_name = layer.sourceName() - rend_idx = dataset_names.index(active_name) - simple_symbol = True - - if rend_idx > -1 and not simple_symbol: - ## Create data arrays for symbols, labels, symbolLayers, halo options - categories = [] - allSymbolLayers = {} - class_field = renderers[rend_idx]['fields'][0] if len(renderers[rend_idx]['fields']) > 0 else 'CODE' - class_field2 = renderers[rend_idx]['fields'][1] if len(renderers[rend_idx]['fields']) > 1 else '' - class_field3 = renderers[rend_idx]['fields'][2] if len(renderers[rend_idx]['fields']) > 2 else '' - #print(class_field) - classes = renderers[rend_idx]["groups"][0]["classes"] - symbols_labels = [] - symbol_layers = [] - symbol_values = [] - halo_symbols = [] - multi_cat = [] - for c in classes : - symbol_layers.append(self.getSymbolLayers(c)) - halo_symbols.append(self.getSymbolHalo(c)) - symbols_labels.append(c['label']) - symbol_values.append(c['values'][0]['fieldValues']) - if len(c['values']) > 1: - vf_idx = 0 - multi_array = [] - for vf in c['values']: - if vf_idx > 0: - multi_array.append(vf['fieldValues']) - vf_idx = vf_idx + 1 - multi_cat.append(multi_array) - else: - multi_cat.append('') - - ## Convert the symbolLayers definition of each CIMUniqueValueClass to qgis symbol and create a category - idx = 0 - for sl in symbol_layers: - #print(sl) - #print ("val :" + str(symbol_values[idx][0])) - allSymbolLayers = {} - ## Create definition array - add order and more - symbol_def = self.checkSymbolType(sl) - layer_num = symbol_def['layer_count'] - #print("Symology count is " + str(layer_num)) - ret_arr = self.parseSolidFill(symbol_def, layer) - ret = ret_arr[0] - #print("solid fill idx " + str(ret_arr[1])) - allSymbolLayers[ret_arr[1]] = ret - noSolid = False - firstDash = False - if ret_arr[1] < 0: - noSolid = True - - svg_file_appendix = str(symbol_values[idx][0]).replace(" ","_") - picture_ret = self.parsePictureFill(symbol_def, svg_file_appendix) - if not picture_ret[0] == '': - print("pic fill try") - allSymbolLayers[picture_ret[1]] = picture_ret[0] - ret.appendSymbolLayer(picture_ret[0]) - ## Create hatch fill - lines_ret = self.parseLineFill(symbol_def, layer) - #print(len(line_ret)) - if not lines_ret == '': - line_ret = lines_ret[0] - #print("hatch number is " + str(len(line_ret))) - for line in line_ret: - try: - ret.appendSymbolLayer(line) - except: - print(line.__class__.__name__) - for line_sym in lines_ret[1]: - allSymbolLayers[line_sym] = lines_ret[1][line_sym] - - ## Create line strokes symbols - if 'template_stroke_num' in symbol_def and not ret == '': - ret_val = self.parseStroke(symbol_def, ret, layer) - ret = ret_val[0] - stroke_symbols = ret_val[1] - for str_s in stroke_symbols: - #print(str_s) - allSymbolLayers[str_s] = stroke_symbols[str_s] - firstDash = ret_val[2] - - vector_layers = self.parseVectorSymbolLine(symbol_def, False, layer) - #print(vector_layers) - if not vector_layers == '': - vl_idx = vector_layers - for vl in vector_layers: - v_symb = vl[0] - v_ord = vl[1] - allSymbolLayers[v_ord] = v_symb - ret.appendSymbolLayer(v_symb) - #print("After vector") - - #allSymbolLayers[vl_idx] = vector_layers[0] - #ret.appendSymbolLayer(vector_layers[0]) - - - ## Create character fills - layers = [] - max_size = 0 - for charSl in sl: - if 'characterIndex' in charSl and charSl['type'] == 'CIMCharacterMarker': - #print(charSl["enable"]) - if charSl["enable"]: - ret_sym = self.parseCharacterFill(charSl, max_size, layer) - #print(ret_sym) - symbol = ret_sym[0] - if not symbol == '': - #print("char symb desc " + str(charSl['sl_idx'])) - layers.append(symbol) - allSymbolLayers[ret_sym[1]] = symbol - if geometry_general_type_str == 'point': - max_size = max(symbol.size(), max_size) - - if not halo_symbols[idx] == '': - layers = self.tweakHaloSymbol(layers, halo_symbols[idx], layer) - allSymbolLayers[len(allSymbolLayers) + 1] = layers[len(layers) - 1].clone() - - ## Add the font fill - x = 0 - for rl in layers: - ret.appendSymbolLayer(rl) - x = x + 1 - - ## Delete default base layer if font marker filled or symbol mismatch - #print("is Halo " + str(halo_symbols[idx] == '')) - #print("ret count is " + str(ret.symbolLayerCount())) - - if ((len(layers) > 0 and noSolid ) or (layer_num < ret.symbolLayerCount()) or firstDash ): - print("delete first symbol layer") - # add user interaction - ret.deleteSymbolLayer(0) - if -1 in allSymbolLayers: - print("fix demo first layer") - # add user interaction - del(allSymbolLayers[-1]) - - #print("symbol layers in object " + str(len(allSymbolLayers))) - #print("ret symbols " + str(ret.symbolLayerCount())) - - ## Create ordered object from allSymbolLayers - ordered_obj = OrderedDict(sorted(allSymbolLayers.items(), key=lambda t: t[0])) - #print("len " + str(len(allSymbolLayers))) - total_len = ret.symbolLayerCount() - total_sym_len = len(ordered_obj) - if -1 in ordered_obj and not total_len in ordered_obj: - #print("!!!!!!!!!!!!Fix by total length") - # TODO: add user interaction - ordered_obj[total_len] = ordered_obj[-1].clone() - del(ordered_obj[-1]) - - ## Create the new symbol from reveresed ordered_obj - new_symbol = QgsSymbol.defaultSymbol(layer.geometryType()) - baseLayer = False - try: - if total_sym_len > 1: - for ord_sym_idx in reversed(ordered_obj): - #print("in reorder loop " + str(ord_sym_idx)) - newSymbolLayer = ordered_obj[ord_sym_idx].clone() - locked = '' - if not 'SymbolLayer' in newSymbolLayer.__class__.__name__: - #print("try symbolLayer") - newSymbolLayer = ordered_obj[ord_sym_idx].symbolLayer(0).clone() - locked = ordered_obj[ord_sym_idx].symbolLayer(0).isLocked() - else: - locked = ordered_obj[ord_sym_idx].isLocked() - #print("locked " + str(locked)) - newSymbolLayer.setLocked(locked) - if not baseLayer: - if "SymbolLayer" in newSymbolLayer.__class__.__name__: - new_symbol.changeSymbolLayer(0, newSymbolLayer) - baseLayer = True - else: - if "SymbolLayer" in newSymbolLayer.__class__.__name__: - new_symbol.appendSymbolLayer(newSymbolLayer) - else: - #print("one layered symbol") - new_symbol = ret - except: - print("order fail") - # add user interaction - - #print("new symbol count" + str(new_symbol.symbolLayerCount())) - - ## Create new category - symbol_val_prep = symbol_values[idx][0] + ", " + symbol_values[idx][1] if len(symbol_values[idx]) > 1 else symbol_values[idx][0] - category = QgsRendererCategory(symbol_val_prep, new_symbol, symbols_labels[idx]) - categories.append(category) - - #if len(symbol_values[idx] > 2): - if not multi_cat[idx] == '': - for extra_label in multi_cat[idx]: - symbol_val_prep1 = extra_label[0] + ", " + extra_label[1] if len(extra_label) > 1 else extra_label[0] - category = QgsRendererCategory(symbol_val_prep1, new_symbol.clone(), symbols_labels[idx]) - categories.append(category) - - idx = idx + 1 - - ## Create renderer - concat_str = ", " + "', ', " + class_field2 + ")" if not class_field2 == "" else ")" - renderer = QgsCategorizedSymbolRenderer("concat(" + class_field + concat_str, categories) - #print(categories) - - elif not raster_symbol and renderers[rend_idx]['type'] == 'CIMSimpleRenderer' and simple_symbol: - single_symbology = self.parseSimpleRenderer(renderers[rend_idx], layer) - #print(single_symbology) - if not single_symbology == '': - #print('simple renderer') - symbol = QgsSymbol.defaultSymbol(layer.geometryType()) - try: - symbol.changeSymbolLayer(0, single_symbology) - except: - symbol = single_symbology - - renderer = QgsSingleSymbolRenderer(symbol) - elif raster_symbol: - print("raster") - self.mb.pushWarning('Warning',"Raster symbology is still experimental") - self.parseRasterData(raster_data, layer) - print("after parse all") - #layer.triggerRepaint() - #self.iface.legendInterface().refreshLayerSymbology(layer) - else: - print("No matching lyrx symbology fields found for the active layer") - self.mb.pushCritical('',"No matching lyrx symbology fields found for the active layer") - # add user interaction - - if label_symbol: - #print(label_symbol) - #print(label_expessions) - #print(label_symb_array) - labels = self.parseLabels(label_symb_array, label_expessions, layer, rend_idx) - print("label by layer num " + str(rend_idx) + " in lyrx") - - # assign the created renderer to the layer - if not renderer == '' : - #print("re-render") - layer.setRenderer(renderer) - layer.triggerRepaint() - - if not labels == '': - layer.setLabeling(labels) - #print(dir(self.dlg)) - if not self.dlg.parseLables.isChecked(): - layer.setLabelsEnabled(False) - layer.triggerRepaint() - print("after labeling") - - - def run(self): - """Run method that performs all the real work""" - - # Create the dialog with elements (after translation) and keep reference - # Only create GUI ONCE in callback, so that it will only load when the plugin is started - - # show the dialog - self.dlg.show() - self.load_vectors() - self.dlg.saveQmlCheck.stateChanged.connect(self.enableQmlSaving) - # Run the dialog event loop - result = self.dlg.exec_() - # See if OK was pressed - if result: - # Do something useful here - delete the line containing pass and - # substitute with your code. - - j_data = self.read_lyrx(self.dlg.file_select.filePath()) - - layer = self.dlg.layer_select.currentLayer() - #print(dir(layer)) - #print(layer.__class__.__name__) - #print(point2mm) - #fields = layer.fields() if layer.fields() else '' - fields = layer.fields() if "fields" in dir(layer) else '' - isRaster = 'Raster' in layer.__class__.__name__ - geometry_general_type_str = self.generalise_geom_type(layer) if not isRaster else 'raster' - - self.apply_lyrx_symbols(layer, j_data, geometry_general_type_str) - if self.dlg.saveQmlCheck.isChecked(): - self.saveQML(layer) - self.mb.pushSuccess('Yay',"It's Working") - #pass diff --git a/zip_build/qlyrx/qlyrx_dialog.py b/zip_build/qlyrx/qlyrx_dialog.py deleted file mode 100644 index 23fd1d6..0000000 --- a/zip_build/qlyrx/qlyrx_dialog.py +++ /dev/null @@ -1,45 +0,0 @@ -# -*- coding: utf-8 -*- -""" -/*************************************************************************** - qlyrxDialog - A QGIS plugin - Apply Arcgis Pro .lyrx style - Generated by Plugin Builder: http://g-sherman.github.io/Qgis-Plugin-Builder/ - ------------------- - begin : 2019-04-09 - git sha : $Format:%H$ - copyright : (C) 2019 by arc2qgis - email : dror.bogin@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -""" - -import os - -from PyQt5 import uic -from PyQt5 import QtWidgets - -# This loads your .ui file so that PyQt can populate your plugin with the elements from Qt Designer -FORM_CLASS, _ = uic.loadUiType(os.path.join( - os.path.dirname(__file__), 'qlyrx_dialog_base.ui')) - - -class qlyrxDialog(QtWidgets.QDialog, FORM_CLASS): - def __init__(self, parent=None): - """Constructor.""" - super(qlyrxDialog, self).__init__(parent) - #self.setMinimumSize(1000, 800) - # Set up the user interface from Designer through FORM_CLASS. - # After self.setupUi() you can access any designer object by doing - # self., and you can use autoconnect slots - see - # http://qt-project.org/doc/qt-4.8/designer-using-a-ui-file.html - # #widgets-and-dialogs-with-auto-connect - self.setupUi(self) diff --git a/zip_build/qlyrx/qlyrx_dialog_base.ui b/zip_build/qlyrx/qlyrx_dialog_base.ui deleted file mode 100644 index c10444b..0000000 --- a/zip_build/qlyrx/qlyrx_dialog_base.ui +++ /dev/null @@ -1,378 +0,0 @@ - - - readLyrxDialogBase - - - - 0 - 0 - 436 - 413 - - - - - 0 - 0 - - - - - 418 - 332 - - - - - 8 - - - - readLyrx - - - true - - - - - 10 - 10 - 381 - 41 - - - - - 0 - 0 - - - - - 381 - 31 - - - - - 11 - - - - Qlyrx - - - - - - 10 - 60 - 401 - 271 - - - - - 28 - - - 6 - - - - - - - - - - 0 - 0 - - - - - 121 - 58 - - - - Layer to apply style to: - - - - - - - - 0 - 0 - - - - - 258 - 20 - - - - - wms - wmts - - - - - - - - - - - - 8 - - - - - - 0 - 0 - - - - - 359 - 20 - - - - Use Labels - - - true - - - - - - - - - - - - - - 0 - 0 - - - - - 54 - 20 - - - - .lyrx file: - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 85 - 20 - - - - - - - - - 0 - 0 - - - - - 165 - 20 - - - - Choose a lyrx file for symbology to load - - - Arcgis Pro Layer (*.lyrx) ;; - - - - - - - - - - - 8 - - - - - true - - - - 0 - 0 - - - - - 359 - 20 - - - - Save style to QML - - - false - - - - - - - - - false - - - .qml save location - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 85 - 20 - - - - - - - - false - - - QML files (*.qml) - - - QgsFileWidget::SaveFile - - - - - - - - - - - - - 60 - 370 - 359 - 24 - - - - - 0 - 0 - - - - - 359 - 5 - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - QgsFileWidget - QWidget -
qgsfilewidget.h
-
- - QgsMapLayerComboBox - QComboBox -
qgsmaplayercombobox.h
-
-
- - - - button_box - accepted() - readLyrxDialogBase - accept() - - - 20 - 20 - - - 20 - 20 - - - - - button_box - rejected() - readLyrxDialogBase - reject() - - - 20 - 20 - - - 20 - 20 - - - - -
diff --git a/zip_build/qlyrx/resources.py b/zip_build/qlyrx/resources.py deleted file mode 100644 index 90fa943..0000000 --- a/zip_build/qlyrx/resources.py +++ /dev/null @@ -1,1004 +0,0 @@ -# -*- coding: utf-8 -*- - -# Resource object code -# -# Created by: The Resource Compiler for PyQt5 (Qt v5.9.6) -# -# WARNING! All changes made in this file will be lost! - -from PyQt5 import QtCore - -qt_resource_data = b"\ -\x00\x00\x3a\xca\ -\x89\ -\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x00\xca\x00\x00\x00\xbf\x08\x06\x00\x00\x00\xbf\x8a\x43\xda\ -\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ -\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\x00\x00\x00\ -\x09\x70\x48\x59\x73\x00\x00\x16\xea\x00\x00\x16\xea\x01\xe5\x8e\ -\x43\x10\x00\x00\x3a\x5f\x49\x44\x41\x54\x78\x5e\xed\x9d\x07\x78\ -\x54\x65\xd6\xc7\xa3\xbb\x9f\x65\x5d\xcb\xd6\x6f\xf7\x5b\xb7\xb8\ -\x22\xa4\xcc\xbd\x33\xa1\x8b\x8b\xb1\x50\x95\xae\x80\xee\xea\xda\ -\xe8\xa0\xa0\x80\x22\x96\xac\x5d\x51\x74\x2d\xab\xb0\xf6\x82\x48\ -\x40\x9a\x52\x03\x04\xc8\xcc\x9d\x99\x54\x6a\x80\x50\x92\x09\x25\ -\x90\x3a\x3d\xf4\xf3\x9d\xf3\xde\x7b\x61\x92\xbc\x99\x96\x49\x32\ -\x33\xdc\xf3\x3c\x7f\x12\x32\x77\xee\xdc\x99\x39\xbf\x7b\xce\x79\ -\x6b\x82\x66\x11\x36\x80\x8b\x48\x9d\xf2\x6a\xae\xd6\x67\xd5\x5e\ -\x23\xe4\xba\x04\x51\xf2\x0c\xd4\x6d\x76\x3c\xa6\xb7\x78\x66\x8b\ -\x66\xef\xdb\x7a\xc9\xf5\xbd\x28\x39\x37\x08\x92\xa3\x40\x27\xb9\ -\x4b\x74\x92\xa7\x44\x34\xbb\x6b\x79\xa2\xc7\xe8\x18\x3a\x96\x9e\ -\x23\x9a\x5d\x8b\x05\xc9\xf3\xa9\x90\x5d\xfb\x2f\x71\x73\x4d\xba\ -\x68\x72\xdf\x2f\x58\x9c\x3d\x85\x2c\xcf\xb5\xea\x6b\x33\x69\xa6\ -\x59\x54\x98\xe2\x90\xc9\x59\xf0\x73\xbd\xd5\x95\x62\x30\xbb\xef\ -\xd0\x99\xec\x33\xf4\x66\xe7\x6a\xd1\xe4\xc8\x47\x27\xaf\x44\x20\ -\xce\xea\xcd\x6e\x68\x2d\x21\x44\xa7\x11\xac\x3d\x7a\x8b\xf3\x3b\ -\xc1\x68\x7f\x46\x6f\x74\xdc\x67\xc8\xf1\x74\x49\x48\x87\x8b\xcf\ -\x03\xa4\x41\xa4\x59\x4b\x99\xea\x64\x00\x17\x8b\x5b\x8e\xb7\x17\ -\xcc\x8e\xfe\x82\x54\xf7\x22\xfe\x34\x32\x20\xcc\x08\x84\xc5\x83\ -\xce\x4a\xe2\x3b\x71\xdb\x08\xaf\xc7\xea\x45\x80\xdc\x5e\xc1\xec\ -\x5a\x95\x62\x72\xcd\x11\x8c\xce\x51\xc9\xf9\x75\xed\xe8\xbd\x9c\ -\x7b\x5f\x9a\x69\x16\xb6\x29\x60\x74\x34\xd6\x5d\xaf\x33\xd5\x3e\ -\x24\x5a\x5c\x5f\xa0\xc3\x1d\x42\x07\x94\xa1\x60\x60\xf0\x9c\x33\ -\x8a\xa5\x5e\x77\x4e\x1d\x88\x92\xcb\x89\xef\xe9\x73\x7a\x6f\xf4\ -\x1e\x13\x32\xe0\x27\x1a\x34\x9a\x05\x61\xe8\x24\x98\xa2\x88\x5b\ -\xca\xaf\xe8\xb8\xa9\xa2\xa3\x41\xf2\xce\xd4\x49\x8e\x4d\x98\xce\ -\xd4\xd1\x5d\x39\x26\xc1\x08\x24\x15\x1c\x94\x68\x71\x17\x63\xfd\ -\x34\xa3\xa3\xe4\x12\xd2\xb2\xb2\x7e\x4a\x37\x09\x0d\x1c\xcd\x54\ -\x93\xd3\xa9\x35\x67\xaf\x30\x64\xbb\xf5\x98\xdf\xbf\xa4\x97\xdc\ -\x07\x64\xe7\x89\x53\x38\xfc\x09\xdf\xaf\x21\xf7\x04\xfd\x5e\x23\ -\x9a\x1d\x73\xf5\xc6\xda\x5b\xd3\xb2\x40\x86\x86\x3e\x2b\xcd\x2e\ -\x30\x4b\x4f\xbf\x98\x1c\x20\xd5\xec\x4c\xd2\x4b\xce\x27\xd1\x41\ -\x8a\x0c\x0c\x8c\xba\xc6\xce\x73\xa1\x8a\xa0\xc9\x3f\x49\xbf\x97\ -\x61\xb4\x99\x46\x9f\x95\x0f\x34\x9a\xc5\xaf\x61\x1a\x91\x91\xf1\ -\x93\x76\x2b\xcf\x5e\x2a\x6e\xae\xbe\x47\x30\x39\xd6\x8a\x66\xa7\ -\x57\x9f\x7b\xfc\xc2\x8b\x1c\xa1\x8a\x6a\x1a\xb3\xfb\x94\x60\xf6\ -\xe6\xe8\x25\xcf\xd8\xe4\xd5\x65\xbf\x1c\x4e\x35\x8d\x66\x71\x64\ -\x98\x67\xd3\x9d\x50\x30\x3a\x3a\x60\x0e\x3e\x15\xa1\xd8\xc6\xa2\ -\x07\xd5\x1d\x3c\xa7\xd0\xd4\xb4\xf0\x86\x92\x9a\x77\x8a\x9a\xa1\ -\x2b\xf5\x16\xd7\x6b\xa9\xf9\x75\xed\x94\x28\xa3\xa5\x65\x31\x6b\ -\xf8\xe5\x89\x6b\xb6\x5c\x91\x9a\x7f\x3c\x09\x8b\xf2\xb9\x18\x3d\ -\x8e\xa7\x52\xfe\xad\x45\x8f\x88\xc8\x80\x91\x58\x94\x1c\x75\x18\ -\x99\x17\x60\x94\xe9\xda\x29\x0f\xfe\x47\x03\x26\x96\x0c\x73\xe8\ -\xee\xd2\xd9\xcb\x05\xa3\xb3\x27\x46\x91\xf9\x94\x5e\x29\x05\xaa\ -\xa6\x96\x50\x0e\x02\x63\x76\x9f\xd1\x99\x5c\xcb\x53\x8d\x9e\xce\ -\xc9\x3b\xe0\x12\x0d\x98\x28\x37\xfa\x92\x52\x8d\x35\x83\x74\x92\ -\x3b\x4b\xc0\x9c\x9a\xbe\x44\xee\x97\xab\x29\xf2\xc2\x3a\x86\x6e\ -\x48\x98\x96\x6d\xd2\x4b\xce\x9b\x34\x60\xa2\xd0\x28\xec\xeb\xb3\ -\x6a\xff\x22\x5a\xbc\x1f\x8b\xac\x37\x5a\x03\xa4\xcd\x64\x45\x60\ -\xf2\x4e\x82\x5e\x72\xad\xd4\x1b\xdd\x06\x0d\x98\x28\x30\x2a\x24\ -\x19\x20\x92\xf3\xdf\xa2\xe4\xaa\x4b\xcd\x65\xcd\x99\x9a\xa2\x40\ -\x14\x5d\x04\xb3\xcb\x8d\xd1\xe5\x2b\xd1\x54\x9b\xca\x8a\x7e\xcd\ -\x5a\xd9\x32\xe0\x27\xdd\xcc\x67\xff\x57\xb4\x7a\xa7\x62\xa8\x3f\ -\x9c\x5a\x70\x9a\xfb\x65\x69\x6a\x6b\x29\xad\x64\x92\xab\x56\x34\ -\x3b\xa6\x76\xca\xac\xb9\x9a\x6a\x48\xe5\x5b\xd4\xac\x25\x8d\x42\ -\xb9\x60\x3e\x3e\x48\x6f\xf6\xe6\x1a\x30\x2f\xd6\x9a\x79\x63\x40\ -\xd4\xac\xbc\x15\xb0\x7e\xf1\xec\x10\xac\xa7\x6e\x6f\xb7\xb2\xf8\ -\x52\x2d\x1d\x6b\x21\xa3\x0e\xae\xce\x39\xde\x3f\x8a\x66\xe7\x2c\ -\xc1\xe4\xf4\x18\xf2\xb4\x96\xac\x58\x13\x4b\xc7\x24\xa7\x1b\x53\ -\xe5\x0f\x52\x25\x65\x04\xb3\x66\x91\xb3\x76\xc5\x67\x2f\x15\x4d\ -\xc7\x07\x88\x66\xaf\xd5\xc0\x06\x28\x6a\x51\x24\x66\x45\xd1\x65\ -\x0b\xd0\xef\xdb\x44\x4b\xdd\x6d\x69\x25\x70\x19\x7e\xc5\x5a\x74\ -\x69\x8e\x51\x14\xd1\x17\x7a\xfe\xa0\x33\xbb\xdf\x16\xcc\x9e\xb3\ -\xd4\xc9\xd5\xe8\x83\xd7\x14\x9b\xa2\xe6\xe4\xc2\x33\x40\x43\xfd\ -\x85\x6c\xfb\x5f\xb5\xe8\x12\xa6\x51\x93\xaf\x28\xb9\xfb\x61\x14\ -\x31\xc7\xed\x30\x77\x4d\x2c\xba\x60\xed\x52\x98\x6a\xf2\xde\x9c\ -\x9c\xb1\xe3\x12\xe5\xeb\xd7\x2c\x18\xeb\x62\x75\xfc\x4a\x94\x5c\ -\x8f\xa2\x4a\x0c\xf9\x5a\x8b\x56\xbc\x8b\xea\x4d\xd1\xec\xf2\xa2\ -\x1e\xeb\xba\xb2\xea\x2a\xad\xd0\x0f\x60\x94\x6a\x09\x96\xaa\x6b\ -\x0d\x66\xef\x3b\x86\x82\x33\xac\xf3\x8a\xf7\xc1\x6a\x8a\x43\x61\ -\xc6\xd0\x71\x27\xd6\x2e\x26\xd7\x22\x71\xb3\xa3\xbd\x96\x8a\x35\ -\x61\xd4\x21\x65\x90\x5c\xbd\x44\x8b\x37\xa7\xe3\x56\x56\xec\x69\ -\xba\x00\xd5\x91\xa5\x62\xee\x5c\x9d\xf5\xe4\x8d\x5a\x27\x65\x03\ -\xfb\x73\x56\xc9\x65\x7a\xc9\x33\x54\xb4\xb8\x4b\x52\x29\x92\x70\ -\x3e\x40\x4d\x17\x8e\x52\x31\xdd\x46\x58\x2a\x45\xa3\x7d\x24\xf9\ -\x86\xe2\x26\x17\xb6\xe9\x0b\xe1\x1a\x9d\xf5\xf8\x0c\x1a\xa3\x65\ -\xd0\x06\x31\x6a\x52\x44\x9d\xc9\xe4\x13\x3a\xab\x77\x06\xf9\x88\ -\xe2\x2e\x17\xa6\x89\x26\xd7\x6f\xb1\x60\x7f\x9d\x9a\x09\xb5\x56\ -\x2d\x4d\x8d\x84\x3e\x41\xbe\x61\xb0\xd4\xbd\x4e\xbe\xa2\xb8\xcd\ -\x05\x64\x00\x17\xa5\x6c\xf2\xfe\x51\x34\x39\xdf\x37\xe4\x9f\xd2\ -\x20\xd1\xe4\x57\x1d\x8b\x00\x0c\x66\xf7\x9c\xce\x39\xd5\x7f\xbc\ -\x70\x5a\xc4\xf0\x8d\x26\x5a\x1d\xed\x45\xab\x37\x83\x75\x20\x6a\ -\x90\x68\x0a\x24\xc9\x05\x1d\xb7\xb3\x22\x7f\x09\x4d\xe9\x8e\x7f\ -\x58\xf0\x0d\x1a\xcc\x15\x37\x88\x16\xd7\x62\x7a\xe3\xdc\x0f\x45\ -\x93\x26\xae\x10\x96\x6d\x08\x8b\xe4\x5e\xab\xcf\xae\x4e\x89\x5f\ -\x58\x08\x92\x8d\x15\x37\xe8\x25\xf7\xf7\x32\x24\xae\x06\x1f\x84\ -\x26\x4d\x81\x45\x5d\x07\x82\xe4\x5a\x63\xd8\x5c\x95\x1c\x7f\xb0\ -\xe0\x1b\x4a\x95\xec\xed\xf4\x16\xf7\x22\x0d\x92\xd6\x93\x80\x69\ -\xad\x60\xf5\xca\xc2\xdf\xd9\xec\x4f\xce\x71\xb1\x26\xb9\x9f\xcd\ -\xb3\x3a\x39\xae\x60\xc1\x37\x92\x9c\x65\x6f\x27\x5a\xdd\x0b\x35\ -\x48\x5a\x4f\x1d\x31\xaf\xbf\x35\xb3\x1c\x7a\x2f\x2f\x81\x5e\xa8\ -\xdb\xd6\x1c\x86\xee\x46\x3b\x83\x86\x77\x7c\x6c\x09\xd3\x30\x05\ -\x96\xa4\x8d\x8e\x1b\x14\x4f\x8b\x61\x43\x48\x52\x8c\xf6\xeb\x45\ -\xc9\x91\xa1\x41\xd2\x7a\xea\x84\x90\x8c\x9d\x57\x08\x5b\x06\x3d\ -\x09\x55\xd7\xf4\x84\x8a\xab\xfe\x06\x7b\x6e\x1e\x0b\xef\xcf\x5e\ -\x0e\x5d\x37\xd7\x50\xdf\x04\xf7\x79\xb1\x25\xb9\xc0\x47\x58\x3e\ -\xa5\x79\x4a\x8a\xc7\xc5\xa0\x21\x24\x7a\x73\xed\x5f\x44\xb3\xe3\ -\x5b\x6d\xcc\x56\xeb\x48\xb4\xc8\x90\x4c\xfc\xdc\x0a\xe5\xfa\x7b\ -\xe1\xd0\x95\x37\x81\xed\xd7\xb7\x31\x1d\xbc\xfa\x66\x38\xf4\xdb\ -\xdb\x61\xe9\xf8\xf7\xf0\x18\x67\x7c\xc0\x42\xad\x61\x34\x3e\x0c\ -\x61\xd1\x4b\x9e\x3f\x28\x9e\x17\x5b\x76\xa3\xdc\x99\x38\x97\x2d\ -\x19\xa4\x35\x01\xb7\x8a\xba\x64\xd7\xc2\xc4\x4f\xcc\x50\x79\xc3\ -\x10\xb0\x5d\x73\xf3\x39\x48\x54\x95\xfd\xf2\x16\xb0\x5d\xdb\x0f\ -\x16\x4f\xff\x04\x3a\x9b\xe2\x0b\x16\x83\xd5\xfb\x4e\xa7\xac\xc3\ -\xbf\x56\xdc\x2f\x36\xac\xbb\x54\x76\xb9\xc1\xec\x9a\x4c\x63\x76\ -\x34\x48\x5a\x47\x5d\x2c\x2e\x98\x91\x51\x08\xd5\xbf\xef\x8d\x90\ -\xa4\x35\x82\x44\x55\xd9\x2f\xd2\xa0\x0c\x61\xf9\xfe\xc9\x4f\x59\ -\xf4\xd1\xc5\xc3\x6c\x51\x7c\x1f\x9d\x76\x03\x45\xd4\x69\xe2\x9a\ -\xb3\x57\x28\x6e\x18\xdd\x46\x7b\x6b\xe8\x4c\x8e\x3b\x05\x8b\xf7\ -\x0c\x9b\xb6\xcb\x7b\x63\x9a\x22\xaa\x2e\x56\x37\x4c\xde\xed\x81\ -\x7d\x45\xfb\xa1\x4c\xbc\x07\x6c\xbf\xc0\xc8\xc1\x81\x44\x15\xc1\ -\x52\xfa\xa7\x3b\xe0\x9b\xf4\x79\xd0\x11\x9f\xaf\x8b\x93\x9b\x19\ -\x9b\x62\x6c\xac\x7d\x90\x6d\x8a\x14\xd5\xc6\xea\x12\xd7\x2d\x78\ -\xd1\x7b\xb4\x65\x4c\x5b\x5e\x22\xaa\x0b\xd6\x25\x53\x76\xb9\x61\ -\x9f\xd3\x0d\x07\xdd\x1e\xb0\x6d\xdf\x07\x36\x71\x64\x40\x58\x0e\ -\x62\x6a\x76\xe0\xba\x81\x30\xe7\x8d\x25\x90\x8a\xa0\xc5\x43\x64\ -\x31\x60\x2d\x2c\x9a\x5d\x4e\xc1\x58\xd3\x13\x7d\x31\x4a\xe7\xb3\ -\x20\x24\x3a\x93\x33\x51\xb4\xd6\xe5\x69\x43\xe5\x5b\x5e\x04\x49\ -\x67\x84\xe4\xf1\xdd\x6e\x38\xec\x46\x48\x5c\x6e\xb0\x31\x21\x2c\ -\xe6\xad\x60\xd3\x23\x2c\x57\xf5\xe4\x42\xa2\x8a\x60\xd9\x7b\xfd\ -\x60\x78\xfb\xbd\x55\xd0\x11\xcf\x15\x17\xb0\xb0\x1b\xb4\xa7\x5c\ -\xd8\x58\x2d\x90\x4f\x2a\xde\x19\x3d\x66\x28\x38\xfb\x1b\x51\x72\ -\x7e\xab\x4d\xba\x6a\x79\xa9\x90\x4c\x41\x48\x0e\x21\x24\x65\xe7\ -\x20\x51\x44\x91\xc5\x58\x08\xb6\xbf\x0e\x04\xdb\xd5\x8d\x8b\x7a\ -\x5f\x1d\xc2\xc7\x09\x96\xd9\xef\xad\x56\x60\x89\xfd\x34\x2c\xb5\ -\x10\xeb\x15\xab\xe7\x5b\xf2\x49\xc5\x3d\xa3\xc3\xd2\xb2\x4a\x2e\ -\x13\xad\xce\xf1\xa9\xb4\xe6\x2c\xe7\xc2\x35\x45\x4e\x04\x49\x57\ -\x4c\x95\x28\xdd\x3a\xd4\x10\x10\x55\x08\x8f\xcd\xe3\x05\x5b\x36\ -\xc2\xf2\x97\x3b\xfd\x16\xf7\xa4\x43\x57\xf7\x84\x7d\x37\x0c\x81\ -\xb7\xde\x5f\x4d\xad\x47\xac\x17\x9f\xf7\xda\xb1\x23\x17\x1b\x71\ -\xac\xb7\x78\x1e\xef\x57\x7c\xf6\x52\xc5\x4d\xdb\xd8\x30\xbc\x25\ -\x9b\x5c\xb7\x09\x92\xd3\x4e\x39\x22\xff\xc2\x35\x45\x42\x04\x49\ -\x37\x84\xe4\xe9\x62\x3f\x90\xa8\xa2\xa8\x42\x3f\x57\x1a\xa1\xf4\ -\x2f\x03\xb8\xcd\xc5\xbe\x3a\x8c\x69\x5a\x51\xe2\xdd\x90\xfe\xf1\ -\x26\xd0\xe7\xc4\x03\x2c\xca\x0a\x2f\x9b\x1d\x03\xa2\xa1\x5e\xb9\ -\x28\xc5\x58\x77\xbd\x68\xa9\xcb\x65\x2b\x98\x73\x2e\x56\x53\x64\ -\x44\x90\xf4\xc8\x71\xc3\x0c\x84\xe4\x7c\x3d\x12\x40\x08\xcb\x01\ -\x87\x13\x8a\x17\xaf\x97\x61\x09\x90\x86\x1d\xbe\xf2\x6f\xb0\x3d\ -\x79\x24\x4c\xfb\xca\x0a\x86\x38\x80\x85\xcd\x98\xb5\xb8\x0f\xd3\ -\x38\x43\xc5\x5f\xdb\xc6\x3a\xe5\xd5\x5c\x2d\x1a\x1d\x73\xb4\xba\ -\xa4\x65\x45\x90\xdc\x9c\xeb\x86\x37\x4b\x38\xf5\x88\x1f\x1d\xb0\ -\x3b\x60\x57\x45\x25\xec\x2c\xaf\x80\x3d\x8b\x32\xc1\x76\x5d\x60\ -\x58\x8e\x5c\x79\x13\xec\x48\x19\x09\x53\xbf\x44\x58\xac\x9e\x98\ -\x87\x85\xd6\x3c\x36\x98\x5c\xb3\x3a\x18\xcf\x5e\xa9\xb8\x6d\x2b\ -\x1b\x86\x33\x83\xc9\x79\xb7\xb6\xee\x56\xcb\x4a\x85\xe4\x3f\xa5\ -\x6e\x28\x45\xe7\x0f\x16\x14\x06\xc9\xb1\x0a\x84\xe4\x18\xec\x3c\ -\x4a\x3f\x11\x96\x85\x08\x4b\x10\x91\x85\x60\xd9\x2e\xdc\x03\x8f\ -\xcf\xcb\x03\x21\xb7\x2e\xf6\x23\x4b\xc1\x19\x10\x4d\xf6\x7b\x5a\ -\x3f\x05\xc3\xba\x44\x64\xb3\x14\x3d\x45\xda\x82\x10\x2d\x27\x01\ -\x75\x33\xa6\x5b\x04\x49\x09\x3a\x7f\x58\x90\xa8\x22\x58\x50\x7b\ -\xbe\x5b\x03\x65\xd7\xf6\xf7\x5f\xe0\xff\x0a\x61\xc1\x9a\x26\xef\ -\xa6\xd1\x30\x3a\x63\x7b\xcc\xd7\x2c\x6c\xd7\x03\xb3\xfb\xa0\x92\ -\x82\xb5\x5e\x93\x71\xda\x0e\xf8\xb9\x68\x72\xcc\x4b\xdd\x72\xb6\ -\xd1\x45\x69\x8a\x8c\x08\x92\x9e\x08\xc9\x47\x36\x84\xc4\x19\x3c\ -\x24\xfb\x6b\xed\x8d\x21\x51\x85\x7f\xdf\x73\xa4\x02\x4a\xe7\x2e\ -\x66\x63\xbe\x02\xc1\x72\xf4\xea\x9e\x0c\x96\x51\x0b\x63\x1f\x96\ -\xd4\x42\xf4\x55\xc9\xfd\x61\x3b\x4b\xd5\x55\x8a\x1b\xb7\xb4\xc1\ -\x45\x3a\xc9\x99\xc6\x16\x85\xe0\x5c\x90\xa6\xe6\x4b\x90\xce\x43\ -\x72\xcc\x13\x1a\x24\x5c\x40\x14\xed\xae\xa8\x82\x12\x6a\x0d\xab\ -\xb1\x83\xed\x9d\x79\x60\xfb\xbf\xbe\x41\xc0\xf2\x37\xc8\xed\x39\ -\x16\x46\xc5\x43\x64\x41\x9f\x15\x8d\xb5\x77\x25\x64\x64\xb4\xf4\ -\x10\x17\xb8\x28\xd9\xea\xfe\x9d\x68\xf1\x64\x6a\x43\x54\x5a\x46\ -\x04\xc9\x2d\x58\x93\x7c\xa8\x40\xc2\x03\x82\xa7\x40\x90\xec\xa9\ -\xac\x86\x12\x87\x4b\x3e\xbe\xae\x0e\x6c\x95\x35\x60\x7b\xe9\x53\ -\xb0\xfd\x21\x50\x64\xb9\xb5\x11\x2c\x54\x37\xf1\xae\x3d\xda\xc5\ -\xca\x04\x2c\x17\xba\x99\x8f\xfe\xaf\xe2\xd0\x2d\x63\x6c\xcf\x44\ -\xc9\x31\x45\xde\xa3\x24\xb6\x0b\xbc\x68\x94\x0e\x21\x49\x43\x48\ -\x3e\x3f\xe8\x86\xa3\x21\x42\xb2\xe3\xc8\x51\x2e\x20\xa4\x7a\x90\ -\xa8\x22\x58\xaa\x6a\xc1\xf6\xe2\xc7\x60\xfb\x5d\x6f\xb0\xfd\x22\ -\x30\x2c\x39\x69\xe3\xe1\x81\x25\xbb\x20\x29\x86\x37\x71\xa2\x05\ -\x2a\xd0\x77\x27\x62\x9d\xdd\x72\x51\x25\xd5\x54\xf3\x67\xbd\xc5\ -\x6d\xd3\x3a\x16\x23\x2f\x82\xa4\x77\x9e\x0c\x49\x79\x08\x90\xec\ -\xab\xa9\xe5\xc2\xa1\x8a\x20\x29\x75\x36\x80\x44\x55\xdd\x71\xb0\ -\x1d\xad\x02\xdb\xf4\xf7\xc0\xf6\xdb\x5e\xfe\x07\x52\x22\x2c\xc7\ -\x7e\x99\x06\x99\x83\x66\x42\xbf\xd5\x87\x20\x25\x86\xf7\xaa\x11\ -\x2c\xde\xd3\xac\xb0\x6f\x89\xb1\x60\x34\x4c\x45\x6f\x76\xbd\x60\ -\xa0\xa2\x88\xf3\xe2\x9a\xc2\x17\xa5\x32\xbd\x10\x92\x65\x47\x43\ -\x8b\x24\xc1\x40\xc2\x7b\x5e\x3d\x1d\x47\x58\x0e\x1f\x03\xdb\xa4\ -\x59\x41\xc1\x52\x71\xcd\xcd\x90\x39\xe4\x19\xe8\xbb\xf6\x08\xe8\ -\x62\x14\x16\x56\x5f\x9b\x1c\x1f\xd1\x1e\x3c\x8a\x7b\x47\xc8\x90\ -\xbc\x8e\xd9\xf6\x4e\xa2\xd9\x55\xa5\xa5\x5c\x91\x15\x41\x32\xb0\ -\xd0\x0d\xcb\xcb\xe5\x51\xc0\x5c\x67\x6e\x24\x57\x50\x90\x94\xa9\ -\xc3\x58\x02\xa8\xf4\x78\x1d\xec\x2b\x3d\x04\xfb\xc6\xbc\x82\xb0\ -\x50\x1a\xe6\x07\x96\x5f\xde\x02\x15\xbf\xb9\x0d\x56\xdf\xf3\x22\ -\xf4\xce\x3c\x02\x89\xf9\xb1\x39\x22\xc3\x50\x70\x1a\x44\x53\xb5\ -\x2e\x21\x3d\x3d\x72\x7d\x2b\xd7\x4a\x67\x2f\xd7\x99\x9c\x9f\xd3\ -\xc9\x79\x2f\xaa\x29\x3c\x51\x13\xf0\xe0\x2d\x18\x49\x42\x82\x24\ -\x70\x24\x29\xae\xaa\x09\x1e\x12\x4c\xcb\xf6\x56\xd7\xc0\x8e\xaa\ -\x6a\x28\xda\x53\x02\xfb\x46\xbf\x7c\x0e\x88\x46\x90\xa8\xc2\xc7\ -\x2a\x7f\x7d\x2b\x2c\xbd\xff\x35\xe8\x91\x55\x15\x93\x35\x0b\x35\ -\x46\x89\x92\x63\x29\xdb\xa1\x38\x22\x86\xd1\x44\xc8\xae\xea\x2e\ -\x58\xea\xbc\xbc\x17\xd4\x14\x9e\x18\x24\x18\x49\xd6\x54\x84\x1a\ -\x49\xfc\xb5\x6e\x55\x84\x0c\x49\x31\x02\x72\xae\x21\x00\x81\x29\ -\x2a\xda\x0b\xfb\xff\xf1\x2c\xc2\x70\x6b\x40\x58\xaa\x7e\x75\x0b\ -\x2c\x79\xe0\x0d\xb8\x71\x73\x0d\x24\xc5\x60\x2b\x28\x6b\xb9\xcd\ -\x76\x45\x66\xd5\xc9\x4e\x79\x87\x7f\xa6\x33\xba\x16\x6a\x83\x1e\ -\x23\x27\x5f\x48\x68\x3e\x09\xcf\x89\x1b\x8a\x9c\xda\x7f\x24\x09\ -\x17\x92\x06\xe7\xa9\x45\x58\xb6\xed\x81\x03\xc3\xa6\xb3\x7e\x14\ -\xbf\xb0\xfc\x22\x0d\x2a\x7e\xdf\x1b\x16\x8e\xf9\x37\xf4\xd8\x54\ -\x1d\x73\xb0\xb0\xa8\x62\xb2\x2f\x6b\xfe\xde\x91\x48\x5a\xaa\xf9\ -\x84\x88\xd1\xc4\xad\xb7\xf0\x5f\x4c\x53\x68\x3a\x07\xc9\xb1\xc8\ -\x41\x52\x74\xb4\x82\xa5\x4f\x65\x41\x9e\x8f\x9a\x8a\xa9\x86\x69\ -\x04\x09\x09\xff\x56\x64\xb7\xc3\xde\x5d\x07\xa0\x6c\xc4\x0c\x56\ -\xc0\xfb\x83\xa5\xec\x9a\x34\xa8\xfc\x5d\x2f\xc8\x18\xf7\x2e\xf4\ -\xd8\x18\x9b\xb0\x08\xc6\xca\xe6\x2d\xfc\xcd\xb6\xaf\xce\x76\xce\ -\xd6\xa2\x49\x64\x44\x4d\xc0\x04\xc9\x6a\x82\x84\xe3\xc0\x3c\xa9\ -\x35\x44\x23\x87\x56\x44\x90\xc8\x91\x84\xff\xfc\x86\x2a\x71\x38\ -\x19\x24\xbc\x73\x91\xe8\x7c\x04\x65\xd9\xe9\x53\x60\x2b\xb6\x81\ -\x6d\xe8\x34\xb9\x43\x92\x80\xe1\x80\x42\x62\xb0\x60\x64\xf9\x6e\ -\xdc\x7b\x31\x07\x8b\x1c\x55\x9c\xdf\x34\x63\x1b\x3c\xb8\x88\x56\ -\xe0\x13\x2d\xee\x0a\xad\xa5\xab\xf9\x4a\x41\x48\x46\x6c\x0d\x1d\ -\x12\x4a\x8f\x78\x0e\x4d\x92\x23\x49\x2d\xf7\xb9\x3c\xc9\x90\x54\ -\x71\xcf\x45\xda\x75\xac\x92\xd5\x40\xe7\xd2\x37\x6a\x3a\xce\xdb\ -\x05\xb6\x7e\x8f\xc9\x2d\x61\x81\x60\xc1\xc8\x32\x7f\xbc\x0a\x4b\ -\xec\x34\x1d\xd3\xae\xc4\xca\x5e\xf7\xa1\x47\x15\x8a\x26\x48\xda\ -\x0c\x6d\x4c\x57\xf3\x44\xcd\xbf\xa4\x7b\xb7\xb9\xc1\x5a\x13\x7c\ -\xe1\x1e\x69\x48\x0e\xd8\xfd\x43\x52\x74\x0e\x12\x9f\xe7\xd1\xef\ -\xa7\x4e\x20\x2c\x45\x60\xeb\x1b\x3c\x2c\x5f\x4f\x99\x0b\x5d\x25\ -\x27\x24\xcb\xa3\x76\xa3\x5e\x2c\xaa\x64\xdb\xdf\xee\x34\x77\x6e\ -\xe8\xfd\x2a\x89\x56\xc7\xaf\xb0\x2e\xd9\xae\x45\x93\xf0\x45\x80\ -\x50\x4d\xf2\xd0\x0e\x37\x6c\xb7\x87\x56\x93\x70\x0b\x6d\xd5\xa9\ -\x29\x3d\xaa\xb5\x73\x9f\xcb\x13\x45\x12\x1a\x10\xc9\x3b\x17\x89\ -\x1e\xdb\x6f\x77\xf0\xd3\x37\x15\x96\x5c\x84\xa5\xdf\xa3\x81\x61\ -\xb9\xba\x27\x94\x75\x18\x06\x1f\xbe\x90\xc1\x16\x05\x8f\x15\x58\ -\x28\x73\xea\x1a\xf2\xc8\x62\x0c\x41\x7a\xc9\x39\x94\x0d\x4d\xe6\ -\x9c\x54\x53\x60\x11\x24\x06\x8b\x0c\xc9\x56\x84\xe4\x60\x24\x21\ -\xa1\xd1\xbf\x9c\xe7\xf2\x14\x28\xdd\xda\x5d\x51\xc9\xa2\x0d\xef\ -\xb9\xe7\xc4\x60\x39\x89\xb0\xec\x04\x5b\xef\x49\x01\x27\x7e\x1d\ -\xbc\xf2\x6f\x70\xb0\xfd\x50\xf8\xe0\xe5\x45\x72\x64\x89\x81\x21\ -\x4f\xb4\xc4\x96\x98\xed\x19\x98\x90\x1e\xc2\xe4\x2e\xda\xb2\x58\ -\x30\x39\x16\x68\x2b\x3d\x86\x27\x82\x84\x5a\x09\xc7\x15\x85\x06\ -\x09\x39\x75\x24\x21\xa1\x09\x5c\xfe\x21\xa9\x62\xc7\xf0\x9e\xdb\ -\x48\xf4\x1e\xb0\xc0\x2f\xd9\x5c\x00\x25\xdd\xfe\x09\x36\x84\x81\ -\x07\x89\x2a\x5a\x20\xbc\x24\x65\x04\xcc\x7e\xf3\x47\xe8\x62\x76\ -\x41\x4a\x94\xfb\x92\xc1\xe2\xa5\xc6\x16\x73\x5a\x7a\x56\xf0\x45\ -\x7d\xca\x46\x67\x92\x68\xa9\x73\x69\x69\x57\xe8\x52\x6b\x92\x49\ -\x61\x40\x42\x4e\x1d\x49\x48\x28\x5a\xf0\xce\x45\x92\x21\x09\x10\ -\x49\x1a\x88\xa2\xdd\x1e\x3a\xef\xe2\x4c\x28\x31\x8c\x0c\x08\xcb\ -\xe1\x2b\x7a\x40\xb1\xe1\xef\xf0\xf2\x07\x99\xd0\x09\x6f\x1c\xd1\ -\x0e\x0b\xde\xdc\xce\x76\xce\xa1\xa2\x3e\x98\x59\x90\x00\x17\xeb\ -\x25\xf7\x93\xac\xd7\x92\x77\x32\x4d\x4d\x8a\xea\x11\x82\x64\x22\ -\x42\xb2\x3b\x84\x9a\x24\x50\x0d\xa1\x42\x12\x6c\x13\xb0\x3c\x15\ -\x38\xf2\x90\x14\xab\xcd\xca\x35\x35\xb0\xe7\xbb\x55\x50\x9a\x38\ -\xd4\x7f\x1a\xf6\x9b\xdb\xe1\xc8\xcf\x6e\x84\x9d\x5d\x1e\x80\xe7\ -\xe6\x6c\x64\x8b\xf6\x45\x33\x2c\x34\x5f\x45\x94\x1c\x2f\x05\x35\ -\xb1\xab\xdd\xca\xb3\x97\x8a\x66\x57\xa1\x16\x4d\x42\x13\x4d\xb8\ -\xa2\x95\x16\x29\x92\xec\x72\x84\x16\x49\xe4\x95\x52\x1a\x3b\x34\ -\x89\xa6\xf5\xd2\x7c\x93\x60\x21\xa1\x63\xa9\x05\x8b\x77\x2e\x52\ -\x50\x35\x49\x03\xb1\x48\xe2\xdb\x41\x49\xe7\x47\x78\x8b\xdf\xfc\ -\x12\x0b\x7b\x04\xc2\x4f\x71\x4f\xb0\x94\x5f\x8e\xb0\x74\x8d\x01\ -\x58\xc8\xe7\x2d\x9e\x6d\x1d\x8c\x95\x01\x56\x6c\xc1\x22\x5e\x67\ -\xb4\x77\xc6\x83\x4f\x73\x4f\xa4\x89\x2b\xea\x48\x24\x48\xa6\xed\ -\xc6\x48\x12\x02\x24\xec\xce\x1f\x61\x48\x02\x45\x92\x12\x47\x90\ -\x35\x89\xa2\x26\x7b\xf1\x6b\x6b\x61\xf7\x5a\x09\x4a\x7a\x3c\x1c\ -\x70\x8d\x63\x19\x96\xee\xb0\xa3\xeb\x83\xf0\xec\x5c\x84\x85\x3e\ -\xb3\x28\x5d\xe7\x98\x8a\xfa\x94\x6c\xd7\x2d\xfe\xfb\x54\x30\xe4\ -\x88\x66\xe7\xdb\x06\xab\xb6\xb2\x4a\xb0\x22\x48\xba\x5b\xdd\x30\ -\x7d\x0f\x46\x92\x10\x6a\x92\xc0\x90\x54\x32\xc7\xe7\x3d\x97\xa7\ -\x40\x90\x50\xfd\x43\xd1\x8b\xf7\xdc\xa6\x24\xd7\x4d\x4d\x34\x2e\ -\xe0\xf9\xf6\xe4\xef\x84\xd2\x7b\x67\x82\xed\x8a\xf3\x3b\x7b\x35\ -\x29\x05\x96\x9d\x08\xcb\xf4\xcf\x24\xd0\xe7\x1e\x8f\xca\xf9\xf7\ -\x34\x29\x51\x90\x9c\xb3\xfd\xa6\x5f\xfd\x30\xed\xd2\x9b\x5d\xf9\ -\x5a\xda\x15\x9c\x08\x92\x6e\x39\x6e\x78\x69\xbf\x1b\xf6\x84\x1a\ -\x49\xfc\x38\x35\x3d\x16\x8a\x53\xcb\x90\x34\xb1\xf2\x0a\x8a\x20\ -\x29\x75\x86\x07\x09\xef\x7c\xa4\x5d\xf8\x9a\xfb\x77\xee\x07\xdb\ -\x7d\xcf\x82\xed\x67\x3d\xf8\x70\x34\x14\xc2\x72\xec\xb2\x6e\x20\ -\xa5\x4d\x80\xf1\xf3\x0a\xa2\x73\x35\x4a\xba\x1e\xab\x67\x2b\x95\ -\x20\x0a\x16\x8d\x2d\x75\x63\x55\x12\x1e\xac\xa5\x5d\x41\x48\x87\ -\xea\x6e\x71\xc1\x2b\x07\x94\x9a\x84\xe3\x6c\x3c\xc9\x90\x34\xed\ -\xd4\x72\x7a\x14\x1a\x24\x54\xec\xf3\xce\x45\x22\x67\xa7\x1a\x83\ -\xf7\xdc\xa6\x44\xe9\x99\x5f\x48\xaa\xaa\xf1\x75\x31\x85\xfb\x78\ -\x09\xd8\xfe\x3a\xc8\xff\x44\xaf\x06\x2a\x45\x58\x2a\x2e\xed\x0a\ -\xe6\x5b\x26\xc0\xb8\x6f\x0b\xa3\x12\x16\x4a\xbf\x52\xcd\x2e\x91\ -\x86\x71\x29\x68\xf8\x58\x3a\xb5\x76\x79\x1e\x57\x16\x0b\xd3\xe4\ -\x47\x29\xa8\x6e\x66\x17\x3c\x93\x57\x0b\xd2\x61\x07\x83\x24\x98\ -\x25\x85\x08\x92\xdd\x15\xad\x0d\x49\x68\x91\x84\xae\xd1\x5f\xdf\ -\xcb\x2e\x7c\x6c\x7f\x55\x0d\xd8\x16\xad\x03\x5b\xb7\x07\x82\x4b\ -\xbb\x1a\x48\x85\x45\xba\x65\x22\x3c\xf2\xdd\xb6\xe8\x5b\x8d\xd2\ -\xea\x05\xd1\xe8\x78\x89\xdf\xf9\x48\x85\xbc\xd9\xb3\x5e\x4b\xbb\ -\xfc\x8b\x20\xb9\x11\x23\xc9\xd3\xb9\xb5\xb0\x22\xaf\x0a\x96\x16\ -\x56\x83\x15\x61\x21\x50\xfc\xc1\x22\x43\x12\xa8\xd0\x0e\xfe\xce\ -\x4f\x77\xf4\xa2\xa3\xfe\x6a\x92\xd0\x23\x49\x30\xd7\x78\x80\xc0\ -\x5b\x2d\x81\xad\xcb\xfd\x60\xbb\xec\x46\x96\x4e\xf1\x60\x08\x24\ -\x82\xa5\xf2\x92\x2e\xb0\xbe\xff\x34\xb8\x6f\xc9\x2e\x10\xf1\x06\ -\x1d\x35\xb0\xb0\xeb\x70\x15\xa4\xf3\x40\xe9\x62\x75\xfc\x4a\x30\ -\x7b\x1c\xdc\x27\x6a\x62\x22\x48\x7a\x20\x24\xcf\xe6\xd4\xc2\x8f\ -\xf9\x55\xb0\x1a\xb5\x12\x61\xf9\xbe\xa0\x1a\x2c\x87\xe5\x3b\x37\ -\x0f\x16\x39\xdd\x8a\x24\x24\x81\x22\x49\x4d\x58\x90\x04\xba\xc6\ -\xfd\x74\xce\x43\x47\xc1\xf6\xd8\x2c\xb0\x5d\xdc\x39\x6c\x48\x54\ -\x95\xa2\xaa\x7e\xde\x03\xd6\x0f\x9e\x01\xf7\x2d\x26\x58\xa2\x28\ -\x0d\xb3\xb8\x4f\x25\x67\x1d\xfb\xb9\x82\xc7\x79\xd3\x1b\xed\x7d\ -\xb4\x75\x84\x9b\x56\x32\xea\x26\x84\xe4\x79\x84\x64\x85\x0a\x89\ -\xa2\x55\x08\x4b\x46\x41\x0d\x58\x8e\xf0\x61\x21\x27\xe3\x39\x1f\ -\x29\x54\x48\xa8\xe3\xd1\x1f\x24\x34\x37\x25\x5c\x48\x9a\x1a\x15\ -\xc0\x22\x09\x1e\xc3\x96\x37\xda\x55\x02\xb6\x7f\x3e\x1f\x7c\x01\ -\x1f\x40\xa5\xbf\xba\x15\x61\xb9\x91\xc1\xf2\x8f\xc5\xbb\xa3\x07\ -\x16\x2a\x41\xb2\x6b\x6f\x51\xf0\x50\x8c\x06\x41\x1a\x9d\xcf\xe8\ -\xe3\x61\x2b\xe5\x16\x10\x41\xf2\x37\x84\xe4\x05\x05\x92\x55\x3e\ -\x90\xa8\x5a\x8d\xb0\x2c\xda\x52\x03\x79\x47\x5d\x8d\x40\xa1\x89\ -\x57\x3c\xe7\x0e\x07\x92\x86\xe7\xf0\x55\xcb\x41\xa2\xd4\x39\xb4\ -\x8b\x57\x45\x35\xd8\xd2\xe7\x28\xa0\xf8\xe9\x68\x0c\x41\x2a\x2c\ -\xeb\x86\x3c\xcd\x60\x61\x35\x42\x83\xef\xa0\xd5\x85\x2c\xb0\x66\ -\xe2\x7a\xfd\x29\x98\x8b\xe9\xcc\xde\x75\x5a\x7d\xd2\x58\x04\x49\ -\x4f\x84\xe4\x25\xaa\x49\x10\x08\x1e\x24\xaa\x28\xb2\x2c\xdb\x5e\ -\x03\xf9\x15\x3c\x58\x6a\xeb\xc1\x42\x35\x44\x68\x90\x04\x5e\x79\ -\x25\x74\x48\xec\x08\x82\x7f\x48\x1a\x35\x2e\x9c\xc0\xa8\x42\xfb\ -\x43\xf6\x1a\x1f\x70\x14\x71\x28\x3a\x1f\x59\x9e\x86\xc1\x3f\x96\ -\x40\x72\x5b\xaf\xec\x82\x2c\x88\x16\x57\x7e\x3d\x50\xa8\xcd\x58\ -\xab\x4f\x1a\x2b\x09\x45\x90\xbc\x12\x04\x24\xe7\x94\x5b\x05\x3f\ -\xec\x90\x61\xa9\xe7\x60\x28\x82\x85\xee\xde\x34\x42\x38\x14\xa7\ -\x0e\x04\x09\x45\x2c\xde\xf3\xfc\x89\x1a\x03\x82\x69\xa6\xae\x3f\ -\x91\xcb\x23\xa7\x5f\x85\xbb\xc0\xf6\xf7\x99\x60\xbb\x2a\x04\x50\ -\xa8\x9e\xa1\xa1\x2e\x7e\x86\xbb\x10\x2c\x35\x3f\xeb\x06\xdf\xdd\ -\xff\x06\xf4\xca\x2c\x6f\xf3\xd5\x28\x45\xac\x53\xba\xae\xf4\x99\ -\xa3\x42\xcb\x4b\x6a\xf5\x49\x7d\x11\x24\x69\x08\xc9\x6b\xa1\x40\ -\xa2\x0a\x61\x59\x86\xb0\x14\x54\x36\x86\x81\xf5\x3f\x34\xf8\x9b\ -\x3f\x11\x5c\x3c\x47\x26\x51\x84\x0a\x65\x51\x09\x55\x72\x63\x40\ -\xa0\xc6\x05\x0e\x24\x6e\x4c\xbd\x2c\xdb\xc0\x76\xf7\xf4\x30\x6a\ -\x14\x04\xa4\xdd\x60\xb0\xfd\xf9\x4e\xbf\x8b\x55\x10\x2c\xb5\xd7\ -\xf4\x84\xef\x1e\x9e\x0d\xbd\xd6\xb6\x31\x2c\x98\x02\x1a\xb2\x6b\ -\xf4\x0a\x26\x09\x09\x3a\xc9\x3e\x42\x4b\xbb\xce\x8b\x20\xb9\x05\ -\x21\x99\x85\x90\x90\xe3\x87\x04\x89\x2a\x84\xe5\xc7\xa2\x5a\xd8\ -\x52\xd5\x38\x0d\x0b\x56\x81\x21\x09\x7e\x2a\xb0\x2a\x9a\x19\x59\ -\x14\xa0\x17\x9f\x6a\x92\xfa\x90\x90\x10\x14\x33\x42\x32\x68\x4a\ -\x78\xf5\x09\x75\x4a\x26\x0d\x07\x9b\x38\x52\x5e\x14\x9c\x77\x8c\ -\xa2\x52\x04\x89\x60\xf9\x76\xcc\xbb\x90\xb6\xee\x18\xa4\xb4\x55\ -\xdf\x1e\x32\x21\x58\x9c\x77\xcb\x94\x60\x0e\x96\x62\x72\xbd\xaa\ -\x81\x22\x2b\x11\x75\x2b\x42\xf2\x56\x73\x20\x51\x85\xb0\xac\xda\ -\x85\xb0\x54\x87\x06\x0b\xa5\x65\x6d\x03\x09\xd5\x4d\x0d\x6a\x12\ -\x12\xad\x7c\xbf\xbf\x0c\x6c\xb4\xe4\x2a\xf5\x9d\xf8\x49\x9f\xfc\ -\x8a\x56\x73\xf9\xd3\x1d\x60\xfb\x23\x2a\xd0\x39\x7e\x91\x06\x35\ -\xbf\xbd\x1d\xbe\x18\xf7\x01\xf4\xd8\x58\x05\xc9\x6d\x11\x59\x08\ -\x14\xc9\xf9\xa6\x5c\xa7\xe0\x3f\x3a\xc9\xb5\x52\x03\x45\x8e\x24\ -\xb7\x23\x24\x6f\xe7\xd6\x30\x47\x6f\x16\x24\xaa\x10\x96\x95\xbb\ -\x6b\xa1\x10\x61\x69\xe4\x80\x1c\xc9\x90\x34\xbd\x3c\x11\x29\x2c\ -\x48\xb0\xce\xf1\x07\x89\xdf\xba\x89\xa6\x01\xaf\x32\x81\xed\xba\ -\x41\xfe\xf7\x52\x09\x46\x04\x48\xb0\xa0\x21\x2c\xb5\xbf\xbd\x0d\ -\xfe\xfb\xd8\x7f\xa1\xeb\xa6\x9a\x36\x80\x05\x99\xf0\x2d\xe8\x75\ -\x66\xd7\x6e\xfe\x81\x17\x86\xa8\x29\x92\x5a\xb7\xfa\x20\x24\xef\ -\x22\x24\x04\x48\x44\x20\x51\x85\xb0\xac\x40\x58\xb6\x56\xfb\xef\ -\xbd\x0f\x0e\x92\xd0\x0b\x77\x06\x09\xa7\x79\x9a\x54\x74\x34\x00\ -\x24\xa4\x93\x08\xca\xd7\x2b\x30\x9a\x74\xe7\x3b\x74\x4b\x8a\x22\ -\x0b\xa6\x79\x73\xa6\x7e\x06\x5d\xda\x60\xb1\x0a\xf4\x8d\x53\x0c\ -\x92\x76\x2b\xcf\x5e\xa5\x33\x7b\x6a\x78\x07\x5d\x08\x22\x48\xa8\ -\xc7\xbd\xbf\xd5\x05\xef\xb7\x04\x24\xaa\x10\x96\xd5\x7b\xec\xb0\ -\xa3\x16\x61\x69\xa2\xf8\x26\x87\xe5\x39\x33\x49\x2d\xdc\x79\xcf\ -\xf3\x27\x7f\x90\x90\xf6\x56\x07\x80\x84\xae\xf5\xe4\x09\xb0\x7d\ -\xf1\x03\xd8\x2e\xe9\xc6\x77\xe6\x50\x75\x75\x4f\xb0\x5d\x8e\x29\ -\x1c\xa5\x71\x34\x56\x2c\xd0\xa0\xca\x6b\x6e\x86\xea\x6b\xfb\xc2\ -\x47\x4f\x7d\x09\xdd\x36\xd7\xb6\x6e\xcd\x62\xf1\x42\x3b\x6a\xf9\ -\xd2\x99\x9c\x89\x17\xea\xc6\x40\x2a\x24\x03\x11\x92\x0f\xf3\x6a\ -\x58\x6f\x7b\x8b\x40\xa2\x68\x05\xc2\xb2\x6e\x6f\xd3\xb0\x34\x95\ -\x1a\x91\xa3\x93\xc3\x37\x3c\x3e\x90\x02\x41\x12\x74\xdf\xcb\xa9\ -\x53\x60\x5b\x69\x94\xb7\xde\xf6\xb7\x33\x57\x20\x51\x6b\xd7\xd5\ -\xf8\xfc\x5b\xc7\x40\xe9\xe4\x59\xb0\xff\x89\xd9\xb0\xff\x9e\x19\ -\x50\x4a\xfb\xdf\xd3\xe4\x2f\x9a\x2d\xc9\x7b\x1e\xe9\x6a\x84\xe5\ -\x0f\x7d\xe0\x9d\x7f\x2d\x64\x8b\x82\xb7\x5e\xef\xbd\x47\x6e\xf9\ -\xd2\x5b\xec\x7d\xf8\x07\xc4\xb7\x08\x12\x1a\x2a\x3f\xc4\xea\x84\ -\xb9\xad\x00\x89\x2a\x82\x25\x93\x60\xb1\x37\x4e\xc3\x78\x63\xb8\ -\x08\x9e\x36\x85\x84\x84\xc5\x7c\xe9\xfe\x83\x50\x3a\xee\x55\x39\ -\xaa\x34\x6c\xde\x25\x78\x02\x75\x3e\xd2\x73\x28\x72\x0c\x7a\x02\ -\x6c\x59\x79\xb0\xf7\x78\x1d\x14\x9d\x39\x09\x45\xc5\x25\x50\xfc\ -\xee\x3c\x28\xe9\xf4\x0f\x19\x22\x3f\xf5\x4b\x19\xc2\x54\x7e\xc3\ -\x10\xb8\xff\xf3\x3c\xd0\xb5\xe2\x74\x62\xd1\xec\x1a\x99\x20\x9a\ -\x9d\xe3\x79\x0f\xc6\xb3\x08\x12\x5a\x08\xe2\x2e\x84\xe4\x93\xbc\ -\x6a\x58\x83\x0e\x1c\x18\x92\x6a\x45\xbc\xc7\x42\x13\x8b\x2c\xfb\ -\xec\x6c\x1e\x8b\x2f\x2c\xf4\xbb\x0a\x0b\xf5\x96\x33\x48\xf0\xff\ -\xf5\x9c\x36\x08\x51\x8a\x16\x31\x48\x14\xed\xf7\xb8\x61\xcf\xa6\ -\x5c\x38\xd0\x7f\x12\x3a\xed\xed\x72\xea\x44\x69\xd3\x15\x3d\xa0\ -\xb4\xfd\x10\x28\x35\xdc\x83\x30\x34\x51\xa8\x13\x20\xd7\xa0\x86\ -\x3d\xc9\x96\x68\xdd\x87\xe0\xb1\x79\xfd\xb4\xdd\x44\x65\x15\xec\ -\xa0\x73\x2f\xca\x84\x92\x1b\x1f\x92\x8f\xf5\x03\x4b\xd5\x25\x9d\ -\xe1\x85\xe7\x16\x40\xd7\x6c\x7b\xab\x45\x15\xc1\x68\x9f\x99\x20\ -\x4a\xce\x74\xde\x83\xf1\x2a\x02\x84\x34\x12\x21\xf9\x2c\x48\x48\ -\xe8\xf1\x1f\x73\x8e\x31\xad\x2c\xe0\x1f\x13\xb2\xf2\xaa\x60\xd3\ -\x7e\x05\x16\x9f\x34\x8c\xd6\xfd\xa5\x31\x5d\xd4\x9f\x11\x0e\x24\ -\x04\x01\x0f\x0e\x55\x61\x41\xc2\x9a\x95\x2b\x61\x47\x45\x25\xec\ -\xb2\x6e\x83\x7d\x33\xdf\x87\xfd\x77\x4f\x87\x03\x43\xa7\xc2\xfe\ -\x07\x9f\x87\xfd\x73\x17\x42\xe9\x82\xb5\x60\xeb\x3d\x41\x2e\xf8\ -\x29\xc2\xa8\xad\x5b\x57\x62\x4a\x45\x00\x0d\x9f\xc1\x56\x9b\xdc\ -\xe7\xf5\x72\x21\xde\xe1\x70\x40\xf1\xb2\x8d\x50\xda\x73\x94\x5f\ -\x58\x8e\x5e\x71\x23\x7c\x32\x79\x0e\xa4\x6d\xa8\x68\x35\x50\xb0\ -\x3c\x79\x27\x41\x30\x7b\xe7\xf0\x1e\x8c\x47\xa9\xcb\x09\xfd\xdd\ -\xea\x80\x2f\x83\x8e\x24\x55\xb0\xd4\x74\x10\x16\x64\xed\x83\x0c\ -\xd4\x62\x63\x19\xac\xc8\xab\xe4\x1e\x17\xaa\x68\x6c\xd8\x46\x84\ -\xa5\x88\x03\x4b\xa8\xce\x4c\xc7\x13\x04\xfe\x76\x07\x0e\x1b\x92\ -\xa3\x3e\xe3\xc1\xa8\x55\xae\xaa\x0a\x8a\x76\xee\x85\x5d\x05\xbb\ -\x60\xcf\xc1\x72\x28\x39\x79\x1c\x6c\xa7\x4f\x83\x6d\x43\x0e\xd8\ -\xee\x9a\x8e\xb5\xcc\x40\xb9\x19\x99\x00\x11\x31\xd2\x4c\x9a\x05\ -\xa5\xf9\xbb\x60\xaf\xc7\xe3\xb7\x0e\x2b\xae\xf3\x42\xe9\x2a\x09\ -\x6c\x37\x8f\x91\x53\x35\x0e\x2c\x34\xc4\xe5\xf9\xf4\x45\xd0\x19\ -\x23\x8a\xd8\x5a\x11\x45\xf2\x7c\x97\x80\x54\xce\xe7\x3d\x18\x6f\ -\x22\x48\xe8\xe7\xfd\x08\xc9\x37\x08\xc9\x5a\x8e\xe3\xf2\xf4\x63\ -\xce\x51\xf8\x36\x73\x37\x7c\xb5\x6a\x07\xd3\xd7\xa8\x25\xa6\xc8\ -\xc3\x42\x0b\x53\xf8\x6b\x3a\xf6\xa7\x60\x20\xa1\xbe\x97\x50\x20\ -\xa1\x63\x09\x12\xee\xc8\x62\x8a\x08\x18\xf1\xf6\xd8\xed\x50\xa2\ -\x02\x4e\x3d\xf7\xd4\xdf\xb2\xbb\x14\x6c\x73\x17\x83\xed\xe5\x8f\ -\xc1\xf6\xda\xe7\x60\x5b\xb4\x1e\x4a\xcb\xca\x61\xaf\xd3\x89\x30\ -\x34\x38\x8f\x22\x82\xe4\xdc\xf5\x9d\x3d\x03\xb6\x1f\x8c\x60\x4b\ -\xbd\xb7\xd1\x02\x7b\x6c\x71\x8a\x6e\x0f\xc1\x5d\x19\x45\xad\xda\ -\xf2\x85\x59\xd7\x4a\x4a\xbd\x56\xf2\x1e\x8c\x27\x51\xd1\x6e\x40\ -\x3d\x94\xe3\x80\xf9\x58\x67\x04\x0b\xc9\xaa\x82\x6a\x84\xe2\x20\ -\xcc\x5b\xbb\x0b\xbe\x5e\xbd\x93\x89\x60\x99\xbf\xae\x58\x4e\xc3\ -\x38\xcf\x09\x47\x2a\x2c\xc5\xce\xd0\x61\x39\x0f\x49\x53\x4e\x78\ -\x2c\xf4\xc6\x00\x3c\x27\x3d\xa7\xa9\x41\x93\xec\xee\x8f\xaf\xc9\ -\xed\xc5\xa7\xad\x22\xc8\xd9\x01\xa0\x0c\x55\x8a\xf0\x14\x23\x50\ -\x4d\xd5\x4c\xf5\x20\xa1\xe7\x13\x70\x27\x10\xb8\x6f\x56\x80\x2d\ -\x65\xb8\x3c\xf0\x12\x23\xcb\x91\x6b\x6e\x86\xa2\x2e\xff\x84\x67\ -\x3f\xdc\x00\xdd\x4c\x8e\x56\x9d\xb3\x22\x98\x5d\x05\x09\x82\xe4\ -\x2a\xe4\x3d\x18\x2f\x52\x21\x79\x04\x23\xc9\x02\x84\x24\x93\xe3\ -\xa8\x4d\x89\x40\xf9\xc1\x7a\x94\x81\xc2\xa2\x89\x02\xca\x77\x11\ -\x06\x85\x44\xb0\x98\x6c\x0e\x28\x41\x67\x09\x16\x16\x15\x12\x9e\ -\x03\xaa\x22\x87\x0f\x76\xbb\x3a\x26\x3c\xe7\x5e\xbf\x2d\x66\x2a\ -\x24\x81\xa3\x53\x29\x82\x54\x4c\xa9\x5a\x30\x91\xc4\xf7\xb9\x98\ -\xa2\xb1\x26\xe9\xcf\x96\x81\x2d\x71\x18\x94\x5f\xd1\x03\x76\xde\ -\x34\x0a\xfe\x35\x37\x8b\x2d\xa0\xd7\x9a\x2d\x5e\x24\xc1\xec\x39\ -\x96\xa0\x33\x7b\x6c\xbc\x07\xe3\x41\x04\x49\x2a\x6a\x34\x42\xb2\ -\x10\xd3\xad\x75\x1c\x07\x0d\x24\x82\xe5\x7b\xac\x4b\xe6\xad\xdd\ -\xcd\x40\xf9\x66\xcd\x2e\x58\x62\x3c\x88\xc5\x78\x64\x52\x2f\x5f\ -\xad\x2e\xa8\x82\x9c\xb2\xe0\x60\x09\x04\x09\x39\x61\xa8\x90\xd0\ -\x39\xfd\x41\x22\xf7\xe2\x07\x07\x09\x45\x1b\xea\x40\xf5\x77\x2e\ -\xbf\xe9\x20\xc2\x52\xe6\xf1\xc2\x91\xff\x2c\x80\x82\x11\x33\x21\ -\x1d\x23\x49\x67\xb3\xab\xd5\x21\x21\x61\x5d\x6b\x4f\xd0\x49\x9e\ -\x03\xbc\x07\x63\x5d\x82\xc5\x0b\xdd\xf3\x4e\xc0\xc4\x3c\x17\x42\ -\x52\x15\x52\x24\xe1\x69\xa9\xf9\x30\x2b\xe4\x97\x48\x87\x22\x56\ -\x9f\xf0\xb4\x0a\x61\xb1\x1e\x74\xc0\x01\x9e\xf3\x28\x92\x21\xf1\ -\xdf\x8b\x4f\xf5\x45\x48\x90\xb8\x02\x45\x12\x82\x24\xb8\x79\x34\ -\xfe\x20\x61\xcd\xde\x47\x69\xd3\x22\xff\x35\x13\xdd\x28\xca\xb1\ -\xb8\xcf\x3c\x64\x87\xc9\x59\x36\xe8\x64\x74\xb4\x09\x24\x8a\x6a\ -\x30\xf5\xf2\x94\x73\x1e\x88\x6d\x61\xa1\x27\x6c\xac\x86\xee\xdf\ -\xe4\xc3\x7f\xd6\x1f\x80\xcd\xdb\x1c\x6c\x4e\x09\xcf\x31\x83\x15\ -\x45\x16\x55\xbc\xc7\x23\xaa\xc2\x6a\x30\x23\x2c\x87\x3c\x7c\x27\ -\xa2\x3b\x71\x43\x07\x54\x15\x16\x24\x14\x49\xf0\x9c\x4d\x43\x22\ -\x0f\x9f\x09\x66\xe9\xa3\xf3\x90\xf0\xce\x23\x43\x42\xd7\xc7\x7b\ -\xae\x2a\x06\x89\xdb\x0d\x99\x15\x6e\xf8\xe7\x4e\x0f\x5b\xce\x08\ -\x33\x1f\xfe\x77\xdd\x0a\x12\xcd\xae\xba\x04\x0a\x2b\xbc\x07\x63\ -\x56\xb9\xc7\x41\x44\x48\x52\x66\xaf\x84\xf6\xf7\x3e\x0b\xc3\x9e\ -\xfe\x2f\xcc\xdb\x64\x83\xf5\x08\x0b\xd7\x29\xa3\x54\x2b\x10\x96\ -\xbc\x43\x7c\x58\xe8\x6e\xcc\x77\xc2\x70\x21\xa9\x81\x22\x84\xa1\ -\xa9\x73\xca\x90\x84\x12\x49\x1a\x9f\x87\x44\x2d\x68\xc1\x42\xb2\ -\x8e\x20\xd9\xae\x74\x0e\x4b\x9c\xef\xb9\x35\x65\xf1\x00\x81\x52\ -\xcb\x7d\x30\x16\x45\x90\x6c\xaa\x81\x94\xb7\x7e\x84\xc4\xbb\x9f\ -\x84\x0e\xb7\x3f\x04\xd7\xf5\x19\x0b\x43\x66\x7e\x02\xdf\x6e\x2c\ -\x45\x58\xec\x5c\xa7\x8c\x56\xfd\x40\xb0\x1c\x71\x36\x82\x85\x9c\ -\xb6\x61\xea\x45\x4e\x28\x6f\x0d\x11\x06\x24\x4d\x44\x12\xfa\x3b\ -\x41\x69\xc3\xb4\x8c\xf7\x7c\x5f\x45\x02\x12\x92\x0a\xc9\x03\x08\ -\x09\x7d\xa7\x6d\x0e\x89\xa2\xf8\x01\x85\x20\xa1\x91\xa5\xb3\x96\ -\x43\xe2\xb0\xa9\x90\xd8\x7b\x34\x24\xf6\x1d\xcb\x7e\x12\x2c\x23\ -\x5e\xfe\x16\x16\x98\xcb\x61\xdd\xd6\x18\x83\x65\x4b\x35\xe4\x1c\ -\x76\xc2\xe1\x26\x60\xa1\xbe\x93\x60\x9d\xd0\x57\xc1\x42\x12\xb9\ -\x48\xe2\x7f\x0a\x34\x45\x92\x63\xf8\x1e\x69\xd7\xe4\xfb\xa3\x0c\ -\x12\x52\x7c\xa4\x5e\xb4\x01\xcc\x66\x8c\x24\x6f\xfe\x00\x89\x83\ -\xa7\x40\xe2\xed\x0f\xcb\x90\x28\xea\xd0\x6b\x14\xb4\xc7\xbf\xff\ -\x7d\xd6\xf7\xb0\x40\x3a\x82\xb0\xc8\xb3\x17\x63\x42\x79\x55\xb0\ -\x9c\xc1\xd2\x38\x0d\x93\x9d\xbd\x36\xa0\x13\x36\x56\x64\x21\xa1\ -\x99\x91\xcd\x85\x84\x76\x4b\x5e\x5e\xee\x86\x91\x5b\xa9\x39\x56\ -\x16\xf7\xbb\x6e\x0b\xb1\xd4\x4b\xf2\x1c\xe5\x3e\x18\x2b\xb2\xd6\ -\xc9\x35\x09\x41\x32\xe4\xf1\x46\x90\xa8\x6a\x7f\xfb\x23\xd0\x7e\ -\xe0\x64\xb8\xff\xed\xa5\xb0\xd0\x72\x14\x32\xb7\xc4\x12\x2c\x95\ -\xf0\xf5\x76\x17\xe4\x1c\xf3\x34\x8a\x2c\xa1\xa4\x5a\x24\x39\x12\ -\x45\x0e\x12\x5a\x88\x82\x77\x1e\x92\x9a\x0e\xf2\x9e\xab\x8a\xd6\ -\x6d\x3e\x82\x90\x2c\x3c\xe2\x86\x41\x85\x6e\xb6\x43\x00\xd5\x25\ -\xdc\xef\xba\xcd\xe4\x3a\x9e\x20\x98\x5c\x45\xfc\x07\x63\x44\x16\ -\x2f\xa4\x7c\xb4\x09\x12\x87\x62\xba\x75\x1b\x1f\x12\x55\xed\x11\ -\xa2\x0e\x43\x1f\x87\x87\x3e\x58\x09\x8b\x72\x8e\x21\x2c\xf2\x94\ -\xdf\x96\x50\xbd\x56\xb2\x66\xb4\x94\xad\xc8\xaf\x84\x05\x5b\x9c\ -\xb0\xac\xe8\x38\xac\x2e\x3e\x0e\x96\xa3\xde\x46\xb0\x04\x2b\x72\ -\x7e\xba\xfb\xf3\x9c\x9a\xd4\x12\x90\x94\x3a\xf9\xcf\x27\xd1\x36\ -\x19\x14\x4d\xbe\x3b\xec\x86\x01\x08\x49\x72\x54\x42\x42\x29\xa0\ -\xa7\x3c\x41\x90\x1c\xb1\xdb\x33\x8f\x29\x97\xb0\x74\x2f\x24\x8d\ -\x7d\x2b\x20\x24\xaa\xda\xe3\x71\x49\x77\x4d\x83\x31\xff\x5d\x07\ -\x8b\xf1\x4e\xbd\xb6\x30\xf2\xb0\x10\x1c\xcb\x2d\xe5\xac\xdf\x65\ -\xb1\xf1\x20\x1b\x2f\x16\xea\xa8\x63\x1a\xac\xf9\x03\x2a\x03\x21\ -\x59\xbe\xeb\x38\x64\xef\x3e\x0e\x9b\x50\xab\xf6\x1c\x87\xfc\x2a\ -\x4f\x93\x4d\xc7\x4d\x89\x3a\x09\x09\x92\xa6\x87\xba\x04\x0f\x09\ -\xad\xd2\x12\x08\x12\xaa\x99\x02\x41\x42\xfa\x06\x21\xe9\x5f\xe0\ -\x86\x94\x28\x85\x84\x24\x48\xae\x5d\x08\x8a\xd3\xc2\x7b\x30\x26\ -\x54\x70\x1a\x74\x1f\x6e\x80\xc4\x3b\x26\x9c\x2f\xde\x83\xd0\x0d\ -\xb7\x3e\x04\x29\x23\x66\xc0\xb8\x4f\x36\xc0\xe2\xdc\xc8\xc3\xb2\ -\x22\xb7\x02\xbe\x5b\x5f\x0c\xdf\xac\x29\x62\xa2\xdf\x7f\xb0\x96\ -\x73\x8f\xe5\x89\x20\x59\x86\xb5\xc9\x77\xdb\x9c\xf0\x83\x0f\x24\ -\xaa\x32\xf7\xd5\x41\x6e\x65\xe3\x34\xac\x29\x11\x24\xbb\x2b\x02\ -\x41\x42\x8e\x1d\x5c\x24\x21\x10\x78\xe7\x21\xd1\x63\x6c\x9d\x62\ -\xce\x73\x55\xa9\x90\x7c\x71\xd0\x0d\x7d\xf3\xe5\x59\xa6\xd1\x0a\ -\x09\x49\x34\x3b\xa5\x04\x2c\x9a\x16\xf3\x1e\x8c\x7a\x61\x81\x45\ -\xc3\xac\x53\x5e\xca\x80\xc4\x5b\x1e\xe4\x02\xe1\x4f\x04\x8b\x6e\ -\xc4\x53\x30\xe1\xd3\x0d\xb0\x24\x82\xb0\x50\x34\xa1\x81\x94\xea\ -\x20\x4a\x75\x7c\xd8\xc2\x4d\x25\x41\xf5\xe8\x13\x24\x4b\x08\x92\ -\xad\x2e\xf8\x91\x03\x09\x13\xfe\x7d\x2d\xc2\x52\x50\x8d\x91\x05\ -\x1d\x8e\xe7\x8c\xaa\xc8\xf9\xfd\xdd\xfd\x09\x92\x60\x1b\x03\xe4\ -\x74\xcb\xdf\xc2\x79\x81\x37\x52\x55\x21\xf9\xea\x90\x1b\x6e\xcf\ -\x73\x43\x92\x29\xba\x21\x91\xe5\x5c\x95\x20\x58\xbc\x1f\xf2\x1f\ -\x8c\x72\x11\x28\xb4\x84\xcd\xcc\x2f\x10\x94\x07\xb8\x30\x04\x12\ -\xc1\x22\x8c\x7c\x0a\x26\x7d\x26\xc3\xb2\x26\x02\xb0\xac\xca\x47\ -\x50\x30\xe5\xfa\xc6\x07\x14\xd2\xfc\xf5\x7b\x03\x82\x42\x90\x7c\ -\x8f\x22\x48\x56\x36\x05\x89\x8f\xd6\x1d\xa8\x83\x2d\x35\x4d\xc3\ -\x22\xd7\x24\x81\x21\x69\x6a\xb1\x0b\x5f\x05\x86\x84\xb3\x4e\x71\ -\x03\xf9\x42\xd2\x8b\x20\x89\xa2\xe6\x5f\x7f\x12\x24\xf7\xfc\x04\ -\xd1\xec\x9a\xc5\x7b\x30\x26\x84\x1f\x74\xf2\xbf\xe6\x43\x62\xda\ -\x3f\xb9\x20\x04\xa3\x76\x04\xcb\x88\x27\x61\xda\xb7\x16\x58\x5e\ -\x50\x03\x6b\x9a\x51\x78\xab\xa2\xd4\x6b\x3e\xa6\x5b\x5f\x29\xd1\ -\x84\xb4\x08\x23\x0a\xef\x58\x55\x04\xc9\x42\x84\x6c\xc1\x36\x17\ -\xac\x46\x48\x36\x73\xc0\xe0\x29\xab\xa4\x0e\xb6\xd6\xf2\x61\xa1\ -\x14\xa8\xa9\x39\x2a\x72\x1d\x11\x1c\x24\x74\x9e\x40\x91\x24\x10\ -\x24\x74\x7d\x34\xd8\xf3\x73\x4c\xb7\x7a\x63\xba\x15\x2b\x90\x90\ -\x74\x66\xef\xdc\x04\xbd\xc9\x39\x86\xf7\x60\x4c\x28\xff\x24\xa4\ -\xbc\xb9\x1c\x12\xd1\xd9\x79\x10\x04\xab\x76\xb7\x3e\x08\x1d\xef\ -\x7b\x0e\x66\x2c\xc8\x85\x1f\x22\x00\x8b\x5a\xcc\x2f\xdc\x74\x00\ -\x16\x6c\xd8\xc7\xd2\x2e\x56\xd0\x73\x8e\x25\xd1\xc2\x16\x0b\xf2\ -\x6b\x20\x63\x9b\x1b\xd6\xa2\xf3\x07\x0b\x89\xaa\x8d\x04\x0b\x27\ -\xb2\x34\x55\x4f\x9c\xab\x23\x82\x84\xc4\x5f\x4d\x12\x0c\x24\xd4\ -\x47\x52\x8a\x3f\x3f\x29\x73\xc3\x6d\x31\x06\x09\x93\xe4\x7e\x32\ -\x41\xb4\xba\xfb\x71\x1f\x8c\x05\xe5\x9d\x00\xe1\xdb\x2d\x90\xf4\ -\x8f\xe7\x9b\xec\x3f\x09\x56\xd7\x63\xfa\xd6\x09\x61\x79\x26\x83\ -\x60\xa9\x86\xd5\x11\x80\x85\x22\xcb\x0f\x08\x88\xbf\x94\x8b\x20\ -\xf9\x0e\xe1\x5c\xb8\xdd\x03\xeb\xd0\xe9\x43\x85\x44\x15\x45\x16\ -\x4a\xc3\xc8\x29\x7d\x9d\xb4\xa1\xa3\x9f\x83\xc4\xe7\x98\xa6\x44\ -\x2d\x57\xcd\x85\x84\xfa\x48\x68\xef\xfd\x0f\x4a\x31\xdd\x8a\x45\ -\x48\x50\x82\xc9\x7e\x6f\x82\xb8\xd9\xd1\x3e\x66\x37\x10\xc2\x3a\ -\x45\x6f\x72\xc9\x05\x3d\x81\x12\x42\xcb\x17\x4f\xd7\xdf\xf2\x20\ -\x74\xfe\xc7\xb3\xf0\xc2\xe2\x42\xf8\xb1\xb0\xb6\xd9\xb0\xc8\x6a\ -\xfa\x1c\x04\xc9\x7c\x8c\x24\x8b\x76\x78\x60\x3d\x3a\x7b\xb8\x90\ -\x90\x36\xa2\x36\x20\x2c\x05\x9c\xc8\x42\x29\x16\x39\x7c\x6b\x43\ -\x42\xe3\xb6\x76\xda\xdd\x30\xeb\x80\x1b\x6e\xce\x95\xfb\x49\xb8\ -\xdf\x63\x54\x0b\x6b\xe1\xcd\x8e\x6e\x09\xc9\x19\x70\x09\xfe\xe7\ -\x38\xff\xa0\x18\x10\x8d\xf1\x5a\x59\x06\x49\x53\xfe\x03\x89\x7d\ -\xc6\xa0\xc3\x93\xf8\x20\x04\xa3\xeb\xd3\x1e\x80\xee\x8f\xbc\x0c\ -\x2f\x2f\xdf\x0e\x2b\xb0\xb8\x8f\x0c\x2c\x8d\x45\x90\xcc\xc3\x48\ -\xb2\x18\x21\xc9\x42\x27\x6f\x0e\x24\xbe\x22\x58\x68\xb1\x0a\x2a\ -\x9a\x7d\x9d\x96\x00\x89\x1c\x24\x81\x0b\x77\x82\x84\xae\xe3\x75\ -\x84\xe4\x6f\x08\x09\xf5\x93\x70\xbf\xbf\x28\x17\x6d\x87\xd2\x61\ -\x69\xe5\x95\x09\xb4\x97\xb6\x60\x76\xc6\xf6\x2c\x47\x15\x96\x89\ -\xef\x60\xbd\x12\x7a\x53\x71\x43\xfd\xf5\xb6\x87\xa1\xfb\xa8\x57\ -\xe0\x35\x84\x65\x65\xc4\x22\xcb\x79\xd1\xea\x2f\x04\xc9\x52\x84\ -\x64\xe3\x1e\xbe\xc3\x37\x47\x46\x9b\x17\x76\xa2\x93\x36\xd5\x1a\ -\xe6\x4f\x32\x24\xfc\xe1\x2d\xa4\x26\x57\xbc\xf7\x11\x41\x42\x8b\ -\x65\xbc\xbc\xdf\x0d\x3d\x72\xe4\x61\x29\xdc\xef\x2d\x06\x24\x98\ -\x5d\x87\xd9\xda\xc3\xb4\x52\xb7\x20\xb9\x32\x58\x1a\xc3\x39\x30\ -\x66\x94\x77\x12\xc4\x25\xc5\x90\xfc\xf0\xab\x11\x83\xe5\x46\x84\ -\xe5\x8d\xe5\x3b\x18\x2c\x6c\x28\x4a\x03\x87\x0f\x47\x04\xc9\x37\ -\x05\xb5\xb0\x04\x21\x89\x54\x14\x69\x28\x4a\xc3\xb2\x11\x16\x5a\ -\x8d\x32\x14\x58\x08\x12\x6a\x32\xe6\x01\x42\x0a\x05\x92\x57\x10\ -\x92\x6e\x56\x4c\xb7\x4c\x9c\xef\x2a\x66\x44\xdb\x3e\x38\xd6\x9f\ -\xdb\xf6\x01\x41\x79\x3d\xe6\x41\x21\xe5\x62\x71\xff\x75\x3e\x16\ -\xf7\xcf\x35\xbb\xb8\x27\x11\x2c\x37\x8d\x7a\x15\x66\xff\x80\xb0\ -\x20\x28\xcd\x85\x85\x20\xf9\x9a\x20\xd9\xe9\x6d\x31\x48\x7c\x65\ -\x2c\xf3\xc2\x6e\x27\xa6\x61\x1c\x87\x6e\x28\x15\x92\xa6\x7a\xef\ -\x83\x86\x04\x23\xd9\xab\x2a\x24\x31\x1c\x49\x98\xa8\xaf\xce\xec\ -\xf9\x42\xd9\xf6\x01\x2e\x12\x25\xe7\xb8\xb8\x00\x45\x79\x0f\xba\ -\xb9\x9b\x21\x71\xf8\x53\x11\x83\xe5\x6f\x18\x59\xe6\xae\xdf\x07\ -\xab\xb7\x60\x64\x69\xe0\xfc\xc1\x8a\x20\xf9\xaa\x15\x21\x51\x65\ -\x3e\xe4\x65\xce\xeb\x0f\x16\x1a\xe3\x45\xe9\x96\x7f\x48\xfc\x0f\ -\x6f\x51\x0b\xf7\x17\xf7\xb9\xa1\x3b\xa6\x5b\x31\x0f\x09\x89\xfc\ -\xc9\xe2\x99\x44\x8c\xb0\xec\xcb\xb0\xd9\x99\x1c\x37\x7b\x38\x5a\ -\xbd\x20\x9a\x9c\xf2\x2c\x47\x9a\x9b\xd2\x7b\x14\x17\x80\x50\x74\ -\xdd\xad\x0f\xc3\xed\x93\xff\x0d\x9f\x6e\x2a\x0d\x0b\x16\x35\x92\ -\x2c\xde\xd1\xba\x90\x90\x36\x63\x0d\x44\xb0\xb0\x02\xbf\x81\x73\ -\x53\xcf\x3d\x41\xe2\x2f\xdd\xa2\x09\x59\x81\xc6\x80\x1d\x45\x48\ -\xb6\xd5\xba\xe1\xd9\x62\x37\x74\x8d\x87\x48\xa2\x0a\x7d\x29\xd5\ -\x68\xef\xcc\x20\x21\xa3\x96\x2f\xc1\xe2\x71\x72\x0f\x8e\x45\xe5\ -\xd4\xb1\xd9\x8e\xc9\x33\x3e\x6b\x76\x93\xb1\xaa\xeb\x7a\x8d\x82\ -\xde\x53\xde\x85\x2f\x36\xd9\x60\x4d\x08\x73\x59\xce\x45\x92\x10\ -\x20\xd9\xbc\xe7\x04\x6c\x2e\x3e\xc9\x7e\xf2\x1e\x0f\x55\xbe\xb0\ -\x1c\xf2\x71\x70\x4a\xa5\xfc\xb5\x6e\x11\x24\x34\xc9\xcb\x5f\xef\ -\x3d\xcd\x4a\x2c\xac\x71\xc3\xf4\x3d\x6e\xb6\xe6\x56\xac\xb6\x6e\ -\xf1\x44\xbb\x02\xf7\x90\x5b\xbc\x14\x4b\x87\x8b\x45\x8b\x77\x59\ -\x5c\xa4\x5f\xaa\xa8\xb8\x5f\x75\x10\x92\x47\xbf\x0e\x89\x69\xe1\ -\x8d\x05\xab\xa7\x3e\x63\xe0\xba\xdb\x47\x41\xff\x69\x1f\xc1\xbc\ -\xec\x32\x58\x5d\x18\xb8\x5e\x09\x07\x12\x12\x8d\x39\xa3\xce\x4a\ -\xfa\x99\x8d\xc0\xf0\x8e\x09\x55\x04\x8b\x74\x10\x61\xf1\xa9\x59\ -\x28\x52\xd0\x0c\x49\xde\x30\x97\x3d\x95\xb4\x69\x51\xd3\x90\xa8\ -\xb3\x12\x73\x10\x92\xa9\xbb\xdd\x90\x4a\x0b\xd3\xc5\x11\x24\xc4\ -\x82\x68\x71\xe5\x9d\xdb\x96\x8e\x19\xfe\x47\x6f\x72\x3e\x15\xb3\ -\x1d\x8f\x4d\x29\xff\x14\x08\x9f\x4a\x58\xaf\xcc\x80\xc4\x5e\x8f\ -\xf0\x01\x08\x45\x08\xcb\xf5\x7d\xc6\xc2\x1d\xd3\x3f\x82\xef\x2d\ -\xe5\x7e\x23\xcb\x9a\xfc\xca\xb0\x6a\x12\x6a\x30\xa0\x61\xf9\xb4\ -\xde\x31\xfd\xa4\x15\x29\x23\x15\x59\x36\x21\x2c\x56\x8c\x2c\xb4\ -\x5e\x30\x39\x3a\x39\x3c\xc1\x42\x33\x1e\x7d\x61\x51\x17\xb9\xf3\ -\x07\x09\xf5\xb8\x5b\xab\xdd\x30\x05\x21\xe9\x18\x6f\x90\x90\x08\ -\x14\xb3\x63\x4e\x42\x7a\xfa\xc5\x0a\x25\xb2\xe9\x8d\xb5\x06\x43\ -\xce\x09\xfe\x93\x62\x55\x2c\x42\x7a\x20\x79\xe6\xe7\x58\xd8\x47\ -\x00\x14\x52\x9f\xd1\x70\x5d\xef\xb1\x30\xe4\xf9\x2f\x60\x19\x3a\ -\x31\x0f\x16\x19\x12\x3b\x83\x84\xeb\xb0\x7e\x94\xb1\x71\xbf\xb2\ -\x7c\xab\x3c\x98\x72\x1e\x02\x93\xb9\xcd\xc9\x3d\x36\x1c\x65\x23\ -\x2c\x5b\xca\x79\xb0\xd0\xbc\xf7\xc0\x4b\x13\xa9\x90\x48\x55\x6e\ -\x98\x54\x14\xa7\x90\x90\x68\x11\x70\xa3\xbd\x0f\xa2\xe1\x13\x51\ -\xd0\x92\x77\xc0\x25\x98\x7e\xc5\x4f\x9d\xa2\x2a\xff\x34\x08\x5f\ -\xe5\x42\xd2\x3d\xcf\x44\x26\xaa\x90\x30\xb2\xfc\xb5\xdf\x78\x18\ -\xf6\xfc\x97\xb0\x9c\x52\x24\x9f\x29\xc5\x04\xc9\xd7\x85\x04\x49\ -\x1d\xd7\x51\x03\x69\x7e\xe6\x9e\x7a\xc3\xf3\x69\x04\x32\x9d\x97\ -\x77\x6c\xb8\xca\xde\x8b\xb0\x1c\xf5\x34\x82\x85\x7a\xee\x83\x85\ -\x64\x02\x42\x42\x6b\x3a\xc7\x25\x24\x24\xac\x4f\xc4\x35\x67\xaf\ -\x50\xf0\xf0\xb1\x8c\x8c\x9f\x08\x66\xf7\xf2\xb8\xaa\x53\x48\xca\ -\xfb\x61\x85\x3d\x45\x95\xfe\x13\x20\xb1\xdf\x38\x3e\x00\xa1\xa8\ -\xf7\x68\x84\x65\x02\x83\xe5\x07\x65\x2e\x4b\x73\x21\x21\xd1\xa2\ -\xe0\x5f\xae\xdc\x7e\x6e\x78\x3e\xc1\x42\x51\x8b\x77\x6c\x73\xb4\ -\xb9\xb8\x0e\x0a\xcb\x3d\x70\xd8\xcb\x87\xa2\xa1\x54\x48\xcc\x98\ -\x6e\x31\x48\xe2\x35\x92\x90\x58\xda\xe5\x2a\x4c\xc7\xda\x5d\xa1\ -\xc3\xc7\x30\x17\xc3\x03\x26\xc6\xe5\xc6\xa7\x58\xab\xe8\xbe\xc4\ -\xa8\x72\xef\xb3\x2c\x75\x4a\xbc\x63\x62\xc4\x60\xb9\x1e\x61\xb9\ -\x0b\x61\xa1\x11\xc2\xdf\x6e\x75\x87\x95\x6e\xf9\x2a\xab\xc8\x0b\ -\xcb\xad\xe5\xb0\x10\x53\x30\xb9\x46\x39\x0a\x1b\x77\x35\xef\x9c\ -\x3c\x51\xef\xfd\x26\x84\x65\x0b\xad\xec\x12\x00\x96\x7a\x90\xec\ -\x8a\x73\x48\x50\x06\x5a\xe3\x58\x72\x3e\x49\x8d\x5c\x0a\x1d\xf5\ -\x8d\xfa\x53\x52\x0b\xce\x70\x9f\x1c\xd3\xa2\xbe\x15\xa3\x03\x92\ -\x69\xe0\xe4\xad\x0f\xc8\x90\x44\x08\x96\x0e\x04\x4b\xff\x89\x30\ -\x74\xc6\x7f\x61\xd9\x36\x37\x64\x17\x9f\xe2\x3a\x66\x28\xda\xb8\ -\xab\x0e\xd6\x6d\x77\x42\xe6\x56\x3b\xfb\x9d\x77\x4c\x24\x44\xb0\ -\x6c\xdc\x8b\xb0\x54\x34\x0d\x8b\x0a\x09\x15\xee\x13\xe3\x3d\x92\ -\x28\x4a\xc5\x1b\x6b\xbd\xfe\x93\x86\xd6\xaf\xf8\xec\xa5\x7a\xab\ -\x67\x5b\xdc\xa5\x5f\xa4\x82\xd3\x90\xf2\xc2\x77\x18\x51\xd0\xc1\ -\x69\x94\x31\x41\x82\x0e\xde\x6c\x58\xb0\x56\x49\xbe\xf3\x51\xb8\ -\x01\x75\xff\x9b\x4b\x98\x63\x67\x47\xa0\x95\x8a\xf5\xa5\x44\xaa\ -\xb5\xcb\x8f\x08\x96\x2c\x9a\x7f\x8f\xb0\x1c\xe1\xc0\x42\x9d\x89\ -\x46\xac\x49\x68\x89\xd3\x8e\xf8\x39\xc6\x3b\x24\xcc\xf7\x2d\xee\ -\x7d\x5d\x2d\x55\x57\x29\x58\x70\x0c\xe0\x62\xbd\xe4\x78\x31\x2e\ -\xd3\xaf\xbc\x93\xa0\xfb\xc4\x04\x49\x23\x9e\x3e\xdf\x5b\xaf\xc2\ -\xd2\x37\x4c\x58\x10\x92\x94\x81\x93\x41\x37\xf8\x71\xd0\x0d\x9a\ -\x02\x89\xc3\xa6\xc3\xa8\xb9\xeb\xd1\x01\x4f\x44\x04\x96\xd6\x12\ -\xc1\xb2\x1e\x61\xc9\xf7\x81\x85\x22\x09\xf5\x93\xd0\x3a\xc0\x23\ -\x31\x52\xd2\x5e\x33\xd1\xb4\xc4\x69\x8b\x89\xb2\x0f\xc9\xf9\x59\ -\x3a\xb2\xa0\x50\xc1\x31\x80\x8b\x52\xb2\x6b\xf4\xa9\x5b\x80\x7f\ -\x92\x58\x16\xad\x01\xb6\x64\x2f\x24\x3d\xf2\x6a\xfd\x31\x60\x04\ -\xcb\x9d\x93\x42\x8e\x2c\x49\xbe\x90\x28\xa2\xff\xa7\xdc\xf3\x0c\ -\x8c\xf9\x6f\xec\xc1\x42\x73\x62\xd6\x61\x1a\x96\x8b\x35\xcb\x51\ -\x84\x85\x40\x59\x71\xd4\x0d\x77\x61\xdd\x15\xad\x0b\xd3\xb5\x84\ -\xa8\xf4\xd0\x65\xdb\x7b\xd7\xef\x68\xe4\xd8\x9f\xb3\x4a\x2e\x13\ -\x2d\x1e\x29\xee\xd2\x2f\x56\xa7\x38\xe5\x3a\xe5\x36\xdf\x39\xf6\ -\x98\x86\xf5\x47\x48\x06\x04\x0f\x0b\x41\x92\x3c\xa0\x3e\x24\xe7\ -\x60\x19\xf0\x18\xe8\xee\x99\x09\x13\xbe\x34\xc1\xa6\x56\x4a\x9f\ -\x22\x25\x8a\x2c\xeb\x68\xcd\x30\x84\x65\x35\x46\x92\x21\x5b\xa2\ -\x7f\xcd\xad\x88\x8a\xa5\x5d\x9e\x6d\xc9\x59\xf0\x73\x05\x07\x3f\ -\x96\x91\xf1\x13\x5d\xb6\xf3\x39\x43\x6e\x9c\x0c\x92\xf4\x55\xe1\ -\x19\x48\x79\xea\x63\xce\x7c\x15\xa5\x66\x19\xf8\x18\x42\x33\xbe\ -\xc1\x63\xf5\xe5\x0f\x12\x55\x04\x8b\xf8\xf7\xe7\x60\xf2\xfc\x5c\ -\xb9\xd6\x68\xe0\x90\xd1\x2a\x5a\x1e\x89\x60\x79\x6f\xa7\x17\xee\ -\x28\xa4\x49\x4b\x17\x10\x24\x28\x36\x30\x18\x4b\x0f\x2a\x41\x14\ -\x1a\xfc\x18\x86\x1c\x03\xa6\x5f\x58\xd0\x9c\xe5\x9d\x2c\xa6\xb5\ -\x05\x41\x79\xf6\x2b\x7e\x2f\x3d\x2b\xf0\x11\x92\x81\x8f\x36\x19\ -\x59\x18\x24\x0d\xd2\xad\xa6\x94\x3c\xe0\x51\x30\xdc\x97\x0e\xd3\ -\xbe\xdf\xca\xc6\x6b\xb5\x34\x2c\xcd\x2d\xfe\xd5\xeb\x7b\x7f\x7b\ -\x1d\xa4\x59\x3d\x31\xb9\x08\x44\xb3\x65\x71\x9f\x49\x35\xbb\xc4\ -\x04\x68\xd0\x1b\xdf\x94\x75\x5f\x50\x76\xb9\x4e\x72\x9b\x0d\xf1\ -\x36\xf6\x6b\xeb\x59\x48\xa1\xe1\x2c\xf5\x52\x2f\x1f\x11\x2c\x4d\ -\xa5\x61\x18\x69\x82\x85\x44\x15\xb5\x86\x75\xfc\xe7\x0b\xf0\xd4\ -\x92\x6d\x2d\x0c\x4b\x1d\x1b\xfa\x4f\x03\x35\xe9\xf7\x50\x81\x51\ -\xaf\xeb\xed\x6d\x75\xd0\x13\x21\xa1\x74\x8b\xfb\xf9\xc5\xb3\xa8\ -\x93\x51\x72\x6e\xed\x2e\x95\x5d\xae\x60\x10\x84\xd1\x68\x62\xc9\ -\x33\x30\xae\xfa\x54\x2c\x28\x0c\xad\xc9\xd3\xe6\x20\x28\xfe\xa6\ -\x0a\x2b\x69\x18\x46\x04\x16\x61\x18\x3c\x8d\x0b\xf7\x60\x45\xb0\ -\x74\x7a\xe0\x45\x78\x7a\xe9\x76\x84\x25\xf2\xf5\x0a\x75\x50\x2e\ -\xce\x2e\x83\x6f\xd7\xed\x61\xfb\xdf\x2f\xda\x5c\x0a\xeb\x76\xb8\ -\x83\x86\x45\x4d\xb7\xde\x42\x48\x6e\xc2\xcf\x28\x6e\xe6\x92\x84\ -\x28\x43\xfe\x69\x4c\xbb\xec\x93\x12\x32\xe0\x27\x0a\x05\xc1\x19\ -\xb5\x23\x8b\x16\x77\x05\xef\xa4\x31\x29\x9a\xa3\xb2\xfa\x30\x24\ -\x8d\x9b\x1d\xdc\xcc\x47\x06\x0b\x46\x96\x3b\x27\x85\x0d\x89\x2a\ -\x82\xa5\xf3\x03\x2f\xc0\xbf\x56\x16\x47\x1c\x96\xd5\x85\x35\xf0\ -\xf5\xaa\xf3\x2b\x52\xd2\x90\x97\xef\xb3\x6d\x2c\x82\xf1\x8e\xf7\ -\x15\x41\x42\xad\x5d\x6f\x22\x24\x3d\x2e\x60\x48\x48\x58\x8b\x55\ -\x74\xc9\x3a\xf6\x3b\xc5\xfd\x83\xb7\x4e\x73\xe7\xfe\x8f\x98\x6d\ -\x7f\xdb\x90\x77\x92\x7b\xe2\x98\x12\xb5\x66\xe0\xfb\x48\x79\x7f\ -\x1d\x24\x0e\x9b\x16\x78\x32\x17\x0d\x73\x41\x40\x92\x86\x4d\x87\ -\x14\x14\xcf\xf9\x43\x15\xd5\x2c\xdd\x1e\x7a\x19\x5e\xdb\x60\x03\ -\x63\x84\xe6\x98\x90\x32\xb7\x39\xd8\xd8\x30\xdf\x81\x94\x34\x44\ -\x3f\x50\x44\x51\x23\xc9\x6b\x5b\x35\x48\x0c\xb9\x27\x40\x9f\x6d\ -\x9f\x3d\x1c\x32\x42\x8b\x26\xcc\xb0\xa8\x17\x2d\x75\xd7\x09\x16\ -\x6f\x1d\x4b\x5b\x38\x2f\x10\x33\xa2\x68\xb2\xf2\x20\x24\x4d\xfc\ -\x37\x24\xf6\x0a\x30\x35\x98\x20\x1a\x34\x19\x92\xee\x7e\x0a\x74\ -\x43\x09\x92\x27\x40\x77\xd7\x93\xa0\x1b\x82\x3f\x39\x00\x84\x22\ -\x8a\x2c\x37\x8e\x7a\x15\x66\x6d\x28\x8b\x18\x2c\x59\x45\x1e\x98\ -\xb7\x76\x77\xbd\x88\xb2\x70\xe3\x01\xbf\xa0\xa8\x91\xe4\x15\x84\ -\xe4\x46\xfc\x6e\xe3\x69\x56\x62\xe8\xc2\x9b\x28\xa6\xe4\xd4\x80\ -\x15\xb0\xef\xa4\x29\x1b\x8e\xf9\x9a\x60\x74\xbf\x1b\xd3\x51\x85\ -\x20\xcf\x3f\x05\x29\x6f\x2c\x93\xc7\x77\x51\xcd\xc1\x03\x84\xa4\ -\x42\x32\x7c\x06\xe8\x7c\x23\xc9\x90\xa9\x08\x0b\x82\x43\xd0\xf8\ -\x38\x7e\x38\x4a\x42\x58\x7a\x3c\xf2\x2a\xbc\xcd\x60\x89\x4c\x1a\ -\xb6\x76\xab\x1d\xeb\x14\x1b\xd6\x28\x7b\xd8\x60\xca\xb5\x5b\xec\ -\xdc\xe3\x48\x2a\x24\x2f\x22\x24\xdd\x2f\x78\x48\xe4\x26\x61\x51\ -\x72\x2d\xe9\x94\x77\xf8\x67\x8a\xdb\x87\x61\x48\x98\xce\xec\x12\ -\x05\x4b\x9d\x3b\x66\xa3\x4a\xc1\x69\x10\x57\xd8\x20\x69\xcc\x1b\ -\xfe\x6b\x13\x06\xc9\x14\x48\x1e\x8a\x50\x70\xa3\x07\xfe\x6d\xe4\ -\x4c\x19\x9a\x46\x8f\x85\x26\x82\xe5\xa6\xf1\x6f\xc1\x87\xd2\xb1\ -\xc8\xc0\x82\xd1\x63\x03\x16\xf0\xeb\x30\x0d\x5b\xbf\xdd\xc5\x3f\ -\x06\x65\x44\x11\x24\xe9\x1a\x24\xe7\x64\x60\xeb\x2b\x78\xba\x85\ -\x1d\x4d\x54\x23\xd2\x74\x92\x6b\x61\xcc\x45\x15\x1a\x2a\x5d\x70\ -\x8a\x6d\x5d\x97\xfc\xd8\x7b\xc0\xe6\xa1\x34\x15\x4d\x54\x48\xb0\ -\x7e\xd1\x0d\xe2\x3b\x37\x13\x41\x74\x37\x46\x9b\x08\xa4\x61\x49\ -\x03\x27\xc3\xcd\x93\xde\x81\xb9\x04\xcb\x9e\x48\xa4\x61\x72\x3f\ -\x4a\x53\x29\x97\x1a\x49\x9e\x45\x48\xba\x22\x24\x71\x3f\xb8\x31\ -\x08\x51\x6d\x22\x4a\x8e\x25\xbf\x5f\xde\x9c\x68\xa2\x1a\x92\x26\ -\x64\x57\x75\xc7\xa8\xe2\xe5\xbd\x58\xd4\x89\x0a\x77\x04\x44\xbf\ -\xa1\x02\x52\x5e\x59\x04\x49\x7f\x7f\xd6\xff\xd6\x75\x4a\xba\xc5\ -\x20\xe1\x38\x74\x7d\x4d\x91\x61\xb9\x0b\xd3\xb2\x08\xc1\x92\x86\ -\xb0\x7c\x6a\xa6\xc8\x12\xb9\x02\xbf\xa1\x08\x92\x0d\xa8\x99\x5b\ -\xea\xa0\x0b\x41\xc2\xfb\xdc\x2e\x40\x51\xda\x25\x64\x3b\xba\x37\ -\x3b\x9a\xa8\x76\xad\x74\xf6\x72\xd1\xe4\xfc\xc2\x80\xb9\x3e\xef\ -\x05\xa3\x46\xd4\x7a\x81\xa0\xb0\x49\x5a\x54\xb8\xd3\x60\x47\x2a\ -\xde\xfd\x45\x92\x21\x58\x64\x07\x05\x89\x8f\x08\x92\x08\xc2\x72\ -\xeb\xa3\xef\xc0\xe7\x96\x8a\x16\x81\x45\x8d\x24\x4f\x11\x24\xf8\ -\x19\x69\x90\xc8\x52\xa3\x89\xb8\xa6\x9c\x33\xdd\x37\x5c\xa3\xa8\ -\x62\x74\x74\x10\x2c\xde\xe8\x5b\xf5\x9e\x22\x08\x8d\xd1\xa1\x15\ -\x57\x28\xcd\x7a\xfa\x73\x48\x1a\x39\x03\x12\xfb\x29\x20\xf0\x00\ -\x21\xf9\xa6\x5b\x1c\x07\x0e\xa8\x48\xc2\x82\xd7\x41\xb0\x7c\x65\ -\xa9\x8c\xe8\x88\x63\x15\x92\xa9\x85\x75\x6c\xcd\x2d\x0d\x92\xf3\ -\xa2\x52\x42\x67\x74\xdc\x18\xb1\x68\xa2\x1a\x5b\x7c\xc2\xe8\x7c\ -\xdf\x90\xdf\x4a\xbd\xf5\x14\x1d\xb6\x9c\x65\xc5\x38\xed\xac\x45\ -\xfd\x20\xec\x6f\x79\x24\xfc\x9d\xa2\x1b\x69\x53\x0d\x08\x0b\x76\ -\x40\xf2\x1b\xcb\x20\xe9\xe1\x57\x30\xcd\x1a\xaf\x00\xe2\xaf\x75\ -\x0b\xa3\xcc\xb0\xa9\x90\x4c\xcd\xbe\x1c\xc7\x0d\x5a\x11\x80\x44\ -\x15\xc1\xd2\x6b\xea\x47\xf2\x06\xa7\x11\x80\x45\x85\xe4\x71\x05\ -\x12\x1a\xe0\xc8\xfd\x9c\x2f\x40\x51\x66\x24\x98\x9d\x5f\x75\xca\ -\x83\x08\xd4\x26\x0d\x0d\xc9\xeb\x68\xb4\x5f\x2f\x5a\x3c\xd5\xec\ -\x2e\xce\xb9\x80\x88\x88\xce\x4d\xe9\xd3\xa7\x66\x48\x1e\xf3\x06\ -\x46\x88\xcf\x18\x04\x29\xef\x65\xb2\x89\x57\xba\x39\x1b\x21\xe5\ -\xdf\xab\x21\xf9\xe5\x0c\x48\x9e\xf2\x01\x24\x3d\xf4\x0a\x46\x90\ -\xa7\x59\x9d\xc1\x20\xf0\xd7\xfc\x4b\xc2\x54\x2c\x09\x23\x41\xf2\ -\x88\xa7\xb9\x0e\xdb\x96\x4a\x46\xf0\xfa\x3f\xf5\x31\xac\xa2\x3d\ -\x1c\x9b\x01\x8b\x0a\xc9\x63\x08\x49\x27\x0d\x92\x46\x12\xcc\xde\ -\x13\x29\x1b\xed\x5d\x22\x1e\x4d\x54\x4b\xcb\x82\x9f\xea\x25\xc7\ -\xf4\x8e\xdb\x5a\x68\x62\x17\x83\xc4\xcb\x20\x49\xa2\x1e\x74\x5a\ -\x5e\x88\x0a\x71\x82\x60\xe8\x13\x90\x74\xf7\x74\x74\x72\xfc\x3b\ -\x3a\x14\x1b\xe5\x4b\x8e\x4f\xd1\x83\x22\x44\x20\x40\x48\x04\x09\ -\xf5\xb6\x33\x48\x82\x88\x06\xf8\xba\xba\x01\x8f\x82\xee\x8e\x49\ -\xa0\xc3\x7a\x87\x89\xe6\x9b\xe0\xdd\x9f\x7b\x7c\x04\x94\x8c\xd7\ -\x35\x30\xfd\x6b\xc8\xf4\x71\xfc\x50\xa4\x42\x32\x01\x21\xa1\x35\ -\xb7\x34\x48\xea\x8b\x26\x25\x0a\x26\xc7\xab\xdd\xb1\xee\x56\xdc\ -\xba\x25\x0c\x2e\x4a\xcc\x3d\xfb\x7b\xc1\x52\x97\x13\xf1\xf9\x2a\ -\x04\x89\xe4\x62\x2b\xd1\x13\x10\xe7\x7a\xd0\x09\x00\x26\x02\x42\ -\x91\xfa\xb7\x86\x20\xf8\x13\xc2\x94\x84\xb0\xa5\x8c\x98\x81\x0e\ -\x19\x00\x12\x02\xa1\xdf\x78\x10\xee\x7d\x0e\x84\xc9\xff\x01\x31\ -\xfd\x5b\x10\x9e\xfb\x4a\xd6\xd8\xb7\x30\xe5\x9a\x0a\xba\xfe\x13\ -\x10\xa0\x89\xa0\x6b\xe6\x38\x30\x9e\x92\x87\x4e\x83\xc1\xcf\x7f\ -\x05\x52\x29\x70\x61\x68\x4a\x04\x09\x0d\x4b\x19\x5b\xa0\x41\xc2\ -\x13\xeb\x5c\xb4\x78\x8a\x3a\xe5\xd5\xfc\x49\x71\xe8\x16\x34\x0c\ -\x57\xa2\xc9\x75\x9b\x81\x9a\x60\x39\x17\x13\x96\xa8\xcf\x03\x7f\ -\xea\xe6\x6e\xc2\x3b\xfe\xd4\xf3\x90\x44\x4a\xf5\x20\xe1\x3b\x27\ -\x93\x0a\x08\x46\x1c\xf1\xcd\x1f\x41\xbf\x6c\x1f\xe8\xd7\x1e\x61\ -\x4d\xcd\xfa\xf5\xc7\x64\xad\x3a\x08\xe2\x0f\x07\x40\xfc\xd8\x08\ -\xe2\x6b\x8b\x41\xf7\x8f\x74\x39\xe2\x50\xa4\xe1\x9d\x33\x1c\xe1\ -\x75\xa4\x20\x2c\xc3\x5e\x98\x07\x39\x41\xc2\x42\x90\xd0\x3e\x90\ -\xa3\x14\x48\x2e\xa4\x09\x57\x41\x09\x3f\x13\xd6\xd2\x65\xac\xbd\ -\x0b\x7d\x38\x88\x89\x59\x11\x30\x6a\x52\xd3\x4b\xee\x0f\x53\x0b\ -\xb1\xd8\xe6\x5d\x54\x28\xb2\xd6\x81\x98\x5d\x0b\xba\x77\x56\x41\ -\x22\xa5\x55\x2d\x02\xc9\xe3\x81\x21\xb9\xf3\x51\x19\x90\x59\xcb\ -\x41\xbf\x64\x2f\xe8\x37\xd7\xc8\x00\x93\x94\xba\x89\x89\xfe\x4f\ -\xcb\x6d\x9a\x9c\xa0\xdf\x58\xc5\xc6\x90\x89\x1f\x66\x81\xf0\xd8\ -\xfb\x08\x0b\x46\x97\x81\x11\x02\x86\xc1\x32\x1d\x86\xbf\xbe\x08\ -\xf2\x6c\xfe\x61\xa1\xf9\x24\x99\x58\xd7\x3c\x98\x5f\xc7\x16\xcb\ -\xd6\x20\x69\x2c\x43\xc1\x19\x10\x4d\x8e\xa5\x42\xb6\xed\x17\x8a\ -\x1b\xb7\x82\x61\x54\x49\x95\xec\xed\x44\x8b\xfb\x10\x5b\x2c\x8c\ -\x73\x61\x41\x89\x86\x0f\x64\xdb\x41\x37\x1b\x21\x19\xf2\x38\x73\ -\x6a\xae\xb3\x87\x2b\x56\x93\x4c\x55\x6a\x12\x8e\x33\xaa\x22\x48\ -\x46\xbf\x01\xe2\xd7\x05\x34\x8a\x14\x81\x50\xe0\xe0\x5d\xb3\x2a\ -\x15\x1c\x82\x86\x9e\x93\x59\x0e\xe2\x9c\x8d\xa0\xbb\xef\x79\x76\ -\xbe\x88\xd4\x31\x83\x10\xf0\xbb\x9f\x82\x91\xaf\x7f\x0f\xf9\x4d\ -\xc0\x42\x91\x84\x8a\xff\xfb\xf3\xea\xd8\x12\xa7\x1a\x24\x8d\x45\ -\xc3\x54\xf0\xbb\xb2\x45\xb4\x73\x31\x68\x63\x29\x98\x63\x40\xa7\ -\xdd\x58\xd8\x63\x6d\xc1\xbb\x40\xbf\x22\x48\x36\xd5\x40\xca\x1b\ -\x4b\x59\xa1\x2e\x37\xe9\x72\x9c\x3d\x5c\xb1\x48\x82\x90\xd0\xf8\ -\xac\x40\x35\x09\xd6\x19\xe2\x47\x59\xf2\x75\x85\x03\xbe\x1a\x69\ -\x8c\x76\x10\x57\x1f\x02\xe1\x95\x45\x72\x0f\x3e\x35\x06\xf0\x5e\ -\x2f\x14\x11\x70\x08\xcb\x3d\x6f\x34\x8e\x2c\x04\xc9\x8f\x45\xc7\ -\xe1\x5e\x0d\x12\xbf\xa2\x3e\x13\xc1\xea\x1e\x35\x7c\x07\x5c\xa2\ -\x78\x6f\xeb\x9a\xb8\xe6\xec\x15\x98\x3a\xbd\xd9\x71\x6b\x88\xad\ -\x60\x0c\x92\x5a\x79\x44\x2f\x8b\x24\x91\x87\x84\x9a\x5a\x83\x2a\ -\xdc\xfb\x8e\xc3\x22\xfd\x1b\xd0\xaf\x3b\x1a\x1e\x24\xbe\x52\x23\ -\xcc\xc6\x6a\x10\xe7\x6d\xc1\xfa\x05\xa3\xcb\xc0\x48\x44\x16\x19\ -\x96\x7b\x31\x0d\x53\x23\x0b\xa5\x5b\xcb\x11\x92\x11\xb9\x5e\x0d\ -\x12\x3f\xea\xb8\x05\x40\x67\x72\xce\xeb\x94\xe7\xfc\xb5\xe2\xb6\ -\x6d\x63\x5d\x2d\x75\xd7\xe9\xad\x9e\xdd\x41\xb7\x82\x51\x4d\x82\ -\xf9\x7f\xca\x6b\x4b\xe4\xa6\xdf\x50\x5b\xaf\xfc\x0a\xcf\xd5\x7f\ -\x82\x5c\xb8\x0f\x0b\x62\x0e\x09\xa5\x5c\x8f\xbc\x06\xe2\xa2\x5d\ -\xcd\x87\xc4\x57\x04\x0c\x46\x59\xf1\xc7\x52\xd0\x3d\xf8\x72\x84\ -\xd2\xb0\x29\x20\x20\x2c\xff\x78\xe3\x7b\xc8\x2b\x01\x58\xb2\xf3\ -\x38\x0c\xcb\xc5\xd7\xc1\xd7\xd3\x20\xe1\x8b\xf9\xa4\xd5\xbb\x4b\ -\xc8\x71\x74\x68\xfd\x94\xab\xa1\xd1\xfc\x7a\x93\xbb\xaf\x60\xf6\ -\x9c\x61\x0e\xc2\xb9\xe0\x73\xa2\x48\x82\xf9\x7c\xca\xeb\x0a\x24\ -\x11\x8d\x24\x04\xc9\x78\x39\xdd\x0a\x66\xa2\x15\xa6\x5b\x02\x16\ -\xcb\xe2\x9c\x4d\x72\xea\x18\xe8\xda\xc3\x11\xc2\x27\x66\x1e\x05\ -\xdd\xa8\xd7\x23\x06\x8b\x88\xb0\xdc\xf7\x69\x36\x0c\xcd\x97\xc1\ -\xd6\x20\x69\x42\xf8\x7d\x52\x63\x93\x21\xdb\xdd\xbf\xed\x21\x51\ -\x8c\xd6\x2c\x46\x50\x26\x77\xdc\xe5\xa7\x5e\x51\x6b\x92\x97\x16\ -\xb4\x1c\x24\x77\x4d\x43\x48\x94\x59\x89\x3c\x47\x53\x45\x4e\x4b\ -\xd1\xe4\x5f\xf3\x23\x93\x72\xf9\x13\x45\xd0\xf5\x08\xcb\x23\x08\ -\x4b\x73\x5b\xc4\xe8\xba\x1f\x7c\x05\x0c\xcb\x4b\xc0\xd0\x12\x60\ -\xc7\x8b\x2c\x28\xf4\x37\x83\xd9\xf5\x46\x5a\x50\x8b\xd9\xb5\xa2\ -\x75\xca\x72\xfe\x1a\xef\x6e\x73\xb9\xf5\x0a\x8b\x24\x58\x93\x10\ -\x24\xb4\xb2\x49\xa4\x6b\x12\x4a\xb7\xd0\x91\xa8\xef\x21\xa8\xf1\ -\x57\xd4\xc3\x3e\xe1\x6d\x10\x17\xef\x69\x59\x48\x54\xd1\x6b\x20\ -\x90\xc2\xb4\xb9\xe8\xec\x61\x16\xf8\x94\x7a\x3d\xf0\x32\xe8\xe9\ -\x9a\xc3\x69\x3c\xb9\x80\x24\xf7\xbe\x3b\x97\xa7\x6c\xaa\xfe\x23\ -\x75\x92\x2b\x2e\x1a\x35\x76\x11\xc2\x92\x28\x5a\x3c\xc5\xf5\x26\ -\x79\x11\x24\x59\x95\x90\xfc\xe4\x27\x2d\x10\x49\x50\x14\x49\xd0\ -\x91\x52\x82\x9d\x79\xc8\xa2\xc9\x24\x10\xdf\x5e\x09\x7a\xa3\xa3\ -\x75\x40\x21\xd1\xeb\x64\x55\x81\x80\x9f\x43\xc8\xb0\x0c\x44\x48\ -\x30\x92\xe8\xb1\xe6\xd1\x9b\x35\x48\xfc\x89\x06\x3c\x8a\x66\x6f\ -\x6e\xdb\x34\x05\x07\x6b\x00\x17\x1b\x4c\x8e\x1e\xa2\xd9\xe5\x52\ -\xda\xae\x41\x5c\x73\x04\x21\xf9\x58\x1e\xf6\x4e\xc3\x50\x78\xce\ -\x1e\xae\x42\x85\x84\x44\x3d\xe8\xf7\xfd\x0b\xc4\xf9\xdb\x40\xdf\ -\xda\xcb\xc6\xaa\xb0\x4c\xff\x18\xaf\x25\xc8\x9a\x85\x6a\x29\x8a\ -\x24\x2b\x10\x12\x2d\xdd\xf2\x2b\xda\x85\x01\xb3\x1a\x3b\x2d\xb2\ -\x9d\x96\x95\xf5\x53\xc5\x2b\xa3\xd4\x10\x16\xd1\xec\x1c\x96\xba\ -\x0d\xc3\xdf\x5a\x84\x04\x9d\x42\x86\x24\x92\xad\x5b\x28\x4c\xe1\ -\x68\x68\x7a\x48\x90\x90\x28\xed\x7a\xec\x7d\x36\x0c\x85\xa2\x1d\ -\xef\x03\x6f\x51\x51\x67\x26\xc1\x32\x6e\x76\xe0\x61\x2f\x03\x10\ -\x92\xd1\x6f\x6a\x90\x04\x23\x2a\xde\x69\x25\x7a\xc9\x33\x09\xeb\ -\x92\xcb\x14\x6f\x8c\x6e\xfb\x33\xc0\x65\x29\x0b\x77\x4d\xd3\x3d\ -\xff\x6d\xcb\x41\x42\x8e\x14\xce\xa4\xab\xfe\x13\x41\x78\x3e\x42\ -\xfd\x26\xe1\x8a\x60\x59\x7f\x0c\x84\x67\xbf\x52\xc6\x89\x3d\xca\ -\x22\x07\x4b\x0b\xd9\x88\x65\x04\xe8\x0e\xbc\xce\xa9\x73\x41\xbf\ -\xd2\xa6\x41\x12\x8c\x68\x9e\x92\xe4\x7a\xb3\x8b\xd5\xf1\x2b\xc5\ -\x0d\xa3\xdf\xf4\xb7\x8d\xfd\x43\x87\xfe\x13\x57\x24\xe1\x97\x1e\ -\x51\x48\xe8\x5c\xe8\x40\x34\x54\x3e\x2c\x48\x48\x7d\xc7\x83\x38\ -\x1b\xeb\x13\xc9\xd9\xb6\x0e\xc8\xd2\xb0\x4a\x36\x6c\x46\x98\xf9\ -\x05\x08\xa3\x66\x81\x6e\xc4\xd3\x20\xdc\xf7\x02\x08\x4f\x7f\x8e\ -\x7f\xcf\x97\x07\x63\xf2\x9e\xab\xc9\x47\x2e\xe8\xb8\x9d\x1a\x90\ -\x5c\x1f\xa7\xe6\x7b\xfe\x4f\x71\xc1\xe8\xb7\xd4\x5e\x0f\xff\x5f\ -\x87\xde\x63\x96\x26\xf6\x1d\x77\x82\xeb\xec\xe1\x8a\x20\x19\x30\ -\x09\x92\x86\x3f\x55\x7f\xcd\xad\x50\x44\x77\x6c\xfc\x29\x7e\x6e\ -\x6d\xfd\xfa\x84\x27\x02\x95\x5a\xb0\x10\x18\x16\xe1\xd6\x1c\x06\ -\xfd\xda\x72\xf9\xff\x34\xe8\x52\x8b\x24\x01\x45\x73\xa3\x44\x8b\ -\x67\x81\xde\x5c\xf7\x17\xc5\x05\xa3\xdf\x3a\xf6\x1c\xfd\xfb\x0e\ -\xbd\xc7\x2e\x49\xec\x3b\xfe\x64\xd8\xdb\xbd\xf1\xe4\x0b\x09\xeb\ -\x27\xe1\x40\x10\x8c\x28\xbd\x19\xfe\x34\x88\xdf\x14\xca\xa1\x9a\ -\xf3\xc1\xb7\x89\x08\x88\x86\xe2\x1d\xa7\xa9\x9e\xd8\xce\x70\xd6\ -\xe3\x9b\x53\xcd\xc7\x93\xa2\xb7\x85\xab\x81\x75\x4a\x1b\xf3\x6b\ -\x8c\x24\x2b\x5a\x06\x92\x47\x59\x67\x22\xd7\xf9\x43\x11\x81\x32\ -\x62\x66\xf4\x81\xa2\x29\x64\xb1\xbe\x12\x8b\xc7\x48\x0b\x34\x36\ -\xb9\xcd\x75\x34\x5a\x7b\x02\xa5\xef\x98\x15\xc9\x58\x9c\x72\x1d\ -\x3e\x1c\x29\x91\x24\xb9\x39\x51\xc4\x57\x94\x7a\x61\x6d\x23\x7e\ -\x95\xa7\x81\x12\xc3\x22\x48\x30\xdd\x92\x21\x89\x95\x48\x72\xce\ -\xd2\xd3\x2f\xee\xd0\x77\x5c\x07\x8c\x2a\xd6\x64\xea\x58\xe4\x39\ -\x7e\x28\x22\x48\xee\x24\x48\x22\x10\x49\x54\x11\x28\x03\x1e\x03\ -\xf1\x33\x8b\xbc\x92\x0b\xe7\x4b\xd0\x14\xdd\xa2\xd1\xc0\xa2\xb5\ -\xce\x98\x62\x39\x11\xfe\xa2\xda\x51\x60\x17\x25\xdf\xf6\x50\x72\ -\x87\xde\xe3\x10\x16\xda\x96\x9a\x03\x40\x30\x22\x48\x06\x62\xba\ -\x45\x35\x09\xcf\xe1\x9b\xa3\x3e\xe3\xd8\x34\x5e\xb6\x04\x12\xe7\ -\x8b\xd0\x14\xbd\x62\x90\x98\x3d\x92\xde\xe8\x36\xc4\x54\xba\xd5\ -\x84\x5d\x94\xdc\x6f\x2c\xc2\x32\x26\x27\x29\x1c\x58\xd4\xc2\xfd\ -\xee\x66\xae\xb9\xc5\x13\x45\x94\xfe\x13\x40\xfc\x68\x23\x16\x81\ -\x6d\xd0\xd9\xa8\x29\x6c\xb1\xd6\x2d\xb3\x3b\x53\x90\x5c\x42\x3c\ -\x40\xa2\xda\x45\xed\x6f\x1b\x2f\xb6\xef\x33\x76\x77\x12\x2d\x8e\ -\xcd\x03\x82\x27\x16\x49\x1e\x83\xe4\x7b\x66\x9e\x6b\xca\x8d\x9c\ -\xf0\x7c\x34\x62\xf8\x99\x2f\x40\xbf\xe6\x50\xdb\x75\x36\x6a\x0a\ -\x4d\x16\x0f\x18\xb0\x9e\x14\x25\xcf\xe7\x1d\x73\xed\xd7\xc7\x72\ -\xba\xd5\x84\xc1\x45\x1d\xfa\x8f\xe9\x9c\xd8\x77\xcc\xe1\xa4\x7e\ -\x41\xc0\xa2\xa4\x5b\xc9\xf7\x3c\xd3\x72\x90\xcc\xfc\x9c\xad\xa2\ -\xa2\x35\xbf\xc6\x88\x08\x12\x1a\xe4\x28\x39\x3f\x10\x2c\x55\xd7\ -\x46\xe3\x48\xe0\xc8\x18\x16\xf8\x49\xbd\x47\x77\xeb\xd0\x7b\xf4\ -\x11\xbf\xb0\x20\x24\x49\xe8\xcc\x29\x7f\x7f\xae\x65\x20\xb9\x63\ -\x92\x3c\x6c\x85\x96\x1e\xd2\x20\x89\x0d\x61\xc4\x67\x9b\xed\x9a\ -\x1c\x1f\xea\x25\xcf\x1f\x14\x8f\x8a\x67\x43\x58\xee\x18\xdd\x2d\ -\xb1\xef\xe8\x43\xb4\x4f\x3b\x0f\x94\x0e\x7d\xc7\x7a\x93\x06\x3c\ -\x5a\x2e\x44\x60\x93\x9e\xfa\x52\x20\x79\x71\x01\xe8\x37\x54\x6a\ -\x90\xc4\x88\x52\x69\x87\x5e\xb3\xfb\x98\x60\x74\x8e\xea\x61\x3c\ -\x7b\x65\xfc\x46\x92\x86\x86\x91\xa5\x7d\xef\xd1\xfd\x13\xfb\x8c\ -\x75\x24\x35\xd8\xbf\xbd\x43\x9f\x31\x5e\x2c\xfa\x0f\xe9\x06\x3f\ -\x71\x86\xef\xec\x61\x8a\x22\x13\x4a\x7c\x63\x19\x5b\xc8\x5b\x83\ -\x24\x36\xc4\x5a\xb6\x2c\x5e\xab\x21\xdb\xd5\xbb\x53\x1e\xfc\x8f\ -\xe2\x41\x17\x8e\x0d\x1f\x3e\xfc\x27\x89\xb7\x8f\x1a\xd0\xc1\x07\ -\x16\x06\xc9\x9d\x13\x0f\x46\x1e\x92\xc9\x6c\x3c\x98\x38\x7b\x85\ -\x06\x49\xac\x08\x53\x2d\x2a\xda\xf5\x92\x6b\x99\xb0\xd1\x25\xd0\ -\xfe\xa1\x8a\xeb\x5c\x78\x46\xb0\x74\xe8\x3d\x66\x60\xfb\xbe\x63\ -\x5d\x08\xcc\x09\x84\xa4\xa4\xc5\x20\x79\x0b\x21\xd9\x5c\xab\x41\ -\x12\x03\x62\xdb\x57\x9b\x9d\x6e\xd1\x62\x7f\x9a\x2d\x2b\x14\x7f\ -\x2d\x5b\xa1\x1b\xc1\xd2\xbe\xcf\x98\x7e\x89\x77\x4e\x2a\xc5\x9a\ -\xe4\x2c\xd7\xd9\xc3\x95\x0a\xc9\xbb\x6b\xe4\x61\xf4\x9c\x2f\x45\ -\x53\x74\x89\x56\x4a\x11\x25\xf7\x6e\xac\x47\x06\xd3\x1e\x3c\x8a\ -\x9b\x68\xc6\x0c\x61\x11\x86\x4e\x1e\x84\xce\xed\x88\x58\x01\x4f\ -\x90\xd0\xf2\x43\xff\x5e\x2d\x0f\x5d\xe7\x7c\x29\x9a\xa2\x48\x94\ -\x6a\xb1\xf9\xed\xee\x0c\x1a\xfd\x3b\x1c\x2e\xe0\x54\xcb\x9f\xa5\ -\xa5\xa5\xff\x34\x79\xf0\xe4\xb1\xb4\xb6\x56\xc0\xe5\x85\x02\x49\ -\x85\xe4\x1d\x0d\x92\x58\x50\x6a\x1e\xeb\x1b\xa9\xd5\x99\xdd\x0f\ -\xb1\x7d\x4a\xb4\x54\xcb\xbf\x25\x27\xa7\x5f\x92\x32\x64\xf2\x78\ -\x91\x96\x19\x0a\x17\x16\x75\x8e\xc9\xfb\x99\x1a\x24\xd1\x2e\x6b\ -\x9d\x12\x45\x5c\x8b\x45\x93\x4b\x47\x1b\x53\x29\xae\xa0\x59\x20\ -\x13\x7b\x4f\xbd\x22\xf9\x8e\xc9\x4f\x09\x43\xc2\x80\x85\xcd\x2f\ -\x41\x48\xde\x43\x48\xb4\x65\x7c\xa2\x57\x34\x5c\xc8\xea\xa1\x5a\ -\x64\x67\x8a\xd1\x35\x92\x2d\xfe\xa0\x45\x91\xd0\x8d\x60\xd1\x0d\ -\x7c\xe2\x39\xc3\x70\x5a\x79\x9e\x03\x04\x4f\xb4\x25\xc2\xbd\x33\ -\x3d\xba\x39\x9b\xdc\xb4\x4c\x8d\xde\xac\xb5\x6e\x45\x9f\x3c\x4a\ -\x9a\xe5\xaa\xd1\x9b\x9d\xcf\x76\x33\xbb\xfe\xf7\x82\x6e\xf6\x8d\ -\x84\x31\x58\x06\x4d\x49\x37\x60\x1a\xc5\x05\xc3\x47\x02\xa6\x6a\ -\x29\x83\xa6\x14\xa7\xf4\x1d\x33\x4c\xbf\xe6\x98\x41\x34\x7b\x33\ -\x04\xb3\xfb\x4c\x54\xcc\x83\xd7\xc4\xc4\x76\xb7\x32\xbb\x5c\x82\ -\xc9\xb1\x88\xb6\xa9\xbe\x20\x3b\x0f\x5b\xca\xf4\x83\xd3\xaf\x11\ -\x86\x3c\xf1\x96\xfe\xee\xa6\x77\xc7\x62\x90\x0c\x9e\x52\x9c\x34\ -\x60\xd2\x48\x6a\x3d\xa3\x10\x4e\xcd\x8a\xfa\xcd\xd5\x37\xe9\x4c\ -\x9e\x95\x82\xc9\x75\x46\x1b\x42\xdf\x86\xa2\x3a\x04\x21\x11\x24\ -\xf7\x06\xda\xc2\xf0\xda\x05\x65\x5a\xb1\xde\x12\x96\xdc\xe7\xf1\ -\x5f\xa6\x0c\x79\xe2\x6d\x91\x03\x0b\x41\xa2\x1b\x3c\x79\x6f\xca\ -\xe0\xc9\x32\x24\xbe\xa6\x00\xa3\xac\x54\x99\xc3\x76\x2e\xa6\xf5\ -\xb3\x78\x5f\xa6\xa6\xc8\x4b\x01\x04\x3f\xfb\x8d\x86\x6c\x57\x2f\ -\x06\x48\x1c\xcd\x1b\x89\x4a\x13\xee\x9c\xf1\x0b\xdd\xc0\xc7\xff\ -\xed\x0b\x0b\x83\x64\xd0\x94\x7d\x49\x83\x27\x0f\x69\x04\x89\xaf\ -\x21\x30\xed\x56\x16\x5f\x9a\x6a\x75\xde\xac\x93\x5c\x6b\x30\x3f\ -\xc6\x08\xa3\xa5\x64\x2d\x26\x02\x84\x76\xdb\x35\xbb\x36\xd3\x52\ -\xa6\x7f\xa6\x42\x5d\x03\xa4\xf5\x8c\x45\x96\xc1\x4f\xbc\x4b\xb0\ -\xc8\x35\xc9\xe3\xfb\x53\x06\x4e\x1e\x46\x03\x2c\x95\x43\xfc\x1b\ -\x02\x43\x79\xb1\x2e\xc7\x99\xa6\x33\x7b\x32\x45\xb3\xfb\x34\x5b\ -\x0f\x59\x2b\xfa\x23\x23\x5a\x7c\x1d\x3f\xd3\x14\xc9\xb3\x56\xb4\ -\xda\xfb\xa6\x65\x95\x20\x20\x41\x7e\x37\x9a\x45\xd6\x92\xfb\xa4\ -\x53\x1a\x36\x47\x37\xe8\xf1\x23\xe2\xc0\x47\xfb\x85\xf5\x45\x28\ -\xc0\x88\xa6\xda\x54\x9d\xc5\xf3\x12\x46\x98\x83\xa9\xf9\xa7\xb4\ -\x31\x60\xe1\x08\x3f\xb3\xd4\xdc\x93\xd4\xcc\x6b\x17\x4d\x8e\x39\ -\x06\x93\xa7\x4b\xa7\xbc\xc3\x3f\xd3\x00\x89\x02\xeb\x34\xfc\xb1\ -\x3f\x25\xdd\xf5\x44\x6a\xb3\xe7\x24\x20\x30\xd4\x34\xd9\x39\xc7\ -\xfb\x47\xfc\x92\x1f\xd6\x5b\x5c\x05\x2c\xc2\xb4\xc5\x42\xdd\xb1\ -\x26\x96\x5e\xd1\xe7\xe4\x2a\xa0\xcf\xae\x53\x76\xcd\x9f\xd8\x90\ -\x13\xfc\x4c\x95\x4f\x57\xb3\x28\xb1\xc8\x7e\x21\x98\x43\x53\xaf\ -\x70\xaa\xd1\xde\x59\x34\x7b\x5e\xc1\x3b\xe4\x51\xb6\xa7\x8b\x16\ -\x65\xce\xcb\xe2\xa5\xba\xe3\xac\xde\xec\x2c\x47\x40\x3e\xed\x98\ -\xed\xe8\xde\x69\x39\x45\x0f\xad\xfe\xb8\xf0\x8c\xee\x88\x20\x43\ -\xa3\x37\xd6\xde\x2a\x9a\x1d\x73\xd1\x49\x6a\xd8\xb0\xef\x0b\x11\ -\x1a\x06\x87\x1b\xe1\x70\x1d\xd1\x9b\x1d\x0b\xf5\x92\x73\x28\xf5\ -\xa2\xb3\x4e\x42\x2d\x7a\x68\xc6\xec\x1c\x34\x59\x3f\xa5\xbb\xa7\ -\x68\xf2\xcc\x12\xcc\xee\x03\xac\xf8\x27\x68\xe2\x11\x1c\xf5\x7d\ -\x59\xdc\x20\x5a\xdc\x65\x6c\x45\x78\xc9\xde\xaf\xbb\x54\x76\x79\ -\x42\x46\x86\x06\x87\x66\x81\x0c\x1d\x84\x52\x0c\xbc\x93\x76\x31\ -\xba\x0d\x29\x52\xed\x28\xc1\xe2\x5a\x24\x9a\x5c\x5e\xd6\x99\xc9\ -\xa0\x89\x45\x70\x14\x30\x30\xa5\xc2\x94\xb3\x5c\x30\x3b\x97\xeb\ -\x8c\x35\x8f\x76\xb1\x1e\x6f\xdf\x61\x69\xe5\x95\xec\x3d\x6b\x70\ -\x68\x16\xb6\x91\xf3\xc8\x4e\x74\x31\x3a\xd9\x2d\xc2\x66\xfb\x04\ -\x51\x72\x7e\x2d\x98\x3d\xbb\x30\x8f\x3f\x2d\x77\x6c\x46\x23\x38\ -\x04\x06\xab\x35\x4e\xa7\xe0\xb5\x0a\x92\x63\x3e\x6a\x0a\xed\xbb\ -\x9e\xbc\x03\x7e\xae\x81\xa1\x59\xcb\x9a\x9c\xa6\xc9\x42\x67\x13\ -\x4c\xae\xdb\x75\x92\x7d\x12\xde\xa5\x31\x5d\x73\xad\x42\x98\x8e\ -\xb7\x49\xaa\x26\x61\xf1\x6d\x71\x1f\xc3\x48\xb1\x9a\xae\x45\x34\ -\x3b\xc7\xe3\xcf\x6e\xc9\xb4\x85\xb4\xef\x35\x6b\xa6\x59\xdb\x9a\ -\x8f\x33\xa2\x84\xac\xaa\x6b\x45\x93\x7b\x80\x21\xdb\xf1\x80\x6e\ -\xb3\xfd\x79\x41\xf2\x7c\x8a\x77\xf7\xc5\x18\x8d\x36\xe0\x9d\xbd\ -\x40\x27\x79\x0e\x60\xf1\x5c\x4b\xe2\x39\xbe\xfa\x18\x89\x8e\xa5\ -\xe7\xd0\x73\xe9\x1c\x78\xae\xcf\x10\xc6\xb7\x74\xd9\xf6\x49\x82\ -\xd5\x79\xb3\x90\xeb\x12\xda\xad\xac\xba\xea\x3c\x0c\x24\xcd\x22\ -\x63\x09\x09\xff\x0f\x9c\xde\x0a\xa0\xc6\xa1\xfa\x53\x00\x00\x00\ -\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ -" - -qt_resource_name = b"\ -\x00\x07\ -\x07\x3b\xe0\xb3\ -\x00\x70\ -\x00\x6c\x00\x75\x00\x67\x00\x69\x00\x6e\x00\x73\ -\x00\x05\ -\x00\x78\x40\x98\ -\x00\x71\ -\x00\x6c\x00\x79\x00\x72\x00\x78\ -\x00\x08\ -\x0a\x61\x5a\xa7\ -\x00\x69\ -\x00\x63\x00\x6f\x00\x6e\x00\x2e\x00\x70\x00\x6e\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\x14\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\ -\x00\x00\x00\x24\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -" - -qt_resource_struct_v2 = b"\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x14\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x24\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x01\x74\xe4\x44\x3e\x4b\ -" - -qt_version = QtCore.qVersion().split('.') -if qt_version < ['5', '8', '0']: - rcc_version = 1 - qt_resource_struct = qt_resource_struct_v1 -else: - rcc_version = 2 - qt_resource_struct = qt_resource_struct_v2 - -def qInitResources(): - QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) - -def qCleanupResources(): - QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) - -qInitResources()