diff --git a/PPOCRLabel/PPOCRLabel.py b/PPOCRLabel/PPOCRLabel.py new file mode 100644 index 0000000000000000000000000000000000000000..79610250c70dd76b78d37b18edd50c2edcf9bbae --- /dev/null +++ b/PPOCRLabel/PPOCRLabel.py @@ -0,0 +1,2053 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# pyrcc5 -o libs/resources.py resources.qrc +import argparse +import ast +import codecs +import os.path +import platform +import subprocess +import sys +from functools import partial +from collections import defaultdict +import json + + +__dir__ = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(__dir__) +sys.path.append(os.path.abspath(os.path.join(__dir__, '../..'))) +sys.path.append("..") + +from paddleocr import PaddleOCR + +try: + from PyQt5 import QtCore, QtGui, QtWidgets + from PyQt5.QtGui import * + from PyQt5.QtCore import * + from PyQt5.QtWidgets import * +except ImportError: + # needed for py3+qt4 + # Ref: + # http://pyqt.sourceforge.net/Docs/PyQt4/incompatible_apis.html + # http://stackoverflow.com/questions/21217399/pyqt4-qtcore-qvariant-object-instead-of-a-string + if sys.version_info.major >= 3: + import sip + + sip.setapi('QVariant', 2) + from PyQt4.QtGui import * + from PyQt4.QtCore import * + +from combobox import ComboBox +from libs.constants import * +from libs.utils import * +from libs.settings import Settings +from libs.shape import Shape, DEFAULT_LINE_COLOR, DEFAULT_FILL_COLOR +from libs.stringBundle import StringBundle +from libs.canvas import Canvas +from libs.zoomWidget import ZoomWidget +from libs.autoDialog import AutoDialog +from libs.labelDialog import LabelDialog +from libs.colorDialog import ColorDialog +from libs.labelFile import LabelFile, LabelFileError, LabelFileFormat +from libs.toolBar import ToolBar +from libs.ustr import ustr +from libs.hashableQListWidgetItem import HashableQListWidgetItem + +__appname__ = 'PPOCRLabel' + + +class WindowMixin(object): + + def menu(self, title, actions=None): + menu = self.menuBar().addMenu(title) + if actions: + addActions(menu, actions) + return menu + + def toolbar(self, title, actions=None): + toolbar = ToolBar(title) + toolbar.setObjectName(u'%sToolBar' % title) + # toolbar.setOrientation(Qt.Vertical) + toolbar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) + if actions: + addActions(toolbar, actions) + self.addToolBar(Qt.LeftToolBarArea, toolbar) + return toolbar + + +class MainWindow(QMainWindow, WindowMixin): + FIT_WINDOW, FIT_WIDTH, MANUAL_ZOOM = list(range(3)) + + def __init__(self, defaultFilename=None, defaultPrefdefClassFile=None, defaultSaveDir=None, language="zh-CN"): + super(MainWindow, self).__init__() + self.setWindowTitle(__appname__) + + # Load setting in the main thread + self.settings = Settings() + self.settings.load() + settings = self.settings + + # Load string bundle for i18n + if language not in ['zh-CN', 'en']: + language = 'zh-CN' + self.stringBundle = StringBundle.getBundle(localeStr=language) # 'en' + getStr = lambda strId: self.stringBundle.getString(strId) + + self.defaultSaveDir = defaultSaveDir + self.ocr = PaddleOCR(use_pdserving=False, use_angle_cls=True, det=True, cls=True, use_gpu=True, lang="ch") + + if os.path.exists('./data/paddle.png'): + result = self.ocr.ocr('./data/paddle.png', cls=True, det=True) + + # For loading all image under a directory + self.mImgList = [] + self.mImgList5 = [] + self.dirname = None + self.labelHist = [] + self.lastOpenDir = None + self.result_dic = [] + + self.changeFileFolder = False + self.haveAutoReced = False + self.labelFile = None + self.currIndex = 0 + + + # Whether we need to save or not. + self.dirty = False + + self._noSelectionSlot = False + self._beginner = True + self.screencastViewer = self.getAvailableScreencastViewer() + self.screencast = "https://github.com/PaddlePaddle/PaddleOCR" + + # Load predefined classes to the list + self.loadPredefinedClasses(defaultPrefdefClassFile) + + # Main widgets and related state. + self.labelDialog = LabelDialog(parent=self, listItem=self.labelHist) + self.autoDialog = AutoDialog(parent=self) + + self.itemsToShapes = {} + self.shapesToItems = {} + self.itemsToShapesbox = {} + self.shapesToItemsbox = {} + self.prevLabelText = getStr('tempLabel') + self.model = 'paddle' + self.PPreader = None + self.autoSaveNum = 10 + + ################# file list ############### + self.fileListWidget = QListWidget() + self.fileListWidget.itemClicked.connect(self.fileitemDoubleClicked) + self.fileListWidget.setIconSize(QSize(25, 25)) + filelistLayout = QVBoxLayout() + filelistLayout.setContentsMargins(0, 0, 0, 0) + filelistLayout.addWidget(self.fileListWidget) + + self.AutoRecognition = QToolButton() + self.AutoRecognition.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + self.AutoRecognition.setIcon(newIcon('Auto')) + # self.AutoRecognition.setIconSize(QSize(100,20)) + self.AutoRecognition.setFixedSize(QSize(80,30)) + # self.AutoRecognition.setStyleSheet('text-align:center;')#border:none;font-size : 12pt; + autoRecLayout = QHBoxLayout() + autoRecLayout.setContentsMargins(0, 0, 0, 0) + autoRecLayout.addWidget(self.AutoRecognition) + autoRecContainer = QWidget() + autoRecContainer.setLayout(autoRecLayout) + filelistLayout.addWidget(autoRecContainer) + + fileListContainer = QWidget() + fileListContainer.setLayout(filelistLayout) + self.filedock = QDockWidget(getStr('fileList'), self) + self.filedock.setObjectName(getStr('files')) + self.filedock.setWidget(fileListContainer) + self.addDockWidget(Qt.LeftDockWidgetArea, self.filedock) + + ######## Right area ########## + listLayout = QVBoxLayout() + listLayout.setContentsMargins(0, 0, 0, 0) + + # Create a widget for edit and diffc button + self.diffcButton = QCheckBox(getStr('useDifficult')) + self.diffcButton.setChecked(False) + self.diffcButton.stateChanged.connect(self.btnstate) + self.editButton = QToolButton() + self.reRecogButton = QToolButton() + self.reRecogButton.setIcon(newIcon('reRec', 30)) + self.reRecogButton.setFixedSize(QSize(80,30)) + self.reRecogButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.newButton = QToolButton() + self.newButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + self.newButton.setFixedSize(QSize(80, 30)) + self.SaveButton = QToolButton() + self.SaveButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + self.SaveButton.setFixedSize(QSize(60, 30)) + self.DelButton = QToolButton() + self.DelButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + self.DelButton.setFixedSize(QSize(80, 30)) + + + lefttoptoolbox = QHBoxLayout() + lefttoptoolbox.addWidget(self.newButton) + lefttoptoolbox.addWidget(self.reRecogButton) + lefttoptoolboxcontainer = QWidget() + lefttoptoolboxcontainer.setLayout(lefttoptoolbox) + listLayout.addWidget(lefttoptoolboxcontainer) + + + ################## label list #################### + # Create and add a widget for showing current label items + self.labelList = QListWidget() + labelListContainer = QWidget() + labelListContainer.setLayout(listLayout) + self.labelList.itemActivated.connect(self.labelSelectionChanged) + self.labelList.itemSelectionChanged.connect(self.labelSelectionChanged) + self.labelList.itemDoubleClicked.connect(self.editLabel) + # Connect to itemChanged to detect checkbox changes. + self.labelList.itemChanged.connect(self.labelItemChanged) + self.labelListDock = QDockWidget(getStr('recognitionResult'),self) + self.labelListDock.setWidget(self.labelList) + self.labelListDock.setFeatures(QDockWidget.NoDockWidgetFeatures) + listLayout.addWidget(self.labelListDock) + + ################## detection box #################### + self.BoxList = QListWidget() + + self.BoxList.itemActivated.connect(self.boxSelectionChanged) + self.BoxList.itemSelectionChanged.connect(self.boxSelectionChanged) + self.BoxList.itemDoubleClicked.connect(self.editBox) + # Connect to itemChanged to detect checkbox changes. + self.BoxList.itemChanged.connect(self.boxItemChanged) + self.BoxListDock = QDockWidget(getStr('detectionBoxposition'), self) + self.BoxListDock.setWidget(self.BoxList) + self.BoxListDock.setFeatures(QDockWidget.NoDockWidgetFeatures) + listLayout.addWidget(self.BoxListDock) + + ############ lower right area ############ + leftbtmtoolbox = QHBoxLayout() + leftbtmtoolbox.addWidget(self.SaveButton) + leftbtmtoolbox.addWidget(self.DelButton) + leftbtmtoolboxcontainer = QWidget() + leftbtmtoolboxcontainer.setLayout(leftbtmtoolbox) + listLayout.addWidget(leftbtmtoolboxcontainer) + + self.dock = QDockWidget(getStr('boxLabelText'), self) + self.dock.setObjectName(getStr('labels')) + self.dock.setWidget(labelListContainer) + + + ########## zoom bar ######### + self.imgsplider = QSlider(Qt.Horizontal) + self.imgsplider.valueChanged.connect(self.CanvasSizeChange) + self.imgsplider.setMinimum(-150) + self.imgsplider.setMaximum(150) + self.imgsplider.setSingleStep(1) + self.imgsplider.setTickPosition(QSlider.TicksBelow) + self.imgsplider.setTickInterval(1) + op = QGraphicsOpacityEffect() + op.setOpacity(0.2) + self.imgsplider.setGraphicsEffect(op) + # self.imgsplider.setAttribute(Qt.WA_TranslucentBackground) + self.imgsplider.setStyleSheet("background-color:transparent") + self.imgsliderDock = QDockWidget(getStr('ImageResize'), self) + self.imgsliderDock.setObjectName(getStr('IR')) + self.imgsliderDock.setWidget(self.imgsplider) + self.imgsliderDock.setFeatures(QDockWidget.DockWidgetFloatable) + # op = QGraphicsOpacityEffect() + # op.setOpacity(0.2) + # self.imgsliderDock.setGraphicsEffect(op) + self.imgsliderDock.setAttribute(Qt.WA_TranslucentBackground) + self.addDockWidget(Qt.RightDockWidgetArea, self.imgsliderDock) + + self.zoomWidget = ZoomWidget() + self.colorDialog = ColorDialog(parent=self) + self.zoomWidgetValue = self.zoomWidget.value() + + ########## thumbnail ######### + hlayout = QHBoxLayout() + m = (0, 0, 0, 0) + hlayout.setSpacing(0) + hlayout.setContentsMargins(*m) + self.preButton = QToolButton() + # self.preButton.setFixedHeight(100) + # self.preButton.setText(getStr("prevImg")) + self.preButton.setIcon(newIcon("prev",40)) + self.preButton.setIconSize(QSize(40, 100)) + self.preButton.clicked.connect(self.openPrevImg) + # self.preButton.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) + self.preButton.setStyleSheet('border: none;') + self.iconlist = QListWidget() + self.iconlist.setViewMode(QListView.IconMode) + self.iconlist.setFlow(QListView.TopToBottom) + self.iconlist.setSpacing(10) + self.iconlist.setIconSize(QSize(50, 50)) + self.iconlist.setMovement(False) + self.iconlist.setResizeMode(QListView.Adjust) + # self.iconlist.itemDoubleClicked.connect(self.iconitemDoubleClicked) + self.iconlist.itemClicked.connect(self.iconitemDoubleClicked) + self.iconlist.setStyleSheet("background-color:transparent; border: none;") + self.iconlist.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + # self.iconlist.setStyleSheet('border: none;') + self.nextButton = QToolButton() + # self.nextButton.setFixedHeight(100) + # self.nextButton.setText(getStr("nextImg")) + self.nextButton.setIcon(newIcon("next", 40)) + self.nextButton.setIconSize(QSize(40, 100)) + self.nextButton.setStyleSheet('border: none;') + self.nextButton.clicked.connect(self.openNextImg) + # self.nextButton.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) + + hlayout.addWidget(self.preButton) + hlayout.addWidget(self.iconlist) + hlayout.addWidget(self.nextButton) + + # self.setLayout(hlayout) + + iconListContainer = QWidget() + iconListContainer.setLayout(hlayout) + iconListContainer.setFixedHeight(100) + # iconListContainer.setFixedWidth(530) + # op = QGraphicsOpacityEffect() + # op.setOpacity(0.5) + # iconListContainer.setGraphicsEffect(op) + + ########### Canvas ########### + self.canvas = Canvas(parent=self) + self.canvas.zoomRequest.connect(self.zoomRequest) + self.canvas.setDrawingShapeToSquare(settings.get(SETTING_DRAW_SQUARE, False)) + + scroll = QScrollArea() + scroll.setWidget(self.canvas) + scroll.setWidgetResizable(True) + self.scrollBars = { + Qt.Vertical: scroll.verticalScrollBar(), + Qt.Horizontal: scroll.horizontalScrollBar() + } + self.scrollArea = scroll + self.canvas.scrollRequest.connect(self.scrollRequest) + + self.canvas.newShape.connect(self.newShape) + self.canvas.shapeMoved.connect(self.updateBoxlist) # self.setDirty + self.canvas.selectionChanged.connect(self.shapeSelectionChanged) + self.canvas.drawingPolygon.connect(self.toggleDrawingSensitive) + + centerLayout = QVBoxLayout() + centerLayout.setContentsMargins(0, 0, 0, 0) + centerLayout.addWidget(scroll) + #centerLayout.addWidget(self.icondock) + centerLayout.addWidget(iconListContainer,0,Qt.AlignCenter) + centercontainer = QWidget() + centercontainer.setLayout(centerLayout) + + # self.scrolldock = QDockWidget('WorkSpace',self) + # self.scrolldock.setObjectName('WorkSpace') + # self.scrolldock.setWidget(centercontainer) + # self.scrolldock.setFeatures(QDockWidget.NoDockWidgetFeatures) + # orititle = self.scrolldock.titleBarWidget() + # tmpwidget = QWidget() + # self.scrolldock.setTitleBarWidget(tmpwidget) + # del orititle + self.setCentralWidget(centercontainer) #self.scrolldock + self.addDockWidget(Qt.RightDockWidgetArea, self.dock) + + + # self.filedock.setFeatures(QDockWidget.DockWidgetFloatable) + self.filedock.setFeatures(self.filedock.features() ^ QDockWidget.DockWidgetFloatable) + + self.dockFeatures = QDockWidget.DockWidgetClosable | QDockWidget.DockWidgetFloatable + self.dock.setFeatures(self.dock.features() ^ self.dockFeatures) + + self.filedock.setFeatures(QDockWidget.NoDockWidgetFeatures) + + ###### Actions ####### + action = partial(newAction, self) + quit = action(getStr('quit'), self.close, + 'Ctrl+Q', 'quit', getStr('quitApp')) + + open = action(getStr('openFile'), self.openFile, + 'Ctrl+O', 'open', getStr('openFileDetail')) + + opendir = action(getStr('openDir'), self.openDirDialog, + 'Ctrl+u', 'open', getStr('openDir')) + + openNextImg = action(getStr('nextImg'), self.openNextImg, + 'd', 'next', getStr('nextImgDetail')) + + openPrevImg = action(getStr('prevImg'), self.openPrevImg, + 'a', 'prev', getStr('prevImgDetail')) + + verify = action(getStr('verifyImg'), self.verifyImg, + 'space', 'verify', getStr('verifyImgDetail')) + + save = action(getStr('save'), self.saveFile, + 'Ctrl+S', 'save', getStr('saveDetail'), enabled=False) + + alcm = action(getStr('choosemodel'), self.autolcm, + 'Ctrl+M', 'next', getStr('tipchoosemodel')) + + deleteImg = action(getStr('deleteImg'), self.deleteImg, 'Ctrl+D', 'close', getStr('deleteImgDetail'), + enabled=True) + + resetAll = action(getStr('resetAll'), self.resetAll, None, 'resetall', getStr('resetAllDetail')) + + color1 = action(getStr('boxLineColor'), self.chooseColor1, + 'Ctrl+L', 'color_line', getStr('boxLineColorDetail')) + + createMode = action(getStr('crtBox'), self.setCreateMode, + 'w', 'new', getStr('crtBoxDetail'), enabled=False) + editMode = action('&Edit\nRectBox', self.setEditMode, + 'Ctrl+J', 'edit', u'Move and edit Boxs', enabled=False) + + create = action(getStr('crtBox'), self.createShape, + 'w', 'new', getStr('crtBoxDetail'), enabled=False) + + delete = action(getStr('delBox'), self.deleteSelectedShape, + 'Delete', 'delete', getStr('delBoxDetail'), enabled=False) + copy = action(getStr('dupBox'), self.copySelectedShape, + 'Ctrl+D', 'copy', getStr('dupBoxDetail'), + enabled=False) + + hideAll = action('&Hide\nRectBox', partial(self.togglePolygons, False), + 'Ctrl+H', 'hide', getStr('hideAllBoxDetail'), + enabled=False) + showAll = action('&Show\nRectBox', partial(self.togglePolygons, True), + 'Ctrl+A', 'hide', getStr('showAllBoxDetail'), + enabled=False) + + help = action(getStr('tutorial'), self.showTutorialDialog, None, 'help', getStr('tutorialDetail')) + showInfo = action(getStr('info'), self.showInfoDialog, None, 'help', getStr('info')) + showSteps = action(getStr('steps'), self.showStepsDialog, None, 'help', getStr('steps')) + + zoom = QWidgetAction(self) + zoom.setDefaultWidget(self.zoomWidget) + self.zoomWidget.setWhatsThis( + u"Zoom in or out of the image. Also accessible with" + " %s and %s from the canvas." % (fmtShortcut("Ctrl+[-+]"), + fmtShortcut("Ctrl+Wheel"))) + self.zoomWidget.setEnabled(False) + + zoomIn = action(getStr('zoomin'), partial(self.addZoom, 10), + 'Ctrl++', 'zoom-in', getStr('zoominDetail'), enabled=False) + zoomOut = action(getStr('zoomout'), partial(self.addZoom, -10), + 'Ctrl+-', 'zoom-out', getStr('zoomoutDetail'), enabled=False) + zoomOrg = action(getStr('originalsize'), partial(self.setZoom, 100), + 'Ctrl+=', 'zoom', getStr('originalsizeDetail'), enabled=False) + fitWindow = action(getStr('fitWin'), self.setFitWindow, + 'Ctrl+F', 'fit-window', getStr('fitWinDetail'), + checkable=True, enabled=False) + fitWidth = action(getStr('fitWidth'), self.setFitWidth, + 'Ctrl+Shift+F', 'fit-width', getStr('fitWidthDetail'), + checkable=True, enabled=False) + # Group zoom controls into a list for easier toggling. + zoomActions = (self.zoomWidget, zoomIn, zoomOut, + zoomOrg, fitWindow, fitWidth) + self.zoomMode = self.MANUAL_ZOOM + self.scalers = { + self.FIT_WINDOW: self.scaleFitWindow, + self.FIT_WIDTH: self.scaleFitWidth, + # Set to one to scale to 100% when loading files. + self.MANUAL_ZOOM: lambda: 1, + } + + edit = action(getStr('editLabel'), self.editLabel, + 'Ctrl+E', 'edit', getStr('editLabelDetail'), + enabled=False) + + ######## New actions ####### + AutoRec = action(getStr('autoRecognition'), self.autoRecognition, + 'Ctrl+Shift+A', 'Auto', getStr('autoRecognition'), enabled=False) + + reRec = action(getStr('reRecognition'), self.reRecognition, + 'Ctrl+Shift+R', 'reRec', getStr('reRecognition'), enabled=False) + + createpoly = action(getStr('creatPolygon'), self.createPolygon, + 'p', 'new', 'Creat Polygon', enabled=True) + + saveRec = action(getStr('saveRec'), self.saveRecResult, + '', 'saveRec', getStr('saveRec'), enabled=False) + + self.editButton.setDefaultAction(edit) + self.newButton.setDefaultAction(create) + self.DelButton.setDefaultAction(deleteImg) + self.SaveButton.setDefaultAction(save) + self.AutoRecognition.setDefaultAction(AutoRec) + self.reRecogButton.setDefaultAction(reRec) + # self.preButton.setDefaultAction(openPrevImg) + # self.nextButton.setDefaultAction(openNextImg) + + ############# Zoom layout ############## + zoomLayout = QHBoxLayout() + zoomLayout.addStretch() + self.zoominButton = QToolButton() + self.zoominButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + self.zoominButton.setDefaultAction(zoomIn) + self.zoomoutButton = QToolButton() + self.zoomoutButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + self.zoomoutButton.setDefaultAction(zoomOut) + self.zoomorgButton = QToolButton() + self.zoomorgButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + self.zoomorgButton.setDefaultAction(zoomOrg) + zoomLayout.addWidget(self.zoominButton) + zoomLayout.addWidget(self.zoomorgButton) + zoomLayout.addWidget(self.zoomoutButton) + + zoomContainer = QWidget() + zoomContainer.setLayout(zoomLayout) + zoomContainer.setGeometry(0, 0, 30, 150) + + shapeLineColor = action(getStr('shapeLineColor'), self.chshapeLineColor, + icon='color_line', tip=getStr('shapeLineColorDetail'), + enabled=False) + shapeFillColor = action(getStr('shapeFillColor'), self.chshapeFillColor, + icon='color', tip=getStr('shapeFillColorDetail'), + enabled=False) + + # labels = self.dock.toggleViewAction() + # labels.setText(getStr('showHide')) + # labels.setShortcut('Ctrl+Shift+L') + + # Label list context menu. + labelMenu = QMenu() + addActions(labelMenu, (edit, delete)) + + self.labelList.setContextMenuPolicy(Qt.CustomContextMenu) + self.labelList.customContextMenuRequested.connect( + self.popLabelListMenu) + + # Draw squares/rectangles + self.drawSquaresOption = QAction(getStr('drawSquares'), self) + self.drawSquaresOption.setShortcut('Ctrl+Shift+R') + self.drawSquaresOption.setCheckable(True) + self.drawSquaresOption.setChecked(settings.get(SETTING_DRAW_SQUARE, False)) + self.drawSquaresOption.triggered.connect(self.toogleDrawSquare) + + # Store actions for further handling. + self.actions = struct(save=save, open=open, resetAll=resetAll, deleteImg=deleteImg, + lineColor=color1, create=create, delete=delete, edit=edit, copy=copy, + saveRec=saveRec, + createMode=createMode, editMode=editMode, + shapeLineColor=shapeLineColor, shapeFillColor=shapeFillColor, + zoom=zoom, zoomIn=zoomIn, zoomOut=zoomOut, zoomOrg=zoomOrg, + fitWindow=fitWindow, fitWidth=fitWidth, + zoomActions=zoomActions, + fileMenuActions=( + open, opendir, save, resetAll, quit), + beginner=(), advanced=(), + editMenu=(createpoly, edit, copy, delete, + None, color1, self.drawSquaresOption), + beginnerContext=(create, edit, copy, delete), + advancedContext=(createMode, editMode, edit, copy, + delete, shapeLineColor, shapeFillColor), + onLoadActive=( + create, createMode, editMode), + onShapesPresent=(hideAll, showAll)) + + # menus + self.menus = struct( + file=self.menu('&'+getStr('mfile')), + edit=self.menu('&'+getStr('medit')), + view=self.menu('&'+getStr('mview')), + autolabel=self.menu('&PaddleOCR'), + help=self.menu('&'+getStr('mhelp')), + recentFiles=QMenu('Open &Recent'), + labelList=labelMenu) + + + # Sync single class mode from PR#106 + self.singleClassMode = QAction(getStr('singleClsMode'), self) + self.singleClassMode.setShortcut("Ctrl+Shift+S") + self.singleClassMode.setCheckable(True) + self.singleClassMode.setChecked(settings.get(SETTING_SINGLE_CLASS, False)) + self.lastLabel = None + # Add option to enable/disable labels being displayed at the top of bounding boxes + self.displayLabelOption = QAction(getStr('displayLabel'), self) + self.displayLabelOption.setShortcut("Ctrl+Shift+P") + self.displayLabelOption.setCheckable(True) + self.displayLabelOption.setChecked(settings.get(SETTING_PAINT_LABEL, False)) + self.displayLabelOption.triggered.connect(self.togglePaintLabelsOption) + + addActions(self.menus.file, + (opendir, None, save, resetAll, deleteImg, quit)) + + addActions(self.menus.help, (showSteps, showInfo)) + addActions(self.menus.view, ( + self.displayLabelOption, # labels, + None, + hideAll, showAll, None, + zoomIn, zoomOut, zoomOrg, None, + fitWindow, fitWidth)) + + addActions(self.menus.autolabel, (saveRec, None, help)) # alcm, + + self.menus.file.aboutToShow.connect(self.updateFileMenu) + + # Custom context menu for the canvas widget: + addActions(self.canvas.menus[0], self.actions.beginnerContext) + addActions(self.canvas.menus[1], ( + action('&Copy here', self.copyShape), + action('&Move here', self.moveShape))) + + # self.tools = self.toolbar('Tools') + + self.actions.beginner = ( + open, opendir, openNextImg, openPrevImg, verify, save, None, create, copy, delete, None, + zoomIn, zoom, zoomOut, fitWindow, fitWidth) + + self.actions.advanced = ( + open, opendir, openNextImg, openPrevImg, save, None, + createMode, editMode, None, + hideAll, showAll) + + self.statusBar().showMessage('%s started.' % __appname__) + self.statusBar().show() + + # Application state. + self.image = QImage() + self.filePath = ustr(defaultFilename) + self.lastOpenDir = None + self.recentFiles = [] + self.maxRecent = 7 + self.lineColor = None + self.fillColor = None + self.zoom_level = 100 + self.fit_window = False + # Add Chris + self.difficult = False + + ## Fix the compatible issue for qt4 and qt5. Convert the QStringList to python list + if settings.get(SETTING_RECENT_FILES): + if have_qstring(): + recentFileQStringList = settings.get(SETTING_RECENT_FILES) + self.recentFiles = [ustr(i) for i in recentFileQStringList] + else: + self.recentFiles = recentFileQStringList = settings.get(SETTING_RECENT_FILES) + + size = settings.get(SETTING_WIN_SIZE, QSize(1200, 800)) + + position = QPoint(0, 0) + saved_position = settings.get(SETTING_WIN_POSE, position) + # Fix the multiple monitors issue + for i in range(QApplication.desktop().screenCount()): + if QApplication.desktop().availableGeometry(i).contains(saved_position): + position = saved_position + break + self.resize(size) + self.move(position) + saveDir = ustr(settings.get(SETTING_SAVE_DIR, None)) + self.lastOpenDir = ustr(settings.get(SETTING_LAST_OPEN_DIR, None)) + + self.restoreState(settings.get(SETTING_WIN_STATE, QByteArray())) + Shape.line_color = self.lineColor = QColor(settings.get(SETTING_LINE_COLOR, DEFAULT_LINE_COLOR)) + Shape.fill_color = self.fillColor = QColor(settings.get(SETTING_FILL_COLOR, DEFAULT_FILL_COLOR)) + self.canvas.setDrawingColor(self.lineColor) + # Add chris + Shape.difficult = self.difficult + + + # ADD: + # Populate the File menu dynamically. + self.updateFileMenu() + + # Since loading the file may take some time, make sure it runs in the background. + if self.filePath and os.path.isdir(self.filePath): + self.queueEvent(partial(self.importDirImages, self.filePath or "")) + elif self.filePath: + self.queueEvent(partial(self.loadFile, self.filePath or "")) + + # Callbacks: + self.zoomWidget.valueChanged.connect(self.paintCanvas) + + self.populateModeActions() + + # Display cursor coordinates at the right of status bar + self.labelCoordinates = QLabel('') + self.statusBar().addPermanentWidget(self.labelCoordinates) + + # Open Dir if deafult file + if self.filePath and os.path.isdir(self.filePath): + self.openDirDialog(dirpath=self.filePath, silent=True) + + def keyReleaseEvent(self, event): + if event.key() == Qt.Key_Control: + self.canvas.setDrawingShapeToSquare(False) + + def keyPressEvent(self, event): + if event.key() == Qt.Key_Control: + # Draw rectangle if Ctrl is pressed + self.canvas.setDrawingShapeToSquare(True) + + + def noShapes(self): + return not self.itemsToShapes + + + def populateModeActions(self): + self.canvas.menus[0].clear() + addActions(self.canvas.menus[0], self.actions.beginnerContext) + self.menus.edit.clear() + actions = (self.actions.create,) # if self.beginner() else (self.actions.createMode, self.actions.editMode) + addActions(self.menus.edit, actions + self.actions.editMenu) + + + def setDirty(self): + self.dirty = True + self.actions.save.setEnabled(True) + + def setClean(self): + self.dirty = False + self.actions.save.setEnabled(False) + self.actions.create.setEnabled(True) + + def toggleActions(self, value=True): + """Enable/Disable widgets which depend on an opened image.""" + for z in self.actions.zoomActions: + z.setEnabled(value) + for action in self.actions.onLoadActive: + action.setEnabled(value) + + def queueEvent(self, function): + QTimer.singleShot(0, function) + + def status(self, message, delay=5000): + self.statusBar().showMessage(message, delay) + + def resetState(self): + self.itemsToShapes.clear() + self.shapesToItems.clear() + self.itemsToShapesbox.clear() # ADD + self.shapesToItemsbox.clear() + self.labelList.clear() + self.BoxList.clear() + self.filePath = None + self.imageData = None + self.labelFile = None + self.canvas.resetState() + self.labelCoordinates.clear() + # self.comboBox.cb.clear() + self.result_dic = [] + + def currentItem(self): + items = self.labelList.selectedItems() + if items: + return items[0] + return None + + def currentBox(self): + items = self.BoxList.selectedItems() + if items: + return items[0] + return None + + def addRecentFile(self, filePath): + if filePath in self.recentFiles: + self.recentFiles.remove(filePath) + elif len(self.recentFiles) >= self.maxRecent: + self.recentFiles.pop() + self.recentFiles.insert(0, filePath) + + def beginner(self): + return self._beginner + + def advanced(self): + return not self.beginner() + + def getAvailableScreencastViewer(self): + osName = platform.system() + + if osName == 'Windows': + return ['C:\\Program Files\\Internet Explorer\\iexplore.exe'] + elif osName == 'Linux': + return ['xdg-open'] + elif osName == 'Darwin': + return ['open'] + + ## Callbacks ## + def showTutorialDialog(self): + subprocess.Popen(self.screencastViewer + [self.screencast]) + + def showInfoDialog(self): + from libs.__init__ import __version__ + msg = u'Name:{0} \nApp Version:{1} \n{2} '.format(__appname__, __version__, sys.version_info) + QMessageBox.information(self, u'Information', msg) + + def showStepsDialog(self): + msg = steps() + QMessageBox.information(self, u'Information', msg) + + def createShape(self): + assert self.beginner() + self.canvas.setEditing(False) + self.actions.create.setEnabled(False) + self.canvas.fourpoint = False + + def createPolygon(self): + assert self.beginner() + self.canvas.setEditing(False) + self.canvas.fourpoint = True + self.actions.create.setEnabled(False) + + def toggleDrawingSensitive(self, drawing=True): + """In the middle of drawing, toggling between modes should be disabled.""" + self.actions.editMode.setEnabled(not drawing) + if not drawing and self.beginner(): + # Cancel creation. + print('Cancel creation.') + self.canvas.setEditing(True) + self.canvas.restoreCursor() + self.actions.create.setEnabled(True) + + def toggleDrawMode(self, edit=True): + self.canvas.setEditing(edit) + self.actions.createMode.setEnabled(edit) + self.actions.editMode.setEnabled(not edit) + + def setCreateMode(self): + assert self.advanced() + self.toggleDrawMode(False) + + def setEditMode(self): + assert self.advanced() + self.toggleDrawMode(True) + self.labelSelectionChanged() + + def updateFileMenu(self): + currFilePath = self.filePath + + def exists(filename): + return os.path.exists(filename) + + menu = self.menus.recentFiles + menu.clear() + files = [f for f in self.recentFiles if f != + currFilePath and exists(f)] + for i, f in enumerate(files): + icon = newIcon('labels') + action = QAction( + icon, '&%d %s' % (i + 1, QFileInfo(f).fileName()), self) + action.triggered.connect(partial(self.loadRecent, f)) + menu.addAction(action) + + def popLabelListMenu(self, point): + self.menus.labelList.exec_(self.labelList.mapToGlobal(point)) + + def editLabel(self): + if not self.canvas.editing(): + return + item = self.currentItem() + if not item: + return + text = self.labelDialog.popUp(item.text()) + if text is not None: + item.setText(text) + # item.setBackground(generateColorByText(text)) + self.setDirty() + self.updateComboBox() + + ######## detection box related functions ####### + + def boxItemChanged(self, item): + shape = self.itemsToShapesbox[item] + + box = ast.literal_eval(item.text()) + # print('shape in labelItemChanged is',shape.points) + if box != [(p.x(), p.y()) for p in shape.points]: + # shape.points = box + shape.points = [QPointF(p[0], p[1]) for p in box] + + # QPointF(x,y) + # shape.line_color = generateColorByText(shape.label) + self.setDirty() + else: # User probably changed item visibility + self.canvas.setShapeVisible(shape, item.checkState() == Qt.Checked) + + def editBox(self): # ADD + if not self.canvas.editing(): + return + item = self.currentBox() + if not item: + return + text = self.labelDialog.popUp(item.text()) + + imageSize = str(self.image.size()) + width, height = self.image.width(), self.image.height() + if text: + try: + text_list = eval(text) + except: + msg_box = QMessageBox(QMessageBox.Warning, 'Warning', 'Please enter the correct format') + msg_box.exec_() + return + if len(text_list) < 4: + msg_box = QMessageBox(QMessageBox.Warning, 'Warning', 'Please enter the coordinates of 4 points') + msg_box.exec_() + return + for box in text_list: + if box[0] > width or box[0] < 0 or box[1] > height or box[1] < 0: + msg_box = QMessageBox(QMessageBox.Warning, 'Warning', 'Out of picture size') + msg_box.exec_() + return + + item.setText(text) + # item.setBackground(generateColorByText(text)) + self.setDirty() + self.updateComboBox() + + def updateBoxlist(self): + shape = self.canvas.selectedShape + item = self.shapesToItemsbox[shape] # listitem + text = [(int(p.x()), int(p.y())) for p in shape.points] + item.setText(str(text)) + self.setDirty() + + def indexTo5Files(self, currIndex): + if currIndex < 2: + return self.mImgList[:5] + elif currIndex > len(self.mImgList)-3: + return self.mImgList[-5:] + else: + return self.mImgList[currIndex - 2 : currIndex + 3] + + + # Tzutalin 20160906 : Add file list and dock to move faster + def fileitemDoubleClicked(self, item=None): + self.currIndex = self.mImgList.index(ustr(os.path.join(os.path.abspath(self.dirname), item.text()))) + filename = self.mImgList[self.currIndex] + if filename: + self.mImgList5 = self.indexTo5Files(self.currIndex) + # self.additems5(None) + self.loadFile(filename) + + def iconitemDoubleClicked(self, item=None): + self.currIndex = self.mImgList.index(ustr(os.path.join(item.toolTip()))) + filename = self.mImgList[self.currIndex] + if filename: + self.mImgList5 = self.indexTo5Files(self.currIndex) + # self.additems5(None) + self.loadFile(filename) + + def CanvasSizeChange(self): + if len(self.mImgList) > 0: + self.zoomWidget.setValue(self.zoomWidgetValue + self.imgsplider.value()) + + # Add chris + def btnstate(self, item=None): + """ Function to handle difficult examples + Update on each object """ + if not self.canvas.editing(): + return + + item = self.currentItem() + if not item: # If not selected Item, take the first one + item = self.labelList.item(self.labelList.count() - 1) + + difficult = self.diffcButton.isChecked() + + try: + shape = self.itemsToShapes[item] + except: + pass + # Checked and Update + try: + if difficult != shape.difficult: + shape.difficult = difficult + self.setDirty() + else: # User probably changed item visibility + self.canvas.setShapeVisible(shape, item.checkState() == Qt.Checked) + except: + pass + + # React to canvas signals. + def shapeSelectionChanged(self, selected=False): + if self._noSelectionSlot: + self._noSelectionSlot = False + else: + shape = self.canvas.selectedShape + if shape: + self.shapesToItems[shape].setSelected(True) + self.shapesToItemsbox[shape].setSelected(True) # ADD + else: + self.labelList.clearSelection() + self.actions.delete.setEnabled(selected) + self.actions.copy.setEnabled(selected) + self.actions.edit.setEnabled(selected) + self.actions.shapeLineColor.setEnabled(selected) + self.actions.shapeFillColor.setEnabled(selected) + + def addLabel(self, shape): + shape.paintLabel = self.displayLabelOption.isChecked() + item = HashableQListWidgetItem(shape.label) + item.setFlags(item.flags() | Qt.ItemIsUserCheckable) + item.setCheckState(Qt.Checked) + # item.setBackground(generateColorByText(shape.label)) + self.itemsToShapes[item] = shape + self.shapesToItems[shape] = item + self.labelList.addItem(item) + # print('item in add label is ',[(p.x(), p.y()) for p in shape.points], shape.label) + + # ADD for box + item = HashableQListWidgetItem(str([(int(p.x()), int(p.y())) for p in shape.points])) + # item = QListWidgetItem(str([(p.x(), p.y()) for p in shape.points])) + item.setFlags(item.flags() | Qt.ItemIsUserCheckable) + item.setCheckState(Qt.Checked) + # item.setBackground(generateColorByText(shape.label)) + self.itemsToShapesbox[item] = shape + self.shapesToItemsbox[shape] = item + self.BoxList.addItem(item) + for action in self.actions.onShapesPresent: + action.setEnabled(True) + self.updateComboBox() + + def remLabel(self, shape): + if shape is None: + # print('rm empty label') + return + item = self.shapesToItems[shape] + self.labelList.takeItem(self.labelList.row(item)) + del self.shapesToItems[shape] + del self.itemsToShapes[item] + self.updateComboBox() + + # ADD: + item = self.shapesToItemsbox[shape] + self.BoxList.takeItem(self.BoxList.row(item)) + del self.shapesToItemsbox[shape] + del self.itemsToShapesbox[item] + self.updateComboBox() + + def loadLabels(self, shapes): + s = [] + for label, points, line_color, fill_color, difficult in shapes: + shape = Shape(label=label) + for x, y in points: + + # Ensure the labels are within the bounds of the image. If not, fix them. + x, y, snapped = self.canvas.snapPointToCanvas(x, y) + if snapped: + self.setDirty() + + shape.addPoint(QPointF(x, y)) + shape.difficult = difficult + shape.close() + s.append(shape) + + # if line_color: + # shape.line_color = QColor(*line_color) + # else: + # shape.line_color = generateColorByText(label) + # + # if fill_color: + # shape.fill_color = QColor(*fill_color) + # else: + # shape.fill_color = generateColorByText(label) + + self.addLabel(shape) + self.updateComboBox() + self.canvas.loadShapes(s) + + def updateComboBox(self): + # Get the unique labels and add them to the Combobox. + itemsTextList = [str(self.labelList.item(i).text()) for i in range(self.labelList.count())] + + uniqueTextList = list(set(itemsTextList)) + # Add a null row for showing all the labels + uniqueTextList.append("") + uniqueTextList.sort() + + # self.comboBox.update_items(uniqueTextList) + + def saveLabels(self, annotationFilePath, mode='Auto'): + annotationFilePath = ustr(annotationFilePath) + if self.labelFile is None: + self.labelFile = LabelFile() + self.labelFile.verified = self.canvas.verified + + def format_shape(s): + # print('s in saveLabels is ',s) + return dict(label=s.label, # str + line_color=s.line_color.getRgb(), + fill_color=s.fill_color.getRgb(), + points=[(p.x(), p.y()) for p in s.points], # QPonitF + # add chris + difficult=s.difficult) # bool + + shapes = [] if mode == 'Auto' else \ + [format_shape(shape) for shape in self.canvas.shapes] + # Can add differrent annotation formats here + + if self.model == 'paddle': + for box in self.result_dic: + trans_dic = {"label": box[1][0], "points": box[0], 'difficult': False} + if trans_dic["label"] is "" and mode == 'Auto': + continue + shapes.append(trans_dic) + + try: + trans_dic = [] + for box in shapes: + trans_dic.append({"transcription": box['label'], "points": box['points'], 'difficult': False}) + self.PPlabel[annotationFilePath] = trans_dic + + if mode == 'Auto': + self.Cachelabel[annotationFilePath] = trans_dic + + # else: + # self.labelFile.save(annotationFilePath, shapes, self.filePath, self.imageData, + # self.lineColor.getRgb(), self.fillColor.getRgb()) + # print('Image:{0} -> Annotation:{1}'.format(self.filePath, annotationFilePath)) + return True + except LabelFileError as e: + self.errorMessage(u'Error saving label data', u'%s' % e) + return False + + def copySelectedShape(self): + self.addLabel(self.canvas.copySelectedShape()) + # fix copy and delete + self.shapeSelectionChanged(True) + + + def labelSelectionChanged(self): + item = self.currentItem() + if item and self.canvas.editing(): + self._noSelectionSlot = True + self.canvas.selectShape(self.itemsToShapes[item]) + shape = self.itemsToShapes[item] + # Add Chris + self.diffcButton.setChecked(shape.difficult) + + def boxSelectionChanged(self): + item = self.currentBox() + if item and self.canvas.editing(): + self._noSelectionSlot = True + self.canvas.selectShape(self.itemsToShapesbox[item]) + shape = self.itemsToShapesbox[item] + # Add Chris + self.diffcButton.setChecked(shape.difficult) + + def labelItemChanged(self, item): + shape = self.itemsToShapes[item] + label = item.text() + if label != shape.label: + shape.label = item.text() + # shape.line_color = generateColorByText(shape.label) + self.setDirty() + else: # User probably changed item visibility + self.canvas.setShapeVisible(shape, item.checkState() == Qt.Checked) + + # Callback functions: + def newShape(self): + """Pop-up and give focus to the label editor. + + position MUST be in global coordinates. + """ + if len(self.labelHist) > 0: + self.labelDialog = LabelDialog( + parent=self, listItem=self.labelHist) + + # Sync single class mode from PR#106 + if self.singleClassMode.isChecked() and self.lastLabel: + text = self.lastLabel + else: + text = self.labelDialog.popUp(text=self.prevLabelText) + self.lastLabel = text + + # Add Chris + self.diffcButton.setChecked(False) + if text is not None: + self.prevLabelText = self.stringBundle.getString('tempLabel') + # generate_color = generateColorByText(text) + shape = self.canvas.setLastLabel(text, None, None)#generate_color, generate_color + self.addLabel(shape) + if self.beginner(): # Switch to edit mode. + self.canvas.setEditing(True) + self.actions.create.setEnabled(True) + else: + self.actions.editMode.setEnabled(True) + self.setDirty() + + else: + # self.canvas.undoLastLine() + self.canvas.resetAllLines() + + def scrollRequest(self, delta, orientation): + units = - delta / (8 * 15) + bar = self.scrollBars[orientation] + bar.setValue(bar.value() + bar.singleStep() * units) + + def setZoom(self, value): + self.actions.fitWidth.setChecked(False) + self.actions.fitWindow.setChecked(False) + self.zoomMode = self.MANUAL_ZOOM + self.zoomWidget.setValue(value) + + def addZoom(self, increment=10): + self.setZoom(self.zoomWidget.value() + increment) + + def zoomRequest(self, delta): + # get the current scrollbar positions + # calculate the percentages ~ coordinates + h_bar = self.scrollBars[Qt.Horizontal] + v_bar = self.scrollBars[Qt.Vertical] + + # get the current maximum, to know the difference after zooming + h_bar_max = h_bar.maximum() + v_bar_max = v_bar.maximum() + + # get the cursor position and canvas size + # calculate the desired movement from 0 to 1 + # where 0 = move left + # 1 = move right + # up and down analogous + cursor = QCursor() + pos = cursor.pos() + relative_pos = QWidget.mapFromGlobal(self, pos) + + cursor_x = relative_pos.x() + cursor_y = relative_pos.y() + + w = self.scrollArea.width() + h = self.scrollArea.height() + + # the scaling from 0 to 1 has some padding + # you don't have to hit the very leftmost pixel for a maximum-left movement + margin = 0.1 + move_x = (cursor_x - margin * w) / (w - 2 * margin * w) + move_y = (cursor_y - margin * h) / (h - 2 * margin * h) + + # clamp the values from 0 to 1 + move_x = min(max(move_x, 0), 1) + move_y = min(max(move_y, 0), 1) + + # zoom in + units = delta / (8 * 15) + scale = 10 + self.addZoom(scale * units) + + # get the difference in scrollbar values + # this is how far we can move + d_h_bar_max = h_bar.maximum() - h_bar_max + d_v_bar_max = v_bar.maximum() - v_bar_max + + # get the new scrollbar values + new_h_bar_value = h_bar.value() + move_x * d_h_bar_max + new_v_bar_value = v_bar.value() + move_y * d_v_bar_max + + h_bar.setValue(new_h_bar_value) + v_bar.setValue(new_v_bar_value) + + def setFitWindow(self, value=True): + if value: + self.actions.fitWidth.setChecked(False) + self.zoomMode = self.FIT_WINDOW if value else self.MANUAL_ZOOM + self.adjustScale() + + def setFitWidth(self, value=True): + if value: + self.actions.fitWindow.setChecked(False) + self.zoomMode = self.FIT_WIDTH if value else self.MANUAL_ZOOM + self.adjustScale() + + def togglePolygons(self, value): + for item, shape in self.itemsToShapes.items(): + item.setCheckState(Qt.Checked if value else Qt.Unchecked) + + def loadFile(self, filePath=None): + """Load the specified file, or the last opened file if None.""" + self.resetState() + self.canvas.setEnabled(False) + if filePath is None: + filePath = self.settings.get(SETTING_FILENAME) + + # Make sure that filePath is a regular python string, rather than QString + filePath = ustr(filePath) + # Fix bug: An index error after select a directory when open a new file. + unicodeFilePath = ustr(filePath) + # unicodeFilePath = os.path.abspath(unicodeFilePath) + # Tzutalin 20160906 : Add file list and dock to move faster + # Highlight the file item + if unicodeFilePath and self.fileListWidget.count() > 0: + if unicodeFilePath in self.mImgList: + index = self.mImgList.index(unicodeFilePath) + fileWidgetItem = self.fileListWidget.item(index) + print('unicodeFilePath is', unicodeFilePath) + fileWidgetItem.setSelected(True) + ### + self.iconlist.clear() + self.additems5(None) + for i in range(5): + item_tooltip = self.iconlist.item(i).toolTip() + # print(i,"---",item_tooltip) + if item_tooltip == ustr(filePath): + titem = self.iconlist.item(i) + titem.setSelected(True) + self.iconlist.scrollToItem(titem) + break + else: + self.fileListWidget.clear() + self.mImgList.clear() + self.iconlist.clear() + + # if unicodeFilePath and self.iconList.count() > 0: + # if unicodeFilePath in self.mImgList: + + if unicodeFilePath and os.path.exists(unicodeFilePath): + if LabelFile.isLabelFile(unicodeFilePath): + try: + self.labelFile = LabelFile(unicodeFilePath) + except LabelFileError as e: + self.errorMessage(u'Error opening file', + (u"

%s

" + u"

Make sure %s is a valid label file.") + % (e, unicodeFilePath)) + self.status("Error reading %s" % unicodeFilePath) + return False + self.imageData = self.labelFile.imageData + self.lineColor = QColor(*self.labelFile.lineColor) + self.fillColor = QColor(*self.labelFile.fillColor) + self.canvas.verified = self.labelFile.verified + else: + # Load image: + # read data first and store for saving into label file. + self.imageData = read(unicodeFilePath, None) + self.labelFile = None + self.canvas.verified = False + + image = QImage.fromData(self.imageData) + if image.isNull(): + self.errorMessage(u'Error opening file', + u"

Make sure %s is a valid image file." % unicodeFilePath) + self.status("Error reading %s" % unicodeFilePath) + return False + self.status("Loaded %s" % os.path.basename(unicodeFilePath)) + self.image = image + self.filePath = unicodeFilePath + self.canvas.loadPixmap(QPixmap.fromImage(image)) + if self.labelFile: + self.loadLabels(self.labelFile.shapes) + if self.validFilestate(filePath) is True: + self.setClean() + else: + self.dirty = False + self.actions.save.setEnabled(True) + + self.canvas.setEnabled(True) + self.adjustScale(initial=True) + self.paintCanvas() + self.addRecentFile(self.filePath) + self.toggleActions(True) + self.showBoundingBoxFromPPlabel(filePath) + + self.setWindowTitle(__appname__ + ' ' + filePath) + + # Default : select last item if there is at least one item + if self.labelList.count(): + self.labelList.setCurrentItem(self.labelList.item(self.labelList.count() - 1)) + self.labelList.item(self.labelList.count() - 1).setSelected(True) + + self.canvas.setFocus(True) + return True + return False + + + def showBoundingBoxFromPPlabel(self, filePath): + imgidx = self.getImglabelidx(filePath) + if imgidx not in self.PPlabel.keys(): + return + shapes = [] + for box in self.PPlabel[imgidx]: + shapes.append((box['transcription'], box['points'], None, None, box['difficult'])) + + print(shapes) + self.loadLabels(shapes) + self.canvas.verified = False + + + def validFilestate(self, filePath): + if filePath not in self.fileStatedict.keys(): + return None + elif self.fileStatedict[filePath] == 1: + return True + else: + return False + + def resizeEvent(self, event): + if self.canvas and not self.image.isNull() \ + and self.zoomMode != self.MANUAL_ZOOM: + self.adjustScale() + super(MainWindow, self).resizeEvent(event) + + def paintCanvas(self): + assert not self.image.isNull(), "cannot paint null image" + self.canvas.scale = 0.01 * self.zoomWidget.value() + self.canvas.adjustSize() + self.canvas.update() + + def adjustScale(self, initial=False): + value = self.scalers[self.FIT_WINDOW if initial else self.zoomMode]() + self.zoomWidget.setValue(int(100 * value)) + + def scaleFitWindow(self): + """Figure out the size of the pixmap in order to fit the main widget.""" + e = 2.0 # So that no scrollbars are generated. + w1 = self.centralWidget().width() - e + h1 = self.centralWidget().height() - e -110 + a1 = w1 / h1 + # Calculate a new scale value based on the pixmap's aspect ratio. + w2 = self.canvas.pixmap.width() - 0.0 + h2 = self.canvas.pixmap.height() - 0.0 + a2 = w2 / h2 + return w1 / w2 if a2 >= a1 else h1 / h2 + + def scaleFitWidth(self): + # The epsilon does not seem to work too well here. + w = self.centralWidget().width() - 2.0 + return w / self.canvas.pixmap.width() + + def closeEvent(self, event): + if not self.mayContinue(): + event.ignore() + else: + settings = self.settings + # If it loads images from dir, don't load it at the begining + if self.dirname is None: + settings[SETTING_FILENAME] = self.filePath if self.filePath else '' + else: + settings[SETTING_FILENAME] = '' + + settings[SETTING_WIN_SIZE] = self.size() + settings[SETTING_WIN_POSE] = self.pos() + settings[SETTING_WIN_STATE] = self.saveState() + settings[SETTING_LINE_COLOR] = self.lineColor + settings[SETTING_FILL_COLOR] = self.fillColor + settings[SETTING_RECENT_FILES] = self.recentFiles + settings[SETTING_ADVANCE_MODE] = not self._beginner + if self.defaultSaveDir and os.path.exists(self.defaultSaveDir): + settings[SETTING_SAVE_DIR] = ustr(self.defaultSaveDir) + else: + settings[SETTING_SAVE_DIR] = '' + + if self.lastOpenDir and os.path.exists(self.lastOpenDir): + settings[SETTING_LAST_OPEN_DIR] = self.lastOpenDir + else: + settings[SETTING_LAST_OPEN_DIR] = '' + + settings[SETTING_SINGLE_CLASS] = self.singleClassMode.isChecked() + settings[SETTING_PAINT_LABEL] = self.displayLabelOption.isChecked() + settings[SETTING_DRAW_SQUARE] = self.drawSquaresOption.isChecked() + settings.save() + try: + self.saveFilestate() + self.savePPlabel() + except: + pass + + def loadRecent(self, filename): + if self.mayContinue(): + self.loadFile(filename) + + def scanAllImages(self, folderPath): + extensions = ['.%s' % fmt.data().decode("ascii").lower() for fmt in QImageReader.supportedImageFormats()] + images = [] + + for file in os.listdir(folderPath): + if file.lower().endswith(tuple(extensions)): + relativePath = os.path.join(folderPath, file) + path = ustr(os.path.abspath(relativePath)) + images.append(path) + natural_sort(images, key=lambda x: x.lower()) + return images + + + + def openDirDialog(self, _value=False, dirpath=None, silent=False): + if not self.mayContinue(): + return + + defaultOpenDirPath = dirpath if dirpath else '.' + if self.lastOpenDir and os.path.exists(self.lastOpenDir): + defaultOpenDirPath = self.lastOpenDir + else: + defaultOpenDirPath = os.path.dirname(self.filePath) if self.filePath else '.' + if silent != True: + targetDirPath = ustr(QFileDialog.getExistingDirectory(self, + '%s - Open Directory' % __appname__, + defaultOpenDirPath, + QFileDialog.ShowDirsOnly | QFileDialog.DontResolveSymlinks)) + else: + targetDirPath = ustr(defaultOpenDirPath) + self.lastOpenDir = targetDirPath + self.importDirImages(targetDirPath) + + def importDirImages(self, dirpath, isDelete = False): + if not self.mayContinue() or not dirpath: + return + if self.defaultSaveDir and self.defaultSaveDir != dirpath: + self.saveFilestate() + self.savePPlabel() + + if not isDelete: + self.loadFilestate(dirpath) + self.PPlabelpath = dirpath+ '/Label.txt' + self.PPlabel = self.loadLabelFile(self.PPlabelpath) + self.Cachelabelpath = dirpath + '/Cache.cach' + self.Cachelabel = self.loadLabelFile(self.Cachelabelpath) + if self.Cachelabel: + self.PPlabel = dict(self.Cachelabel, **self.PPlabel) + self.lastOpenDir = dirpath + self.dirname = dirpath + + + self.defaultSaveDir = dirpath + self.statusBar().showMessage('%s started. Annotation will be saved to %s' % + (__appname__, self.defaultSaveDir)) + self.statusBar().show() + + self.filePath = None + self.fileListWidget.clear() + self.mImgList = self.scanAllImages(dirpath) + self.mImgList5 = self.mImgList[:5] + self.openNextImg() + doneicon = newIcon('done') + closeicon = newIcon('close') + for imgPath in self.mImgList: + filename = os.path.basename(imgPath) + if self.validFilestate(imgPath) is True: + item = QListWidgetItem(doneicon, filename) + else: + item = QListWidgetItem(closeicon, filename) + self.fileListWidget.addItem(item) + + print('dirPath in importDirImages is', dirpath) + self.iconlist.clear() + self.additems5(dirpath) + self.changeFileFolder = True + self.haveAutoReced = False + self.AutoRecognition.setEnabled(True) + self.reRecogButton.setEnabled(True) + + def verifyImg(self, _value=False): + # Proceding next image without dialog if having any label + if self.filePath is not None: + try: + self.labelFile.toggleVerify() + except AttributeError: + # If the labelling file does not exist yet, create if and + # re-save it with the verified attribute. + self.saveFile() + if self.labelFile != None: + self.labelFile.toggleVerify() + else: + return + + self.canvas.verified = self.labelFile.verified + self.paintCanvas() + self.saveFile() + + def openPrevImg(self, _value=False): + if len(self.mImgList) <= 0: + return + + if self.filePath is None: + return + + currIndex = self.mImgList.index(self.filePath) + self.mImgList5 = self.mImgList[:5] + if currIndex - 1 >= 0: + filename = self.mImgList[currIndex - 1] + self.mImgList5 = self.indexTo5Files(currIndex - 1) + if filename: + self.loadFile(filename) + + def openNextImg(self, _value=False): + if not self.mayContinue(): + return + + if len(self.mImgList) <= 0: + return + + filename = None + if self.filePath is None: + filename = self.mImgList[0] + self.mImgList5 = self.mImgList[:5] + else: + currIndex = self.mImgList.index(self.filePath) + if currIndex + 1 < len(self.mImgList): + filename = self.mImgList[currIndex + 1] + self.mImgList5 = self.indexTo5Files(currIndex + 1) + else: + self.mImgList5 = self.indexTo5Files(currIndex) + if filename: + print('file name in openNext is ',filename) + self.loadFile(filename) + + def openFile(self, _value=False): + if not self.mayContinue(): + return + path = os.path.dirname(ustr(self.filePath)) if self.filePath else '.' + formats = ['*.%s' % fmt.data().decode("ascii").lower() for fmt in QImageReader.supportedImageFormats()] + filters = "Image & Label files (%s)" % ' '.join(formats + ['*%s' % LabelFile.suffix]) + filename = QFileDialog.getOpenFileName(self, '%s - Choose Image or Label file' % __appname__, path, filters) + if filename: + if isinstance(filename, (tuple, list)): + filename = filename[0] + self.loadFile(filename) + # print('filename in openfile is ', self.filePath) + self.filePath = None + self.fileListWidget.clear() + self.iconlist.clear() + self.mImgList = [filename] + self.openNextImg() + if self.validFilestate(filename) is True: + item = QListWidgetItem(newIcon('done'), filename) + self.setClean() + elif self.validFilestate(filename) is None: + item = QListWidgetItem(newIcon('close'), filename) + else: + item = QListWidgetItem(newIcon('close'), filename) + self.setDirty() + self.fileListWidget.addItem(filename) + self.additems5(None) + print('opened image is', filename) + + def updateFileListIcon(self, filename): + pass + + def saveFile(self, _value=False, mode='Manual'): + if self.defaultSaveDir is not None and len(ustr(self.defaultSaveDir)): + if self.filePath: + imgidx = self.getImglabelidx(self.filePath) + self._saveFile(imgidx, mode=mode) + + else: + imgFileDir = os.path.dirname(self.filePath) + imgFileName = os.path.basename(self.filePath) + savedFileName = os.path.splitext(imgFileName)[0] + savedPath = os.path.join(imgFileDir, savedFileName) + self._saveFile(savedPath if self.labelFile + else self.saveFileDialog(removeExt=False), mode=mode) + + def saveFileAs(self, _value=False): + assert not self.image.isNull(), "cannot save empty image" + self._saveFile(self.saveFileDialog()) + + def saveFileDialog(self, removeExt=True): + caption = '%s - Choose File' % __appname__ + filters = 'File (*%s)' % LabelFile.suffix + openDialogPath = self.currentPath() + dlg = QFileDialog(self, caption, openDialogPath, filters) + dlg.setDefaultSuffix(LabelFile.suffix[1:]) + dlg.setAcceptMode(QFileDialog.AcceptSave) + filenameWithoutExtension = os.path.splitext(self.filePath)[0] + dlg.selectFile(filenameWithoutExtension) + dlg.setOption(QFileDialog.DontUseNativeDialog, False) + if dlg.exec_(): + fullFilePath = ustr(dlg.selectedFiles()[0]) + if removeExt: + return os.path.splitext(fullFilePath)[0] # Return file path without the extension. + else: + return fullFilePath + return '' + + def _saveFile(self, annotationFilePath, mode='Manual'): + if mode == 'Manual': + if annotationFilePath and self.saveLabels(annotationFilePath, mode=mode): + self.setClean() + self.statusBar().showMessage('Saved to %s' % annotationFilePath) + self.statusBar().show() + currIndex = self.mImgList.index(self.filePath) + item = self.fileListWidget.item(currIndex) + item.setIcon(newIcon('done')) + + self.fileStatedict[self.filePath] = 1 + if len(self.fileStatedict)%self.autoSaveNum ==0: + self.saveFilestate() + self.savePPlabel(mode='Auto') + + self.fileListWidget.insertItem(int(currIndex), item) + self.openNextImg() + self.actions.saveRec.setEnabled(True) + + elif mode == 'Auto': + if annotationFilePath and self.saveLabels(annotationFilePath, mode=mode): + + self.setClean() + self.statusBar().showMessage('Saved to %s' % annotationFilePath) + self.statusBar().show() + + def closeFile(self, _value=False): + if not self.mayContinue(): + return + self.resetState() + self.setClean() + self.toggleActions(False) + self.canvas.setEnabled(False) + self.actions.saveAs.setEnabled(False) + + def deleteImg(self): + deletePath = self.filePath + if deletePath is not None: + deleteInfo = self.deleteImgDialog() + if deleteInfo == QMessageBox.Yes: + if platform.system() == 'Windows': + from win32com.shell import shell, shellcon + shell.SHFileOperation((0, shellcon.FO_DELETE, deletePath, None, + shellcon.FOF_SILENT | shellcon.FOF_ALLOWUNDO | shellcon.FOF_NOCONFIRMATION, + None, None)) + # linux + elif platform.system() == 'Linux': + cmd = 'trash ' + deletePath + os.system(cmd) + # macOS + elif platform.system() == 'Darwin': + import subprocess + absPath = os.path.abspath(deletePath).replace('\\', '\\\\').replace('"', '\\"') + cmd = ['osascript', '-e', + 'tell app "Finder" to move {the POSIX file "' + absPath + '"} to trash'] + print(cmd) + subprocess.call(cmd, stdout=open(os.devnull, 'w')) + + if self.filePath in self.fileStatedict.keys(): + self.fileStatedict.pop(self.filePath) + imgidx = self.getImglabelidx(self.filePath) + if imgidx in self.PPlabel.keys(): + self.PPlabel.pop(imgidx) + self.openNextImg() + self.importDirImages(self.lastOpenDir, isDelete=True) + + def deleteImgDialog(self): + yes, cancel = QMessageBox.Yes, QMessageBox.Cancel + msg = u'The image will be deleted to the recycle bin' + return QMessageBox.warning(self, u'Attention', msg, yes | cancel) + + def resetAll(self): + self.settings.reset() + self.close() + proc = QProcess() + proc.startDetached(os.path.abspath(__file__)) + + def mayContinue(self): # + if not self.dirty: + return True + else: + discardChanges = self.discardChangesDialog() + if discardChanges == QMessageBox.No: + return True + elif discardChanges == QMessageBox.Yes: + self.saveFile() + return True + else: + return False + + def discardChangesDialog(self): + yes, no, cancel = QMessageBox.Yes, QMessageBox.No, QMessageBox.Cancel + msg = u'You have unsaved changes, would you like to save them and proceed?\nClick "No" to undo all changes.' + return QMessageBox.warning(self, u'Attention', msg, yes | no | cancel) + + def errorMessage(self, title, message): + return QMessageBox.critical(self, title, + '

%s

%s' % (title, message)) + + def currentPath(self): + return os.path.dirname(self.filePath) if self.filePath else '.' + + def chooseColor1(self): + color = self.colorDialog.getColor(self.lineColor, u'Choose line color', + default=DEFAULT_LINE_COLOR) + if color: + self.lineColor = color + Shape.line_color = color + self.canvas.setDrawingColor(color) + self.canvas.update() + self.setDirty() + + def deleteSelectedShape(self): + self.remLabel(self.canvas.deleteSelected()) + self.setDirty() + if self.noShapes(): + for action in self.actions.onShapesPresent: + action.setEnabled(False) + + def chshapeLineColor(self): + color = self.colorDialog.getColor(self.lineColor, u'Choose line color', + default=DEFAULT_LINE_COLOR) + if color: + self.canvas.selectedShape.line_color = color + self.canvas.update() + self.setDirty() + + def chshapeFillColor(self): + color = self.colorDialog.getColor(self.fillColor, u'Choose fill color', + default=DEFAULT_FILL_COLOR) + if color: + self.canvas.selectedShape.fill_color = color + self.canvas.update() + self.setDirty() + + def copyShape(self): + self.canvas.endMove(copy=True) + self.addLabel(self.canvas.selectedShape) + self.setDirty() + + def moveShape(self): + self.canvas.endMove(copy=False) + self.setDirty() + + def loadPredefinedClasses(self, predefClassesFile): + if os.path.exists(predefClassesFile) is True: + with codecs.open(predefClassesFile, 'r', 'utf8') as f: + for line in f: + line = line.strip() + if self.labelHist is None: + self.labelHist = [line] + else: + self.labelHist.append(line) + + + def togglePaintLabelsOption(self): + for shape in self.canvas.shapes: + shape.paintLabel = self.displayLabelOption.isChecked() + + def toogleDrawSquare(self): + self.canvas.setDrawingShapeToSquare(self.drawSquaresOption.isChecked()) + + def additems(self, dirpath): + for file in self.mImgList: + pix = QPixmap(file) + _, filename = os.path.split(file) + filename, _ = os.path.splitext(filename) + item = QListWidgetItem(QIcon(pix.scaled(100, 100, Qt.IgnoreAspectRatio, Qt.FastTransformation)), + filename[:10]) + item.setToolTip(file) + self.iconlist.addItem(item) + + def additems5(self, dirpath): + for file in self.mImgList5: + pix = QPixmap(file) + _, filename = os.path.split(file) + filename, _ = os.path.splitext(filename) + pfilename = filename[:10] + if len(pfilename) < 10: + lentoken = 12 - len(pfilename) + prelen = lentoken // 2 + bfilename = prelen * " " + pfilename + (lentoken - prelen) * " " + # item = QListWidgetItem(QIcon(pix.scaled(100, 100, Qt.KeepAspectRatio, Qt.SmoothTransformation)),filename[:10]) + item = QListWidgetItem(QIcon(pix.scaled(100, 100, Qt.IgnoreAspectRatio, Qt.FastTransformation)),pfilename) + # item.setForeground(QBrush(Qt.white)) + item.setToolTip(file) + self.iconlist.addItem(item) + owidth = 0 + for index in range(len(self.mImgList5)): + item = self.iconlist.item(index) + itemwidget = self.iconlist.visualItemRect(item) + owidth += itemwidget.width() + self.iconlist.setMinimumWidth(owidth + 50) + + def getImglabelidx(self, filePath): + if platform.system()=='Windows': + spliter = '\\' + else: + spliter = '/' + filepathsplit = filePath.split(spliter)[-2:] + return filepathsplit[0] + '/' + filepathsplit[1] + + def autoRecognition(self): + assert self.mImgList is not None + print('Using model from ', self.model) + + uncheckedList = [i for i in self.mImgList if i not in self.fileStatedict.keys()] + self.autoDialog = AutoDialog(parent=self, ocr=self.ocr, mImgList=uncheckedList, lenbar=len(uncheckedList)) + self.autoDialog.popUp() + self.currIndex=len(self.mImgList) + self.loadFile(self.filePath) # ADD + self.haveAutoReced = True + self.AutoRecognition.setEnabled(False) + self.setDirty() + self.saveCacheLabel() + + + def reRecognition(self): + img = cv2.imread(self.filePath) + # org_box = [dic['points'] for dic in self.PPlabel[self.getImglabelidx(self.filePath)]] + if self.canvas.shapes: + self.result_dic = [] + rec_flag = 0 + for shape in self.canvas.shapes: + box = [[int(p.x()), int(p.y())] for p in shape.points] + assert len(box) == 4 + img_crop = get_rotate_crop_image(img, np.array(box, np.float32)) + if img_crop is None: + msg = 'Can not recognise the detection box in ' + self.filePath + '. Please change manually' + QMessageBox.information(self, "Information", msg) + return + result = self.ocr.ocr(img_crop, cls=True, det=False) + if result[0][0] is not '': + result.insert(0, box) + print('result in reRec is ', result) + self.result_dic.append(result) + if result[1][0] == shape.label: + print('label no change') + else: + rec_flag += 1 + + if len(self.result_dic) > 0 and rec_flag > 0: + self.saveFile(mode='Auto') + self.loadFile(self.filePath) + self.setDirty() + elif len(self.result_dic) == len(self.canvas.shapes) and rec_flag == 0: + QMessageBox.information(self, "Information", "The recognition result remains unchanged!") + else: + print('Can not recgonise in ', self.filePath) + else: + QMessageBox.information(self, "Information", "Draw a box!") + + + def autolcm(self): + print('autolabelchoosemodel') + + def loadFilestate(self, saveDir): + self.fileStatepath = saveDir + '/fileState.txt' + self.fileStatedict = {} + if not os.path.exists(self.fileStatepath): + f = open(self.fileStatepath, 'w', encoding='utf-8') + else: + with open(self.fileStatepath, 'r', encoding='utf-8') as f: + states = f.readlines() + for each in states: + file, state = each.split('\t') + self.fileStatedict[file] = 1 + + + def saveFilestate(self): + with open(self.fileStatepath, 'w', encoding='utf-8') as f: + for key in self.fileStatedict: + f.write(key + '\t') + f.write(str(self.fileStatedict[key]) + '\n') + + + def loadLabelFile(self, labelpath): + labeldict = {} + if not os.path.exists(labelpath): + f = open(labelpath, 'w', encoding='utf-8') + + else: + with open(labelpath, 'r', encoding='utf-8') as f: + data = f.readlines() + for each in data: + file, label = each.split('\t') + if label: + label = label.replace('false', 'False') + labeldict[file] = eval(label) + else: + labeldict[file] = [] + return labeldict + + + def savePPlabel(self,mode='Manual'): + savedfile = [self.getImglabelidx(i) for i in self.fileStatedict.keys()] + with open(self.PPlabelpath, 'w', encoding='utf-8') as f: + for key in self.PPlabel: + if key in savedfile: + f.write(key + '\t') + f.write(json.dumps(self.PPlabel[key], ensure_ascii=False) + '\n') + + if mode=='Manual': + msg = 'Images that have been checked are saved in '+ self.PPlabelpath + QMessageBox.information(self, "Information", msg) + + def saveCacheLabel(self): + with open(self.Cachelabelpath, 'w', encoding='utf-8') as f: + for key in self.Cachelabel: + f.write(key + '\t') + f.write(json.dumps(self.Cachelabel[key], ensure_ascii=False) + '\n') + + def saveRecResult(self): + if None in [self.PPlabelpath, self.PPlabel, self.fileStatedict]: + QMessageBox.information(self, "Information", "Save file first") + return + + rec_gt_dir = os.path.dirname(self.PPlabelpath) + '/rec_gt.txt' + crop_img_dir = os.path.dirname(self.PPlabelpath) + '/crop_img/' + if not os.path.exists(crop_img_dir): + os.mkdir(crop_img_dir) + + with open(rec_gt_dir, 'w', encoding='utf-8') as f: + for key in self.fileStatedict: + idx = self.getImglabelidx(key) + for i, label in enumerate(self.PPlabel[idx]): + img = cv2.imread(key) + img_crop = get_rotate_crop_image(img, np.array(label['points'], np.float32)) + img_name = os.path.splitext(os.path.basename(idx))[0] + '_crop_'+str(i)+'.jpg' + cv2.imwrite(crop_img_dir+img_name, img_crop) + f.write('crop_img/'+ img_name + '\t') + f.write(label['transcription'] + '\n') + + QMessageBox.information(self, "Information", "Cropped images has been saved in "+str(crop_img_dir)) + +def inverted(color): + return QColor(*[255 - v for v in color.getRgb()]) + + +def read(filename, default=None): + try: + with open(filename, 'rb') as f: + return f.read() + except: + return default + + +def get_main_app(argv=[]): + """ + Standard boilerplate Qt application code. + Do everything but app.exec_() -- so that we can test the application in one thread + """ + app = QApplication(argv) + app.setApplicationName(__appname__) + app.setWindowIcon(newIcon("app")) + # Tzutalin 201705+: Accept extra agruments to change predefined class file + argparser = argparse.ArgumentParser() + argparser.add_argument("image_dir", nargs="?") + argparser.add_argument("language", default='zh-CN',nargs="?") + argparser.add_argument("predefined_classes_file", + default=os.path.join(os.path.dirname(__file__), "data", "predefined_classes.txt"), + nargs="?") + argparser.add_argument("save_dir", nargs="?") + args = argparser.parse_args(argv[1:]) + # Usage : labelImg.py image predefClassFile saveDir + win = MainWindow(args.image_dir, + args.predefined_classes_file, + args.save_dir, + args.language) + win.show() + return app, win + + +def main(): + '''construct main app and run it''' + app, _win = get_main_app(sys.argv) + return app.exec_() + + +if __name__ == '__main__': + + resource_file = './libs/resources.py' + if not os.path.exists(resource_file): + output = os.system('pyrcc5 -o libs/resources.py resources.qrc') + assert output is 0, "operate the cmd have some problems ,please check whether there is a in the lib " \ + "directory resources.py " + import libs.resources + sys.exit(main()) diff --git a/PPOCRLabel/README.md b/PPOCRLabel/README.md new file mode 100644 index 0000000000000000000000000000000000000000..93fd64ffe1d0923d3e754e3964fa7c62509d0df0 --- /dev/null +++ b/PPOCRLabel/README.md @@ -0,0 +1,80 @@ +# PPOCRLabel + +PPOCRLabel是一款适用于OCR领域的半自动化图形标注工具,使用python3和pyqt5编写,支持矩形框标注和四点标注模式,导出格式可直接用于PPOCR检测和识别模型的训练。 + + + +## 安装 + +### 1. 安装PaddleOCR +参考[PaddleOCR安装文档](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_ch/installation.md)准备好PaddleOCR + +### 2. 安装PPOCRLabel +#### Windows + Anaconda + +下载安装[Anaconda](https://www.anaconda.com/download/#download) (Python 3+) + +``` +conda install pyqt=5 +cd ./PPOCRLabel # 将目录切换到PPOCRLabel文件夹下 +pyrcc5 -o libs/resources.py resources.qrc +python PPOCRLabel.py +``` + +#### Ubuntu Linux + +``` +sudo apt-get install pyqt5-dev-tools +sudo apt-get install trash-cli +cd ./PPOCRLabel # 将目录切换到PPOCRLabel文件夹下 +sudo pip3 install -r requirements/requirements-linux-python3.txt +make qt5py3 +python3 PPOCRLabel.py +``` + +#### macOS +``` +pip3 install pyqt5 +pip3 uninstall opencv-python # 由于mac版本的opencv与pyqt有冲突,需先手动卸载opencv +pip3 install opencv-contrib-python-headless # 安装headless版本的open-cv +cd ./PPOCRLabel # 将目录切换到PPOCRLabel文件夹下 +make qt5py3 +python3 PPOCRLabel.py +``` + +## 使用 + +### 操作步骤 + +1. 安装与运行:使用上述命令安装与运行程序。 +2. 打开文件夹:在菜单栏点击 “文件” - "打开目录" 选择待标记图片的文件夹[1]. +3. 自动标注:点击 ”自动标注“,使用PPOCR超轻量模型对图片文件名前图片状态[2]为 “X” 的图片进行自动标注。 +4. 手动标注:点击 “矩形标注”(推荐直接在英文模式下点击键盘中的 “W”),用户可对当前图片中模型未检出的部分进行手动绘制标记框。点击键盘P,则使用四点标注模式(或点击“编辑” - “四点标注”),用户依次点击4个点后,双击左键表示标注完成。 +5. 标记框绘制完成后,用户点击 “确认”,检测框会先被预分配一个 “待识别” 标签。 +6. 重新识别:将图片中的所有检测画绘制/调整完成后,点击 “重新识别”,PPOCR模型会对当前图片中的**所有检测框**重新识别[3]。 +7. 内容更改:双击识别结果,对不准确的识别结果进行手动更改。 +8. 保存:点击 “保存”,图片状态切换为 “√”,跳转至下一张。 +9. 删除:点击 “删除图像”,图片将会被删除至回收站。 +10. 标注结果:关闭应用程序或切换文件路径后,手动保存过的标签将会被存放在所打开图片文件夹下的*Label.txt*中。在菜单栏点击 “PaddleOCR” - "保存识别结果"后,会将此类图片的识别训练数据保存在*crop_img*文件夹下,识别标签保存在*rec_gt.txt*中[4]。 + +### 注意 + +[1] PPOCRLabel以文件夹为基本标记单位,打开待标记的图片文件夹后,不会在窗口栏中显示图片,而是在点击 "选择文件夹" 之后直接将文件夹下的图片导入到程序中。 + +[2] 图片状态表示本张图片用户是否手动保存过,未手动保存过即为 “X”,手动保存过为 “√”。点击 “自动标注”按钮后,PPOCRLabel不会对状态为 “√” 的图片重新标注。 + +[3] 点击“重新识别”后,模型会对图片中的识别结果进行覆盖。因此如果在此之前手动更改过识别结果,有可能在重新识别后产生变动。 + +[4] PPOCRLabel产生的文件包括一下几种,请勿手动更改其中内容,否则会引起程序出现异常。 + +| 文件名 | 说明 | +| :-----------: | :----------------------------------------------------------: | +| Label.txt | 检测标签,可直接用于PPOCR检测模型训练。用户每保存10张检测结果后,程序会进行自动写入。当用户关闭应用程序或切换文件路径后同样会进行写入。 | +| fileState.txt | 图片状态标记文件,保存当前文件夹下已经被用户手动确认过的图片名称。 | +| Cache.cach | 缓存文件,保存模型自动识别的结果。 | +| rec_gt.txt | 识别标签。可直接用于PPOCR识别模型训练。需用户手动点击菜单栏“PaddleOCR” - "保存识别结果"后产生。 | +| crop_img | 识别数据。按照检测框切割后的图片。与rec_gt.txt同时产生。 | + +### 参考资料 + +1.[Tzutalin. LabelImg. Git code (2015)](https://github.com/tzutalin/labelImg) diff --git a/PPOCRLabel/__init__.py b/PPOCRLabel/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/PPOCRLabel/build-tools/.gitignore b/PPOCRLabel/build-tools/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e05bf6bf57739a813c00bad0c045b224ff37705f --- /dev/null +++ b/PPOCRLabel/build-tools/.gitignore @@ -0,0 +1,12 @@ +*.spec +build +dist +pyinstaller +python-2.* +pywin32* +virtual-wine +venv_wine +PyQt4-* +lxml-* +windows_v* +linux_v* diff --git a/PPOCRLabel/build-tools/README.md b/PPOCRLabel/build-tools/README.md new file mode 100644 index 0000000000000000000000000000000000000000..8e4cc5dae4af9a75416cd3595de480f72a7bb305 --- /dev/null +++ b/PPOCRLabel/build-tools/README.md @@ -0,0 +1,35 @@ +### Deploy to PyPI + +``` +cd [ROOT] +sh build-tools/build-for-pypi.sh +``` + +### Build for Ubuntu + +``` +cd build-tools +sh run-in-container.sh +sh envsetup.sh +sh build-ubuntu-binary.sh +``` + +### Build for Windows + +``` +cd build-tools +sh run-in-container.sh +sh envsetup.sh +sh build-windows-binary.sh +``` + +### Build for macOS High Sierra +``` +cd build-tools +./build-for-macos.sh +``` + +Note: If there are some problems, try to +``` +sudo rm -rf virtual-wne venv_wine +``` diff --git a/PPOCRLabel/build-tools/build-for-macos.sh b/PPOCRLabel/build-tools/build-for-macos.sh new file mode 100644 index 0000000000000000000000000000000000000000..dfe926b72a0df1f939301a18be641a2a5adcbad8 --- /dev/null +++ b/PPOCRLabel/build-tools/build-for-macos.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +brew install python@2 +pip install --upgrade virtualenv + +# clone labelimg source +rm -rf /tmp/labelImgSetup +mkdir /tmp/labelImgSetup +cd /tmp/labelImgSetup +curl https://codeload.github.com/tzutalin/labelImg/zip/master --output labelImg.zip +unzip labelImg.zip +rm labelImg.zip + +# setup python3 space +virtualenv --system-site-packages -p python3 /tmp/labelImgSetup/labelImg-py3 +source /tmp/labelImgSetup/labelImg-py3/bin/activate +cd labelImg-master + +# build labelImg app +pip install py2app +pip install PyQt5 lxml +make qt5py3 +rm -rf build dist +python setup.py py2app -A +mv "/tmp/labelImgSetup/labelImg-master/dist/labelImg.app" /Applications +# deactivate python3 +deactivate +cd ../ +rm -rf /tmp/labelImgSetup +echo 'DONE' diff --git a/PPOCRLabel/build-tools/build-for-pypi.sh b/PPOCRLabel/build-tools/build-for-pypi.sh new file mode 100644 index 0000000000000000000000000000000000000000..d5ad5c7c4b638e68114a477a6342a718ffb878a8 --- /dev/null +++ b/PPOCRLabel/build-tools/build-for-pypi.sh @@ -0,0 +1,17 @@ +#!/bin/sh +# Packaging and Release +docker run --workdir=$(pwd)/ --volume="/home/$USER:/home/$USER" tzutalin/py2qt4 /bin/sh -c 'make qt4py2; make test;sudo python setup.py sdist;sudo python setup.py install' + +while true; do + read -p "Do you wish to deploy this to PyPI(twine upload dist/* or pip install dist/*)?" yn + case $yn in + [Yy]* ) docker run -it --rm --workdir=$(pwd)/ --volume="/home/$USER:/home/$USER" tzutalin/py2qt4; break;; + [Nn]* ) exit;; + * ) echo "Please answer yes or no.";; + esac +done +# python setup.py register +# python setup.py sdist upload +# Net pypi: twine upload dist/* + +# Test before upladoing: pip install dist/labelImg.tar.gz diff --git a/PPOCRLabel/build-tools/build-ubuntu-binary.sh b/PPOCRLabel/build-tools/build-ubuntu-binary.sh new file mode 100644 index 0000000000000000000000000000000000000000..dbe530287bfe9afe730f00252e414e3728e0b746 --- /dev/null +++ b/PPOCRLabel/build-tools/build-ubuntu-binary.sh @@ -0,0 +1,24 @@ +#!/bin/bash +### Ubuntu use pyinstall v3.0 +THIS_SCRIPT_PATH=`readlink -f $0` +THIS_SCRIPT_DIR=`dirname ${THIS_SCRIPT_PATH}` +cd pyinstaller +git checkout v3.2 +cd ${THIS_SCRIPT_DIR} + +rm -r build +rm -r dist +rm labelImg.spec +python pyinstaller/pyinstaller.py --hidden-import=xml \ + --hidden-import=xml.etree \ + --hidden-import=xml.etree.ElementTree \ + --hidden-import=lxml.etree \ + -D -F -n labelImg -c "../labelImg.py" -p ../libs -p ../ + +FOLDER=$(git describe --abbrev=0 --tags) +FOLDER="linux_"$FOLDER +rm -rf "$FOLDER" +mkdir "$FOLDER" +cp dist/labelImg $FOLDER +cp -rf ../data $FOLDER/data +zip "$FOLDER.zip" -r $FOLDER diff --git a/PPOCRLabel/build-tools/build-windows-binary.sh b/PPOCRLabel/build-tools/build-windows-binary.sh new file mode 100644 index 0000000000000000000000000000000000000000..566e88f9db0865da793486c78cc234b85b16c484 --- /dev/null +++ b/PPOCRLabel/build-tools/build-windows-binary.sh @@ -0,0 +1,32 @@ +#!/bin/bash +### Window requires pyinstall v2.1 +wine msiexec -i python-2.7.8.msi +wine pywin32-218.win32-py2.7.exe +wine PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x32.exe +wine lxml-3.7.3.win32-py2.7.exe + +THIS_SCRIPT_PATH=`readlink -f $0` +THIS_SCRIPT_DIR=`dirname ${THIS_SCRIPT_PATH}` +cd pyinstaller +git checkout v2.1 +cd ${THIS_SCRIPT_DIR} +echo ${THIS_SCRIPT_DIR} + +#. venv_wine/bin/activate +rm -r build +rm -r dist +rm labelImg.spec + +wine c:/Python27/python.exe pyinstaller/pyinstaller.py --hidden-import=xml \ + --hidden-import=xml.etree \ + --hidden-import=xml.etree.ElementTree \ + --hidden-import=lxml.etree \ + -D -F -n labelImg -c "../labelImg.py" -p ../libs -p ../ + +FOLDER=$(git describe --abbrev=0 --tags) +FOLDER="windows_"$FOLDER +rm -rf "$FOLDER" +mkdir "$FOLDER" +cp dist/labelImg.exe $FOLDER +cp -rf ../data $FOLDER/data +zip "$FOLDER.zip" -r $FOLDER diff --git a/PPOCRLabel/build-tools/envsetup.sh b/PPOCRLabel/build-tools/envsetup.sh new file mode 100644 index 0000000000000000000000000000000000000000..242b0c569f5738caad415f34a7f16a620157f6ee --- /dev/null +++ b/PPOCRLabel/build-tools/envsetup.sh @@ -0,0 +1,53 @@ +#!/bin/sh + +THIS_SCRIPT_PATH=`readlink -f $0` +THIS_SCRIPT_DIR=`dirname ${THIS_SCRIPT_PATH}` +#OS Ubuntu 14.04 +### Common packages for linux/windows +if [ ! -e "pyinstaller" ]; then + git clone https://github.com/pyinstaller/pyinstaller + cd pyinstaller + git checkout v2.1 -b v2.1 + cd ${THIS_SCRIPT_DIR} +fi + +echo "Going to clone and download packages for building windows" +#Pacakges +#> pyinstaller (2.1) +#> wine (1.6.2) +#> virtual-wine (0.1) +#> python-2.7.8.msi +#> pywin32-218.win32-py2.7.exe + +## tool to install on Ubuntu +#$ sudo apt-get install wine + +### Clone a repo to create virtual wine env +if [ ! -e "virtual-wine" ]; then + git clone https://github.com/htgoebel/virtual-wine.git +fi + +apt-get install scons +### Create virtual env +rm -rf venv_wine +./virtual-wine/vwine-setup venv_wine +#### Active virutal env +. venv_wine/bin/activate + +### Use wine to install packages to virtual env +if [ ! -e "python-2.7.8.msi" ]; then + wget "https://www.python.org/ftp/python/2.7.8/python-2.7.8.msi" +fi + +if [ ! -e "pywin32-218.win32-py2.7.exe" ]; then + wget "http://nchc.dl.sourceforge.net/project/pywin32/pywin32/Build%20218/pywin32-218.win32-py2.7.exe" +fi + +if [ ! -e "PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x32.exe" ]; then + wget "http://nchc.dl.sourceforge.net/project/pyqt/PyQt4/PyQt-4.11.4/PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x32.exe" +fi + +if [ ! -e "lxml-3.7.3.win32-py2.7.exe" ]; then + wget "https://pypi.python.org/packages/a3/f6/a28c5cf63873f6c55a3eb7857b736379229b85ba918261d2e88cf886905e/lxml-3.7.3.win32-py2.7.exe#md5=a0f746355876aca4ca5371cb0f1d13ce" +fi + diff --git a/PPOCRLabel/build-tools/run-in-container.sh b/PPOCRLabel/build-tools/run-in-container.sh new file mode 100644 index 0000000000000000000000000000000000000000..980699d67753a291616c576d723dc4ff898a1e41 --- /dev/null +++ b/PPOCRLabel/build-tools/run-in-container.sh @@ -0,0 +1,13 @@ +#!/bin/sh +docker run -it \ + --user $(id -u) \ + -e DISPLAY=unix$DISPLAY \ + --workdir=$(pwd) \ + --volume="/home/$USER:/home/$USER" \ + --volume="/etc/group:/etc/group:ro" \ + --volume="/etc/passwd:/etc/passwd:ro" \ + --volume="/etc/shadow:/etc/shadow:ro" \ + --volume="/etc/sudoers.d:/etc/sudoers.d:ro" \ + -v /tmp/.X11-unix:/tmp/.X11-unix \ + tzutalin/py2qt4 + diff --git a/PPOCRLabel/combobox.py b/PPOCRLabel/combobox.py new file mode 100644 index 0000000000000000000000000000000000000000..8526b45392902e564364be27948517377217bbeb --- /dev/null +++ b/PPOCRLabel/combobox.py @@ -0,0 +1,46 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +import sys +try: + from PyQt5.QtWidgets import QWidget, QHBoxLayout, QComboBox +except ImportError: + # needed for py3+qt4 + # Ref: + # http://pyqt.sourceforge.net/Docs/PyQt4/incompatible_apis.html + # http://stackoverflow.com/questions/21217399/pyqt4-qtcore-qvariant-object-instead-of-a-string + if sys.version_info.major >= 3: + import sip + sip.setapi('QVariant', 2) + from PyQt4.QtGui import QWidget, QHBoxLayout, QComboBox + + +class ComboBox(QWidget): + def __init__(self, parent=None, items=[]): + super(ComboBox, self).__init__(parent) + + layout = QHBoxLayout() + self.cb = QComboBox() + self.items = items + self.cb.addItems(self.items) + + self.cb.currentIndexChanged.connect(parent.comboSelectionChanged) + + layout.addWidget(self.cb) + self.setLayout(layout) + + def update_items(self, items): + self.items = items + + self.cb.clear() + self.cb.addItems(self.items) diff --git a/PPOCRLabel/data/gif/steps.gif b/PPOCRLabel/data/gif/steps.gif new file mode 100644 index 0000000000000000000000000000000000000000..6ea998500b4ce5c2f3c3861ce5c9a71c99ae83cb Binary files /dev/null and b/PPOCRLabel/data/gif/steps.gif differ diff --git a/PPOCRLabel/data/paddle.png b/PPOCRLabel/data/paddle.png new file mode 100644 index 0000000000000000000000000000000000000000..b1099c73b54c4a8510fc55f4409b053c8884694c Binary files /dev/null and b/PPOCRLabel/data/paddle.png differ diff --git a/PPOCRLabel/data/predefined_classes.txt b/PPOCRLabel/data/predefined_classes.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/PPOCRLabel/libs/__init__.py b/PPOCRLabel/libs/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..0df0cc8460debf585efa11043004ef8838a1da3f --- /dev/null +++ b/PPOCRLabel/libs/__init__.py @@ -0,0 +1,2 @@ +__version_info__ = ('1', '0', '0') +__version__ = '.'.join(__version_info__) diff --git a/PPOCRLabel/libs/autoDialog.py b/PPOCRLabel/libs/autoDialog.py new file mode 100644 index 0000000000000000000000000000000000000000..e1b8e7947e67a7c5a4f2cae02134fdb6f7b067ae --- /dev/null +++ b/PPOCRLabel/libs/autoDialog.py @@ -0,0 +1,150 @@ +try: + from PyQt5.QtGui import * + from PyQt5.QtCore import * + from PyQt5.QtWidgets import * +except ImportError: + from PyQt4.QtGui import * + from PyQt4.QtCore import * + +import json + +from libs.utils import newIcon + +BB = QDialogButtonBox + + +class Worker(QThread): + progressBarValue = pyqtSignal(int) + listValue = pyqtSignal(str) + endsignal = pyqtSignal(int, str) + handle = 0 + + def __init__(self, ocr, mImgList, mainThread, model): + super(Worker, self).__init__() + self.ocr = ocr + self.mImgList = mImgList + self.mainThread = mainThread + self.model = model + + def run(self): + try: + findex = 0 + for Imgpath in self.mImgList: + if self.handle == 0: + self.listValue.emit(Imgpath) + if self.model == 'paddle': + self.result_dic = self.ocr.ocr(Imgpath, cls=True, det=True) + + # 结果保存 + if self.result_dic is None or len(self.result_dic) == 0: + print('Can not recognise file is : ', Imgpath) + pass + else: + for res in self.result_dic: + chars = res[1][0] + cond = res[1][1] + posi = res[0] + self.listValue.emit("文字:" + chars + " 置信度:" + str(cond) + " 坐标:" + json.dumps(posi)) + self.mainThread.result_dic = self.result_dic + self.mainThread.filePath = Imgpath + # 保存 + self.mainThread.saveFile(mode='Auto') + findex += 1 + self.progressBarValue.emit(findex) + else: + break + self.endsignal.emit(0, "readAll") + self.exec() + except Exception as e: + print(e) + raise + + +class AutoDialog(QDialog): + + def __init__(self, text="Enter object label", parent=None, ocr=None, mImgList=None, lenbar=0): + super(AutoDialog, self).__init__(parent) + self.setFixedWidth(1000) + self.parent = parent + self.ocr = ocr + self.mImgList = mImgList + self.pb = QProgressBar() + self.pb.setRange(0, lenbar) + self.pb.setValue(0) + + layout = QVBoxLayout() + layout.addWidget(self.pb) + self.model = 'paddle' + self.listWidget = QListWidget(self) + layout.addWidget(self.listWidget) + + self.buttonBox = bb = BB(BB.Ok | BB.Cancel, Qt.Horizontal, self) + bb.button(BB.Ok).setIcon(newIcon('done')) + bb.button(BB.Cancel).setIcon(newIcon('undo')) + bb.accepted.connect(self.validate) + bb.rejected.connect(self.reject) + layout.addWidget(bb) + bb.button(BB.Ok).setEnabled(False) + + self.setLayout(layout) + self.setWindowTitle("自动标注中") + self.setWindowModality(Qt.ApplicationModal) + + # self.setWindowFlags(Qt.WindowCloseButtonHint) + + self.thread_1 = Worker(self.ocr, self.mImgList, self.parent, 'paddle') + self.thread_1.progressBarValue.connect(self.handleProgressBarSingal) + self.thread_1.listValue.connect(self.handleListWidgetSingal) + self.thread_1.endsignal.connect(self.handleEndsignalSignal) + + def handleProgressBarSingal(self, i): + self.pb.setValue(i) + + def handleListWidgetSingal(self, i): + self.listWidget.addItem(i) + titem = self.listWidget.item(self.listWidget.count() - 1) + self.listWidget.scrollToItem(titem) + + def handleEndsignalSignal(self, i, str): + if i == 0 and str == "readAll": + self.buttonBox.button(BB.Ok).setEnabled(True) + self.buttonBox.button(BB.Cancel).setEnabled(False) + + def reject(self): + print("reject") + self.thread_1.handle = -1 + self.thread_1.quit() + # del self.thread_1 + # if self.thread_1.isRunning(): + # self.thread_1.terminate() + # self.thread_1.quit() + # super(AutoDialog,self).reject() + while not self.thread_1.isFinished(): + pass + self.accept() + + def validate(self): + self.accept() + + def postProcess(self): + try: + self.edit.setText(self.edit.text().trimmed()) + # print(self.edit.text()) + except AttributeError: + # PyQt5: AttributeError: 'str' object has no attribute 'trimmed' + self.edit.setText(self.edit.text()) + print(self.edit.text()) + + def popUp(self): + self.thread_1.start() + return 1 if self.exec_() else None + + def closeEvent(self, event): + print("???") + # if self.thread_1.isRunning(): + # self.thread_1.quit() + # + # # self._thread.terminate() + # # del self.thread_1 + # super(AutoDialog, self).closeEvent(event) + self.reject() diff --git a/PPOCRLabel/libs/canvas.py b/PPOCRLabel/libs/canvas.py new file mode 100644 index 0000000000000000000000000000000000000000..bb166baca6c900dcb04cf305e8bb8b658a70ab08 --- /dev/null +++ b/PPOCRLabel/libs/canvas.py @@ -0,0 +1,798 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +try: + from PyQt5.QtGui import * + from PyQt5.QtCore import * + from PyQt5.QtWidgets import * +except ImportError: + from PyQt4.QtGui import * + from PyQt4.QtCore import * + +#from PyQt4.QtOpenGL import * + +from libs.shape import Shape +from libs.utils import distance + +CURSOR_DEFAULT = Qt.ArrowCursor +CURSOR_POINT = Qt.PointingHandCursor +CURSOR_DRAW = Qt.CrossCursor +CURSOR_MOVE = Qt.ClosedHandCursor +CURSOR_GRAB = Qt.OpenHandCursor + +# class Canvas(QGLWidget): + + +class Canvas(QWidget): + zoomRequest = pyqtSignal(int) + scrollRequest = pyqtSignal(int, int) + newShape = pyqtSignal() + selectionChanged = pyqtSignal(bool) + shapeMoved = pyqtSignal() + drawingPolygon = pyqtSignal(bool) + + CREATE, EDIT = list(range(2)) + _fill_drawing = False # draw shadows + + epsilon = 11.0 + + def __init__(self, *args, **kwargs): + super(Canvas, self).__init__(*args, **kwargs) + # Initialise local state. + self.mode = self.EDIT + self.shapes = [] + self.current = None + self.selectedShape = None # save the selected shape here + self.selectedShapeCopy = None + self.drawingLineColor = QColor(0, 0, 255) + self.drawingRectColor = QColor(0, 0, 255) + self.line = Shape(line_color=self.drawingLineColor) + self.prevPoint = QPointF() + self.offsets = QPointF(), QPointF() + self.scale = 1.0 + self.pixmap = QPixmap() + self.visible = {} + self._hideBackround = False + self.hideBackround = False + self.hShape = None + self.hVertex = None + self._painter = QPainter() + self._cursor = CURSOR_DEFAULT + # Menus: + self.menus = (QMenu(), QMenu()) + # Set widget options. + self.setMouseTracking(True) + self.setFocusPolicy(Qt.WheelFocus) + self.verified = False + self.drawSquare = False + self.fourpoint = True # ADD + self.pointnum = 0 + + #initialisation for panning + self.pan_initial_pos = QPoint() + + def setDrawingColor(self, qColor): + self.drawingLineColor = qColor + self.drawingRectColor = qColor + + def enterEvent(self, ev): + self.overrideCursor(self._cursor) + + def leaveEvent(self, ev): + self.restoreCursor() + + def focusOutEvent(self, ev): + self.restoreCursor() + + def isVisible(self, shape): + return self.visible.get(shape, True) + + def drawing(self): + return self.mode == self.CREATE + + def editing(self): + return self.mode == self.EDIT + + def setEditing(self, value=True): + self.mode = self.EDIT if value else self.CREATE + if not value: # Create + self.unHighlight() + self.deSelectShape() + self.prevPoint = QPointF() + self.repaint() + + def unHighlight(self): + if self.hShape: + self.hShape.highlightClear() + self.hVertex = self.hShape = None + + def selectedVertex(self): + return self.hVertex is not None + + + def mouseMoveEvent(self, ev): + """Update line with last point and current coordinates.""" + pos = self.transformPos(ev.pos()) + + # Update coordinates in status bar if image is opened + window = self.parent().window() + if window.filePath is not None: + self.parent().window().labelCoordinates.setText( + 'X: %d; Y: %d' % (pos.x(), pos.y())) + + # Polygon drawing. + if self.drawing(): + self.overrideCursor(CURSOR_DRAW) # ? + if self.current: + # Display annotation width and height while drawing + currentWidth = abs(self.current[0].x() - pos.x()) + currentHeight = abs(self.current[0].y() - pos.y()) + self.parent().window().labelCoordinates.setText( + 'Width: %d, Height: %d / X: %d; Y: %d' % (currentWidth, currentHeight, pos.x(), pos.y())) + + color = self.drawingLineColor + if self.outOfPixmap(pos): + # Don't allow the user to draw outside the pixmap. + # Clip the coordinates to 0 or max, + # if they are outside the range [0, max] + size = self.pixmap.size() + clipped_x = min(max(0, pos.x()), size.width()) + clipped_y = min(max(0, pos.y()), size.height()) + pos = QPointF(clipped_x, clipped_y) + elif len(self.current) > 1 and self.closeEnough(pos, self.current[0]) and not self.fourpoint: + # Attract line to starting point and colorise to alert the + # user: + pos = self.current[0] + color = self.current.line_color + self.overrideCursor(CURSOR_POINT) + self.current.highlightVertex(0, Shape.NEAR_VERTEX) + elif ( # ADD + len(self.current) > 1 + and self.fourpoint + and self.closeEnough(pos, self.current[0]) + ): + # Attract line to starting point and + # colorise to alert the user. + pos = self.current[0] + self.overrideCursor(CURSOR_POINT) + self.current.highlightVertex(0, Shape.NEAR_VERTEX) + + + if self.drawSquare: + initPos = self.current[0] + minX = initPos.x() + minY = initPos.y() + min_size = min(abs(pos.x() - minX), abs(pos.y() - minY)) + directionX = -1 if pos.x() - minX < 0 else 1 + directionY = -1 if pos.y() - minY < 0 else 1 + self.line[1] = QPointF(minX + directionX * min_size, minY + directionY * min_size) + + elif self.fourpoint: + # self.line[self.pointnum] = pos # OLD + + self.line[0] = self.current[-1] + self.line[1] = pos + + else: + self.line[1] = pos # pos is the mouse's current position + + self.line.line_color = color + self.prevPoint = QPointF() # ? + self.current.highlightClear() + else: + self.prevPoint = pos + self.repaint() + return + + # Polygon copy moving. + if Qt.RightButton & ev.buttons(): + if self.selectedShapeCopy and self.prevPoint: + self.overrideCursor(CURSOR_MOVE) + self.boundedMoveShape(self.selectedShapeCopy, pos) + self.repaint() + elif self.selectedShape: + self.selectedShapeCopy = self.selectedShape.copy() + self.repaint() + return + + # Polygon/Vertex moving. + if Qt.LeftButton & ev.buttons(): + if self.selectedVertex(): + self.boundedMoveVertex(pos) + self.shapeMoved.emit() + self.repaint() + elif self.selectedShape and self.prevPoint: + self.overrideCursor(CURSOR_MOVE) + self.boundedMoveShape(self.selectedShape, pos) + self.shapeMoved.emit() + self.repaint() + else: + #pan + delta_x = pos.x() - self.pan_initial_pos.x() + delta_y = pos.y() - self.pan_initial_pos.y() + self.scrollRequest.emit(delta_x, Qt.Horizontal) + self.scrollRequest.emit(delta_y, Qt.Vertical) + self.update() + return + + # Just hovering over the canvas, 2 posibilities: + # - Highlight shapes + # - Highlight vertex + # Update shape/vertex fill and tooltip value accordingly. + self.setToolTip("Image") + for shape in reversed([s for s in self.shapes if self.isVisible(s)]): + # Look for a nearby vertex to highlight. If that fails, + # check if we happen to be inside a shape. + index = shape.nearestVertex(pos, self.epsilon) + if index is not None: + if self.selectedVertex(): + self.hShape.highlightClear() + self.hVertex, self.hShape = index, shape + shape.highlightVertex(index, shape.MOVE_VERTEX) + self.overrideCursor(CURSOR_POINT) + self.setToolTip("Click & drag to move point") + self.setStatusTip(self.toolTip()) + self.update() + break + elif shape.containsPoint(pos): + if self.selectedVertex(): + self.hShape.highlightClear() + self.hVertex, self.hShape = None, shape + self.setToolTip( + "Click & drag to move shape '%s'" % shape.label) + self.setStatusTip(self.toolTip()) + self.overrideCursor(CURSOR_GRAB) + self.update() + break + else: # Nothing found, clear highlights, reset state. + if self.hShape: + self.hShape.highlightClear() + self.update() + self.hVertex, self.hShape = None, None + self.overrideCursor(CURSOR_DEFAULT) + + def mousePressEvent(self, ev): + pos = self.transformPos(ev.pos()) + + if ev.button() == Qt.LeftButton: + if self.drawing(): + # self.handleDrawing(pos) # OLD + + + if self.current and self.fourpoint: # ADD IF + # Add point to existing shape. + print('Adding points in mousePressEvent is ', self.line[1]) + self.current.addPoint(self.line[1]) + self.line[0] = self.current[-1] + if self.current.isClosed(): + # print('1111') + self.finalise() + elif not self.outOfPixmap(pos): + # Create new shape. + self.current = Shape()# self.current = Shape(shape_type=self.createMode) + self.current.addPoint(pos) + # if self.createMode == "point": + # self.finalise() + # else: + # if self.createMode == "circle": + # self.current.shape_type = "circle" + self.line.points = [pos, pos] + self.setHiding() + self.drawingPolygon.emit(True) + self.update() + + + else: + selection = self.selectShapePoint(pos) + self.prevPoint = pos + + if selection is None: + #pan + QApplication.setOverrideCursor(QCursor(Qt.OpenHandCursor)) + self.pan_initial_pos = pos + + elif ev.button() == Qt.RightButton and self.editing(): + self.selectShapePoint(pos) + self.prevPoint = pos + self.update() + + def mouseReleaseEvent(self, ev): + if ev.button() == Qt.RightButton: + menu = self.menus[bool(self.selectedShapeCopy)] + self.restoreCursor() + if not menu.exec_(self.mapToGlobal(ev.pos()))\ + and self.selectedShapeCopy: + # Cancel the move by deleting the shadow copy. + self.selectedShapeCopy = None + self.repaint() + elif ev.button() == Qt.LeftButton and self.selectedShape: # OLD + if self.selectedVertex(): + self.overrideCursor(CURSOR_POINT) + else: + self.overrideCursor(CURSOR_GRAB) + + + elif ev.button() == Qt.LeftButton and not self.fourpoint: + pos = self.transformPos(ev.pos()) + if self.drawing(): + self.handleDrawing(pos) + else: + #pan + QApplication.restoreOverrideCursor() # ? + + + def endMove(self, copy=False): + assert self.selectedShape and self.selectedShapeCopy + shape = self.selectedShapeCopy + #del shape.fill_color + #del shape.line_color + if copy: + self.shapes.append(shape) + self.selectedShape.selected = False + self.selectedShape = shape + self.repaint() + else: + self.selectedShape.points = [p for p in shape.points] + self.selectedShapeCopy = None + + def hideBackroundShapes(self, value): + self.hideBackround = value + if self.selectedShape: + # Only hide other shapes if there is a current selection. + # Otherwise the user will not be able to select a shape. + self.setHiding(True) + self.repaint() + + def handleDrawing(self, pos): + if self.current and self.current.reachMaxPoints() is False: + if self.fourpoint: + targetPos = self.line[self.pointnum] + self.current.addPoint(targetPos) + print('current points in handleDrawing is ', self.line[self.pointnum]) + self.update() + if self.pointnum == 3: + self.finalise() + + else: # 按住送掉后跳到这里 + initPos = self.current[0] + print('initPos', self.current[0]) + minX = initPos.x() + minY = initPos.y() + targetPos = self.line[1] + maxX = targetPos.x() + maxY = targetPos.y() + self.current.addPoint(QPointF(maxX, minY)) + self.current.addPoint(targetPos) + self.current.addPoint(QPointF(minX, maxY)) + self.finalise() + + elif not self.outOfPixmap(pos): + print('release') + self.current = Shape() + self.current.addPoint(pos) + self.line.points = [pos, pos] + self.setHiding() + self.drawingPolygon.emit(True) + self.update() + + def setHiding(self, enable=True): + self._hideBackround = self.hideBackround if enable else False + + def canCloseShape(self): + return self.drawing() and self.current and len(self.current) > 2 + + def mouseDoubleClickEvent(self, ev): + # We need at least 4 points here, since the mousePress handler + # adds an extra one before this handler is called. + if self.canCloseShape() and len(self.current) > 3: + if not self.fourpoint: + self.current.popPoint() + self.finalise() + + def selectShape(self, shape): + self.deSelectShape() + shape.selected = True + self.selectedShape = shape + self.setHiding() + self.selectionChanged.emit(True) + self.update() + + def selectShapePoint(self, point): + """Select the first shape created which contains this point.""" + self.deSelectShape() + if self.selectedVertex(): # A vertex is marked for selection. + index, shape = self.hVertex, self.hShape + shape.highlightVertex(index, shape.MOVE_VERTEX) + self.selectShape(shape) + return self.hVertex + for shape in reversed(self.shapes): + if self.isVisible(shape) and shape.containsPoint(point): + self.selectShape(shape) + self.calculateOffsets(shape, point) + return self.selectedShape + return None + + def calculateOffsets(self, shape, point): + rect = shape.boundingRect() + x1 = rect.x() - point.x() + y1 = rect.y() - point.y() + x2 = (rect.x() + rect.width()) - point.x() + y2 = (rect.y() + rect.height()) - point.y() + self.offsets = QPointF(x1, y1), QPointF(x2, y2) + + def snapPointToCanvas(self, x, y): + """ + Moves a point x,y to within the boundaries of the canvas. + :return: (x,y,snapped) where snapped is True if x or y were changed, False if not. + """ + if x < 0 or x > self.pixmap.width() or y < 0 or y > self.pixmap.height(): + x = max(x, 0) + y = max(y, 0) + x = min(x, self.pixmap.width()) + y = min(y, self.pixmap.height()) + return x, y, True + + return x, y, False + + def boundedMoveVertex(self, pos): + index, shape = self.hVertex, self.hShape + point = shape[index] + if self.outOfPixmap(pos): + size = self.pixmap.size() + clipped_x = min(max(0, pos.x()), size.width()) + clipped_y = min(max(0, pos.y()), size.height()) + pos = QPointF(clipped_x, clipped_y) + + if self.drawSquare: + opposite_point_index = (index + 2) % 4 + opposite_point = shape[opposite_point_index] + + min_size = min(abs(pos.x() - opposite_point.x()), abs(pos.y() - opposite_point.y())) + directionX = -1 if pos.x() - opposite_point.x() < 0 else 1 + directionY = -1 if pos.y() - opposite_point.y() < 0 else 1 + shiftPos = QPointF(opposite_point.x() + directionX * min_size - point.x(), + opposite_point.y() + directionY * min_size - point.y()) + else: + shiftPos = pos - point + + shape.moveVertexBy(index, shiftPos) + + lindex = (index + 1) % 4 + rindex = (index + 3) % 4 + lshift = None + rshift = None + if index % 2 == 0: + rshift = QPointF(shiftPos.x(), 0) + lshift = QPointF(0, shiftPos.y()) + else: + lshift = QPointF(shiftPos.x(), 0) + rshift = QPointF(0, shiftPos.y()) + shape.moveVertexBy(rindex, rshift) + shape.moveVertexBy(lindex, lshift) + + def boundedMoveShape(self, shape, pos): + if self.outOfPixmap(pos): + return False # No need to move + o1 = pos + self.offsets[0] + if self.outOfPixmap(o1): + pos -= QPointF(min(0, o1.x()), min(0, o1.y())) + o2 = pos + self.offsets[1] + if self.outOfPixmap(o2): + pos += QPointF(min(0, self.pixmap.width() - o2.x()), + min(0, self.pixmap.height() - o2.y())) + # The next line tracks the new position of the cursor + # relative to the shape, but also results in making it + # a bit "shaky" when nearing the border and allows it to + # go outside of the shape's area for some reason. XXX + #self.calculateOffsets(self.selectedShape, pos) + dp = pos - self.prevPoint + if dp: + shape.moveBy(dp) + self.prevPoint = pos + return True + return False + + def deSelectShape(self): + if self.selectedShape: + self.selectedShape.selected = False + self.selectedShape = None + self.setHiding(False) + self.selectionChanged.emit(False) + self.update() + + def deleteSelected(self): + if self.selectedShape: + shape = self.selectedShape + self.shapes.remove(self.selectedShape) + self.selectedShape = None + self.update() + return shape + + def copySelectedShape(self): + if self.selectedShape: + shape = self.selectedShape.copy() + self.deSelectShape() + self.shapes.append(shape) + shape.selected = True + self.selectedShape = shape + self.boundedShiftShape(shape) + return shape + + def boundedShiftShape(self, shape): + # Try to move in one direction, and if it fails in another. + # Give up if both fail. + point = shape[0] + offset = QPointF(2.0, 2.0) + self.calculateOffsets(shape, point) + self.prevPoint = point + if not self.boundedMoveShape(shape, point - offset): + self.boundedMoveShape(shape, point + offset) + + def paintEvent(self, event): + if not self.pixmap: + return super(Canvas, self).paintEvent(event) + + p = self._painter + p.begin(self) + p.setRenderHint(QPainter.Antialiasing) + p.setRenderHint(QPainter.HighQualityAntialiasing) + p.setRenderHint(QPainter.SmoothPixmapTransform) + + p.scale(self.scale, self.scale) + p.translate(self.offsetToCenter()) + + p.drawPixmap(0, 0, self.pixmap) + Shape.scale = self.scale + for shape in self.shapes: + if (shape.selected or not self._hideBackround) and self.isVisible(shape): + shape.fill = shape.selected or shape == self.hShape + shape.paint(p) + if self.current: + self.current.paint(p) + self.line.paint(p) + if self.selectedShapeCopy: + self.selectedShapeCopy.paint(p) + + # Paint rect + if self.current is not None and len(self.line) == 2 and not self.fourpoint: + # print('Drawing rect') + leftTop = self.line[0] + rightBottom = self.line[1] + rectWidth = rightBottom.x() - leftTop.x() + rectHeight = rightBottom.y() - leftTop.y() + p.setPen(self.drawingRectColor) + brush = QBrush(Qt.BDiagPattern) + p.setBrush(brush) + p.drawRect(leftTop.x(), leftTop.y(), rectWidth, rectHeight) + + + # ADD: + if ( + self.fillDrawing() + and self.fourpoint + and self.current is not None + and len(self.current.points) >= 2 + ): + print('paint event') + drawing_shape = self.current.copy() + drawing_shape.addPoint(self.line[1]) + drawing_shape.fill = True + drawing_shape.paint(p) + + if self.drawing() and not self.prevPoint.isNull() and not self.outOfPixmap(self.prevPoint): + p.setPen(QColor(0, 0, 0)) + p.drawLine(self.prevPoint.x(), 0, self.prevPoint.x(), self.pixmap.height()) + p.drawLine(0, self.prevPoint.y(), self.pixmap.width(), self.prevPoint.y()) + + self.setAutoFillBackground(True) + if self.verified: + pal = self.palette() + pal.setColor(self.backgroundRole(), QColor(184, 239, 38, 128)) + self.setPalette(pal) + else: + pal = self.palette() + pal.setColor(self.backgroundRole(), QColor(232, 232, 232, 255)) + self.setPalette(pal) + + p.end() + + def fillDrawing(self): + return self._fill_drawing + + def transformPos(self, point): + """Convert from widget-logical coordinates to painter-logical coordinates.""" + return point / self.scale - self.offsetToCenter() + + def offsetToCenter(self): + s = self.scale + area = super(Canvas, self).size() + w, h = self.pixmap.width() * s, self.pixmap.height() * s + aw, ah = area.width(), area.height() + x = (aw - w) / (2 * s) if aw > w else 0 + y = (ah - h) / (2 * s) if ah > h else 0 + return QPointF(x, y) + + def outOfPixmap(self, p): + w, h = self.pixmap.width(), self.pixmap.height() + return not (0 <= p.x() <= w and 0 <= p.y() <= h) + + def finalise(self): + assert self.current + if self.current.points[0] == self.current.points[-1]: + # print('finalse') + self.current = None + self.drawingPolygon.emit(False) + self.update() + return + + self.current.close() + self.shapes.append(self.current) + self.current = None + self.setHiding(False) + self.newShape.emit() + self.update() + + def closeEnough(self, p1, p2): + #d = distance(p1 - p2) + #m = (p1-p2).manhattanLength() + # print "d %.2f, m %d, %.2f" % (d, m, d - m) + return distance(p1 - p2) < self.epsilon + + # These two, along with a call to adjustSize are required for the + # scroll area. + def sizeHint(self): + return self.minimumSizeHint() + + def minimumSizeHint(self): + if self.pixmap: + return self.scale * self.pixmap.size() + return super(Canvas, self).minimumSizeHint() + + def wheelEvent(self, ev): + qt_version = 4 if hasattr(ev, "delta") else 5 + if qt_version == 4: + if ev.orientation() == Qt.Vertical: + v_delta = ev.delta() + h_delta = 0 + else: + h_delta = ev.delta() + v_delta = 0 + else: + delta = ev.angleDelta() + h_delta = delta.x() + v_delta = delta.y() + + mods = ev.modifiers() + if Qt.ControlModifier == int(mods) and v_delta: + self.zoomRequest.emit(v_delta) + else: + v_delta and self.scrollRequest.emit(v_delta, Qt.Vertical) + h_delta and self.scrollRequest.emit(h_delta, Qt.Horizontal) + ev.accept() + + def keyPressEvent(self, ev): + key = ev.key() + if key == Qt.Key_Escape and self.current: + print('ESC press') + self.current = None + self.drawingPolygon.emit(False) + self.update() + elif key == Qt.Key_Return and self.canCloseShape(): + self.finalise() + elif key == Qt.Key_Left and self.selectedShape: + self.moveOnePixel('Left') + elif key == Qt.Key_Right and self.selectedShape: + self.moveOnePixel('Right') + elif key == Qt.Key_Up and self.selectedShape: + self.moveOnePixel('Up') + elif key == Qt.Key_Down and self.selectedShape: + self.moveOnePixel('Down') + + def moveOnePixel(self, direction): + # print(self.selectedShape.points) + if direction == 'Left' and not self.moveOutOfBound(QPointF(-1.0, 0)): + # print("move Left one pixel") + self.selectedShape.points[0] += QPointF(-1.0, 0) + self.selectedShape.points[1] += QPointF(-1.0, 0) + self.selectedShape.points[2] += QPointF(-1.0, 0) + self.selectedShape.points[3] += QPointF(-1.0, 0) + elif direction == 'Right' and not self.moveOutOfBound(QPointF(1.0, 0)): + # print("move Right one pixel") + self.selectedShape.points[0] += QPointF(1.0, 0) + self.selectedShape.points[1] += QPointF(1.0, 0) + self.selectedShape.points[2] += QPointF(1.0, 0) + self.selectedShape.points[3] += QPointF(1.0, 0) + elif direction == 'Up' and not self.moveOutOfBound(QPointF(0, -1.0)): + # print("move Up one pixel") + self.selectedShape.points[0] += QPointF(0, -1.0) + self.selectedShape.points[1] += QPointF(0, -1.0) + self.selectedShape.points[2] += QPointF(0, -1.0) + self.selectedShape.points[3] += QPointF(0, -1.0) + elif direction == 'Down' and not self.moveOutOfBound(QPointF(0, 1.0)): + # print("move Down one pixel") + self.selectedShape.points[0] += QPointF(0, 1.0) + self.selectedShape.points[1] += QPointF(0, 1.0) + self.selectedShape.points[2] += QPointF(0, 1.0) + self.selectedShape.points[3] += QPointF(0, 1.0) + self.shapeMoved.emit() + self.repaint() + + def moveOutOfBound(self, step): + points = [p1+p2 for p1, p2 in zip(self.selectedShape.points, [step]*4)] + return True in map(self.outOfPixmap, points) + + def setLastLabel(self, text, line_color = None, fill_color = None): + assert text + self.shapes[-1].label = text + if line_color: + self.shapes[-1].line_color = line_color + + if fill_color: + self.shapes[-1].fill_color = fill_color + + return self.shapes[-1] + + def undoLastLine(self): + assert self.shapes + self.current = self.shapes.pop() + self.current.setOpen() + self.line.points = [self.current[-1], self.current[0]] + self.drawingPolygon.emit(True) + + def resetAllLines(self): + assert self.shapes + self.current = self.shapes.pop() + self.current.setOpen() + self.line.points = [self.current[-1], self.current[0]] + self.drawingPolygon.emit(True) + self.current = None + self.drawingPolygon.emit(False) + self.update() + + def loadPixmap(self, pixmap): + self.pixmap = pixmap + self.shapes = [] + self.repaint() # 这函数在哪 + + def loadShapes(self, shapes): + self.shapes = list(shapes) + self.current = None + self.repaint() + + def setShapeVisible(self, shape, value): + self.visible[shape] = value + self.repaint() + + def currentCursor(self): + cursor = QApplication.overrideCursor() + if cursor is not None: + cursor = cursor.shape() + return cursor + + def overrideCursor(self, cursor): + self._cursor = cursor + if self.currentCursor() is None: + QApplication.setOverrideCursor(cursor) + else: + QApplication.changeOverrideCursor(cursor) + + def restoreCursor(self): + QApplication.restoreOverrideCursor() + + def resetState(self): + self.restoreCursor() + self.pixmap = None + self.update() + + def setDrawingShapeToSquare(self, status): + self.drawSquare = status diff --git a/PPOCRLabel/libs/colorDialog.py b/PPOCRLabel/libs/colorDialog.py new file mode 100644 index 0000000000000000000000000000000000000000..c70ff76549318ed9e05cc50a5a41483ad986cc83 --- /dev/null +++ b/PPOCRLabel/libs/colorDialog.py @@ -0,0 +1,49 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +try: + from PyQt5.QtGui import * + from PyQt5.QtCore import * + from PyQt5.QtWidgets import QColorDialog, QDialogButtonBox +except ImportError: + from PyQt4.QtGui import * + from PyQt4.QtCore import * + +BB = QDialogButtonBox + + +class ColorDialog(QColorDialog): + + def __init__(self, parent=None): + super(ColorDialog, self).__init__(parent) + self.setOption(QColorDialog.ShowAlphaChannel) + # The Mac native dialog does not support our restore button. + self.setOption(QColorDialog.DontUseNativeDialog) + # Add a restore defaults button. + # The default is set at invocation time, so that it + # works across dialogs for different elements. + self.default = None + self.bb = self.layout().itemAt(1).widget() + self.bb.addButton(BB.RestoreDefaults) + self.bb.clicked.connect(self.checkRestore) + + def getColor(self, value=None, title=None, default=None): + self.default = default + if title: + self.setWindowTitle(title) + if value: + self.setCurrentColor(value) + return self.currentColor() if self.exec_() else None + + def checkRestore(self, button): + if self.bb.buttonRole(button) & BB.ResetRole and self.default: + self.setCurrentColor(self.default) diff --git a/PPOCRLabel/libs/constants.py b/PPOCRLabel/libs/constants.py new file mode 100644 index 0000000000000000000000000000000000000000..58c8222ec52dcdbff7ddda04911f6703a2bdedc7 --- /dev/null +++ b/PPOCRLabel/libs/constants.py @@ -0,0 +1,31 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +SETTING_FILENAME = 'filename' +SETTING_RECENT_FILES = 'recentFiles' +SETTING_WIN_SIZE = 'window/size' +SETTING_WIN_POSE = 'window/position' +SETTING_WIN_GEOMETRY = 'window/geometry' +SETTING_LINE_COLOR = 'line/color' +SETTING_FILL_COLOR = 'fill/color' +SETTING_ADVANCE_MODE = 'advanced' +SETTING_WIN_STATE = 'window/state' +SETTING_SAVE_DIR = 'savedir' +SETTING_PAINT_LABEL = 'paintlabel' +SETTING_LAST_OPEN_DIR = 'lastOpenDir' +SETTING_AUTO_SAVE = 'autosave' +SETTING_SINGLE_CLASS = 'singleclass' +FORMAT_PASCALVOC='PascalVOC' +FORMAT_YOLO='YOLO' +SETTING_DRAW_SQUARE = 'draw/square' +SETTING_LABEL_FILE_FORMAT= 'labelFileFormat' +DEFAULT_ENCODING = 'utf-8' diff --git a/PPOCRLabel/libs/create_ml_io.py b/PPOCRLabel/libs/create_ml_io.py new file mode 100644 index 0000000000000000000000000000000000000000..a2123b265b8f0f5000de43949ecf77169a574325 --- /dev/null +++ b/PPOCRLabel/libs/create_ml_io.py @@ -0,0 +1,143 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +#!/usr/bin/env python +# -*- coding: utf8 -*- +import json +from pathlib import Path + +from libs.constants import DEFAULT_ENCODING +import os + +JSON_EXT = '.json' +ENCODE_METHOD = DEFAULT_ENCODING + + +class CreateMLWriter: + def __init__(self, foldername, filename, imgsize, shapes, outputfile, databasesrc='Unknown', localimgpath=None): + self.foldername = foldername + self.filename = filename + self.databasesrc = databasesrc + self.imgsize = imgsize + self.boxlist = [] + self.localimgpath = localimgpath + self.verified = False + self.shapes = shapes + self.outputfile = outputfile + + def write(self): + if os.path.isfile(self.outputfile): + with open(self.outputfile, "r") as file: + input_data = file.read() + outputdict = json.loads(input_data) + else: + outputdict = [] + + outputimagedict = { + "image": self.filename, + "annotations": [] + } + + for shape in self.shapes: + points = shape["points"] + + x1 = points[0][0] + y1 = points[0][1] + x2 = points[1][0] + y2 = points[2][1] + + height, width, x, y = self.calculate_coordinates(x1, x2, y1, y2) + + shapedict = { + "label": shape["label"], + "coordinates": { + "x": x, + "y": y, + "width": width, + "height": height + } + } + outputimagedict["annotations"].append(shapedict) + + # check if image already in output + exists = False + for i in range(0, len(outputdict)): + if outputdict[i]["image"] == outputimagedict["image"]: + exists = True + outputdict[i] = outputimagedict + break + + if not exists: + outputdict.append(outputimagedict) + + Path(self.outputfile).write_text(json.dumps(outputdict), ENCODE_METHOD) + + def calculate_coordinates(self, x1, x2, y1, y2): + if x1 < x2: + xmin = x1 + xmax = x2 + else: + xmin = x2 + xmax = x1 + if y1 < y2: + ymin = y1 + ymax = y2 + else: + ymin = y2 + ymax = y1 + width = xmax - xmin + if width < 0: + width = width * -1 + height = ymax - ymin + # x and y from center of rect + x = xmin + width / 2 + y = ymin + height / 2 + return height, width, x, y + + +class CreateMLReader: + def __init__(self, jsonpath, filepath): + self.jsonpath = jsonpath + self.shapes = [] + self.verified = False + self.filename = filepath.split("/")[-1:][0] + try: + self.parse_json() + except ValueError: + print("JSON decoding failed") + + def parse_json(self): + with open(self.jsonpath, "r") as file: + inputdata = file.read() + + outputdict = json.loads(inputdata) + self.verified = True + + if len(self.shapes) > 0: + self.shapes = [] + for image in outputdict: + if image["image"] == self.filename: + for shape in image["annotations"]: + self.add_shape(shape["label"], shape["coordinates"]) + + def add_shape(self, label, bndbox): + xmin = bndbox["x"] - (bndbox["width"] / 2) + ymin = bndbox["y"] - (bndbox["height"] / 2) + + xmax = bndbox["x"] + (bndbox["width"] / 2) + ymax = bndbox["y"] + (bndbox["height"] / 2) + + points = [(xmin, ymin), (xmax, ymin), (xmax, ymax), (xmin, ymax)] + self.shapes.append((label, points, None, None, True)) + + def get_shapes(self): + return self.shapes diff --git a/PPOCRLabel/libs/hashableQListWidgetItem.py b/PPOCRLabel/libs/hashableQListWidgetItem.py new file mode 100644 index 0000000000000000000000000000000000000000..95c496ff56048f85acc798a79db43cd0d52546b7 --- /dev/null +++ b/PPOCRLabel/libs/hashableQListWidgetItem.py @@ -0,0 +1,40 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import sys +try: + from PyQt5.QtGui import * + from PyQt5.QtCore import * + from PyQt5.QtWidgets import * +except ImportError: + # needed for py3+qt4 + # Ref: + # http://pyqt.sourceforge.net/Docs/PyQt4/incompatible_apis.html + # http://stackoverflow.com/questions/21217399/pyqt4-qtcore-qvariant-object-instead-of-a-string + if sys.version_info.major >= 3: + import sip + sip.setapi('QVariant', 2) + from PyQt4.QtGui import * + from PyQt4.QtCore import * + +# PyQt5: TypeError: unhashable type: 'QListWidgetItem' + + +class HashableQListWidgetItem(QListWidgetItem): + + def __init__(self, *args): + super(HashableQListWidgetItem, self).__init__(*args) + + def __hash__(self): + return hash(id(self)) diff --git a/PPOCRLabel/libs/labelDialog.py b/PPOCRLabel/libs/labelDialog.py new file mode 100644 index 0000000000000000000000000000000000000000..57071d77b5de0ed70a437734913fe1330edc5162 --- /dev/null +++ b/PPOCRLabel/libs/labelDialog.py @@ -0,0 +1,107 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +try: + from PyQt5.QtGui import * + from PyQt5.QtCore import * + from PyQt5.QtWidgets import * +except ImportError: + from PyQt4.QtGui import * + from PyQt4.QtCore import * + +from libs.utils import newIcon, labelValidator + +BB = QDialogButtonBox + + +class LabelDialog(QDialog): + + def __init__(self, text="Enter object label", parent=None, listItem=None): + super(LabelDialog, self).__init__(parent) + + self.edit = QLineEdit() # OLD + # self.edit = QTextEdit() + self.edit.setText(text) + # self.edit.setValidator(labelValidator()) # 验证有效性 + self.edit.editingFinished.connect(self.postProcess) + + model = QStringListModel() + model.setStringList(listItem) + completer = QCompleter() + completer.setModel(model) + self.edit.setCompleter(completer) + + layout = QVBoxLayout() + layout.addWidget(self.edit) + self.buttonBox = bb = BB(BB.Ok | BB.Cancel, Qt.Horizontal, self) + bb.button(BB.Ok).setIcon(newIcon('done')) + bb.button(BB.Cancel).setIcon(newIcon('undo')) + bb.accepted.connect(self.validate) + bb.rejected.connect(self.reject) + layout.addWidget(bb) + + # if listItem is not None and len(listItem) > 0: + # self.listWidget = QListWidget(self) + # for item in listItem: + # self.listWidget.addItem(item) + # self.listWidget.itemClicked.connect(self.listItemClick) + # self.listWidget.itemDoubleClicked.connect(self.listItemDoubleClick) + # layout.addWidget(self.listWidget) + + self.setLayout(layout) + + def validate(self): + try: + if self.edit.text().trimmed(): + self.accept() + except AttributeError: + # PyQt5: AttributeError: 'str' object has no attribute 'trimmed' + if self.edit.text().strip(): + self.accept() + + def postProcess(self): + try: + self.edit.setText(self.edit.text().trimmed()) + # print(self.edit.text()) + except AttributeError: + # PyQt5: AttributeError: 'str' object has no attribute 'trimmed' + self.edit.setText(self.edit.text()) + print(self.edit.text()) + + def popUp(self, text='', move=True): + self.edit.setText(text) + self.edit.setSelection(0, len(text)) + self.edit.setFocus(Qt.PopupFocusReason) + if move: + cursor_pos = QCursor.pos() + parent_bottomRight = self.parentWidget().geometry() + max_x = parent_bottomRight.x() + parent_bottomRight.width() - self.sizeHint().width() + max_y = parent_bottomRight.y() + parent_bottomRight.height() - self.sizeHint().height() + max_global = self.parentWidget().mapToGlobal(QPoint(max_x, max_y)) + if cursor_pos.x() > max_global.x(): + cursor_pos.setX(max_global.x()) + if cursor_pos.y() > max_global.y(): + cursor_pos.setY(max_global.y()) + self.move(cursor_pos) + return self.edit.text() if self.exec_() else None + + def listItemClick(self, tQListWidgetItem): + try: + text = tQListWidgetItem.text().trimmed() + except AttributeError: + # PyQt5: AttributeError: 'str' object has no attribute 'trimmed' + text = tQListWidgetItem.text().strip() + self.edit.setText(text) + + def listItemDoubleClick(self, tQListWidgetItem): + self.listItemClick(tQListWidgetItem) + self.validate() diff --git a/PPOCRLabel/libs/labelFile.py b/PPOCRLabel/libs/labelFile.py new file mode 100644 index 0000000000000000000000000000000000000000..ebcca26698ba6ca38152b37c653aff842c11ff97 --- /dev/null +++ b/PPOCRLabel/libs/labelFile.py @@ -0,0 +1,152 @@ +# Copyright (c) 2016 Tzutalin +# Create by TzuTaLin + +try: + from PyQt5.QtGui import QImage +except ImportError: + from PyQt4.QtGui import QImage + +from base64 import b64encode, b64decode +from libs.pascal_voc_io import PascalVocWriter +from libs.yolo_io import YOLOWriter +from libs.pascal_voc_io import XML_EXT +from enum import Enum +import os.path +import sys + + +class LabelFileFormat(Enum): + PASCAL_VOC= 1 + YOLO = 2 + + +class LabelFileError(Exception): + pass + + +class LabelFile(object): + # It might be changed as window creates. By default, using XML ext + # suffix = '.lif' + suffix = XML_EXT + + def __init__(self, filename=None): + self.shapes = () + self.imagePath = None + self.imageData = None + self.verified = False + + def savePascalVocFormat(self, filename, shapes, imagePath, imageData, + lineColor=None, fillColor=None, databaseSrc=None): + imgFolderPath = os.path.dirname(imagePath) + imgFolderName = os.path.split(imgFolderPath)[-1] + imgFileName = os.path.basename(imagePath) + #imgFileNameWithoutExt = os.path.splitext(imgFileName)[0] + # Read from file path because self.imageData might be empty if saving to + # Pascal format + image = QImage() + image.load(imagePath) + imageShape = [image.height(), image.width(), + 1 if image.isGrayscale() else 3] + writer = PascalVocWriter(imgFolderName, imgFileName, + imageShape, localImgPath=imagePath) + writer.verified = self.verified + + for shape in shapes: + points = shape['points'] + label = shape['label'] + # Add Chris + difficult = int(shape['difficult']) + bndbox = LabelFile.convertPoints2BndBox(points) + writer.addBndBox(bndbox[0], bndbox[1], bndbox[2], bndbox[3], label, difficult) + + writer.save(targetFile=filename) + return + + def saveYoloFormat(self, filename, shapes, imagePath, imageData, classList, + lineColor=None, fillColor=None, databaseSrc=None): + imgFolderPath = os.path.dirname(imagePath) + imgFolderName = os.path.split(imgFolderPath)[-1] + imgFileName = os.path.basename(imagePath) + #imgFileNameWithoutExt = os.path.splitext(imgFileName)[0] + # Read from file path because self.imageData might be empty if saving to + # Pascal format + image = QImage() + image.load(imagePath) + imageShape = [image.height(), image.width(), + 1 if image.isGrayscale() else 3] + writer = YOLOWriter(imgFolderName, imgFileName, + imageShape, localImgPath=imagePath) + writer.verified = self.verified + + for shape in shapes: + points = shape['points'] + label = shape['label'] + # Add Chris + difficult = int(shape['difficult']) + bndbox = LabelFile.convertPoints2BndBox(points) + writer.addBndBox(bndbox[0], bndbox[1], bndbox[2], bndbox[3], label, difficult) + + writer.save(targetFile=filename, classList=classList) + return + + def toggleVerify(self): + self.verified = not self.verified + + ''' ttf is disable + def load(self, filename): + import json + with open(filename, 'rb') as f: + data = json.load(f) + imagePath = data['imagePath'] + imageData = b64decode(data['imageData']) + lineColor = data['lineColor'] + fillColor = data['fillColor'] + shapes = ((s['label'], s['points'], s['line_color'], s['fill_color'])\ + for s in data['shapes']) + # Only replace data after everything is loaded. + self.shapes = shapes + self.imagePath = imagePath + self.imageData = imageData + self.lineColor = lineColor + self.fillColor = fillColor + + def save(self, filename, shapes, imagePath, imageData, lineColor=None, fillColor=None): + import json + with open(filename, 'wb') as f: + json.dump(dict( + shapes=shapes, + lineColor=lineColor, fillColor=fillColor, + imagePath=imagePath, + imageData=b64encode(imageData)), + f, ensure_ascii=True, indent=2) + ''' + + @staticmethod + def isLabelFile(filename): + fileSuffix = os.path.splitext(filename)[1].lower() + return fileSuffix == LabelFile.suffix + + @staticmethod + def convertPoints2BndBox(points): + xmin = float('inf') + ymin = float('inf') + xmax = float('-inf') + ymax = float('-inf') + for p in points: + x = p[0] + y = p[1] + xmin = min(x, xmin) + ymin = min(y, ymin) + xmax = max(x, xmax) + ymax = max(y, ymax) + + # Martin Kersner, 2015/11/12 + # 0-valued coordinates of BB caused an error while + # training faster-rcnn object detector. + if xmin < 1: + xmin = 1 + + if ymin < 1: + ymin = 1 + + return (int(xmin), int(ymin), int(xmax), int(ymax)) diff --git a/PPOCRLabel/libs/pascal_voc_io.py b/PPOCRLabel/libs/pascal_voc_io.py new file mode 100644 index 0000000000000000000000000000000000000000..6c58239764de56644d033a6d175740495e0fb917 --- /dev/null +++ b/PPOCRLabel/libs/pascal_voc_io.py @@ -0,0 +1,183 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +#!/usr/bin/env python +# -*- coding: utf8 -*- +import sys +from xml.etree import ElementTree +from xml.etree.ElementTree import Element, SubElement +from lxml import etree +import codecs +from libs.constants import DEFAULT_ENCODING +from libs.ustr import ustr + + +XML_EXT = '.xml' +ENCODE_METHOD = DEFAULT_ENCODING + +class PascalVocWriter: + + def __init__(self, foldername, filename, imgSize,databaseSrc='Unknown', localImgPath=None): + self.foldername = foldername + self.filename = filename + self.databaseSrc = databaseSrc + self.imgSize = imgSize + self.boxlist = [] + self.localImgPath = localImgPath + self.verified = False + + def prettify(self, elem): + """ + Return a pretty-printed XML string for the Element. + """ + rough_string = ElementTree.tostring(elem, 'utf8') + root = etree.fromstring(rough_string) + return etree.tostring(root, pretty_print=True, encoding=ENCODE_METHOD).replace(" ".encode(), "\t".encode()) + # minidom does not support UTF-8 + '''reparsed = minidom.parseString(rough_string) + return reparsed.toprettyxml(indent="\t", encoding=ENCODE_METHOD)''' + + def genXML(self): + """ + Return XML root + """ + # Check conditions + if self.filename is None or \ + self.foldername is None or \ + self.imgSize is None: + return None + + top = Element('annotation') + if self.verified: + top.set('verified', 'yes') + + folder = SubElement(top, 'folder') + folder.text = self.foldername + + filename = SubElement(top, 'filename') + filename.text = self.filename + + if self.localImgPath is not None: + localImgPath = SubElement(top, 'path') + localImgPath.text = self.localImgPath + + source = SubElement(top, 'source') + database = SubElement(source, 'database') + database.text = self.databaseSrc + + size_part = SubElement(top, 'size') + width = SubElement(size_part, 'width') + height = SubElement(size_part, 'height') + depth = SubElement(size_part, 'depth') + width.text = str(self.imgSize[1]) + height.text = str(self.imgSize[0]) + if len(self.imgSize) == 3: + depth.text = str(self.imgSize[2]) + else: + depth.text = '1' + + segmented = SubElement(top, 'segmented') + segmented.text = '0' + return top + + def addBndBox(self, xmin, ymin, xmax, ymax, name, difficult): + bndbox = {'xmin': xmin, 'ymin': ymin, 'xmax': xmax, 'ymax': ymax} + bndbox['name'] = name + bndbox['difficult'] = difficult + self.boxlist.append(bndbox) + + def appendObjects(self, top): + for each_object in self.boxlist: + object_item = SubElement(top, 'object') + name = SubElement(object_item, 'name') + name.text = ustr(each_object['name']) + pose = SubElement(object_item, 'pose') + pose.text = "Unspecified" + truncated = SubElement(object_item, 'truncated') + if int(float(each_object['ymax'])) == int(float(self.imgSize[0])) or (int(float(each_object['ymin']))== 1): + truncated.text = "1" # max == height or min + elif (int(float(each_object['xmax']))==int(float(self.imgSize[1]))) or (int(float(each_object['xmin']))== 1): + truncated.text = "1" # max == width or min + else: + truncated.text = "0" + difficult = SubElement(object_item, 'difficult') + difficult.text = str( bool(each_object['difficult']) & 1 ) + bndbox = SubElement(object_item, 'bndbox') + xmin = SubElement(bndbox, 'xmin') + xmin.text = str(each_object['xmin']) + ymin = SubElement(bndbox, 'ymin') + ymin.text = str(each_object['ymin']) + xmax = SubElement(bndbox, 'xmax') + xmax.text = str(each_object['xmax']) + ymax = SubElement(bndbox, 'ymax') + ymax.text = str(each_object['ymax']) + + def save(self, targetFile=None): + root = self.genXML() + self.appendObjects(root) + out_file = None + if targetFile is None: + out_file = codecs.open( + self.filename + XML_EXT, 'w', encoding=ENCODE_METHOD) + else: + out_file = codecs.open(targetFile, 'w', encoding=ENCODE_METHOD) + + prettifyResult = self.prettify(root) + out_file.write(prettifyResult.decode('utf8')) + out_file.close() + + +class PascalVocReader: + + def __init__(self, filepath): + # shapes type: + # [labbel, [(x1,y1), (x2,y2), (x3,y3), (x4,y4)], color, color, difficult] + self.shapes = [] + self.filepath = filepath + self.verified = False + try: + self.parseXML() + except: + pass + + def getShapes(self): + return self.shapes + + def addShape(self, label, bndbox, difficult): + xmin = int(float(bndbox.find('xmin').text)) + ymin = int(float(bndbox.find('ymin').text)) + xmax = int(float(bndbox.find('xmax').text)) + ymax = int(float(bndbox.find('ymax').text)) + points = [(xmin, ymin), (xmax, ymin), (xmax, ymax), (xmin, ymax)] + self.shapes.append((label, points, None, None, difficult)) + + def parseXML(self): + assert self.filepath.endswith(XML_EXT), "Unsupport file format" + parser = etree.XMLParser(encoding=ENCODE_METHOD) + xmltree = ElementTree.parse(self.filepath, parser=parser).getroot() + filename = xmltree.find('filename').text + try: + verified = xmltree.attrib['verified'] + if verified == 'yes': + self.verified = True + except KeyError: + self.verified = False + + for object_iter in xmltree.findall('object'): + bndbox = object_iter.find("bndbox") + label = object_iter.find('name').text + # Add chris + difficult = False + if object_iter.find('difficult') is not None: + difficult = bool(int(object_iter.find('difficult').text)) + self.addShape(label, bndbox, difficult) + return True diff --git a/PPOCRLabel/libs/resources.py b/PPOCRLabel/libs/resources.py new file mode 100644 index 0000000000000000000000000000000000000000..4c710897f67bab45518eead381c186adf0be2601 --- /dev/null +++ b/PPOCRLabel/libs/resources.py @@ -0,0 +1,8515 @@ +# -*- coding: utf-8 -*- + +# Resource object code +# +# Created by: The Resource Compiler for PyQt5 (Qt v5.15.1) +# +# WARNING! All changes made in this file will be lost! + +from PyQt5 import QtCore + +qt_resource_data = b"\ +\x00\x00\x02\x86\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x12\x00\x00\ +\x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ +\xd2\x02\x01\x0b\x00\x03\xc4\x02\x9d\xda\x00\x00\x02\x03\x49\x44\ +\x41\x54\x78\xda\xbd\x95\xbf\xab\xda\x50\x14\xc7\x3f\x79\x7d\x2d\ +\x0a\xa5\x94\x82\x98\x74\x2b\x05\x41\xfa\x63\x08\x8a\xbc\xff\xc1\ +\xff\xc1\x31\x05\x41\xb2\xb9\x14\xb4\x0e\xdd\x8a\x6e\x25\x20\xd4\ +\xd1\xcd\x41\xe7\x2e\x19\x44\x04\x47\xfd\x0b\x1e\xa8\x9b\xa0\x49\ +\x90\x36\xb7\x4b\xae\xcd\x8b\xfa\x12\x2d\xf4\xc0\x81\x5c\xc8\x3d\ +\x9f\x73\xee\xf7\xdc\x73\xe1\x3f\xd9\x17\x40\x5c\xe8\x9f\x81\xa7\ +\x80\x92\x04\x20\x46\xa3\x91\xf0\x3c\x2f\xd6\x1d\xc7\x11\xb6\x6d\ +\x4b\xc8\xab\x00\x72\xd6\x24\x5d\x78\x9e\xc7\x66\xb3\x49\x5c\x72\ +\x36\x9b\x05\x78\x0b\xac\x81\x5d\x00\x3c\xb2\xdb\xf0\x62\x30\x18\ +\xb0\x5e\xaf\x01\x48\xa5\x52\x54\x2a\x15\xa6\xd3\x29\xb3\xd9\x0c\ +\xc3\x30\xb0\x2c\x0b\x5d\xd7\x29\x16\x8b\x72\x4b\x2a\x88\xa1\x9c\ +\x03\x5c\x54\x81\x10\x7f\x63\xa8\xaa\x0a\xf0\x11\xb8\x07\x36\x80\ +\x7f\x6a\xcb\x03\x40\xb5\x5a\xc5\x75\x5d\xda\xed\x36\xad\x56\x8b\ +\x6c\x36\x8b\xae\xeb\x14\x0a\x05\x19\xf0\x12\x33\x80\x1f\x84\x00\ +\x62\xb5\x5a\x9d\x74\x40\x0c\x87\x43\x91\xd4\xe6\xf3\xf9\xa1\x09\ +\xce\x6a\x20\xcf\x5c\x1e\x4b\xb9\x5c\x4e\x9c\x7a\x3e\x9f\x97\x9f\ +\x2f\x63\x35\x10\x42\xa0\xaa\x2a\x42\x08\xfa\xfd\x3e\xcb\xe5\x12\ +\x80\x74\x3a\x8d\x61\x18\x8c\xc7\x63\x26\x93\x09\xa6\x69\xd2\xe9\ +\x74\x28\x95\x4a\xdc\xdd\xdd\xa1\x28\x0a\xc0\xbb\x93\x1a\x00\x07\ +\x1d\x32\x99\x0c\xcd\x66\xf3\x81\xc0\x49\x2c\x00\x7c\x88\xad\xc0\ +\xf7\x7d\x34\x4d\x43\x08\x41\xad\x56\xc3\x71\x1c\xba\xdd\x2e\xf5\ +\x7a\x1d\x4d\xd3\x0e\x19\x87\x2b\x39\x0b\xe8\xf5\x7a\x27\x35\x68\ +\x34\x1a\xd7\x56\xf0\xfe\x00\xd8\xed\x76\x6c\xb7\xdb\xc4\x1a\xc8\ +\x33\x07\x0e\x55\x58\x96\x85\xeb\xba\x98\xa6\x79\x0c\xb0\x6d\x9b\ +\x5c\x2e\xf7\x28\xe0\x5f\x2a\xf8\x04\x7c\x8f\xbb\xc5\x52\x03\x20\ +\x56\x87\x28\xe0\x16\x78\x0e\xbc\x00\x9e\x05\x23\x44\xfa\x6b\xe0\ +\xe7\xb5\x5d\x24\x2f\xda\x6f\x60\x0b\xec\x81\x9b\xd0\x8c\x52\x80\ +\x95\xdc\x74\x89\x06\xd1\x59\x14\x1d\x7e\xe1\xb5\x02\xfc\xba\x56\ +\x83\x9b\xe8\x51\x47\xdc\x97\x53\x72\xb1\x58\x24\x0e\x1e\xfa\xd7\ +\x4f\x94\x0c\xf0\xf5\x8a\x27\xf5\x1b\xf0\x46\x49\x98\xd4\x63\x4d\ +\xa0\x44\xdf\x96\xc0\xf7\xc0\x26\x29\x40\x01\x9e\x04\xc1\xa3\x4d\ +\x70\x2a\x86\x08\x1a\x67\xaf\x5c\xf8\x88\xc4\x35\xc5\x91\x9e\x7f\ +\x00\xb7\xae\x9e\x43\x7d\xb2\x82\x67\x00\x00\x00\x00\x49\x45\x4e\ +\x44\xae\x42\x60\x82\ +\x00\x00\x07\xe2\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ +\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ +\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ +\x79\x71\xc9\x65\x3c\x00\x00\x07\x74\x49\x44\x41\x54\x78\xda\xd5\ +\x59\x69\x4c\x54\x57\x18\x35\x21\xe2\x8a\xfc\x20\x10\x11\xca\xa8\ +\xd8\x61\x70\x60\x06\x4a\x91\xaa\x58\x94\x68\x54\xa4\x2e\x35\x26\ +\x60\x63\xa8\x68\x30\x06\xe2\xb8\x47\x62\x0d\xee\x8a\x8e\xe2\x86\ +\xbb\x8e\xbb\xb8\xa2\xe3\x2e\x28\x6e\xe3\x8a\x8e\xbb\xb8\x27\x28\ +\x7f\xc4\xa4\x09\x86\x5f\xfe\x38\xbd\xe7\xbe\xe2\x65\x22\x10\x41\ +\x68\x99\x97\x7c\x2c\x61\xde\x7b\xe7\x7c\xdf\xf9\xce\xfd\xee\xa5\ +\x05\x80\x16\x8d\x75\xf5\x8a\x8a\xf2\x16\x61\x13\x51\x24\x22\xa5\ +\x45\x13\x5f\x00\xe4\x97\xc6\x02\x6f\xee\x63\x36\xbf\x1d\xd3\xa6\ +\x0d\x2c\x9e\x9e\x18\xa0\xd7\xe3\x07\x7f\x7f\x9d\x3b\x10\x20\x78\ +\x0b\x01\x67\xb4\x6d\x0b\xc7\xd0\xa1\xb0\xf7\xe8\x81\xe1\xfe\xfe\ +\xe8\xa6\xd3\xa5\x35\x5f\x02\x4a\x32\xf9\x04\x9b\xd9\xa1\x03\x4a\ +\x4f\x9e\x04\x4e\x9f\x76\x03\x02\x4a\x32\xce\x3f\xda\xb7\x47\x6e\ +\x74\x34\x2a\x5f\xbf\x06\x00\xf7\x20\xc0\x06\x8d\x37\x18\xfe\xfe\ +\x53\x68\xbd\x30\x3d\x1d\xa8\xa8\x00\x3e\x7f\xd6\x42\x54\xa1\x99\ +\x12\x50\x2e\xf3\x5b\x60\x20\x2c\xad\x5a\xa1\x74\xff\x7e\xe0\xd3\ +\x27\xd7\x38\x76\xac\x59\x12\x20\x78\x1d\x25\x93\xe4\xed\x0d\xab\ +\x68\xd8\xca\x9b\x37\x81\x8f\x1f\x81\xf2\x72\x15\x1f\x3e\x00\x87\ +\x0f\x7f\x21\x10\xd1\xbd\xfb\x26\xde\xf7\x7f\x13\x20\xf8\x61\x94\ +\x0c\x2d\xd2\x9e\x9c\x0c\xbc\x79\x03\x94\x95\x01\xef\xdf\x6b\xf1\ +\xee\x9d\x16\xa5\xa5\x40\x5e\x9e\x24\x40\x79\xfd\xee\xe7\x87\x04\ +\x9d\x0e\x24\x2e\x9e\x91\x45\x32\xff\x35\x01\x82\xcf\x21\x88\x8c\ +\x76\xed\x50\xb2\x6a\x95\x06\x9e\x0d\xcb\x78\xf5\x4a\x8b\x97\x2f\ +\x81\x17\x2f\xb4\x78\xfe\x1c\x28\x29\x41\x69\x7e\x3e\x1c\x8b\x16\ +\xc1\x36\x68\x10\x2c\x5e\x5e\x60\xe5\x06\x06\x07\x83\xae\x25\x22\ +\xae\x89\x09\x28\xc9\x8c\xf2\xf1\xc1\xfc\xa0\x20\x94\x9f\x38\x21\ +\x81\xe1\xd9\x33\xe0\xe9\x53\x2d\x9e\x3c\x01\x1e\x3f\x06\x1e\x3d\ +\x02\x1e\x3e\xd4\xe2\xc1\x03\xe0\xfe\x7d\xc0\xe9\x04\xee\xdd\xd3\ +\xe2\xee\x5d\x38\x17\x2e\x84\xd5\x68\x64\x65\x64\x55\xd8\x4b\x7c\ +\x47\x93\x10\x60\x86\xe2\xc2\xc2\xa4\x64\xf2\x12\x12\x80\x5b\xb7\ +\x6a\x04\x47\x60\x28\x2e\x06\xee\xdc\x01\x6e\xdf\xd6\x3e\xc7\xde\ +\xb8\x71\x03\xb8\x7e\x5d\x0b\x87\x03\xb8\x76\x0d\xb8\x7a\x15\xb8\ +\x72\x45\x56\xd1\xda\xb5\x2b\x68\xbf\x94\x25\x1d\xad\x51\x09\x50\ +\xab\x2c\x75\x86\x78\x81\x73\xce\x9c\xda\x40\xd6\x08\x0e\x97\x2f\ +\x03\x97\x2e\x01\x45\x45\xc0\xc5\x8b\xc0\x85\x0b\x40\x61\x21\x70\ +\xfe\xbc\x16\x67\xcf\x02\x67\xce\xc8\xb5\xc2\x39\x71\x22\x2c\x2d\ +\x5b\x82\x8e\xc6\x6a\x7c\x1f\x01\x65\x91\x45\x6c\x3c\x4a\xa6\x74\ +\xeb\xd6\x9a\x80\xd6\x0c\xb2\xa0\x40\x03\x78\xee\x9c\x02\x79\xea\ +\x94\x5c\x13\x40\xe9\xd9\xed\xd2\x5e\x21\xfa\x02\x47\x8f\x02\x47\ +\x8e\x00\x87\x0e\xa1\x72\xdd\x3a\x58\x85\x5b\x51\xa6\x94\x2b\x31\ +\x34\x88\x00\xb5\x18\x6b\x36\x4b\xc9\xd8\xfa\xf4\x41\xe5\xf1\xe3\ +\x35\x81\x65\x36\x6b\x07\x4a\x90\xbc\x8f\x40\x35\x90\xd2\x52\x71\ +\xf0\x20\x70\xe0\x80\x74\x27\xec\xdb\x07\xec\xdd\x0b\xec\xde\x0d\ +\xec\xda\x05\xec\xdc\x09\x6c\xde\x0c\x9b\xe8\x0d\xbe\x5b\x91\xa8\ +\x3f\x01\x0b\x5d\xa2\xd0\x62\xd1\x40\xec\xd9\x43\x70\x5a\x66\x5d\ +\xc1\x32\xa3\x0a\xac\x96\x51\x02\x65\x46\xab\x03\xe5\x33\x14\xd0\ +\x1d\x3b\x80\xed\xdb\x81\x6d\xdb\x80\x2d\x5b\x24\x68\x6c\xdc\x08\ +\x6c\xd8\x00\xac\x5f\x0f\xe4\xe4\xc0\x11\x1b\xeb\x42\xa2\xbe\x04\ +\xe2\xe8\x0c\x16\xa1\xfb\x92\x4d\x9b\x98\x79\xbe\x80\x2f\xd4\xc0\ +\xa9\xcc\xba\x66\x95\x2b\xb1\x06\x56\x65\xd4\x66\xd3\xee\xa3\x04\ +\xab\x03\xcd\xcd\x05\xd6\xae\x05\xd6\xac\x01\x68\xc7\x2b\x57\x02\ +\x2b\x56\x00\xcb\x97\x03\xd9\xd9\x80\x70\xa9\x3c\xa3\x51\x36\x77\ +\x4c\x64\xe4\x29\x81\xcf\xa3\xbe\x3d\x90\xd2\xcf\x60\xa8\x90\xf3\ +\xcd\xd4\xa9\xd4\xbf\x06\xc8\x6a\xd5\x5e\x46\x62\xfc\x5d\x49\x40\ +\x65\x56\x03\xcb\xcf\xb8\x82\x5d\xbd\x5a\x81\xe5\x73\x96\x2d\x03\ +\x96\x2e\x05\x16\x2f\x06\xc4\x1a\x81\x05\x0b\x80\x79\xf3\x80\xac\ +\x2c\x80\x86\x21\xde\x6b\xeb\xd4\x09\xec\xc3\x68\xb3\x39\xbb\xde\ +\x2e\x24\x96\xfe\x9e\xbd\xc3\xc3\x9f\xc8\x09\x33\x2e\x0e\x95\xd4\ +\x3e\x25\x43\x00\x4b\x96\xf0\xa5\xcc\x14\x7f\x66\xf6\x08\x4e\x03\ +\x29\x9a\x51\x65\x56\x81\x65\x66\xf9\x59\xde\xf3\x15\xd8\xd9\xb3\ +\x81\x19\x33\x80\x49\x93\x80\x71\xe3\x00\xae\xf0\x62\x2f\x51\x19\ +\x1f\x8f\xf9\xe2\xfd\x74\x42\x81\x27\xb1\xde\x36\x1a\xda\xad\x9b\ +\x1f\x4b\x28\x67\x7c\x11\xa5\xcc\x38\x1b\x9a\x20\x49\x60\xfe\x7c\ +\x60\xee\x5c\x05\x62\xd6\x2c\x60\xe6\x4c\x60\xda\x34\xfe\xac\x81\ +\x62\x05\x27\x4f\xd6\xc0\x65\x64\x00\xc2\x32\x31\x61\x02\x30\x7e\ +\x3c\x90\x9a\xaa\x81\x1d\x35\x0a\x18\x39\x12\x18\x3e\x5c\x02\xc7\ +\x90\x21\xc0\xe0\xc1\xc0\xc0\x81\x28\x8d\x89\xc1\x38\x0f\x0f\xf4\ +\x36\x99\xca\x04\xa4\x36\x0d\x59\x89\x3d\xa2\x4d\xa6\x4c\xee\xb2\ +\xf8\x20\x07\xb3\x56\x5c\xcc\x06\xad\x9b\xc0\x94\x29\xb5\x83\x4e\ +\x49\x01\xc6\x8c\x01\x46\x8f\x06\x92\x92\xea\x24\x80\xfe\xfd\x61\ +\xef\xd2\x45\xda\x6b\x54\x78\x78\x4e\x83\x67\xa1\x70\x83\x21\x96\ +\x59\xa0\xa4\x6c\x89\x89\x94\x14\x5d\x89\xd2\xa8\x8b\x00\x6d\x95\ +\x84\x55\xd0\x04\xd8\x27\xd4\xfe\xd8\xb1\xdf\x44\xa0\x52\xd8\x79\ +\x66\xeb\xd6\x60\x5f\x76\xf4\xf5\xd5\x37\x80\x80\x92\xd4\x2f\x91\ +\x91\x0e\xb9\xc0\xe9\xf5\x94\x14\x47\x05\xda\x5f\xad\x04\x4a\x84\ +\x8c\xec\x69\x69\x55\x41\x67\x23\x79\x45\x88\xee\xc5\xcf\xd7\x41\ +\x00\xfd\xfa\xc1\x11\x12\x22\x5d\x29\xd2\x68\xcc\xa5\x2a\xbe\x67\ +\x3f\xe0\x41\x57\x90\x23\x86\xb7\xb7\xab\xa4\x58\x09\x57\x02\x1c\ +\xa7\x59\x7e\x39\x26\xb0\x97\xb8\xc6\x08\x77\x63\x02\xe8\x70\x8a\ +\x0c\x17\x3b\xca\xac\x16\x02\x10\x46\x92\xd9\xaa\x95\xaa\xc2\xf7\ +\xee\xc8\x7e\x0a\x0b\x1b\x1c\x67\x34\x56\xc8\x21\x8f\x8d\x48\x10\ +\x85\x85\x94\xc6\x57\x04\x08\xdc\x64\x30\x58\xb9\x2b\xe3\x77\xd1\ +\x53\x45\x04\x22\x2a\xc9\xbe\xa2\x24\x15\x11\x1a\x44\x2d\x04\x1c\ +\x82\x34\x93\x61\x0e\x0d\xcd\x66\x22\xbf\x7b\x4f\x2c\x00\xf9\xc7\ +\x44\x44\xdc\xe4\x43\x99\xd1\x72\xbb\x9d\x20\xb8\x0e\x28\x02\x5f\ +\x6f\x29\xdb\x8b\xf0\x11\xa1\x0b\x0b\x09\xf9\xab\xa7\xd1\x58\xcc\ +\xbf\xb3\x9a\xac\x08\xef\x97\x76\x3d\x62\xc4\x57\x04\x2a\x7b\xf6\ +\x84\x45\x39\x92\x4f\x63\x9d\x4a\x78\xf4\x30\x9b\x37\x71\xf5\x26\ +\x08\x27\x7d\x9f\x20\x38\x6a\x4c\x9f\xfe\x2d\x7b\x62\xef\xf0\x90\ +\x90\xb4\x5f\xbb\x77\x2f\x73\x59\x73\x0a\x0a\xe8\x56\x2e\x04\x20\ +\x9a\xd9\xa6\xed\xec\xd0\x35\x28\x68\x58\xa3\x9e\x0b\x09\x8b\x4b\ +\xa6\x2c\x28\x29\x36\x2b\x49\x70\x7a\xb5\x8b\x5d\x98\x22\x50\x77\ +\x35\x45\x6f\x1d\x66\xaf\xb0\x9a\x24\x21\xd7\x9c\xc4\x44\x17\x02\ +\x4e\x83\x41\xf6\x91\x90\xf0\x5e\x71\x9b\x67\xa3\x9e\xcc\x09\x49\ +\x84\x72\xf5\xa6\xa4\xac\x51\x51\x04\x41\x32\xb5\x11\xa8\x75\xcd\ +\x11\x19\x56\x24\x28\xcb\x84\x84\x2f\x04\xd0\xab\x57\x75\x19\xf9\ +\x35\xc5\xd9\xa8\x67\x8f\x88\x88\x3c\x66\x92\x03\x21\x89\x10\x90\ +\x2e\x20\x20\xf9\x5b\x1f\x20\xac\x3a\xd5\x85\x04\x67\x2a\x45\x00\ +\x36\x5f\x5f\xf9\xcc\x80\x8e\x1d\xe3\x1b\x99\x80\xba\x7e\x36\x99\ +\x26\x52\x52\x72\x97\x15\x1e\x5e\x42\x95\xd5\xf7\x8c\x95\x95\x63\ +\x4f\x48\x39\xa6\xa7\x7f\x21\xe0\x10\x16\xce\x2a\x1b\xf5\xfa\x2c\ +\x56\xad\x49\x08\xf0\xe2\x89\xf4\x8f\x9d\x3b\xa7\xfe\x0b\x5e\xd7\ +\x80\x53\x3f\x5b\x52\x95\x3b\xb1\x1f\x06\x0c\x90\x04\xca\x23\x22\ +\xb8\x5f\xe0\x68\x61\xa7\x09\x34\x11\x01\xa5\x6b\x0e\x61\x0d\x3d\ +\x30\xe6\x31\x3d\xdd\x8d\x16\xcd\xa9\x97\x04\x10\x13\xc3\x3e\xa8\ +\xaa\x6c\xa0\x0b\x81\x66\x76\x55\x6d\xb0\x94\x94\x84\x2b\x91\x80\ +\xd5\xcb\x8b\xff\x77\x20\x60\x7d\xf3\x25\xa0\x48\xe4\x53\x32\x9c\ +\xa3\xb8\x41\x22\x01\x7b\x40\x00\xd8\x5f\x34\x07\x77\x20\xa0\x63\ +\xb6\xe9\x68\xf2\xc8\xa6\x6f\x5f\x38\xc4\x88\xcd\x26\x37\x04\x07\ +\x4f\xa5\xf3\x35\x63\x02\xaa\xa1\x59\x05\x4e\xc0\x9c\x7a\x4b\x0c\ +\x06\x4e\xa7\xf2\xd0\x98\xe3\x89\x3b\x10\x30\xb3\x17\x38\xf8\xf1\ +\x50\xa1\xdc\x64\xaa\x4e\xc0\xaf\x79\x13\x50\x24\x9c\x9c\x5e\xe5\ +\xe2\x26\x46\x94\x34\x01\x59\xcc\x61\xc5\xe2\x4f\xfe\xee\x42\x20\ +\x85\x0b\x18\xf7\x20\xdc\x77\x54\x23\x10\xe8\x2e\x04\xbc\xb9\x91\ +\xa2\xa5\xf2\x0c\x2a\xd3\xd3\xb3\x8a\x80\xde\x0d\x08\x28\x4b\xad\ +\x92\x11\xd7\x02\x8e\xe1\xee\x46\xc0\x42\x19\x71\xdf\x41\x5b\xa5\ +\xbd\xba\x1b\x01\x1d\xdd\x88\xdb\x58\xb7\x24\xc0\xab\xaf\xd1\xf8\ +\x96\xa3\x76\x35\x02\x61\x6e\x45\x80\x7d\xc0\x93\x0d\xee\x37\x38\ +\xb2\x73\xda\x75\x37\x02\x66\xfe\xdb\x2b\x3e\x34\x54\xee\x09\xdc\ +\xab\x02\xea\x6a\x43\xe0\x22\xcc\x22\x7c\x88\xfd\x1f\xf9\x92\x41\ +\x48\x3f\x71\x1a\xd8\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ +\x82\ +\x00\x00\x03\x12\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x3c\x00\x00\x00\x3c\x08\x06\x00\x00\x00\x3a\xfc\xd9\x72\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\ +\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ +\xe2\x03\x02\x04\x32\x2f\x3b\x59\x63\x86\x00\x00\x00\x19\x74\x45\ +\x58\x74\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\ +\x64\x20\x77\x69\x74\x68\x20\x47\x49\x4d\x50\x57\x81\x0e\x17\x00\ +\x00\x02\x7a\x49\x44\x41\x54\x68\xde\xed\xd8\x4b\xa8\x8d\x6b\x1c\ +\xc7\xf1\xcf\xc6\xce\xe6\xd8\x25\xb9\x0d\x44\x88\x72\xa2\x30\xc1\ +\x84\x5c\x42\x71\x9c\x11\x29\x45\x06\x88\x94\x5c\x06\xe4\x32\x31\ +\x33\x32\xa0\x64\xe2\x96\x08\x21\x85\x93\xd2\x49\x92\x94\x5b\x29\ +\xb9\x76\x8a\x48\x31\x71\x89\xe3\xb2\x2d\x93\x47\xbd\xad\xde\x77\ +\xaf\xb5\x77\x6b\x6f\x7b\x6f\xff\x6f\xad\xc9\xfb\xfe\xff\xbf\xe7\ +\xf9\x3d\x97\xff\xf3\xac\x97\x20\x08\x82\x20\x08\x82\x20\x08\x82\ +\x20\x08\x82\xa0\x6d\x18\x8b\x26\x94\xb0\xfc\x77\x30\xfc\x4f\x32\ +\x7b\x17\xdd\xbb\xba\xd9\x39\xc9\x6c\x09\xb3\xba\xba\xd9\xee\xb8\ +\x97\xcc\x9e\xef\xcc\x46\x86\x60\x0b\xea\x2a\xc4\xad\x48\x66\x9b\ +\xf0\x67\xe6\xf9\x06\x8c\xec\xe8\x26\xbb\x61\x36\x4e\xe3\x1b\xee\ +\x54\x88\x6f\xc4\xab\x64\x78\x5f\x99\xce\x87\xa4\x71\x18\x63\x3a\ +\x9a\xd1\xfe\xd8\x84\x27\x99\xbd\x58\xc2\xa1\x0a\x79\x3b\x53\xdc\ +\x7b\x0c\xca\x3c\x1f\x55\xa6\xf3\x1d\x27\x30\xfe\x57\x9a\xac\xc3\ +\x94\x34\x03\xff\x97\x75\xb0\x84\xd7\xf8\xbb\xc2\x92\xff\x98\x62\ +\xb7\x96\xbd\x1b\x8a\x2b\x39\x9a\x25\x9c\xc3\xa4\xf6\x34\xda\x88\ +\x55\xe9\xf8\xc8\xeb\xd0\x4d\x2c\x43\x43\x05\x9d\x43\x29\xfe\x39\ +\x7a\x17\x0c\xe8\x4c\x5c\x2b\x68\xe7\x12\xa6\xb6\xa5\xd1\x71\xd8\ +\x8b\x77\x39\x8d\x7f\xc1\x51\x4c\xae\xa2\x48\xc1\xc4\xb4\x4c\x4b\ +\x58\x5a\xc5\x4a\x9a\x83\x1b\x05\xc6\xaf\xa6\xba\x51\x57\x4b\xb3\ +\x97\x0a\x1a\x7b\x89\x1d\x18\xdc\xc2\xad\xf0\x6f\xca\xbf\x9d\x0a\ +\x54\xb5\x79\xf3\x70\xab\xa0\x2f\x67\x6a\x65\x76\x40\x8e\xf8\x63\ +\x2c\x46\x7d\x2b\xf4\x16\x64\x74\xa6\xb7\xb2\x76\xac\xcb\xe9\xd3\ +\xa9\x5a\x19\x9e\x95\x23\xfe\x1d\xc7\x5a\x71\x5c\xd4\xe3\x41\xa6\ +\xf8\xb4\xd4\xe8\x4c\x9c\xcd\xdc\xb9\xb3\xbf\xed\xb5\x32\xfc\x07\ +\x36\xa6\xe5\x5b\xde\x48\x13\x8e\xa4\x63\xa4\x1a\xd6\xa6\xbc\x6f\ +\x2d\x18\xac\x46\xac\xc1\xfd\x82\xa5\x7c\x1b\x2b\xd1\xa7\xd6\x45\ +\xab\x01\xab\xf1\x5f\x81\xf1\x03\x18\xd1\x4c\x7e\x5f\xbc\x49\xf1\ +\x7b\xab\x68\x6f\x34\x76\xe3\x6d\x4e\x7b\x9f\x70\x30\x1d\x4f\x75\ +\xda\x98\xfa\x74\xec\x3c\xc8\xe9\xc8\x57\xec\xc7\xb0\x9c\xbc\x5d\ +\x29\xe6\x1d\x06\x36\xa3\x3f\x17\x17\x0b\x66\xf3\x21\xd6\xa3\xdf\ +\xaf\xba\xf4\x2f\x2a\x38\x8f\xaf\x96\xc5\x0e\xc7\xe7\xf4\x6e\x73\ +\x33\x9a\x3d\xd3\xa0\x95\x0f\xe2\x49\xcc\x68\x8f\xd9\xac\xb6\x98\ +\xcc\xc7\xf5\x4c\x27\xf7\x94\xc5\x1c\x4f\xcf\x9f\xa1\x57\x33\x5a\ +\x13\x32\x1a\xcf\xb0\xad\x85\x47\x5e\xbb\x1b\x9f\x81\xcb\xe9\x1f\ +\xd0\x4f\x26\x67\x4c\x2c\xa9\xa0\xb1\x14\x17\xf0\x57\x67\xfb\x08\ +\xd0\x23\x33\x08\xd7\x32\x57\xce\x6e\x55\xe6\x75\x5a\x16\x66\x66\ +\x77\x5a\x57\xff\x92\xd1\x13\x4f\x6b\x7d\xed\xeb\xc8\x6c\xcc\x54\ +\xd9\xd1\x1d\x71\xbf\xd5\x9a\x17\xe9\xa2\xf2\x02\x8f\x04\x41\x10\ +\x04\x41\x10\x04\x41\x10\x04\x41\x10\x04\x6d\xc8\x0f\xf0\x6b\xdf\ +\x7c\xd8\x29\x0f\xa9\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ +\x82\ +\x00\x00\x04\x4e\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x12\x00\x00\ +\x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ +\xd2\x01\x07\x0b\x01\x15\x4b\x06\x3c\xc6\x00\x00\x03\xcb\x49\x44\ +\x41\x54\x78\xda\xb5\x96\xcf\x4b\x1c\x49\x14\xc7\x3f\x5d\xd3\x3d\ +\x62\xa2\xf8\x63\x8c\x60\x12\x33\x92\xbb\xae\x88\x17\x5b\x50\xc1\ +\x40\x18\x08\xe3\x06\x57\x84\xe0\x68\xbc\xcd\x25\x07\x73\x8a\xf9\ +\x07\x3c\xe9\x7f\x21\xa8\x43\x2e\xc1\x04\x8c\x27\x41\x4d\x34\xd9\ +\x55\x83\x10\x44\x44\x57\x34\x1e\x46\x3c\x98\x66\x7a\xba\xbb\xaa\ +\x7b\x0f\x71\x1a\x25\x8e\x2e\x8b\x5b\xf0\xa0\xba\xaa\x78\x9f\xf7\ +\xbe\xf5\xba\xaa\xe0\x7f\x6e\x5a\xb1\x89\x44\x22\x91\xcc\x66\xb3\ +\x7d\x8e\xe3\x98\x52\xca\x07\x4a\x29\x80\x7d\x60\xb9\xa2\xa2\x22\ +\xf3\xf9\xf3\xe7\xb7\xff\x09\x90\x4a\xa5\x5a\x36\x36\x36\x26\x84\ +\x10\x9d\xdd\xdd\xdd\x34\x35\x35\x11\x8b\xc5\xf0\x7d\x9f\x6c\x36\ +\xcb\xea\xea\x2a\x73\x73\x73\x48\x29\x17\xee\xdd\xbb\xf7\x72\x65\ +\x65\xe5\xaf\x7f\x0d\xe8\xea\xea\x4a\x1e\x1d\x1d\xbd\x31\x4d\x53\ +\xef\xed\xed\xa5\xb6\xb6\x16\xc3\x30\xd0\x34\x0d\xdf\xf7\xf1\x3c\ +\x8f\x7c\x3e\xcf\xf7\xef\xdf\x99\x9c\x9c\xe4\xe3\xc7\x8f\xb2\xb2\ +\xb2\xb2\x77\x67\x67\xa7\x68\x36\x91\x42\xa7\xa7\xa7\xa7\x65\x7b\ +\x7b\x7b\xfe\xe9\xd3\xa7\xfa\xd0\xd0\x10\x35\x35\x35\x94\x97\x97\ +\x53\x5d\x5d\x4d\x4d\x4d\x0d\x77\xee\xdc\x21\x16\x8b\x51\x56\x56\ +\x46\x59\x59\x19\x8d\x8d\x8d\xd8\xb6\x2d\xd6\xd7\xd7\xfb\xee\xdf\ +\xbf\xff\xee\xe4\xe4\xe4\xe8\x32\x80\x5e\xe8\x7c\xfd\xfa\x75\xc2\ +\x34\x4d\xbd\xbf\xbf\x9f\xd7\xaf\x5f\x63\x18\x06\x86\x61\x20\x84\ +\x60\x7a\x7a\x9a\x20\x08\xe8\xef\xef\x27\x08\x02\x82\x20\xc0\xf3\ +\x3c\x5e\xbd\x7a\xc5\xe1\xe1\xa1\xfe\xe5\xcb\x97\x09\xa0\xeb\x32\ +\x80\x00\x68\x6e\x6e\x4e\xfa\xbe\xdf\x39\x38\x38\xc8\xad\x5b\xb7\ +\x88\x46\xa3\x94\x94\x94\x20\x84\x40\xd3\x34\x84\x10\x61\x5f\xd3\ +\x7e\xaa\x1a\x89\x44\x78\xf8\xf0\x21\xe9\x74\x9a\x20\x08\x3a\xab\ +\xab\xab\x93\x45\x01\xd9\x6c\xb6\x2f\x99\x4c\x52\x57\x57\xc7\xed\ +\xdb\xb7\xd1\xf5\x9f\x89\x65\x32\x19\x32\x99\x4c\xe8\x78\x66\x66\ +\x86\xa9\xa9\xa9\xf0\x5b\x08\x41\x73\x73\x33\x89\x44\x02\xdb\xb6\ +\xfb\x8a\x02\x1c\xc7\x31\xdb\xdb\xdb\x89\x46\xa3\x94\x97\x97\x87\ +\x51\x06\x41\x70\x61\x71\x41\x9e\x0b\x55\xa2\x69\x3c\x7a\xf4\x08\ +\xa5\x94\x59\xb4\x8a\xaa\xaa\xaa\xbc\xd9\xd9\x59\xfd\xee\xdd\xbb\ +\x54\x56\x56\x12\x8d\x46\x89\x44\x22\x44\x22\x11\x84\x10\xa1\x73\ +\xdf\xf7\x51\x4a\xe1\x79\x5e\x58\x51\xb9\x5c\x8e\x83\x83\x03\x1e\ +\x3f\x7e\x2c\x5d\xd7\x35\x2e\xdd\x64\xa5\x14\x9a\xa6\xa1\xeb\x3a\ +\x4a\x29\xce\x7e\xaa\x5f\xb2\x28\xcc\x9d\x07\x49\x29\xf1\x3c\xef\ +\x97\xcc\x2e\x48\xa4\x94\xda\xdf\xdd\xdd\x0d\x6b\x7d\x60\x60\x80\ +\x67\xcf\x9e\x21\xa5\x0c\xed\xbc\xb3\x54\x2a\xc5\xf0\xf0\x30\x9e\ +\xe7\xe1\xba\x2e\x5b\x5b\x5b\x28\xa5\xf6\x8b\x02\x82\x20\x58\xfe\ +\xf0\xe1\x03\xf9\x7c\x1e\xd7\x75\xc3\x28\x5d\xd7\xc5\x71\x9c\xd0\ +\x5c\xd7\xc5\x75\xdd\x30\x83\xc2\xf8\xdc\xdc\x1c\xbe\xef\x2f\x17\ +\x05\x08\x21\x32\x99\x4c\x86\xed\xed\x6d\x6c\xdb\x0e\xa5\x48\xa5\ +\x52\x0c\x0c\x0c\x60\xdb\x36\x8e\xe3\x90\x4a\xa5\x78\xfe\xfc\x39\ +\x52\x4a\x94\x52\xd8\xb6\xcd\xb7\x6f\xdf\x78\xff\xfe\x3d\x40\xa6\ +\x28\xc0\xb2\xac\x0d\x29\xe5\xc2\xd8\xd8\x18\x96\x65\x5d\xd0\x57\ +\x29\x85\x65\x59\xe1\x78\xc1\xa4\x94\x9c\x9e\x9e\x32\x3e\x3e\x8e\ +\xef\xfb\x0b\xc0\xdb\x2b\xcf\x22\xc3\x30\x5a\x80\x95\x27\x4f\x9e\ +\xe8\x23\x23\x23\x18\x86\x81\xae\xeb\x61\xcd\xfb\xbe\x1f\x6e\xb4\ +\xeb\xba\xe4\x72\x39\xc6\xc7\xc7\x99\x9f\x9f\x97\xc0\xef\xc0\xbb\ +\x2b\xcf\x22\xdf\xf7\xa3\x9a\xa6\x2d\x6c\x6d\x6d\xf5\xad\xad\xad\ +\x89\xfa\xfa\x7a\x4a\x4b\x4b\x71\x5d\x37\x94\xc8\x71\x1c\x2c\xcb\ +\x62\x73\x73\x93\xb1\xb1\x31\x3e\x7d\xfa\x24\x81\x1c\xf0\x07\x70\ +\x02\xfc\x79\xdd\x71\x1d\x07\x62\x9a\xa6\x4d\x08\x21\x3a\x3b\x3a\ +\x3a\x68\x6b\x6b\xa3\xa1\xa1\x01\x80\x9d\x9d\x1d\x96\x96\x96\x58\ +\x5c\x5c\x04\x58\x00\x5e\x02\x6f\x80\xaa\xb3\x60\x8f\x81\x17\xc0\ +\xec\x75\x17\x4e\x1c\xf8\x0d\xe8\x03\x4c\xe0\xc1\xd9\xf8\x3e\xb0\ +\x7c\xb6\xa1\xc7\xc0\x21\x40\x43\x43\xc3\x26\xa0\xed\xed\xed\x09\ +\xc0\x03\x12\x67\xeb\xae\x6d\xf1\x2b\xec\xfc\x9a\xe3\x74\x3a\xed\ +\xb5\xb6\xb6\xda\xc0\xe9\x99\x6c\xf1\x9b\xbc\x7a\xe3\xc0\x8f\xd1\ +\xd1\x51\x65\x9a\xa6\x04\x7e\x00\xd6\x4d\x42\x0a\x59\xe5\xd3\xe9\ +\xb4\x17\x8f\xc7\xbd\x9b\x06\x9c\x87\x1c\x01\x0a\xe8\x04\xe2\xda\ +\x0d\xbf\x52\xce\x47\xfc\x37\xc0\x3f\x72\x9e\x0b\x66\xc1\xc5\x97\ +\x96\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x05\xb5\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\ +\x01\x00\x9a\x9c\x18\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\ +\x8e\x7c\xfb\x51\x93\x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\ +\x25\x00\x00\x80\x83\x00\x00\xf9\xff\x00\x00\x80\xe9\x00\x00\x75\ +\x30\x00\x00\xea\x60\x00\x00\x3a\x98\x00\x00\x17\x6f\x92\x5f\xc5\ +\x46\x00\x00\x05\x2b\x49\x44\x41\x54\x78\xda\x62\xf8\xff\xff\x3f\ +\x03\x2d\x30\x40\x00\x96\xc4\x20\x05\x80\x18\x84\x81\x01\xad\x2c\ +\x78\x2e\xd5\x47\x2c\x1e\xbc\x95\xfe\xc2\xff\xff\x65\xdb\xb2\x03\ +\x09\x64\x72\xcb\xdd\x61\x66\xe8\xbd\x23\x33\x31\xe7\xc4\xa1\xaa\ +\xf0\x23\xcc\xfc\xaa\xea\x22\xa2\xd8\xfb\x39\x32\x22\xee\x39\xc6\ +\xc0\xf6\x68\xad\x41\x44\x6e\x3e\x01\x84\x62\xb0\x88\x88\x08\x83\ +\x81\x81\x01\x83\x91\x91\x11\x48\x3d\x9f\xb5\xb5\x75\x47\x67\x67\ +\xe7\xcb\x0d\x1b\x36\xfc\x3f\x70\xe0\xc0\xff\x43\x87\x0e\xfd\x5f\ +\xb3\x66\xcd\x7f\xa0\xd8\xff\x98\x98\x98\x67\xf2\xf2\xf2\x25\x20\ +\x85\xc2\xc2\xc2\x0c\x4c\x4c\x4c\x28\x06\x03\x04\x10\xdc\x60\x90\ +\xad\x42\x42\x42\x0c\x1a\x1a\x1a\x0c\x40\x0d\xd1\xdb\xb6\x6d\xfb\ +\xff\xfb\xf7\xef\xff\xd8\xc0\xfb\xf7\xef\xff\xef\xde\xbd\xfb\x7f\ +\x73\x73\xf3\xff\xc8\xc8\xc8\xff\x9c\x9c\x9c\x66\x20\x0b\x80\xbe\ +\x82\x1b\x0c\x10\x40\x60\x83\xc1\xc1\x20\x26\xc6\x00\xf4\x2a\x88\ +\x1d\x7c\xea\xd4\xa9\xff\xb8\xc0\xaf\x5f\xbf\xfe\x7f\xfb\xf6\xed\ +\xff\x9b\x37\x6f\xfe\xaf\x5c\xb9\xf2\x7f\x4d\x4d\xcd\xff\xb0\xb0\ +\xb0\xff\x40\x73\x79\x41\xae\x86\x19\x0c\x10\x40\x70\x83\x05\x05\ +\x05\x41\x96\x2a\xce\x99\x33\xe7\xff\x9f\x3f\x7f\x70\x1a\x0c\x33\ +\xf4\xd5\xab\x57\xff\x2f\x5c\xb8\xf0\xbf\xad\xad\xed\x7f\x49\x49\ +\xc9\x7f\x19\x19\x99\x4e\x58\x84\x30\x32\x32\x32\x00\x04\x10\xd8\ +\x60\x11\x60\x10\x70\x00\x6d\x89\x8d\x8b\x3b\x7a\xfb\xce\x9d\xff\ +\xf8\xc0\xe7\x2f\x5f\xfe\xbf\x78\xf1\xe2\xff\xd3\xa7\x4f\xff\x1f\ +\x3f\x7e\xfc\xff\xa4\x49\x93\xc0\x61\xee\xe3\xe3\xf3\x0d\x68\xa6\ +\x00\xcc\x60\x80\x00\x02\x1b\x2c\x0c\x72\x2d\x23\xa3\xec\xcc\x25\ +\x4b\xfe\xff\x05\x0a\xfc\xc1\x63\xf0\xc7\x9f\x3f\xff\x3f\x7b\xfe\ +\xfc\xff\xdd\xbb\x77\xff\xcf\x9a\x35\xeb\xff\xbc\x79\xf3\xfe\x4f\ +\x9f\x3e\xfd\x7f\x5e\x5e\xde\x7f\x31\x31\xb1\x6a\x98\xab\x01\x02\ +\x08\x92\xe6\x80\x40\xcd\xca\xaa\xfc\xc4\xb5\x6b\xff\x3f\x00\x23\ +\xe5\x4c\x61\xe1\xff\xf3\xd9\xd9\xff\xaf\xe6\xe6\xfe\xbf\x03\xd4\ +\x70\x0f\x88\xef\x26\x25\xfd\x3f\xe6\xef\xff\xff\xdc\x9e\x3d\xff\ +\x5f\x00\x23\x6f\xe9\xd2\xa5\xff\x67\xcc\x98\xf1\x7f\xc1\x82\x05\ +\xff\x67\xcf\x9e\xfd\xbf\xae\xae\xee\xbf\xa5\xa5\xe5\x35\x98\xb9\ +\x00\x01\x04\x37\x38\x3b\x21\xe1\xe6\x2b\x1b\x9b\xff\x1f\x95\x94\ +\xfe\xbf\x96\x93\xfb\xff\x16\x88\x5f\x88\x89\xfd\xbf\xc2\xc0\xf0\ +\x7f\x13\x10\xf7\x03\x71\x85\xac\xec\xff\xc5\xcb\x97\xff\x5f\xb6\ +\x7a\x35\xd8\xa5\x0b\x81\x86\x82\xe2\x04\xe4\xf2\xd6\xd6\xd6\xff\ +\xe1\xe1\xe1\x20\xc3\x64\x40\x91\x08\x10\x40\x10\x83\xb9\xb9\x59\ +\x4f\x02\x0d\x3a\xc3\xc4\xf4\xff\x84\xa0\xe0\xff\xeb\xca\xca\xff\ +\x8f\x00\x0d\x59\xa6\xa0\xf0\xbf\xc7\xd8\xf8\x7f\x63\x5c\xdc\xff\ +\xce\x89\x13\xff\xcf\x06\xa6\xe7\xc5\xab\x56\xfd\x5f\x01\x4c\x0d\ +\xcb\x81\x16\xcc\x9f\x3f\x1f\xec\xea\xa9\x53\xa7\xfe\xef\xea\xea\ +\xfa\x9f\x0b\xf4\x21\x2f\x2f\x6f\x06\x28\xf9\x02\x04\x10\xd8\x60\ +\x71\x06\x06\x8d\x7b\xbc\xbc\xff\x73\x81\x36\xe6\x66\x64\xfc\xcf\ +\x0c\x09\xf9\x9f\x01\x0c\x8a\xd2\xf6\xf6\xff\x5d\xc0\x70\x9f\xb7\ +\x75\xeb\xff\x95\x5b\xb6\xfc\x5f\xbf\x69\xd3\xff\xf5\x40\xc3\x57\ +\xac\x58\xf1\x7f\xf1\xe2\xc5\xe0\x20\x98\x32\x65\xca\xff\x09\x13\ +\x26\x80\x23\xb0\xb2\xb2\xf2\xbf\x8a\x8a\xca\x4a\x50\x08\x00\x04\ +\x10\xd8\x60\x59\x06\x06\xed\xf3\xdc\xdc\xff\x73\x81\x12\xb3\x81\ +\x19\x63\xf9\xce\x9d\xff\x37\x00\xc3\x7a\x1d\x90\xbd\x6e\xe3\xc6\ +\xff\x1b\x81\x06\xae\x5b\xbf\x1e\x9c\xeb\x40\x2e\x5d\x02\xb4\x0c\ +\xe4\x5a\x50\xa4\x81\x0c\xed\xee\xee\xfe\xdf\x0e\x74\x44\x6d\x6d\ +\xed\x7f\x60\x71\x70\x15\x64\x2e\x40\x00\x81\x0d\x66\x03\x66\x9a\ +\xbd\xc0\x30\x14\xe3\xe3\x9b\x27\xac\xa4\xd4\xea\xed\xeb\xfb\xb0\ +\xa7\xa7\xe7\xff\xda\xb5\x6b\xff\x83\xb2\x33\x28\x23\x2c\x5b\xb6\ +\x0c\x6c\xe0\xc2\x85\x0b\xc1\xe1\x0a\x32\x74\x22\x30\x78\x40\x86\ +\x82\xc2\xb7\xa1\xa1\x01\x6c\xb0\xaf\xaf\xef\x2f\x50\x71\x00\x10\ +\x40\x60\x83\xb9\x81\xac\x76\x06\x86\x63\xf6\x0c\x0c\x1d\xca\x90\ +\x72\x02\x04\x02\xec\xec\xec\xae\x80\x32\x00\x28\x05\x2c\x5a\xb4\ +\xe8\xff\xdc\xb9\x73\xc1\x11\x05\x0a\x53\x98\x4b\x41\xf2\xf5\xf5\ +\xf5\xff\xab\xab\xab\xff\x57\x55\x55\xfd\x0f\x08\x08\x00\x45\xa0\ +\x24\x40\x00\x81\x0d\x36\x07\xb2\x8c\x81\x06\x05\x30\x30\x6c\x86\ +\x99\xca\x0b\xc9\x89\x0c\xc2\x22\x22\x4d\xb9\xc0\xe4\x36\x79\xf2\ +\x64\xb0\x2b\x61\x86\x82\x22\x0b\xe6\x52\x98\xa1\x15\x15\x15\xff\ +\x6d\x6c\x6c\x1e\x00\xb5\x71\x02\x04\x10\x3c\xb9\x21\x03\x61\x20\ +\x36\x80\xb2\x15\x95\x95\x41\x45\xa2\x7b\x54\x54\x14\x38\x82\xfa\ +\xfb\xfb\xe1\xde\x07\xb9\x14\x54\x56\x80\x0c\x2d\x2b\x2b\xfb\x9f\ +\x04\x4c\xeb\xc0\xf2\xa6\x16\xa4\x0f\x20\x80\xc0\x06\xfb\x00\x19\ +\x7e\x0c\x0c\xbe\xbd\x40\x17\x27\x32\x30\x4c\x04\x72\x45\x34\xa0\ +\x06\x6b\x6a\x6b\x33\x08\x08\x80\x73\xaa\xaa\xb7\xb7\xf7\x27\x90\ +\xeb\x1a\x1b\x1b\xe1\x86\x82\x5c\x59\x54\x54\xf4\x3f\x28\x28\xe8\ +\x3f\x3f\x3f\x7f\x1f\x50\x1d\x3b\x48\x31\x40\x00\x81\x0d\xb6\x64\ +\x60\x70\xff\x9f\x93\xf3\x1f\xa8\xf2\xff\x7f\x5d\xdd\xff\xa7\x80\ +\x11\x09\x4c\x29\xbe\x30\x1f\x88\x03\x0b\x29\x0e\x0e\x70\xd9\xce\ +\x20\x2b\x2b\x3b\x21\x30\x30\xf0\x7f\x5a\x5a\xda\xff\xac\xac\xac\ +\xff\xa9\xa9\xa9\xff\x4d\x4d\x4d\x9f\x00\xa5\xfc\x91\x7d\x0d\x10\ +\x40\x60\x83\xe7\x30\x30\xf4\x01\xa3\xf4\x3f\x30\xba\xff\x03\x53\ +\xfc\x7f\x60\x0c\xfc\xcf\x67\x60\x78\x88\xac\x8e\x8f\x8f\x0f\x25\ +\xb4\x80\x65\x70\x34\xb0\xfc\x6e\x66\x67\x67\xcf\x06\xf2\xe5\xd1\ +\x83\x13\x20\x80\xc0\x06\xcb\x31\x30\xd8\xce\x05\xba\xf2\x88\xb0\ +\xf0\xff\x43\xc0\x5c\xd7\x28\x24\xf4\x93\x87\x81\x21\x1d\x59\x1d\ +\x28\x38\xc0\xa5\x16\x14\x80\x2a\x05\x69\x69\x69\x58\x30\x61\x00\ +\x80\x00\x02\x1b\x6c\x80\xe0\x6a\x03\xb1\x1e\x3c\x9c\xd0\x0c\x06\ +\x97\x01\x50\x00\xaa\xc6\x80\xc1\x02\xb6\x00\x1b\x00\x08\x30\x00\ +\x69\x36\x5f\x67\xcd\x5c\xcb\xcb\x00\x00\x00\x00\x49\x45\x4e\x44\ +\xae\x42\x60\x82\ +\x00\x00\x08\x58\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ +\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ +\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ +\x79\x71\xc9\x65\x3c\x00\x00\x07\xea\x49\x44\x41\x54\x78\xda\xed\ +\x57\x6b\x6c\x14\xd7\x15\x3e\xf7\xce\xec\x7a\xd7\x76\x36\x7e\xcb\ +\x4e\x00\x97\x85\x04\x27\x04\x28\xe0\xda\x78\xcd\x8a\x26\x31\x76\ +\x6c\x13\x27\x8e\xb0\x1b\xa2\x18\xc5\xb4\x34\x22\x52\x15\x4a\xca\ +\x8f\xa8\xf4\x47\x9b\x56\xaa\xd2\x87\xaa\x3a\xa1\x52\x10\xa2\x55\ +\xdd\x28\x8a\xa5\x22\x12\x22\xa7\x34\xb1\x1d\xdb\x3c\x6d\x8c\xa1\ +\xf1\x0f\xc0\x8f\xf8\x0d\xc6\x6b\xf0\xae\x3d\xbb\x3b\x3b\x8f\x7e\ +\x33\xf6\x76\x65\x66\x41\xfc\xcb\x9f\x5e\xe9\x6a\x76\x66\xee\x9c\ +\xef\x3b\xdf\x39\xe7\x9e\xbb\x4c\xd7\x75\xfa\x36\x07\xa7\x6f\x79\ +\x88\xd1\x1f\xbf\xcc\xcd\x25\x55\x51\x88\x18\x23\xa8\x92\xc8\x38\ +\x3f\xe4\x4a\x49\x79\x31\x18\x08\x9c\x51\x65\xf9\x67\x58\x78\x87\ +\x43\x2d\xae\x69\x26\x6b\x86\xdf\xc2\xe2\x6f\xba\x5b\x45\xdc\xc3\ +\x46\x12\x63\xec\x37\xc9\xc9\xc9\x2f\x48\x81\x40\x1b\xbe\x3b\x20\ +\x32\x76\xdb\xfc\x1e\xf3\x47\x73\x73\x51\x02\x4b\x87\xa6\x69\x5c\ +\x13\x84\xdf\x7d\x7f\xed\xda\x37\xf2\x67\x67\xe9\x9a\xcb\xf5\xc4\ +\xbf\xc6\xc6\xb2\x35\x59\xde\x0d\xb0\x19\x7a\x80\xa1\xe9\x7a\x02\ +\x28\x35\x14\xaf\x5b\x57\x9f\xb7\x6c\x19\x0d\x4a\xd2\x6b\xa7\x5b\ +\x5b\x5d\x6a\x24\xb2\x9b\x0b\xc2\xfc\x3d\x43\xa0\xa9\x2a\x8f\x30\ +\xf6\x7b\xef\x86\x0d\x6f\x94\x80\xa1\x0b\xaa\xe4\x87\x42\x54\x9a\ +\x99\x59\xc9\x44\xf1\x98\xaa\xeb\xae\x07\x00\xb7\xa9\x9a\xd6\x50\ +\xe8\x76\xd7\x6f\xca\xc9\xa1\xa4\xf5\xeb\x69\xa3\xdb\x4d\x9e\xed\ +\xdb\x5f\xc2\xf3\x0f\x40\xc2\x01\x95\x2d\x04\x4c\xc9\x34\x51\x7c\ +\x6f\x5b\x51\xd1\x4f\xb7\xdf\xbe\x4d\x7a\x59\x19\x89\x1f\x7d\x44\ +\xda\x81\x03\xf4\x5d\x9f\x8f\x9e\x4b\x4d\xad\x12\x6d\xb6\x26\x8d\ +\x28\xe7\x3e\xe0\x2e\x78\x7e\xd4\x93\x9b\xbb\x77\x63\x7a\x3a\xe9\ +\xd5\xd5\x64\x3b\x78\x90\xb4\x92\x12\xda\xb8\x72\x25\x6d\xdd\xb9\ +\xf3\x15\xe2\xfc\x43\x4d\x51\xb2\x2c\x04\x60\xf8\xe7\xdb\xbc\xde\ +\x7d\x15\xf0\x5c\x7c\xfa\x69\x12\xf6\xef\x27\x1a\x1b\x23\x7b\x55\ +\x15\xb1\x43\x87\x68\xed\xcc\x0c\x95\x3b\x1c\xa5\x82\x28\x1e\x85\ +\x12\x29\x77\x83\xc3\x01\x51\x67\xac\x61\x6b\x56\x56\xdd\x06\xa7\ +\x93\x58\x6d\x2d\x25\x94\x96\x12\x8d\x8f\x93\x50\x58\x48\xac\xb8\ +\x98\x36\xe5\xe5\x51\x71\x5d\x5d\x35\x13\x84\xdf\x5a\x08\x3c\x94\ +\x99\x59\xe3\x31\xa4\xe1\x78\xf4\xe6\x9b\x44\x13\x13\x44\x7e\xbf\ +\x69\xc0\x51\x51\x41\xec\xed\xb7\x69\x15\xee\x9f\x15\x84\x72\xc4\ +\xb1\x11\xde\xa6\x51\x8c\xbc\x43\x65\xec\xf0\x16\x97\x6b\xf7\x13\ +\xa2\x48\x6c\xd7\x2e\x4a\x34\xc0\x6f\xde\x24\x0a\x04\xcc\x2b\xcb\ +\xcf\x27\x4a\x4b\xa3\x75\x20\x91\x91\x97\x57\x66\x21\x10\x9a\x99\ +\x69\xef\x33\xc0\x51\x09\xfa\xb1\x63\x64\xc6\x29\x18\x5c\x30\x00\ +\x25\x9c\x30\xc8\x41\xc2\x1d\x0e\xd3\x33\x8a\x52\x29\x72\xde\xa8\ +\xc1\x24\xa6\x91\x70\x87\x0b\x45\x71\x6f\x1e\xc0\xa9\xae\x8e\x92\ +\x10\x3e\xba\x75\x6b\xe1\x5b\x49\x22\x52\x55\xd2\xbb\xba\x4c\x87\ +\x86\xe0\x90\x7f\x68\xa8\xdb\x52\x86\x5a\x28\x74\xf0\xf3\x8e\x8e\ +\x2c\xf2\x78\x76\x14\x7e\xfc\x31\x29\x00\x17\x77\xec\x20\x9a\x5f\ +\x4c\x5a\x18\x4a\x42\x68\x28\x12\x21\xf7\x3b\xef\x90\x9d\xa8\xbc\ +\x35\x21\xe1\x84\xa2\xeb\x92\x57\xd3\x4a\x57\xa3\xb4\x6c\x00\x77\ +\x81\xa8\x09\x8e\x7b\x73\x38\x1c\xa4\x5e\xbe\x4c\xbc\xb7\x97\xfa\ +\x61\xa3\xbd\xb1\xf1\x82\x2a\x49\xfb\xa3\xb8\xff\xdb\x09\x7f\xf5\ +\xe8\xa3\xa4\x45\x22\xe9\xdc\x6e\xff\x5b\x45\x41\x41\x65\x7e\x7f\ +\x3f\x29\x95\x95\x24\x96\x97\x9b\x24\x60\x70\x41\x95\xe4\x64\xf2\ +\xb7\xb6\x52\xf0\xdd\x77\x69\x14\x9e\xc9\x82\x40\x6e\x82\x0c\xfb\ +\xf6\x51\xea\xf3\xcf\x2f\xac\x85\x4d\x73\x6d\x42\x02\x29\x43\x43\ +\xc4\x2f\x5d\xa2\x61\x54\x53\x6b\x53\xd3\x05\x45\x92\x6a\xc4\x84\ +\x84\x91\x3d\x58\x67\x29\x43\xce\xb9\x8f\x42\xa1\x57\xff\xdd\xdd\ +\xdd\x7c\x65\xc5\x0a\x62\x27\x4e\x90\xfc\xe9\xa7\xa6\x31\x53\x4a\ +\x24\xa8\x11\x4f\x57\x51\x11\x39\x90\xa4\xd9\x00\x5a\x01\xa5\x6c\ +\xf5\xf5\x94\x8a\x4c\xa7\xe9\x69\x73\x4d\x54\xf6\x48\x5f\x1f\xe9\ +\x9d\x9d\x34\x8a\x50\x7c\x75\xfc\x78\x8f\x32\x3f\x5f\x2b\xda\xed\ +\x23\x06\xc1\xb8\x0a\xe0\xa3\x05\x46\x8a\x92\x63\x73\x3a\xff\x5a\ +\xf2\xf8\xe3\xa5\x4f\x21\x19\x19\x64\xb5\x7b\x3c\x04\x72\x31\xef\ +\x12\x13\xe9\x4e\x7b\x3b\xc1\x28\x65\x20\xe6\xd1\x77\x98\xa6\xe7\ +\xf2\xe8\x28\xa9\xdd\xdd\x34\x81\x9c\xea\x68\x6b\xbb\x24\x07\x02\ +\x3f\x80\xe7\xd7\xa3\xe0\x7b\x24\xe9\xde\x04\x04\x3c\xd3\x15\xc5\ +\xc5\x6d\xb6\xbf\x97\xb8\xdd\x55\x4f\x4d\x4e\x92\x0e\x0f\x9d\x20\ +\x01\xef\x62\x24\xec\x76\x43\xb6\x18\xf8\x62\xcc\xc3\x23\x23\xa4\ +\xf4\xf4\xd0\xa4\x2c\x53\xfb\xd9\xb3\xe7\x91\x4f\xb5\x00\x5f\xe2\ +\x39\x08\x2c\x4d\x42\x3d\x76\x35\xa7\xc0\xb9\x1f\xdb\x6f\x7d\xdb\ +\xe0\xe0\x3f\xec\xcb\x97\x3f\xe7\x6e\x6e\x26\x09\x06\x13\x37\x6f\ +\x36\x01\xa3\x89\x89\x11\x03\x07\xa1\xd0\xd5\xab\x24\x23\xe3\xa7\ +\x91\x33\x1d\xbd\xbd\x5d\x6a\x38\xbc\x2b\x2a\xfb\x7d\x9b\x51\x32\ +\xa4\x8a\x2e\x62\xb8\x32\xc2\x10\x84\x19\x34\xa2\x5d\x5f\x0e\x0f\ +\x7f\xa2\x64\x66\x7a\xbf\x73\xea\x14\x31\xa8\xe4\xc4\xf6\x4a\xb2\ +\x1c\x03\x66\xcc\x58\x4b\xe1\xc1\x41\x92\xce\x9d\xa3\x69\xd8\x3a\ +\xd3\xdf\x7f\x45\x09\x85\x5e\xc0\xc6\x35\xf9\x40\xdd\x50\x84\x41\ +\xdd\x00\x66\x6c\xc1\x29\x5c\x99\x71\x45\x99\x29\x91\x88\x24\xdb\ +\x6c\xa4\xa3\x04\x6f\xb7\xb4\x98\x57\x8e\x1c\x40\x7f\x30\xc0\xcd\ +\x7b\x10\xa5\x59\x78\x6f\x83\x2a\x6a\x52\x12\x45\x64\x39\xcc\x34\ +\xcd\xcf\xf1\xdc\xec\x80\xb0\x6d\x76\x51\x4c\x81\xc8\x9a\x84\x7f\ +\x4a\x4d\x5d\x42\x00\x3f\x16\xba\x1a\xe7\x7f\xf1\xae\x5a\x55\xff\ +\xe4\xd4\x14\xf9\x86\x87\x29\x62\xe4\x28\xa6\x8e\x44\x43\xef\x30\ +\x89\x72\x63\x72\x4e\x22\xb6\x60\x01\x33\xed\x91\x47\xc8\x70\xfb\ +\x74\x57\xd7\x67\x0c\x1d\x10\x34\x67\xee\x26\x50\x8b\xfb\xa5\x65\ +\x68\x6d\xcb\x36\x6c\x32\x0d\x85\x6b\xd6\xd4\xaf\x43\x5b\xf6\x03\ +\x5c\x37\x0c\x44\xdf\x63\x47\x94\x51\x01\x11\x94\x9d\x06\x05\x18\ +\x08\x80\x85\x79\xf5\xa3\x79\x2d\xc3\x7e\x51\x54\x5c\x5c\x89\xfb\ +\x63\xda\x7d\xba\x28\xbf\x07\xb8\x0b\x9e\x1f\x2d\xde\xb4\x69\xef\ +\x66\xd4\xb0\xff\xda\xb5\x25\xe0\x2c\x36\xcd\xd8\x33\x4c\x28\x16\ +\x7b\x07\x12\x81\x1b\x37\x68\x25\x54\x2d\x2a\x2b\xab\x12\xec\x76\ +\xb3\x8b\x3e\x10\x01\x5d\xd3\x44\x8d\xf3\x06\x6f\x51\x51\x5d\x21\ +\xf6\x6e\xe9\xeb\xaf\x01\x1e\x1b\x51\x10\x15\x33\x05\x33\x1d\x53\ +\xb3\xda\x35\x49\xcc\xa1\x87\xb8\xd1\x96\x3d\xd5\xd5\xa5\x28\xe9\ +\xa3\x1a\x3e\xb9\x2f\x01\x80\x3b\x20\xfb\x61\x8f\xd7\xbb\x3b\x1f\ +\xed\x57\xba\x78\x31\xea\x79\x6c\x44\xc1\x11\xff\x08\x6a\x7e\x1e\ +\xa5\x97\x0e\x05\x20\xf3\x92\x75\xa6\x22\x58\x33\x8f\xd0\xe5\x42\ +\x89\x82\x9a\x9a\x72\x24\x6d\x23\xec\xa5\xc5\x25\x80\x04\x4c\xc6\ +\x51\xec\xfd\x2d\xa5\xa5\x7b\xb7\x20\xe6\x41\x94\x93\x1a\x2f\x3c\ +\x06\x38\x80\x65\xc4\xf8\x0c\xe7\xff\x39\x4d\x74\x61\x16\xde\xa6\ +\xe3\x59\x3c\x25\x08\xe4\xa4\x81\x01\x5a\x9d\x9d\x4d\xf9\x75\x75\ +\x95\xe8\x35\x06\x89\x6c\x0b\x01\x48\xf6\xeb\xe2\xb2\xb2\x3d\x5e\ +\x80\x2b\xed\xed\xa6\x31\x16\x07\xfc\x61\x00\xcf\xc1\xa3\x8e\x48\ +\xa4\x2b\xac\xeb\x15\x78\xb6\xfd\x6c\x30\x78\xf2\x16\x14\x48\x45\ +\x69\xaa\x66\x17\xb4\x2a\x11\xbe\x7e\x9d\xd6\xe0\x88\xf7\xbd\xd7\ +\x5f\x2f\xe7\x4e\xe7\x1f\x2d\x04\x92\xb2\xb2\x76\xac\x77\x21\x59\ +\xbf\xf8\x22\xae\xe7\xba\x01\x8e\xf7\x81\xcc\x4c\xea\xf4\xfb\x2f\ +\xc8\xaa\xba\x53\x24\x1a\x83\x01\x3f\xd4\x7b\xad\xcb\xe7\xfb\xec\ +\x96\xaa\x52\x2a\xd6\x20\x94\x96\xbc\xd1\xa1\x84\x8a\xe6\xb4\x0a\ +\x07\x92\x94\xd5\xab\xb7\x59\x08\x04\xa7\xa6\xbe\xbc\x66\xb4\x48\ +\xaf\x37\xae\xe7\x0f\x21\x99\x02\x38\xe1\x76\xfa\x7c\x3d\xb2\xa2\ +\xd4\x8a\x8c\x8d\xc4\x9c\x64\x3e\x54\xce\xab\x17\xc7\xc6\x9a\x7d\ +\x8a\x42\x0f\xe3\xe4\xa3\xdf\xad\x04\x9e\x0b\x8f\x3d\x46\x23\xd8\ +\x2d\x67\x87\x86\xba\x2c\x04\xb8\xaa\xfe\xa2\xb3\xb9\xf9\x78\x0f\ +\x36\x11\x7b\x41\x41\xec\x85\x01\x8e\xf8\xf9\x96\x2f\xa7\xb6\xf1\ +\xf1\x4b\xe1\x70\xf8\x65\x1b\xe7\xc3\x96\x6c\xe6\xfc\x8e\xaa\x28\ +\x3f\x3c\x7f\xf5\xea\xa9\x1b\x92\x44\x2e\x10\x26\x90\x40\x72\x99\ +\x87\x98\x04\x9c\x8c\xbf\x41\x78\xcf\x1f\x39\x72\x46\x99\x9b\x7b\ +\xcb\x42\x00\xb5\x3c\xc5\x64\xf9\x95\xce\x93\x27\x3f\xbc\x0c\x12\ +\x4e\x34\x1d\xe3\x65\x32\xbc\xbe\x81\x8f\xbf\x1a\x18\x38\x1f\x0e\ +\x06\x5f\x14\x39\xbf\x1e\x83\xb5\x90\x98\x04\x89\x9a\xee\x2b\x57\ +\x3e\x19\x87\x9a\x06\x71\x06\x12\x49\x38\x11\x8f\xa0\xa4\xcf\x1d\ +\x39\xd2\xa2\xfa\xfd\x2f\x09\x44\x03\x71\xcb\x50\xb0\xd9\x42\xa2\ +\xae\xff\xf8\x5c\x4b\xcb\x3f\xfb\x32\x32\xc8\xb1\x75\x2b\x4d\x20\ +\x71\xda\xfb\xfa\xba\x14\xa3\xab\x09\xc2\x88\x25\x37\x18\x33\xe3\ +\x1d\x9d\x9c\x31\x3f\xc2\x51\xdf\xdb\xdd\xfd\xf9\x04\x40\x9d\x90\ +\x7d\x1c\xbb\xe5\xc5\xa6\xa6\xd3\x68\x60\x75\x00\xbf\x49\xf1\x7a\ +\xc1\xfb\x88\x5b\xb4\x69\x20\x5e\xa9\x30\xf4\x87\x8c\x9c\x9c\x67\ +\x66\xa7\xa7\x7b\x71\x8c\xfa\x09\x17\x84\x51\x8a\x33\x9c\x0b\x5d\ +\x31\xd6\x41\x17\xaf\xb0\x92\xc1\x45\xf1\xcf\x29\x39\x39\xc5\xfe\ +\xa9\xa9\x6e\x38\xf0\x16\xbc\xfd\x26\xfa\x5d\xcd\x22\xee\xff\xff\ +\x1d\xff\x17\xef\xd2\xfe\x9f\xb7\x3d\x84\x48\x00\x00\x00\x00\x49\ +\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x0c\x27\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ +\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ +\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ +\x79\x71\xc9\x65\x3c\x00\x00\x0b\xb9\x49\x44\x41\x54\x78\xda\xed\ +\x9a\x69\x6c\x55\x75\x1a\xc6\xdf\xee\xfb\x42\xb9\x2d\x16\x68\xb1\ +\x55\xa9\xa5\x55\x06\x64\x71\xc0\x01\x15\x41\x59\x15\x70\x45\x27\ +\x63\x70\xe2\x18\xcd\x64\xf8\x30\x93\x99\x2f\x66\x26\x99\x0f\x33\ +\xc9\x4c\x32\x93\xcc\x17\x27\x31\x66\x12\x0c\x6a\x94\x2d\x58\xf6\ +\x22\x4b\x51\xd9\x97\x0e\xa5\x28\xfb\xda\xd2\x52\x0a\x5d\x6e\xdb\ +\xbb\x74\x7e\xcf\x7f\xee\xb9\xb9\x69\x30\xd3\x6b\xd0\xc4\x0c\x37\ +\x79\x73\xee\x39\xf7\x9c\xff\xff\x79\xde\xf7\x79\x97\x53\x48\xe8\ +\xef\xef\xb7\x1f\xf2\x27\x11\xbb\x43\xe0\x0e\x81\xff\x67\x02\xc9\ +\xb7\xba\x38\x67\xce\x9c\x41\x2f\x40\x11\xf0\x6c\x08\x36\x2e\x1c\ +\x0e\x57\x61\x95\x7c\x2f\x0f\x87\x43\x39\xe1\x70\xbf\x0a\x85\x1f\ +\x3b\x8b\x1d\x8f\xd8\x01\xee\x69\xc2\x2c\x14\x0a\xe9\x59\x77\xf4\ +\xce\xbd\xef\x03\x0b\xcc\xe9\xd3\xa7\x07\x41\x20\xfe\xcf\x78\x68\ +\x3c\x17\x0a\x05\x97\x04\x02\x81\xd2\x84\x84\x44\x36\x4e\xb0\x84\ +\x84\x04\x4b\x4e\x4e\x37\x7d\xfa\xfa\x7a\x8d\xdf\x1d\xb0\x60\xb0\ +\xcf\x12\x13\x13\x5b\xb9\x6f\x15\x3f\x7d\xc4\x7d\x3b\x00\x1a\xba\ +\x0d\x11\x88\xfb\x33\x81\x8d\xdf\x06\xdc\x93\xa1\x50\x38\x2d\x3b\ +\x3b\xdf\xaa\xab\xab\xec\xee\xbb\xcb\xb0\x51\x36\x74\x68\x81\xa5\ +\xa4\xa4\x38\x4f\xf6\xf6\xf6\xd9\xb5\x6b\xd7\xec\xec\xd9\x73\x78\ +\xf1\x94\x9d\x3c\xd9\xe0\x6b\x6e\xbe\xf4\x7a\x28\x14\x78\x3d\x39\ +\x39\xa5\x8e\xb5\xfe\x84\xad\xff\xbe\x08\xc8\xad\xbf\x0b\x06\x03\ +\xbf\x0a\x85\xfa\xf3\x4b\x4a\x2a\x6c\xca\x94\xa9\x36\x69\xd2\x44\ +\x80\x97\x58\x76\x76\x06\x1e\x4e\x20\x0a\x61\xbc\x2d\x39\x84\x3d\ +\x23\x12\x41\xeb\xec\xf4\xdb\x85\x0b\x97\xed\xf0\xe1\x43\xf6\xc5\ +\x17\x75\xd6\xd8\x78\xf8\x91\xde\x5e\xff\x5a\x88\xfc\x8b\x75\xdf\ +\xc6\x9a\xe2\x01\x23\x7d\xc6\x93\x03\x23\xb9\xff\x9d\x40\xa0\x6f\ +\x6e\x6e\xae\xcf\x66\xcc\x98\x6b\x0b\x16\xcc\xb1\x92\x12\x9f\xe9\ +\x83\xde\x23\xa0\x43\x3a\x0e\xf8\x1e\x56\x34\x94\x35\x10\x94\xcc\ +\x12\xad\xb5\xb5\xdd\x3e\xfb\x6c\xbb\xd5\xd4\xac\x84\xd4\x49\x4b\ +\x4a\x4a\xae\xe7\x86\x9f\x05\x83\xc1\x43\x83\xc8\x81\xb8\x09\xdc\ +\xc3\xbd\xab\x91\xcc\x03\x15\x15\xe3\x6d\xe9\xd2\xa5\x36\x61\xc2\ +\x18\xef\xb7\x48\x02\x3a\xaf\x7f\x23\x89\x40\xc0\xfb\x2e\x70\x61\ +\x01\x96\x01\xec\xbc\x7d\xf4\xd1\x0a\xab\xab\xdb\x28\x82\x4d\xc0\ +\xfa\x29\xeb\x6d\xbd\x9d\x49\x5c\xcc\x86\x6b\xd8\xb8\x7a\xf2\xe4\ +\x19\xf6\xe6\x9b\xbf\xb0\x91\x23\x7d\xb1\xbf\x0b\xe0\xff\x20\xe0\ +\x11\xf4\xaa\x8c\x29\xa1\xf9\xde\x63\x23\x46\x0c\xb3\xd7\x5e\x7b\ +\xdd\x72\x73\xf3\x6c\xe3\xc6\x95\x77\x05\x02\x3d\x1f\x90\xe4\x4f\ +\xb1\xec\x81\xdb\xd1\x07\xb2\xf0\xc4\x7b\x7d\x7d\x81\xea\x89\x13\ +\xa7\xd9\xb2\x65\xbf\x8c\x82\xe7\x1a\xe1\xaf\xb5\x86\x86\xaf\x5d\ +\xc2\x12\xfa\x6f\x00\xef\x59\xd0\x9d\x03\xce\x9a\x9b\x5b\x6c\xd7\ +\xae\x2f\xec\xea\xd5\x56\xbb\x79\xb3\xcb\xd2\xd2\x92\xed\xc5\x17\ +\x97\xd8\xac\x59\x8b\x24\x45\x1f\xf7\x7d\x48\x14\x4a\x30\xf3\xec\ +\xdb\x12\xf8\x0d\x9a\x7f\x4a\xb2\x79\xeb\xad\x37\xac\xa8\x28\xd7\ +\x5d\xf4\xfb\x7b\xec\xdd\x77\x57\x38\x60\xb5\xb5\x75\xb6\x7b\xf7\ +\x7e\x91\x18\x00\x58\x16\x8e\x78\x5f\xe4\x1c\x78\x97\xc4\x87\x0e\ +\x1d\xb1\xd1\xa3\x4b\x6d\xef\xde\x7d\x76\xe5\x4a\x33\x24\xba\xdd\ +\xb3\x4f\x3f\xbd\xd0\xa6\x4d\x9b\x63\x94\xe4\x7b\x89\xfa\x5f\x06\ +\x10\x88\x5b\x42\xe3\x58\x68\x59\x6e\xee\x50\x69\x9e\x50\xfb\xa2\ +\xe0\x57\xac\x58\x6b\xe5\xe5\xa3\x48\xe4\x29\xd6\xd4\xd4\x6a\x9f\ +\x7c\xe2\xaa\xa0\x55\x55\x55\x58\x4f\x4f\xdf\xc0\x08\xe8\xe8\x92\ +\xf7\xe2\xc5\x26\xc0\x1f\xb5\x85\x0b\x67\xda\x7d\xf7\xdd\x6d\xc3\ +\x86\xf9\xec\xd3\x4f\xb7\xb3\xd6\x3d\x96\x9f\x9f\x67\x59\x59\x99\ +\x36\x7f\xfe\x22\x3b\x75\xea\x38\xd6\xf0\x3c\xd5\x69\x2d\x0a\xf8\ +\xe0\x5b\x49\x88\x07\xff\x88\xe5\x51\x6d\x48\xd8\xca\x28\xf8\xe5\ +\xcb\x57\x21\xa3\x62\x7b\xfc\xf1\x1f\xe3\xbd\x26\x36\x4d\xb3\x57\ +\x5e\x59\x68\x9f\x7f\xbe\x8f\xf2\xd8\x40\x03\x4b\x1e\x08\xde\x79\ +\xfe\xd2\xa5\x26\x3b\x70\xe0\x20\x52\x99\x6b\xa5\xa5\xc5\x9c\x5f\ +\xb6\xfb\xef\x2f\xa7\x92\xcd\xa0\x9c\x36\xd2\x2b\xda\xad\xbd\xbd\ +\xc3\x7c\x3e\x9f\xcd\x9e\xbd\xd8\x32\x32\xb2\x12\x90\xdd\x1f\xc0\ +\x90\x89\x0d\x9a\x80\x80\xcb\xc6\xaa\x49\x95\x96\xde\x67\xcf\x3c\ +\x33\x2f\xfa\xdb\xce\x9d\x7b\x1d\xf8\x99\x33\xa7\xa2\xe3\xab\xce\ +\xab\x5d\x5d\xdd\x54\x13\x23\x11\x5f\xb0\xfa\xfa\xe3\x80\xac\xe7\ +\x3c\x29\x1a\x05\x33\x07\x1e\x72\xf5\xf6\xd2\x4b\x0b\xac\xb0\xb0\ +\xc0\xae\x5f\x6f\x17\x51\xe5\x00\x24\xca\xb8\x3e\x4f\x4d\x8e\x3e\ +\xd1\x85\x9c\x3a\x6c\xec\xd8\x71\x34\xc6\x09\x06\x86\xd1\xc8\x67\ +\x0e\x16\x2f\x81\xf0\x12\x1e\x4a\x1e\x3f\x7e\x32\xd2\x19\x1a\xfd\ +\x6d\xd4\xa8\x11\xc8\xe0\x0a\xb2\x69\xb1\x9c\x9c\x6c\x5d\x72\x60\ +\xbb\xbb\xfd\x00\x4a\xb4\xe7\x9e\x9b\x0d\x90\xb3\x24\xf6\x57\xf2\ +\xba\xb3\xcb\x97\x9b\xed\xe8\xd1\x63\xb6\x68\xd1\x4c\x2b\x2e\xf6\ +\x01\xf0\xa6\x9e\x71\xe3\x46\x66\x66\x06\x51\xed\x85\xf4\x31\xd6\ +\xcb\x73\xf9\x72\xe3\x46\x87\x2b\xaf\x0f\x3e\x38\xd1\x52\x53\xd3\ +\x95\x3f\x6f\x80\x25\x29\x1e\x02\x79\x84\x6e\x49\x5e\x9e\x8f\xea\ +\x90\x8f\x4c\xda\x74\x99\xc4\x0a\x92\x78\xe5\x2c\x3c\xc6\xd6\xac\ +\xa9\x65\x61\xa3\xf3\x3a\x12\xf2\xa6\x22\x81\x9c\xd2\xed\xe5\x97\ +\x17\xd8\x89\x13\x27\x19\x19\xce\x38\xa2\x47\x8e\xd4\x8b\x18\x0d\ +\xaf\x18\x89\xdc\xd0\xbd\x02\xcf\xda\xa9\x3c\x9f\x63\x6b\xd7\xd6\ +\xda\xb9\x73\xcd\x44\xa6\x48\x95\x8a\xd1\x23\x80\x9c\xda\x34\x4b\ +\x21\xb5\x7b\x94\xd0\x8f\x69\x48\x8c\x87\xc0\x43\x2c\x34\xb2\xb4\ +\x74\x34\x67\x29\x94\xbb\x83\x9a\x67\x54\xde\x00\xe9\x27\xbc\x63\ +\x6c\xdc\xb8\x2a\x7b\xff\xfd\x35\x5c\x33\x3c\x17\x25\x11\x8d\xc4\ +\xab\xaf\x2e\xa6\xda\x5c\xc2\xb3\x87\xed\x85\x17\xe6\x92\xac\x05\ +\x78\xd6\x79\xde\xf4\x49\x4f\x4f\xe3\xb9\x5c\xd6\x58\x0b\xc9\x76\ +\x22\x3b\x4a\x40\x23\xbd\x22\x48\x4e\x34\x10\x19\x3f\x72\x2d\x17\ +\xd9\x44\x08\x4c\x89\x83\x40\xb8\x3a\x31\x31\xc9\x86\x0c\x29\x34\ +\x24\x2e\xc9\x50\x26\x0f\x45\xbb\xad\x3c\x5d\x51\x51\x0e\x89\x07\ +\xec\xe3\x8f\x37\x00\xba\x17\x4f\x66\x79\x72\xa2\x0a\xf5\x12\xfa\ +\x24\x24\x33\x8b\x68\xcc\xb7\xbb\xee\x1a\x2a\x6d\x7b\xb2\x01\x7c\ +\x3a\x25\x37\x8d\xca\xb5\x89\x5c\xe8\x46\x56\xc5\xf2\x3a\xc0\x5d\ +\x83\x23\xb7\x2e\x42\xea\x34\x7b\x05\xa8\x4c\x3e\x1c\xa2\xa1\x30\ +\x54\x3d\x68\x02\x80\xac\x44\x83\xc8\x21\x57\xfa\x13\x25\xea\xf5\ +\x51\xe9\x54\x00\xf4\x3b\xa0\x7b\x28\x83\x9a\x3c\x4b\x25\x01\xbc\ +\x17\x76\x7a\xd6\x47\x89\xad\x6a\x25\x39\x15\x14\xe4\x5a\x47\x47\ +\xa7\xbb\xc6\x47\xb2\xa1\xba\x64\xda\xba\x75\xdb\x88\x50\x0b\xe4\ +\x8a\x35\xe4\x45\xde\x0b\x12\x90\x4e\x93\x9d\x3f\x7f\x1c\x32\x22\ +\xd4\xa7\x4a\x04\xd9\x54\xed\x59\x16\x4f\x04\xca\xfe\xab\xd1\x0c\ +\x11\x70\x9e\xe7\x94\x59\x65\xbf\xed\xdb\x77\x94\x3b\x34\x6d\x3a\ +\x39\x29\x27\xd0\x69\x09\x7d\xe1\x53\x36\xec\x57\x1d\xd7\xef\xf2\ +\xb6\x24\x21\xe9\x79\x9e\x67\xbd\x34\x07\xfe\xc3\x0f\x6b\x48\xec\ +\x36\x8a\xc3\x70\xdd\x13\x05\xdf\xd2\x72\xc9\xce\x9c\xa9\x97\x84\ +\x34\x5d\x89\x84\x88\xf3\x5c\xa6\xee\x29\x1c\x34\x01\x00\xe7\x78\ +\x15\x44\xe0\x79\xdf\xf0\xae\x33\x02\x1f\x20\x27\xf6\x20\x89\x6e\ +\xcf\xd3\x10\x18\x8e\x86\x4b\x24\x09\xbc\xed\x07\x64\x9a\x00\x0b\ +\xb8\x4c\xf7\x29\x3f\xdc\x7a\x2b\x57\x6e\xc6\xcb\x9d\x74\xf4\x22\ +\x15\x05\xe5\x95\x00\x23\xd3\x53\x54\xaf\x7a\xae\xf5\x6a\x2b\x01\ +\x96\x6c\x3c\x59\xca\xa9\x19\x83\xee\xc4\xfd\xb8\x23\xa6\x9c\xea\ +\xe8\x45\x41\x46\x55\x69\x50\x5d\x57\x35\xa2\x72\x38\xc7\x00\x3a\ +\x5d\xb3\x3e\x00\xd4\x71\xe5\xf1\x20\xe6\x96\xf1\x40\x08\x2c\x89\ +\xdc\x29\x32\x00\xd4\x9a\xc6\xf9\x75\xc0\x9f\xb4\xb6\xb6\x26\x6f\ +\x40\x96\xc3\xb4\xaf\xf7\x5a\xe9\xed\x9f\x30\x68\x02\x6c\xe4\x27\ +\xb4\x92\x0f\x60\x52\xe5\x89\x98\xc5\x0c\x00\x49\x84\xbb\xd5\xb6\ +\x6d\xdb\x89\xf7\x47\xa0\x73\x1f\x0d\xa9\xcd\x9e\x7d\x76\x16\x9a\ +\x2e\x50\x92\x0b\xb0\xee\x8f\x8d\xaa\xf4\xaf\xa4\x46\x6e\x35\x94\ +\xe6\xcb\x10\xbe\xc6\x73\x17\x20\xdd\x27\xb2\x1e\x50\x6f\xaf\x68\ +\x24\xf4\x3b\xa7\xbd\x71\x8c\x12\xfd\xe7\xd0\x1f\xd5\xa4\x5b\x1e\ +\x89\x89\x84\x16\xf7\x66\xf9\x44\x47\xec\xf8\xf1\xaf\xd1\xed\x79\ +\xc6\x81\xc7\xd4\xa4\x54\x81\x3c\xcd\x93\x7c\xc9\x58\x8a\x24\x24\ +\xd3\xf4\x0a\x89\x14\x48\xcc\xe3\x95\x33\x87\x3c\xb8\xa0\x4e\xab\ +\xa8\x0e\x00\xaf\x63\x3f\xd7\x93\x24\x2f\x0a\x46\x97\x40\xb5\xc6\ +\xd3\x07\x1a\x61\x8d\x9e\xdb\xbd\x6e\xea\x85\x35\x72\x74\xba\x55\ +\x65\xa0\x39\x8d\x62\xb6\x99\x67\xc3\x87\x17\x0a\xbc\x80\x0a\xbc\ +\x80\x2b\x31\x25\x15\x40\x2b\x27\xa2\x89\x4d\x19\x4d\x75\xbd\xe1\ +\x91\x47\x1e\x25\x9a\x19\xba\x26\x67\xc4\x38\x29\x24\xc7\x49\x8a\ +\x80\xef\x24\xcf\xba\x85\xea\x7c\x1c\x49\xdc\x7f\x0c\xcf\xa0\xcb\ +\x66\x6d\xec\x25\x33\xe6\xbd\xe3\x3a\xf0\x34\xa7\xe1\xb6\x64\xc9\ +\x3c\x9a\x4d\x11\xe0\x7b\x62\xc1\x3b\x9d\x6f\xd8\x50\xc7\x9b\xd6\ +\x46\x2a\x51\xd0\x23\x11\x89\x44\x1f\x4d\x2c\x83\xf9\x67\xbe\x4d\ +\x9e\xfc\x13\xee\xcf\x54\xc5\xf1\x0a\x86\xf6\xe1\x5a\x3a\x84\x53\ +\xc0\x70\x55\x51\x92\x84\x1a\xe2\x89\xc0\x7e\x36\x6b\x3f\x77\xee\ +\x2b\xc9\x88\x4d\x93\xb5\x80\xb7\x81\x12\x95\x12\x38\x12\xf0\xf3\ +\xd5\x61\xe5\x79\x81\x8b\x01\x9f\xc2\xa8\xb1\x9d\xc1\x6f\x27\xbd\ +\x63\x0f\x65\x73\x03\x20\x42\x78\x3e\x96\x84\x22\x91\xcc\x14\x3b\ +\xdf\xa6\x4f\x7f\x82\xe7\xb2\x54\x81\x3c\xfd\x73\x9e\x21\x47\x52\ +\x2c\xce\x46\xca\xaa\xed\x89\x87\x40\x33\x5e\x5f\xd9\xd2\x72\x85\ +\x24\xbb\xe8\x00\x71\x2e\xcf\x3b\x59\x94\x95\x95\xdb\xe2\xc5\x4f\ +\x0a\xbc\x80\x78\xa5\x92\xee\x9b\xe2\x36\x5d\xbf\x7e\x27\x3d\x63\ +\x17\x9e\xef\x60\xf3\x6e\x48\x7c\xa9\x12\x4b\xd2\xf6\x28\x91\x75\ +\xaf\x37\xad\xd2\xfc\xd2\xb4\x16\x6f\x62\x73\x89\x4a\x81\x22\xc1\ +\x5e\x29\xac\x95\x49\x97\x6e\xa1\xb4\x36\x8a\xb4\x5e\xf2\x0f\xc6\ +\xd1\x89\x9d\xce\x97\xe3\x91\xfe\x33\x67\x1a\x05\x5e\xad\x5f\xde\ +\xd1\x11\x8f\x4d\x96\xe6\xe5\x99\xa8\x6c\x24\x19\x91\xdb\xb2\x65\ +\x0f\x6f\x68\x9f\xa1\xdd\x76\x6f\x0b\x48\x76\x40\x68\x07\x1d\x7b\ +\x1b\x7a\x0e\x8a\xa8\x17\x09\x91\x00\x78\x26\xf3\xff\xa3\xac\x59\ +\xce\xb9\x22\x95\xc3\x7a\xa9\x14\x87\x13\x54\xb4\x4e\xdd\xfb\x4f\ +\x16\xea\x89\xa7\x91\xc9\xea\x48\xa2\xbd\xa7\x4e\x1d\x63\x2e\x39\ +\xcf\xa6\x19\xd2\x25\x72\xe9\xb0\xad\x5b\x77\x33\x06\x5c\x15\x68\ +\x40\x38\xf0\x0e\x50\x4d\xcd\x6e\x4a\xeb\x36\xc0\x5f\xe7\x3c\xda\ +\x47\x94\x90\x44\xe3\x26\x92\xaa\x55\x24\x58\x23\xe0\x3d\xa3\x23\ +\xbd\xa0\x1b\xc9\x6d\xc1\xdb\xff\x56\xd7\xa5\xa7\x0c\x21\x5a\x37\ +\x18\xe8\x8e\x08\x4e\x33\xeb\x7c\x8c\x59\xbc\x04\x42\x6c\xfc\x7b\ +\xbf\xbf\xab\x6f\xff\xfe\x1d\xaa\xc5\x2c\x9e\xa5\x47\xf0\xcc\x57\ +\x6c\xb8\x95\x06\xd4\x62\x90\x74\x1d\x75\xd3\xa6\x2f\x01\xb8\xdd\ +\xd5\x76\xb3\x68\x4d\xf7\x1a\xa1\xc0\xe2\xcd\xeb\xdc\xb3\xd5\x56\ +\xad\xaa\x55\xd3\x93\x8c\x04\x9e\xee\xbc\x91\xa8\xad\x23\x3a\x9d\ +\x44\xa3\x50\x4e\x61\x64\xd9\xc5\xe8\xad\xb5\xec\xaf\x3c\xdf\x16\ +\x0f\x81\xd8\x3f\xb0\x6e\x62\xa8\x5b\xae\x36\xdf\xd0\x70\x40\xb9\ +\x80\x77\x72\x05\x46\xef\xab\xb6\x7a\xf5\x16\xa2\x23\x50\x87\x90\ +\xce\x56\xca\x6e\xab\x7e\x8b\x05\xcf\x3a\x72\x86\xac\x5f\x92\x11\ +\x41\x22\x58\xe3\x2a\x54\x6b\x6b\x87\x1c\xc1\xf9\x3a\xae\x5f\xb7\ +\xbc\xbc\xe1\xc8\x27\x9b\x48\x9c\xa0\xbf\x1c\x16\x94\x3a\xec\xef\ +\x71\xff\x65\xae\xaa\x2a\xfa\xee\x20\x40\xc3\x20\xb3\x8d\xfb\xc6\ +\x4c\x9d\x3a\x9b\x09\xf4\x41\x24\x72\x53\x40\x94\xd4\xe8\xb6\x0c\ +\x4f\xb5\x6a\x14\xb8\x45\x37\xbd\xd5\xd1\x75\x56\xc0\x16\x32\x3f\ +\x8d\xe6\xc5\xe7\x20\x91\xe9\x10\x78\x06\xc1\x7c\xa2\x7a\xda\x36\ +\x6f\x5e\x85\xcc\xfc\x1d\x6c\x3f\x0d\x3b\x1c\x53\x5c\x06\x47\xa0\ +\xb2\xb2\x72\xe0\xa5\xb1\x54\x87\xcd\x24\x70\xd1\xc3\x0f\xcf\xb4\ +\xf2\xf2\x4a\x12\xd3\x0f\x89\x76\x91\x51\x69\xd5\x52\x58\x2c\x78\ +\x67\x03\xc8\x78\xe6\xfe\x4a\xad\xef\xaa\x36\xbc\x4b\x14\xca\xf3\ +\xae\x64\xee\xd8\xb1\x1e\x59\xb5\x05\x58\xec\x79\x6c\x0d\x66\xb7\ +\x83\x80\x36\x9b\x81\xe7\x56\xe0\xe5\xa2\x49\x93\x1e\x67\x8c\x1e\ +\xab\xde\x20\x02\x68\xf7\x06\x5e\xed\x11\xb0\x58\xf9\xdc\xf2\x28\ +\x69\x9a\xb9\x31\x01\xd0\xb9\x48\x32\x5f\xd2\x52\xc5\x01\xfc\x06\ +\xf5\x1d\xcd\x3c\xcb\xb0\x77\x30\xbb\x9d\x04\xb4\xf9\x44\x4a\xe7\ +\x72\x8e\x15\xa5\xa5\xf7\xda\x43\x0f\x4d\xe7\xad\xcd\xa7\x06\xc4\ +\xc6\x5d\x54\x9a\x6e\xac\x33\xd2\x55\x43\xb1\xe0\x23\x9b\xab\xea\ +\xa4\xab\xf3\xca\xf3\xca\x29\x8d\x2b\xf4\x89\x3a\x69\x5e\xf7\xaa\ +\xf6\x2e\xc5\x56\x63\xf6\x5d\x10\x90\x95\x62\x7f\xa6\xbd\xbf\xc4\ +\x1b\x1b\x39\x51\x2d\x2d\xeb\xf5\x53\x39\x20\x32\xb2\x58\x12\x98\ +\xa9\x97\xa8\xa3\x6b\x3c\x10\x10\x35\x29\x79\x5d\xa5\x92\xef\xae\ +\xda\x6c\xc7\x7e\xed\xfd\x3d\xf4\xbb\x24\xe0\x35\xba\x57\x18\xc2\ +\x7e\x0b\xd0\x6a\xde\xdc\x18\x2d\xca\x98\x89\xca\x78\x87\x1d\x8a\ +\x2c\xb2\x25\x0b\x6f\xd3\xc8\x33\x41\x25\x2b\xc9\xde\x42\xa2\x9e\ +\x35\x35\x48\x35\x29\x3e\x17\xb0\x7f\x60\x7f\xc3\x82\x98\x7d\x5f\ +\x04\x74\xcc\xe2\xfa\x5c\x8e\x3f\x27\x3f\xa6\x13\x81\x54\x3c\xac\ +\x77\x58\xf4\x9d\x19\x7d\x27\x80\xa8\x46\xe2\x88\xcc\x7a\xd4\x6d\ +\x43\x1a\x0f\x58\xf6\x3d\xec\x13\xee\x69\xf1\xf6\xf9\xbe\x09\xe8\ +\xba\x67\x3f\xc2\x1e\xe6\x5a\x15\xc7\x32\x8e\x45\x7a\x0d\x8c\xfc\ +\x23\x5f\x1f\x4b\x5c\xd5\x7b\x06\x8f\x35\x6a\x30\x8b\xfc\x43\x5f\ +\xaf\x07\xec\xdb\x12\xb8\xf3\x5f\x0d\xee\x10\xb8\x43\xe0\x07\xfe\ +\xf9\x0f\x4e\x33\x44\x96\xd0\x41\x78\x46\x00\x00\x00\x00\x49\x45\ +\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x0a\xfb\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ +\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ +\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ +\x79\x71\xc9\x65\x3c\x00\x00\x0a\x8d\x49\x44\x41\x54\x78\xda\xed\ +\x9a\x5d\x88\x5d\x57\x15\xc7\x7f\x6b\xef\x73\xee\xbd\x93\x3b\x33\ +\x99\xc9\x57\x9b\x8f\x36\x4d\x93\xd2\x54\x6d\x5a\x8a\x6d\xb5\x05\ +\x5b\x29\x05\x5f\x0c\x54\x2a\x88\x2f\x16\x41\x6c\xc5\x22\x14\xd1\ +\x17\x1f\x7d\xb1\x42\xc5\x52\xf0\x31\x42\x5f\xaa\xd0\xaa\xd5\x46\ +\xb0\x54\x90\x52\xa5\x82\x6d\xac\xd4\xa4\x24\x4d\xd3\x4c\xcd\xe4\ +\xab\x99\x4e\x3a\xf7\xfb\x9c\xbd\xbc\x73\xcf\x3e\xb3\xe6\xce\x4c\ +\x26\x93\x20\x82\xe0\x86\x35\x7b\xdf\x7d\xf6\x39\x67\xfd\xd7\xfa\ +\xff\xd7\xde\x07\x26\x51\x55\xfe\x97\x5b\x02\xfc\xef\x03\x10\x79\ +\x8a\xb5\xb5\xfc\xa1\xc4\xcb\x63\xd5\x6a\xba\x03\xc8\x89\x2d\x68\ +\x61\x00\x22\x50\x49\x33\xfe\x33\x99\x4d\xc9\x73\x59\xfc\x2c\xdf\ +\x69\x77\x8f\x06\xe5\x19\xf0\x2f\xab\x3e\x71\x25\x19\xc8\x1f\xdf\ +\x7d\xcb\xe6\xa7\x1f\xf8\xfa\xbd\x8c\x6c\xdb\x04\x79\x00\x20\x00\ +\x93\x23\x30\x5e\x53\xb2\xe0\x09\xb3\x67\xd8\x5b\x3f\xc7\xf8\xfa\ +\x3a\x21\x5c\x1d\x08\x11\x41\xb3\x2e\x7f\x39\x1a\x98\x9d\xd8\xcb\ +\xba\x11\x45\x15\xbc\x17\x4e\xbf\x33\x7d\xcb\x6f\x7f\xf6\xda\xfe\ +\xe9\xa9\xd9\x87\x81\xe7\xd7\x08\x20\x4c\x8e\x8f\xd5\xbe\xbf\xff\ +\x07\x5f\xe4\xaf\xcd\x8d\xcc\x4e\x83\x77\x20\x02\x59\x80\xfb\x6f\ +\x84\x5d\x9b\x61\xb6\x05\xa2\x4d\x76\xef\xf2\x6c\xd9\xb2\x91\x3c\ +\x0f\x57\x0d\xc0\xd3\xe6\xc5\xd7\xcf\xf1\xf7\xc6\x04\xbb\x6e\x76\ +\x68\x0e\x12\x60\xd3\x67\x36\xf0\x8d\x1b\x37\xf0\xe4\x23\xbf\xfc\ +\xce\x95\x00\xd8\xba\xf3\xe6\x8d\x1b\x3f\x4c\x27\xf9\x60\x1a\xd6\ +\xa5\x10\x04\x5c\x04\xd0\x6a\x06\x2e\xce\xf6\xad\xe5\x48\xfb\xe3\ +\xe3\xc7\xa7\x39\x75\x6a\x06\xd5\xb5\x3b\xbc\xb8\xa9\x2a\xd5\xa4\ +\x47\xb3\x51\xa1\xa7\x4a\xde\xa5\x00\x20\x30\x7d\x1a\xee\xb8\x61\ +\x33\xdb\x77\xad\xdf\x7d\x25\x22\x76\xce\x3b\x51\x15\xd2\x04\x12\ +\x0f\x02\x88\x14\x96\xe7\xd0\x6a\x43\xb3\x6f\xa3\x99\x50\xab\xa5\ +\x7d\xab\xac\x49\x07\xaa\x90\xb8\x1c\xe7\x14\x80\x4e\xcf\x01\x8e\ +\x4a\x02\x3e\xf5\x88\x53\x9c\x03\x55\x7b\x67\xde\x13\x5c\xbf\x5d\ +\x02\x80\xae\xf8\x1a\x45\x0b\x87\x89\x4d\xcc\xba\x19\xcc\x35\xa1\ +\xd1\xb7\x8a\x08\xa3\xa3\x23\xd4\xeb\x97\xd7\x80\x77\x42\xb3\xd9\ +\xe2\xd5\x37\xdb\x9c\x9d\xad\xe2\x7d\xe0\xbe\xdb\x33\xb6\x5d\x33\ +\x89\xa7\x4b\x92\xe4\x08\x45\xa6\x03\x0c\x80\x10\x83\xa6\xfd\xb6\ +\x04\x40\xb8\x1e\xc2\x23\x95\x24\xdd\x87\x10\xcc\xf5\x3e\xe0\x2c\ +\x9d\x9c\x3a\xfe\x51\xda\x78\xfa\x20\x1f\xce\x05\x44\x73\x44\x0c\ +\xee\xc5\x54\x79\xd3\x05\x7a\xb9\x50\x91\x36\x7f\x5e\xdf\x23\x49\ +\xfc\xaa\x14\xf2\x3e\xe9\x9b\xa3\xd7\x47\x7f\xe8\x58\xc2\xe9\x8f\ +\x2a\x90\x2b\x9d\xaf\x55\x78\xf4\x9b\x5b\x48\x05\xbc\xef\x40\xa4\ +\x2a\xae\xe8\x15\x08\x5a\xf4\x18\x80\xb0\xaf\x3e\x9a\xbe\xf4\xa5\ +\x6f\xdd\xb3\x63\xfd\x9e\x6d\xe4\x99\xc2\x00\x25\xd4\x52\xd8\x54\ +\x87\x2c\x53\x5a\xb3\x0d\x76\x57\xa6\xd8\xbb\x7b\x23\xbd\xdc\xbc\ +\x53\x04\x0b\xb6\x90\x05\x59\x95\x3e\x89\x87\x43\x6f\x9f\xe7\xad\ +\xb9\xeb\x19\xdf\x38\xc2\xcd\x5e\x49\x12\x08\x9d\x0e\xbf\x3f\xf0\ +\x37\xce\x9d\x3e\xc4\x8f\x7f\x74\x7b\x7f\xae\x87\x8b\xdc\x77\x62\ +\x94\x55\x2d\x0c\x03\xa0\xdf\xdb\xff\xd8\xbd\x3b\xf2\x7b\x3e\xcd\ +\xab\xef\x81\x8f\x68\x73\x85\x1b\x46\xe1\xd6\x3d\xd0\xed\xc1\xdc\ +\xc5\x16\x7b\xea\x19\xfb\x6e\xbd\x9e\x5e\x16\xb8\xda\x56\x4d\x85\ +\x33\x33\xf0\xdc\xeb\x5b\xb9\xed\xb6\x71\x5a\xf1\x51\xa3\x75\xf8\ +\xea\x0f\xb7\xf2\xec\x77\x5f\xe0\xf0\xe1\x8f\x18\xa9\xd5\x91\x66\ +\x41\x9d\x10\x0c\xc0\xfc\x38\x2c\x06\x30\x3e\x56\xbd\x77\xc7\xdd\ +\x37\xf1\xe2\x3b\x40\x66\x25\x52\x81\x46\xaa\xcc\x5c\xc8\xe9\x76\ +\x85\x4e\x2b\x70\x6a\x76\x86\x6e\xa3\x49\x50\xae\xba\xa5\x89\x72\ +\xe6\x4c\x9b\x76\x03\xda\x2d\x90\xe8\xdc\xb9\x26\x4c\xec\x1c\x63\ +\xef\x5d\x3b\x78\xf7\xe8\x2c\xd5\xea\xfa\x02\x00\x0c\x51\x29\x2c\ +\xcd\x80\x38\xf1\x01\x47\xea\x20\xf8\x32\x03\x86\xb2\xdd\x86\x4e\ +\x57\xe9\x76\x20\xa9\x27\x54\xab\x09\x6b\x29\xf1\x0a\x78\x09\xa4\ +\x3e\x80\x40\x2f\x73\x04\x75\x03\x00\xe9\xa0\xc2\x14\xef\x02\x70\ +\xa5\x83\x01\x10\x8f\x13\x87\x4f\x04\x11\x5d\x46\xa1\x65\x00\x50\ +\x14\x8d\x0f\xb0\x85\xb8\xe8\x45\xb3\xad\x74\x3a\xd0\x6b\x07\xaa\ +\x1b\x52\xc6\xc6\x46\xc9\x83\x5e\x7e\x37\x0d\x3d\x0e\x1d\x99\xe1\ +\xd8\xe9\x75\x84\x1c\xf6\x6c\x6d\x72\xc7\x27\x26\xa9\x54\x52\xaa\ +\xb5\x1c\x89\x95\xad\x34\xca\x4a\xa3\x90\x24\x0e\xef\xbd\x55\x21\ +\x03\xb1\x1c\x80\x52\x4c\x98\xe3\x51\xf1\xf3\x16\x94\x76\x7b\xde\ +\xa0\xd7\x81\x4a\x9a\x32\x32\x92\x92\xe5\x97\x07\x90\x48\xce\x3f\ +\x4e\x8c\xf2\xcc\xef\x76\x41\x57\x79\x74\xff\x09\xee\xbf\xcb\x23\ +\x2e\x25\x4d\x93\x62\xc7\xb5\xa0\x45\x3f\x0a\x07\x7d\xe2\x48\xbc\ +\x8b\xd1\x37\x0a\x89\xb3\x35\x43\x65\x34\xa8\x21\x74\x0e\x9c\x3d\ +\x90\x56\x4b\x69\x77\x20\xeb\xea\xfc\x83\x63\xfa\x2f\x0f\x20\x75\ +\x09\xe2\x7a\xd0\x53\x00\x92\xf2\x5e\xef\x49\x13\xb7\xe0\x38\x62\ +\xef\x93\xe8\x4b\xe2\xdc\xe0\x5d\xc2\x30\x33\x5c\x14\xb1\x95\xd1\ +\xe8\x64\x1e\x86\x1f\x26\x18\xda\x66\x04\x90\x77\x75\x50\xdf\x2b\ +\x15\x8f\x64\x6b\x01\xe0\x71\x25\x27\xa4\x88\xea\xfc\xbd\x38\x4f\ +\x92\xfa\x21\xe7\x1c\x31\xe3\x14\xbe\x78\x97\x91\x38\xf3\x43\x82\ +\xe9\x64\x45\x0a\xe5\xc1\x68\x23\x25\x17\xc5\x32\xd0\x6a\x43\x18\ +\x54\x28\x5f\x6c\x52\xac\x01\x80\xf7\xf8\x52\xa5\x30\x18\x27\x49\ +\x01\x20\xf2\xdb\xa2\x8b\x05\x50\x81\x67\x9e\x0f\xf4\xb6\xd4\xd8\ +\x70\x8b\xd1\xcc\x00\xac\x40\x21\x8d\x4e\x6b\x18\xf4\xc6\xb7\x8c\ +\xbe\xf3\x05\x00\x72\xe6\x1d\x18\xd0\x00\x59\x1b\x00\xa7\x0e\xda\ +\x02\x30\x18\xa7\x15\x0f\x32\x4f\x21\x8f\x08\x98\xd9\x79\x47\x83\ +\x32\x53\xdf\xc0\xbe\xfb\x36\x30\x31\xaa\xe4\x19\xb8\xa5\x14\xd2\ +\xa5\x14\xca\x41\x18\x46\x2a\x51\xc4\x65\x06\xc8\x75\xc0\xe3\x6a\ +\x65\x6d\x1a\x70\x24\x6c\xbf\x36\xe7\xee\x3b\x2f\x02\x0c\xc6\xce\ +\x25\x83\x00\xf4\x6d\x58\xa0\x50\xfc\x89\x74\xde\xbc\x05\xb6\x6e\ +\x87\x6e\x53\x08\x6a\x41\x9d\xef\x43\x0e\xba\x5c\xc4\x31\x12\x6e\ +\x58\xcc\xaa\x45\x06\x9a\x2d\x10\x55\x7c\x92\x0c\xa2\xa8\xb2\x96\ +\x93\x66\x95\x87\x1f\x9c\xe0\xcb\x0f\x6a\xcc\xf2\x04\xe2\xab\x24\ +\xa9\x2b\x34\x20\x82\x49\x04\xc4\xce\x3a\x5c\x3b\x02\xbb\xc6\xa0\ +\x9b\x2a\x4e\x84\x56\x06\x17\xda\xf1\x08\xaf\x10\x96\x6b\xc0\x28\ +\x24\x60\x7c\x0b\x46\x21\xa7\x8a\x73\xd2\x37\xd7\x37\x65\x2d\x6d\ +\x62\x62\xdc\x0e\x7e\x0a\x21\x68\xf1\x6c\xef\x10\x86\xb3\x4e\xe4\ +\x77\x96\xc3\x67\xb7\x35\xf8\xca\xde\x39\x5a\xad\x0c\x27\x8e\x57\ +\xde\xaf\x73\xa1\xe5\x57\x16\x31\x6a\x22\x66\xa1\x8c\xda\x79\xa8\ +\xd9\x54\x1a\x7d\x4b\x45\x19\xa9\x40\xad\x92\x91\x88\x72\xb5\x2d\ +\xa9\xc0\x68\x75\x21\xea\x66\xa5\x2f\x0a\x1b\xc7\xab\x6c\x1a\x5f\ +\x47\x3e\xd2\xa5\xd1\x68\x01\x0a\x97\xd4\x40\x34\x27\xa0\x4b\x28\ +\x04\xd0\xcd\x21\x0b\xd0\x0b\x9e\x9f\xfe\x2a\xe1\x9a\xc9\x16\x59\ +\x86\xf1\x1d\xac\xc9\x2a\xba\xc0\x4e\xa3\xc7\xa7\x52\xf0\xbe\x3f\ +\x1e\xde\x44\x89\x0e\xce\x53\x15\x5c\xbf\xaf\x92\x85\x26\x79\x50\ +\x9c\xc3\xaa\x10\x4b\x34\x60\xa7\x3d\x33\x02\xd4\xd6\x7b\x6e\xfc\ +\xdc\xd8\x42\xb4\x0e\x77\x26\xf8\x67\x0b\xa3\x99\x23\x8a\x31\xce\ +\x11\xc7\x8b\x37\x45\xb0\x35\xb1\xb6\x27\x37\xc1\x9d\x63\x10\xb2\ +\xe1\xe3\x32\x91\xdf\xd6\x74\x40\x3b\x0d\xf6\x3e\x5d\xb6\x0f\x0c\ +\x53\xc8\x8e\x16\xe5\x8b\x53\x59\x40\x3f\x5e\x03\x6f\xce\x61\xe5\ +\x6d\xc9\x98\xe5\xd7\xc5\x0d\x5f\x93\xf8\x1e\x5b\x63\x7a\x04\xb0\ +\xe0\x86\xb8\xd1\x1a\xad\x55\x57\xc8\x80\xf3\xd0\x53\xd8\x35\x09\ +\x37\x6c\xb0\x07\x89\x58\x2f\x0c\x8f\x05\xe3\x86\xb3\x75\x36\x1f\ +\x3b\x9b\xb3\xdf\x10\x41\x00\xe7\xdb\x16\xf9\x10\xec\x3d\x1a\x01\ +\xa8\xea\x50\x06\xc2\xb2\x0c\xa8\x3d\x74\x53\x5d\x79\x60\xf3\x71\ +\x5c\x68\xa3\x08\x22\xf3\xe6\x70\xae\x18\x23\x71\x0e\x87\xb8\x72\ +\x2c\x88\x2b\x7b\x17\x29\xe4\x90\xb8\xd6\x95\xf7\x39\x37\x18\x4b\ +\xb4\x4a\x22\x1c\x39\x5f\xe3\x95\xa9\x0a\x4e\xac\xa4\x23\xc3\x5f\ +\xe4\x41\x2f\x71\x9c\x36\x94\x46\x83\x2c\x57\x7c\xf6\x31\x9b\x27\ +\xc6\x49\x6b\x63\x20\x1a\x69\x23\x0b\x20\xc4\x81\x17\x89\x7b\x87\ +\xe0\x88\x34\x2b\x1d\xf6\xa5\x0f\xe6\x2c\x10\x03\x00\x12\xe7\x43\ +\xaf\xc5\xbb\x17\x72\x3b\x4a\x5b\x74\x97\x01\x70\x52\xd0\x57\xc3\ +\xca\x1b\x59\x04\x60\x9a\xa8\x8d\x4e\x52\xed\x9b\x86\xf8\x95\xe6\ +\x30\xfe\x4a\x61\x5e\x2e\x39\xbf\xa6\xd6\xee\x76\xe8\xe5\x8a\x60\ +\x1a\x08\xcb\x34\xa0\xf3\x66\x7b\xd3\x6a\x14\x32\x00\x3a\x40\x8e\ +\xda\x37\xa8\x0f\xa0\xb2\x04\xec\x7c\xaf\xe5\xbc\x39\xaf\x26\xf2\ +\x55\x9b\x6a\x18\x38\x07\x31\xfb\x40\xae\xcb\x44\x5c\xe8\xc2\x19\ +\x00\x65\xb9\x88\x63\x14\x4d\x38\xe5\xe7\x9c\x94\xa0\x88\x62\x0d\ +\x10\x5c\x1c\x97\x11\x73\x10\xa7\x08\xd8\xbc\xc4\xac\x5c\xa2\x59\ +\xd5\x11\x03\x6b\x1c\x8f\xbf\x8d\x42\xab\x1c\xa7\x15\x2a\x2e\x02\ +\x08\x45\x06\x04\x4c\xf5\x21\xf6\xab\x80\x10\x57\x02\xb0\xf9\xbc\ +\xa4\x9f\xac\x9e\x81\x32\x78\x30\xbc\xd3\x6a\x28\x35\xa0\x45\x76\ +\xdd\x0a\x3b\x31\x6a\x1b\x99\xf1\x50\xb1\xf2\x17\x91\x63\x99\x50\ +\xc0\x1b\x88\x62\x6d\x19\x71\xac\xd9\x7c\x19\xe1\xe5\xfc\xce\x83\ +\x5a\x06\x22\x5d\x75\x71\xf4\x43\xb0\x2f\xc6\x15\x35\x80\xf1\xd7\ +\x89\xdd\x04\x5a\x7e\x29\x19\x2d\xb0\x4c\x88\x65\xa2\x88\xf6\xe0\ +\xb7\x1d\x49\x82\x1a\x20\x29\x69\xe2\x96\x55\x98\xb8\xdf\x58\xb6\ +\x8d\x22\x71\x1c\xd4\x02\xec\x20\xac\xbc\x91\x99\xf8\x54\x25\x46\ +\x45\x71\xce\xf4\x11\xb0\xc3\xd4\x72\x4d\xd8\x1a\x00\x62\xc4\x88\ +\xeb\x3c\x10\xb0\x79\x6b\x45\x06\x9c\x60\xeb\x43\xd1\xdb\x29\x21\ +\xd2\xcc\x18\x82\x22\x2b\x7f\x13\x7b\x57\x44\xc5\x28\x54\x18\x98\ +\x80\x9c\x5b\x19\x84\x2e\xd6\x80\x09\x9b\x82\x19\x96\x09\x35\x4d\ +\xc4\xe8\x2a\x56\x7a\x87\x0f\x6b\x8a\xed\x03\x89\x40\xea\xb1\x33\ +\xc8\x4a\x1b\x19\x02\xaa\xa6\x01\x43\x6d\xe5\x33\xb0\x32\x08\x82\ +\xed\x09\x6a\xc2\x2e\x9d\x37\x0a\x9a\xb0\x23\x85\x14\x00\x11\x63\ +\x43\x45\x7a\x40\xe8\xf7\x6d\xea\xd5\xc0\xba\xaa\x52\x19\x81\x86\ +\xc2\xb1\x23\x17\x60\xf6\xe2\xc9\x21\x0a\xe5\x5a\x02\xb0\xb4\x21\ +\x3a\x9c\x81\xc5\x20\x74\x15\x61\x0b\x50\x8a\x39\x98\xf8\x70\xa0\ +\x45\x07\xa1\xe4\xb3\x92\xc7\x8d\xcc\x3b\xdb\xbd\x9f\xfd\xd3\x0c\ +\x6f\x25\xa7\xe8\x75\x32\x54\x2b\x9c\x68\xf5\x68\x4b\x8b\xf7\x8e\ +\xcd\x72\xf8\xb9\x57\x20\x6f\x1d\xc0\x28\x64\xd1\x22\x8a\x68\x25\ +\x0a\xc1\x62\x2d\x2c\xd7\x84\x62\xd1\x46\x6d\xed\xe2\x52\xeb\x2c\ +\x23\xb1\x44\x86\x72\x1f\x30\x90\x22\x1c\x3c\xf0\xc6\xf9\x83\x07\ +\x8e\x34\x58\xc0\xa4\x80\x7a\xb4\xf7\x1e\x64\x3f\x81\xe4\x05\x2c\ +\x03\x42\xae\xca\xfb\x53\x27\x98\x6b\x34\xd8\xb7\x73\x37\x20\xe5\ +\x3e\x60\x14\x92\xe8\x98\x46\xd1\xea\xca\x9a\xf0\x80\x9a\x26\x50\ +\x93\x04\xaa\x20\xc5\xfd\xa6\x01\xb5\x0c\xb0\x50\x61\x3a\x8f\x03\ +\xcf\x01\x75\x30\x51\x83\x74\xc0\x67\x30\x5c\x85\x24\x04\xe8\x4c\ +\xbf\x4d\x6b\xe6\x2c\xf9\xd6\xed\x28\x0e\x19\x3a\xfa\x46\x87\x17\ +\x8f\x31\x70\x5c\x42\x13\x16\x71\x0c\x8d\xd8\xfd\x01\x25\x37\xed\ +\x40\x3c\xef\x83\xeb\xc4\x99\x06\xab\xb4\x84\xc8\x21\x15\xf8\xd4\ +\x9d\x5f\x20\x64\x39\x89\x3a\xf2\x3c\x47\x5c\xac\x4a\x56\x9f\x11\ +\xb5\x7d\x01\x35\xea\x40\x14\xac\x62\x6b\x25\xf6\x98\xb0\x8b\xdf\ +\x96\x11\x82\x12\x72\x8d\xef\xb2\x7d\x68\x2d\xcd\x00\x64\xdd\xa3\ +\x1f\xbe\x7b\xf6\xba\x7c\xdf\x1e\xd6\xe1\x09\xad\x9c\x5a\x1a\xa8\ +\x4a\x17\x2f\x19\xce\xe5\x84\xc8\x03\x2d\xab\x94\x13\x94\x62\x8c\ +\x9a\x73\xaa\x71\xde\x36\x2e\x3b\x76\x0f\x7e\x47\x93\xc2\xba\x69\ +\x4e\x25\x55\xaa\x15\x48\xab\x70\xf2\x78\x60\xee\xe4\xd9\x1c\xdc\ +\xf4\xda\x01\x10\x9e\xfa\xe0\xd7\x7f\xfc\xfc\xab\x49\x2a\xd7\x7e\ +\xf2\x3a\x5c\x1e\x68\x9e\xdd\xc9\xc1\x13\x6d\x90\x93\x58\x93\x28\ +\x36\xc1\xbe\xae\x5c\xbc\x24\x46\x37\x71\x71\x2c\xf1\x52\x79\x5d\ +\x6c\xce\x95\xeb\x6b\xfc\xab\x51\xe5\x22\x4a\x73\xae\xcd\x1b\xbf\ +\x78\x8d\xec\xe4\xfb\x2f\x43\xfa\xfa\x15\x00\xf0\x2f\x85\x8b\xb3\ +\x0f\x4d\xfd\xfc\x85\x6f\x4f\xd5\xc7\x77\x23\xe8\xeb\x9a\x98\x6a\ +\x57\x6d\x0a\x5c\xcd\x12\xc5\x82\xa2\xe0\xd4\xd1\xe9\x34\xe8\x7e\ +\xfc\x07\x48\x9e\x04\x74\xcd\x00\x54\x9f\x00\xf8\xcd\xbc\xfd\xff\ +\xbf\x55\xfe\xcb\xed\xdf\x99\xd5\xe1\x33\x6b\x2f\x52\xdc\x00\x00\ +\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x04\xf0\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x14\x00\x00\x00\x14\x08\x03\x00\x00\x00\xba\x57\xed\x3f\ +\x00\x00\x03\x00\x50\x4c\x54\x45\x09\x16\x28\x09\x16\x28\x09\x14\ +\x25\x09\x15\x27\x09\x14\x25\x08\x13\x23\x07\x11\x20\x07\x0f\x1c\ +\x06\x0d\x18\x04\x0a\x13\x03\x07\x0d\x02\x04\x07\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x01\x01\x01\x02\x02\x02\x03\x03\x03\x06\x06\x06\x0a\x0a\x0a\ +\x10\x10\x10\x17\x17\x17\x21\x21\x21\x28\x28\x28\x2c\x2c\x2c\x2d\ +\x2d\x2d\x2e\x2e\x2e\x2f\x2f\x2f\x30\x30\x30\x31\x31\x31\x32\x32\ +\x32\x33\x33\x33\x34\x34\x34\x35\x35\x35\x36\x36\x36\x37\x37\x37\ +\x38\x38\x38\x39\x39\x39\x3a\x3a\x3a\x3b\x3b\x3b\x3c\x3c\x3c\x3d\ +\x3d\x3d\x3e\x3e\x3e\x3f\x3f\x3f\x40\x40\x40\x41\x41\x41\x42\x42\ +\x42\x43\x43\x43\x44\x44\x44\x45\x45\x45\x46\x46\x46\x47\x47\x47\ +\x48\x48\x48\x49\x49\x49\x4a\x4a\x4a\x4b\x4b\x4b\x4c\x4c\x4c\x4d\ +\x4d\x4d\x4e\x4e\x4e\x4f\x4f\x4f\x50\x50\x50\x51\x51\x51\x52\x52\ +\x52\x53\x53\x53\x54\x54\x54\x55\x55\x55\x56\x56\x56\x57\x57\x57\ +\x58\x58\x58\x59\x59\x59\x5a\x5a\x5a\x5b\x5b\x5b\x5c\x5c\x5c\x5d\ +\x5d\x5d\x5e\x5e\x5e\x5f\x5f\x5f\x60\x60\x60\x61\x61\x61\x62\x62\ +\x62\x63\x63\x63\x64\x64\x64\x65\x65\x65\x66\x66\x66\x67\x67\x67\ +\x68\x68\x68\x69\x69\x69\x6a\x6a\x6a\x6b\x6b\x6b\x6c\x6c\x6c\x6d\ +\x6d\x6d\x6e\x6e\x6e\x6f\x6f\x6f\x70\x70\x70\x71\x71\x71\x72\x72\ +\x72\x73\x73\x73\x75\x75\x75\x77\x77\x77\x79\x79\x78\x7a\x7b\x7a\ +\x7c\x7d\x7c\x7f\x7f\x7e\x81\x82\x7f\x84\x85\x81\x84\x85\x82\x85\ +\x86\x83\x86\x87\x83\x86\x88\x84\x87\x88\x84\x87\x89\x84\x87\x89\ +\x85\x87\x89\x85\x88\x89\x85\x83\x86\x85\x7f\x84\x85\x7c\x82\x85\ +\x7a\x81\x85\x76\x81\x8b\x76\x82\x8e\x77\x84\x90\x79\x85\x90\x7d\ +\x87\x8e\x83\x89\x8c\x85\x8b\x8c\x89\x8c\x8c\x8a\x8d\x8b\x8c\x8d\ +\x8a\x8e\x8f\x8d\x90\x91\x8f\x92\x92\x91\x94\x94\x93\x95\x95\x95\ +\x97\x97\x97\x99\x99\x99\x9a\x9a\x9a\x9b\x9b\x9b\x9c\x9c\x9c\x9d\ +\x9d\x9d\x9e\x9e\x9e\x9f\x9f\x9f\xa0\xa0\xa0\xa1\xa1\xa1\xa2\xa2\ +\xa2\xa3\xa3\xa3\xa4\xa4\xa4\xa5\xa5\xa5\xa7\xa7\xa6\xa8\xa8\xa8\ +\xa9\xaa\xa9\xaa\xab\xaa\xab\xac\xab\xac\xad\xac\xad\xad\xad\xae\ +\xae\xad\xae\xaf\xae\xaf\xb0\xaf\xb0\xb0\xaf\xb1\xb1\xb0\xb1\xb2\ +\xb1\xb2\xb3\xb2\xb3\xb4\xb3\xb4\xb5\xb4\xb6\xb6\xb6\xb7\xb7\xb7\ +\xb8\xb8\xb8\xb9\xb9\xb9\xba\xba\xba\xbb\xbb\xbb\xbc\xbc\xbc\xbd\ +\xbe\xbd\xbe\xbf\xbe\xbf\xc0\xbf\xc0\xc0\xc0\xc1\xc1\xc1\xc2\xc2\ +\xc1\xc3\xc3\xc2\xc4\xc4\xc3\xc6\xc6\xc6\xc9\xc9\xc9\xcd\xcd\xcd\ +\xcf\xcf\xcf\xd1\xd1\xd1\xd3\xd3\xd3\xd5\xd5\xd4\xd6\xd6\xd5\xd8\ +\xd8\xd8\xda\xda\xda\xdc\xdc\xdc\xde\xde\xdd\xdf\xdf\xdf\xe0\xe0\ +\xe0\xe2\xe2\xe2\xe3\xe3\xe3\xe5\xe5\xe4\xe6\xe6\xe6\xe8\xe8\xe7\ +\xe9\xe9\xe9\xeb\xeb\xea\xeb\xeb\xeb\xec\xec\xec\xec\xec\xec\xee\ +\xee\xed\xef\xef\xef\xf1\xf1\xf1\xef\xef\xef\xef\xef\xee\xef\xef\ +\xee\xef\xef\xef\xf0\xf0\xf0\xf0\xf0\xf0\xf1\xf1\xf1\xf2\xf2\xf2\ +\xf3\xf3\xf3\xf4\xf4\xf4\xf5\xf5\xf5\xf6\xf6\xf6\xf7\xf7\xf6\xf7\ +\xf7\xf7\xf8\xf8\xf8\xf9\xf9\xf9\xfa\xfa\xfa\xfb\xfb\xfb\xfc\xfc\ +\xfb\xfc\xfc\xfc\xfd\xfd\xfd\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\ +\xfe\xfe\xfe\xfe\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\x7e\xee\x29\x02\x00\x00\x01\x00\ +\x74\x52\x4e\x53\xd1\xd2\xd3\xc8\xb9\xa9\x93\x78\x5d\x43\x2c\x17\ +\x03\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x06\x0a\x10\x17\x21\x28\ +\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\ +\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\ +\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\ +\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\ +\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x71\x6f\x6e\x6d\x6d\x68\x68\x62\ +\x6f\x7c\x8a\x95\x9e\xa6\xae\xb6\xbf\xcd\xd2\xd7\xdb\xe1\xe7\xea\ +\xeb\xeb\xe8\xe6\xdc\xd1\xbe\xac\xa1\x9c\x96\x97\x98\x99\x9a\x9b\ +\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa2\xa2\xa1\xa1\xa1\xa3\xa2\xa2\ +\xa2\xa3\xa3\xa4\xa5\xa6\xa8\xaa\xad\xb0\xb3\xb7\xb8\xb9\xba\xbb\ +\xc0\xc5\xc8\xcb\xcd\xce\xcf\xce\xce\xcf\xd3\xd6\xdc\xe0\xe4\xe8\ +\xea\xee\xf1\xf3\xf5\xf6\xf7\xf8\xf9\xfa\xfa\xfb\xfb\xfb\xfc\xfc\ +\xfc\xfd\xfd\xfd\xfd\xfa\xf6\xf3\xef\xeb\xe7\xe0\xd8\xd0\xc8\xbf\ +\xb6\xae\xa5\x9c\x92\x88\x7d\x72\x68\x66\x64\x63\x62\x5b\x55\x51\ +\x4d\x4a\x46\x48\xa6\xfd\x00\x6d\x00\x00\x00\x9f\x49\x44\x41\x54\ +\x18\xd3\xb5\xd0\x31\x0e\x82\x40\x10\x85\x61\xe0\x12\x1e\x76\x54\ +\x54\xa0\xd9\x1d\xf3\xe2\x11\xd4\xc4\xd6\x58\xd3\x10\x0b\x3b\x02\ +\xd1\x42\xa9\xc6\x53\x50\x8e\xee\x02\x31\x9a\xd8\xf2\x17\x53\x7c\ +\xc9\x6e\x26\x13\x4c\xfe\x14\x8c\x87\x34\xf4\x85\x44\xb3\x0c\x40\ +\x1a\x0f\xea\x91\xa6\x40\xc1\xc6\xf0\x1e\x2b\xea\xd1\x3d\xc2\xae\ +\x62\x91\xd0\xf2\x15\xa9\xd7\x80\x28\xc6\xf6\x26\x46\x24\xb2\xa6\ +\xa9\xb1\xa4\x0e\x53\x3c\x45\x4c\x18\x39\x7c\x48\x83\x39\xf9\x3f\ +\x4f\x09\x44\xd8\xba\x58\x4a\xe0\xa0\x1e\x35\xcf\x50\x56\x58\x73\ +\x71\x3f\x63\x91\xab\xf6\x2b\xe9\x71\x83\xae\xe4\xe2\xe8\xb3\xbc\ +\xaa\xb6\xed\xcb\x4d\x1d\xf9\x4a\xbf\xbd\x01\x0c\x0e\x70\x72\x00\ +\x75\x19\xc2\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x0b\xe1\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\ +\x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\x26\x00\x00\x80\x84\ +\x00\x00\xfa\x00\x00\x00\x80\xe8\x00\x00\x75\x30\x00\x00\xea\x60\ +\x00\x00\x3a\x98\x00\x00\x17\x70\x9c\xba\x51\x3c\x00\x00\x00\x06\ +\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\ +\x00\x07\x74\x49\x4d\x45\x07\xe1\x0a\x1f\x04\x05\x06\xc0\x1b\xc4\ +\x43\x00\x00\x0a\xe5\x49\x44\x41\x54\x68\xde\xcd\x5a\x6b\x90\x54\ +\xc5\x15\xfe\x4e\xdf\x3b\x77\x66\x76\x96\x9d\x65\x67\x71\x51\x79\ +\x49\x10\xe5\x21\x28\x02\x0a\x18\x5c\x65\x92\xd2\x98\x94\x86\x94\ +\x92\x68\x48\x7e\x04\x1f\x10\x30\xbb\x1b\x2b\x65\xa5\x7c\x96\x29\ +\xab\xcc\x43\x17\xe5\x51\x25\x8f\xca\x8f\x18\x63\x02\x3e\x10\x9f\ +\x59\x17\x6a\x85\x22\x20\x2a\x06\x70\x05\x04\x91\xa7\x60\xf6\x31\ +\x3b\xbb\x3b\x33\xf7\xde\xee\x93\x1f\x73\x67\xf6\xce\x9d\x3b\x0b\ +\x05\x04\x73\xfe\xf4\xd6\xdc\x73\xba\x4f\x9f\xaf\xcf\xe9\xaf\xbb\ +\x97\xe2\xf1\x5a\x81\x42\x21\x00\xec\xb4\x0a\x80\xf0\x69\xd9\xa5\ +\xf7\x4d\xda\xb2\x70\x19\x0b\xa7\x75\xff\xad\x39\xdf\x4b\xb5\xe2\ +\x9b\xb6\x75\x4f\xc0\xdd\x96\x8a\x0c\xbb\x22\xe2\xfe\xfd\x9b\xb2\ +\x65\x3d\x07\x45\x89\x4e\x70\x1a\x9d\xf4\x27\x67\x6c\x9b\x4a\xa5\ +\x78\xf3\xe6\xad\x2a\xa7\x3b\x71\xe2\x38\x15\x8b\xc5\x34\x21\x84\ +\xbb\x4f\xd2\x5d\xf0\xfd\x5f\x38\xcf\xcc\xf8\xe2\x8b\xfd\x32\x1e\ +\xbf\x79\xc0\xd4\xa9\xd3\x26\x03\x18\x0a\xd0\x7f\x6c\xdb\xda\xd3\ +\xd9\xd9\x79\x70\xc7\x8e\xed\x5c\x53\x33\x38\xe7\xb3\x22\x27\x89\ +\xc5\xb9\x72\xe0\x6c\x6c\x2d\xcb\x42\x4f\x4f\xb7\x9a\x31\xe3\xfa\ +\x09\x9a\xa6\x3f\x08\xe0\x16\x00\x11\x00\x16\x80\xa3\xcc\xfc\x9a\ +\x94\xf2\xd9\x0d\x1b\xde\x39\x54\x53\x73\x21\x01\x60\x8a\xc7\x6b\ +\x35\x9f\x4e\xf3\x0e\x30\x33\x1d\x3b\x76\x4c\xb6\xb6\xee\xf3\x3a\ +\xe6\x75\xa8\xd4\xb7\xfe\x5a\xcc\x9c\x39\x5d\x33\x0c\x83\x3a\x3b\ +\x3b\x78\xe2\xc4\xab\xf5\x8a\x8a\xe8\x1c\x22\x7a\x14\xc0\xc8\x12\ +\xf3\x7c\xb5\xbb\x3b\xf9\xf3\x5d\xbb\x76\xf4\x94\x95\x45\x58\x77\ +\xa2\xa3\xf9\x39\x9f\x48\x74\x62\xd4\xa8\xcb\x30\x76\xec\x15\x97\ +\xdc\x74\xd3\xf7\xc7\x02\x18\x0e\x40\x47\x71\x89\x23\x00\x20\x02\ +\x98\x01\x22\x02\x33\x83\x88\x98\x99\x05\x11\x14\xb3\x6f\x59\x24\ +\x66\xfe\xf0\xbd\xf7\xde\xde\x34\x73\xe6\xac\x01\x86\x61\xfc\x86\ +\x88\xee\x77\xa2\xee\x27\x12\x40\x92\x59\x29\x91\xad\x3f\x94\x73\ +\xc6\x13\x1d\xe6\xcf\x3e\x6b\xe5\xd9\xb3\x7f\x7c\xb1\xa6\x69\xbf\ +\x24\xa2\x1f\x01\x18\x06\xc0\x38\xc5\xd2\x01\x51\xae\x25\x4f\xeb\ +\xab\xbe\x49\x29\xf9\x4e\x6d\xed\x77\x06\xe9\xba\xfe\x14\x11\xdd\ +\xe5\x09\xa6\x5b\x0e\x33\xf3\xe2\x4c\x26\xfd\xe7\x9d\x3b\x77\xa4\ +\xca\xcb\x07\x10\x00\xe5\x46\x20\x3f\x89\x4f\x3f\xdd\xc5\x77\xdc\ +\x31\x77\x82\x10\x62\x09\x80\x19\xa7\x72\xfa\x0c\x65\xab\x94\xf2\ +\x1e\x80\x12\x81\x80\xbe\x0c\xc0\x6d\xf0\xcf\x0f\x06\xf0\x9e\x52\ +\xf2\x91\x3d\x7b\x5a\xb7\xf5\xf4\x24\xe1\x38\x0f\x38\xd1\x2f\x40\ +\xe0\xc8\x91\x2f\x71\xfb\xed\x77\x0d\x15\x42\x2c\xfd\x1f\x3a\xdf\ +\xaa\x94\x5c\x08\xa0\x4d\xd3\xb4\x25\x00\x7e\x58\xc2\xf9\x0c\x80\ +\xe5\xa6\x69\xfe\xac\xb1\x71\xf1\xbf\x4c\x33\x43\x86\x11\x2c\xc8\ +\xb9\x02\x04\x94\x52\x34\x7a\xf4\x58\x08\xa1\x2d\x02\x30\xdd\x27\ +\x12\x49\xa7\x53\xaf\x9c\x6e\xd2\x0a\x00\x1d\x4a\xa9\x07\x6c\x5b\ +\xee\x35\x0c\xe3\x39\xc7\x79\x3f\x49\x32\xf3\x93\xdd\xdd\xc9\xe7\ +\x5e\x7f\xfd\xe5\x94\x53\x6c\xdc\xbe\xe4\x97\x50\x0e\x01\xd1\xdc\ +\xdc\x62\xdf\x7f\xff\xa2\x4b\x89\x68\xb6\xa7\xb3\x2e\x00\xcb\x95\ +\x92\xaf\x33\xa3\x2b\x9b\x98\xa4\x7c\x5a\x72\x12\x97\xb2\x6b\xbf\ +\xaf\x98\x65\xff\x20\x30\xab\x94\x69\x5a\x47\xc3\xe1\xf0\x23\x00\ +\xee\x2a\xe1\x7c\x82\x99\x7f\xdb\xdd\xdd\xbd\xaa\xab\x2b\xa1\xc6\ +\x8e\x1d\x2f\x7c\x9c\xcf\x23\xc0\x0e\x02\x0a\x00\x6b\x9a\x3e\x01\ +\xc0\x50\x4f\x87\xcf\x1d\x3a\xf4\xe5\xe3\x6b\xd6\xac\xb5\x2e\xb8\ +\xa0\x52\x58\x96\xc5\x81\x80\x4e\xa6\x69\xb1\x61\x04\xc8\x34\x6d\ +\x36\x0c\x9d\x6c\x5b\xb2\xa6\x69\xa4\x94\xca\xcf\x80\x99\x21\x84\ +\x20\x29\x25\x4b\x69\x53\x22\x91\x56\xf5\xf5\xf5\xf3\x88\x68\x11\ +\xfc\x13\xb6\x8b\x99\x1f\x4c\x24\x3a\x57\x47\xa3\x95\x73\x22\x91\ +\x48\xc7\x4b\x2f\xfd\x63\x7d\x3c\x5e\xab\xa3\x18\x4d\x99\xdb\x89\ +\x15\xb2\x25\x0d\x0d\x0d\x0d\x97\x20\x5b\x2a\x73\xd2\xae\x94\x7c\ +\x75\xcd\x9a\xb5\x96\xab\x13\xe1\x99\xb8\x70\xfd\x5e\x52\x9a\x9a\ +\x36\xda\x75\x75\x75\xd3\x88\xe8\x61\x00\x65\x3e\x2a\x69\x66\x7e\ +\xa2\xab\x2b\xb1\x3a\x1a\xad\xbc\x93\x88\x9e\x21\xa2\x46\x00\x6f\ +\xa0\xc4\xe6\x58\x90\xc0\x4e\xd4\x02\x9e\x4e\x53\xcc\x9c\x88\xc5\ +\x22\x02\x67\xb1\x3b\x1f\x3c\xb8\x5f\x2d\x58\x30\x7f\x90\x10\xe2\ +\x51\x64\x4b\xb2\x57\x14\x33\x2f\x4d\xa5\x7a\x97\x54\x54\x44\x6f\ +\x25\xa2\xdf\x03\xa8\x64\xe6\xb2\x12\xe3\x0a\xb8\xe8\x34\x3b\x08\ +\xf8\x46\x91\x99\x45\x5b\x5b\xcf\x19\x3b\xaf\x94\xe2\x9a\x9a\x0b\ +\x45\x28\x14\x9e\x07\x20\x5e\x42\x6d\x5d\x26\x93\x79\x32\x14\x0a\ +\x5f\x43\x44\x7f\x00\x30\x08\x00\x88\xc8\x8b\x70\x6e\xdc\x3c\x02\ +\x40\x7e\x27\x25\x38\x1f\x0a\x84\x88\xb8\xa6\x26\x7a\xc6\xbc\xa8\ +\xb9\xb9\x85\xa7\x4c\x99\x7e\x15\x80\x05\xf0\x5f\xf7\xbb\xa5\x94\ +\x0f\x29\xa5\x58\x08\xf1\x38\xb2\x3b\x7e\x3e\x78\x28\xde\xf5\xf3\ +\xc1\x74\x23\x80\x2c\x00\xbe\x08\xd0\x89\x13\x09\x06\x20\x52\xa9\ +\x5e\xb5\x77\xef\x67\xdc\xd4\xb4\xd1\x6e\x6a\xda\xa8\x7a\x7a\xba\ +\x15\xb3\x42\x09\xe1\x4c\x26\x4d\xf7\xde\x7b\x4f\x58\x08\x51\x0f\ +\x60\x88\x8f\x4e\x92\x99\x7f\xd7\xd8\xd8\xb8\x5b\xd7\xf5\x0a\x78\ +\x0a\x08\x11\x95\x3c\x0b\xe4\x10\xc8\xd3\xe9\xd2\x08\x08\x35\x78\ +\x70\x25\x25\x93\x49\x79\xe9\xa5\x63\x82\xb3\x67\xcf\x99\x50\x57\ +\x57\x77\x5b\x5d\x5d\xdd\x77\x27\x4f\x9e\x36\x3c\x14\x2a\x63\xdb\ +\xb6\xbc\x47\x44\x06\x20\x5a\x5a\xb6\xd8\x65\x65\x65\x37\x03\xb8\ +\xb5\xc4\x24\xff\xd2\xd9\xd9\xf1\x4a\x24\x22\x84\xe3\x6c\x41\x3f\ +\x4e\x50\x4b\x1d\x82\x58\x78\x0d\x88\x8a\x97\x84\x52\x4a\x7c\xf5\ +\x55\xa7\x1a\x33\x66\x7c\xb8\xaa\x2a\xf6\x98\x10\x5a\x93\x10\xe2\ +\xef\x42\x88\xd7\x02\x81\xc0\x9b\xa3\x47\x8f\xb9\x73\xe0\xc0\x18\ +\x99\xa6\x99\x3f\xab\x02\xa0\xe3\xc7\x8f\xc8\xf9\xf3\xe7\x57\x13\ +\x89\x05\xf0\xaf\x3a\xbb\xa4\x94\x4f\xaf\x5f\xbf\xd6\x1a\x30\x20\ +\x0a\x66\x2e\x3a\x9b\x38\x41\x75\x17\x90\x82\xcf\xc2\xfd\x23\x33\ +\x67\xb7\x1c\x8f\xe4\x4e\x41\x91\x48\x79\x19\x80\x1b\x01\xc4\x90\ +\xad\x56\x41\x00\x97\x13\xd1\x33\x23\x46\x7c\xeb\x8e\x4c\x26\x03\ +\x29\x65\x1e\xe2\xdd\xbb\x3f\xe7\x70\x38\xfc\x3d\xf8\x53\x12\x93\ +\x99\x9f\x5e\xbc\x78\xf1\xfe\x09\x13\x26\x51\x45\x45\x05\x09\x71\ +\x4a\x04\xbc\x92\x4f\x90\xdc\x6c\x89\x8a\x69\x23\x29\xa5\x08\x00\ +\x3e\xfa\x68\x6b\x07\x33\x2f\x06\xd0\xe1\xd1\x89\x11\xd1\x1f\xa6\ +\x4f\x9f\x19\x6f\x69\x79\x9f\x99\x99\x13\x89\x0e\x2c\x5c\xb8\x30\ +\x46\x44\x77\xc3\x9f\xc5\x36\xa5\xd3\xa9\x57\x26\x4d\x1a\x2f\x88\ +\x88\xbe\xfe\xfa\x24\x3b\xe3\xf8\x21\xe0\x77\x8b\x91\x47\x20\xbf\ +\x8c\x38\x2b\xc5\xb3\x14\xc4\x55\x55\x65\x14\x08\x18\x7c\xe8\xd0\ +\xc1\xbf\x31\xf3\xc3\x00\xba\x3d\x7a\x17\x11\xd1\x1f\x17\x2d\xaa\ +\x1b\xbb\x7d\xfb\x16\xde\xb6\x6d\x87\x0c\x04\x02\xb7\x00\xb8\xc6\ +\x67\xe0\xa4\x52\x6a\xf9\xb2\x65\xcb\x3b\xab\xaa\xaa\x09\x00\xd7\ +\xd4\x5c\x48\x0e\xd2\x7e\x08\xe4\x26\x51\xf0\xc9\x8d\x40\x7e\x23\ +\xf3\x43\x80\x99\xa9\xbd\xbd\x97\x0d\xc3\xa0\xe3\xc7\x8f\xa8\xf6\ +\xf6\xb6\x95\xcc\xfc\x0c\x00\xdb\xa3\x3b\x5e\x08\xf1\xc4\xdc\xb9\ +\x77\x47\xef\xbb\xef\xde\x4a\x22\xfa\x29\x8a\x37\x46\x00\x78\xa7\ +\xb7\xb7\xa7\x79\xe6\xcc\x69\x79\x7a\x70\xf4\xe8\x21\xd5\x0f\x02\ +\x7e\x92\x4f\x8e\x7c\x82\x94\x42\x80\x88\x38\x12\x11\x04\x00\x65\ +\x65\x11\xfa\xe4\x93\xed\xb6\x69\x66\xfe\x04\x60\xad\x4f\xc7\x3f\ +\x08\x04\x8c\x79\x65\x65\x91\xeb\x50\xcc\x68\x81\x2c\xd7\x79\xfe\ +\xf9\xe7\x57\xa4\x82\xc1\x50\x3e\x5f\x86\x0c\x19\x26\x4a\x20\xe0\ +\xb7\x74\x72\x08\x90\x1f\x02\x45\x37\x66\xcc\x40\x2a\xd5\x57\x5d\ +\xab\xab\x2f\xa0\xa5\x4b\x97\x25\x95\x52\x8f\x01\xd8\xed\xd1\xd7\ +\x88\xe8\x57\x44\xf4\x18\xfc\x2b\x4f\x73\x32\xd9\xb5\x65\xda\xb4\ +\xc9\xb9\x02\xc2\x00\xc4\xe1\xc3\x25\x11\xe8\xf7\xc2\xc1\x8d\x80\ +\x70\x10\x10\x7e\xca\xca\xb3\x3b\xc4\xe3\xb5\xd4\xd8\xd8\xb8\x87\ +\x99\x9f\x02\x90\xf2\xd8\x5c\x0c\xe0\x6a\x9f\x81\x33\xcc\xea\xaf\ +\x2b\x56\xac\xec\x8e\x44\xca\x0b\xe8\xc1\x90\x21\xc3\x04\x91\xf0\ +\x8b\x76\x6e\xe4\x82\x12\xed\x46\x20\xdf\x89\x83\x80\x77\x23\x23\ +\x00\x5c\x5e\x5e\xc0\x00\x18\x00\x4d\x99\x72\x25\x75\x75\x25\x5e\ +\x45\x96\x2d\x9e\x8e\x7c\x68\x59\x76\xf3\xd4\xa9\x57\xb9\x59\xac\ +\x02\x40\x27\x4e\x1c\x63\x67\x1f\xf0\x4c\xa2\xe0\xfa\xd3\xcb\xc7\ +\x38\x07\x63\x8e\x4e\x97\x44\xa0\xbb\x5b\x16\x45\x20\x1a\xad\xd4\ +\x56\xae\x5c\x95\x54\x4a\x2d\x03\xd0\x7e\x1a\x13\x58\xb3\x64\xc9\ +\x92\xf6\x68\xb4\x12\xf0\xd0\x83\x41\x83\x06\xe7\x96\xaf\x27\x6b\ +\x49\x79\xc7\xc5\x29\xe8\xb4\x1f\xb1\xe1\x58\x2c\xe2\x7b\x57\x59\ +\x5b\x7b\x9d\x9e\x4c\x76\x6d\x01\xf0\xf6\x29\x9c\x3f\x6c\xdb\xf6\ +\xbb\xce\xdf\x45\xdc\x26\x91\xe8\x60\xa0\x18\x01\x27\xa0\x67\x47\ +\xa7\x01\xa6\x52\x74\x3a\x10\x08\xf0\xaa\x55\xab\x33\xcc\xfc\x02\ +\x80\xde\x7e\x26\xb0\xb1\xad\xed\xeb\x7d\x37\xdc\xf0\xed\xdc\xf2\ +\x29\xe0\x36\xe5\xe5\x03\xdc\x51\xee\x8b\xff\xf9\xa0\xd3\x93\x26\ +\x8d\x17\x99\x4c\x7a\x2b\x80\x8f\x4b\x38\x6f\x32\xf3\xba\x17\x5e\ +\x78\xd1\xd2\x34\xcd\xef\x56\x0f\xa6\x69\x02\x3e\x3b\xee\x39\xa7\ +\xd3\x7e\xd1\xab\xaa\xaa\xa6\x65\xcb\x96\xb7\x33\xf3\xbb\xf0\x97\ +\xfd\x96\x65\x6e\x1b\x38\x30\x4c\x80\xff\x39\x22\x7b\x9b\xd7\x17\ +\x4c\x77\xf0\x70\xae\xe8\x34\x4e\x71\x90\x51\x4a\xad\x03\x70\xa0\ +\xd8\x7f\xde\xf0\xf9\xe7\x7b\x8f\x4e\x9a\x34\xa5\x14\xab\x84\xae\ +\xeb\x38\x57\x74\xba\x08\x01\x87\x4e\xfb\x42\x9f\x93\x59\xb3\xae\ +\xd7\x5a\x5b\x77\xee\x54\x4a\xdd\x03\xe0\x4d\x00\xc7\x01\xb4\x01\ +\xf8\xa7\x52\xbc\x7c\xf7\xee\x1d\xec\xd4\x79\x5f\x6e\x90\x4a\xf5\ +\x9e\x33\x3a\x6d\x7a\x94\x0c\x4d\xd3\x82\xfd\x39\x9f\x1b\x48\x4a\ +\x49\xef\xbf\xdf\xbc\x21\x99\x4c\xfc\x44\x4a\x79\xa3\x6d\xdb\xf1\ +\x74\x3a\x3d\xa7\xa5\xa5\xb9\xf5\xb2\xcb\xc6\xf5\xf7\x0e\x81\xde\ +\xde\x1e\xe8\xba\x66\xc0\xc3\x5c\x99\xd9\xe2\xec\x91\xcf\x97\x4e\ +\x17\xdc\x4e\x13\x11\xea\xeb\xeb\x8f\xa2\x2f\x69\x80\x2c\x55\x8e\ +\x03\xd8\xb9\x6f\xdf\x1e\x94\x97\x0f\xe0\x40\x40\x27\x29\x15\x13\ +\x01\x44\x82\xa4\xb4\x39\x10\x08\x50\x3a\x9d\xe1\x70\x38\x44\xcd\ +\xcd\x4d\xc9\xfd\xfb\xbf\xdc\x53\x51\x11\xe6\xea\xea\x98\x08\x06\ +\x83\x68\x6b\x53\x64\x9a\xa6\xf2\xb3\xed\xed\xed\x45\x22\x61\xaa\ +\x86\x86\x86\x1b\x01\x0c\xf6\x38\x79\x94\x88\x10\x8f\xd7\xfa\xc6\ +\xcd\x7b\x3b\x4d\x52\xca\x7f\xeb\xba\xfe\x15\x80\x8b\x1c\x25\x41\ +\x44\x0f\xd4\xd7\xd7\xa7\xa5\xb4\xdf\x92\x52\xa5\x89\x72\x65\x17\ +\xce\x15\xba\x22\x22\xc1\xcc\x8a\x84\x10\x2c\xa5\x22\x4d\x13\xac\ +\x54\xdf\xef\x59\xbd\x6c\xae\x7a\x6d\x35\x4d\x37\x1a\x1a\x1a\xe2\ +\x44\xf4\x10\x0a\xef\xa4\xda\x94\x52\x1f\x95\x8a\x3e\x9c\x07\x8e\ +\xdc\xab\x20\xdb\xb6\x4d\xc3\x87\x5f\xa2\xc5\x62\x83\x96\x02\xf8\ +\x85\xc7\xc0\x74\xd6\x75\x0f\x7c\xaa\x01\xfc\x0f\x1c\xbe\x51\xf3\ +\xb1\x09\x21\xcb\x9f\x82\x1e\xdd\x17\x13\x89\xce\x79\xfb\xf6\xb5\ +\x9a\x86\x11\xf4\xeb\xab\xe0\x6e\x94\x74\x5d\xe7\xf5\xeb\x5f\xb6\ +\xe6\xce\xbd\xfb\x59\x21\xc4\x0c\x00\x97\xbb\x94\x0d\xb8\xae\x3b\ +\xce\x83\x1c\x50\x4a\x35\xae\x5a\xb5\xda\x7b\xb1\xeb\x46\x80\xb4\ +\x91\x23\x47\xc0\x35\x09\x31\x78\xf0\x45\xf8\xe0\x83\x2d\x27\x47\ +\x8f\x1e\xb3\x97\x88\xae\x45\xf6\xfc\x7b\xbe\xe5\x20\x33\xd7\xbf\ +\xf5\xd6\xba\x8d\x57\x5e\x39\x41\xf3\x39\xd4\xe4\x11\xd4\x46\x8e\ +\x1c\xe1\x7e\x3c\x56\x44\x44\x15\x15\x51\xb4\xb6\xee\x3c\x30\x7c\ +\xf8\xc8\x4d\x44\x14\x45\x16\xde\xf0\x79\x70\x3c\x01\xe0\x0d\xa5\ +\xd4\xaf\x37\x6f\x6e\xd9\x50\x5d\x1d\x13\x42\x14\xef\xab\x70\x2d\ +\xc3\xdc\x2b\x65\x11\x3f\x61\x66\x3e\x79\xf2\x04\x5f\x7b\xed\x75\ +\xe1\x48\x24\x72\x05\x91\xb8\x86\x88\x86\x02\x1c\x02\xf2\x57\xea\ +\x9c\xcf\xcc\xc2\x96\x00\x56\x7d\x07\x26\x16\x2e\x1b\x3f\x5b\x93\ +\x08\x47\x94\x52\x1f\xf4\xf4\xf4\x7c\xbc\x62\xc5\xca\xde\x59\xb3\ +\xae\xef\x37\xf2\x4e\xc0\x25\xb9\xd6\x97\x6f\x9d\xb7\x6d\x9b\x37\ +\x6e\xdc\xa4\x00\xf0\xa8\x51\xc3\x84\x65\x59\x1c\x0e\x87\x45\x3a\ +\x9d\x56\xa1\x50\x48\xa4\xd3\x69\x15\x0c\x06\x85\x65\x59\x2a\x10\ +\x08\x90\x94\x12\x44\x04\x22\x82\x52\x0a\x9a\xa6\xc1\xb2\x2c\x18\ +\x86\x81\x74\x3a\xc3\xa1\x50\xb0\xc0\x36\x14\x0a\x89\x03\x07\x0e\ +\x2b\xd3\xb4\x30\x6e\xdc\x68\x0c\x1c\x38\x50\x84\x42\xe1\x52\x55\ +\xc7\xcb\xc7\xe0\x7e\x27\x3e\x17\xef\xbf\x7e\x7d\x94\x7a\xa9\x39\ +\xdb\x77\x67\x01\x40\x0a\x1f\x05\x3f\xe3\xfe\x3a\x39\x53\xe7\xc5\ +\x59\x8e\x5b\x70\xa0\x01\xfa\x48\x5c\xee\xff\x13\x72\x2d\x7b\xbe\ +\x01\xd9\xf7\x5a\x77\xfb\x8d\xd9\xfe\x17\x5a\x62\x2e\xda\x22\x1b\ +\xb0\x80\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\x74\x65\x3a\x63\ +\x72\x65\x61\x74\x65\x00\x32\x30\x31\x37\x2d\x31\x30\x2d\x33\x31\ +\x54\x31\x32\x3a\x30\x35\x3a\x30\x31\x2b\x30\x38\x3a\x30\x30\xff\ +\x8c\x2c\xfe\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\x74\x65\x3a\ +\x6d\x6f\x64\x69\x66\x79\x00\x32\x30\x31\x37\x2d\x31\x30\x2d\x33\ +\x31\x54\x31\x32\x3a\x30\x35\x3a\x30\x31\x2b\x30\x38\x3a\x30\x30\ +\x8e\xd1\x94\x42\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\ +\x00\x00\x1e\xc4\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\xca\x00\x00\x00\xc8\x08\x06\x00\x00\x00\xa9\xad\x7e\xa3\ +\x00\x00\x1e\x8b\x49\x44\x41\x54\x78\x5e\xed\x5d\x09\x98\x24\x45\ +\x95\x7e\x2f\xbb\xe7\x00\x04\x39\x46\xf0\xc0\x15\xd6\x71\xec\xae\ +\x78\x59\xc3\xd8\xa2\xce\x02\xae\x80\x8a\x22\x2a\x2a\x88\xe2\x2a\ +\x20\xae\xb8\x82\x3a\xb2\x1c\xab\xc0\x2a\x82\x17\x28\x78\xc1\xee\ +\xb2\x2b\x03\xa2\x78\x20\xa8\xdc\x28\x2a\x2e\x22\x2a\x0c\x34\x95\ +\x2f\xaa\x67\x70\x64\xd9\x15\x16\xd0\x05\xc1\xf1\x98\x69\xbb\xf2\ +\xed\x17\x6d\xf5\x7c\x3d\xd3\x47\x65\x64\x66\x64\x66\x55\x45\x7c\ +\x5f\x7f\xa3\xf4\x7b\xff\x7b\xf1\xbf\xfa\xbb\xf2\x88\x78\x81\x50\ +\xd1\x51\xaf\xd7\x77\x17\x91\x95\x71\x1c\xbf\x14\x11\x9f\x07\x00\ +\xbb\xb5\x7f\x7e\x05\x00\x0d\x44\xfc\x85\x88\xdc\xc0\xcc\xb7\x54\ +\x74\x0a\x3e\xad\x59\x18\xd8\xaa\xae\x2b\x44\xe4\x29\x88\x68\x7e\ +\x9e\x10\x91\x35\x88\x38\x26\x22\x37\x33\xf3\xf7\xaa\x44\x20\x56\ +\x29\x19\x93\xcb\xb2\x65\xcb\x96\x2c\x5a\xb4\xe8\x64\x11\x39\x25\ +\x61\x6e\x46\x28\x97\x31\xf3\xc5\x09\xed\xbd\x59\x09\x0c\xd8\xd6\ +\x55\x44\xee\x46\xc4\xef\x30\xf3\x99\x25\xa4\x3b\x23\x64\xa5\x84\ +\xa2\x94\x7a\x33\x22\x7e\x08\x00\x9e\x6b\x4b\x8e\x88\x7c\x07\x00\ +\xce\xd5\x5a\xdf\x66\xeb\xeb\xed\xdd\x32\x10\x86\xe1\xe1\x22\x72\ +\x56\x9a\xba\x02\x80\xf9\x43\x78\x66\xd9\x57\x0e\x95\x11\x0a\x11\ +\xbd\x07\x00\x3e\x97\xb5\x64\x88\xf8\xc6\x28\x8a\xae\xc8\x8a\xe3\ +\xfd\xf3\x61\xa0\x2d\x92\x6f\xe4\x80\x76\x10\x33\x7f\x37\x07\x9c\ +\x54\x10\x95\x10\x0a\x11\x99\x6f\x91\x0f\xa7\x9a\xc1\x2c\x4e\x5e\ +\x2c\x79\x31\x99\x0d\x87\x88\x5e\x0f\x00\x57\x66\x43\xd9\xec\xfd\ +\x88\x88\xbc\x5a\x6b\x7d\x47\x4e\x78\x56\x30\xa5\x0b\x85\x88\x5e\ +\x02\x00\x3f\xb4\xca\xba\xb3\xf1\xff\x05\x41\xb0\x6f\xa3\xd1\x58\ +\xd7\xd9\xd4\x5b\xb8\x60\x80\x88\x86\x01\xe0\x06\x00\x78\x56\x8e\ +\xf8\xa3\x83\x83\x83\xfb\x8f\x8e\x8e\x3e\x9e\x23\x66\x22\xa8\x2a\ +\x08\xc5\x88\xc4\x88\x25\xef\x71\x31\x33\x1f\x9b\x37\xa8\xc7\x4b\ +\xc6\x00\x11\xdd\x08\x00\x07\x25\xb3\x4e\x6e\x85\x88\x9f\x89\xa2\ +\xe8\xfd\xc9\x3d\xf2\xb1\x2c\x55\x28\x61\x18\xbe\x53\x44\xfe\x2d\ +\x9f\xa9\xcc\x44\x41\xc4\x57\x45\x51\x74\xbd\x2b\x7c\x8f\x3b\x3b\ +\x03\x39\xde\x97\xcc\x1a\x00\x11\x0f\x8e\xa2\xc8\x7c\x5b\x15\x36\ +\x4a\x15\x0a\x11\xdd\x09\x00\x23\xae\x66\x2b\x22\x97\x68\xad\x8f\ +\x71\x85\xef\x71\x67\x67\x80\x88\xcc\xcd\xfb\xe1\x0e\xf9\xf9\x3c\ +\x33\xbf\xd7\x21\xfe\x0c\xe8\x52\x84\x52\xaf\xd7\xf7\x8c\xe3\xf8\ +\x90\x3c\x9e\x72\x75\x20\xeb\x0f\xcc\xfc\xa4\x22\x09\xed\xf7\x58\ +\x44\xf4\x4c\x00\xf8\x1f\xc7\x3c\xac\x1f\x18\x18\x78\xc9\x3d\xf7\ +\xdc\xf3\xa0\xe3\x38\x9b\xe1\x0b\x13\x4a\xad\x56\x7b\x6a\x10\x04\ +\xaf\x02\x00\x23\x10\xf3\xef\x82\x82\x26\x59\xea\x63\xc5\x82\xe6\ +\x58\x99\x30\x4a\xa9\x37\x21\xe2\x57\x0b\x48\xe8\x62\x11\xf9\x7e\ +\x10\x04\x37\x44\x51\xf4\x5b\xd7\xf1\x9c\x0a\x65\xe9\xd2\xa5\x3b\ +\x2c\x5a\xb4\xe8\x10\x23\x10\x11\x31\x02\xd9\xc1\xf5\x84\x66\xc1\ +\x7f\x1b\x33\x5f\x56\x42\xdc\xbe\x0c\xa9\x94\xfa\x3c\x22\x9e\x50\ +\xe0\xe4\x1b\x6d\xc1\x5c\x1f\x45\xd1\xcd\xae\xe2\xe6\x2e\x94\x91\ +\x91\x91\x05\xe3\xe3\xe3\x53\xc2\x30\xdf\x1c\x4f\x75\x95\x7c\x42\ +\xdc\x93\x99\xf9\x53\x09\x6d\xbd\x59\x46\x06\x88\xe8\x26\x00\x78\ +\x79\x46\x98\x54\xee\x22\x72\x2b\x00\x5c\x0b\x00\x57\x69\xad\xd7\ +\xa7\x02\x99\xc3\x29\x37\xa1\x84\x61\x38\x22\x22\x47\xb5\x2f\xad\ +\xf6\xcc\x33\xc9\x8c\x58\xa7\x30\xf3\xb9\x19\x31\xbc\x7b\x42\x06\ +\x88\xe8\x4b\x00\xf0\xd6\x84\xe6\xae\xcc\xfe\x04\x00\x57\x9b\x4b\ +\xc0\x28\x8a\xcc\xd2\xa6\xcc\x23\xb3\x50\x8c\x40\xe2\x38\x7e\x27\ +\x22\xbe\x33\x73\x36\x0e\x00\xe2\x38\x3e\xa6\xd9\x6c\x5e\xe2\x00\ +\xda\x43\xce\xc2\x00\x11\x99\x3f\x4a\x27\x55\x88\x1c\xf3\x9e\x6e\ +\x75\xd6\xcb\xef\xd4\x42\x19\x1a\x1a\xda\x63\x60\x60\xe0\x03\x55\ +\x15\xc8\x54\xa1\xfc\xbb\x94\x62\x3f\xb2\xae\xdf\x8d\x65\x98\xcd\ +\x9d\x22\x72\xba\xd6\xda\x5c\x1a\x5a\x8f\x54\x42\xa9\xd5\x6a\x47\ +\x9b\x55\xbe\x88\xb8\x87\x75\xc4\x82\x1d\x82\x20\x78\x66\xa3\xd1\ +\x78\xa0\xe0\xb0\x7d\x1b\x4e\x29\xb5\x0f\x22\xfe\xb8\xc2\x04\x7c\ +\x90\x99\x3f\x6e\x9b\x9f\x95\x50\xda\xdf\x22\x46\x20\x47\xdb\x06\ +\x2a\xc9\x7e\x0d\x33\x3f\xbf\xa4\xd8\x7d\x19\xd6\xec\x3b\x59\xb8\ +\x70\xe1\x6f\xaa\x3c\x79\x44\xfc\x26\x00\x9c\x1a\x45\xd1\x7d\x49\ +\xf3\x4c\x2c\x14\xb3\x78\xd1\x2c\x37\x41\xc4\x65\x49\xc1\xcb\xb6\ +\x13\x91\xf3\xb5\xd6\x27\x96\x9d\x47\xbf\xc5\x0f\xc3\xf0\x93\x16\ +\x1b\xef\x4a\xa1\x47\x44\xee\x45\xc4\xe3\x92\xee\x73\x49\x24\x94\ +\xf6\x0a\xdf\xeb\x00\x60\xdb\x52\x66\x95\x22\xa8\x88\xdc\xdf\x6a\ +\xb5\xf6\x5f\xbb\x76\xed\xfd\x29\xdc\xbd\x4b\x06\x06\xda\xdf\x2a\ +\xe6\xf2\xcb\x7a\x03\x5e\x86\xb0\x69\x5c\xff\x68\x5e\x7e\x27\x11\ +\x4b\x47\xa1\x38\x5a\x06\x9f\x66\x52\x56\x3e\xfe\x69\x97\x15\x5d\ +\xb9\x1b\x9b\xfb\xd8\x20\x08\x56\xe7\x0e\xec\x06\x70\xff\x4e\x62\ +\x99\x57\x28\xed\x35\x59\x89\xaf\xe3\xdc\xcc\x21\x15\xea\xa7\x98\ +\xf9\xe4\x54\x9e\xde\x29\x37\x06\x94\x52\xab\xbb\xe5\x7e\x56\x44\ +\x76\xd1\x5a\x3f\x36\xd7\xe4\xe7\x14\x4a\xfb\xeb\xd3\x5c\xb6\x6c\ +\x97\x1b\x73\xb3\x03\x99\x4b\xba\xcb\x44\xe4\x23\x79\xdc\xff\xf8\ +\x15\xc3\x8e\xab\x65\x09\x4f\x44\x57\x03\xc0\xab\x2d\xdd\xca\x30\ +\x9f\xf7\xc1\xcf\xac\x42\x59\xba\x74\xe9\xa2\xc5\x8b\x17\x5f\x05\ +\x00\x07\x3b\xca\xf8\x2e\x11\xb9\x2c\x8e\xe3\xaf\x8f\x8d\x8d\x3d\ +\x34\x15\x23\xeb\xf2\xec\xb2\x36\xf5\x38\xe2\xa8\x67\x60\xc3\x30\ +\x3c\x4e\x44\xfe\x35\xc3\x84\x4e\x0a\x82\xe0\xb2\x56\xab\x75\x24\ +\x22\x1e\x09\x00\x7b\x67\xc0\x9a\xcf\xf5\xc3\x73\x75\x7d\x99\x55\ +\x28\x44\xf4\x45\x00\x78\x7b\xce\xc9\x18\x41\x5c\x6e\xd6\xe1\x30\ +\xf3\x4f\xe6\xc2\x36\xfb\xe7\xcd\x4b\x4c\x11\x79\xba\x45\xfc\x3b\ +\x11\xf1\xa3\x51\x14\x7d\xdb\xc2\xc7\x9b\x16\xc8\x00\x11\x99\x45\ +\xb1\x66\xf5\x86\xcd\xb7\xcb\x35\x00\xf0\x89\xad\x3f\x2f\x4a\xa9\ +\xe5\x88\x78\xa8\x88\x18\xe1\xe4\xfa\x14\x16\x11\xff\x2e\x8a\xa2\ +\xaf\x6c\x4d\xcd\x0c\xa1\xd4\xeb\xf5\xd7\xc4\x71\x9c\xcb\xfa\x98\ +\x76\xb0\xab\x10\xf1\xca\x0d\x1b\x36\x5c\x75\xff\xfd\xf7\x6f\x4c\ +\x52\x9b\xe1\xe1\xe1\xa7\x0d\x0c\x0c\x18\xb1\x1c\x88\x88\xfb\xcd\ +\xe3\x73\x93\x88\x7c\x49\x6b\x6d\x04\xe8\x47\x17\x30\xd0\x16\x8c\ +\xd9\xd4\x75\x00\x00\xec\x3e\x4b\xca\x66\x8f\xc9\x5d\x00\x70\x11\ +\x33\x9b\x05\x8e\xf3\x8e\x30\x0c\xcd\x55\xcf\xa1\x71\x1c\xbf\x0e\ +\x11\x97\x74\xb2\x4f\xf0\x7b\x8e\xe3\x78\x65\xb3\xd9\xfc\xfd\x74\ +\xdb\x19\x42\x21\x22\xf3\x58\x6f\x9f\x04\x80\xf3\x9a\x20\xe2\xa5\ +\x71\x1c\x5f\x90\xb5\x6b\xc6\x5e\x7b\xed\xb5\xe3\xc4\xc4\xc4\xde\ +\xa6\x9b\x60\x1c\xc7\xbb\x22\xe2\x02\x44\xd4\x7f\xfe\xf3\x9f\x9b\ +\xfe\xd1\x6f\xd6\x2a\x95\xeb\x5f\xab\xd5\xf6\x0a\x82\x60\xc7\xa9\ +\x2c\xe2\x38\x5e\xdb\x6c\x36\x1f\x4e\x93\x95\xe9\x40\x19\xc7\xf1\ +\x2a\x00\x30\x3f\x03\x69\x30\xa6\x7c\x44\xe4\x0c\xad\xf5\xd9\x73\ +\x0a\x45\x29\x75\x0a\x22\x7e\x32\x4b\x10\xd3\x9e\x46\x44\x8c\x40\ +\xf2\xee\xac\x92\x31\x2d\xef\xde\x0f\x0c\x28\xa5\xcc\xfd\xcb\xaa\ +\xf6\xbd\x4c\xda\x29\x3f\xda\x6a\xb5\x56\x8e\x8d\x8d\xfd\x62\x0a\ +\x60\xf3\x37\x4a\xad\x56\x7b\x52\x10\x04\x9c\xb1\xbd\xcc\x11\xcc\ +\x9c\x47\xb3\xb3\xb4\x13\xf4\x7e\x9e\x81\x49\x06\x88\xe8\x08\x00\ +\xf8\x5a\x06\x3a\x2e\x64\xe6\xe3\x67\x08\x85\x88\x4c\x6b\x9f\xff\ +\xc8\x00\x7c\xac\xef\xff\x9b\x81\x3d\xef\x9a\x3b\x03\x61\x18\x9e\ +\x20\x22\x9f\x4f\x09\xfc\xfb\x38\x8e\x55\xb3\xd9\x9c\xdc\xff\xbf\ +\xf9\x1b\x85\x88\x4c\xf7\xf0\x97\xa6\x04\x5d\xc5\xcc\x9f\x4d\xe9\ +\xeb\xdd\x3c\x03\xce\x18\x50\x4a\x99\xf7\x73\x67\xa4\x09\x20\x22\ +\x27\x6a\xad\xcf\xdf\x2c\x94\x30\x0c\x5f\x2c\x22\x3f\x4a\x09\x36\ +\xe3\xc6\x27\x0d\x8e\xf7\xf1\x0c\xb8\x62\x20\x0c\xc3\x8b\x44\xe4\ +\xef\x53\xe0\xdf\xc6\xcc\xfb\x6e\x16\x8a\x52\xea\x3c\x44\x4c\xd3\ +\x7d\xef\xa7\xcc\xbc\x32\x45\x02\xde\xc5\x33\x50\x28\x03\x61\x18\ +\x9a\x97\xdc\x2b\x6c\x83\x8a\xc8\x01\xe6\xc1\xd4\xe4\xa5\x17\x11\ +\x99\x17\x80\x69\x3e\xf0\x6f\x65\xe6\x2f\xdb\x06\xf7\xf6\x9e\x81\ +\xa2\x19\xc8\x70\xbf\xf2\x59\x66\x5e\x85\xa6\xa5\xd0\xe2\xc5\x8b\ +\x9f\x48\x91\xb8\x39\x15\xe9\x65\x29\xfc\xbc\x8b\x67\xa0\x70\x06\ +\xea\xf5\xfa\x76\xad\x56\xeb\xae\x14\x6f\xf2\x1b\xcc\xbc\x1c\x95\ +\x52\x07\x21\xa2\x69\xa8\x6c\x35\x10\xf1\x75\x7e\xc9\x88\x15\x65\ +\xde\xb8\x64\x06\xc2\x30\x3c\x55\x44\x3e\x61\x9b\x06\x22\x0e\x63\ +\xca\xb3\x49\x7e\xc9\xcc\x4b\x6d\x03\x7a\x7b\xcf\x40\x99\x0c\xd4\ +\xeb\xf5\x5d\xe3\x38\x36\xcb\x63\x9e\x61\x93\x87\x88\x9c\x60\x84\ +\x92\x66\x01\xe4\xb7\x98\xd9\x1c\x12\xe3\x87\x67\xa0\xab\x18\x50\ +\x4a\x5d\x81\x88\x87\x59\x26\xfd\x2d\x23\x94\x34\xef\x4f\xe6\x5c\ +\x8e\x6c\x99\x80\x37\xf7\x0c\x14\xca\x00\x11\x9d\x03\x00\xb6\x9b\ +\xfa\xee\x30\xf7\x28\xeb\x6c\x6f\x70\x44\xe4\x15\x69\xfb\x23\x15\ +\xca\x8a\x0f\xe6\x19\xd8\x8a\x01\x22\xfa\x07\x00\xb8\xd0\x92\x98\ +\x75\xe6\x1b\xc5\xb4\x9f\x5c\x6c\xe3\xb8\x71\xe3\xc6\x27\xaf\x5f\ +\xbf\xfe\x77\x36\x3e\xde\xd6\x33\x50\x05\x06\xea\xf5\xfa\x81\x71\ +\x1c\xdb\x36\xf3\x7e\xc8\x08\x45\x6c\x27\xc0\xcc\x1d\x9b\x52\xd8\ +\x62\xf6\xba\x3d\x11\x99\x63\xa0\xcd\xf2\x6f\xf3\x33\x38\xf5\x2f\ +\x22\x0e\x88\xc8\xd4\xff\x9f\xfc\xdd\x56\xff\x6d\xf2\x77\x5b\xfd\ +\xb7\xd3\xd3\x34\x71\xeb\x75\x8e\x93\xcc\x2f\xe5\xf9\x2d\x7f\xf0\ +\x42\x49\xc2\x6e\x46\x9b\x94\x7f\xc5\xe6\x8b\xba\x81\x99\xcb\x38\ +\x42\x23\x23\x13\xd5\x70\x4f\xf3\xe5\xe0\x85\x52\x40\xed\x5c\x1c\ +\xfc\x29\x22\x47\x6b\xad\x2f\x2d\x20\xfd\x9e\x0b\xe1\x85\x52\xc1\ +\x92\xb6\xb7\x35\xff\xaf\x83\xd4\xd6\x31\xf3\x90\x03\xdc\x9e\x87\ +\xf4\x42\xa9\x60\x89\x33\x2c\x38\xed\x38\x1b\x44\x7c\x99\xcb\x53\ +\xa6\x3a\x26\xd0\xa5\x06\x5e\x28\x15\x2c\x5c\x9a\xa2\x24\x9d\x06\ +\x22\xfe\x20\x8a\xa2\x03\x93\xda\x7b\xbb\xbf\x30\x90\xa6\x26\xfe\ +\x1e\xc5\xe1\xa7\x47\x29\xf5\x0e\x44\xfc\x77\x87\x21\x40\x44\x94\ +\xd6\xba\xe9\x32\x46\xaf\x61\x7b\xa1\x54\xac\xa2\x69\x5e\xe6\xa6\ +\x98\xc2\x97\x99\xb9\xec\xa3\xe0\x52\xa4\x5d\x9e\x8b\x17\x4a\x79\ +\xdc\xcf\x88\x4c\x44\x7f\x03\x00\xb7\x15\x91\xd2\xe0\xe0\xe0\x4e\ +\xa3\xa3\xa3\x8f\x17\x11\xab\x17\x62\x78\xa1\x54\xa8\x8a\x44\xf4\ +\x2d\xd3\x98\xad\x88\x94\x10\xf1\x9c\x28\x8a\x4e\x2d\x22\x56\x2f\ +\xc4\xf0\x42\xa9\x48\x15\xdb\x4d\xfb\x7e\x5b\x64\x3a\x7e\xb5\x44\ +\x72\xb6\xbd\x50\x92\x73\xe5\xd4\x92\x88\x3e\x0a\x00\x1f\x74\x1a\ +\x64\x26\xf8\xfb\x98\xf9\x73\x05\xc7\xec\xca\x70\x5e\x28\x15\x29\ +\x5b\x9a\x85\xa6\x39\xa4\xfe\x30\x33\x3f\x2d\x07\x9c\x9e\x87\xf0\ +\x42\xa9\x40\x89\xc3\x30\x7c\x8b\x88\x94\xd2\x70\x23\x08\x82\xc3\ +\x1b\x8d\x86\x39\xc8\xd3\x8f\x79\x18\xf0\x42\xa9\xc0\xc7\x83\x88\ +\x46\x01\x60\x79\x49\xa9\xdc\xc5\xcc\x23\x25\xc5\xee\x9a\xb0\x5e\ +\x28\x25\x97\xaa\x56\xab\xad\x08\x82\xc0\xec\xc9\x2e\x73\xec\x33\ +\xdf\xf9\x33\x65\x26\x56\x95\xd8\x5e\x28\x25\x57\x22\x0c\xc3\xcb\ +\x45\xe4\xcd\x25\xa7\x71\x2d\x33\xdb\x1c\xd6\x53\x72\xba\xc5\x87\ +\xf7\x42\x29\x9e\xf3\xcd\x11\xdb\xc7\xf9\x25\x3a\x28\xc9\x75\x9a\ +\x83\x83\x83\x7b\x8e\x8e\x8e\xfa\x63\xc3\xe7\x20\xda\x0b\xc5\xf5\ +\x27\x70\x1e\x7c\xa5\xd4\xe9\x88\x78\x56\x89\x29\x4c\x0f\xfd\x6f\ +\xcc\xfc\xae\x8a\xe4\x52\xb9\x34\xbc\x50\x4a\x2c\x09\x11\x3d\x0a\ +\x00\x3b\x97\x98\xc2\x16\xa1\x1f\x7f\xfc\xf1\x6d\x1f\x78\xe0\x01\ +\xd3\x0f\xc1\x8f\xad\x18\xf0\x42\x29\xe9\x23\x41\x44\xa6\xc7\xd9\ +\x95\x25\x85\x9f\x35\x2c\x22\x7e\x28\x8a\xa2\x8f\x54\x29\xa7\xaa\ +\xe4\xe2\x85\x52\x52\x25\x88\xe8\x76\x00\x78\x51\x49\xe1\xe7\x0a\ +\xbb\x91\x99\xb7\xa9\x58\x4e\x95\x48\xc7\x0b\xa5\x84\x32\x84\x61\ +\x38\x24\x22\x63\x25\x84\xee\x18\xd2\x9c\x09\xa2\xb5\xce\x72\x8a\ +\x5a\xc7\x18\xdd\x68\xe0\x85\x52\x42\xd5\x52\xb6\xa4\x2d\x2a\xd3\ +\xfb\x98\xf9\xd9\x45\x05\xeb\x96\x38\x5e\x28\x25\x54\x2a\x0d\xe9\ +\x45\xa6\x89\x88\xaf\x8a\xa2\xe8\xfa\x22\x63\x56\x3d\x56\x9a\x9a\ +\xf9\xad\xc0\x19\xaa\x4a\x44\xff\x08\x00\x9f\xca\x00\xe1\xdc\x15\ +\x11\x6f\x8d\xa2\xe8\xc5\xce\x03\x75\x51\x00\x2f\x94\x82\x8b\x45\ +\x44\xbf\x02\x80\xdd\x0b\x0e\x6b\x1d\x2e\x8e\xe3\x15\xcd\x66\xd3\ +\xac\x41\xf3\xc3\x37\x97\x28\xf6\x33\x10\x86\xe1\x2b\x45\xa4\x5b\ +\x2e\x69\xbe\xce\xcc\x6f\x2a\x96\xa1\xea\x46\xf3\xdf\x28\x05\xd6\ +\x86\x88\x7e\x00\x00\xfb\x17\x18\x32\x53\xa8\x56\xab\xf5\xf4\xb1\ +\xb1\xb1\x87\x32\x81\xf4\x88\xb3\x17\x4a\x41\x85\x1c\x1e\x1e\x7e\ +\xd6\xc0\xc0\x40\x57\xad\xa5\x12\x91\xf3\xb5\xd6\x27\x16\x44\x51\ +\xa5\xc3\x78\xa1\x14\x54\x9e\x30\x0c\xbf\x20\x22\xc7\x17\x14\x2e\ +\xb7\x30\xcc\x6c\xba\xe5\xc7\xb9\x01\x76\x29\x90\x17\x4a\x41\x85\ +\x23\x22\xf3\x61\xcb\xfd\xe8\x0b\x44\xfc\x66\x1c\xc7\xe3\x88\x78\ +\xa4\xa3\xa9\x9c\xcc\xcc\x95\x7e\x4a\xe7\x68\xde\x5b\xc0\x7a\xa1\ +\x14\xc0\xb2\x52\xea\xdd\x88\x78\x81\xa3\x50\x2f\x47\xc4\x71\x11\ +\x31\x67\xa9\xb8\x18\x8f\x31\xf3\x2e\x2e\x80\xbb\x09\xd3\x0b\xa5\ +\x80\x6a\x11\xd1\xbd\x00\xf0\x1c\x07\xa1\x46\x99\x79\x85\xc1\x55\ +\x4a\xdd\x8c\x88\x4e\x7a\x0a\x8b\xc8\x91\x5a\xeb\xaf\x3a\xc8\xbf\ +\x6b\x20\xbd\x50\x1c\x97\x8a\x88\x5e\x02\x00\x3f\x74\x14\xe6\xdd\ +\xcc\xfc\x2f\x06\x9b\x88\xde\x08\x00\x5f\x77\x14\x27\x62\xe6\xba\ +\x23\xec\xae\x80\xf5\x42\x71\x5c\x26\x22\xba\x0e\x00\x0e\x76\x10\ +\xe6\xf7\xcc\xbc\x23\x00\xb4\xa6\xb0\x89\x28\x32\x9a\x71\x10\xcb\ +\x34\xf6\x3e\x40\x6b\xed\x4a\xf0\x2e\x52\xce\x15\xd3\x0b\x25\x57\ +\x3a\xb7\x04\xab\xd7\xeb\xbb\xc6\x71\xfc\x88\x8b\x10\x22\x72\x9e\ +\xd6\xda\x2c\x87\xd9\x3c\x88\xe8\x3d\x00\xe0\xaa\xa1\xdd\x4d\xcc\ +\xfc\x0a\x17\x73\xe9\x06\x4c\x2f\x14\x87\x55\x22\xa2\x73\x01\xe0\ +\x24\x17\x21\x82\x20\x18\x6a\x34\x1a\xeb\xa6\x63\x8f\x8c\x8c\x2c\ +\xd8\xb4\x69\xd3\x83\x00\xf0\x14\x17\x31\x01\xa0\xc6\xcc\x95\xdc\ +\x1e\xe0\x68\xbe\xd3\xff\x08\x59\x1f\xf0\xeb\x17\x45\x26\xac\x0a\ +\x11\xfd\x1e\x00\xb6\x4b\x68\x9e\xd8\x0c\x11\xaf\x8e\xa2\xe8\xb5\ +\xb3\x39\x10\xd1\xd9\x00\x70\x5a\x62\x30\x3b\xc3\xd5\xcc\xfc\x76\ +\x3b\x97\xde\xb0\xf6\xdf\x28\x8e\xea\x18\x86\xe1\x31\x22\x72\xb1\ +\x23\xf8\x43\x98\xd9\xdc\xfb\xcc\x18\x29\x8f\x7a\x4e\x9c\xa6\x88\ +\xec\xa2\xb5\x7e\x2c\xb1\x43\x8f\x18\x7a\xa1\x38\x2a\xa4\xc3\xee\ +\x8f\x4d\x66\x56\xf3\xa5\x4d\x44\xe6\xc4\xae\x77\xb8\x98\x1a\x22\ +\x9e\x1d\x45\xd1\x19\x2e\xb0\xab\x8c\xe9\x85\xe2\xa0\x3a\xf5\x7a\ +\xfd\x45\x71\x1c\x9b\x3d\xf1\x2e\xc6\x2a\x66\xfe\x6c\x07\xa1\x3c\ +\x1f\x00\xee\x70\x11\x1c\x11\x5b\x51\x14\x0d\xba\xc0\xae\x32\xa6\ +\x17\x8a\x83\xea\x84\x61\x78\x85\x88\x1c\xe6\x00\x7a\x7c\xfb\xed\ +\xb7\xdf\xf1\xf6\xdb\x6f\xef\xd8\x52\x88\x88\xae\x06\x00\x57\xdd\ +\x1f\x37\xbf\xbf\x71\x30\xc7\x4a\x42\x7a\xa1\xe4\x5c\x96\xa5\x4b\ +\x97\xee\xb0\x78\xf1\xe2\x27\x72\x86\x9d\x84\x13\x91\x2f\x68\xad\ +\xcd\x23\xe0\x8e\x83\x88\x0e\x01\x80\x6b\x3a\x1a\xa6\x33\xf8\x15\ +\x33\xff\x55\x3a\xd7\xee\xf4\xf2\x42\xc9\xb9\x6e\x4a\xa9\xb3\x10\ +\xf1\xf4\x9c\x61\x27\xe1\x10\xb1\x1e\x45\x91\x79\xa9\x98\x68\x10\ +\xd1\xcf\x00\xe0\x05\x89\x8c\xed\x8d\x5e\xcf\xcc\xe6\x28\xbd\xbe\ +\x18\x5e\x28\x39\x97\x59\x29\xf5\x1b\x44\x5c\x92\x33\xac\x11\xc9\ +\x8d\x51\x14\xbd\xd2\x06\x97\x88\x8e\x05\x00\x27\xad\x87\x44\xe4\ +\x67\x5a\xeb\xaa\xf5\x25\xb3\xa1\xc7\xca\xd6\x0b\xc5\x8a\xae\xf9\ +\x8d\x95\x52\x6f\x46\xc4\xcb\x73\x84\x9c\x0e\xf5\x06\x66\xbe\xca\ +\x16\x9b\x88\xcc\x66\xb1\x67\xd9\xfa\x25\xb1\x47\xc4\xbf\x89\xa2\ +\xc8\xd5\x43\x8b\x24\x29\x14\x66\xe3\x85\x92\x23\xd5\x44\xf4\x13\ +\x00\x58\x99\x23\xe4\x14\xd4\x7a\x66\x4e\xb5\xfa\x98\x88\xcc\xb9\ +\x90\xe6\x7c\x48\x17\xe3\x2a\x66\x7e\x83\x0b\xe0\xaa\x61\x7a\xa1\ +\xe4\x54\x11\xa5\xd4\x72\x44\x74\xd2\xb5\x44\x44\x4e\xd5\x5a\x9f\ +\x93\x26\xd5\xf6\xc3\x05\xb3\xde\x6c\x71\x1a\xff\x4e\x3e\x88\xf8\ +\xec\x28\x8a\xee\xeb\x64\xd7\xed\xbf\xf7\x42\xc9\xa9\x82\x44\x74\ +\x29\x00\xbc\x2d\x27\xb8\xe9\x30\x32\x38\x38\xb8\xf3\xe8\xe8\xe8\ +\xe3\x69\xb1\x89\xc8\xbc\x77\x79\x6f\x5a\xff\xf9\xfc\x6c\x9e\xc4\ +\xb9\x88\x5f\x14\xa6\x17\x4a\x0e\x4c\xb7\x17\x23\x8e\xe7\x00\x35\ +\x03\x42\x44\x2e\xd2\x5a\x1f\x97\x05\x7b\xf9\xf2\xe5\xcb\x5a\xad\ +\xd6\x16\x0b\x28\xb3\xe0\x6d\xed\xbb\x68\xd1\xa2\xed\xd6\xac\x59\ +\xf3\xc7\x3c\x31\xab\x86\xe5\x85\x92\x43\x45\x1c\xdf\x07\xec\xcd\ +\xcc\x77\x66\x4d\x93\x88\xcc\xa6\x2e\xb3\xb9\xcb\xc5\xf8\x20\x33\ +\x7f\xdc\x05\x70\x55\x30\xbd\x50\x72\xa8\x04\x11\xfd\x37\x00\xe4\ +\xfe\x02\x0e\x11\x7f\x10\x45\x51\x2e\xdb\x7b\xc3\x30\x7c\xb1\x88\ +\xfc\x28\x87\xe9\xce\x06\xb1\x81\x99\x77\x70\x84\x5d\x09\x58\x2f\ +\x94\x8c\x65\x08\xc3\xf0\x50\x11\x71\xf2\xe2\xcd\x1c\x82\xaa\xb5\ +\xfe\x5a\xc6\x14\x37\xbb\x13\x91\x69\x40\xf1\xb7\x79\xe1\x4d\xc7\ +\x41\xc4\xb7\x47\x51\xb4\xda\x05\x76\x15\x30\xbd\x50\x32\x56\xc1\ +\x61\x53\x87\xff\x66\xe6\x3d\x32\xa6\xb7\x85\xbb\xe3\x7d\xf5\xeb\ +\x98\x79\x28\xcf\x7c\xab\x84\xe5\x85\x92\xa1\x1a\x43\x43\x43\xcb\ +\x06\x07\x07\x9d\xdc\x24\x8b\xc8\x19\x5a\x6b\xb3\x09\x2b\xd7\x41\ +\x44\x66\x87\xa2\x93\x0f\x34\x22\x1e\x1c\x45\xd1\x0d\xb9\x26\x5c\ +\x11\x30\x2f\x94\x0c\x85\x20\xa2\x7f\x05\x80\x4c\x4f\xa4\xe6\x0a\ +\x1f\x04\xc1\x6e\x8d\x46\xe3\xd7\x19\xd2\x9b\xd5\x95\x88\xcc\x63\ +\xe2\x79\x97\xe9\xa7\x8d\x99\xe7\x3d\x55\xda\x1c\x5c\xf9\x79\xa1\ +\x64\x60\x96\x88\x26\x00\xc0\xb4\x1c\xcd\x75\x88\xc8\x25\x5a\xeb\ +\x63\x72\x05\x9d\x06\x46\x44\x66\x87\xe2\x4e\x2e\xf0\x83\x20\x18\ +\x69\x34\x1a\x77\xb9\xc0\x2e\x13\xd3\x0b\x25\x25\xfb\x4a\xa9\xf7\ +\x23\xe2\x79\x29\xdd\x3b\xb9\xed\xc3\xcc\x66\x39\x8c\x93\x41\x44\ +\x66\x49\x8b\x59\xda\xe2\x62\x7c\x99\x99\xdf\xea\x02\xb8\x4c\x4c\ +\x2f\x94\x94\xec\x3b\xbc\xd6\xff\x31\x33\xef\x97\x32\xad\x44\x6e\ +\xb5\x5a\xed\xa9\x41\x10\x38\x3b\xce\x61\x60\x60\x60\xf7\x7b\xee\ +\xb9\xc7\x74\x83\xe9\x99\xe1\x85\x92\xa2\x94\x4a\xa9\x83\xcc\xb2\ +\xf7\x14\xae\x1d\x5d\x44\xe4\x28\xad\xf5\x97\x3a\x1a\x66\x34\x70\ +\x79\xe0\x2a\x22\x9e\x13\x45\xd1\xa9\x19\x53\xac\x94\xbb\x17\x4a\ +\x8a\x72\x38\xdc\x66\xfb\x10\x33\x3f\x3d\x45\x4a\xd6\x2e\xb5\x5a\ +\x6d\xaf\x20\x08\xee\xb6\x76\x4c\xe8\xc0\xcc\x66\x5f\xfd\xe6\x2e\ +\x96\x09\xdd\x2a\x6b\xe6\x85\x62\x59\x1a\x97\xed\x80\x44\xe4\x23\ +\x5a\xeb\x0f\x59\xa6\x94\xda\xdc\x61\xbb\x57\xb3\x6d\xf9\x44\xad\ +\xf5\xf9\xa9\x93\xab\x98\xa3\x17\x8a\x65\x41\x94\x52\xe7\x21\xe2\ +\xfb\x2d\xdd\x12\x99\x07\x41\xf0\xcc\x46\xa3\xf1\x40\x22\xe3\x1c\ +\x8c\x5c\x5e\x42\x02\xc0\xc3\xcc\xfc\xb4\x1c\xd2\xac\x04\x84\x17\ +\x8a\x65\x19\x88\xe8\x77\x00\xb0\xbd\xa5\x5b\x47\x73\x11\xb9\x5c\ +\x6b\xfd\x96\x8e\x86\x39\x1b\x10\xd1\x1a\x00\x78\x5e\xce\xb0\x93\ +\x70\x22\xf2\x16\xad\xb5\xab\x1d\x9f\x2e\x52\x9e\x13\xd3\x0b\xc5\ +\x82\x6e\x22\x7a\x17\x00\x4c\x1e\xb3\xe0\x60\xec\xcf\xcc\xae\x0e\ +\x03\x9a\x33\x5d\xa5\xd4\x51\x88\x78\x89\x83\xf9\x18\xc8\xbb\x98\ +\x79\xc4\x11\x76\xa1\xb0\x5e\x28\x16\x74\xbb\xfa\xeb\x8b\x88\x3f\ +\x8b\xa2\xa8\xb4\x46\x0d\x44\x64\x2e\xf7\x9e\x61\x41\x45\x62\x53\ +\x11\x39\x50\x6b\x6d\x4e\x43\xee\xea\xe1\x85\x92\xb0\x7c\x8e\x97\ +\xa9\xbf\x83\x99\xbf\x98\x30\x95\xdc\xcd\xc2\x30\x3c\x55\x44\x3e\ +\x91\x3b\xf0\x5f\x00\xaf\x65\x66\x57\x8d\xf8\x1c\xa5\x3c\x13\xd6\ +\x0b\x25\x21\xd5\x0e\x37\x3e\x3d\xca\xcc\xb9\xb7\x37\x4a\x38\xad\ +\x49\xb3\x91\x91\x91\x6d\x37\x6d\xda\x64\xee\xbd\x72\x5f\x8e\x63\ +\xf0\xe3\x38\xa6\x66\xb3\xa9\x6d\x72\xaa\x9a\xad\x17\x4a\x82\x8a\ +\x2c\x5b\xb6\x6c\xc9\xc2\x85\x0b\x7f\x93\xc0\xd4\xda\xc4\xfc\x25\ +\xd7\x5a\x7f\xc0\xda\x31\x67\x87\x30\x0c\xcf\x17\x91\x55\x39\xc3\ +\x4e\xc2\xe5\xb1\x9d\xd9\x45\x5e\x36\x98\x5e\x28\x09\xd8\x72\x7c\ +\xe6\xc8\xfe\x09\x52\x28\xca\xc4\xd9\xd1\x73\x13\x13\x13\x4b\xd6\ +\xae\x5d\xfb\x68\x51\x13\xc9\x3b\x8e\x17\x4a\x02\x46\x89\xe8\x61\ +\x00\xd8\x2d\x81\xa9\x37\x99\x83\x81\xa2\x5f\xa6\xe6\x5d\x08\x2f\ +\x94\x0e\x8c\x3a\x7e\x7c\x9a\x77\x3d\xab\x8c\xb7\x91\x99\xb7\xa9\ +\x72\x82\xf3\xe5\xe6\x85\xd2\xa1\x72\x44\x74\x2b\x00\xec\xdb\xad\ +\x05\xae\x52\xde\x22\x72\xbc\xd6\xfa\xc2\x2a\xe5\x94\x34\x17\x2f\ +\x94\x79\x98\x52\x4a\xed\x8d\x88\x3f\x4f\x4a\xa6\xb7\xeb\xc8\xc0\ +\x7d\xcc\xfc\xec\x8e\x56\x15\x34\xf0\x42\x99\x5f\x28\xab\x11\xf1\ +\xe8\x0a\xd6\xad\x9b\x53\x4a\xd5\x6c\xbc\xec\x09\x7b\xa1\xcc\x51\ +\x81\x7a\xbd\xbe\x5d\x1c\xc7\xe6\x54\x5f\x3f\x72\x64\x00\x11\x6f\ +\x8d\xa2\xe8\xc5\x39\x42\x16\x02\xe5\x85\x32\x07\xcd\x8e\xbb\x3f\ +\x16\x52\xdc\xaa\x06\x11\x91\x7d\xb5\xd6\xb7\x55\x35\xbf\xd9\xf2\ +\xf2\x42\x99\x5b\x28\xa6\x43\xfb\x9e\xdd\x54\xcc\x2e\xca\xf5\x1b\ +\xcc\x7c\x44\x17\xe5\x0b\x5e\x28\xb3\x54\xcb\x71\xa3\xb8\x6e\xfa\ +\x7c\xb8\xcc\x75\x29\x33\xff\xd2\x65\x80\x3c\xb1\xbd\x50\x66\x17\ +\xca\x77\x01\xe0\x65\x79\x12\xed\xb1\x66\x30\xf0\x39\x66\x7e\x5f\ +\xb7\xf0\xe2\x85\xb2\x55\xa5\xea\xf5\x3a\xc5\x71\x9c\xf8\x40\xd1\ +\x6e\x29\x74\x15\xf3\x8c\xe3\x78\xfb\x66\xb3\xd9\x15\x0f\x4c\xbc\ +\x50\xb6\xfa\x04\x11\xd1\x05\x00\xf0\xee\x2a\x7e\xb0\x7a\x30\xa7\ +\xd3\x98\xf9\x63\xdd\x30\x2f\x2f\x94\x2d\xab\x14\x10\xd1\x9f\x00\ +\x60\x61\x37\x14\xaf\x07\x72\x7c\x8c\x99\x77\xe9\x86\x79\x78\xa1\ +\x4c\xab\x92\x52\x6a\x15\x22\xf6\x4c\xe7\x90\x6e\xf8\x00\x02\xc0\ +\xb1\xcc\x7c\x71\xd5\x73\xf5\x42\x99\x56\xa1\x30\x0c\x59\x44\x54\ +\xd5\x8b\xd6\x63\xf9\x45\xcc\x5c\xaf\xfa\x9c\xbc\x50\xda\x15\x22\ +\xa2\x43\x00\xe0\x9a\xaa\x17\xac\x47\xf3\x3b\x84\x99\xaf\xab\xf2\ +\xdc\xbc\x50\xda\xd5\x51\x4a\x7d\x1b\x11\x5f\x5b\xe5\x62\xf5\x70\ +\x6e\xdf\x65\xe6\x83\xaa\x3c\x3f\x2f\x14\x00\xf3\xd6\xd5\xac\x68\ +\x5d\x5f\xe5\x42\xf5\x41\x6e\xb9\x1c\xea\xea\x8a\x27\x2f\x94\xbf\ +\x08\xe5\x5c\x00\x38\xc9\x15\xc9\x1e\x37\x11\x03\x5f\x62\xe6\xa3\ +\x12\x59\x96\x60\xe4\x85\xf2\x17\xa1\xfc\x16\x00\x76\x2c\x81\x7f\ +\x1f\x72\x1a\x03\x45\xb7\x94\xb5\x21\xbf\xef\x85\x12\x86\xe1\x71\ +\x22\x62\x8e\x98\x73\x31\x0a\xef\xfc\xe8\x62\x12\x5b\x61\xfe\xb5\ +\x8b\xa3\xc2\xdb\x31\xce\x65\xe6\x53\x0a\x98\x83\x75\x88\xbe\x17\ +\x0a\x11\xdd\x01\x00\xcf\xb7\x66\xae\xb3\xc3\x38\x33\x2f\xea\x6c\ +\xd6\x5d\x16\x2e\xdb\xca\x22\x62\x6b\xe1\xc2\x85\xdb\xac\x59\xb3\ +\xe6\xcf\x55\x63\xa5\xaf\x85\xa2\x94\x3a\x00\x11\xbf\xef\xa8\x28\ +\x1f\x63\xe6\xd3\x1c\x61\x97\x0a\x4b\x44\xe6\xdc\x93\xc0\x51\x12\ +\x27\x31\xf3\xa7\x1d\x61\xa7\x86\xed\x6b\xa1\x84\x61\x78\xb9\x88\ +\xbc\x39\x35\x7b\xf3\x38\x22\xe2\xce\x51\x14\x99\x7b\x9f\x9e\x1b\ +\x8e\xfb\x9c\xfd\x8a\x99\xff\xaa\x6a\xa4\xf5\xad\x50\x96\x2f\x5f\ +\xfe\x8c\x56\xab\xe5\xea\x2c\x92\xeb\x98\xd9\xbc\xc0\xec\xc9\x51\ +\xab\xd5\x9e\x14\x04\xc1\x06\x57\x93\x43\xc4\xbf\x8b\xa2\xe8\x2b\ +\xae\xf0\xd3\xe0\xf6\xad\x50\x94\x52\x67\x22\xe2\x3f\xa7\x21\x2d\ +\x81\x4f\x29\x47\x38\x24\xc8\x2b\x37\x93\x30\x0c\x2f\x31\xe7\x4d\ +\xe6\x06\xb8\x25\xd0\xcf\x99\xf9\x85\x8e\xb0\x53\xc1\xf6\xad\x50\ +\xc2\x30\x7c\x50\x44\x5c\x9c\x97\x58\xc9\x4b\x87\x54\x9f\x8e\x79\ +\x9c\xc2\x30\x1c\x12\x91\xb1\xbc\x71\xa7\xf0\x10\xf1\x65\x51\x14\ +\xdd\xec\x0a\xdf\x16\xb7\x2f\x85\x42\x44\xe6\x1c\x74\x57\x27\xef\ +\xbe\x8f\x99\x3f\x67\x5b\x88\x6e\xb4\x57\x4a\xdd\x8c\x88\x07\x3a\ +\xca\xfd\x1a\x66\x7e\x8d\x23\x6c\x6b\xd8\x7e\x15\xca\x8f\x00\xc0\ +\x49\xcb\x1c\x66\x46\xeb\x2a\x74\xa9\x43\x18\x86\x2f\x15\x91\xef\ +\xb9\x4a\x3f\x08\x82\xb0\xd1\x68\xb0\x2b\x7c\x1b\xdc\xbe\x13\x4a\ +\xbd\x5e\x7f\x51\x1c\xc7\xb7\xdb\x90\x64\x61\xfb\x45\x66\x7e\x87\ +\x85\x7d\xd7\x9b\x12\xd1\x5a\x00\x78\xae\x8b\x89\x20\xe2\xbf\x47\ +\x51\xf4\x4e\x17\xd8\xb6\x98\x7d\x27\x14\x22\xfa\x0f\xb3\x59\xc8\ +\x96\xa8\x84\xf6\x35\x66\x76\x76\xdd\x9e\x30\x87\x42\xcd\xc2\x30\ +\x3c\x5a\x44\x56\xbb\x0a\xba\x60\xc1\x82\x5d\xef\xbe\xfb\x6e\x27\ +\x67\xd3\xd8\xe4\xdc\x57\x42\x51\x4a\xed\x8c\x88\xae\xce\xe8\xb8\ +\x93\x99\xf7\xb6\x21\xbf\x57\x6c\x89\xc8\x34\x88\xd8\xce\xc5\x7c\ +\x10\xf1\xec\x28\x8a\xce\x70\x81\x6d\x83\xd9\x57\x42\x09\xc3\xf0\ +\x9f\x44\xe4\xe3\x36\x04\x59\xd8\xbe\x89\x99\xbf\x6e\x61\xdf\x33\ +\xa6\x4a\xa9\xd3\x11\xf1\x2c\x47\x13\xda\xc0\xcc\x3b\x38\xc2\x4e\ +\x0c\xdb\x57\x42\x21\x22\xb3\xe7\xc4\x45\x37\xf5\x9e\x5c\xd7\x95\ +\xf4\x53\x74\xf8\xe1\x87\x0f\x8c\x8d\x8d\x4d\x24\xb5\xb7\xb5\x13\ +\x91\x13\xb4\xd6\xa6\x3b\x4e\x69\xa3\x6f\x84\xa2\x94\x7a\x03\x22\ +\x7e\xd3\x11\xd3\x3d\xbb\xae\x2b\x29\x5f\x44\x64\x56\x60\x1f\x97\ +\xd4\xde\xc6\x4e\x44\xee\xd5\x5a\x3b\x79\x60\x90\x34\x8f\xbe\x11\ +\x4a\x18\x86\x37\x88\xc8\x2b\x92\x12\x63\x63\xd7\xcb\xeb\xba\x92\ +\xf2\x30\x34\x34\xb4\xc7\xe0\xe0\xe0\x7f\x25\xb5\xb7\xb5\x13\x91\ +\xc3\xb5\xd6\xae\xfe\xd0\x75\x4c\xa7\x2f\x84\x42\x44\xa6\xcb\xc7\ +\x3d\x1d\xd9\x48\x67\xd0\xd3\xeb\xba\x6c\x28\x21\xa2\x6b\x01\xe0\ +\x55\x36\x3e\x49\x6d\x45\xe4\x56\xad\xb5\x93\x77\x5f\x49\x72\xe8\ +\x17\xa1\x98\x37\xe5\xef\x49\x42\x48\x0a\x9b\x9e\x5f\xd7\x95\x94\ +\x93\x5a\xad\xb6\x6f\x10\x04\xe6\x28\x3f\x27\x23\x8e\xe3\xfd\x9a\ +\xcd\xe6\x8f\x9d\x80\x77\x00\xed\x79\xa1\xec\xbe\xfb\xee\xdb\xec\ +\xb4\xd3\x4e\x8f\x8a\x88\x8b\x83\x36\xfb\x62\x5d\x97\xcd\x07\x93\ +\x88\x46\x01\x60\xb9\x8d\x8f\x85\xed\x15\xcc\xfc\x46\x0b\xfb\xdc\ +\x4c\x7b\x5e\x28\x44\xf4\x5e\x00\xf8\x6c\x6e\x8c\x6d\x09\xd4\x37\ +\xeb\xba\x92\xf2\xa7\x94\x7a\x13\x22\x7e\x35\xa9\xbd\xad\x5d\xab\ +\xd5\x5a\x36\x36\x36\xf6\x0b\x5b\xbf\xac\xf6\xfd\x20\x94\x06\x00\ +\x84\x59\x89\x9a\xcd\xbf\x9f\xd6\x75\xd9\xf0\x47\x44\xff\x07\x00\ +\x4e\x7a\x0a\x8b\xc8\x17\xb4\xd6\xae\x2e\xa3\xe7\x9c\x66\x4f\x0b\ +\x25\x0c\xc3\x57\x8a\xc8\xf5\x36\x45\xb6\xb0\xed\xbb\x75\x5d\x49\ +\xb9\x21\x22\xd3\xfa\xc9\xb4\x80\x72\x32\x36\x6e\xdc\xf8\xe4\xf5\ +\xeb\xd7\xff\xce\x09\xf8\x1c\xa0\x3d\x2d\x14\x22\xba\x12\x00\x5e\ +\xef\x88\xd0\xbe\x5b\xd7\x65\xc3\x63\x9a\x0f\x96\x05\xfe\xe9\xcc\ +\xfc\x51\x0b\xfb\xcc\xa6\x69\xe6\x83\x69\x9c\x8a\xbe\x4c\x19\x1e\ +\x1e\x7e\xce\xc0\xc0\xc0\xbd\x99\x19\x9a\x1d\xa0\x6f\xd7\x75\x25\ +\xe5\x93\x88\x3e\x03\x00\xae\x4e\xd4\xfa\x35\x33\xef\x96\x34\x97\ +\x3c\xec\xd2\x7c\xe6\xbb\x42\x28\x61\x18\x7e\x52\x44\x4e\x06\x00\ +\xd3\x31\xc4\xea\xc7\xb4\xcd\x11\x91\xd6\xd4\xbf\x00\x10\x4f\xc3\ +\x30\xff\xfb\xc2\x7e\x5d\xd7\x95\xf4\x43\x47\x44\xe6\x83\xfc\xb5\ +\xa4\xf6\xb6\x76\x22\xf2\x15\xad\xb5\x59\x09\x5e\xc8\xe8\x59\xa1\ +\x14\xc2\x9e\x0f\xd2\x37\x0c\x78\xa1\xf4\x4d\xa9\xfd\x44\xb3\x30\ +\xe0\x85\x92\x85\x3d\xef\xdb\x17\x0c\xac\x5c\xb9\x72\x9b\x0d\x1b\ +\x36\xfc\xd1\x72\xb2\x13\x5d\x71\x8f\x62\x39\x29\x6f\xee\x19\x98\ +\x93\x01\xa5\xd4\x72\x44\x34\x2b\x0e\x6c\xc6\x63\x46\x28\x0f\x03\ +\x80\xd5\x53\x07\x44\x1c\x8e\xa2\xc8\xec\xaf\xf6\xc3\x33\xd0\x55\ +\x0c\x28\xa5\x0e\x43\xc4\x2b\x6c\x92\x16\x91\xfb\x8d\x50\x7e\x0e\ +\x00\x56\xdb\x5e\x4d\xb3\x34\xad\xb5\xab\x16\x41\x36\x73\xf0\xb6\ +\x9e\x01\x2b\x06\x88\xe8\x03\x00\x60\x7b\xcc\x77\xc3\x08\xc5\xec\ +\x0b\x78\x83\x4d\x34\x11\xb9\x40\x6b\x7d\x82\x8d\x8f\xb7\xf5\x0c\ +\x54\x81\x01\xa5\xd4\x6a\x44\x3c\xda\x32\x97\x1f\x63\x18\x86\xe7\ +\x89\xc8\xfb\x2d\x1d\x2b\xd7\x26\xd3\x32\x7f\x6f\xde\xa7\x0c\xa4\ +\x39\x1a\x44\x44\x3e\x81\x69\x57\x88\x8a\xc8\x0b\xb4\xd6\xe6\x3c\ +\x12\x3f\x3c\x03\x5d\xc1\x80\x52\xea\x28\x44\xbc\xc4\x36\x59\x11\ +\x39\x00\x87\x86\x86\x76\x19\x1c\x1c\x34\x2b\x44\xad\x06\x22\x5e\ +\x1a\x45\x91\xed\x57\x98\x55\x0c\x6f\xec\x19\xc8\x93\x01\x22\x4a\ +\xd3\x55\xf4\x89\x38\x8e\x77\x9d\x6c\x19\x9a\x76\x0f\xba\x51\x9a\ +\xd6\xfa\x87\x79\x4e\xc6\x63\x79\x06\x5c\x30\x50\xaf\xd7\x0f\x8b\ +\xe3\xd8\xea\x69\x57\x3b\x8f\x2b\x99\xf9\xb0\x49\xa1\x28\xa5\x4e\ +\x41\xc4\x4f\xa6\x48\x70\x12\x24\x85\x9f\x77\xf1\x0c\x14\xca\x80\ +\x52\xea\x7a\x44\x7c\xa5\x6d\x50\x11\x39\x5e\x6b\x7d\xe1\xa4\x50\ +\x88\xc8\x9c\x7b\x98\xea\x7e\xa3\xec\x8e\x1a\xb6\x13\xf7\xf6\xfd\ +\xc7\x00\x11\x99\x05\xb5\xe7\xa4\x98\xf9\x43\x13\x13\x13\xe1\xda\ +\xb5\x6b\x1f\xdd\xdc\xad\x9d\x88\xbe\x01\x00\x87\xa7\x00\xfb\x93\ +\x88\xbc\x5e\x6b\x7d\x63\x0a\x5f\xef\xe2\x19\x70\xca\x40\x96\x7e\ +\xca\x88\xf8\x99\x28\x8a\x26\x9f\x08\x6f\x16\x4a\xbd\x5e\x7f\x4d\ +\x1c\xc7\xdf\x49\x93\xb5\x88\x98\x87\x01\x87\x6a\xad\x6f\x4b\xe3\ +\xef\x7d\x3c\x03\x2e\x18\x50\x4a\x1d\x14\x04\xc1\x75\x22\x32\x90\ +\x06\x3f\x08\x82\x95\x8d\x46\xe3\xa7\x5b\x08\xa5\x7d\x09\x66\xda\ +\xc7\xec\x93\x06\xd4\xbc\xe6\x0f\x82\xe0\x35\x51\x14\x45\x69\xfc\ +\xbd\x8f\x67\x20\x4f\x06\xda\x6b\xba\x6e\xb2\x5d\x9e\x35\x2d\x87\ +\x2d\x0e\x3f\xda\xe2\xa0\x1c\x22\x7a\x3b\x00\x7c\x31\x43\xc2\x0f\ +\x9a\x8d\x50\x8b\x16\x2d\xba\x60\xcd\x9a\x35\x4f\x64\xc0\xd9\xc2\ +\xb5\xbd\x71\x68\x37\x11\x59\xb4\x78\xf1\xe2\x7b\xf3\xc4\xce\x2b\ +\x47\x8f\x63\xc7\xc0\xd2\xa5\x4b\x77\xd8\x76\xdb\x6d\x77\x89\xe3\ +\x78\xaa\x71\xc5\x23\x71\x1c\x3f\xd2\x6c\x36\xc7\xed\x90\x66\x58\ +\x0f\x10\xd1\x2a\x00\x30\x3f\xbb\xa7\xc5\x32\x9d\x48\xb5\xd6\x46\ +\x68\x93\x63\xc6\x89\x52\x4a\xa9\x6f\x23\xe2\x6b\xd3\x06\x68\xfb\ +\xad\x6b\xef\x1c\x34\xcd\x98\xcd\x8e\x44\xab\x61\xfe\x1a\x04\x41\ +\x70\x80\x88\xec\x0f\x00\xaf\xde\xda\x79\x72\x91\x1a\x62\x13\x00\ +\xd6\x07\x41\x70\x75\xa3\xd1\x70\x75\xbe\xbc\x55\xde\xde\xb8\x33\ +\x03\x44\x64\x4e\x58\x36\x07\x0a\xcd\xa8\x6b\xdb\xdb\x1c\x0c\x75\ +\x93\x88\xfc\x74\xfa\x07\xb5\x33\xf2\xe4\x6b\x8e\x23\x45\xc4\x08\ +\xc4\x6a\xed\xe2\xd6\xd8\xa6\x45\x53\x14\x45\x47\x4e\xff\xef\xb3\ +\x09\x65\x1f\x44\xcc\xab\x83\xdf\x5d\x22\x72\x2d\x22\xde\xc4\xcc\ +\x3f\x49\x32\x59\x22\x7a\x17\x00\x9c\x6d\xd9\x22\xe7\xd3\x22\xf2\ +\x31\xad\xf5\x63\x49\x62\x78\x9b\xe2\x19\x50\x4a\x99\x4b\xfa\x93\ +\x2d\xff\x08\x5f\x03\x00\x17\x31\xb3\x69\xef\x3a\xeb\x58\xb6\x6c\ +\xd9\x92\x05\x0b\x16\x1c\x61\xda\xbf\xa6\x79\xfc\x3b\x1b\xa8\x88\ +\xec\xbb\xf5\xfd\xf6\xac\x67\x14\xb6\xf7\xa8\x9f\x92\x27\x9d\x22\ +\x72\x37\x22\xde\x18\x04\xc1\xa5\x8d\x46\xc3\x7c\xe3\xcc\x18\x59\ +\x8e\x71\x46\x44\x0d\x00\x1f\xaf\xda\x99\xe6\x79\x72\xd8\xad\x58\ +\x39\x7c\x9e\x3e\xcc\xcc\x67\x4e\x9f\x7f\x7b\xe9\xd5\xa4\x40\x00\ +\x60\x41\x5e\xdc\xcc\x75\x84\xde\xac\x42\x19\x19\x19\xd9\x76\xd3\ +\xa6\x4d\xe6\x8d\xfb\x0b\xf2\x4a\x60\x2b\x1c\x46\xc4\x6f\x8c\x8f\ +\x8f\x7f\x66\xdd\xba\x75\x1b\xcc\xef\x32\x3c\x9e\xde\x02\x5a\x44\ +\x4e\xd4\x5a\x9f\xef\x28\x6f\x0f\x6b\xc9\x40\x5e\x75\x05\x80\x0f\ +\xb7\x5a\xad\x4b\x06\x06\x06\xcc\x89\x5d\x46\x20\x4f\xb2\x4c\x25\ +\x89\xf9\xda\xf1\xf1\xf1\xfd\xee\xbd\xf7\xde\x19\x4b\xba\xe6\x3c\ +\xf5\xb6\x56\xab\xad\x08\x82\xe0\xae\x24\xe8\x59\x6c\x44\x44\xb7\ +\xef\x37\xd2\xbc\xc3\x99\x2b\xf4\x11\xcc\x6c\xde\x0b\xf9\x51\x22\ +\x03\x39\x8a\xa4\x90\x59\xcc\x76\xc9\x35\x15\x78\xde\xe3\xa1\xd3\ +\xae\x2c\x2e\x64\x56\xf3\x07\xf9\x03\x22\x1e\x1c\x45\xd1\x7f\x56\ +\x20\x97\xbe\x4c\x21\xc3\xb2\xa8\xb2\xf8\x3a\x96\x99\x2f\x9e\x2b\ +\x78\xc7\x73\xd4\x89\xe8\x43\xe6\x6b\xaf\xac\xec\x33\xc4\x5d\x37\ +\x38\x38\xf8\xa2\xd1\xd1\xd1\xc7\x33\x60\x78\xd7\x14\x0c\xd4\xeb\ +\xf5\xe7\xc6\x71\x6c\x1e\x08\x2d\x49\xe1\x5e\x86\xcb\x69\xcc\x3c\ +\xef\xae\xc7\x8e\x42\x69\xdf\x3f\xbc\xdc\x3c\xb2\x2b\x63\x06\x59\ +\x62\x8a\xc8\x6b\xb5\xd6\x57\x67\xc1\xf0\xbe\xf6\x0c\x10\x91\xcb\ +\x33\x6c\xec\x13\x9a\xc7\x03\x11\x8f\x8b\xa2\xe8\xa2\x4e\xa0\x89\ +\x84\x62\x40\xc2\x30\x5c\x29\x22\x97\x02\xc0\x73\x3a\x81\x56\xe8\ +\xf7\x9f\x66\x66\xd3\x64\xda\x8f\x02\x19\x20\x22\x73\x94\xc3\xd2\ +\x02\x43\xa6\x0d\x75\x12\x33\x7f\x3a\x89\x73\x62\xa1\x18\xb0\xe1\ +\xe1\x61\x1a\x18\x18\x30\x47\x2b\x1f\x9a\x04\xbc\x02\x36\x77\x30\ +\xb3\xab\x27\x77\x15\x98\x5e\xf5\x52\x70\x7c\x74\x60\x9e\x13\x9e\ +\xf1\xc8\x79\x3e\x70\x2b\xa1\x4c\x01\x29\xa5\x56\x21\xa2\xb9\x77\ +\xd9\x31\xcf\xcc\x5d\x60\x0d\x0e\x0e\xee\xe4\xef\x53\x5c\x30\x3b\ +\x3b\x66\xad\x56\x3b\x3a\x08\x82\xd5\xc5\x45\xb4\x8e\x74\x0b\x00\ +\x9c\xc9\xcc\xe6\xdf\xc4\x23\x95\x50\x0c\x7a\xad\x56\xdb\x2b\x08\ +\x02\x23\x96\x4a\x7f\xbb\x94\x79\x56\x60\xe2\x2a\xf4\x90\x21\x11\ +\x99\x7d\x1f\x66\xff\x47\x15\x87\xd5\xb7\xc8\xf4\x09\xa4\x16\xca\ +\xb4\x6f\x17\xd3\x50\xec\x78\x00\x78\x49\x15\x99\x31\x67\x10\x32\ +\xb3\x39\xa9\xcb\x8f\x02\x18\x20\xa2\xeb\x00\xe0\xe0\x02\x42\x25\ +\x0d\x61\x0e\x29\xba\x24\x8e\xe3\xd5\xcd\x66\xd3\xb6\x43\xe4\xe6\ +\x18\x99\x85\x32\x85\x14\x86\xe1\x31\x00\x70\x9c\x88\xbc\x30\xe9\ +\x0c\x8a\xb0\x9b\x98\x98\xd8\x73\xed\xda\xb5\xf7\x17\x11\xcb\xc7\ +\x98\x5c\x61\x71\x15\x00\xbc\xae\x02\x5c\xac\x47\x44\x73\x54\xc5\ +\xea\x28\x8a\xee\xcb\x9a\x4f\x6e\x42\x99\x26\x98\x95\xe6\x2f\x8a\ +\x88\x98\xbf\x2a\xcf\xcb\x9a\x60\x56\x7f\x11\xd9\xc5\x2f\x96\xcc\ +\xca\x62\x72\x7f\x22\xfa\x17\x00\x30\x0b\x5b\xcb\x18\xff\x03\x00\ +\xe6\x1b\xed\xfa\x25\x4b\x96\xdc\x78\xcb\x2d\xb7\x4c\xe4\x95\x44\ +\xee\x42\x99\x9e\x58\xbd\x5e\xdf\xaf\xd5\x6a\x99\x55\x9d\x46\x34\ +\x4e\x0e\x29\xed\x44\xc4\xf0\xf0\xf0\xe0\x15\x57\x5c\x61\xbd\xd4\ +\xbf\x13\xae\xff\xfd\xec\x0c\x94\xf0\x82\xda\xf4\xce\x36\xe2\xf8\ +\xde\xc4\xc4\xc4\xcd\x66\x7f\xbb\x8b\xda\x38\x15\xca\xf4\x84\x95\ +\x52\x07\xb4\x05\x63\x44\x33\xec\x62\x32\x5b\x63\x8a\xc8\x77\xb4\ +\xd6\x95\x7e\xd8\x50\x04\x0f\x45\xc6\x50\x4a\x2d\x45\x44\xd7\x47\ +\x62\xff\x16\x00\x6e\x46\xc4\xef\x8b\xc8\xcd\xcc\xfc\x4b\xd7\x73\ +\x2c\x4c\x28\x5b\x89\xe6\xa0\xb6\x68\xcc\xb9\xf1\x2e\xc7\xab\xe7\ +\xdb\xcb\xe0\x32\x70\x3f\x63\xa7\x6d\x0d\x64\xc1\x59\xe1\x2f\x92\ +\x4b\x11\xca\xb4\xfb\x99\xb3\x44\xe4\x74\x0b\x82\x6c\x4c\xef\x63\ +\xe6\x67\xdb\x38\x78\xdb\x7c\x18\xc8\x61\x4b\x79\xa7\x44\xf6\xb7\ +\x7d\x0f\xd2\x09\xb0\xd3\xef\x4b\x15\x8a\x49\x8e\x88\xee\x01\x80\ +\x7a\xa7\x44\x53\xfc\xfe\x63\xcc\x7c\x5a\x0a\x3f\xef\x92\x03\x03\ +\x39\x6d\x29\x9f\x2d\x93\x6f\x33\x73\xe1\x4f\xd5\xaa\x20\x94\x67\ +\x02\x80\x79\x5a\x91\xdb\x30\xbb\x1d\xe3\x38\x7e\xa3\xd6\xda\xec\ +\xab\xf7\xa3\x04\x06\xcc\xd6\xdf\x1c\xb7\x94\x4f\xcd\xe0\xf1\x20\ +\x08\x9e\xdb\x68\x34\x7e\x5d\xf4\x94\x4a\x17\x8a\x99\x70\x18\x86\ +\x27\x88\xc8\xe7\xf3\x98\xbc\x17\x49\x1e\x2c\xe6\x83\x41\x44\x66\ +\x41\xea\xb9\xf9\xa0\x4d\xa2\xec\xcd\xcc\x77\xe6\x88\x97\x18\xaa\ +\x12\x42\x31\xd9\xd6\x6a\xb5\x17\x06\x41\x30\xd9\x6c\x2c\xed\xf0\ +\x22\x49\xcb\x9c\x3b\xbf\x9c\x1e\x17\x6f\x14\x91\x91\x32\xaf\x10\ +\x2a\x23\x14\x53\x2a\xa5\xd4\xce\x88\x68\xf6\x32\xbc\xc5\xb6\x74\ +\xe6\x51\x30\x00\x7c\xb0\x4c\x32\x6d\x73\xee\x17\x7b\xf3\x47\xd0\ +\xbc\x25\x47\xc4\x3d\x52\xcc\x79\x8d\x88\xbc\xad\xec\xba\x56\x4a\ +\x28\x53\x24\xb6\xff\x0a\x99\xbe\x4f\x23\x09\x88\xfd\x8a\x59\xad\ +\xea\x7b\x7b\x25\x60\xaa\x44\x93\xf6\x1f\x41\xb3\x45\xc3\xf4\x46\ +\x78\x4a\x82\x54\xd6\x20\xe2\x45\x49\x36\x55\x25\xc0\xca\x6c\x52\ +\x49\xa1\x4c\xcd\xaa\x56\xab\xbd\x20\x08\x02\xf3\xc2\xd0\x3c\xe5\ +\x78\x06\x00\x3c\x28\x22\x0f\x22\xa2\xe9\x48\xf9\xa0\xe9\x95\xdc\ +\x6c\x36\x7f\x96\x99\x05\x0f\x50\x18\x03\x2b\x56\xac\x78\xca\xf8\ +\xf8\xb8\x11\xcb\xde\x88\xa8\xcc\x55\x37\x00\x98\xee\x90\xe6\x0d\ +\xfb\x23\x00\x60\x96\xbf\xff\xa8\xe8\xc7\xbf\x9d\x08\xf8\x7f\xee\ +\x74\x9e\xef\xc9\x63\x4f\x81\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ +\x42\x60\x82\ +\x00\x00\x08\x96\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x08\x4b\x49\x44\x41\x54\x68\x81\xed\x99\x59\x6c\ +\x5c\xd5\x1d\x87\xbf\xbb\xcc\xea\x59\x3c\xbb\x97\xc4\x4b\xbc\x11\ +\x27\x26\x09\x01\x15\x2a\x14\xd4\x96\x50\xa9\x0b\x11\x09\xa8\x55\ +\x91\x20\x2f\x54\x95\xda\xbe\x54\x7d\xaa\x5a\x35\x20\x2a\xf1\x90\ +\x87\x2a\x40\xa1\x2a\x05\x4a\x68\x1a\x22\x91\x92\x86\xe0\x42\xd2\ +\x34\x24\x61\xb1\xe3\x38\xb6\x63\x3b\xc1\x8e\x67\xbc\x3b\x33\xe3\ +\x75\x3c\xcb\x9d\x99\xbb\xf4\xc1\xa4\x35\x59\x88\x1d\x4c\xcd\x83\ +\x3f\xe9\x3c\xcd\x3d\x67\xbe\xdf\x3d\x77\xce\xcc\xff\x3f\xb0\xc2\ +\x0a\x2b\xac\xb0\xc2\x17\x40\x58\x6e\x81\x9b\xb2\x0b\x91\x20\x15\ +\x38\x88\xf2\x18\xa9\xab\x5f\x16\x97\xc3\x69\xc1\xbc\x48\x0d\x21\ +\x3e\x10\x4c\x42\x1f\x09\x22\x3c\xce\xba\xab\x2f\x91\x96\xc3\xeb\ +\xa6\x18\x08\x04\xf9\x19\x08\x07\x03\x45\xc1\xca\xfa\xda\x3a\xd2\ +\x8a\x52\xa0\x8c\x2a\xe5\xb4\x70\x04\xc8\x5e\xb9\x54\x5e\x46\xcd\ +\xeb\xf3\xbc\x6d\xb5\xf0\xac\xfa\x8a\xc5\x6a\xfa\x56\x79\xd5\x2a\ +\xbe\x53\xbd\x86\x98\xa2\x70\x49\x17\x11\xf2\x92\xd5\x40\x0b\x01\ +\x33\x57\x2e\xff\x4a\x05\x90\xf6\x58\x1f\x13\x54\xfd\x59\x7f\x49\ +\xd0\xb5\xb1\xae\x8c\x9d\x95\x95\x1c\x8b\x46\x79\xbf\x3b\xcc\xec\ +\xe5\x64\xc6\x38\x66\x9c\x02\x94\xf9\x73\xbe\x12\x01\x6c\x7b\x6c\ +\xab\x54\x55\x7c\xc5\x24\x99\xee\x5f\x5d\x5b\xc4\xb6\xba\x4a\xb6\ +\x95\x96\xb2\x6f\x70\x90\xf7\x3a\xc3\x44\x7b\xc7\x33\xfa\x5f\xb5\ +\x17\xe9\xd7\x4f\x00\xa3\xf3\xe7\x2e\x7b\x00\xeb\x6e\xf7\x8f\xf5\ +\x1c\xbb\x7d\xa5\x2e\xe7\xda\xba\x12\x76\x56\x95\x53\xe3\x32\x73\ +\x70\x70\x84\x77\x3a\xc3\x44\x7b\x26\xb2\xfa\x81\xfc\xcb\x7a\xbb\ +\x7a\x18\xf8\x08\x50\xe7\xcf\x5f\xb6\x00\xce\xdd\x4e\xbf\xaa\x99\ +\xfe\x28\x49\xd2\xf6\xe2\x3a\x1f\x5b\xd7\xae\xe6\xc1\x32\x1b\x79\ +\x71\x98\xc6\x51\x0f\x6f\x75\x86\xb9\xdc\x3d\xa1\xaa\x87\x73\xaf\ +\x69\x2d\xf9\x43\xc0\x87\x40\xee\xea\x75\x96\x25\x80\xfd\x99\xd0\ +\x36\x2d\xaf\xbf\xe4\x0a\xd8\xfc\x55\xeb\x82\x3c\x5a\x53\x46\xd0\ +\xdb\xc7\x34\x59\x7a\x46\x6b\x38\xd0\xd6\xc7\x58\xc7\xa4\xaa\x1e\ +\xc9\xbe\xa6\x9d\x56\xfe\x0e\x9c\x66\xde\xc9\x33\x9f\xeb\x07\xd8\ +\x55\x61\xb5\xca\xd9\x90\xf2\xeb\xb1\x81\x25\x35\xdf\x55\x62\x77\ +\x48\xfa\x6e\x51\x10\x7f\x52\xb4\xd6\x2f\xdc\x53\x5b\xc4\xf6\x4a\ +\x3b\x31\xf3\x09\x14\xdc\x0c\x8c\xae\x67\x5f\x7b\x3f\xa3\x1d\x93\ +\x46\xfe\xb4\xf2\x56\xfe\x74\xfa\x2d\xe0\x24\x90\xb9\xd1\x92\xd7\ +\x7c\x13\x17\x3e\x5d\x5c\xae\x6b\xe2\x49\x41\x14\xca\xf4\xa4\xfe\ +\xb1\x31\xaa\x6d\x4b\xee\x8d\xc6\xbe\xa8\xbb\xf3\xa9\xd2\x7b\x04\ +\x43\xd8\x6b\x2d\x34\x57\x95\x37\x78\xf9\xc1\x6d\xa5\x54\x06\xe2\ +\x8c\xc9\x2d\x14\xe8\x41\x62\x97\x37\xf1\xfa\xf9\x61\x86\x5a\xc7\ +\xc9\x36\x25\x0f\x67\x0e\x4d\xfd\x05\x38\xc6\xbc\x23\xf3\x7a\x5c\ +\xb3\x03\x86\x6a\x7e\xc2\x19\xb4\x96\x15\xd7\xbb\x18\x39\x3f\x73\ +\x77\x4a\x4d\x35\x59\xb7\xb8\xbf\xa9\x9c\x9c\x89\xdc\x92\xf9\x9e\ +\x6a\x8b\x7b\x32\xf7\xa4\x80\xf0\x4b\xef\x1a\xa7\xd4\x50\xef\xe5\ +\xe1\x2a\x0f\x82\xf3\x13\xe2\xe2\x28\x36\xdd\x47\x32\xbe\x99\xbf\ +\x75\x8e\x30\x72\x76\x9a\x5c\xab\xf2\x5e\xe6\xd0\xd4\x3e\xe0\xf8\ +\xcd\xe4\xaf\x1b\x40\xcc\x4a\x26\x51\x17\x59\xef\x75\xe1\xdd\x6c\ +\xa5\x4b\x8b\x57\x24\x75\xf9\x38\xb0\xe8\x10\x85\xbf\xa9\xdc\x20\ +\x44\xf5\xd7\xcd\x2e\xeb\xfa\xe2\xf5\x6e\xb6\xd6\xf8\xb9\xbb\x4c\ +\x27\x65\xb9\x40\x96\x04\x66\xdd\x4d\x26\xb6\x91\x57\xce\x8f\x31\ +\x7c\x66\x86\x5c\x47\xe6\xfd\xf4\x9b\xf1\xd7\x80\x7f\x01\x53\x0b\ +\x79\x8f\x6b\x7e\x4a\x38\xbe\x5e\x38\x94\x4f\xf3\x53\xd5\x2b\x0b\ +\x8f\xd7\x17\x33\x61\x17\x99\x49\xa9\x85\x86\xcd\xb4\xc3\x70\xcb\ +\x87\xb5\xbe\xf4\xe4\x4d\x57\xdd\xb5\xce\xec\xbb\xd7\xf3\x3b\x11\ +\xf1\x55\x4f\x95\xa3\xe8\xf6\x3b\x03\xec\x6c\x08\xb1\xa6\x78\x96\ +\xac\x39\x8a\x86\x82\xa0\x59\x98\x8d\x35\xf0\x6a\x7b\x9c\xa1\xe6\ +\x69\xb2\x9d\xc9\x53\xc9\x03\x63\x7f\x66\xee\xb1\x59\xf0\x23\x7b\ +\x4d\x80\xf4\x07\xd3\x13\xf6\x3b\xfc\x5b\x74\x49\xaa\xf4\x15\x59\ +\xf8\xf6\x6a\x3f\x63\x26\x83\x44\x52\x77\x21\xcb\x3b\x64\x93\xf0\ +\x76\x6e\x30\x3d\x71\xa3\x05\x03\xbf\x5a\xb7\xd1\x96\xd3\xdf\xb5\ +\x14\x98\x1e\x2a\xd9\xe4\x11\xbf\xbb\x21\xc8\x83\x35\x2e\xac\xee\ +\x69\x54\x29\x85\x4e\x0e\x43\x17\x48\xc6\x6b\x78\xbd\x7d\x9a\xe1\ +\x33\x09\xb2\x17\x53\xcd\x89\xfd\xc3\x7f\x02\xde\x03\x2e\x2f\x54\ +\xfe\xba\x01\x00\x0a\xee\x0a\x0c\x6a\x0a\x3b\x33\x1e\x91\xfb\xcb\ +\xaa\xd9\xe8\xf7\x32\x20\x27\x99\x4d\xea\x2e\xdd\x6e\x79\x44\x74\ +\xca\x8d\xb9\x48\x32\xfe\x99\x49\x8f\x3c\x22\x05\xbf\x27\xfe\x56\ +\x34\x84\xbd\xee\x32\x5b\x51\xcd\xe6\x42\x7e\xb8\xce\x47\xc3\x6a\ +\x13\xa2\x2d\x8d\x26\x28\xe8\x64\xd1\x75\x9d\xd9\x68\x25\xfb\xce\ +\x27\x19\x6a\x4e\x90\xb9\x98\x6e\x9d\xd9\xd7\xff\x02\x73\x77\x7e\ +\x64\x31\xf2\x37\x0c\x90\x6e\x1e\xef\xb7\x6f\x0c\xee\xd0\x4c\x52\ +\xc8\xe1\xcb\x70\x5f\xc9\x03\xac\x72\xa6\x19\x92\x52\x24\x53\x38\ +\x0c\x93\x69\x87\xe8\x92\xfe\x1b\xc2\xff\x8b\x0d\xb5\x4e\xf7\xc4\ +\x11\x93\x55\x7e\x34\xb0\xc1\x29\x6e\xd9\x58\xc8\xf6\xb5\x5e\x8a\ +\xfd\x32\x82\x9c\x43\x63\x4e\x5e\xd3\x35\x66\x62\x25\xbc\xd1\x91\ +\x66\xe0\xa3\x24\xe9\x4b\xe9\xce\xa9\xfd\xfd\x7f\xc0\x30\x8e\x02\ +\x83\x8b\x95\xbf\x61\x00\x80\x82\x0d\xa1\x84\x96\x93\xb6\xe7\xfc\ +\x02\xf5\x01\x99\x3a\xcf\xd7\x08\x16\x4c\x31\x24\x65\x48\xa5\x05\ +\x07\xa2\xf5\x61\xc1\x69\x69\xf4\x3d\x54\xfd\x23\x49\x10\xdf\x74\ +\xac\xb2\x94\x97\xdf\xe1\x60\x5b\x83\x9b\x7b\xd7\xf8\x71\x3a\x44\ +\x34\x21\x8b\x86\x82\x46\x16\x55\xcf\x33\x19\xf5\x71\xa0\x5d\xa1\ +\xbf\x49\x41\x89\x64\x7a\xa6\x0e\xf4\x3e\x67\xe4\xf5\x63\xc0\xad\ +\x9d\x70\x9f\x17\x20\x55\x75\x5f\xb7\x53\x9a\x7a\x22\x6f\x11\x9d\ +\x85\x81\x24\xb5\xde\x0a\x8a\xec\xab\xf0\x17\x4c\x33\x2c\x2a\x64\ +\x52\x82\x43\xb4\xda\x76\x9a\xac\xf2\xf7\x3d\xeb\xac\xf2\x9d\x9b\ +\xec\x6c\xaf\xf7\x71\x5b\x89\x0f\xd9\xac\xa3\x31\x4f\xde\xc8\x31\ +\x11\x73\x71\xb0\x3d\xcf\x60\x53\x0e\x65\x40\x19\x1e\x3f\xd8\xfb\ +\xbc\x9e\x56\x8f\x01\x3d\xb7\x2a\xff\xb9\x01\xe8\xee\x36\x9c\xeb\ +\x8b\x44\x43\x95\xb6\xaa\x7e\x81\xea\x80\x80\xcb\xea\xc2\x6f\xf7\ +\xe3\xb3\x27\x18\x11\x73\x64\x55\xd1\x14\x6c\xb0\xf0\xc0\xed\x76\ +\xb6\xd6\x95\x12\xf2\x38\xd0\xc5\xdc\x55\xf2\x59\x62\x51\x3b\x87\ +\xda\x35\x06\x5a\x54\xd2\x61\x65\x64\xfc\xcd\x0b\xbf\xd7\x66\xb3\ +\x8d\xc0\x05\xc0\xf8\x72\x02\x00\xee\x6f\x54\x9c\x23\x21\xfc\x5c\ +\xb1\x89\x96\x50\x28\x45\xb9\x27\x00\xa2\x86\xb7\xc0\x85\xcb\x96\ +\x44\x76\xeb\xdc\x5f\xe7\x60\x73\x45\x09\x76\xab\x34\x4f\xfc\x53\ +\x79\x14\xe2\x71\x99\x77\x3a\x04\x22\x4d\x2a\xa9\x4b\xd9\xcb\xf1\ +\x43\x5d\x7b\xd4\x84\xf2\x4f\xa0\xfb\x8b\xca\xdf\x34\x40\xe2\xe3\ +\x61\xd5\x75\xdb\xaa\x10\xba\xe9\x6e\xd5\xab\xb3\x26\x20\x61\xb3\ +\xc8\x20\x68\xf8\x9d\x4e\x6a\x43\x05\x94\x7a\x5c\x88\x92\x3a\xf7\ +\x21\x9d\x27\xae\x91\x25\x1a\x13\x38\xd2\x2a\x13\x3e\xa3\x93\xee\ +\x55\xc7\xe3\xef\x74\x3e\x9b\x9f\x4a\x1f\x05\x3a\x96\x42\x1e\x16\ +\x50\xd4\xeb\x92\xfd\x69\x35\x2e\x64\x23\xfd\x70\x21\x3a\x4c\x8e\ +\x14\x79\x52\x18\x42\x1a\xb3\x59\x43\x15\x32\xa8\xa4\xc9\x93\x46\ +\x25\x83\x4a\x06\x8d\x2c\xc3\x51\x9d\xc6\x73\x12\x91\x56\x83\x4c\ +\x8f\x3e\x1d\x7f\xb7\xeb\x85\xdc\x44\xf2\x28\x70\x0e\xd0\x97\x42\ +\x1e\x16\x50\xd4\xcf\xb6\x47\x32\x85\x75\x65\xf5\x82\x61\x6a\xd0\ +\xbd\x79\x2a\x82\x60\x31\x1b\xe8\x7c\xf6\x59\xff\xdf\x50\x18\x89\ +\xea\x1c\x6f\x33\x13\x39\x2b\xa2\x5c\xd0\x67\xa3\xc7\xcf\xbf\xa8\ +\x5c\x9e\x6a\x04\xce\x00\xda\x52\xc9\xc3\x02\xdb\x2a\x82\x6c\x7b\ +\x52\x1d\x95\x8c\xc8\x80\x44\x5f\x2c\x4e\xfe\xd3\x5d\x98\x1b\x57\ +\xee\xfe\xdc\x18\x89\xab\xfc\xbb\xcd\x42\xf8\xac\x89\x4c\x97\x94\ +\x89\x9f\xea\x7a\x29\x33\x3a\xd1\x08\x34\x71\x55\x35\xb5\x14\x2c\ +\xa8\xad\x32\xdd\x71\x69\xc2\x53\x5b\xbd\x45\x10\xe5\x4a\xbd\x30\ +\x4f\x59\x71\x1e\xd9\x94\x9f\xb7\x0b\x73\x63\x6c\x5c\xe7\x44\xab\ +\x83\x70\xab\x05\xa5\x4b\xcc\xc6\x3e\x3a\xff\xd2\x6c\xff\xd8\x95\ +\x6a\x2a\xbf\xd4\xf2\xb0\x88\xc6\x96\xa0\x0a\x4f\x69\x03\x26\x06\ +\x86\x4d\xf4\x47\x53\x9f\xd9\x05\x95\x34\x23\xe3\x79\x4e\xb5\x16\ +\x10\x3e\x67\x25\xd7\x61\xca\xc5\x9a\xbb\x5e\x4e\x44\x86\xdf\x66\ +\xae\x8e\xbd\xa6\x14\x5c\x2a\x16\xdc\xd8\x9a\xbc\x78\x69\xc0\x57\ +\x55\xb7\x03\x59\x0a\x19\x85\x39\xca\x4a\x52\x88\x72\x16\x8d\x1c\ +\xd1\x49\xf8\xb0\xc5\xc3\xa5\x36\x27\xf9\x76\x8b\x1a\x3d\xd7\xb9\ +\x77\xba\x37\xfc\x0f\xe0\x04\x57\xb5\x41\x96\x9a\x45\xb5\x16\x05\ +\x95\x67\xb4\x88\x95\xa1\x21\x1b\x03\x51\x8d\x3c\x29\xa2\x53\x2a\ +\x1f\x9e\x75\xd1\xd7\xee\x24\xdf\x6a\xd7\xc7\x3b\x3e\x79\x63\xf2\ +\x93\xde\x2b\xf2\x37\x2c\x05\x97\x8a\x45\x05\xb8\xb8\x79\xd3\x7e\ +\x63\x96\xc1\x74\xd8\x4e\x4f\xd8\x4a\x74\x4a\xa3\xe9\xac\x8f\x70\ +\x9b\x17\xad\xa5\xc0\x98\xbc\xd0\x73\x30\xd6\xdd\x79\x90\x39\xf9\ +\x6b\x1a\xb1\x5f\x06\x8b\xeb\x8d\x9e\x38\x61\x04\xca\xd7\xca\x62\ +\xd6\xfa\x40\xce\xaf\x33\x99\x30\x13\x69\x0b\xa1\x35\x3b\x99\xe8\ +\x0d\xbf\x3d\xda\xd1\xf2\x06\x73\xd5\xd4\xf4\x97\x62\x7b\x1d\x16\ +\xdd\x9d\x0e\xe6\x1c\xcf\x19\x53\xf2\x54\xb2\xcf\xc5\x40\x47\x08\ +\xbd\xd9\xcd\x4c\xdf\xd0\xd1\x91\xf6\x8f\xf7\xb3\x88\x52\x70\xa9\ +\x58\x74\x77\xba\xbf\xbf\x4d\xf5\x97\x54\xe7\xa4\x89\xc2\xad\x44\ +\xec\x24\x86\x86\x4f\x46\xce\x1d\xdf\xcb\x9c\x7c\x74\xe9\x15\x3f\ +\x9f\x5b\xfe\x83\xc3\x13\x28\xbb\x37\x97\xcf\xde\x95\x9a\x8e\x0e\ +\x30\x77\x54\x8e\x2d\x9d\xd6\x0a\x2b\xac\xb0\xc2\x0a\xff\x27\xfe\ +\x03\x72\x48\xe3\xb0\x1d\x11\x42\x9d\x00\x00\x00\x00\x49\x45\x4e\ +\x44\xae\x42\x60\x82\ +\x00\x00\x0a\x88\ +\x6f\ +\x70\x65\x6e\x46\x69\x6c\x65\x3d\x4f\x70\x65\x6e\x0d\x0a\x6f\x70\ +\x65\x6e\x46\x69\x6c\x65\x44\x65\x74\x61\x69\x6c\x3d\x4f\x70\x65\ +\x6e\x20\x69\x6d\x61\x67\x65\x20\x6f\x72\x20\x6c\x61\x62\x65\x6c\ +\x20\x66\x69\x6c\x65\x0d\x0a\x71\x75\x69\x74\x3d\x51\x75\x69\x74\ +\x0d\x0a\x71\x75\x69\x74\x41\x70\x70\x3d\x51\x75\x69\x74\x20\x61\ +\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x0d\x0a\x6f\x70\x65\x6e\ +\x44\x69\x72\x3d\x4f\x70\x65\x6e\x20\x44\x69\x72\x0d\x0a\x63\x6f\ +\x70\x79\x50\x72\x65\x76\x42\x6f\x75\x6e\x64\x69\x6e\x67\x3d\x43\ +\x6f\x70\x79\x20\x70\x72\x65\x76\x69\x6f\x75\x73\x20\x42\x6f\x75\ +\x6e\x64\x69\x6e\x67\x20\x42\x6f\x78\x65\x73\x20\x69\x6e\x20\x74\ +\x68\x65\x20\x63\x75\x72\x72\x65\x6e\x74\x20\x69\x6d\x61\x67\x65\ +\x20\x0d\x0a\x63\x68\x61\x6e\x67\x65\x53\x61\x76\x65\x64\x41\x6e\ +\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x44\x69\x72\x3d\x43\x68\x61\x6e\ +\x67\x65\x20\x64\x65\x66\x61\x75\x6c\x74\x20\x73\x61\x76\x65\x64\ +\x20\x41\x6e\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x20\x64\x69\x72\x0d\ +\x0a\x6f\x70\x65\x6e\x41\x6e\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x3d\ +\x4f\x70\x65\x6e\x20\x41\x6e\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x0d\ +\x0a\x6f\x70\x65\x6e\x41\x6e\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x44\ +\x65\x74\x61\x69\x6c\x3d\x4f\x70\x65\x6e\x20\x61\x6e\x20\x61\x6e\ +\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x20\x66\x69\x6c\x65\x0d\x0a\x63\ +\x68\x61\x6e\x67\x65\x53\x61\x76\x65\x44\x69\x72\x3d\x43\x68\x61\ +\x6e\x67\x65\x20\x53\x61\x76\x65\x20\x44\x69\x72\x0d\x0a\x6e\x65\ +\x78\x74\x49\x6d\x67\x3d\x4e\x65\x78\x74\x20\x49\x6d\x61\x67\x65\ +\x0d\x0a\x6e\x65\x78\x74\x49\x6d\x67\x44\x65\x74\x61\x69\x6c\x3d\ +\x4f\x70\x65\x6e\x20\x74\x68\x65\x20\x6e\x65\x78\x74\x20\x49\x6d\ +\x61\x67\x65\x0d\x0a\x70\x72\x65\x76\x49\x6d\x67\x3d\x50\x72\x65\ +\x76\x20\x49\x6d\x61\x67\x65\x0d\x0a\x70\x72\x65\x76\x49\x6d\x67\ +\x44\x65\x74\x61\x69\x6c\x3d\x4f\x70\x65\x6e\x20\x74\x68\x65\x20\ +\x70\x72\x65\x76\x69\x6f\x75\x73\x20\x49\x6d\x61\x67\x65\x0d\x0a\ +\x76\x65\x72\x69\x66\x79\x49\x6d\x67\x3d\x56\x65\x72\x69\x66\x79\ +\x20\x49\x6d\x61\x67\x65\x0d\x0a\x76\x65\x72\x69\x66\x79\x49\x6d\ +\x67\x44\x65\x74\x61\x69\x6c\x3d\x56\x65\x72\x69\x66\x79\x20\x49\ +\x6d\x61\x67\x65\x0d\x0a\x73\x61\x76\x65\x3d\x53\x61\x76\x65\x0d\ +\x0a\x73\x61\x76\x65\x44\x65\x74\x61\x69\x6c\x3d\x53\x61\x76\x65\ +\x20\x74\x68\x65\x20\x6c\x61\x62\x65\x6c\x73\x20\x74\x6f\x20\x61\ +\x20\x66\x69\x6c\x65\x0d\x0a\x63\x68\x61\x6e\x67\x65\x53\x61\x76\ +\x65\x46\x6f\x72\x6d\x61\x74\x3d\x43\x68\x61\x6e\x67\x65\x20\x73\ +\x61\x76\x65\x20\x66\x6f\x72\x6d\x61\x74\x0d\x0a\x73\x61\x76\x65\ +\x41\x73\x3d\x53\x61\x76\x65\x20\x41\x73\x0d\x0a\x73\x61\x76\x65\ +\x41\x73\x44\x65\x74\x61\x69\x6c\x3d\x53\x61\x76\x65\x20\x74\x68\ +\x65\x20\x6c\x61\x62\x65\x6c\x73\x20\x74\x6f\x20\x61\x20\x64\x69\ +\x66\x66\x65\x72\x65\x6e\x74\x20\x66\x69\x6c\x65\x0d\x0a\x63\x6c\ +\x6f\x73\x65\x43\x75\x72\x3d\x43\x6c\x6f\x73\x65\x0d\x0a\x63\x6c\ +\x6f\x73\x65\x43\x75\x72\x44\x65\x74\x61\x69\x6c\x3d\x43\x6c\x6f\ +\x73\x65\x20\x74\x68\x65\x20\x63\x75\x72\x72\x65\x6e\x74\x20\x66\ +\x69\x6c\x65\x0d\x0a\x64\x65\x6c\x65\x74\x65\x49\x6d\x67\x3d\x44\ +\x65\x6c\x65\x74\x65\x20\x63\x75\x72\x72\x65\x6e\x74\x20\x69\x6d\ +\x61\x67\x65\x0d\x0a\x64\x65\x6c\x65\x74\x65\x49\x6d\x67\x44\x65\ +\x74\x61\x69\x6c\x3d\x44\x65\x6c\x65\x74\x65\x20\x74\x68\x65\x20\ +\x63\x75\x72\x72\x65\x6e\x74\x20\x69\x6d\x61\x67\x65\x0d\x0a\x72\ +\x65\x73\x65\x74\x41\x6c\x6c\x3d\x52\x65\x73\x65\x74\x20\x49\x6e\ +\x74\x65\x72\x66\x61\x63\x65\x20\x61\x6e\x64\x20\x53\x61\x76\x65\ +\x20\x44\x69\x72\x0d\x0a\x72\x65\x73\x65\x74\x41\x6c\x6c\x44\x65\ +\x74\x61\x69\x6c\x3d\x52\x65\x73\x65\x74\x20\x41\x6c\x6c\x0d\x0a\ +\x62\x6f\x78\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\x3d\x42\x6f\x78\ +\x20\x4c\x69\x6e\x65\x20\x43\x6f\x6c\x6f\x72\x0d\x0a\x62\x6f\x78\ +\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\x44\x65\x74\x61\x69\x6c\x3d\ +\x43\x68\x6f\x6f\x73\x65\x20\x42\x6f\x78\x20\x6c\x69\x6e\x65\x20\ +\x63\x6f\x6c\x6f\x72\x0d\x0a\x63\x72\x74\x42\x6f\x78\x3d\x43\x72\ +\x65\x61\x74\x65\x20\x52\x65\x63\x74\x42\x6f\x78\x0d\x0a\x63\x72\ +\x74\x42\x6f\x78\x44\x65\x74\x61\x69\x6c\x3d\x44\x72\x61\x77\x20\ +\x61\x20\x6e\x65\x77\x20\x62\x6f\x78\x0d\x0a\x64\x65\x6c\x42\x6f\ +\x78\x3d\x44\x65\x6c\x65\x74\x65\x20\x52\x65\x63\x74\x42\x6f\x78\ +\x0d\x0a\x64\x65\x6c\x42\x6f\x78\x44\x65\x74\x61\x69\x6c\x3d\x52\ +\x65\x6d\x6f\x76\x65\x20\x74\x68\x65\x20\x62\x6f\x78\x0d\x0a\x64\ +\x75\x70\x42\x6f\x78\x3d\x44\x75\x70\x6c\x69\x63\x61\x74\x65\x20\ +\x52\x65\x63\x74\x42\x6f\x78\x0d\x0a\x64\x75\x70\x42\x6f\x78\x44\ +\x65\x74\x61\x69\x6c\x3d\x43\x72\x65\x61\x74\x65\x20\x61\x20\x64\ +\x75\x70\x6c\x69\x63\x61\x74\x65\x20\x6f\x66\x20\x74\x68\x65\x20\ +\x73\x65\x6c\x65\x63\x74\x65\x64\x20\x62\x6f\x78\x0d\x0a\x74\x75\ +\x74\x6f\x72\x69\x61\x6c\x3d\x50\x61\x64\x64\x6c\x65\x4f\x43\x52\ +\x20\x75\x72\x6c\x0d\x0a\x74\x75\x74\x6f\x72\x69\x61\x6c\x44\x65\ +\x74\x61\x69\x6c\x3d\x53\x68\x6f\x77\x20\x64\x65\x6d\x6f\x0d\x0a\ +\x69\x6e\x66\x6f\x3d\x49\x6e\x66\x6f\x72\x6d\x61\x74\x69\x6f\x6e\ +\x0d\x0a\x7a\x6f\x6f\x6d\x69\x6e\x3d\x5a\x6f\x6f\x6d\x20\x49\x6e\ +\x0d\x0a\x7a\x6f\x6f\x6d\x69\x6e\x44\x65\x74\x61\x69\x6c\x3d\x49\ +\x6e\x63\x72\x65\x61\x73\x65\x20\x7a\x6f\x6f\x6d\x20\x6c\x65\x76\ +\x65\x6c\x0d\x0a\x7a\x6f\x6f\x6d\x6f\x75\x74\x3d\x5a\x6f\x6f\x6d\ +\x20\x4f\x75\x74\x0d\x0a\x7a\x6f\x6f\x6d\x6f\x75\x74\x44\x65\x74\ +\x61\x69\x6c\x3d\x44\x65\x63\x72\x65\x61\x73\x65\x20\x7a\x6f\x6f\ +\x6d\x20\x6c\x65\x76\x65\x6c\x0d\x0a\x6f\x72\x69\x67\x69\x6e\x61\ +\x6c\x73\x69\x7a\x65\x3d\x4f\x72\x69\x67\x69\x6e\x61\x6c\x20\x73\ +\x69\x7a\x65\x0d\x0a\x6f\x72\x69\x67\x69\x6e\x61\x6c\x73\x69\x7a\ +\x65\x44\x65\x74\x61\x69\x6c\x3d\x5a\x6f\x6f\x6d\x20\x74\x6f\x20\ +\x6f\x72\x69\x67\x69\x6e\x61\x6c\x20\x73\x69\x7a\x65\x0d\x0a\x66\ +\x69\x74\x57\x69\x6e\x3d\x46\x69\x74\x20\x57\x69\x6e\x64\x6f\x77\ +\x0d\x0a\x66\x69\x74\x57\x69\x6e\x44\x65\x74\x61\x69\x6c\x3d\x5a\ +\x6f\x6f\x6d\x20\x66\x6f\x6c\x6c\x6f\x77\x73\x20\x77\x69\x6e\x64\ +\x6f\x77\x20\x73\x69\x7a\x65\x0d\x0a\x66\x69\x74\x57\x69\x64\x74\ +\x68\x3d\x46\x69\x74\x20\x57\x69\x64\x74\x68\x0d\x0a\x66\x69\x74\ +\x57\x69\x64\x74\x68\x44\x65\x74\x61\x69\x6c\x3d\x5a\x6f\x6f\x6d\ +\x20\x66\x6f\x6c\x6c\x6f\x77\x73\x20\x77\x69\x6e\x64\x6f\x77\x20\ +\x77\x69\x64\x74\x68\x0d\x0a\x65\x64\x69\x74\x4c\x61\x62\x65\x6c\ +\x3d\x45\x64\x69\x74\x20\x4c\x61\x62\x65\x6c\x0d\x0a\x65\x64\x69\ +\x74\x4c\x61\x62\x65\x6c\x44\x65\x74\x61\x69\x6c\x3d\x4d\x6f\x64\ +\x69\x66\x79\x20\x74\x68\x65\x20\x6c\x61\x62\x65\x6c\x20\x6f\x66\ +\x20\x74\x68\x65\x20\x73\x65\x6c\x65\x63\x74\x65\x64\x20\x42\x6f\ +\x78\x0d\x0a\x73\x68\x61\x70\x65\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\ +\x72\x3d\x53\x68\x61\x70\x65\x20\x4c\x69\x6e\x65\x20\x43\x6f\x6c\ +\x6f\x72\x0d\x0a\x73\x68\x61\x70\x65\x4c\x69\x6e\x65\x43\x6f\x6c\ +\x6f\x72\x44\x65\x74\x61\x69\x6c\x3d\x43\x68\x61\x6e\x67\x65\x20\ +\x74\x68\x65\x20\x6c\x69\x6e\x65\x20\x63\x6f\x6c\x6f\x72\x20\x66\ +\x6f\x72\x20\x74\x68\x69\x73\x20\x73\x70\x65\x63\x69\x66\x69\x63\ +\x20\x73\x68\x61\x70\x65\x0d\x0a\x73\x68\x61\x70\x65\x46\x69\x6c\ +\x6c\x43\x6f\x6c\x6f\x72\x3d\x53\x68\x61\x70\x65\x20\x46\x69\x6c\ +\x6c\x20\x43\x6f\x6c\x6f\x72\x0d\x0a\x73\x68\x61\x70\x65\x46\x69\ +\x6c\x6c\x43\x6f\x6c\x6f\x72\x44\x65\x74\x61\x69\x6c\x3d\x43\x68\ +\x61\x6e\x67\x65\x20\x74\x68\x65\x20\x66\x69\x6c\x6c\x20\x63\x6f\ +\x6c\x6f\x72\x20\x66\x6f\x72\x20\x74\x68\x69\x73\x20\x73\x70\x65\ +\x63\x69\x66\x69\x63\x20\x73\x68\x61\x70\x65\x0d\x0a\x73\x68\x6f\ +\x77\x48\x69\x64\x65\x3d\x53\x68\x6f\x77\x2f\x48\x69\x64\x65\x20\ +\x4c\x61\x62\x65\x6c\x20\x50\x61\x6e\x65\x6c\x0d\x0a\x75\x73\x65\ +\x44\x65\x66\x61\x75\x6c\x74\x4c\x61\x62\x65\x6c\x3d\x55\x73\x65\ +\x20\x64\x65\x66\x61\x75\x6c\x74\x20\x6c\x61\x62\x65\x6c\x0d\x0a\ +\x75\x73\x65\x44\x69\x66\x66\x69\x63\x75\x6c\x74\x3d\x44\x69\x66\ +\x66\x69\x63\x75\x6c\x74\x0d\x0a\x62\x6f\x78\x4c\x61\x62\x65\x6c\ +\x54\x65\x78\x74\x3d\x42\x6f\x78\x20\x4c\x61\x62\x65\x6c\x73\x0d\ +\x0a\x6c\x61\x62\x65\x6c\x73\x3d\x4c\x61\x62\x65\x6c\x73\x0d\x0a\ +\x61\x75\x74\x6f\x53\x61\x76\x65\x4d\x6f\x64\x65\x3d\x41\x75\x74\ +\x6f\x20\x53\x61\x76\x65\x20\x6d\x6f\x64\x65\x0d\x0a\x73\x69\x6e\ +\x67\x6c\x65\x43\x6c\x73\x4d\x6f\x64\x65\x3d\x53\x69\x6e\x67\x6c\ +\x65\x20\x43\x6c\x61\x73\x73\x20\x4d\x6f\x64\x65\x0d\x0a\x64\x69\ +\x73\x70\x6c\x61\x79\x4c\x61\x62\x65\x6c\x3d\x44\x69\x73\x70\x6c\ +\x61\x79\x20\x4c\x61\x62\x65\x6c\x73\x0d\x0a\x66\x69\x6c\x65\x4c\ +\x69\x73\x74\x3d\x46\x69\x6c\x65\x20\x4c\x69\x73\x74\x0d\x0a\x66\ +\x69\x6c\x65\x73\x3d\x46\x69\x6c\x65\x73\x0d\x0a\x61\x64\x76\x61\ +\x6e\x63\x65\x64\x4d\x6f\x64\x65\x3d\x41\x64\x76\x61\x6e\x63\x65\ +\x64\x20\x4d\x6f\x64\x65\x0d\x0a\x61\x64\x76\x61\x6e\x63\x65\x64\ +\x4d\x6f\x64\x65\x44\x65\x74\x61\x69\x6c\x3d\x53\x77\x74\x69\x63\ +\x68\x20\x74\x6f\x20\x61\x64\x76\x61\x6e\x63\x65\x64\x20\x6d\x6f\ +\x64\x65\x0d\x0a\x73\x68\x6f\x77\x41\x6c\x6c\x42\x6f\x78\x44\x65\ +\x74\x61\x69\x6c\x3d\x53\x68\x6f\x77\x20\x61\x6c\x6c\x20\x62\x6f\ +\x75\x6e\x64\x69\x6e\x67\x20\x62\x6f\x78\x65\x73\x0d\x0a\x68\x69\ +\x64\x65\x41\x6c\x6c\x42\x6f\x78\x44\x65\x74\x61\x69\x6c\x3d\x48\ +\x69\x64\x65\x20\x61\x6c\x6c\x20\x62\x6f\x75\x6e\x64\x69\x6e\x67\ +\x20\x62\x6f\x78\x65\x73\x0d\x0a\x61\x6e\x6e\x6f\x50\x61\x6e\x65\ +\x6c\x3d\x61\x6e\x6e\x6f\x20\x50\x61\x6e\x65\x6c\x0d\x0a\x61\x6e\ +\x6e\x6f\x3d\x61\x6e\x6e\x6f\x0d\x0a\x61\x64\x64\x4e\x65\x77\x42\ +\x62\x6f\x78\x3d\x6e\x65\x77\x20\x62\x62\x6f\x78\x0d\x0a\x72\x65\ +\x4c\x61\x62\x65\x6c\x3d\x72\x65\x4c\x61\x62\x65\x6c\x0d\x0a\x63\ +\x68\x6f\x6f\x73\x65\x6d\x6f\x64\x65\x6c\x3d\x43\x68\x6f\x6f\x73\ +\x65\x20\x4f\x43\x52\x20\x6d\x6f\x64\x65\x6c\x0d\x0a\x74\x69\x70\ +\x63\x68\x6f\x6f\x73\x65\x6d\x6f\x64\x65\x6c\x3d\x43\x68\x6f\x6f\ +\x73\x65\x20\x4f\x43\x52\x20\x6d\x6f\x64\x65\x6c\x20\x66\x72\x6f\ +\x6d\x20\x64\x69\x72\x0d\x0a\x49\x6d\x61\x67\x65\x52\x65\x73\x69\ +\x7a\x65\x3d\x49\x6d\x61\x67\x65\x20\x52\x65\x73\x69\x7a\x65\x0d\ +\x0a\x49\x52\x3d\x49\x6d\x61\x67\x65\x20\x52\x65\x73\x69\x7a\x65\ +\x0d\x0a\x61\x75\x74\x6f\x52\x65\x63\x6f\x67\x6e\x69\x74\x69\x6f\ +\x6e\x3d\x41\x75\x74\x6f\x20\x52\x65\x63\x6f\x67\x6e\x69\x74\x69\ +\x6f\x6e\x0d\x0a\x72\x65\x52\x65\x63\x6f\x67\x6e\x69\x74\x69\x6f\ +\x6e\x3d\x52\x65\x2d\x72\x65\x63\x6f\x67\x6e\x69\x74\x69\x6f\x6e\ +\x0d\x0a\x6d\x66\x69\x6c\x65\x3d\x66\x69\x6c\x65\x0d\x0a\x6d\x65\ +\x64\x69\x74\x3d\x65\x69\x64\x74\x0d\x0a\x6d\x76\x69\x65\x77\x3d\ +\x76\x69\x65\x77\x0d\x0a\x6d\x68\x65\x6c\x70\x3d\x68\x65\x6c\x70\ +\x0d\x0a\x69\x63\x6f\x6e\x4c\x69\x73\x74\x3d\x49\x63\x6f\x6e\x20\ +\x4c\x69\x73\x74\x0d\x0a\x64\x65\x74\x65\x63\x74\x69\x6f\x6e\x42\ +\x6f\x78\x70\x6f\x73\x69\x74\x69\x6f\x6e\x3d\x44\x65\x74\x65\x63\ +\x74\x69\x6f\x6e\x20\x62\x6f\x78\x20\x70\x6f\x73\x69\x74\x69\x6f\ +\x6e\x0d\x0a\x72\x65\x63\x6f\x67\x6e\x69\x74\x69\x6f\x6e\x52\x65\ +\x73\x75\x6c\x74\x3d\x52\x65\x63\x6f\x67\x6e\x69\x74\x69\x6f\x6e\ +\x20\x72\x65\x73\x75\x6c\x74\x0d\x0a\x63\x72\x65\x61\x74\x50\x6f\ +\x6c\x79\x67\x6f\x6e\x3d\x43\x72\x65\x61\x74\x65\x20\x51\x75\x61\ +\x64\x72\x69\x6c\x61\x74\x65\x72\x61\x6c\x0d\x0a\x64\x72\x61\x77\ +\x53\x71\x75\x61\x72\x65\x73\x3d\x44\x72\x61\x77\x20\x53\x71\x75\ +\x61\x72\x65\x73\x0d\x0a\x73\x61\x76\x65\x52\x65\x63\x3d\x53\x61\ +\x76\x65\x20\x52\x65\x63\x6f\x67\x6e\x69\x74\x69\x6f\x6e\x20\x52\ +\x65\x73\x75\x6c\x74\x0d\x0a\x74\x65\x6d\x70\x4c\x61\x62\x65\x6c\ +\x3d\x54\x45\x4d\x50\x4f\x52\x41\x52\x59\x0d\x0a\x73\x65\x74\x70\ +\x73\x3d\x53\x74\x65\x70\x73\ +\x00\x00\x06\x33\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x10\x00\x00\ +\x0b\x10\x01\xad\x23\xbd\x75\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ +\xd3\x09\x09\x14\x30\x03\x75\x06\x85\x3f\x00\x00\x05\xc0\x49\x44\ +\x41\x54\x78\xda\xc5\x97\x4d\x6c\x1b\xd7\x11\xc7\x7f\xbb\x5c\x7e\ +\x73\xad\x95\xe4\xc8\x72\x9c\x2a\x52\x80\x26\x46\x9a\xda\x54\x84\ +\xd4\x69\x9b\x16\x16\x20\x07\x69\x51\x24\x05\x9a\x22\x40\x0e\x59\ +\x03\x86\x7b\xe8\xc5\xe8\xb9\x28\x24\xf4\xd2\xab\xdd\x1e\x7b\xf1\ +\xa2\x97\xa2\x48\x51\xb4\x75\x5a\xc4\x68\x2b\xa1\x89\x03\x3b\x85\ +\x62\x26\x76\x52\x35\x82\x2d\xda\xaa\xf5\x41\x52\x21\x25\x92\xbb\ +\xfc\x58\xbe\xd7\xc3\x92\x14\x29\x92\x26\x9b\x4b\x1e\x30\xc4\xf2\ +\xbd\x99\xf7\xff\xef\xbc\xd9\x99\x79\x8a\x94\x92\x2f\x72\x68\x00\ +\xa6\x69\x0e\x6c\xb0\xfa\x98\x35\x09\x4c\x4a\xc9\xe9\xc6\x9c\x90\ +\x20\x04\x4b\x02\x92\xcf\x6c\x99\xc9\x41\xf7\xb2\x2c\xcb\x23\xd0\ +\x6f\xdc\x99\xb0\x0c\xe0\x2c\x60\x22\x88\xb7\x3a\xad\x0e\x8e\x80\ +\x79\x80\xdb\xe3\x56\x42\x48\x2c\x29\xb8\x7c\x32\x6d\xe6\x06\xf2\ +\x40\x1f\xf0\x05\xe0\x02\x60\xa8\x0a\x44\xc3\x10\xf4\xc3\x89\x47\ +\xf3\x44\xc3\x41\x00\xa4\x28\xf3\xde\x5d\x1d\xbb\x04\xc5\x32\xf1\ +\x72\x95\x38\x30\x7f\xf3\xb0\x75\x69\x3a\x63\x2e\x7c\x2e\x02\x6b\ +\x8f\x5b\x86\x90\x2c\x02\x71\x4d\x85\x58\x18\xbe\x7b\xb2\x4a\x7c\ +\x4a\x65\xfa\x09\x1f\xa0\xb7\x68\x07\xf8\x09\xb0\x9e\x11\x7c\xb8\ +\x26\x78\xe7\xd6\x2e\xd7\xd6\x46\x0d\xe1\x32\xbf\x3c\x6a\xbd\x02\ +\xcc\xce\xec\x74\xf7\x86\xd6\x03\x3c\x5e\x07\x37\xf4\x10\xcc\x3e\ +\x5d\xe1\xfb\xa7\x34\x46\x74\x3f\x00\x99\x3d\xc1\xda\x86\x4d\xc5\ +\x15\x08\xa9\x34\xed\x9e\x7d\x52\x67\xf6\x84\xca\xec\x89\x51\xde\ +\xfe\xc0\xe5\x8f\x37\x4a\x7c\xb2\x15\x8b\x0b\xc1\xda\x0d\xc3\x9a\ +\x3d\x95\x33\x13\x7d\x09\xb4\xbc\xb9\xf1\xc4\x61\x87\x1f\x7c\xdd\ +\x4f\x7c\x2a\x00\xc0\xc6\x8e\xcb\xd6\x8e\x03\xc0\x8b\x33\x7a\x07\ +\xf1\xab\xcb\x79\x00\x9e\x9a\xd0\x79\xe1\x69\x8d\x2f\x3f\x1a\xe1\ +\xcd\xa5\x6d\xfe\x74\xfb\x88\x01\x2c\x5e\x1f\xb2\xa6\x9e\xdf\x6d\ +\xf7\x44\x07\x81\x06\xb8\x11\x85\x73\x73\x41\x8e\x0c\xab\x38\x55\ +\x48\x65\x2b\x14\x8b\x0e\xdf\xf9\xda\x50\xcf\xf3\x6c\x90\xba\xba\ +\x9c\x67\xe2\xa8\xce\xa1\xa8\xca\xeb\x67\xc6\xa8\xc9\x14\x57\x6e\ +\x8f\x19\xc0\x22\x30\xdd\x6a\xa3\x76\x09\xb8\xb8\x1e\x82\xd7\x9e\ +\x77\x89\x86\x54\x0a\x0e\x64\xf3\xa2\x2f\xf8\x41\x22\xf7\x37\xf3\ +\x14\x1c\x70\x6b\x0a\x67\x9e\x3b\xcc\xf1\x71\x1b\x21\x89\xbf\x77\ +\xc8\x5a\xe8\x4a\xa0\xfe\xa9\x5d\x50\x15\x78\x6e\xaa\xc2\xe4\xb8\ +\x86\x53\x05\xa7\x0a\x77\x1e\x14\x3b\xc0\x37\xb3\x70\x6d\x05\xde\ +\x59\x81\xeb\xab\x90\x2f\xb5\x93\xf8\xd6\x57\xf5\xa6\x7d\x34\xac\ +\xf2\xf2\xa9\x00\x7e\x1f\x08\xc9\x85\x77\x75\xcb\xe8\xe6\x81\xb3\ +\x80\x71\x28\x02\x27\xa6\x34\xf2\x0e\x4d\x19\x1f\x6e\x73\x14\x4e\ +\x05\x6e\x26\x61\xb7\xbe\xfe\x59\x01\xfe\x9e\xa8\x50\x2c\xb9\x4d\ +\x9d\x70\x00\xca\x95\xfd\x3d\x8e\x8e\x68\x3c\xfb\xa5\x3c\x80\x21\ +\x24\x67\xbb\x11\x30\x55\x05\xa6\x27\xaa\x80\x8a\x5d\xa2\x29\x41\ +\x7f\x3b\x81\x8f\xd7\x69\x5b\xb7\x4b\x9e\x07\xd6\xb7\x9d\x36\x3d\ +\xbf\xe6\xad\xad\x6d\xd5\xf8\xd7\xaa\x8b\x1e\x0b\xa0\xa9\x20\x04\ +\x66\x5b\x10\xae\x3e\x66\x4d\x22\x88\x87\x43\x30\x14\x53\x29\x96\ +\xdb\xdd\x69\x87\x02\xcd\xe7\xb2\x0b\x9f\x6e\x42\xd5\x6d\xd7\xd9\ +\xdd\x49\x73\xfc\xf4\xb1\xb6\xb9\x7f\x7c\x58\x25\x99\x56\xb0\x5d\ +\xad\x09\x37\x12\x83\x8d\x2c\xf1\xa5\x88\x35\x09\x24\x1b\x2b\x93\ +\x52\x7a\x6e\x0b\xf8\x3a\x09\xdc\x49\xf9\xf8\xcb\x4d\x18\x89\xc1\ +\xea\x46\xe7\x79\xbb\xf6\x36\xaf\x7c\xd3\x68\x9b\xfb\xf7\x7f\x05\ +\x9f\x6c\xfa\x3b\x02\x34\x16\x06\xb2\x20\x25\xfb\x04\x1a\x85\x25\ +\xa4\xd5\x28\xd7\x7c\x94\x6b\x9d\x91\xfd\xf1\x7a\x8f\x54\x5a\xd9\ +\xe6\x47\xdf\x1b\x25\x1a\xda\xff\xa2\xed\xb2\xe4\xd7\x57\xab\x40\ +\xb0\x43\x3f\xe8\x07\x29\x41\x78\x98\x4b\x5a\x6b\x51\x31\x22\x35\ +\x8a\x65\xdf\xc0\x95\x31\x50\xbe\xc7\x8f\x5f\x3d\xd6\x01\xfe\x8b\ +\xdf\x57\x58\xcf\x05\xbb\xda\x84\x03\x1e\x96\xd7\x06\x28\x5e\x0c\ +\x88\x7a\x75\x13\x42\xa1\xe0\x0c\x06\x2e\x4b\x29\x7e\xfe\x46\x77\ +\xf0\x95\xad\xe0\xc3\x6d\x5b\xca\xa9\x47\x40\x78\x7f\xb2\xb6\x86\ +\xcf\xdf\x1f\x5c\x41\xf2\xd2\x71\xd1\x06\x9e\xde\x93\xfc\xea\x4a\ +\x95\x4f\xb7\x83\xa8\x4a\x6f\xdb\x83\xf1\xd5\xd8\x61\x49\xc0\x7c\ +\x55\x28\x94\xab\x0f\x67\xee\xd5\x7e\x85\xa7\x26\x22\x6d\x6b\xbf\ +\x7c\xab\xc6\xdd\x4c\x00\xad\xcf\x09\x96\xab\x80\x14\x00\x4b\xe0\ +\xab\x7b\x00\x92\x8d\x04\xe3\xd6\xc0\xa7\xca\x16\x50\xa5\x79\x44\ +\xa0\x34\x7f\x15\xf6\x75\xee\x67\x24\x6b\x69\x0d\x65\x80\xa3\xcb\ +\x15\x00\xcf\x36\xd9\x4c\x44\xcf\x6c\x99\x49\x21\x49\xec\xd9\xa0\ +\x2a\x1e\x68\x43\xc0\x9b\x3b\x28\x99\xc2\xfe\xab\x2e\xdf\x55\xba\ +\xea\x74\x93\xd4\x1e\x00\x89\xb9\xca\xb9\x64\x5b\x35\x94\x02\xab\ +\x2c\x88\xdb\x25\x17\x23\xd6\xbf\x53\xfb\xdd\xfb\x31\x36\xf2\x50\ +\x2c\x79\x35\x21\x30\x40\x73\xb7\x99\x75\x71\xbd\x04\x66\x75\x2b\ +\xc7\x97\x81\xf9\xf5\x1d\xd5\x38\x32\xdc\x7f\x33\xbb\xf0\x19\x46\ +\xc0\x4f\x48\xba\x8c\x0f\xe9\x64\xed\xfe\x0c\xfe\xb3\xa1\x00\x32\ +\x57\xc7\x6a\xaf\x05\x27\xd3\x66\x4e\x48\x2e\x15\x2b\x2a\xd9\xdd\ +\x02\xe1\x00\x3d\xc5\x27\xf2\xfc\xec\x87\x7e\x5e\x9c\xd1\x79\xf9\ +\x1b\xc3\xfc\xf4\x55\x0d\x23\xca\x43\x6d\xb6\x32\x79\x9c\xb2\x04\ +\xc4\xa5\xb9\xca\xb9\x5c\xd7\x7e\xa0\xde\x40\x26\x3e\x7a\x10\xa3\ +\x54\xcc\xe2\xd7\xe8\x2e\x8a\xcb\xe3\x47\xf5\xb6\xe4\x32\x39\x46\ +\x4f\xfd\xbd\xdc\x0e\xd7\xef\x84\x01\x91\x98\xab\x9c\x5f\xe8\xd9\ +\x90\xd4\xc7\xac\x10\xe4\xfe\xb6\x32\x4c\xa5\x90\x26\xe8\xa7\x43\ +\xc2\x91\x30\x4e\xe5\xc0\x91\x94\xe8\xaa\x6b\xef\xa5\x78\xeb\xd6\ +\x10\x20\x72\xc0\xec\x41\xb0\x0e\x02\x33\x3b\x66\x4e\x48\x66\xa5\ +\x24\x77\xe5\xf6\x23\x64\x52\xa9\x0e\x77\xea\xb1\x10\xbf\xbd\xe6\ +\x55\xc5\x7b\x69\xf8\xc3\xfb\x50\x72\x3b\xdd\xbe\xb9\xb9\xc9\x9b\ +\xcb\x23\x4d\xf0\xb9\xca\xf9\xdc\x40\x5d\xf1\xa9\x9c\x99\xb8\x3e\ +\x64\x4d\x09\xc9\xe2\xdb\x2b\x63\xf1\xc3\xf7\x6d\xce\x7c\xa5\xc0\ +\xe8\xe8\x58\x53\x67\xcf\x86\xbf\x7e\xb0\x6f\xd3\x92\x14\xc9\xa4\ +\x1e\xf0\xe7\x8f\x86\x48\x17\x1e\x01\x44\xa2\x17\xf8\x43\xef\x05\ +\xf5\xee\x75\xfa\x5d\xdd\x5a\x48\x15\x23\x17\x7e\x73\x23\x62\x1c\ +\xd3\xf3\xcc\x4c\xec\x32\x36\x1c\x24\x14\x0c\x11\x8d\x79\x71\x50\ +\x2c\xe6\x71\x1c\x87\xad\x4c\x89\x1b\xf7\x0c\x36\xf6\x8e\x00\xe4\ +\xbc\x80\x3b\xff\xf9\x2e\x26\x8d\xf1\x42\xde\x5c\xf8\x67\xcc\xba\ +\x08\x9c\x5d\xdf\xd5\xcd\xf5\x5b\x7a\xbc\x5e\x4e\x5b\x0a\x4b\x0c\ +\x64\xa4\x91\xe1\x12\xde\x77\x2e\x2e\xf7\x7a\xeb\xff\x8b\x00\xc0\ +\xb7\x0b\x66\x0e\xb8\x08\x5c\x5c\x0c\x7b\x97\x53\xe0\x74\xb3\xaa\ +\x35\x73\x3b\xc9\x46\x86\x1b\x74\x28\x5f\xf4\xf5\xfc\x7f\x92\x93\ +\xb2\xba\x6d\x79\x43\x86\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ +\x60\x82\ +\x00\x00\x02\xa3\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x3c\x00\x00\x00\x3c\x08\x06\x00\x00\x00\x3a\xfc\xd9\x72\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\ +\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ +\xe2\x03\x02\x04\x34\x31\x97\x0c\xf9\x63\x00\x00\x00\x19\x74\x45\ +\x58\x74\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\ +\x64\x20\x77\x69\x74\x68\x20\x47\x49\x4d\x50\x57\x81\x0e\x17\x00\ +\x00\x02\x0b\x49\x44\x41\x54\x68\xde\xed\x98\xcd\x4b\x94\x51\x14\ +\xc6\x7f\x16\x96\x7d\x2c\xa2\x55\x1b\x3f\x90\xc0\x45\x60\x21\x6e\ +\x5b\x04\x15\x45\x14\x06\x23\xae\x5a\xbb\x90\x72\x21\x6d\x4a\xa5\ +\x76\x41\x7f\x41\xae\xda\x88\x91\xd2\x22\x17\x66\x10\xa2\x92\x50\ +\x18\x45\x05\x81\x04\xd9\x2a\x22\xa5\x60\x48\xc4\x84\x69\x73\x16\ +\x0f\x2f\x33\x13\xfa\x5e\x21\xc6\xe7\x07\x97\xfb\xce\x73\xce\x7d\ +\xee\xdc\x97\x73\xef\x65\x06\x8c\x31\xc6\x18\x63\x8c\x31\xc6\x18\ +\x63\x8c\x49\x4e\x0f\x50\x8a\x76\x26\xb5\xf9\x9e\xff\x70\xc1\xed\ +\xf2\xfc\x61\x37\x2d\xf8\x1b\xb0\xb2\x9b\x16\xfc\x7e\x27\xcc\xb7\ +\xb2\xe0\x59\xd9\x5b\xa7\x32\xb1\xe3\xc0\x9f\x88\x7d\x02\xf6\x49\ +\xac\x1e\xb8\x01\xbc\x04\x7e\x46\x9b\x03\x7a\xcb\xcc\x7f\x04\x68\ +\xaa\x50\xce\x5b\xf1\x49\xc2\x7d\x59\x70\x4f\x26\xf6\x48\x62\x67\ +\x45\xef\x00\xde\x4a\x2c\xdb\x9e\x03\x7b\x25\xff\xb4\xc4\xae\xe5\ +\xf0\x49\x42\xb7\x4c\x30\x2c\x7a\xa7\xe8\xe3\xa2\x9f\x00\xd6\x24\ +\x36\x0d\xdc\x01\x1e\x02\x9b\xa2\xdf\x94\x31\x7d\xa2\x9f\xcc\xe1\ +\x93\x84\x66\x31\x1f\x0d\xad\x0e\x78\x11\xda\x9a\x94\xe3\x81\x28\ +\xc9\x12\xb0\x01\x5c\xce\x78\x15\xc4\xeb\xb5\xe8\x0f\x42\xdb\x04\ +\xf6\xe7\xf0\x49\x42\x1d\xf0\x3d\xcc\x17\x43\xbb\x20\x13\xde\x92\ +\xdc\xeb\xa2\xdf\xae\xe0\xb5\x1a\xf1\xdf\xa2\x2f\x84\xf6\x31\xa7\ +\x4f\x32\x26\xc3\xbc\x18\x7b\xe6\x5d\x7c\xfe\x0c\x34\x48\xde\x94\ +\x7c\xd1\xd6\x32\x3e\xf5\x52\xa6\x5f\xe5\x00\x2d\x86\x36\x96\xc3\ +\x27\xe9\xb5\xf4\x2a\xfa\xc3\xc0\x80\xec\xb3\x7e\x60\x5d\xf2\x8e\ +\xc9\x73\xb1\x8c\xcf\x95\x28\x57\x80\x67\xd1\xb7\x84\xaf\x5e\x49\ +\xdb\xf1\x49\xca\x79\x79\xe3\x1b\xd1\x3f\x2d\x93\x37\x56\xa5\x14\ +\x3b\x81\x1f\x11\x5b\x05\x1a\x43\xef\x92\x31\x97\x72\xf8\x24\xe5\ +\x68\xe6\x3a\x58\xaf\x50\x6a\x85\x4c\xde\x13\x60\x08\x78\x2c\xf7\ +\x75\x09\xb8\x28\x63\x86\x45\x6f\xca\xe1\x93\x9c\x25\x99\xe8\x6e\ +\x95\xbc\x91\x2a\xf7\xe6\x97\x38\xf0\x94\x89\x88\xfd\x8a\xc3\x68\ +\xbb\x3e\x49\x69\x00\x96\x63\xb2\x65\xe0\xe0\x3f\x4e\xf5\x02\x30\ +\x13\x25\x57\x04\xde\x00\x83\xc0\xa1\x2a\x2f\x72\x3e\xa7\x4f\x52\ +\x06\xe5\xed\x5e\xad\xf5\xdf\xa9\xcd\x72\x05\x4c\x67\xca\xae\x26\ +\x99\x90\xd3\xb9\xad\xd6\x17\x7b\x4e\x4a\xf9\x9e\xff\x94\x31\xc6\ +\x18\x63\x8c\x31\xc6\x18\x63\x8c\x31\xc6\x98\x54\xfc\x05\x94\x34\ +\xe4\xeb\x87\xd7\x3b\x14\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ +\x60\x82\ +\x00\x00\x04\xa3\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xd6\xd8\xd4\x4f\x58\x32\ +\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ +\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ +\x79\x71\xc9\x65\x3c\x00\x00\x04\x35\x49\x44\x41\x54\x58\xc3\xe5\ +\x97\xcd\x8f\x54\x45\x14\xc5\x7f\xb7\xea\xd6\x7b\xaf\xdb\x6e\xc7\ +\xf9\x40\x9d\x89\x46\x4d\x34\x99\x44\x8d\x1a\x48\x98\xc4\x8c\x1f\ +\x1b\xfe\x02\x4c\x5c\xf1\x07\x18\x16\x2e\x4d\x5c\x6b\x58\xc3\x8e\ +\xc4\x8d\x1b\x17\xce\x82\x68\x74\x41\x5c\x18\x0d\xe2\xc4\xc6\x00\ +\x3d\x60\x50\x51\x19\x60\x02\xa2\x0e\x0c\x83\xd3\xfd\x5e\xf7\x94\ +\x8b\xaa\xee\xf9\x60\xe6\x0d\x84\x51\x16\x56\x52\xa9\xce\x7b\xb7\ +\xeb\x9e\x3a\xf7\xd4\xa9\x7a\xea\xbd\xe7\x7e\x36\xe5\x3e\xb7\x3e\ +\x80\x5d\xbb\x76\xbd\x03\xec\xfd\x8f\xf2\x4e\x35\x1a\x8d\x03\xeb\ +\x19\xd8\xbb\xef\xbd\xa3\x3b\x1f\x1f\x76\x00\x9c\x3c\x3a\xcf\xcc\ +\x97\x37\x58\x9c\xef\xdc\x53\xa6\xda\xa0\xf2\xdc\x6b\x03\xbc\xb8\ +\x67\x10\x80\x8b\x7f\x16\x7c\xf8\xee\x1e\x80\xdb\x00\x70\xfc\xec\ +\x1c\xdf\x3f\x30\x04\x78\x2e\xfd\xb8\xc0\xfe\xb7\xce\x6f\xcb\x72\ +\x0f\x1d\x79\x9a\x0b\x23\x96\xd3\x9f\x1f\x64\xfc\xd5\x7d\x9b\x6b\ +\x40\x45\xb0\x16\x40\x78\x70\x2c\x23\xcb\xb2\x6d\x01\x30\x30\x96\ +\x61\x8d\x50\x1b\x7c\x14\x23\x25\x22\x14\x2b\xd8\x18\x91\xd5\x95\ +\x73\xe7\xce\x83\x2a\xb8\x04\xd2\x14\xb2\x0c\xd2\x2c\x8c\x49\x0a\ +\x49\x12\xde\x77\x3a\x90\xe7\x90\xb7\xa1\xd5\x82\x76\x2b\x8e\x6d\ +\x28\x72\xb2\xfa\x38\xd6\x0a\xe3\xaf\xbc\x49\x6b\xf1\xfa\xe6\x00\ +\xac\x15\xac\x15\x04\xb0\x46\xd8\xbd\x7b\xe7\x16\x6b\xeb\x86\xae\ +\x80\x5a\xa8\x56\x81\xea\x6d\x51\x8d\xaf\x04\xb5\x82\xf7\xa0\xa6\ +\x84\x01\x67\x05\x35\x82\x08\xa8\x0a\x95\x2c\xc3\x23\x20\x1e\x08\ +\xc0\xf0\x1e\x2f\x02\xde\x23\x12\x26\x15\x7c\x88\x23\xc4\x21\x1e\ +\x3c\x21\x5e\x40\x4d\x58\x18\x40\xd7\x4a\x89\x06\xac\xa0\xda\x63\ +\x00\x9a\x33\xbf\x05\x8a\x53\x07\x69\x02\x95\x04\xb2\x34\xf6\x04\ +\x12\x07\x4e\xa1\xe8\x40\x5e\x40\x2b\x8f\xbd\x05\x4b\x39\xb4\x73\ +\xc8\x0b\x54\x87\x71\x3d\x00\x2a\xe5\x25\x70\x31\x40\xd5\x30\x39\ +\xf9\xd2\xd6\x0a\xf3\x3e\xd0\xaf\x16\xaa\x1b\x8b\xf6\xd8\x27\x61\ +\x61\xbd\x1c\x25\x25\x20\x00\xf0\x81\x8d\x34\x4d\xa3\x3a\xc3\xb3\ +\x98\x11\x89\x6c\x07\xda\x63\x09\x56\x98\x5f\x29\x46\xfc\x61\xcd\ +\x72\x7f\x61\x1d\x2d\xd1\x80\x3a\x09\x54\x49\x18\x4f\x34\x2f\xe0\ +\x9d\x85\xc4\x21\x89\xc3\x67\x09\x92\x69\xd8\x11\x89\xe2\x13\x87\ +\x58\x8b\xef\x76\x91\xbc\x80\xbc\x03\xed\x02\xdf\x6a\x23\xed\x02\ +\xf2\x02\x9f\x77\x50\x1d\x45\xd5\x20\x78\x3a\xeb\x54\x78\x9b\x06\ +\x9c\x33\x78\x0f\x03\x8f\x24\xbc\xfe\xf2\xf3\x77\x68\xe8\x36\x68\ +\xa4\xbe\xf1\xeb\xc6\xfc\xdf\xb1\x04\x52\x5e\x82\x44\x4d\x5f\x84\ +\x8f\x0d\xa5\x38\xe7\xb6\xc5\x88\x9e\x18\x4b\xb9\x76\xb3\x03\x08\ +\x9d\x52\x11\xaa\x90\xb8\x50\xef\x5a\xc5\x30\x7d\xb1\xcb\x40\xc5\ +\xb0\x0e\xf4\x26\xad\x57\xf9\x55\x2e\xe1\xe1\xc6\xd2\x32\xf5\xcc\ +\x70\x7d\xc9\x84\x2d\xe9\x4a\x19\x10\x9c\x1a\xc0\x73\xe5\x66\x97\ +\x2b\x37\xbb\xac\x51\x57\x3f\xd7\xaa\x64\x7e\xc5\x27\xa2\x29\xac\ +\x05\x15\xc3\x9c\x0b\xb5\x77\xa6\x6c\x17\xa8\xc1\xa9\x20\xc8\x1a\ +\x35\xaf\x9b\x35\x1a\x8f\x59\x31\x9e\xfe\x7b\xe9\xef\x14\x00\xf1\ +\x82\xef\x9b\x58\x30\x2b\x57\x56\x02\x55\x21\xd1\x90\xfc\xe7\x53\ +\xdf\xf2\xeb\x99\x13\x2c\x2d\xde\xb8\xa7\xfa\x57\x6a\x03\x3c\xf5\ +\xec\x4e\x9e\x79\x61\x02\x0f\xa8\x33\x5b\x31\x10\x03\x7c\x87\xf7\ +\xf7\xbf\xc1\xc2\xc2\x02\xb7\x6e\xdd\xa2\x28\x0a\x44\x04\x6b\x2d\ +\xd6\x5a\x54\x15\x55\xc5\x39\x87\xaa\x62\xad\xc5\x98\xf0\xdf\xe5\ +\xe5\x65\xf2\x3c\xef\xf7\x23\xcd\xf9\xb8\xf2\x2d\x18\x70\x56\x50\ +\x17\x18\xdc\x31\x3a\xb6\x72\x4f\x38\x7e\x9c\xe9\xe9\x69\x8c\x31\ +\x78\xef\x99\x98\x98\x60\x72\x72\xf2\x8e\x59\xd8\x31\x3a\xd6\xdf\ +\x86\xae\xd4\x09\x55\x70\x36\xac\xa2\x56\xaf\xf7\x6b\x39\x33\x33\ +\xc3\xd0\xd0\x10\xd6\x5a\xbc\xf7\x34\x9b\xcd\xbb\x02\x50\xab\xd7\ +\x70\xd1\x88\xb4\xd4\x88\x14\x9c\x0b\x27\x5c\xa0\x2a\x00\xa8\x56\ +\xab\x64\x59\xd6\xa7\xb8\x37\xde\x69\x73\x1a\xa9\x17\x41\x4b\xad\ +\x38\x1e\xc7\xbd\x23\xb4\xd7\x8c\x31\x88\x44\xdf\x8f\x3a\xb8\xab\ +\x9b\xaf\x35\xa8\x0d\xf3\xf6\x18\x2e\x3d\x8e\x83\x29\x6d\xe3\xd5\ +\xdb\x12\xa9\xf7\xe5\x56\x6c\xad\xf4\x91\x0e\x8e\x0c\xc3\xf2\xef\ +\xdb\x02\xe0\xa1\x91\x61\xd4\xc2\xb5\x2b\x97\x59\x9c\xbf\xbe\x05\ +\x03\x36\xf8\xc0\x60\xad\x02\x0b\xdb\xc3\xc0\x50\xad\xc2\xec\xc5\ +\x4b\x9c\xfd\xee\x1b\xce\x9f\x9c\x9e\x03\xa6\x36\x04\x60\x24\x5e\ +\x4a\x05\x12\x0b\xed\x91\x27\xa9\x3d\x0c\x6f\x1f\x38\xc8\x66\xc7\ +\x81\x27\x3a\xf1\x2a\xe7\x35\x1e\x32\x81\x14\x28\xba\x70\xf9\xea\ +\x55\xce\x34\x8e\xd1\xfc\xfa\x8b\xb9\xd9\x1f\x4e\x1d\x02\x0e\x6f\ +\x08\xe0\xb3\x8f\x3e\xe0\xa7\xd3\x27\x57\x99\xe9\xda\xa3\x86\x55\ +\xe6\xbb\x1e\x04\x1b\x3c\x5f\x1d\x6f\x7c\x77\xee\x8f\xd9\x5f\x0e\ +\x01\x87\x1b\x8d\xc6\x5f\x1b\x01\x98\x9a\xfe\xf4\xe3\x7f\xf5\x73\ +\x6c\x7d\xf2\x35\x00\xe2\xb7\xda\x81\xff\xdd\xd7\xf1\x3f\x4d\xf0\ +\x4b\xb9\xe8\x46\x89\xaf\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ +\x60\x82\ +\x00\x00\x04\x73\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x12\x00\x00\ +\x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ +\xd2\x01\x07\x0b\x02\x2b\xa1\x4a\x72\xae\x00\x00\x03\xf0\x49\x44\ +\x41\x54\x78\xda\xb5\x96\xcf\x6b\x54\x57\x14\xc7\x3f\xf7\xcd\xf8\ +\x06\x99\x49\x4c\x33\x89\x20\x1a\x5f\x68\xb2\xe8\x46\x1b\x45\x17\ +\x3e\xc1\x04\x0c\xc2\xb8\x98\x89\xa4\x83\x9b\x8a\x90\x46\xc8\xa6\ +\x05\xdd\xf9\x17\xb8\x10\x04\xff\x02\xdb\x85\x14\x19\x14\x0c\xad\ +\x30\x76\x15\xd0\xfc\x92\x56\x0d\x41\xc9\x2f\x92\x86\xc4\x41\x26\ +\x04\x9a\xc4\x79\xbf\xee\x8f\x2e\x9a\x0c\x49\xeb\xc4\x52\xd2\x03\ +\x17\x2e\xf7\x1c\xce\xe7\x9e\xef\x7d\xf7\xdc\x07\xff\xb3\x89\x5a\ +\x8e\x4c\x26\x93\x2d\x97\xcb\xf9\x20\x08\x5c\x29\xe5\x51\xa5\x14\ +\xc0\x22\x30\x7c\xe0\xc0\x81\xc2\x8b\x17\x2f\x06\xff\x13\xe0\xca\ +\x95\x2b\x27\x5f\xbf\x7e\x7d\xc7\xb2\xac\xce\xf3\xe7\xcf\x73\xfc\ +\xf8\x71\xd2\xe9\x34\x5a\x6b\xca\xe5\x32\xe3\xe3\xe3\x14\x8b\x45\ +\xa4\x94\x43\x87\x0f\x1f\xbe\x31\x36\x36\xf6\xdb\xbf\x06\x74\x75\ +\x75\x65\x4b\xa5\xd2\x43\xd7\x75\xe3\xbd\xbd\xbd\x1c\x3c\x78\x90\ +\x7d\xfb\xf6\x21\x84\x40\x6b\x4d\x14\x45\xf8\xbe\xcf\xbb\x77\xef\ +\xb8\x7f\xff\x3e\x23\x23\x23\xb2\xa1\xa1\xa1\x77\x6e\x6e\xae\x66\ +\x35\xb1\xad\x49\x2e\x97\x3b\x39\x33\x33\xf3\xcb\xa5\x4b\x97\xe2\ +\x57\xaf\x5e\xa5\xa9\xa9\x89\xba\xba\x3a\x1a\x1b\x1b\x69\x6a\x6a\ +\xa2\xb9\xb9\x99\x74\x3a\x4d\x2a\x95\x22\x95\x4a\x71\xec\xd8\x31\ +\x3c\xcf\xb3\x5e\xbd\x7a\x95\x3f\x72\xe4\xc8\xcf\xab\xab\xab\xa5\ +\x5d\x01\x61\x18\xfe\xe8\xba\xee\xe7\xfd\xfd\xfd\xa4\x52\x29\x1a\ +\x1a\x1a\x68\x6e\x6e\x26\x95\x4a\x91\x48\x24\x88\xc5\x62\xc4\x62\ +\x31\x12\x89\x04\x75\x75\x75\x24\x93\x49\xda\xda\xda\x98\x9e\x9e\ +\xb6\x66\x67\x67\xbf\x08\x82\xe0\xfb\x9a\x3a\x75\x74\x74\x64\x1d\ +\xc7\x31\xc5\x62\xd1\xbc\x79\xf3\xc6\x94\x4a\x25\x73\xf1\xe2\x45\ +\x13\x45\x91\x51\x4a\x19\xa5\x94\x91\x52\x9a\x28\x8a\x8c\xef\xfb\ +\x66\x6d\x6d\xcd\x5c\xb8\x70\xc1\x2c\x2d\x2d\x99\x42\xa1\x60\xea\ +\xeb\xeb\x4d\x63\x63\x63\xf6\x63\xb9\x2d\x80\x72\xb9\x9c\xcf\x66\ +\xb3\x1c\x3a\x74\x88\x64\x32\x49\x5f\x5f\xdf\x5f\x4e\xcb\x42\x08\ +\x41\x36\x9b\x25\x97\xcb\x21\x84\x40\x08\xc1\xe5\xcb\x97\xab\xfe\ +\x8e\x8e\x0e\x32\x99\x0c\x9e\xe7\xe5\x6b\x02\x82\x20\x70\xcf\x9e\ +\x3d\x8b\x6d\xdb\x5c\xbb\x76\xad\xea\x34\xc6\xec\x08\x36\xc6\xd0\ +\xd3\xd3\xb3\x63\x5d\x08\x41\x77\x77\x37\x4a\x29\xb7\x26\x40\x29\ +\x75\xb4\xa5\xa5\x85\x44\x22\xc1\x83\x07\x0f\xaa\xc9\xb6\xc6\xe0\ +\xe0\x20\x8f\x1f\x3f\xc6\x18\xc3\xa3\x47\x8f\x76\x00\x8d\x31\xb4\ +\xb7\xb7\x03\x1c\xfd\x18\x20\xbe\x09\x40\x08\x41\x3c\x1e\x47\x29\ +\x85\x31\x06\x21\x44\x75\xbe\x65\x4a\xa9\xea\x9a\x31\x86\x28\x8a\ +\x90\x52\x12\x45\xd1\x3f\xaa\xfd\x7b\x05\x8b\xf3\xf3\xf3\xd5\x6f\ +\x5d\x6b\x8d\xd6\x1a\x29\x25\x52\x4a\x72\xb9\x1c\xb9\x5c\x6e\x47\ +\xb2\xad\xd8\x30\x0c\x99\x9a\x9a\x42\x29\xb5\x58\x13\x60\x8c\x19\ +\x7e\xfa\xf4\x29\xbe\xef\x13\x86\x21\x5a\x6b\x8c\x31\x84\x61\x48\ +\x10\x04\x68\xad\x51\x4a\x11\x86\x21\x61\x18\xa2\x94\x42\x6b\x4d\ +\x10\x04\x04\x41\x40\xb1\x58\x44\x6b\x3d\x5c\x53\x22\xcb\xb2\x0a\ +\x85\x42\xe1\xeb\x7c\x3e\x4f\x7b\x7b\x7b\x55\x06\xcf\xf3\x10\x42\ +\x70\xef\xde\x3d\x84\x10\x54\x2a\x15\xa4\x94\x3b\xfc\x6f\xdf\xbe\ +\xe5\xc9\x93\x27\x00\x85\xdd\x5a\x85\x63\xdb\xf6\x0f\xa7\x4f\x9f\ +\xee\xbc\x7b\xf7\x2e\xb6\x6d\x63\x59\x16\xb6\x6d\x23\x84\xd8\x71\ +\x26\x4a\xa9\x6a\xcb\xf8\xf0\xe1\x03\xd7\xaf\x5f\x67\x62\x62\x62\ +\x08\xe8\xda\xed\x26\xff\x61\x59\xd6\xc4\xf2\xf2\xf2\x37\xef\xdf\ +\xbf\xb7\x4e\x9c\x38\x51\xd5\x3b\x08\x02\xc2\x30\xc4\xf3\x3c\xc2\ +\x30\xc4\xf7\x7d\x2a\x95\x0a\xeb\xeb\xeb\xdc\xbe\x7d\x9b\x91\x91\ +\x11\x09\x7c\x07\xcc\xec\xda\x2a\xb4\xd6\xb6\x10\x62\x68\x6a\x6a\ +\x2a\xff\xf2\xe5\x4b\xab\xa5\xa5\x85\xfd\xfb\xf7\x57\x93\x6f\xe9\ +\xbd\xb1\xb1\xc1\xe4\xe4\x24\xb7\x6e\xdd\x62\x74\x74\x54\x02\x15\ +\xe0\x2b\x60\x15\xf8\xf5\x53\xed\xda\x01\xd2\x42\x88\x3b\x96\x65\ +\x75\x9e\x3b\x77\x8e\x33\x67\xce\xd0\xda\xda\x0a\xc0\xdc\xdc\x1c\ +\xcf\x9f\x3f\xe7\xd9\xb3\x67\x00\x43\xc0\x0d\xe0\x21\xf0\xd9\xe6\ +\x66\x57\x80\x6f\x81\x9f\x3e\xf5\xe0\x38\xc0\x97\x40\x1e\x70\xb7\ +\x5d\xa2\x45\x60\x78\xf3\x40\x57\x80\x65\x80\xd6\xd6\xd6\x49\x40\ +\x2c\x2c\x2c\x58\x40\x04\x64\x36\xe3\x3e\x69\xce\x2e\x63\x7b\xcc\ +\xca\xc0\xc0\x40\x74\xea\xd4\x29\x0f\x58\xdb\x94\xcd\xd9\xcb\xa7\ +\xd7\x01\xd6\x6f\xde\xbc\xa9\x5c\xd7\x95\xc0\x3a\xb0\xb1\x97\x90\ +\xad\xaa\xfc\x81\x81\x81\xc8\x71\x9c\x68\xaf\x01\xdb\x21\x25\x40\ +\x01\x9d\x80\x23\xf6\xf8\x2f\x65\xfb\x8e\x7f\x07\xf8\x13\x7f\x10\ +\x23\x23\x63\x99\xf1\x1a\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ +\x60\x82\ +\x00\x00\x04\x4f\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\ +\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ +\xd7\x09\x08\x0c\x24\x01\x84\xbe\xe4\xfd\x00\x00\x00\x0f\x74\x45\ +\x58\x74\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x69\x64\x20\x6c\x6f\x67\ +\x6f\x86\xc6\x77\xb9\x00\x00\x03\xc1\x49\x44\x41\x54\x38\xcb\xad\ +\x95\x4b\x68\x5c\x55\x18\xc7\x7f\xe7\xcc\xcd\x4c\x26\x89\xd5\x98\ +\x92\x96\x36\x4e\xd3\x18\xd1\xb6\x98\xfa\x98\x26\xa8\xf8\xc0\x42\ +\xa5\x49\x4b\x7d\x60\x75\xa3\x28\x2a\xa5\x10\x1f\x50\x95\x6e\x14\ +\xba\x91\x2e\x04\x17\x8a\xee\x7c\xe0\x83\x2a\x42\xab\xd0\x04\x52\ +\x92\x58\x8a\x8b\xf4\x11\xfb\x48\x66\x48\x86\x56\xdb\x8a\x64\xd3\ +\x36\x36\x93\xcc\xbd\x33\x77\xce\xdf\xc5\xcc\x24\x69\x1a\x5c\x68\ +\xff\xf0\x71\xee\xe2\xf0\x3f\xbf\xef\x3b\xdf\x77\x2e\x80\xfa\xfa\ +\x7b\x74\x23\x56\xe6\xab\xaf\xbf\x47\x37\x42\x65\xf3\x59\x19\x40\ +\x92\x18\x4d\x9f\x7e\x45\xc2\x97\x54\x90\x08\x24\x85\xc2\x15\x91\ +\x9c\x04\xc6\x60\x9d\xa3\x0a\xc9\x93\x51\x54\x52\x14\x88\x4b\x8a\ +\x6d\xb8\xaf\xe3\x63\x63\x4c\xc5\x0f\x00\xaf\xaf\xbf\x07\x4a\xee\ +\x01\x98\x40\x92\x2f\x91\x07\x15\x40\x61\xf0\xe7\x87\x5b\x9c\xff\ +\xfb\xb3\xb8\x20\x81\xad\xbd\x60\xe2\x77\xfe\xec\x2d\xdf\x31\x08\ +\x08\xc9\x48\x32\xe5\xcc\xd9\xb4\xb1\xf3\x7a\xe2\x33\xa3\x27\xb7\ +\x83\xc9\x39\xa7\x1c\x28\x90\x94\x0f\xce\xef\xd9\x12\x8f\x4e\xbc\ +\xd7\xbc\xfe\x25\x30\x11\x9c\x73\x9c\x3f\xf3\x3d\x33\xe1\xea\x8f\ +\xbc\xe5\x3b\x7e\x41\x8a\x3b\x29\xde\x91\x7c\xe0\x8b\x85\xc4\xb6\ +\x42\x0c\x26\x00\x05\x40\x20\xf0\x81\x5c\x71\x26\xf5\x5c\xcb\x3d\ +\x2f\xf0\x6b\xda\x27\x12\x0e\x11\x71\xc3\xac\x5a\xfb\x18\xca\xa5\ +\xb7\xc9\x29\x28\x65\x46\xa1\x42\x3c\x5f\xde\xa6\x8d\x9d\x48\x42\ +\x28\x3c\xf7\xf2\xab\x7d\x2e\xe7\xe3\xfc\x00\xe5\x03\x5c\xbe\xc0\ +\xc5\xe2\x1e\x7a\x5f\xdb\x45\xd3\x2d\xb5\xb4\x34\x66\x91\x35\x50\ +\x9c\x4e\x08\x42\x20\x94\x08\x81\x6b\xca\xb0\xb0\xc6\xa1\xc2\x22\ +\x0f\x25\x12\x98\x20\xc0\x06\x79\x4c\x21\xcf\x13\x4b\x37\x53\x18\ +\x8f\xf0\xc6\x27\x2b\x38\xf8\xc1\x34\x84\x79\x30\xf6\x0f\x4a\xc6\ +\x45\x49\x6e\xb1\x1a\xcf\x12\x1b\x21\x24\x70\x8e\x8b\x99\x0c\xe4\ +\x72\xa4\xee\x78\x90\xab\x26\x46\xc3\xd2\x95\x5c\xbe\xf4\x17\x83\ +\xa3\xb7\xd1\x14\x7c\x06\xd1\xc4\x3e\x24\x01\x32\xa6\x64\xbc\x90\ +\xd8\xce\x11\x97\x3a\xfc\xea\xe4\x64\xf9\x0e\x0c\x87\xe2\x09\x1a\ +\x9a\x56\x11\x4c\x4f\x51\xbf\x6c\x25\xdf\x1e\x48\x4d\x4f\xfb\xf5\ +\xef\x47\x56\xec\x3e\x50\xe2\x50\xd9\xff\xfa\x1a\xdb\xca\x49\x0e\ +\x45\x8c\xb1\xc8\x18\x96\x2c\x6d\x60\x6c\xfd\xe3\x9c\xae\x6f\x26\ +\xea\x19\xac\x42\x22\x11\xc3\xd9\xcb\xcd\xb1\x6f\x32\x6f\xe6\x05\ +\x11\x49\x16\x64\xe4\xb0\xff\x4a\x0c\x78\x78\x11\x46\xb2\x59\x4e\ +\x4d\x4d\x71\x30\xb6\x9c\x65\x89\x26\x94\x9f\x21\x56\x65\x71\xc1\ +\x0c\xb7\x36\x36\x7a\x63\x99\x8b\xef\x20\x3c\xc0\x13\x78\x47\x8f\ +\x9f\x48\x2c\x46\x3c\xdb\xc7\xbf\x9d\x3a\xf1\x24\xe0\x3b\xe7\x66\ +\x06\xcf\x5c\x59\x7d\xf0\xf0\xf8\xe7\xf1\x25\xf5\x91\xca\x9c\x1a\ +\x03\x9e\x35\xf8\x53\x57\xc2\xae\x47\x5a\xbb\xdb\x5b\xeb\x2e\x08\ +\xd5\xec\xec\xde\xf5\xe3\xfe\x1f\xf6\x71\x7b\x4b\xcb\xe2\x7d\x2c\ +\xb9\x98\x93\x62\x82\xea\x73\x13\xfe\xd3\xd1\x2a\x1b\xc9\x4f\x4f\ +\x12\x4c\x5d\x99\x8b\xec\x24\x9e\x67\xbd\xb3\x13\xfe\x56\x49\x31\ +\xa0\x0a\xe0\xa9\xed\xcf\xf3\xf5\x77\x5f\x2d\x4e\x7c\xe2\xe4\xb1\ +\x17\x4b\x23\xed\x7c\xa4\x40\xa8\xd4\xa3\xc2\x49\x32\x42\x16\xc9\ +\x93\xa8\x12\x8a\x22\x55\x03\xd5\x3b\x5f\x7f\xfb\xcb\xa1\x23\x87\ +\xe9\x78\xf8\x51\x9c\x73\xeb\x46\x86\x8f\x8f\x01\xc5\xf9\x93\x17\ +\x2b\x6f\x8e\x03\x35\x88\x1a\x50\xad\x50\x9d\xa4\x1a\xa0\x12\x71\ +\x20\x2e\xa8\xa6\x14\xa4\xd3\x69\x86\x8e\x1c\xc6\x5a\x3b\xda\xba\ +\x66\xed\xbd\x15\xea\xff\xf5\x5c\xb6\x25\xdb\x25\x49\xe3\xe3\x63\ +\xca\x66\xb3\x6a\x4b\xb6\xab\x2d\xd9\xbe\xc6\xf6\xf5\xf7\x60\x8c\ +\xe1\xd0\x40\xef\x7f\x5a\x2b\xaa\xab\xbb\x89\x4c\x66\x8c\xde\x9f\ +\xf6\x03\xa4\x0c\x50\x0f\xdc\x5c\x8e\x5a\xe6\x52\x8c\x02\x16\x70\ +\xb3\x13\x33\xa7\x22\x10\x00\xf9\xb6\x64\x7b\xff\xa9\x63\x43\x00\ +\x0c\x0c\x0c\xf0\xd6\xbb\xbb\x33\xc6\x98\x6d\x1e\x70\x15\xc8\x01\ +\x97\x00\xaf\x7c\xd3\xd1\xf2\xb7\x2d\xff\x72\xae\xfd\xed\x94\x0e\ +\x2b\x56\x5e\xb6\xf5\x1b\x3a\x78\x66\x6b\x17\xdd\xdd\xdd\x7f\xdf\ +\x7f\xf7\xba\xf4\xf0\x48\x6a\xaf\x57\xde\x50\xa4\xf4\x54\x32\x8f\ +\xce\x56\xee\xa0\xd2\x3d\x0b\x8c\x2b\xd9\x70\xfa\xf8\x51\x0b\x1c\ +\x48\x26\x93\x5b\x3a\x3b\x3b\xef\x1a\x1e\x49\x35\x18\x6e\x90\xda\ +\x92\xed\x5d\xc0\xa7\x65\xc0\xbd\xff\x00\x7c\x02\xcd\x92\x88\x3c\ +\x0a\x8c\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x07\x7b\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ +\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ +\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ +\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\ +\x67\x9b\xee\x3c\x1a\x00\x00\x07\x0d\x49\x44\x41\x54\x58\x85\xc5\ +\x97\x49\x6c\x1c\x65\x16\xc7\x7f\xef\xab\xea\xcd\x6e\xdb\xe9\xb6\ +\xe3\x71\x1c\xdb\x31\x31\x6d\x07\x05\xc5\x09\x4b\x34\xc9\x44\x80\ +\x66\xc4\xa2\x44\x42\x39\x70\xe4\x80\x10\x20\x84\x10\x52\x0e\x13\ +\x0e\x20\x61\x09\x44\x16\x89\x1c\xb8\xc0\x81\x2b\x42\x82\x03\x17\ +\x92\x81\x64\x32\x08\x65\x63\x11\x0e\x26\x13\x5b\x4a\x3c\xce\x82\ +\xdb\x59\xec\x76\xa7\xbb\xdd\x5d\xd5\xdd\xb5\xcc\xa1\xaa\xab\x17\ +\x5b\x73\x8b\xe6\x93\x4a\x5f\x2d\xaf\xde\xff\x5f\xff\xf7\xbe\xf7\ +\xbd\x12\xd7\x75\x39\x28\xb2\x17\x98\x00\xc6\x81\x30\xf7\x77\x54\ +\x80\x29\x60\xe2\xa8\xeb\x9e\x90\xbf\xc3\xde\xae\x58\xec\xf8\xdf\ +\x1e\x7a\x88\x1d\x43\x43\x44\x74\xfd\xbe\xa2\x97\x2d\x8b\x8b\x37\ +\x6f\x72\x7a\x66\x86\x9c\x61\xec\xd3\x81\x89\xbf\x6e\xd9\xc2\xf8\ +\xc6\x8d\x5c\x99\x9f\x67\x3e\x93\xa1\x6a\x59\x6b\xbe\x2c\x22\x68\ +\x22\x28\xa5\xd0\xfc\x43\x29\x85\x26\x12\x9c\x2b\xa5\x50\xbe\x4d\ +\xeb\xac\x2b\x45\x22\x1e\xe7\xd1\xa1\x21\x5c\xd7\xe5\xeb\x8b\x17\ +\x27\x74\x60\x7c\x7c\x70\x90\xab\xe9\x34\xf9\xe1\x61\x52\xaf\xbe\ +\x8a\x16\x89\xac\x85\x8e\x00\x4a\x04\x44\x50\xfe\x3d\x25\x82\xf8\ +\xcf\xa4\xe5\x9c\xc6\xfb\x00\xd5\x2a\xa5\x33\x67\xc8\xcd\xce\x32\ +\x3e\x38\xc8\xd7\x17\x2f\x8e\xeb\x40\x38\xac\x69\xa4\x33\x19\x52\ +\xaf\xbd\x86\x1e\x8f\xaf\xc6\x6e\x70\x12\xea\xea\x22\xdc\xdd\x4d\ +\x28\x91\x40\xeb\xea\xc2\xb2\x6d\xcc\x4c\x06\x29\x14\xd0\x56\x56\ +\x70\x56\x56\x02\xb5\xa4\x75\x0e\x85\x88\x3f\xf1\x04\xf9\xcb\x97\ +\x59\xe7\xe1\x84\x75\x00\xd7\x75\xa9\xda\x36\xae\x6d\x63\xf9\x0e\ +\x5a\xc1\xe3\x23\x23\x24\x77\xed\x42\x8f\xc5\x56\x11\xec\xec\xef\ +\xaf\xc7\xb8\x58\xe4\xc6\xe9\xd3\x24\x0b\x05\x10\x09\xd4\x0b\x66\ +\xc7\x01\x11\x5c\xd7\x05\x20\x20\x00\x60\x15\x8b\x88\xa6\x35\xc7\ +\x3c\x16\xa3\xf7\xa9\xa7\xe8\x18\x1d\x5d\x33\x2f\x5a\x47\xa4\xbd\ +\x9d\xd1\xe7\x9f\xe7\xc6\xe4\x24\x32\x39\x49\xbb\x52\x75\x70\x11\ +\xc4\x71\x50\xad\x04\x1c\xff\xc2\x2e\x16\xc1\x27\x20\x40\x7c\x78\ +\x98\xfe\xfd\xfb\x09\x35\x84\xc5\xb1\x6d\x96\xe6\xe7\xb9\x33\x37\ +\xc7\xdd\xb9\x39\xda\x22\x11\x12\x43\x43\x74\x0f\x0f\xd3\x3d\x30\ +\x80\xf2\x01\x37\x3d\xf2\x08\xc5\xcd\x9b\xb9\xf6\xd5\x57\xf4\x57\ +\x2a\x01\x01\xd7\x71\x50\x4a\x05\x98\x1e\x01\xc7\x01\xa0\x9a\xcf\ +\x23\xa1\x10\x4a\x04\x3d\x1e\x5f\x05\x7e\xed\xb7\xdf\xf8\xd7\xa7\ +\x9f\xb2\x29\x14\x62\x7d\x3c\xce\x48\x2c\x86\x52\x0a\xb9\x71\x83\ +\xdc\xf7\xdf\x73\x2b\x12\xa1\x6f\xff\x7e\x7a\xb7\x6c\x01\xa0\x7d\ +\xdd\x3a\x1e\x78\xe1\x05\xa6\x3e\xfa\x88\x2d\x89\x84\xa7\x80\xeb\ +\xa2\x44\x02\x4c\x05\x60\xfb\x17\xb7\x4e\x9e\xa4\xba\xbc\x8c\x5d\ +\x2a\xd1\xbf\x6f\x5f\x00\x5e\x35\x4d\xfe\xf1\xf1\xc7\x9c\x3b\x72\ +\x84\x3f\xb7\xb7\xf3\x40\x7b\x3b\x1d\x80\x6b\x9a\xb8\x86\x81\x6b\ +\x18\x44\x2c\x8b\x64\xa9\x84\xf5\xc5\x17\x5c\xff\xf2\x4b\xaa\xe5\ +\xb2\x47\x22\x91\x60\xfd\x73\xcf\x91\xcb\x66\xc1\x34\x11\xd3\x44\ +\x44\x02\x4c\xd5\x14\x82\x5c\x8e\xa5\x1f\x7e\xa0\x63\x64\x84\x75\ +\xdb\xb7\x07\x5f\x7e\xea\x93\x4f\xa8\x5e\xb8\xc0\x63\x3d\x3d\x84\ +\x2c\xcb\x03\x35\x4d\x22\x03\x03\x44\x06\x07\x71\x0d\xc3\x73\xee\ +\xcf\x91\xc9\x49\xf2\xdf\x7c\x13\xbc\x9f\xda\xb3\x87\x74\x77\x37\ +\xf8\x64\x95\x48\x80\x19\x28\xa0\xc0\x93\xb3\x5a\x65\xe8\xc5\x17\ +\xeb\xb2\xff\xfa\x2b\x37\x4f\x9c\x60\x24\x16\xf3\x80\x4b\x25\x1c\ +\xc3\x20\xf9\xec\xb3\xf4\xbf\xf1\x06\x7d\xaf\xbf\x4e\x61\xd7\x2e\ +\x8c\x5c\x0e\xd7\x34\xa1\x54\x02\xc3\xc0\x3a\x73\x86\xc2\xcc\x4c\ +\xe0\xe7\xd1\x97\x5f\xe6\xf2\xfc\xbc\xa7\x40\x83\xea\xaa\x96\x03\ +\xb5\x8a\xd6\x91\x4a\x11\x4e\x26\x83\x84\x3b\xfe\xc1\x07\xec\xe8\ +\xec\xf4\xd8\x97\x4a\x01\x89\xf8\xce\x9d\x81\xf3\x4d\x4f\x3e\xc9\ +\xd5\x3b\x77\xa0\x54\xf2\x48\x18\x06\x18\x06\xe5\xcf\x3f\xc7\xb5\ +\x6d\x00\x62\x5d\x5d\x64\xc3\x61\x9c\x4c\x06\x59\x95\x03\xae\x1b\ +\x94\xd3\x75\xdb\xb6\x05\x8e\xef\x5e\xb9\x42\x78\x66\x86\x68\x0b\ +\x38\xa6\x89\x34\x54\xcb\x70\x2c\x46\xae\x50\x80\x1a\xb8\x69\x82\ +\x69\xe2\xcc\xcf\x53\x4d\xa7\x03\xbb\xe8\x86\x0d\x54\xd3\x69\x94\ +\x08\x76\x63\x08\x1c\xc7\x09\x6a\x79\x57\x03\x81\xf4\xd4\x14\x5d\ +\x8e\x43\x35\x9d\xc6\x5a\x5a\xf2\xe4\xad\x81\x34\x0e\xd7\x85\x4a\ +\x05\xca\x65\xa4\x5c\x0e\x08\x88\x69\xe2\xcc\xcd\x05\x66\xbd\xa9\ +\x14\xf7\x2c\x6b\x0d\x05\x6a\x21\x50\x8a\x8e\x87\x1f\x0e\x5e\x58\ +\xf8\xfd\x77\x92\xa1\x90\xb7\xb6\x0d\x03\x7b\x79\x19\xf7\xde\x3d\ +\xdc\x62\xd1\x03\x6d\x1c\x95\x4a\xf0\xf5\x52\x2a\x41\x3e\x8f\x9b\ +\xcd\x62\x5d\xba\x14\x98\xfc\x69\xeb\x56\x32\xd5\x2a\x4a\xa9\x20\ +\x07\x74\x00\xdb\xb6\xd1\x94\x42\x6a\x55\xcb\x1f\x22\x42\x5c\xd7\ +\x83\xdd\x4c\x03\xc4\xb6\xbd\xaf\x6c\x19\x52\x2e\x23\x86\x51\xdf\ +\x90\xfc\x8d\xaa\xc5\x21\x2b\xb6\xed\x2d\x43\x3f\x37\x14\x80\xe5\ +\x87\x40\x53\x0a\x63\x7a\x3a\xb0\xdf\x38\x3e\x4e\xb1\x41\x9d\xc6\ +\xed\xb6\x75\x28\x1f\x50\x35\x80\x8b\x08\xa1\xb1\xb1\xc0\x66\xf1\ +\xf2\x65\x12\xe1\x30\x4a\x04\xab\x29\x04\xb6\x8d\xf8\xab\xa0\xd8\ +\x40\xa0\x7f\xdb\x36\x0a\xb5\xfc\x68\xd9\xdb\x57\x29\xb0\x06\xb8\ +\x12\x41\x4f\xa5\xea\x04\xa6\xa7\x59\x1f\x89\xac\x56\xc0\x76\x9c\ +\xa0\xd1\x30\x1a\xd6\xee\xfa\x54\x0a\xab\xaf\x6f\xcd\x06\xa3\x55\ +\x83\x46\xd0\xda\xa1\xf5\xf5\xa1\x86\x86\x02\x9b\xcc\xcc\x4c\x9d\ +\x40\x6b\x12\x8a\x2f\x6f\xe5\xfa\x75\x2a\xd9\xac\xf7\x50\xd3\x78\ +\xfc\xfd\xf7\x29\xf8\x3b\x58\x23\x89\x46\xa2\x77\x2e\x5d\x22\xa2\ +\x69\xcd\x21\x50\x8a\xb6\x03\x07\x82\xdd\xd5\xc8\x66\x51\xe9\x34\ +\xba\x52\xab\x0b\x91\x65\xdb\x75\xe7\x22\xa4\x8f\x1e\x0d\x9c\x0f\ +\xef\xde\x8d\xb1\x6f\x5f\xd0\xfd\xd4\xec\x4a\x9f\x7d\xc6\xad\x1f\ +\x7f\xe4\xe6\xf9\xf3\x9c\x3f\x76\x8c\x91\xb6\xb6\x26\xf0\xf0\xde\ +\xbd\xe8\xe3\xe3\x81\x9f\x73\x87\x0e\x31\x16\x8f\x7b\xca\x89\x60\ +\xf9\x21\xd0\x6b\x0a\xa8\x5a\x5f\x27\x42\xe9\xf4\x69\x16\x4f\x9d\ +\x62\xfd\xd3\x4f\x03\xb0\xfb\xed\xb7\xf9\xb7\xae\x93\x38\x79\x32\ +\x20\x61\xcf\xce\x22\xef\xbc\x43\xbe\x5a\x65\x4f\x28\x44\x5b\x34\ +\xda\x04\x1e\x79\xe5\x95\x00\x7c\xf6\xdb\x6f\x29\x9f\x3d\xcb\x58\ +\x6f\x6f\xd0\xa6\xad\x0a\x41\x6b\xa2\xe5\x8e\x1d\xc3\xcc\x64\x00\ +\x08\xc5\x62\xec\x78\xf7\x5d\xc2\x87\x0f\x53\xee\xe9\xa9\xc7\x59\ +\x29\xfa\xa2\x51\xda\x74\xdd\x6b\x5e\x36\x6c\xa0\xfd\xc3\x0f\x89\ +\xbd\xf9\x26\x2a\x1a\x05\xa0\xb4\xb8\xc8\xcf\x47\x8e\xf0\x97\x64\ +\xd2\x03\x6f\x21\xa0\xd7\x42\x10\x0d\x87\x9b\x62\xec\xe6\x72\xdc\ +\x7d\xef\x3d\x7a\x26\x26\x68\xeb\xe9\x01\xa0\x7f\xf7\x6e\x9c\x9d\ +\x3b\x29\x5e\xbb\x46\xe5\xca\x15\xe4\xea\x55\x22\x9a\x86\x36\x3a\ +\x8a\x4a\xa5\x08\x6d\xda\xd4\xd4\x51\x95\x16\x17\xf9\xe7\xc1\x83\ +\x6c\xd7\x34\xda\x43\xa1\x00\xdc\x6d\x0d\x41\x53\x0e\x34\xcc\xf6\ +\xd4\x14\x0b\x2f\xbd\x44\xe4\xad\xb7\x18\x7c\xe6\x19\x4f\x32\x5d\ +\xa7\x23\x95\x82\x86\xe5\xb5\xd6\xf8\xcf\x77\xdf\x31\x79\xf4\x28\ +\x8f\xe9\x3a\x03\x1d\x1d\xf5\xce\xd8\x6f\x4a\x56\x13\x80\xb5\x7b\ +\xf9\x95\x15\xd4\xe1\xc3\xcc\x9e\x3d\xcb\xc6\x03\x07\x88\x25\x12\ +\xff\x13\xd8\xc8\x66\x39\x77\xe8\x10\xea\xc2\x05\xf6\x26\x12\x84\ +\x35\xad\x19\xdc\xb7\x6b\x26\xe0\x38\xb8\xb0\xe6\x7a\xd7\x94\x42\ +\x44\xe8\x38\x7f\x9e\xc5\x73\xe7\xb8\xdd\xdb\x8b\x1a\x1d\x25\x36\ +\x36\x46\xf7\xd6\xad\x80\x57\xe1\x32\xd3\xd3\x54\x66\x67\x89\x2e\ +\x2c\x30\x12\x8b\x31\xd0\xdd\xdd\x14\xf3\xc6\x7f\x84\xaa\x6d\x07\ +\x95\x50\x07\x2a\xa6\x65\x85\x8b\xa6\x49\xb4\xb3\x73\x4d\xf0\x5a\ +\xd2\xb5\x29\xc5\x83\xcb\xcb\xc8\x4f\x3f\xa1\x7e\xf9\x05\xd3\x71\ +\xc8\x59\x16\x09\x4d\x63\x73\x38\xec\xad\xf1\x64\xb2\x0e\xb8\x06\ +\xb8\x88\x90\x5e\x5a\xc2\xf4\xfe\xbe\x2a\x3a\x30\x75\xbb\x50\x78\ +\x5c\xc3\xeb\x84\x93\x9d\x9d\x28\xd7\x45\xfc\xd6\xb9\x26\x59\x6d\ +\xef\x73\xfc\xbf\x22\xc7\x75\x89\x2a\x45\x9b\x5f\xd9\xc4\xbf\x27\ +\xae\x5b\x07\xac\x9d\xfb\xfe\x6c\xdb\x66\x7e\x71\x91\xab\x0b\x0b\ +\xdc\x2e\x14\x00\xa6\x74\x60\xe2\x66\x3e\x7f\xdc\x05\xca\xb6\xcd\ +\x82\x5f\x05\xef\xd7\xb0\x5d\x97\xc5\x52\x89\x3f\xf2\x79\x80\x09\ +\xf9\x7f\xff\x9e\xff\x17\xc5\xd6\x3d\x9a\xb0\xf3\x6b\xe8\x00\x00\ +\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x02\xfd\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ +\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01\x42\x28\x9b\x78\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ +\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ +\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x02\x7a\x49\x44\ +\x41\x54\x38\x8d\xd5\x95\x4b\x48\x55\x41\x1c\xc6\x7f\x73\x3c\x5e\ +\x6e\x47\xc3\x67\x56\x54\x84\x49\x50\x9b\x5a\x48\xad\xdc\x44\x48\ +\x19\x29\x2d\xad\x36\xb9\x68\x55\xd1\x26\x6a\x11\x81\x1b\x17\x9a\ +\xe8\xa2\x27\x44\xed\x6a\x13\x14\x14\x24\x5a\xbb\x5c\xb9\x90\x6a\ +\x51\x1a\x59\x54\xa2\x5d\xef\xfb\xde\x73\xee\xe3\xdc\x73\xe6\xdf\ +\x42\xf2\x51\x72\xcd\x2e\x2e\xfa\x60\x60\x1e\xdf\x7c\xf3\xcd\x7f\ +\x66\xfe\xa3\x44\x84\xf5\x80\xb1\x2e\xaa\x80\xf9\xab\xd2\xd4\xd6\ +\xdb\x82\xa9\x86\xb5\xd6\xd6\xb2\x95\x0d\x23\x83\x27\x47\xa6\x86\ +\xae\x8c\xae\x45\x58\x89\x08\x4d\x6d\xbd\x2d\xc1\x8a\xf2\xa1\xcb\ +\x67\x8f\x55\x6e\xdf\x5a\xb3\x8c\x30\x3d\x1b\xa7\xef\xde\x0b\x3b\ +\xe7\x14\xda\xd6\x22\x3e\x2f\xdc\xde\xe7\x5c\x3b\xdf\x6e\x05\x2d\ +\x8b\xd9\x58\x76\x19\x61\x6b\xed\x06\x72\x99\x0c\x83\xf7\x87\xdd\ +\x94\x93\x0b\x14\x13\x33\x94\xf2\xcc\xf2\xb2\x9e\xc9\xa7\x97\xba\ +\x4d\x00\xad\xb5\x55\x51\x61\xf1\xfe\x5b\xe2\x0f\x72\xca\xc9\xd3\ +\x50\x1d\xe4\xea\x85\x13\x01\xa5\x54\x51\x97\xb9\xbc\x6b\x76\x0f\ +\x3e\xb9\x0a\x74\x2f\xc4\x38\x96\xca\xa0\x67\x46\xf1\x92\xdf\xd1\ +\x5a\x10\xd1\x68\x3d\x5f\x92\x5a\x33\xa9\x35\xbe\xbf\xd8\xa7\xb5\ +\xbf\xac\x6d\xd5\xed\x64\xff\xa1\x53\x68\x11\x13\x96\x1c\x5e\x38\ +\x9e\xc5\x0e\x7d\xa2\xbf\x6f\x80\xd5\x9c\xfd\x0e\xad\x7d\x4e\x9e\ +\xee\x24\x1c\x5f\x0c\xe3\x82\xf0\x5c\xcc\x26\x67\x67\x50\x4a\xe1\ +\xba\x2e\x22\xc2\xfc\x1d\x17\xbe\xfd\x48\x70\xe5\xc6\x4b\xde\x4c\ +\xcc\x14\x91\x6f\x66\xec\xd1\x08\x86\x61\xd0\xd4\xde\xd7\xb5\x20\ +\x3c\x1b\xb5\x09\x38\x36\x00\xbf\x0c\x8b\xc0\xc3\xa1\xb7\xdc\x7a\ +\x3c\x46\x47\x6b\x33\x5d\x9d\x87\x59\x6d\x2f\xe1\x58\x9a\x9e\x9b\ +\xcf\xee\xa8\x5d\xc7\x7b\xbb\x80\x07\x5a\xeb\x15\x89\xfb\xf6\xee\ +\xa0\xa3\xf5\x00\x62\x98\x84\x53\x79\x74\x91\x97\x1a\x30\x0d\xaa\ +\x83\x8a\xeb\x77\x9f\x87\x4c\xe0\xf6\xb9\xae\xa3\x6c\xae\xaf\x5a\ +\x91\xec\x7a\x9a\x70\x2a\x4f\xd6\xcd\xae\x38\xbe\x14\xe5\x40\x24\ +\xe1\x60\x18\xc6\xb4\x69\x9a\x65\xb3\x6e\xc1\x6f\xfc\x32\x67\x93\ +\x2f\xac\xec\xfa\x6f\x21\x62\x10\x89\xdb\x88\xc8\x67\x13\x98\x08\ +\x45\xd2\x8d\xb5\x0d\x75\x78\x7e\x69\x09\x49\x6b\x88\xc6\xd3\x14\ +\x0a\xde\x84\x59\x28\x78\xe3\xa1\x48\xa2\xad\x66\x53\x2d\x9e\x5f\ +\x9a\x63\x5f\x6b\x22\xd1\x14\x22\xf2\xd5\x10\x91\x0f\xa1\x70\xd2\ +\xd5\xa2\xd0\x42\x49\xc5\x17\x88\x27\xec\x3c\xf0\xdd\x00\x26\xa3\ +\xd1\x44\x01\x4a\xcf\xcb\x22\x42\x32\x9d\x26\xfe\x71\x64\xa3\x09\ +\x4c\xda\x76\x36\xe8\x38\x59\xaa\x2a\xad\x55\x27\x17\x43\xda\xce\ +\x90\xcd\xba\xe5\xce\xf4\x78\x40\x89\x08\x5b\x0e\x9e\xe9\xb7\x1a\ +\xf6\x5c\x14\x59\x7c\x89\xff\x02\xa5\xc4\x4b\x4e\xbd\x7e\x15\x9b\ +\x18\x1a\x50\x22\x82\x52\xaa\x1e\xd8\x0d\x44\x4b\xb2\x0c\xdb\x00\ +\x05\xbc\x53\xff\xdd\x9f\xf7\x13\x77\x5b\x6b\x82\x49\x2e\xb3\xc2\ +\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x05\x55\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\x00\x00\x00\x00\x00\xf9\x43\ +\xbb\x7f\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x12\x00\x00\ +\x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ +\xd3\x01\x09\x0a\x09\x03\x5d\x4a\xcd\x3e\x00\x00\x04\xd2\x49\x44\ +\x41\x54\x78\xda\xbd\x94\x6f\x48\x95\x57\x1c\xc7\x3f\xcf\xf3\xdc\ +\xeb\x9d\xde\xeb\xbc\x7a\xef\x75\xa0\xd9\x35\xbd\xb0\x69\xea\xa2\ +\x49\x84\x5b\x28\x1a\x43\x73\x68\x21\xad\x26\xfd\x31\x26\x24\x1b\ +\xad\x16\xc4\x10\xc6\x20\x88\xb9\x37\x0e\xdf\xd5\x5e\x8c\xc5\x20\ +\x46\x6b\x25\x73\xf6\x42\x25\xb6\x4c\x2c\xff\x34\x72\x7a\x85\xea\ +\x8a\x9a\x7f\xe1\xfa\x87\xf2\xa6\xf7\xde\xe7\x79\xce\xb3\x17\x99\ +\x69\xf3\x4a\xbd\xd9\x0f\x0e\xe7\x70\x7e\xf0\xfb\x9c\xef\x39\xbf\ +\xf3\x95\x88\x10\x25\x25\x25\x65\x7e\xbf\x7f\x7f\x28\x14\xca\xd3\ +\x34\x6d\xb3\xae\xeb\x00\x8f\x80\xce\xb8\xb8\xb8\x2b\x3d\x3d\x3d\ +\x4d\xbc\x42\x48\x2f\x6f\x1c\x3e\x7c\x78\x7b\x5f\x5f\xdf\xf7\xb2\ +\x2c\xe7\x17\x15\x15\x91\x93\x93\x83\xc3\xe1\x40\x08\x81\xdf\xef\ +\xa7\xbb\xbb\x9b\x96\x96\x16\x34\x4d\xbb\x99\x9c\x9c\x7c\xba\xab\ +\xab\xeb\xef\x57\x06\x14\x14\x14\x94\x4d\x4d\x4d\x5d\xcd\xcb\xcb\ +\x33\x55\x54\x54\x90\x98\x98\x88\xd9\x6c\x46\x92\x24\x84\x10\xa8\ +\xaa\x4a\x30\x18\x64\x72\x72\x92\x4b\x97\x2e\x71\xfb\xf6\x6d\xcd\ +\x6e\xb7\x57\x0c\x0d\x0d\x45\x54\xa3\x3c\x5f\x94\x97\x97\x6f\x7f\ +\xf8\xf0\x61\xdb\xbe\x7d\xfb\x4c\x47\x8f\x1e\xc5\xe9\x74\x12\x1b\ +\x1b\x4b\x42\x42\x02\x4e\xa7\x13\x97\xcb\x85\xc3\xe1\xc0\x66\xb3\ +\x61\xb3\xd9\xc8\xce\xce\x66\x69\x69\x49\xbe\x77\xef\xde\xfe\x4d\ +\x9b\x36\x5d\x9f\x9b\x9b\x9b\xda\x10\x10\x0e\x87\x7f\xc9\xcb\xcb\ +\x4b\xab\xae\xae\xc6\x66\xb3\x61\xb7\xdb\x71\xb9\x5c\xd8\x6c\x36\ +\x2c\x16\x0b\x8a\xa2\xa0\x28\x0a\x16\x8b\x85\xd8\xd8\x58\xac\x56\ +\x2b\xe9\xe9\xe9\x3c\x78\xf0\x40\xf6\xf9\x7c\xef\x84\x42\xa1\x8b\ +\xeb\x01\x64\x80\x6d\xdb\xb6\x95\x09\x21\xf2\x8f\x1c\x39\x42\x4c\ +\x4c\x0c\x76\xbb\x1d\xa7\xd3\x49\x54\x54\x14\x8a\xa2\x20\xcb\x32\ +\xb2\x2c\xaf\x40\x64\x59\xc6\x6a\xb5\x92\x96\x96\x46\x4d\x4d\x0d\ +\x86\x61\xe4\x27\x24\x24\x94\x45\x54\x60\x18\xc6\xd7\x85\x85\x85\ +\x39\x19\x19\x19\x68\x9a\x86\x10\x82\xc7\x8f\x1f\xa3\x28\x0a\x31\ +\x31\x31\x48\xd2\x8b\xa7\x32\x0c\x03\x00\x21\x04\xba\xae\xe3\x70\ +\x38\x18\x1b\x1b\xc3\xeb\xf5\xea\x9a\xa6\x35\xae\xa7\xa0\x22\x1c\ +\x0e\x1f\x2a\x2d\x2d\xc5\xe3\xf1\x90\x9d\x9d\x4d\x7a\x7a\x3a\x6d\ +\xdd\xf7\x39\x74\xa6\x81\x89\x89\x89\x95\xa2\x86\x61\xb0\xf7\xb3\ +\x73\xfc\x78\xa5\xf5\x45\x97\x48\x12\xbb\x77\xef\x46\xd7\xf5\xbc\ +\x48\x57\xf4\x9b\xa2\x28\xa4\xa4\xa4\x60\xb1\x58\xb8\x3f\x3c\xc1\ +\x07\x9f\x7c\xc5\xc5\x6b\x37\x78\x3b\x2d\x19\xa7\xd3\x89\xcf\xe7\ +\x43\x08\x81\x61\x18\xec\xc9\xcf\xe5\xa7\x6b\x37\x28\xaa\xfa\x86\ +\xfb\xc3\xcf\xe0\x1e\x8f\x07\x60\x73\xa4\x36\x35\xe2\xe3\xe3\x69\ +\x6e\x6e\xe6\xfc\xd5\x0e\xbc\xbe\x31\x5e\x27\x72\x33\xb7\xb0\xbf\ +\x30\x9b\xd2\xd2\x52\x4d\x55\x55\xf3\xcb\x79\x13\x40\x52\x52\x12\ +\xc3\xc3\xc3\x9c\xfb\xe2\x00\x23\x93\x33\x7c\xf9\xdd\xb3\x86\xf8\ +\xa8\x20\x97\xda\x9a\x8f\x51\x55\x95\x40\x20\x80\xdf\xef\xe7\xcf\ +\xbb\x3e\x7e\xfe\xfd\x2f\x00\xbe\x3d\x79\x80\x24\xe7\x9b\xb4\xb7\ +\xb7\xa3\xeb\xfa\xa3\x88\x5d\xb4\x63\xc7\x0e\x5a\x5b\x5b\x09\x06\ +\x83\xa4\x26\x39\x69\x3e\x5f\xcb\x89\xca\x62\x7a\xfa\x7d\x84\x42\ +\x21\x34\x4d\x43\x96\x65\xec\x76\x3b\xbf\xdf\xe8\xe6\xc3\xf7\xdf\ +\xe5\xd7\xfa\x93\xa4\xbc\x15\x4f\x28\x14\xa2\xa5\xa5\x05\x21\x44\ +\x67\xc4\x2b\x6a\x6a\x6a\xe2\xe0\xc1\x83\x5c\xbe\x7c\x19\x8f\xc7\ +\x83\xc9\xa4\x10\x0e\xab\xcc\xcf\xcf\xaf\x74\x90\x24\x49\x68\x9a\ +\x86\xae\xeb\x58\xad\x56\xa2\xa3\xa3\x09\x06\x83\x0c\x0e\x0e\x72\ +\xec\xd8\x31\x84\x10\xe5\x40\xd3\xba\x0a\xb2\xb2\xb6\x92\x9b\x9b\ +\x4b\x5d\x5d\x1d\x81\xc0\x02\x8b\x8b\x8b\xe8\xba\x4e\x42\x7c\x3c\ +\x76\xbb\x1d\x9b\xcd\x46\x74\x74\x34\x26\x93\x09\x45\x91\x99\x9e\ +\x9e\x66\x61\x61\x81\x27\x4f\x9e\x50\x5f\x5f\x8f\x10\xe2\xe6\x7a\ +\xc5\x57\x14\xa8\xaa\xca\xad\x5b\xb7\xd8\xb3\x67\x0f\xc5\xc5\xc5\ +\x9c\x3a\x75\x0a\xb3\xd9\x8c\xa2\xc8\x18\xc6\xb3\xd3\xeb\xba\x8e\ +\xa6\x69\x84\x42\x41\x66\x66\x66\x89\x8b\x8b\xa3\xa1\xa1\x81\xb6\ +\xb6\x36\x0d\xd8\x0b\x5c\xdf\x10\xd0\xdf\xdf\x8f\x77\x60\x80\x4f\ +\xab\xab\xc9\xcc\xcc\xe4\xf8\xf1\xe3\xa4\xa5\x6d\x41\x96\x65\x84\ +\x30\x10\x42\x20\x84\xe0\xe9\xd3\x00\x7d\x7d\xff\xd0\xd8\xd8\xc8\ +\xe0\xe0\xa0\x06\x2c\x2e\xd7\x39\x03\xfc\x10\x01\x10\x66\x6e\x6e\ +\x8e\x91\x91\x51\xe6\xe7\xe7\x39\x7b\xf6\x2c\xdd\xdd\xdd\xec\xda\ +\xb5\x8b\x9d\x3b\x77\xe2\x76\xbb\x01\x18\x1a\xf2\xd1\xd1\xd1\xc1\ +\x9d\x3b\x5d\x00\x37\x81\xd3\xc0\x55\x20\x7e\xd9\x15\x66\x80\x13\ +\x40\xf3\x5a\x40\x38\xcc\xec\xec\x2c\x48\x60\x08\x83\xb1\xf1\x31\ +\xbc\xde\x41\xfe\x68\x6a\xa2\xa7\xb7\x97\xc9\xc9\x49\x00\x5c\x2e\ +\x17\xd3\xd3\xd3\x00\xe5\xcb\xc5\x26\x00\x52\x53\x53\x07\x00\x69\ +\x64\x64\x44\x06\x54\xa0\x04\xe8\x5c\x01\xe8\xba\x8e\xdf\xef\x47\ +\x08\xb1\x46\xde\xf8\xf8\xf8\x1a\x0f\x1a\x1a\x1a\xa2\xb2\xb2\x12\ +\x20\x15\x18\x5d\x4e\xb9\x81\xbb\x35\x35\x35\x71\xbd\xbd\xbd\x5a\ +\x6f\x6f\xaf\xba\xfc\xbf\x32\x80\x51\xd3\xea\x02\x92\x24\xad\xf8\ +\x0e\x40\x72\x72\xf2\x1a\x83\x0b\x04\x02\xcf\x53\xa3\xab\xce\x31\ +\x0a\xbc\x77\xe1\xc2\x85\x81\xda\xda\xda\x98\xa8\xa8\x28\x73\x67\ +\x67\xe7\x12\xe0\x05\xb6\xca\xab\x01\xcf\xfd\x66\xf5\xfa\xe5\xbd\ +\x0d\x22\xab\xae\xae\x4e\xcd\xc9\xc9\x31\xdc\x6e\xf7\x1b\x6b\xde\ +\xa0\xbd\xbd\x1d\x55\x55\xff\x63\xc9\xab\xd5\x00\x4c\x4c\x4c\x50\ +\x55\x55\xe5\x05\xb2\xd6\x01\xb8\x97\xe7\x3b\x40\x22\x50\x08\x8c\ +\x00\x7c\x0e\x18\xaf\x31\xaa\x37\x50\xe1\x5e\x35\xfe\x9f\xf8\x17\ +\xc1\x08\x40\x3b\x9d\x7d\xa8\x8b\x00\x00\x00\x00\x49\x45\x4e\x44\ +\xae\x42\x60\x82\ +\x00\x00\x08\x19\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xd6\xd8\xd4\x4f\x58\x32\ +\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ +\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ +\x79\x71\xc9\x65\x3c\x00\x00\x07\xab\x49\x44\x41\x54\x58\xc3\xad\ +\x57\x5b\x50\x93\x67\x1a\xf6\xca\xce\xec\xcc\xf6\x62\x2f\xbc\xd9\ +\xe9\xce\xec\x6e\xbd\xda\xd9\x9b\xb5\xce\xba\x3b\x7b\xb0\xad\xcc\ +\x7a\xb1\xce\xce\x3a\xb3\x76\x54\x70\x75\xdb\xe2\x81\xd6\xb6\x54\ +\x04\xbb\xa5\x20\x6d\xc1\x82\x06\x08\x07\x51\x42\x80\x80\x80\x02\ +\x21\x81\x10\x92\x40\x48\x10\x73\x24\x21\x67\x72\x80\x04\x42\x20\ +\x9c\x09\x47\xb5\x54\x78\xf6\xfb\x7e\x13\x16\x30\x58\x8b\x7d\x67\ +\x9e\xf9\x2f\x92\xfc\xcf\xfb\x3e\xcf\xfb\xbe\xdf\x97\x5d\x00\x76\ +\xfd\x98\x20\xf1\x0b\x82\x14\x02\x03\xc1\x75\x82\x03\xcf\xfd\xfe\ +\x8f\x48\xbc\x9b\x20\xe1\x57\xaf\xef\xb5\x2a\x8c\xd6\x65\xdb\x02\ +\x60\x19\x1e\x5b\x09\x27\xf1\x33\xfa\x19\x81\x22\xfc\xdc\x3e\x76\ +\x48\x7e\x8a\xa0\xb9\xb6\x59\x1c\x32\xcf\xad\x42\x39\xfe\x1d\x44\ +\xf6\x51\xd8\xc7\xe6\xe8\x87\x86\x3d\x7b\xf6\x58\x53\x52\xae\x2c\ +\xca\x3a\x3a\x10\x4e\xe2\xe5\x49\xc3\xc4\x31\x04\xb7\x3e\x49\xf9\ +\x2c\x60\x9b\x5d\x59\x53\x4d\x03\x4d\xb6\x11\x34\xeb\xfb\x20\x31\ +\x79\x60\x19\x9d\xc5\xbb\xef\xbe\x3f\xc5\xab\xbe\x83\xf1\x89\x29\ +\x4c\x4f\xcf\xae\x92\xef\xd7\xbc\x74\x02\x11\x9f\x0f\xbe\x1d\xe3\ +\xb2\x04\x43\x4f\xb4\x33\x40\x8b\x7b\x06\xcd\x3d\x2e\x34\xeb\xec\ +\xa8\x57\xf6\x20\x87\x53\x85\x32\x5e\x35\x43\xbc\xb0\xf4\x90\x81\ +\xc1\x60\x5c\x26\xbf\x4b\x7c\xe1\x04\x48\x1c\x24\x38\x41\xfd\xdd\ +\xea\x73\x27\xf1\xb9\x27\x04\x48\x87\x97\xc1\xd7\xbb\x20\x22\x55\ +\x37\xdc\x37\xa2\xb8\x4e\x88\x2c\x56\x3e\xcc\x56\xdb\x3a\x71\x04\ +\x2c\x16\x6b\x2c\xfc\xce\xe7\x27\x10\x91\x36\x93\x95\x3f\x46\x7d\ +\xa5\xfe\x12\xc4\x6f\xf4\x59\x31\xb6\x02\x7e\xef\x20\x5a\x7b\x9c\ +\xe0\x3f\x30\xa1\x4c\x28\x43\x46\x0e\x1b\xb2\x0e\xf9\x26\xd2\xf9\ +\xc5\x65\xcc\x2d\x2c\x21\x34\xbf\x88\xbd\x7b\xf7\x5a\xc9\x3b\x7e\ +\xba\x6d\x02\x24\x7e\x43\x90\x46\x3d\x35\x13\x69\x75\xb3\x80\xd2\ +\x3f\x0f\xcb\xc4\xe2\x9a\x50\xa1\x5a\xb4\x6c\xf1\x59\xa0\xb6\xa0\ +\xa6\x5d\x8d\x2f\xb2\x73\x71\xb7\x9e\xff\x0c\x31\x25\x9d\x09\xcd\ +\x63\x62\x6a\x06\x83\x43\x81\x27\xe4\xdd\xbc\x2d\xd3\xb0\x3b\x92\ +\x03\x33\x26\xd4\x53\xb5\xd3\xfb\x58\x4f\x88\xc5\x03\x21\x88\x2c\ +\x43\x50\xba\x46\xd0\xed\x09\x42\xe5\x9b\x42\x9b\x73\xfc\xa9\xcf\ +\x5a\x1b\xee\x2a\x74\xc8\xbc\xc9\x45\x09\xa7\x6c\x93\xcf\x9b\x88\ +\x27\xa7\x11\x18\x1d\xc3\x80\x6f\x08\xa2\xd6\xd6\x25\xc2\x51\xdb\ +\x28\x12\x87\xc6\x1f\xaf\x82\x2f\x62\x94\x4d\x89\x24\x90\x22\xea\ +\x52\x2d\x9a\x42\xab\xe8\x18\x79\x04\xa1\xc5\xcf\x10\x53\x74\xf6\ +\x0d\xa3\xd3\xe1\x87\xd4\x3c\x80\x16\xbd\x03\x0d\x5d\x06\x14\xd5\ +\x0a\x90\x91\x95\x0d\x2f\x79\xf1\xc6\xaa\xa9\xd4\xb3\x73\x0b\x4c\ +\xc5\x94\xd8\xdd\xef\x85\xc9\x62\x05\xb7\xbc\x12\xa5\xe5\x95\x4b\ +\x13\xf3\xcb\xab\x23\x0f\x01\x37\xd9\x11\xe6\xd9\x15\x84\x97\x15\ +\x13\x06\xcb\x3c\xd0\x68\xf2\xa3\xdd\xee\x5f\x27\x96\x3b\x86\x20\ +\xb3\x78\xd7\x7d\xe6\x08\xa4\xf8\x3c\x33\x1b\x2a\x8d\x36\xaa\xdc\ +\x53\x33\x21\x8c\x8e\x8d\x33\x15\xd3\x26\xe4\x37\x09\xf1\xc1\xc5\ +\x8f\x51\x73\xaf\x01\xbe\x65\x60\xfc\x11\xa0\x23\x13\x23\xf2\xce\ +\xa1\xbe\x5d\xb9\xb8\x51\x01\x83\x81\x74\x74\x4d\xa7\x1e\x0a\x67\ +\x80\xa9\xb8\xdd\xea\x83\xd8\xe8\x42\x93\xca\xcc\xf8\x7c\xe5\xcb\ +\x2c\x88\xda\x24\x51\x89\xa7\x67\xe7\x18\x1b\x86\x86\x47\x60\x77\ +\x38\x49\x82\x3a\x24\x7c\xf8\x21\xae\xb3\x0b\xe1\x99\x5c\x80\x6f\ +\x09\xd0\x90\xde\xe1\x0f\x2c\x81\xab\x1f\xc4\x7d\xef\x04\xdd\x07\ +\x1d\x61\xeb\xff\x9f\xc0\x1d\xb9\x16\x1d\xf6\x21\x48\xcc\xfd\x4f\ +\x7d\xee\xd4\x22\x9d\x55\x84\xaa\x9a\xba\x4d\x3e\x47\xe4\x8e\xf8\ +\x3c\x3c\x12\x84\xd3\xdd\x0f\xbd\xc1\x88\xc2\xe2\x62\x9c\x7e\x2f\ +\x1e\x3d\x03\x01\xf4\x2f\x02\x83\x84\xbc\xc5\xff\x2d\xee\x3a\x43\ +\x28\x51\x91\xf7\xf6\x05\xf1\x4e\xdc\xbf\x7d\x84\x33\x69\xe3\x20\ +\x18\xf4\x33\xab\xe0\xc9\x54\x68\x35\x38\xd1\xd8\xdd\x0b\x9e\x58\ +\x89\xac\x5c\xf6\x33\x3e\x47\xaa\x9e\x9c\x9e\x65\xe4\xee\xf7\x0e\ +\xa2\xd7\x6c\x41\x43\x03\x1f\x27\x62\xe3\x20\xe9\xd6\xc0\x45\xcf\ +\x01\x52\x90\x24\xb8\x86\xb2\x9e\x00\x6e\xb4\xdb\x50\xd1\x1b\x44\ +\x85\xce\x8b\x4a\x7e\x0b\x6d\xbe\x9b\x5b\x27\xd1\xa0\x99\xf8\x16\ +\x65\x22\x05\xee\x29\xf4\x28\x13\xc8\x90\x78\x35\x0b\x1a\xad\x3e\ +\xaa\xdc\x63\x13\x93\xf0\x0d\x0d\xc3\x66\xef\x83\xb4\x5d\x8e\xc4\ +\x4b\x97\x90\xc3\xca\xc3\xd4\x63\xc0\x4e\x7a\x49\x31\x4e\xfa\x89\ +\x94\x7f\x5b\x3b\x84\x7c\x85\x13\x25\x6a\x1f\x4a\xd5\x03\xe8\xf2\ +\x30\xa3\x28\x22\xf8\xf9\x33\x09\x74\x8f\x2e\xa1\xa8\xbe\x15\xa5\ +\x7c\x09\xb2\x4a\x2a\xf0\xcf\xe3\x71\x51\xe5\xf6\x07\x46\xd1\xe7\ +\xf2\x40\xab\x37\x20\xfd\x6a\x06\x92\xbf\x48\x83\xcd\x37\x02\x27\ +\xa9\xda\x40\x1a\x4c\xe0\x7b\x88\x52\x9d\x1f\x45\xdd\xfd\x0c\x71\ +\x41\x97\x1b\xc5\xdd\x1e\x88\x9c\x41\xfc\xf9\xcd\xb7\x5d\x84\xeb\ +\x6c\xb4\x43\xd0\x28\xf7\x4e\x23\xa7\xfc\x1e\xb2\x4b\xab\xf1\x51\ +\xea\x57\x48\xfe\x6f\xea\xfa\x58\x51\xb9\x47\x82\xe3\xf0\x0c\xf8\ +\x60\x34\x99\x51\xc9\xab\xc2\xfb\x67\xcf\x41\xfe\x40\x03\x3f\xe9\ +\x6e\xb2\x8d\x19\xb9\x6f\x69\x06\x19\xd2\x9b\x2a\x2f\x72\xe5\x0e\ +\xe4\x75\xf6\xa1\xf0\xbe\x1b\x1c\x95\x1b\xf9\x9c\xca\x29\xc2\x53\ +\xb8\xdd\x29\xdc\x2b\x76\x04\x90\x51\xc8\xc5\x95\x6b\x79\x38\x11\ +\x9f\x80\x9b\xb7\x6e\x33\x63\x15\x91\xdb\x6a\x73\x40\x22\x6d\xc7\ +\x85\x84\x0f\x50\x74\xbb\x0c\xf3\x2b\x80\x9f\x34\x58\xf7\x24\x20\ +\x1c\x7c\x84\x4a\xd3\x18\x38\xfa\x61\x86\x9c\x56\xfd\x55\xb3\x1e\ +\xac\x0e\x3b\xb8\x3a\x1f\xd9\x21\x1e\x7a\x2f\xe0\x13\xbc\xba\x5d\ +\x02\x26\xbe\xc1\x83\x94\x6f\xd8\x38\x9f\x9c\x8a\x03\x7f\x3d\x04\ +\x63\xaf\x99\xe9\x6e\x2a\xb7\x46\xd7\x83\xa4\xcb\xc9\x48\xff\x3a\ +\x8b\x8c\xd5\x3c\x53\xb5\x71\xf6\xa9\xdc\x35\xf6\x69\x5c\x97\x59\ +\x19\xd9\xbf\x6e\x21\xa7\xa0\xd4\x82\x74\xbe\x1a\x57\x9b\x34\x60\ +\xc9\xcc\x10\xbb\x82\xf8\xe5\xaf\x5f\xa7\x67\xc0\x3b\xe1\x75\x1f\ +\x35\xcc\x35\xdd\x66\x7c\x94\x96\x85\xb8\x73\x17\xf1\x97\x43\x31\ +\x4c\xd5\x74\x99\xf0\xaa\xaa\x71\xfa\xf4\x19\x68\xcc\x0e\x8c\x92\ +\x2d\x36\x14\x1e\xab\x5a\xc7\x0c\x78\xe6\x71\x70\x0d\x23\x4c\xa3\ +\x65\x8a\x0c\x8c\xec\xb4\xfa\x9c\xb6\x5e\x94\x74\x39\xd0\x66\xf7\ +\xaf\x1e\x3d\x11\x4b\x47\x2e\x6f\xc3\x79\x13\x35\x2c\x5c\x99\x1a\ +\xf1\x97\x3e\xc7\xd1\xd8\x33\xf8\x38\x31\x09\x86\x5e\x13\x1a\x9b\ +\x04\xf8\xdd\x1b\xfb\x51\x4f\xd4\xf1\x90\x99\xee\x9a\x00\xaa\xad\ +\x93\x60\x2b\x5d\x0c\x39\xf5\xbc\xf0\xbe\x67\xbd\xea\xcc\x16\x3d\ +\x4a\x55\x1e\x08\x6d\x01\x94\xd4\xf1\x43\xe1\x65\x53\x40\xf0\xca\ +\xf7\x25\x60\x2b\x6e\x6a\xc7\xa9\x84\x44\xc4\x1c\x39\x8a\xdc\x7c\ +\x36\x5a\x5a\xc5\x38\x14\x13\x83\x2f\x39\x35\xc8\x14\x6a\x98\xe6\ +\xa2\xd5\xd2\x27\xf5\x9a\x7a\x4c\x13\xa1\x49\x64\xb7\x99\x90\xdb\ +\x6e\x46\xb9\xda\x8d\x06\xa5\x76\x39\x2c\x39\x3d\xf9\x4e\x13\xec\ +\xd9\x72\xd4\x47\x0d\x3b\xab\x46\x88\x63\xff\x39\x8f\xdf\xee\xfb\ +\x3d\x1a\xf9\x02\x9c\xbf\x90\x80\x93\xf1\x17\x70\xa3\xad\x07\x19\ +\xc4\x4f\x4a\x14\xe9\x6e\xba\x58\xa8\xef\x2c\xfa\x94\x98\x50\x28\ +\xb7\x40\xe9\x0e\x3c\xf9\x57\xec\x29\x2a\x77\x2d\xc1\x67\x04\xfb\ +\xb6\xb9\xe4\x44\x8d\xbe\xcc\xb2\x5a\xfc\xe3\xe4\x19\x1c\x3c\xf4\ +\x37\xb0\x72\xf3\xb0\xef\xc0\x1f\x50\x20\xd1\x21\x89\x27\x65\x2a\ +\xa6\x4b\x85\x3e\xbf\x21\xd5\x46\xe4\x2e\x90\x5b\x21\xb0\x0c\xae\ +\xe5\xdc\xe2\xd2\x11\x13\x13\xe4\x87\x6f\x3c\xaf\x3c\xe7\x96\x15\ +\x35\x9c\x69\x45\xe5\xf8\xfb\xb1\x58\x1c\x3f\x19\x87\x37\xf6\xef\ +\xc7\x8d\x3a\x11\x92\xab\xa4\x0c\x21\xed\x70\xea\x35\x55\x21\x8b\ +\x34\x5b\xc9\x03\x37\x2a\x34\x6e\xd4\x49\x3a\x17\xc3\x72\x73\x08\ +\x8e\x6d\x95\xfb\x87\x24\xe0\x4a\x65\x73\x70\xe4\xf8\x29\x1c\x3e\ +\x7c\x98\x8c\x63\x2e\x32\x05\x2a\x5c\x22\xd5\xd3\x5d\x7e\x4d\xdc\ +\x0b\x36\xe9\x74\x76\xa7\x1d\x77\x8c\xe4\x88\xb6\xf9\x9e\x84\xb7\ +\x1a\x95\xfb\x22\xbd\x49\xfd\x80\x0b\x6d\xf4\x04\x32\x4a\x78\x4c\ +\x0f\x9c\x4b\x49\xc3\xb5\xa6\x2e\x7c\xc2\x6d\x65\x36\x59\xf1\x83\ +\x01\x5c\x97\x9a\xc1\x51\x7b\x20\xf3\x04\xd7\xce\x25\x26\x05\x36\ +\xc8\xfd\xc7\x9d\xc8\x1d\xd5\x82\xdc\x1a\x01\xce\x5e\x4e\x45\x81\ +\x58\x85\x78\xf6\x5d\x5c\xa9\x55\x90\xaa\xfb\xc0\x96\xdb\x50\xad\ +\x75\xe3\xae\x54\x41\x2f\x10\xca\x0d\x72\xbf\xba\xd3\x6a\xa3\x05\ +\xb7\xa2\x51\xf8\x1d\xaf\x43\x8d\x4f\xb9\x2d\x88\xcb\xe6\xe1\x9a\ +\x48\x8f\xaa\x1e\x2f\x9a\x35\xe6\xc7\x7f\x7a\xf3\x2d\x57\x78\xac\ +\xa8\xdc\xaf\xbd\xac\xdc\xd1\xe2\x08\xdd\x05\x5c\x75\x1f\xde\xcb\ +\xaf\x45\xb9\x76\x00\x32\x67\x60\xf5\xc2\xa7\x97\xa9\xdc\xf7\x08\ +\xd2\xa9\xdc\x3b\xf8\x03\xf3\xc2\xf1\x13\x82\xca\x1c\xee\x9d\x50\ +\x0b\x39\x94\xb8\x0d\xc2\xc8\x16\xa3\x17\x87\xc3\x2f\x22\xf7\x0e\ +\xff\xda\x6d\x8a\xdd\x61\x99\xd5\x1b\xb6\xd8\x6b\xbb\x5e\x32\xbe\ +\x2f\x89\xff\x01\x66\xb9\x5f\xfc\x11\x80\x3d\xcf\x00\x00\x00\x00\ +\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x0e\x35\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\ +\x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\x26\x00\x00\x80\x84\ +\x00\x00\xfa\x00\x00\x00\x80\xe8\x00\x00\x75\x30\x00\x00\xea\x60\ +\x00\x00\x3a\x98\x00\x00\x17\x70\x9c\xba\x51\x3c\x00\x00\x00\x06\ +\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\ +\x00\x07\x74\x49\x4d\x45\x07\xe1\x0a\x0d\x0f\x2b\x18\xc7\x56\x80\ +\xf9\x00\x00\x0d\x39\x49\x44\x41\x54\x68\xde\xc5\x5a\x7b\x78\x54\ +\xd5\xb5\xff\xad\xbd\xcf\xcc\x99\xcc\xe4\x01\x12\x20\x0f\x0a\x21\ +\x10\x5a\x79\xa3\x20\x05\x4b\x79\x84\x14\x10\x3e\xe4\xa5\x55\xf4\ +\x16\xea\x15\x42\x91\x54\x7c\xf5\xbb\xe5\xbb\xdc\xeb\x47\x51\x1e\ +\x1f\xca\x45\x81\xe2\xb5\x80\x82\xa0\x48\xa1\x48\x23\x85\x0b\x0a\ +\x52\xaa\x28\x04\x81\x12\x08\x31\x10\x9e\x81\xbc\x33\x79\xcd\x9c\ +\x39\xe7\xec\x75\xff\x98\x09\x86\x90\x4c\x48\xe4\xfb\xba\xfe\x59\ +\xf3\x9d\xb3\x67\xad\xdf\x7a\xec\xbd\xd7\xda\xfb\xd0\xe8\xd1\x23\ +\x04\x6e\x27\x02\xc0\x21\xae\x00\x88\x46\x38\x03\xa0\x03\x07\x0e\ +\xd9\x42\x88\x87\x99\xf9\x1d\x66\xee\x45\x44\x60\x66\x84\xe1\xd5\ +\x00\xde\x88\x8f\x8f\x5b\x32\x74\xe8\x43\x66\x45\x85\xb7\x55\x7a\ +\x43\x1c\x00\x58\xd4\xfb\xb3\x08\xf1\xfa\xbf\x65\xe8\xfd\x1d\xdc\ +\xe1\x70\xa0\x57\xaf\xfb\x75\x66\x9e\x0d\xa0\x17\x11\x05\x05\x85\ +\xe7\x91\x00\xd2\x8b\x8a\x8a\x7f\x32\x7d\xfa\x63\xad\xd2\x1b\xe2\ +\x75\xe3\x44\x7d\x03\xea\xf3\xa6\x3c\xc3\x75\x1e\x89\x8c\xf4\xd0\ +\x95\x2b\x57\x3d\x44\xb8\x1f\x2d\xa3\x58\x80\xbb\x4f\x99\xf2\xb4\ +\x6a\x8d\xde\x86\xcf\xeb\x0c\xe0\x30\x0a\x1b\x15\xf2\xe4\x93\xd3\ +\x6c\xd3\xb4\xee\x63\x46\x87\x16\x1a\xa0\x29\xc5\x9d\x99\xb9\xb9\ +\x71\xcd\x82\x07\x40\xf5\xc3\xd7\x22\x21\x93\x27\x4f\x83\x65\x59\ +\xb1\x00\xda\xb6\xd0\x00\x00\xe8\xb2\x6a\xd5\x32\x11\xe6\x7d\x73\ +\xe0\x6f\x45\xa8\x6e\x62\xdc\x46\x9d\x3b\x77\xe2\xf4\xf4\x7f\xb7\ +\x9e\x7f\xfe\x37\x2a\x25\xa5\x9b\x6a\x4c\x08\x91\x8b\x99\xb9\x13\ +\x00\x77\x4b\xd1\x33\x73\x97\x35\x6b\xde\x75\x3a\x1c\xda\x1d\xef\ +\x22\x22\x5c\x9c\x9a\x3a\x82\xd7\xaf\x7f\xc7\x4a\x4b\x1b\xc5\xba\ +\xee\x6c\x38\x81\xeb\x13\xd1\xe8\xd1\x23\x64\xdd\x0b\x66\x46\xd7\ +\xae\x5d\xf8\x83\x0f\x3e\x8e\xb3\x2c\xf3\x61\x66\x54\x46\x46\x7a\ +\xb2\x7e\xf9\xcb\xa9\x25\x1d\x3b\xb6\xa7\xac\xac\x93\x64\x18\x06\ +\x0d\x1a\xf4\x80\x5a\xba\x74\xa5\x12\x42\xfc\x8e\x99\x97\xb5\x22\ +\x02\x59\x1e\x8f\x67\x5c\x55\x55\x55\xf1\x98\x31\xa9\x9a\x52\x8a\ +\x3b\x76\xec\x80\x19\x33\x9e\x52\xb3\x66\xcd\x73\x15\x14\xdc\xe8\ +\xa1\x14\xf7\x21\xa2\x8b\xbd\x7b\xdf\x7f\x3c\x31\x31\xde\x36\x8c\ +\x40\x63\x59\xa2\x68\xf4\xe8\x11\xb7\x66\x7d\x4a\x4a\x37\xde\xb0\ +\xe1\x83\x0e\xa6\x69\x6e\x64\xe6\x5f\x00\xf0\x03\x38\x29\x04\xed\ +\x12\x42\x66\x26\x25\x75\xbe\x90\x9b\x9b\x67\x78\x3c\x9e\x04\xbf\ +\xdf\x3f\x9d\x99\x9f\x03\x90\xd4\x0a\x03\x0c\x22\xfc\x45\x4a\x6d\ +\x75\xa7\x4e\x89\x5f\x4f\x98\x30\x46\x6d\xd8\xb0\xb9\x9d\x61\x18\ +\x3f\xb7\x6d\x35\x15\xc0\x48\x00\x1d\x01\x94\x08\x41\xcf\x9d\x39\ +\xf3\xf5\x9f\x33\x32\x5e\x91\x8d\xc8\xe1\xba\x08\x40\x08\x41\xb1\ +\xb1\xed\xd4\x47\x1f\xed\xf8\x3d\x33\xff\xa1\x41\xb8\x18\x40\x01\ +\x11\xf6\x11\xd1\x09\xa5\xf8\x09\x00\x43\x43\xa1\xfd\x21\x54\x48\ +\x44\x1b\x00\xd4\x00\x3c\x91\x19\xfd\x00\xe8\xb7\xe7\x08\x8e\x3b\ +\x1c\xce\xc9\x19\x19\xb3\x0b\x4e\x9e\xfc\x67\x7d\x7d\x5c\x67\x00\ +\x01\x90\xfb\xf7\x1f\xb4\x75\xdd\xd9\xcf\x34\xad\x4f\x00\x74\x0e\ +\xa3\xb4\x2e\x27\xef\x15\xd5\xcd\xc1\x26\x17\x12\x22\xfa\xaf\x89\ +\x13\xc7\x2d\xf1\xf9\x7c\x64\xdb\xea\x36\x2c\x02\x80\xf0\x78\xdc\ +\x9c\x92\xd2\x4d\x37\x4d\xeb\xb9\x66\xc0\xe3\x1e\x83\xaf\x03\x4e\ +\xe1\xde\x33\xf3\xb3\x9f\x7e\xba\xaf\xcf\x6f\x7f\x3b\xc7\x6e\x60\ +\x38\x09\x66\xe6\x5d\xbb\x3e\x52\xf9\xf9\x97\x86\x03\x98\x76\x8f\ +\xc1\xdd\x2b\xea\x62\xdb\x6a\xde\xac\x59\xcf\x3b\x5d\x2e\xfd\x16\ +\x78\x00\x2c\xfa\xf5\xeb\x03\x8f\x27\x2e\x86\x19\xf3\x01\xb4\xf9\ +\x57\x23\x6d\x8a\x98\x79\x5a\x51\x51\xf1\xa8\xcc\xcc\x7d\x16\xea\ +\x2d\xab\xf2\xab\xaf\xbe\x61\xa5\xd4\xaf\x98\x79\x1e\xbe\xaf\x35\ +\x7e\x08\x59\x00\xbc\x00\xca\x01\xf8\x42\x9e\x72\xdc\x03\xb9\x2e\ +\x66\x8e\x6d\xdb\xb6\xcd\x9e\x61\xc3\x86\xf8\xca\xcb\x2b\x24\x00\ +\xa5\x69\x9a\x96\x62\xdb\xf6\xdc\x7b\xa0\xe4\x26\x11\x7d\x4a\x44\ +\x9f\x09\x21\xbe\x13\x82\xaa\x98\xa1\x29\xa5\x12\x94\x52\x83\x00\ +\x7e\x94\x19\x03\x7e\xa0\x9e\x51\x5e\x6f\xe5\xb4\x3e\x7d\x7a\xfd\ +\xe9\xe2\xc5\x4b\x8a\x99\x89\x88\x68\x39\x80\x97\xd0\xfa\xc9\x69\ +\x02\xf8\xc4\xe1\xd0\x96\xf7\xed\xdb\xfb\xe4\xb1\x63\x27\xcc\x25\ +\x4b\x5e\x25\x22\xa2\xc8\x48\x0f\x12\x12\xe2\x39\x27\x27\x97\x5e\ +\x7b\x6d\x45\xac\x61\x18\x4f\x29\xa5\x5e\x02\x90\xd8\x5a\x0b\x88\ +\x70\x42\xd7\xf5\xf1\x4f\x3e\x39\xad\xf8\xca\x95\x6b\x4c\x44\xb4\ +\x07\xc0\xb8\x56\xca\x0b\x10\xd1\xaa\xa8\xa8\xc8\xd7\xd7\xac\x79\ +\xc3\xbb\x65\xcb\x36\x69\x9a\x56\x63\xe3\xb8\x63\xc7\x0e\xa8\xac\ +\xac\xe2\xbf\xfd\x6d\x7f\xaa\x6d\xdb\x6b\x00\xa4\xb4\x52\x67\xa1\ +\xd3\xe9\x1c\xed\xf7\xfb\xb3\xd3\xd2\x46\x0a\x41\x84\x9d\x00\x2a\ +\x5a\x29\x6c\x53\x4c\x4c\xf4\x1f\x1e\x7f\x7c\x72\xe5\x7b\xef\x6d\ +\x69\x12\x3c\x00\x2a\x2c\x2c\x82\x61\x18\xc2\x34\xcd\xfd\x52\xca\ +\x97\x00\x94\xb4\x2e\x02\xf4\x45\x44\x84\xeb\xca\xd4\xa9\x13\x25\ +\x00\x16\x51\x51\xd1\x9b\x84\xa0\x0c\x00\x97\x5b\x28\x2b\xdb\xe9\ +\x74\x2c\xdb\xbd\xfb\xa3\xea\xfc\xfc\xcb\x4d\xa5\xdf\x6d\x55\xa5\ +\x52\x8a\x1f\x79\x24\x4d\xeb\xd9\xf3\xc7\x7b\x88\xe8\x4f\x2d\xd4\ +\x67\x10\xd1\xbb\x4e\xa7\xe3\xc5\x69\xd3\x1e\xad\xa9\xac\xac\x0a\ +\xee\x03\x63\xc7\xa6\x5a\xf3\xe6\xa5\x6f\x95\x52\x4e\x07\x70\xa4\ +\x05\x9e\x78\xdf\xef\x37\x2e\x2c\x5a\xb4\xac\xa9\x95\xab\xd1\x92\ +\xd8\x34\x2d\x4e\x4f\xff\x35\x4b\x29\x37\xb5\xc0\x69\x25\x42\x88\ +\x05\x51\x51\x91\x2f\x64\x64\xa4\xdf\xc8\xcf\xbf\x5c\xb7\xf9\xb1\ +\x28\x2d\x2d\xc3\xb9\x73\xe7\xc5\xda\xb5\x6f\x7c\xa5\xeb\xfa\xd3\ +\x44\xd8\x08\x20\xd0\x8c\xc0\x22\x21\xc4\xfe\x9c\x9c\xe3\x68\xa2\ +\x31\x09\x5b\xcf\x67\x66\xee\xa3\xe4\xe4\xa4\x0b\x44\x77\xe5\xb0\ +\x6c\x29\xe5\x33\xbd\x7a\xfd\x64\x55\x6a\xea\x70\xff\x89\x13\xa7\ +\x45\x5d\x9b\x0a\x80\x64\x72\x72\x92\x60\x66\xca\xce\xce\x11\x93\ +\x26\x8d\xf7\x9e\x3a\x75\xe6\x70\x20\x60\x0e\x45\xf8\x2a\xf3\x6c\ +\x54\x54\xe4\x9a\x82\x82\x9b\x81\xda\xda\xda\x86\x65\x40\xb3\xcd\ +\x88\x52\x8a\x8e\x1d\x3b\x61\x12\x89\x2e\x00\xc6\x84\xd1\xe3\x93\ +\x52\xce\xb1\x2c\xeb\xaf\x03\x06\xf4\x93\x3e\x9f\xbf\x1e\xf6\xa0\ +\xae\x3a\x05\x41\x53\xb3\x73\x44\x44\x84\xcb\x4f\x44\x66\x38\x97\ +\x10\xa1\x30\x3a\x3a\xda\xe7\xf5\x56\xb6\xc8\xf3\x77\xca\xa1\xeb\ +\x00\xec\x30\xaa\x98\x99\xab\x99\x99\x2c\xab\xd1\x05\x82\x34\xd4\ +\xdf\x96\xa5\x60\x87\xc3\x41\xcc\x1c\xae\xb8\x02\x33\x20\xa5\xe0\ +\x06\xe3\x5a\x04\x3e\x44\x06\xbe\xaf\x6e\x6b\x01\x54\x85\x9e\x69\ +\x00\xa2\x00\x94\x4a\x29\xcb\x9a\x68\xd9\xb9\x7e\x04\x08\x00\xf7\ +\xe9\xd3\x8b\xcb\xcb\x2b\x1c\x44\xa4\x21\x3c\xb5\xab\xa8\xf0\x46\ +\xc4\xc4\x44\x73\x3d\x61\x2d\x02\x3f\x77\xee\xb3\xc2\xe5\x72\x1d\ +\x23\xa2\x45\x42\x88\xf9\x52\x8a\x47\x74\xdd\x39\xca\xe9\x74\x0e\ +\xd7\x75\x7d\xa4\x94\xf2\x17\x0e\x87\x63\x6a\xb7\x6e\x49\xe7\xc6\ +\x8e\x4d\x6b\x6c\xa1\x20\x84\x94\x09\x21\x04\xaf\x5a\xb5\x5c\xad\ +\x58\xf1\x76\xa2\xdf\x6f\xbc\xc9\xcc\x43\x9b\x31\xa0\x6b\x4d\x4d\ +\x6d\xc2\x84\x09\x63\xb9\x95\x9e\x47\x6e\x6e\x9e\xf8\xd9\xcf\x7e\ +\x7a\x53\x29\xb5\x78\xc1\x82\x97\xdf\x4a\x4c\x4c\x38\x2e\x84\x28\ +\x15\x42\x10\x11\x6a\xdb\xb6\x8d\x39\x37\x73\xe6\xd3\x27\xcf\x9e\ +\x3d\x6f\x4a\x29\x1b\x0b\x41\xb0\x37\x7f\xf1\xc5\xe7\xa8\x7d\xfb\ +\xf6\xb4\x70\xe1\xe2\xc1\x4a\xa9\x65\xcc\x3c\x0c\xcd\x13\x0b\x21\ +\xe6\xdb\xb6\xfd\xd6\xe8\xd1\x23\xb4\x96\x82\x17\x42\xa0\x77\xef\ +\x9e\xf6\x96\x2d\x1f\x7b\x4a\x4b\x4b\x07\x28\xc5\x8f\x30\xf3\x20\ +\x22\x74\x62\x46\x04\x82\x05\x61\x11\x11\x9d\x24\xa2\x3d\x1e\x8f\ +\xfb\xef\x19\x19\xe9\x95\x59\x59\xdf\x92\x65\xd9\x24\x84\xe0\xf8\ +\xf8\x38\xd8\xb6\xcd\x14\x1b\xdb\x4e\x2f\x2b\x2b\x7f\x2c\xd4\x46\ +\x26\xdd\x05\xf8\x3a\xca\x72\xbb\x23\x26\x67\x66\x7e\x7c\xed\xb5\ +\xd7\x56\x68\x77\x0b\xde\xe9\x74\xc2\xe7\xf3\xa9\x23\x47\x8e\x0e\ +\xb2\x2c\xeb\x05\x04\xcb\x98\x68\x04\x27\x73\x25\x82\x73\xc1\x01\ +\x20\x06\xc1\xf6\xd2\x4f\x84\xcf\x85\x90\x4b\x1f\x7d\x74\xc2\x97\ +\x4a\x59\xb8\x76\xad\x40\x9e\x39\x73\xae\xad\xae\x3b\xab\xa5\xcf\ +\xe7\xff\x35\x80\x95\x00\xe2\x5a\x00\x1e\x00\xe2\x2d\xcb\xc2\x91\ +\x23\x47\x0f\x0f\x1e\x3c\xd0\x2c\x2d\x2d\x93\xcd\x81\x77\xb9\x74\ +\x9c\x3b\x97\x4b\xa7\x4f\x67\xff\x9b\x6d\xdb\xeb\x10\xec\xab\x8b\ +\x89\x68\xb3\x10\x62\xb9\xa6\x69\x2b\x35\x4d\xfe\xaf\x94\x72\x33\ +\x80\x3d\x00\xae\x02\xe8\x04\xe0\xa7\xcc\x3c\x26\x27\x27\xb7\x78\ +\xc6\x8c\xe9\xa7\xb6\x6e\xdd\x3e\xc0\xb2\xcc\x0f\xfd\x7e\x23\x5e\ +\x12\xd1\x22\x00\x7d\x5b\x08\x1e\x21\xa0\xfd\x2b\x2a\xbc\x81\xcb\ +\x97\xaf\x9e\x78\xec\xb1\x49\xc6\xd5\xab\xd7\x45\x53\x27\x6e\x52\ +\x4a\x94\x97\x57\xf0\xd9\xb3\xe7\x9f\x51\x4a\xbd\x19\xf2\xf0\x16\ +\xa7\xd3\x91\xf1\xe0\x83\x03\x36\x5d\xb9\x72\xf5\xac\x65\xd5\x14\ +\x0d\x1e\x3c\xb0\xe2\xf1\xc7\xa7\x94\xcc\x99\xf3\xec\x45\xaf\xd7\ +\x7b\xe8\xd2\xa5\x2b\x7b\x99\xd9\x03\x60\x08\x80\x51\x9f\x7f\xfe\ +\x45\x3e\x80\xfb\x98\x39\x03\x80\x4d\x44\xb4\x0c\xc0\xcb\x68\x7d\ +\x39\xed\x27\xc2\x26\x87\xc3\xb9\x72\xfc\xf8\xb1\xb9\x3b\x76\xec\ +\xe2\xf9\xf3\xe7\x12\x33\xa3\xb4\xb4\x8c\x8a\x8b\x4b\xa0\x94\xa2\ +\xfd\xfb\x0f\x5a\x0e\x87\x63\x8c\x6d\xdb\x9b\x01\x44\x13\xd1\x92\ +\xb6\x6d\xdb\xbc\xf9\xfa\xeb\xff\x5d\xbd\x73\xe7\x6e\x69\xdb\x77\ +\x6e\x07\x44\xc4\x4f\x3c\x31\x95\xe7\xcf\xff\x0f\x77\x4d\x4d\xed\ +\x7f\x32\xf3\xcb\x00\x2e\x11\x61\x17\x33\x5e\x00\xf0\x77\xd2\x34\ +\xd9\xdd\xb6\xd5\x76\x00\xfd\x5b\x69\x00\x42\xa9\x73\x81\x88\x76\ +\x09\x41\x07\xa4\x94\xf9\x52\x4a\x1f\x80\x40\xdf\xbe\xbd\xcb\x86\ +\x0c\x19\x64\xaf\x5f\xbf\x39\xb6\xaa\xaa\x7a\x3b\x80\x9f\x13\xe1\ +\xad\xb8\xb8\xb8\xdf\x4f\x9a\x34\xde\x9f\x9b\x9b\xd7\x9c\xe3\xb8\ +\x53\xa7\x04\x6c\xdf\xfe\x89\xc7\xe7\xf3\xad\x65\xe6\xa7\x00\x94\ +\x01\xb8\x0f\xc0\x17\x14\x0a\xef\x2c\xa5\xd4\x6a\x00\xce\x1f\x60\ +\x44\x1d\xf9\x42\x0a\xfc\x44\x28\x91\x52\x9b\x6d\x9a\xe6\x69\x21\ +\xc4\x4c\x66\x5e\x0f\xe0\x94\xcb\xa5\x4f\xda\xbd\x7b\xdb\xd5\x65\ +\xcb\x56\x86\x6d\x61\x85\x10\xfc\xa3\x1f\x25\x22\x39\x39\x59\x2d\ +\x58\xf0\x2a\x3b\x1c\x5a\x2f\xdb\x56\x7f\x05\xd0\x35\x34\xe4\x0b\ +\xb1\x7d\xfb\xfb\xe4\x72\xe9\x7f\x26\xc2\xc1\x7b\x00\x1e\x00\x22\ +\x10\xec\xb8\xba\x31\xa3\x27\x80\x98\xae\x5d\xbb\x38\x01\x4c\x09\ +\x62\xa2\x8d\x3e\x9f\xff\xca\xdd\x80\xaf\xa8\xf0\xca\xad\x5b\xb7\ +\x77\x58\xbc\x78\x59\x37\x97\x4b\xef\xea\x70\x38\xfc\x00\x0e\xdf\ +\x36\xee\x9d\x77\x36\x8a\xea\xea\x9a\x0a\x22\xf1\x3f\x08\x36\xe3\ +\xf7\x92\xae\x69\x9a\xfc\xee\xc6\x8d\xc2\x24\x66\x7e\x00\xc0\x0d\ +\x21\xc4\x67\xeb\xd7\xaf\x6e\x36\x6d\xe6\xcf\x9f\xcb\x27\x4e\x9c\ +\xea\x6f\x18\xc6\x5e\xbf\xdf\x38\x14\x08\x98\x87\xfd\x7e\xe3\x20\ +\x80\x89\xf5\xc7\x09\x00\x3c\x71\xe2\x38\x11\x1f\xdf\xf1\x10\x11\ +\x7d\x7c\x8f\x0d\x28\x88\x8f\x8f\xf3\x9a\xa6\xd9\x09\x40\x7b\x00\ +\xf9\xd1\xd1\xd1\x05\x7b\xf7\x1e\x08\x57\x6b\x31\x00\x1a\x37\x6e\ +\xaa\x12\x82\x88\xf9\xb6\x2b\x25\x00\xa8\x06\x70\x05\xc1\xc9\x7c\ +\x44\x00\x20\x9f\xcf\x4f\x3b\x76\x7c\x60\x08\x21\xd6\xa0\xf9\x26\ +\x43\xe1\x2e\x89\x88\xbc\x73\xe6\x3c\x63\x10\x21\x16\x80\x93\x88\ +\x0a\xdb\xb4\x89\xf1\x55\x55\x55\x37\x7b\x1f\x31\x66\xcc\x28\xad\ +\x47\x8f\x94\x2c\xb7\xdb\x3d\xd6\xe9\x74\x0c\x77\xb9\xf4\xe1\x4e\ +\xa7\x73\x84\xae\xeb\x23\x74\xdd\x39\x52\xd7\xf5\x11\x11\x11\xee\ +\x25\x75\x3b\xa8\x5c\xb8\x70\xb1\x48\x4f\x9f\x79\xe6\x8f\x7f\xdc\ +\xf0\x6e\xd3\x87\xbb\xb4\x17\xc0\x09\x66\x9e\x8e\xe0\xba\x1c\x36\ +\x15\x98\x19\xdf\x7d\x77\x81\x98\x83\x46\x33\x33\x49\xd9\x64\xea\ +\x37\x68\x3f\x59\xc5\xc7\x77\xa4\xd4\xd4\xe1\x37\x1d\x0e\x0d\xba\ +\xee\x42\x20\x10\x80\x10\x02\x42\x10\xaa\xab\x6b\x70\xf3\x66\x21\ +\x6e\x95\xd3\x4a\x29\x4a\x48\x88\x57\x6e\x77\xc4\xc6\x9a\x9a\xda\ +\xe1\x00\x46\x03\xf0\x13\xd1\xb7\x00\x76\x39\x1c\xda\x9e\x1e\x3d\ +\xba\xe7\x9e\x3e\x9d\x6d\xba\xdd\x11\xbb\x0c\x23\xf0\x34\x33\xff\ +\x06\x61\xca\x0f\x22\x8a\xd9\xb7\xef\x33\x8d\x88\x2a\x10\xec\xf2\ +\xda\x17\x15\x15\xbb\xfa\xf6\xed\x55\x5d\x51\xe1\x6d\xb6\x14\x67\ +\x66\xce\xce\x3e\x17\xae\xdf\xe6\xfa\xf7\x03\x0c\x40\xa4\xa4\x74\ +\xb7\xdf\x7f\x7f\x4b\x27\xc3\x30\x86\x10\x09\xaf\xcb\xa5\x1f\x9b\ +\x3d\xfb\x99\xf2\xb2\xb2\x52\x14\x16\x16\x0b\xd3\x34\x11\x19\xe9\ +\xe1\x5d\xbb\x3e\xb5\xef\xe2\x82\xe3\x9c\xc7\xe3\x1e\x65\x9a\x66\ +\x64\x20\x60\x1e\x02\x20\x35\x4d\x4b\xfd\xf0\xc3\xf5\x39\xeb\xd6\ +\x6d\x10\xe1\xc0\xa3\x99\xb2\x24\x44\x4a\x26\x27\x27\xd5\xc5\x94\ +\x00\x70\x59\x59\x99\x4c\x4b\x4b\xf5\x1e\x3d\x7a\x2c\xdb\xb6\x6b\ +\x2f\xb4\x6b\x77\x9f\x91\x9f\x7f\x89\x2a\x2b\xab\x84\x52\xc1\xf4\ +\x0f\x04\x4c\xba\x78\xf1\x92\x92\x52\xc4\x31\xf3\x94\x30\xa9\xe4\ +\xb2\x6d\x7b\x5f\x97\x2e\x9d\xcf\x96\x97\x57\x0c\x03\xf0\x20\xc0\ +\xb9\xdb\xb6\xed\x3c\x9a\x9c\x9c\xd4\xf0\xde\xb7\xa5\xe0\x6f\x5d\ +\xf2\xa9\x86\x42\x72\x72\xce\x8b\xb4\xb4\x91\xe2\xcb\x2f\xbf\x96\ +\x25\x25\xa5\x8d\x1e\x7f\x33\x2b\x02\xe8\x3a\x80\x9a\x30\x4a\xa2\ +\x98\x79\x54\x5e\xde\x45\x43\x08\xb1\x13\x80\x52\x8a\x67\xb8\xdd\ +\x11\x9d\x17\x2e\xfc\x9d\x8d\xef\xbb\xc1\x56\x81\x47\x68\x19\x6d\ +\x95\x90\x6d\xdb\xde\x83\xc3\xa1\x15\xa3\x99\x43\x31\x66\x9e\xe4\ +\x72\xe9\x89\x6e\xb7\x3b\x13\xc1\x4d\xe8\x01\xbf\xdf\xff\xd2\x8c\ +\x19\x73\x22\xfa\xf7\xef\x63\x33\x73\xab\xc1\x23\x74\x2a\x51\x37\ +\x07\x5a\x24\x24\x3f\xff\xb2\xb8\x70\xe1\x92\xb2\x2c\x73\x0a\xc2\ +\x9f\x75\x76\x50\x4a\x15\x19\x86\xb1\x5f\xd3\xb4\x02\x66\x1e\x03\ +\xe0\xe1\xca\xca\x2a\x75\xfe\x7c\x5e\xd6\xd2\xa5\xaf\xfa\x8f\x1f\ +\xff\x56\x70\xb0\x8c\x6d\x09\x78\x81\xd0\x1c\x68\x98\x8b\x77\x25\ +\xc4\xb6\x2d\x96\x52\xda\x45\x45\xc5\x43\x01\xf4\x0b\x33\x9e\x00\ +\x74\xd7\x75\xfd\xff\xd6\xad\x5b\xf9\x4d\x66\xe6\x3e\x2f\x33\x8f\ +\x04\x90\xea\xf3\xf9\x3a\xef\xd8\xf1\xc9\x05\xb7\xdb\x53\xf4\x8f\ +\x7f\x1c\x55\x97\x2f\xe7\x71\x5c\x5c\x1c\x4a\x4a\x4a\x60\xdb\xf6\ +\x5d\x1d\xd7\xd4\x6f\x07\x5b\xe4\x01\xd3\xb4\xc4\xea\xd5\xcb\x03\ +\x69\x69\x93\xde\x36\x4d\x2b\x1e\xc1\xc3\xda\x3b\x6e\xd2\x11\xfc\ +\x4c\xe2\x06\x33\xdb\x9a\xa6\x51\x62\x62\xc2\xc6\xeb\xd7\x0b\x0c\ +\xa5\xd4\x22\x00\xbf\x0a\x04\xcc\x91\xa7\x4e\xfd\x33\x53\xd3\xb4\ +\x03\x52\x8a\x8b\x42\x08\x6f\x54\x54\x54\xd1\x43\x0f\x3d\x68\x18\ +\x86\x11\x0e\xbc\x00\x60\x53\xe8\x6b\x15\x42\xd3\x11\xe0\x46\x80\ +\xdd\x12\x12\x1b\xdb\xce\xde\xb7\xef\xb3\xe8\xda\x5a\x5f\x5b\x22\ +\xa2\xe0\x57\x29\xa1\x3f\x32\x98\x88\x84\x10\x54\x35\x70\xe0\x80\ +\x72\x5d\xd7\x95\x94\x92\xbc\xde\x4a\x95\x95\xf5\xed\x40\xd3\xb4\ +\xe6\x23\xd8\x52\xb6\xc1\xf7\x17\x23\x3e\x22\x7a\x3b\x3d\x7d\xe6\ +\x8a\xbc\xbc\xfc\xfa\xa9\xd5\x10\xbc\x02\x82\xe7\x2f\xf5\x3f\x71\ +\xa9\xcf\xeb\xff\xb1\xe1\x18\xbb\x8e\x97\x94\x94\xd2\xa4\x49\x13\ +\xbc\x7d\xfa\xf4\xf4\xba\xdd\x6e\xd4\xd6\xd6\xc2\xe9\x74\xc2\x34\ +\x2d\x08\x21\xe0\x70\x68\x38\x78\xf0\x30\x55\x56\x56\xc1\xb6\x6d\ +\xb2\x2c\x4b\x45\x46\x7a\x68\xed\xda\x37\xbf\x79\xe5\x95\x85\xb3\ +\xbc\xde\xca\x21\xcc\x3c\x15\xc0\x30\x00\x49\x00\xb7\x63\x46\x4c\ +\xff\xfe\x7d\x39\x2f\x2f\x5f\x35\xa5\xb7\xee\xf9\xff\x03\x78\x8c\ +\x5f\x99\x77\x2f\x9e\x77\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\ +\x74\x65\x3a\x63\x72\x65\x61\x74\x65\x00\x32\x30\x31\x37\x2d\x31\ +\x30\x2d\x31\x33\x54\x32\x33\x3a\x34\x33\x3a\x30\x33\x2b\x30\x38\ +\x3a\x30\x30\x27\xbf\x77\xe8\x00\x00\x00\x25\x74\x45\x58\x74\x64\ +\x61\x74\x65\x3a\x6d\x6f\x64\x69\x66\x79\x00\x32\x30\x31\x37\x2d\ +\x31\x30\x2d\x31\x33\x54\x32\x33\x3a\x34\x32\x3a\x35\x30\x2b\x30\ +\x38\x3a\x30\x30\xc0\x28\xb0\x93\x00\x00\x00\x00\x49\x45\x4e\x44\ +\xae\x42\x60\x82\ +\x00\x00\x1e\xc4\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\xca\x00\x00\x00\xc8\x08\x06\x00\x00\x00\xa9\xad\x7e\xa3\ +\x00\x00\x1e\x8b\x49\x44\x41\x54\x78\x5e\xed\x5d\x09\x98\x24\x45\ +\x95\x7e\x2f\xbb\xe7\x00\x04\x39\x46\xf0\xc0\x15\xd6\x71\xec\xae\ +\x78\x59\xc3\xd8\xa2\xce\x02\xae\x80\x8a\x22\x2a\x2a\x88\xe2\x2a\ +\x20\xae\xb8\x82\x3a\xb2\x1c\xab\xc0\x2a\x82\x17\x28\x78\xc1\xee\ +\xb2\x2b\x03\xa2\x78\x20\xa8\xdc\x28\x2a\x2e\x22\x2a\x0c\x34\x95\ +\x2f\xaa\x67\x70\x64\xd9\x15\x16\xd0\x05\xc1\xf1\x98\x69\xbb\xf2\ +\xed\x17\x6d\xf5\x7c\x3d\xd3\x47\x65\x64\x66\x64\x66\x55\x45\x7c\ +\x5f\x7f\xa3\xf4\x7b\xff\x7b\xf1\xbf\xfa\xbb\xf2\x88\x78\x81\x50\ +\xd1\x51\xaf\xd7\x77\x17\x91\x95\x71\x1c\xbf\x14\x11\x9f\x07\x00\ +\xbb\xb5\x7f\x7e\x05\x00\x0d\x44\xfc\x85\x88\xdc\xc0\xcc\xb7\x54\ +\x74\x0a\x3e\xad\x59\x18\xd8\xaa\xae\x2b\x44\xe4\x29\x88\x68\x7e\ +\x9e\x10\x91\x35\x88\x38\x26\x22\x37\x33\xf3\xf7\xaa\x44\x20\x56\ +\x29\x19\x93\xcb\xb2\x65\xcb\x96\x2c\x5a\xb4\xe8\x64\x11\x39\x25\ +\x61\x6e\x46\x28\x97\x31\xf3\xc5\x09\xed\xbd\x59\x09\x0c\xd8\xd6\ +\x55\x44\xee\x46\xc4\xef\x30\xf3\x99\x25\xa4\x3b\x23\x64\xa5\x84\ +\xa2\x94\x7a\x33\x22\x7e\x08\x00\x9e\x6b\x4b\x8e\x88\x7c\x07\x00\ +\xce\xd5\x5a\xdf\x66\xeb\xeb\xed\xdd\x32\x10\x86\xe1\xe1\x22\x72\ +\x56\x9a\xba\x02\x80\xf9\x43\x78\x66\xd9\x57\x0e\x95\x11\x0a\x11\ +\xbd\x07\x00\x3e\x97\xb5\x64\x88\xf8\xc6\x28\x8a\xae\xc8\x8a\xe3\ +\xfd\xf3\x61\xa0\x2d\x92\x6f\xe4\x80\x76\x10\x33\x7f\x37\x07\x9c\ +\x54\x10\x95\x10\x0a\x11\x99\x6f\x91\x0f\xa7\x9a\xc1\x2c\x4e\x5e\ +\x2c\x79\x31\x99\x0d\x87\x88\x5e\x0f\x00\x57\x66\x43\xd9\xec\xfd\ +\x88\x88\xbc\x5a\x6b\x7d\x47\x4e\x78\x56\x30\xa5\x0b\x85\x88\x5e\ +\x02\x00\x3f\xb4\xca\xba\xb3\xf1\xff\x05\x41\xb0\x6f\xa3\xd1\x58\ +\xd7\xd9\xd4\x5b\xb8\x60\x80\x88\x86\x01\xe0\x06\x00\x78\x56\x8e\ +\xf8\xa3\x83\x83\x83\xfb\x8f\x8e\x8e\x3e\x9e\x23\x66\x22\xa8\x2a\ +\x08\xc5\x88\xc4\x88\x25\xef\x71\x31\x33\x1f\x9b\x37\xa8\xc7\x4b\ +\xc6\x00\x11\xdd\x08\x00\x07\x25\xb3\x4e\x6e\x85\x88\x9f\x89\xa2\ +\xe8\xfd\xc9\x3d\xf2\xb1\x2c\x55\x28\x61\x18\xbe\x53\x44\xfe\x2d\ +\x9f\xa9\xcc\x44\x41\xc4\x57\x45\x51\x74\xbd\x2b\x7c\x8f\x3b\x3b\ +\x03\x39\xde\x97\xcc\x1a\x00\x11\x0f\x8e\xa2\xc8\x7c\x5b\x15\x36\ +\x4a\x15\x0a\x11\xdd\x09\x00\x23\xae\x66\x2b\x22\x97\x68\xad\x8f\ +\x71\x85\xef\x71\x67\x67\x80\x88\xcc\xcd\xfb\xe1\x0e\xf9\xf9\x3c\ +\x33\xbf\xd7\x21\xfe\x0c\xe8\x52\x84\x52\xaf\xd7\xf7\x8c\xe3\xf8\ +\x90\x3c\x9e\x72\x75\x20\xeb\x0f\xcc\xfc\xa4\x22\x09\xed\xf7\x58\ +\x44\xf4\x4c\x00\xf8\x1f\xc7\x3c\xac\x1f\x18\x18\x78\xc9\x3d\xf7\ +\xdc\xf3\xa0\xe3\x38\x9b\xe1\x0b\x13\x4a\xad\x56\x7b\x6a\x10\x04\ +\xaf\x02\x00\x23\x10\xf3\xef\x82\x82\x26\x59\xea\x63\xc5\x82\xe6\ +\x58\x99\x30\x4a\xa9\x37\x21\xe2\x57\x0b\x48\xe8\x62\x11\xf9\x7e\ +\x10\x04\x37\x44\x51\xf4\x5b\xd7\xf1\x9c\x0a\x65\xe9\xd2\xa5\x3b\ +\x2c\x5a\xb4\xe8\x10\x23\x10\x11\x31\x02\xd9\xc1\xf5\x84\x66\xc1\ +\x7f\x1b\x33\x5f\x56\x42\xdc\xbe\x0c\xa9\x94\xfa\x3c\x22\x9e\x50\ +\xe0\xe4\x1b\x6d\xc1\x5c\x1f\x45\xd1\xcd\xae\xe2\xe6\x2e\x94\x91\ +\x91\x91\x05\xe3\xe3\xe3\x53\xc2\x30\xdf\x1c\x4f\x75\x95\x7c\x42\ +\xdc\x93\x99\xf9\x53\x09\x6d\xbd\x59\x46\x06\x88\xe8\x26\x00\x78\ +\x79\x46\x98\x54\xee\x22\x72\x2b\x00\x5c\x0b\x00\x57\x69\xad\xd7\ +\xa7\x02\x99\xc3\x29\x37\xa1\x84\x61\x38\x22\x22\x47\xb5\x2f\xad\ +\xf6\xcc\x33\xc9\x8c\x58\xa7\x30\xf3\xb9\x19\x31\xbc\x7b\x42\x06\ +\x88\xe8\x4b\x00\xf0\xd6\x84\xe6\xae\xcc\xfe\x04\x00\x57\x9b\x4b\ +\xc0\x28\x8a\xcc\xd2\xa6\xcc\x23\xb3\x50\x8c\x40\xe2\x38\x7e\x27\ +\x22\xbe\x33\x73\x36\x0e\x00\xe2\x38\x3e\xa6\xd9\x6c\x5e\xe2\x00\ +\xda\x43\xce\xc2\x00\x11\x99\x3f\x4a\x27\x55\x88\x1c\xf3\x9e\x6e\ +\x75\xd6\xcb\xef\xd4\x42\x19\x1a\x1a\xda\x63\x60\x60\xe0\x03\x55\ +\x15\xc8\x54\xa1\xfc\xbb\x94\x62\x3f\xb2\xae\xdf\x8d\x65\x98\xcd\ +\x9d\x22\x72\xba\xd6\xda\x5c\x1a\x5a\x8f\x54\x42\xa9\xd5\x6a\x47\ +\x9b\x55\xbe\x88\xb8\x87\x75\xc4\x82\x1d\x82\x20\x78\x66\xa3\xd1\ +\x78\xa0\xe0\xb0\x7d\x1b\x4e\x29\xb5\x0f\x22\xfe\xb8\xc2\x04\x7c\ +\x90\x99\x3f\x6e\x9b\x9f\x95\x50\xda\xdf\x22\x46\x20\x47\xdb\x06\ +\x2a\xc9\x7e\x0d\x33\x3f\xbf\xa4\xd8\x7d\x19\xd6\xec\x3b\x59\xb8\ +\x70\xe1\x6f\xaa\x3c\x79\x44\xfc\x26\x00\x9c\x1a\x45\xd1\x7d\x49\ +\xf3\x4c\x2c\x14\xb3\x78\xd1\x2c\x37\x41\xc4\x65\x49\xc1\xcb\xb6\ +\x13\x91\xf3\xb5\xd6\x27\x96\x9d\x47\xbf\xc5\x0f\xc3\xf0\x93\x16\ +\x1b\xef\x4a\xa1\x47\x44\xee\x45\xc4\xe3\x92\xee\x73\x49\x24\x94\ +\xf6\x0a\xdf\xeb\x00\x60\xdb\x52\x66\x95\x22\xa8\x88\xdc\xdf\x6a\ +\xb5\xf6\x5f\xbb\x76\xed\xfd\x29\xdc\xbd\x4b\x06\x06\xda\xdf\x2a\ +\xe6\xf2\xcb\x7a\x03\x5e\x86\xb0\x69\x5c\xff\x68\x5e\x7e\x27\x11\ +\x4b\x47\xa1\x38\x5a\x06\x9f\x66\x52\x56\x3e\xfe\x69\x97\x15\x5d\ +\xb9\x1b\x9b\xfb\xd8\x20\x08\x56\xe7\x0e\xec\x06\x70\xff\x4e\x62\ +\x99\x57\x28\xed\x35\x59\x89\xaf\xe3\xdc\xcc\x21\x15\xea\xa7\x98\ +\xf9\xe4\x54\x9e\xde\x29\x37\x06\x94\x52\xab\xbb\xe5\x7e\x56\x44\ +\x76\xd1\x5a\x3f\x36\xd7\xe4\xe7\x14\x4a\xfb\xeb\xd3\x5c\xb6\x6c\ +\x97\x1b\x73\xb3\x03\x99\x4b\xba\xcb\x44\xe4\x23\x79\xdc\xff\xf8\ +\x15\xc3\x8e\xab\x65\x09\x4f\x44\x57\x03\xc0\xab\x2d\xdd\xca\x30\ +\x9f\xf7\xc1\xcf\xac\x42\x59\xba\x74\xe9\xa2\xc5\x8b\x17\x5f\x05\ +\x00\x07\x3b\xca\xf8\x2e\x11\xb9\x2c\x8e\xe3\xaf\x8f\x8d\x8d\x3d\ +\x34\x15\x23\xeb\xf2\xec\xb2\x36\xf5\x38\xe2\xa8\x67\x60\xc3\x30\ +\x3c\x4e\x44\xfe\x35\xc3\x84\x4e\x0a\x82\xe0\xb2\x56\xab\x75\x24\ +\x22\x1e\x09\x00\x7b\x67\xc0\x9a\xcf\xf5\xc3\x73\x75\x7d\x99\x55\ +\x28\x44\xf4\x45\x00\x78\x7b\xce\xc9\x18\x41\x5c\x6e\xd6\xe1\x30\ +\xf3\x4f\xe6\xc2\x36\xfb\xe7\xcd\x4b\x4c\x11\x79\xba\x45\xfc\x3b\ +\x11\xf1\xa3\x51\x14\x7d\xdb\xc2\xc7\x9b\x16\xc8\x00\x11\x99\x45\ +\xb1\x66\xf5\x86\xcd\xb7\xcb\x35\x00\xf0\x89\xad\x3f\x2f\x4a\xa9\ +\xe5\x88\x78\xa8\x88\x18\xe1\xe4\xfa\x14\x16\x11\xff\x2e\x8a\xa2\ +\xaf\x6c\x4d\xcd\x0c\xa1\xd4\xeb\xf5\xd7\xc4\x71\x9c\xcb\xfa\x98\ +\x76\xb0\xab\x10\xf1\xca\x0d\x1b\x36\x5c\x75\xff\xfd\xf7\x6f\x4c\ +\x52\x9b\xe1\xe1\xe1\xa7\x0d\x0c\x0c\x18\xb1\x1c\x88\x88\xfb\xcd\ +\xe3\x73\x93\x88\x7c\x49\x6b\x6d\x04\xe8\x47\x17\x30\xd0\x16\x8c\ +\xd9\xd4\x75\x00\x00\xec\x3e\x4b\xca\x66\x8f\xc9\x5d\x00\x70\x11\ +\x33\x9b\x05\x8e\xf3\x8e\x30\x0c\xcd\x55\xcf\xa1\x71\x1c\xbf\x0e\ +\x11\x97\x74\xb2\x4f\xf0\x7b\x8e\xe3\x78\x65\xb3\xd9\xfc\xfd\x74\ +\xdb\x19\x42\x21\x22\xf3\x58\x6f\x9f\x04\x80\xf3\x9a\x20\xe2\xa5\ +\x71\x1c\x5f\x90\xb5\x6b\xc6\x5e\x7b\xed\xb5\xe3\xc4\xc4\xc4\xde\ +\xa6\x9b\x60\x1c\xc7\xbb\x22\xe2\x02\x44\xd4\x7f\xfe\xf3\x9f\x9b\ +\xfe\xd1\x6f\xd6\x2a\x95\xeb\x5f\xab\xd5\xf6\x0a\x82\x60\xc7\xa9\ +\x2c\xe2\x38\x5e\xdb\x6c\x36\x1f\x4e\x93\x95\xe9\x40\x19\xc7\xf1\ +\x2a\x00\x30\x3f\x03\x69\x30\xa6\x7c\x44\xe4\x0c\xad\xf5\xd9\x73\ +\x0a\x45\x29\x75\x0a\x22\x7e\x32\x4b\x10\xd3\x9e\x46\x44\x8c\x40\ +\xf2\xee\xac\x92\x31\x2d\xef\xde\x0f\x0c\x28\xa5\xcc\xfd\xcb\xaa\ +\xf6\xbd\x4c\xda\x29\x3f\xda\x6a\xb5\x56\x8e\x8d\x8d\xfd\x62\x0a\ +\x60\xf3\x37\x4a\xad\x56\x7b\x52\x10\x04\x9c\xb1\xbd\xcc\x11\xcc\ +\x9c\x47\xb3\xb3\xb4\x13\xf4\x7e\x9e\x81\x49\x06\x88\xe8\x08\x00\ +\xf8\x5a\x06\x3a\x2e\x64\xe6\xe3\x67\x08\x85\x88\x4c\x6b\x9f\xff\ +\xc8\x00\x7c\xac\xef\xff\x9b\x81\x3d\xef\x9a\x3b\x03\x61\x18\x9e\ +\x20\x22\x9f\x4f\x09\xfc\xfb\x38\x8e\x55\xb3\xd9\x9c\xdc\xff\xbf\ +\xf9\x1b\x85\x88\x4c\xf7\xf0\x97\xa6\x04\x5d\xc5\xcc\x9f\x4d\xe9\ +\xeb\xdd\x3c\x03\xce\x18\x50\x4a\x99\xf7\x73\x67\xa4\x09\x20\x22\ +\x27\x6a\xad\xcf\xdf\x2c\x94\x30\x0c\x5f\x2c\x22\x3f\x4a\x09\x36\ +\xe3\xc6\x27\x0d\x8e\xf7\xf1\x0c\xb8\x62\x20\x0c\xc3\x8b\x44\xe4\ +\xef\x53\xe0\xdf\xc6\xcc\xfb\x6e\x16\x8a\x52\xea\x3c\x44\x4c\xd3\ +\x7d\xef\xa7\xcc\xbc\x32\x45\x02\xde\xc5\x33\x50\x28\x03\x61\x18\ +\x9a\x97\xdc\x2b\x6c\x83\x8a\xc8\x01\xe6\xc1\xd4\xe4\xa5\x17\x11\ +\x99\x17\x80\x69\x3e\xf0\x6f\x65\xe6\x2f\xdb\x06\xf7\xf6\x9e\x81\ +\xa2\x19\xc8\x70\xbf\xf2\x59\x66\x5e\x85\xa6\xa5\xd0\xe2\xc5\x8b\ +\x9f\x48\x91\xb8\x39\x15\xe9\x65\x29\xfc\xbc\x8b\x67\xa0\x70\x06\ +\xea\xf5\xfa\x76\xad\x56\xeb\xae\x14\x6f\xf2\x1b\xcc\xbc\x1c\x95\ +\x52\x07\x21\xa2\x69\xa8\x6c\x35\x10\xf1\x75\x7e\xc9\x88\x15\x65\ +\xde\xb8\x64\x06\xc2\x30\x3c\x55\x44\x3e\x61\x9b\x06\x22\x0e\x63\ +\xca\xb3\x49\x7e\xc9\xcc\x4b\x6d\x03\x7a\x7b\xcf\x40\x99\x0c\xd4\ +\xeb\xf5\x5d\xe3\x38\x36\xcb\x63\x9e\x61\x93\x87\x88\x9c\x60\x84\ +\x92\x66\x01\xe4\xb7\x98\xd9\x1c\x12\xe3\x87\x67\xa0\xab\x18\x50\ +\x4a\x5d\x81\x88\x87\x59\x26\xfd\x2d\x23\x94\x34\xef\x4f\xe6\x5c\ +\x8e\x6c\x99\x80\x37\xf7\x0c\x14\xca\x00\x11\x9d\x03\x00\xb6\x9b\ +\xfa\xee\x30\xf7\x28\xeb\x6c\x6f\x70\x44\xe4\x15\x69\xfb\x23\x15\ +\xca\x8a\x0f\xe6\x19\xd8\x8a\x01\x22\xfa\x07\x00\xb8\xd0\x92\x98\ +\x75\xe6\x1b\xc5\xb4\x9f\x5c\x6c\xe3\xb8\x71\xe3\xc6\x27\xaf\x5f\ +\xbf\xfe\x77\x36\x3e\xde\xd6\x33\x50\x05\x06\xea\xf5\xfa\x81\x71\ +\x1c\xdb\x36\xf3\x7e\xc8\x08\x45\x6c\x27\xc0\xcc\x1d\x9b\x52\xd8\ +\x62\xf6\xba\x3d\x11\x99\x63\xa0\xcd\xf2\x6f\xf3\x33\x38\xf5\x2f\ +\x22\x0e\x88\xc8\xd4\xff\x9f\xfc\xdd\x56\xff\x6d\xf2\x77\x5b\xfd\ +\xb7\xd3\xd3\x34\x71\xeb\x75\x8e\x93\xcc\x2f\xe5\xf9\x2d\x7f\xf0\ +\x42\x49\xc2\x6e\x46\x9b\x94\x7f\xc5\xe6\x8b\xba\x81\x99\xcb\x38\ +\x42\x23\x23\x13\xd5\x70\x4f\xf3\xe5\xe0\x85\x52\x40\xed\x5c\x1c\ +\xfc\x29\x22\x47\x6b\xad\x2f\x2d\x20\xfd\x9e\x0b\xe1\x85\x52\xc1\ +\x92\xb6\xb7\x35\xff\xaf\x83\xd4\xd6\x31\xf3\x90\x03\xdc\x9e\x87\ +\xf4\x42\xa9\x60\x89\x33\x2c\x38\xed\x38\x1b\x44\x7c\x99\xcb\x53\ +\xa6\x3a\x26\xd0\xa5\x06\x5e\x28\x15\x2c\x5c\x9a\xa2\x24\x9d\x06\ +\x22\xfe\x20\x8a\xa2\x03\x93\xda\x7b\xbb\xbf\x30\x90\xa6\x26\xfe\ +\x1e\xc5\xe1\xa7\x47\x29\xf5\x0e\x44\xfc\x77\x87\x21\x40\x44\x94\ +\xd6\xba\xe9\x32\x46\xaf\x61\x7b\xa1\x54\xac\xa2\x69\x5e\xe6\xa6\ +\x98\xc2\x97\x99\xb9\xec\xa3\xe0\x52\xa4\x5d\x9e\x8b\x17\x4a\x79\ +\xdc\xcf\x88\x4c\x44\x7f\x03\x00\xb7\x15\x91\xd2\xe0\xe0\xe0\x4e\ +\xa3\xa3\xa3\x8f\x17\x11\xab\x17\x62\x78\xa1\x54\xa8\x8a\x44\xf4\ +\x2d\xd3\x98\xad\x88\x94\x10\xf1\x9c\x28\x8a\x4e\x2d\x22\x56\x2f\ +\xc4\xf0\x42\xa9\x48\x15\xdb\x4d\xfb\x7e\x5b\x64\x3a\x7e\xb5\x44\ +\x72\xb6\xbd\x50\x92\x73\xe5\xd4\x92\x88\x3e\x0a\x00\x1f\x74\x1a\ +\x64\x26\xf8\xfb\x98\xf9\x73\x05\xc7\xec\xca\x70\x5e\x28\x15\x29\ +\x5b\x9a\x85\xa6\x39\xa4\xfe\x30\x33\x3f\x2d\x07\x9c\x9e\x87\xf0\ +\x42\xa9\x40\x89\xc3\x30\x7c\x8b\x88\x94\xd2\x70\x23\x08\x82\xc3\ +\x1b\x8d\x86\x39\xc8\xd3\x8f\x79\x18\xf0\x42\xa9\xc0\xc7\x83\x88\ +\x46\x01\x60\x79\x49\xa9\xdc\xc5\xcc\x23\x25\xc5\xee\x9a\xb0\x5e\ +\x28\x25\x97\xaa\x56\xab\xad\x08\x82\xc0\xec\xc9\x2e\x73\xec\x33\ +\xdf\xf9\x33\x65\x26\x56\x95\xd8\x5e\x28\x25\x57\x22\x0c\xc3\xcb\ +\x45\xe4\xcd\x25\xa7\x71\x2d\x33\xdb\x1c\xd6\x53\x72\xba\xc5\x87\ +\xf7\x42\x29\x9e\xf3\xcd\x11\xdb\xc7\xf9\x25\x3a\x28\xc9\x75\x9a\ +\x83\x83\x83\x7b\x8e\x8e\x8e\xfa\x63\xc3\xe7\x20\xda\x0b\xc5\xf5\ +\x27\x70\x1e\x7c\xa5\xd4\xe9\x88\x78\x56\x89\x29\x4c\x0f\xfd\x6f\ +\xcc\xfc\xae\x8a\xe4\x52\xb9\x34\xbc\x50\x4a\x2c\x09\x11\x3d\x0a\ +\x00\x3b\x97\x98\xc2\x16\xa1\x1f\x7f\xfc\xf1\x6d\x1f\x78\xe0\x01\ +\xd3\x0f\xc1\x8f\xad\x18\xf0\x42\x29\xe9\x23\x41\x44\xa6\xc7\xd9\ +\x95\x25\x85\x9f\x35\x2c\x22\x7e\x28\x8a\xa2\x8f\x54\x29\xa7\xaa\ +\xe4\xe2\x85\x52\x52\x25\x88\xe8\x76\x00\x78\x51\x49\xe1\xe7\x0a\ +\xbb\x91\x99\xb7\xa9\x58\x4e\x95\x48\xc7\x0b\xa5\x84\x32\x84\x61\ +\x38\x24\x22\x63\x25\x84\xee\x18\xd2\x9c\x09\xa2\xb5\xce\x72\x8a\ +\x5a\xc7\x18\xdd\x68\xe0\x85\x52\x42\xd5\x52\xb6\xa4\x2d\x2a\xd3\ +\xfb\x98\xf9\xd9\x45\x05\xeb\x96\x38\x5e\x28\x25\x54\x2a\x0d\xe9\ +\x45\xa6\x89\x88\xaf\x8a\xa2\xe8\xfa\x22\x63\x56\x3d\x56\x9a\x9a\ +\xf9\xad\xc0\x19\xaa\x4a\x44\xff\x08\x00\x9f\xca\x00\xe1\xdc\x15\ +\x11\x6f\x8d\xa2\xe8\xc5\xce\x03\x75\x51\x00\x2f\x94\x82\x8b\x45\ +\x44\xbf\x02\x80\xdd\x0b\x0e\x6b\x1d\x2e\x8e\xe3\x15\xcd\x66\xd3\ +\xac\x41\xf3\xc3\x37\x97\x28\xf6\x33\x10\x86\xe1\x2b\x45\xa4\x5b\ +\x2e\x69\xbe\xce\xcc\x6f\x2a\x96\xa1\xea\x46\xf3\xdf\x28\x05\xd6\ +\x86\x88\x7e\x00\x00\xfb\x17\x18\x32\x53\xa8\x56\xab\xf5\xf4\xb1\ +\xb1\xb1\x87\x32\x81\xf4\x88\xb3\x17\x4a\x41\x85\x1c\x1e\x1e\x7e\ +\xd6\xc0\xc0\x40\x57\xad\xa5\x12\x91\xf3\xb5\xd6\x27\x16\x44\x51\ +\xa5\xc3\x78\xa1\x14\x54\x9e\x30\x0c\xbf\x20\x22\xc7\x17\x14\x2e\ +\xb7\x30\xcc\x6c\xba\xe5\xc7\xb9\x01\x76\x29\x90\x17\x4a\x41\x85\ +\x23\x22\xf3\x61\xcb\xfd\xe8\x0b\x44\xfc\x66\x1c\xc7\xe3\x88\x78\ +\xa4\xa3\xa9\x9c\xcc\xcc\x95\x7e\x4a\xe7\x68\xde\x5b\xc0\x7a\xa1\ +\x14\xc0\xb2\x52\xea\xdd\x88\x78\x81\xa3\x50\x2f\x47\xc4\x71\x11\ +\x31\x67\xa9\xb8\x18\x8f\x31\xf3\x2e\x2e\x80\xbb\x09\xd3\x0b\xa5\ +\x80\x6a\x11\xd1\xbd\x00\xf0\x1c\x07\xa1\x46\x99\x79\x85\xc1\x55\ +\x4a\xdd\x8c\x88\x4e\x7a\x0a\x8b\xc8\x91\x5a\xeb\xaf\x3a\xc8\xbf\ +\x6b\x20\xbd\x50\x1c\x97\x8a\x88\x5e\x02\x00\x3f\x74\x14\xe6\xdd\ +\xcc\xfc\x2f\x06\x9b\x88\xde\x08\x00\x5f\x77\x14\x27\x62\xe6\xba\ +\x23\xec\xae\x80\xf5\x42\x71\x5c\x26\x22\xba\x0e\x00\x0e\x76\x10\ +\xe6\xf7\xcc\xbc\x23\x00\xb4\xa6\xb0\x89\x28\x32\x9a\x71\x10\xcb\ +\x34\xf6\x3e\x40\x6b\xed\x4a\xf0\x2e\x52\xce\x15\xd3\x0b\x25\x57\ +\x3a\xb7\x04\xab\xd7\xeb\xbb\xc6\x71\xfc\x88\x8b\x10\x22\x72\x9e\ +\xd6\xda\x2c\x87\xd9\x3c\x88\xe8\x3d\x00\xe0\xaa\xa1\xdd\x4d\xcc\ +\xfc\x0a\x17\x73\xe9\x06\x4c\x2f\x14\x87\x55\x22\xa2\x73\x01\xe0\ +\x24\x17\x21\x82\x20\x18\x6a\x34\x1a\xeb\xa6\x63\x8f\x8c\x8c\x2c\ +\xd8\xb4\x69\xd3\x83\x00\xf0\x14\x17\x31\x01\xa0\xc6\xcc\x95\xdc\ +\x1e\xe0\x68\xbe\xd3\xff\x08\x59\x1f\xf0\xeb\x17\x45\x26\xac\x0a\ +\x11\xfd\x1e\x00\xb6\x4b\x68\x9e\xd8\x0c\x11\xaf\x8e\xa2\xe8\xb5\ +\xb3\x39\x10\xd1\xd9\x00\x70\x5a\x62\x30\x3b\xc3\xd5\xcc\xfc\x76\ +\x3b\x97\xde\xb0\xf6\xdf\x28\x8e\xea\x18\x86\xe1\x31\x22\x72\xb1\ +\x23\xf8\x43\x98\xd9\xdc\xfb\xcc\x18\x29\x8f\x7a\x4e\x9c\xa6\x88\ +\xec\xa2\xb5\x7e\x2c\xb1\x43\x8f\x18\x7a\xa1\x38\x2a\xa4\xc3\xee\ +\x8f\x4d\x66\x56\xf3\xa5\x4d\x44\xe6\xc4\xae\x77\xb8\x98\x1a\x22\ +\x9e\x1d\x45\xd1\x19\x2e\xb0\xab\x8c\xe9\x85\xe2\xa0\x3a\xf5\x7a\ +\xfd\x45\x71\x1c\x9b\x3d\xf1\x2e\xc6\x2a\x66\xfe\x6c\x07\xa1\x3c\ +\x1f\x00\xee\x70\x11\x1c\x11\x5b\x51\x14\x0d\xba\xc0\xae\x32\xa6\ +\x17\x8a\x83\xea\x84\x61\x78\x85\x88\x1c\xe6\x00\x7a\x7c\xfb\xed\ +\xb7\xdf\xf1\xf6\xdb\x6f\xef\xd8\x52\x88\x88\xae\x06\x00\x57\xdd\ +\x1f\x37\xbf\xbf\x71\x30\xc7\x4a\x42\x7a\xa1\xe4\x5c\x96\xa5\x4b\ +\x97\xee\xb0\x78\xf1\xe2\x27\x72\x86\x9d\x84\x13\x91\x2f\x68\xad\ +\xcd\x23\xe0\x8e\x83\x88\x0e\x01\x80\x6b\x3a\x1a\xa6\x33\xf8\x15\ +\x33\xff\x55\x3a\xd7\xee\xf4\xf2\x42\xc9\xb9\x6e\x4a\xa9\xb3\x10\ +\xf1\xf4\x9c\x61\x27\xe1\x10\xb1\x1e\x45\x91\x79\xa9\x98\x68\x10\ +\xd1\xcf\x00\xe0\x05\x89\x8c\xed\x8d\x5e\xcf\xcc\xe6\x28\xbd\xbe\ +\x18\x5e\x28\x39\x97\x59\x29\xf5\x1b\x44\x5c\x92\x33\xac\x11\xc9\ +\x8d\x51\x14\xbd\xd2\x06\x97\x88\x8e\x05\x00\x27\xad\x87\x44\xe4\ +\x67\x5a\xeb\xaa\xf5\x25\xb3\xa1\xc7\xca\xd6\x0b\xc5\x8a\xae\xf9\ +\x8d\x95\x52\x6f\x46\xc4\xcb\x73\x84\x9c\x0e\xf5\x06\x66\xbe\xca\ +\x16\x9b\x88\xcc\x66\xb1\x67\xd9\xfa\x25\xb1\x47\xc4\xbf\x89\xa2\ +\xc8\xd5\x43\x8b\x24\x29\x14\x66\xe3\x85\x92\x23\xd5\x44\xf4\x13\ +\x00\x58\x99\x23\xe4\x14\xd4\x7a\x66\x4e\xb5\xfa\x98\x88\xcc\xb9\ +\x90\xe6\x7c\x48\x17\xe3\x2a\x66\x7e\x83\x0b\xe0\xaa\x61\x7a\xa1\ +\xe4\x54\x11\xa5\xd4\x72\x44\x74\xd2\xb5\x44\x44\x4e\xd5\x5a\x9f\ +\x93\x26\xd5\xf6\xc3\x05\xb3\xde\x6c\x71\x1a\xff\x4e\x3e\x88\xf8\ +\xec\x28\x8a\xee\xeb\x64\xd7\xed\xbf\xf7\x42\xc9\xa9\x82\x44\x74\ +\x29\x00\xbc\x2d\x27\xb8\xe9\x30\x32\x38\x38\xb8\xf3\xe8\xe8\xe8\ +\xe3\x69\xb1\x89\xc8\xbc\x77\x79\x6f\x5a\xff\xf9\xfc\x6c\x9e\xc4\ +\xb9\x88\x5f\x14\xa6\x17\x4a\x0e\x4c\xb7\x17\x23\x8e\xe7\x00\x35\ +\x03\x42\x44\x2e\xd2\x5a\x1f\x97\x05\x7b\xf9\xf2\xe5\xcb\x5a\xad\ +\xd6\x16\x0b\x28\xb3\xe0\x6d\xed\xbb\x68\xd1\xa2\xed\xd6\xac\x59\ +\xf3\xc7\x3c\x31\xab\x86\xe5\x85\x92\x43\x45\x1c\xdf\x07\xec\xcd\ +\xcc\x77\x66\x4d\x93\x88\xcc\xa6\x2e\xb3\xb9\xcb\xc5\xf8\x20\x33\ +\x7f\xdc\x05\x70\x55\x30\xbd\x50\x72\xa8\x04\x11\xfd\x37\x00\xe4\ +\xfe\x02\x0e\x11\x7f\x10\x45\x51\x2e\xdb\x7b\xc3\x30\x7c\xb1\x88\ +\xfc\x28\x87\xe9\xce\x06\xb1\x81\x99\x77\x70\x84\x5d\x09\x58\x2f\ +\x94\x8c\x65\x08\xc3\xf0\x50\x11\x71\xf2\xe2\xcd\x1c\x82\xaa\xb5\ +\xfe\x5a\xc6\x14\x37\xbb\x13\x91\x69\x40\xf1\xb7\x79\xe1\x4d\xc7\ +\x41\xc4\xb7\x47\x51\xb4\xda\x05\x76\x15\x30\xbd\x50\x32\x56\xc1\ +\x61\x53\x87\xff\x66\xe6\x3d\x32\xa6\xb7\x85\xbb\xe3\x7d\xf5\xeb\ +\x98\x79\x28\xcf\x7c\xab\x84\xe5\x85\x92\xa1\x1a\x43\x43\x43\xcb\ +\x06\x07\x07\x9d\xdc\x24\x8b\xc8\x19\x5a\x6b\xb3\x09\x2b\xd7\x41\ +\x44\x66\x87\xa2\x93\x0f\x34\x22\x1e\x1c\x45\xd1\x0d\xb9\x26\x5c\ +\x11\x30\x2f\x94\x0c\x85\x20\xa2\x7f\x05\x80\x4c\x4f\xa4\xe6\x0a\ +\x1f\x04\xc1\x6e\x8d\x46\xe3\xd7\x19\xd2\x9b\xd5\x95\x88\xcc\x63\ +\xe2\x79\x97\xe9\xa7\x8d\x99\xe7\x3d\x55\xda\x1c\x5c\xf9\x79\xa1\ +\x64\x60\x96\x88\x26\x00\xc0\xb4\x1c\xcd\x75\x88\xc8\x25\x5a\xeb\ +\x63\x72\x05\x9d\x06\x46\x44\x66\x87\xe2\x4e\x2e\xf0\x83\x20\x18\ +\x69\x34\x1a\x77\xb9\xc0\x2e\x13\xd3\x0b\x25\x25\xfb\x4a\xa9\xf7\ +\x23\xe2\x79\x29\xdd\x3b\xb9\xed\xc3\xcc\x66\x39\x8c\x93\x41\x44\ +\x66\x49\x8b\x59\xda\xe2\x62\x7c\x99\x99\xdf\xea\x02\xb8\x4c\x4c\ +\x2f\x94\x94\xec\x3b\xbc\xd6\xff\x31\x33\xef\x97\x32\xad\x44\x6e\ +\xb5\x5a\xed\xa9\x41\x10\x38\x3b\xce\x61\x60\x60\x60\xf7\x7b\xee\ +\xb9\xc7\x74\x83\xe9\x99\xe1\x85\x92\xa2\x94\x4a\xa9\x83\xcc\xb2\ +\xf7\x14\xae\x1d\x5d\x44\xe4\x28\xad\xf5\x97\x3a\x1a\x66\x34\x70\ +\x79\xe0\x2a\x22\x9e\x13\x45\xd1\xa9\x19\x53\xac\x94\xbb\x17\x4a\ +\x8a\x72\x38\xdc\x66\xfb\x10\x33\x3f\x3d\x45\x4a\xd6\x2e\xb5\x5a\ +\x6d\xaf\x20\x08\xee\xb6\x76\x4c\xe8\xc0\xcc\x66\x5f\xfd\xe6\x2e\ +\x96\x09\xdd\x2a\x6b\xe6\x85\x62\x59\x1a\x97\xed\x80\x44\xe4\x23\ +\x5a\xeb\x0f\x59\xa6\x94\xda\xdc\x61\xbb\x57\xb3\x6d\xf9\x44\xad\ +\xf5\xf9\xa9\x93\xab\x98\xa3\x17\x8a\x65\x41\x94\x52\xe7\x21\xe2\ +\xfb\x2d\xdd\x12\x99\x07\x41\xf0\xcc\x46\xa3\xf1\x40\x22\xe3\x1c\ +\x8c\x5c\x5e\x42\x02\xc0\xc3\xcc\xfc\xb4\x1c\xd2\xac\x04\x84\x17\ +\x8a\x65\x19\x88\xe8\x77\x00\xb0\xbd\xa5\x5b\x47\x73\x11\xb9\x5c\ +\x6b\xfd\x96\x8e\x86\x39\x1b\x10\xd1\x1a\x00\x78\x5e\xce\xb0\x93\ +\x70\x22\xf2\x16\xad\xb5\xab\x1d\x9f\x2e\x52\x9e\x13\xd3\x0b\xc5\ +\x82\x6e\x22\x7a\x17\x00\x4c\x1e\xb3\xe0\x60\xec\xcf\xcc\xae\x0e\ +\x03\x9a\x33\x5d\xa5\xd4\x51\x88\x78\x89\x83\xf9\x18\xc8\xbb\x98\ +\x79\xc4\x11\x76\xa1\xb0\x5e\x28\x16\x74\xbb\xfa\xeb\x8b\x88\x3f\ +\x8b\xa2\xa8\xb4\x46\x0d\x44\x64\x2e\xf7\x9e\x61\x41\x45\x62\x53\ +\x11\x39\x50\x6b\x6d\x4e\x43\xee\xea\xe1\x85\x92\xb0\x7c\x8e\x97\ +\xa9\xbf\x83\x99\xbf\x98\x30\x95\xdc\xcd\xc2\x30\x3c\x55\x44\x3e\ +\x91\x3b\xf0\x5f\x00\xaf\x65\x66\x57\x8d\xf8\x1c\xa5\x3c\x13\xd6\ +\x0b\x25\x21\xd5\x0e\x37\x3e\x3d\xca\xcc\xb9\xb7\x37\x4a\x38\xad\ +\x49\xb3\x91\x91\x91\x6d\x37\x6d\xda\x64\xee\xbd\x72\x5f\x8e\x63\ +\xf0\xe3\x38\xa6\x66\xb3\xa9\x6d\x72\xaa\x9a\xad\x17\x4a\x82\x8a\ +\x2c\x5b\xb6\x6c\xc9\xc2\x85\x0b\x7f\x93\xc0\xd4\xda\xc4\xfc\x25\ +\xd7\x5a\x7f\xc0\xda\x31\x67\x87\x30\x0c\xcf\x17\x91\x55\x39\xc3\ +\x4e\xc2\xe5\xb1\x9d\xd9\x45\x5e\x36\x98\x5e\x28\x09\xd8\x72\x7c\ +\xe6\xc8\xfe\x09\x52\x28\xca\xc4\xd9\xd1\x73\x13\x13\x13\x4b\xd6\ +\xae\x5d\xfb\x68\x51\x13\xc9\x3b\x8e\x17\x4a\x02\x46\x89\xe8\x61\ +\x00\xd8\x2d\x81\xa9\x37\x99\x83\x81\xa2\x5f\xa6\xe6\x5d\x08\x2f\ +\x94\x0e\x8c\x3a\x7e\x7c\x9a\x77\x3d\xab\x8c\xb7\x91\x99\xb7\xa9\ +\x72\x82\xf3\xe5\xe6\x85\xd2\xa1\x72\x44\x74\x2b\x00\xec\xdb\xad\ +\x05\xae\x52\xde\x22\x72\xbc\xd6\xfa\xc2\x2a\xe5\x94\x34\x17\x2f\ +\x94\x79\x98\x52\x4a\xed\x8d\x88\x3f\x4f\x4a\xa6\xb7\xeb\xc8\xc0\ +\x7d\xcc\xfc\xec\x8e\x56\x15\x34\xf0\x42\x99\x5f\x28\xab\x11\xf1\ +\xe8\x0a\xd6\xad\x9b\x53\x4a\xd5\x6c\xbc\xec\x09\x7b\xa1\xcc\x51\ +\x81\x7a\xbd\xbe\x5d\x1c\xc7\xe6\x54\x5f\x3f\x72\x64\x00\x11\x6f\ +\x8d\xa2\xe8\xc5\x39\x42\x16\x02\xe5\x85\x32\x07\xcd\x8e\xbb\x3f\ +\x16\x52\xdc\xaa\x06\x11\x91\x7d\xb5\xd6\xb7\x55\x35\xbf\xd9\xf2\ +\xf2\x42\x99\x5b\x28\xa6\x43\xfb\x9e\xdd\x54\xcc\x2e\xca\xf5\x1b\ +\xcc\x7c\x44\x17\xe5\x0b\x5e\x28\xb3\x54\xcb\x71\xa3\xb8\x6e\xfa\ +\x7c\xb8\xcc\x75\x29\x33\xff\xd2\x65\x80\x3c\xb1\xbd\x50\x66\x17\ +\xca\x77\x01\xe0\x65\x79\x12\xed\xb1\x66\x30\xf0\x39\x66\x7e\x5f\ +\xb7\xf0\xe2\x85\xb2\x55\xa5\xea\xf5\x3a\xc5\x71\x9c\xf8\x40\xd1\ +\x6e\x29\x74\x15\xf3\x8c\xe3\x78\xfb\x66\xb3\xd9\x15\x0f\x4c\xbc\ +\x50\xb6\xfa\x04\x11\xd1\x05\x00\xf0\xee\x2a\x7e\xb0\x7a\x30\xa7\ +\xd3\x98\xf9\x63\xdd\x30\x2f\x2f\x94\x2d\xab\x14\x10\xd1\x9f\x00\ +\x60\x61\x37\x14\xaf\x07\x72\x7c\x8c\x99\x77\xe9\x86\x79\x78\xa1\ +\x4c\xab\x92\x52\x6a\x15\x22\xf6\x4c\xe7\x90\x6e\xf8\x00\x02\xc0\ +\xb1\xcc\x7c\x71\xd5\x73\xf5\x42\x99\x56\xa1\x30\x0c\x59\x44\x54\ +\xd5\x8b\xd6\x63\xf9\x45\xcc\x5c\xaf\xfa\x9c\xbc\x50\xda\x15\x22\ +\xa2\x43\x00\xe0\x9a\xaa\x17\xac\x47\xf3\x3b\x84\x99\xaf\xab\xf2\ +\xdc\xbc\x50\xda\xd5\x51\x4a\x7d\x1b\x11\x5f\x5b\xe5\x62\xf5\x70\ +\x6e\xdf\x65\xe6\x83\xaa\x3c\x3f\x2f\x14\x00\xf3\xd6\xd5\xac\x68\ +\x5d\x5f\xe5\x42\xf5\x41\x6e\xb9\x1c\xea\xea\x8a\x27\x2f\x94\xbf\ +\x08\xe5\x5c\x00\x38\xc9\x15\xc9\x1e\x37\x11\x03\x5f\x62\xe6\xa3\ +\x12\x59\x96\x60\xe4\x85\xf2\x17\xa1\xfc\x16\x00\x76\x2c\x81\x7f\ +\x1f\x72\x1a\x03\x45\xb7\x94\xb5\x21\xbf\xef\x85\x12\x86\xe1\x71\ +\x22\x62\x8e\x98\x73\x31\x0a\xef\xfc\xe8\x62\x12\x5b\x61\xfe\xb5\ +\x8b\xa3\xc2\xdb\x31\xce\x65\xe6\x53\x0a\x98\x83\x75\x88\xbe\x17\ +\x0a\x11\xdd\x01\x00\xcf\xb7\x66\xae\xb3\xc3\x38\x33\x2f\xea\x6c\ +\xd6\x5d\x16\x2e\xdb\xca\x22\x62\x6b\xe1\xc2\x85\xdb\xac\x59\xb3\ +\xe6\xcf\x55\x63\xa5\xaf\x85\xa2\x94\x3a\x00\x11\xbf\xef\xa8\x28\ +\x1f\x63\xe6\xd3\x1c\x61\x97\x0a\x4b\x44\xe6\xdc\x93\xc0\x51\x12\ +\x27\x31\xf3\xa7\x1d\x61\xa7\x86\xed\x6b\xa1\x84\x61\x78\xb9\x88\ +\xbc\x39\x35\x7b\xf3\x38\x22\xe2\xce\x51\x14\x99\x7b\x9f\x9e\x1b\ +\x8e\xfb\x9c\xfd\x8a\x99\xff\xaa\x6a\xa4\xf5\xad\x50\x96\x2f\x5f\ +\xfe\x8c\x56\xab\xe5\xea\x2c\x92\xeb\x98\xd9\xbc\xc0\xec\xc9\x51\ +\xab\xd5\x9e\x14\x04\xc1\x06\x57\x93\x43\xc4\xbf\x8b\xa2\xe8\x2b\ +\xae\xf0\xd3\xe0\xf6\xad\x50\x94\x52\x67\x22\xe2\x3f\xa7\x21\x2d\ +\x81\x4f\x29\x47\x38\x24\xc8\x2b\x37\x93\x30\x0c\x2f\x31\xe7\x4d\ +\xe6\x06\xb8\x25\xd0\xcf\x99\xf9\x85\x8e\xb0\x53\xc1\xf6\xad\x50\ +\xc2\x30\x7c\x50\x44\x5c\x9c\x97\x58\xc9\x4b\x87\x54\x9f\x8e\x79\ +\x9c\xc2\x30\x1c\x12\x91\xb1\xbc\x71\xa7\xf0\x10\xf1\x65\x51\x14\ +\xdd\xec\x0a\xdf\x16\xb7\x2f\x85\x42\x44\xe6\x1c\x74\x57\x27\xef\ +\xbe\x8f\x99\x3f\x67\x5b\x88\x6e\xb4\x57\x4a\xdd\x8c\x88\x07\x3a\ +\xca\xfd\x1a\x66\x7e\x8d\x23\x6c\x6b\xd8\x7e\x15\xca\x8f\x00\xc0\ +\x49\xcb\x1c\x66\x46\xeb\x2a\x74\xa9\x43\x18\x86\x2f\x15\x91\xef\ +\xb9\x4a\x3f\x08\x82\xb0\xd1\x68\xb0\x2b\x7c\x1b\xdc\xbe\x13\x4a\ +\xbd\x5e\x7f\x51\x1c\xc7\xb7\xdb\x90\x64\x61\xfb\x45\x66\x7e\x87\ +\x85\x7d\xd7\x9b\x12\xd1\x5a\x00\x78\xae\x8b\x89\x20\xe2\xbf\x47\ +\x51\xf4\x4e\x17\xd8\xb6\x98\x7d\x27\x14\x22\xfa\x0f\xb3\x59\xc8\ +\x96\xa8\x84\xf6\x35\x66\x76\x76\xdd\x9e\x30\x87\x42\xcd\xc2\x30\ +\x3c\x5a\x44\x56\xbb\x0a\xba\x60\xc1\x82\x5d\xef\xbe\xfb\x6e\x27\ +\x67\xd3\xd8\xe4\xdc\x57\x42\x51\x4a\xed\x8c\x88\xae\xce\xe8\xb8\ +\x93\x99\xf7\xb6\x21\xbf\x57\x6c\x89\xc8\x34\x88\xd8\xce\xc5\x7c\ +\x10\xf1\xec\x28\x8a\xce\x70\x81\x6d\x83\xd9\x57\x42\x09\xc3\xf0\ +\x9f\x44\xe4\xe3\x36\x04\x59\xd8\xbe\x89\x99\xbf\x6e\x61\xdf\x33\ +\xa6\x4a\xa9\xd3\x11\xf1\x2c\x47\x13\xda\xc0\xcc\x3b\x38\xc2\x4e\ +\x0c\xdb\x57\x42\x21\x22\xb3\xe7\xc4\x45\x37\xf5\x9e\x5c\xd7\x95\ +\xf4\x53\x74\xf8\xe1\x87\x0f\x8c\x8d\x8d\x4d\x24\xb5\xb7\xb5\x13\ +\x91\x13\xb4\xd6\xa6\x3b\x4e\x69\xa3\x6f\x84\xa2\x94\x7a\x03\x22\ +\x7e\xd3\x11\xd3\x3d\xbb\xae\x2b\x29\x5f\x44\x64\x56\x60\x1f\x97\ +\xd4\xde\xc6\x4e\x44\xee\xd5\x5a\x3b\x79\x60\x90\x34\x8f\xbe\x11\ +\x4a\x18\x86\x37\x88\xc8\x2b\x92\x12\x63\x63\xd7\xcb\xeb\xba\x92\ +\xf2\x30\x34\x34\xb4\xc7\xe0\xe0\xe0\x7f\x25\xb5\xb7\xb5\x13\x91\ +\xc3\xb5\xd6\xae\xfe\xd0\x75\x4c\xa7\x2f\x84\x42\x44\xa6\xcb\xc7\ +\x3d\x1d\xd9\x48\x67\xd0\xd3\xeb\xba\x6c\x28\x21\xa2\x6b\x01\xe0\ +\x55\x36\x3e\x49\x6d\x45\xe4\x56\xad\xb5\x93\x77\x5f\x49\x72\xe8\ +\x17\xa1\x98\x37\xe5\xef\x49\x42\x48\x0a\x9b\x9e\x5f\xd7\x95\x94\ +\x93\x5a\xad\xb6\x6f\x10\x04\xe6\x28\x3f\x27\x23\x8e\xe3\xfd\x9a\ +\xcd\xe6\x8f\x9d\x80\x77\x00\xed\x79\xa1\xec\xbe\xfb\xee\xdb\xec\ +\xb4\xd3\x4e\x8f\x8a\x88\x8b\x83\x36\xfb\x62\x5d\x97\xcd\x07\x93\ +\x88\x46\x01\x60\xb9\x8d\x8f\x85\xed\x15\xcc\xfc\x46\x0b\xfb\xdc\ +\x4c\x7b\x5e\x28\x44\xf4\x5e\x00\xf8\x6c\x6e\x8c\x6d\x09\xd4\x37\ +\xeb\xba\x92\xf2\xa7\x94\x7a\x13\x22\x7e\x35\xa9\xbd\xad\x5d\xab\ +\xd5\x5a\x36\x36\x36\xf6\x0b\x5b\xbf\xac\xf6\xfd\x20\x94\x06\x00\ +\x84\x59\x89\x9a\xcd\xbf\x9f\xd6\x75\xd9\xf0\x47\x44\xff\x07\x00\ +\x4e\x7a\x0a\x8b\xc8\x17\xb4\xd6\xae\x2e\xa3\xe7\x9c\x66\x4f\x0b\ +\x25\x0c\xc3\x57\x8a\xc8\xf5\x36\x45\xb6\xb0\xed\xbb\x75\x5d\x49\ +\xb9\x21\x22\xd3\xfa\xc9\xb4\x80\x72\x32\x36\x6e\xdc\xf8\xe4\xf5\ +\xeb\xd7\xff\xce\x09\xf8\x1c\xa0\x3d\x2d\x14\x22\xba\x12\x00\x5e\ +\xef\x88\xd0\xbe\x5b\xd7\x65\xc3\x63\x9a\x0f\x96\x05\xfe\xe9\xcc\ +\xfc\x51\x0b\xfb\xcc\xa6\x69\xe6\x83\x69\x9c\x8a\xbe\x4c\x19\x1e\ +\x1e\x7e\xce\xc0\xc0\xc0\xbd\x99\x19\x9a\x1d\xa0\x6f\xd7\x75\x25\ +\xe5\x93\x88\x3e\x03\x00\xae\x4e\xd4\xfa\x35\x33\xef\x96\x34\x97\ +\x3c\xec\xd2\x7c\xe6\xbb\x42\x28\x61\x18\x7e\x52\x44\x4e\x06\x00\ +\xd3\x31\xc4\xea\xc7\xb4\xcd\x11\x91\xd6\xd4\xbf\x00\x10\x4f\xc3\ +\x30\xff\xfb\xc2\x7e\x5d\xd7\x95\xf4\x43\x47\x44\xe6\x83\xfc\xb5\ +\xa4\xf6\xb6\x76\x22\xf2\x15\xad\xb5\x59\x09\x5e\xc8\xe8\x59\xa1\ +\x14\xc2\x9e\x0f\xd2\x37\x0c\x78\xa1\xf4\x4d\xa9\xfd\x44\xb3\x30\ +\xe0\x85\x92\x85\x3d\xef\xdb\x17\x0c\xac\x5c\xb9\x72\x9b\x0d\x1b\ +\x36\xfc\xd1\x72\xb2\x13\x5d\x71\x8f\x62\x39\x29\x6f\xee\x19\x98\ +\x93\x01\xa5\xd4\x72\x44\x34\x2b\x0e\x6c\xc6\x63\x46\x28\x0f\x03\ +\x80\xd5\x53\x07\x44\x1c\x8e\xa2\xc8\xec\xaf\xf6\xc3\x33\xd0\x55\ +\x0c\x28\xa5\x0e\x43\xc4\x2b\x6c\x92\x16\x91\xfb\x8d\x50\x7e\x0e\ +\x00\x56\xdb\x5e\x4d\xb3\x34\xad\xb5\xab\x16\x41\x36\x73\xf0\xb6\ +\x9e\x01\x2b\x06\x88\xe8\x03\x00\x60\x7b\xcc\x77\xc3\x08\xc5\xec\ +\x0b\x78\x83\x4d\x34\x11\xb9\x40\x6b\x7d\x82\x8d\x8f\xb7\xf5\x0c\ +\x54\x81\x01\xa5\xd4\x6a\x44\x3c\xda\x32\x97\x1f\x63\x18\x86\xe7\ +\x89\xc8\xfb\x2d\x1d\x2b\xd7\x26\xd3\x32\x7f\x6f\xde\xa7\x0c\xa4\ +\x39\x1a\x44\x44\x3e\x81\x69\x57\x88\x8a\xc8\x0b\xb4\xd6\xe6\x3c\ +\x12\x3f\x3c\x03\x5d\xc1\x80\x52\xea\x28\x44\xbc\xc4\x36\x59\x11\ +\x39\x00\x87\x86\x86\x76\x19\x1c\x1c\x34\x2b\x44\xad\x06\x22\x5e\ +\x1a\x45\x91\xed\x57\x98\x55\x0c\x6f\xec\x19\xc8\x93\x01\x22\x4a\ +\xd3\x55\xf4\x89\x38\x8e\x77\x9d\x6c\x19\x9a\x76\x0f\xba\x51\x9a\ +\xd6\xfa\x87\x79\x4e\xc6\x63\x79\x06\x5c\x30\x50\xaf\xd7\x0f\x8b\ +\xe3\xd8\xea\x69\x57\x3b\x8f\x2b\x99\xf9\xb0\x49\xa1\x28\xa5\x4e\ +\x41\xc4\x4f\xa6\x48\x70\x12\x24\x85\x9f\x77\xf1\x0c\x14\xca\x80\ +\x52\xea\x7a\x44\x7c\xa5\x6d\x50\x11\x39\x5e\x6b\x7d\xe1\xa4\x50\ +\x88\xc8\x9c\x7b\x98\xea\x7e\xa3\xec\x8e\x1a\xb6\x13\xf7\xf6\xfd\ +\xc7\x00\x11\x99\x05\xb5\xe7\xa4\x98\xf9\x43\x13\x13\x13\xe1\xda\ +\xb5\x6b\x1f\xdd\xdc\xad\x9d\x88\xbe\x01\x00\x87\xa7\x00\xfb\x93\ +\x88\xbc\x5e\x6b\x7d\x63\x0a\x5f\xef\xe2\x19\x70\xca\x40\x96\x7e\ +\xca\x88\xf8\x99\x28\x8a\x26\x9f\x08\x6f\x16\x4a\xbd\x5e\x7f\x4d\ +\x1c\xc7\xdf\x49\x93\xb5\x88\x98\x87\x01\x87\x6a\xad\x6f\x4b\xe3\ +\xef\x7d\x3c\x03\x2e\x18\x50\x4a\x1d\x14\x04\xc1\x75\x22\x32\x90\ +\x06\x3f\x08\x82\x95\x8d\x46\xe3\xa7\x5b\x08\xa5\x7d\x09\x66\xda\ +\xc7\xec\x93\x06\xd4\xbc\xe6\x0f\x82\xe0\x35\x51\x14\x45\x69\xfc\ +\xbd\x8f\x67\x20\x4f\x06\xda\x6b\xba\x6e\xb2\x5d\x9e\x35\x2d\x87\ +\x2d\x0e\x3f\xda\xe2\xa0\x1c\x22\x7a\x3b\x00\x7c\x31\x43\xc2\x0f\ +\x9a\x8d\x50\x8b\x16\x2d\xba\x60\xcd\x9a\x35\x4f\x64\xc0\xd9\xc2\ +\xb5\xbd\x71\x68\x37\x11\x59\xb4\x78\xf1\xe2\x7b\xf3\xc4\xce\x2b\ +\x47\x8f\x63\xc7\xc0\xd2\xa5\x4b\x77\xd8\x76\xdb\x6d\x77\x89\xe3\ +\x78\xaa\x71\xc5\x23\x71\x1c\x3f\xd2\x6c\x36\xc7\xed\x90\x66\x58\ +\x0f\x10\xd1\x2a\x00\x30\x3f\xbb\xa7\xc5\x32\x9d\x48\xb5\xd6\x46\ +\x68\x93\x63\xc6\x89\x52\x4a\xa9\x6f\x23\xe2\x6b\xd3\x06\x68\xfb\ +\xad\x6b\xef\x1c\x34\xcd\x98\xcd\x8e\x44\xab\x61\xfe\x1a\x04\x41\ +\x70\x80\x88\xec\x0f\x00\xaf\xde\xda\x79\x72\x91\x1a\x62\x13\x00\ +\xd6\x07\x41\x70\x75\xa3\xd1\x70\x75\xbe\xbc\x55\xde\xde\xb8\x33\ +\x03\x44\x64\x4e\x58\x36\x07\x0a\xcd\xa8\x6b\xdb\xdb\x1c\x0c\x75\ +\x93\x88\xfc\x74\xfa\x07\xb5\x33\xf2\xe4\x6b\x8e\x23\x45\xc4\x08\ +\xc4\x6a\xed\xe2\xd6\xd8\xa6\x45\x53\x14\x45\x47\x4e\xff\xef\xb3\ +\x09\x65\x1f\x44\xcc\xab\x83\xdf\x5d\x22\x72\x2d\x22\xde\xc4\xcc\ +\x3f\x49\x32\x59\x22\x7a\x17\x00\x9c\x6d\xd9\x22\xe7\xd3\x22\xf2\ +\x31\xad\xf5\x63\x49\x62\x78\x9b\xe2\x19\x50\x4a\x99\x4b\xfa\x93\ +\x2d\xff\x08\x5f\x03\x00\x17\x31\xb3\x69\xef\x3a\xeb\x58\xb6\x6c\ +\xd9\x92\x05\x0b\x16\x1c\x61\xda\xbf\xa6\x79\xfc\x3b\x1b\xa8\x88\ +\xec\xbb\xf5\xfd\xf6\xac\x67\x14\xb6\xf7\xa8\x9f\x92\x27\x9d\x22\ +\x72\x37\x22\xde\x18\x04\xc1\xa5\x8d\x46\xc3\x7c\xe3\xcc\x18\x59\ +\x8e\x71\x46\x44\x0d\x00\x1f\xaf\xda\x99\xe6\x79\x72\xd8\xad\x58\ +\x39\x7c\x9e\x3e\xcc\xcc\x67\x4e\x9f\x7f\x7b\xe9\xd5\xa4\x40\x00\ +\x60\x41\x5e\xdc\xcc\x75\x84\xde\xac\x42\x19\x19\x19\xd9\x76\xd3\ +\xa6\x4d\xe6\x8d\xfb\x0b\xf2\x4a\x60\x2b\x1c\x46\xc4\x6f\x8c\x8f\ +\x8f\x7f\x66\xdd\xba\x75\x1b\xcc\xef\x32\x3c\x9e\xde\x02\x5a\x44\ +\x4e\xd4\x5a\x9f\xef\x28\x6f\x0f\x6b\xc9\x40\x5e\x75\x05\x80\x0f\ +\xb7\x5a\xad\x4b\x06\x06\x06\xcc\x89\x5d\x46\x20\x4f\xb2\x4c\x25\ +\x89\xf9\xda\xf1\xf1\xf1\xfd\xee\xbd\xf7\xde\x19\x4b\xba\xe6\x3c\ +\xf5\xb6\x56\xab\xad\x08\x82\xe0\xae\x24\xe8\x59\x6c\x44\x44\xb7\ +\xef\x37\xd2\xbc\xc3\x99\x2b\xf4\x11\xcc\x6c\xde\x0b\xf9\x51\x22\ +\x03\x39\x8a\xa4\x90\x59\xcc\x76\xc9\x35\x15\x78\xde\xe3\xa1\xd3\ +\xae\x2c\x2e\x64\x56\xf3\x07\xf9\x03\x22\x1e\x1c\x45\xd1\x7f\x56\ +\x20\x97\xbe\x4c\x21\xc3\xb2\xa8\xb2\xf8\x3a\x96\x99\x2f\x9e\x2b\ +\x78\xc7\x73\xd4\x89\xe8\x43\xe6\x6b\xaf\xac\xec\x33\xc4\x5d\x37\ +\x38\x38\xf8\xa2\xd1\xd1\xd1\xc7\x33\x60\x78\xd7\x14\x0c\xd4\xeb\ +\xf5\xe7\xc6\x71\x6c\x1e\x08\x2d\x49\xe1\x5e\x86\xcb\x69\xcc\x3c\ +\xef\xae\xc7\x8e\x42\x69\xdf\x3f\xbc\xdc\x3c\xb2\x2b\x63\x06\x59\ +\x62\x8a\xc8\x6b\xb5\xd6\x57\x67\xc1\xf0\xbe\xf6\x0c\x10\x91\xcb\ +\x33\x6c\xec\x13\x9a\xc7\x03\x11\x8f\x8b\xa2\xe8\xa2\x4e\xa0\x89\ +\x84\x62\x40\xc2\x30\x5c\x29\x22\x97\x02\xc0\x73\x3a\x81\x56\xe8\ +\xf7\x9f\x66\x66\xd3\x64\xda\x8f\x02\x19\x20\x22\x73\x94\xc3\xd2\ +\x02\x43\xa6\x0d\x75\x12\x33\x7f\x3a\x89\x73\x62\xa1\x18\xb0\xe1\ +\xe1\x61\x1a\x18\x18\x30\x47\x2b\x1f\x9a\x04\xbc\x02\x36\x77\x30\ +\xb3\xab\x27\x77\x15\x98\x5e\xf5\x52\x70\x7c\x74\x60\x9e\x13\x9e\ +\xf1\xc8\x79\x3e\x70\x2b\xa1\x4c\x01\x29\xa5\x56\x21\xa2\xb9\x77\ +\xd9\x31\xcf\xcc\x5d\x60\x0d\x0e\x0e\xee\xe4\xef\x53\x5c\x30\x3b\ +\x3b\x66\xad\x56\x3b\x3a\x08\x82\xd5\xc5\x45\xb4\x8e\x74\x0b\x00\ +\x9c\xc9\xcc\xe6\xdf\xc4\x23\x95\x50\x0c\x7a\xad\x56\xdb\x2b\x08\ +\x02\x23\x96\x4a\x7f\xbb\x94\x79\x56\x60\xe2\x2a\xf4\x90\x21\x11\ +\x99\x7d\x1f\x66\xff\x47\x15\x87\xd5\xb7\xc8\xf4\x09\xa4\x16\xca\ +\xb4\x6f\x17\xd3\x50\xec\x78\x00\x78\x49\x15\x99\x31\x67\x10\x32\ +\xb3\x39\xa9\xcb\x8f\x02\x18\x20\xa2\xeb\x00\xe0\xe0\x02\x42\x25\ +\x0d\x61\x0e\x29\xba\x24\x8e\xe3\xd5\xcd\x66\xd3\xb6\x43\xe4\xe6\ +\x18\x99\x85\x32\x85\x14\x86\xe1\x31\x00\x70\x9c\x88\xbc\x30\xe9\ +\x0c\x8a\xb0\x9b\x98\x98\xd8\x73\xed\xda\xb5\xf7\x17\x11\xcb\xc7\ +\x98\x5c\x61\x71\x15\x00\xbc\xae\x02\x5c\xac\x47\x44\x73\x54\xc5\ +\xea\x28\x8a\xee\xcb\x9a\x4f\x6e\x42\x99\x26\x98\x95\xe6\x2f\x8a\ +\x88\x98\xbf\x2a\xcf\xcb\x9a\x60\x56\x7f\x11\xd9\xc5\x2f\x96\xcc\ +\xca\x62\x72\x7f\x22\xfa\x17\x00\x30\x0b\x5b\xcb\x18\xff\x03\x00\ +\xe6\x1b\xed\xfa\x25\x4b\x96\xdc\x78\xcb\x2d\xb7\x4c\xe4\x95\x44\ +\xee\x42\x99\x9e\x58\xbd\x5e\xdf\xaf\xd5\x6a\x99\x55\x9d\x46\x34\ +\x4e\x0e\x29\xed\x44\xc4\xf0\xf0\xf0\xe0\x15\x57\x5c\x61\xbd\xd4\ +\xbf\x13\xae\xff\xfd\xec\x0c\x94\xf0\x82\xda\xf4\xce\x36\xe2\xf8\ +\xde\xc4\xc4\xc4\xcd\x66\x7f\xbb\x8b\xda\x38\x15\xca\xf4\x84\x95\ +\x52\x07\xb4\x05\x63\x44\x33\xec\x62\x32\x5b\x63\x8a\xc8\x77\xb4\ +\xd6\x95\x7e\xd8\x50\x04\x0f\x45\xc6\x50\x4a\x2d\x45\x44\xd7\x47\ +\x62\xff\x16\x00\x6e\x46\xc4\xef\x8b\xc8\xcd\xcc\xfc\x4b\xd7\x73\ +\x2c\x4c\x28\x5b\x89\xe6\xa0\xb6\x68\xcc\xb9\xf1\x2e\xc7\xab\xe7\ +\xdb\xcb\xe0\x32\x70\x3f\x63\xa7\x6d\x0d\x64\xc1\x59\xe1\x2f\x92\ +\x4b\x11\xca\xb4\xfb\x99\xb3\x44\xe4\x74\x0b\x82\x6c\x4c\xef\x63\ +\xe6\x67\xdb\x38\x78\xdb\x7c\x18\xc8\x61\x4b\x79\xa7\x44\xf6\xb7\ +\x7d\x0f\xd2\x09\xb0\xd3\xef\x4b\x15\x8a\x49\x8e\x88\xee\x01\x80\ +\x7a\xa7\x44\x53\xfc\xfe\x63\xcc\x7c\x5a\x0a\x3f\xef\x92\x03\x03\ +\x39\x6d\x29\x9f\x2d\x93\x6f\x33\x73\xe1\x4f\xd5\xaa\x20\x94\x67\ +\x02\x80\x79\x5a\x91\xdb\x30\xbb\x1d\xe3\x38\x7e\xa3\xd6\xda\xec\ +\xab\xf7\xa3\x04\x06\xcc\xd6\xdf\x1c\xb7\x94\x4f\xcd\xe0\xf1\x20\ +\x08\x9e\xdb\x68\x34\x7e\x5d\xf4\x94\x4a\x17\x8a\x99\x70\x18\x86\ +\x27\x88\xc8\xe7\xf3\x98\xbc\x17\x49\x1e\x2c\xe6\x83\x41\x44\x66\ +\x41\xea\xb9\xf9\xa0\x4d\xa2\xec\xcd\xcc\x77\xe6\x88\x97\x18\xaa\ +\x12\x42\x31\xd9\xd6\x6a\xb5\x17\x06\x41\x30\xd9\x6c\x2c\xed\xf0\ +\x22\x49\xcb\x9c\x3b\xbf\x9c\x1e\x17\x6f\x14\x91\x91\x32\xaf\x10\ +\x2a\x23\x14\x53\x2a\xa5\xd4\xce\x88\x68\xf6\x32\xbc\xc5\xb6\x74\ +\xe6\x51\x30\x00\x7c\xb0\x4c\x32\x6d\x73\xee\x17\x7b\xf3\x47\xd0\ +\xbc\x25\x47\xc4\x3d\x52\xcc\x79\x8d\x88\xbc\xad\xec\xba\x56\x4a\ +\x28\x53\x24\xb6\xff\x0a\x99\xbe\x4f\x23\x09\x88\xfd\x8a\x59\xad\ +\xea\x7b\x7b\x25\x60\xaa\x44\x93\xf6\x1f\x41\xb3\x45\xc3\xf4\x46\ +\x78\x4a\x82\x54\xd6\x20\xe2\x45\x49\x36\x55\x25\xc0\xca\x6c\x52\ +\x49\xa1\x4c\xcd\xaa\x56\xab\xbd\x20\x08\x02\xf3\xc2\xd0\x3c\xe5\ +\x78\x06\x00\x3c\x28\x22\x0f\x22\xa2\xe9\x48\xf9\xa0\xe9\x95\xdc\ +\x6c\x36\x7f\x96\x99\x05\x0f\x50\x18\x03\x2b\x56\xac\x78\xca\xf8\ +\xf8\xb8\x11\xcb\xde\x88\xa8\xcc\x55\x37\x00\x98\xee\x90\xe6\x0d\ +\xfb\x23\x00\x60\x96\xbf\xff\xa8\xe8\xc7\xbf\x9d\x08\xf8\x7f\xee\ +\x74\x9e\xef\xc9\x63\x4f\x81\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ +\x42\x60\x82\ +\x00\x00\x09\x40\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ +\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ +\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ +\x79\x71\xc9\x65\x3c\x00\x00\x08\xd2\x49\x44\x41\x54\x78\xda\xed\ +\x99\x79\x70\x95\xd5\x19\x87\x9f\xf3\x6d\x77\xc9\xbe\x6f\x04\xb3\ +\x10\x43\x88\x44\xc4\x20\x8a\x20\xc5\x36\x18\x0a\x62\x15\xaa\x23\ +\xa8\x6d\xc5\x76\xb4\x5a\xa7\xa3\x4e\x3b\xb6\xce\xb4\x9d\xb1\x8e\ +\xfd\xc3\xa9\x8e\xb5\x55\x2b\x6e\x80\x20\x19\xb1\x08\x26\xb2\x88\ +\xa0\x20\xa2\x48\x58\x22\xa1\x2c\x22\x89\x82\x59\x09\x49\xee\xfe\ +\x7d\xdf\xe9\x31\x89\x93\xb1\xf8\x67\xb9\x89\x53\xde\x99\xdf\xdc\ +\x33\x73\xef\x9d\x79\x7e\xef\xf7\x9e\xf9\xde\xf3\x1e\x43\x4a\xc9\ +\x77\x39\x0c\xe0\xbc\x81\xf3\x06\xfe\x57\x06\xc4\xcd\x29\x7c\x6b\ +\x48\x94\x84\x92\x0e\xae\x18\x5c\xbb\xda\x80\x86\xd7\x02\xa4\x36\ +\x28\x47\xfc\xd7\xef\x07\xbf\x1f\x5a\x9f\xfd\xdf\xe1\xc8\x43\xf2\ +\x07\xe0\x72\x04\xcb\x60\x40\xed\x67\xe1\xec\xde\x3d\x2a\x9f\xc0\ +\x58\x5c\xb1\x1c\x87\x19\xe8\x12\x6c\xed\x62\x0c\xf7\x0e\x04\x3f\ +\x07\xb6\x8f\xf6\x12\xaa\xc4\x16\xaf\x5b\x1e\xb7\x6c\xec\xf5\xdd\ +\xb4\xf9\x63\x84\xf7\xfb\x88\x1d\x48\x1d\x8f\x64\x23\x9a\xbc\x17\ +\x78\x6e\xb4\x1a\x98\x4a\x4c\x5b\xa5\x99\x6e\xd1\xec\x25\x9f\xa3\ +\x55\x47\x38\xdd\xe6\xc5\x28\xe9\x20\x58\x14\x20\xd2\x90\xa7\x9c\ +\x68\x7f\x43\x97\x67\x80\xba\xd1\x66\x60\x0e\x51\xf1\x8c\x37\x25\ +\x56\x38\xfb\x17\xad\x8c\x9f\xd2\xcb\xc9\x3e\x3f\x09\xc2\x43\x58\ +\x97\xf8\x2e\xe9\x07\xb3\x95\x48\x7d\x81\x87\x90\xf1\x0c\xba\x6c\ +\x06\x9a\x46\x89\x01\x39\x9f\x88\xbe\x32\x31\x3b\xe2\x9f\x73\x57\ +\x2b\x45\x13\xfb\x09\x07\x0d\xd2\x4d\x9b\x7c\xbf\xe4\x84\xeb\xc3\ +\x13\x05\xaa\x02\xc8\x40\x1b\xd1\xfa\x31\x69\xe8\xf2\x69\xe0\x1a\ +\x20\x30\xd2\x06\x16\x13\xd5\x96\x26\xe7\x85\x3d\x73\xee\x6a\x61\ +\x6c\x45\x88\x88\x82\x97\x52\x43\x13\x50\x99\xd0\x47\x77\x2c\x91\ +\x5e\x69\x62\xc5\xfc\xb8\xea\x49\x38\xc7\x7b\x70\x9a\x53\xaf\xc4\ +\x74\x6f\x04\x5e\x18\x21\x03\x02\xe0\x37\x84\xb5\x87\xb3\x4a\x02\ +\xe6\xbc\x7b\x5a\x49\xcf\x8b\x0e\xc1\x0b\x40\xe0\x48\x48\xd4\xa3\ +\xcc\xcf\x29\xa1\xbe\xa3\x93\xce\x40\x17\x96\x6e\xe1\x4c\xeb\x21\ +\x70\x2c\x09\x5c\x6d\xf1\x08\x1a\xe0\x41\x82\xfa\x23\xf9\x13\xfa\ +\x98\x7b\x67\x2b\xc9\x99\x36\xb1\xb0\xf1\xb5\x31\x24\x2e\xae\x94\ +\x94\x25\x5e\x4d\x55\x4a\x0d\x53\xd2\x74\x1e\x3f\xb6\x82\x23\x7d\ +\x2d\x58\xf9\x31\x42\xc9\x36\x6e\xb7\x35\x69\x24\xf6\x80\x8e\xe4\ +\x51\xa2\xe2\x81\xe2\xcb\x7a\xa8\xb9\xf5\x24\x49\xe9\x0a\x3e\x32\ +\x0c\xaf\xd0\xd1\x30\xa9\x48\xbe\x9a\xf2\xa4\xef\x91\xee\x29\xe3\ +\x82\x84\x14\xee\x2e\x6e\xa3\xae\x73\x05\xcd\x07\x34\xce\x84\x74\ +\x10\xf4\xc5\xdb\x80\x89\x94\x4b\x89\xea\xb7\x96\x28\xf8\x79\x4b\ +\xbe\xc0\xb4\x24\xb1\xa8\x01\x00\x08\x5c\xe9\x20\x30\xa8\x4c\xa9\ +\x65\x5c\xe2\x55\xe4\x7a\xcb\xd1\x30\xf8\xa4\x77\x1b\x27\xec\xf5\ +\xf8\x5a\x22\x74\x2c\xcb\xc1\x0d\xea\x41\x0c\xf9\x60\x1c\x0d\xc8\ +\x64\xa4\x78\x8a\xa8\x76\xcb\xb8\xe9\x5d\xd4\x2c\xfe\x12\xc3\x00\ +\x3b\xa6\x33\x0c\x6f\x23\xb0\xa8\x4a\x9d\x4f\x49\xe2\x15\x64\x7b\ +\xc6\x21\xd0\x39\x12\xd8\xce\xde\x40\x1d\x7b\x1a\xdb\x79\xfb\xe9\ +\x7c\xfa\xdb\x8d\x5e\x3c\xf2\x36\x60\x6d\x9c\x0c\x88\x4c\x5c\x56\ +\x61\x8b\xef\x57\xd6\xb6\x33\xf5\x87\x5d\x58\x06\x38\x8e\x40\x22\ +\x00\x0d\x47\x3a\x58\x22\x91\x8b\x53\xaf\x67\x6c\xc2\x64\x72\x3d\ +\x15\x38\xd2\xa6\xb9\x7f\x33\xfb\x82\x75\xec\xda\xde\xcf\xd6\x67\ +\xc7\x10\x0d\x68\x2d\x0a\x7e\x11\xb0\x23\x3e\x2f\x32\x41\x2e\x0e\ +\x6b\x71\xc5\x65\xe5\xb3\x3b\x98\x54\xdb\x8d\xa9\x03\x2e\x80\x18\ +\xca\x7c\x0c\x4b\x4b\x64\xd2\x57\xf0\xfe\x29\xaa\x6c\x2a\xb0\xdd\ +\x10\xff\xee\xdf\xc6\xde\xd0\x4a\xde\xdf\x12\xe3\xdd\xa5\x05\xd8\ +\x11\xed\x04\x96\x5c\x08\xec\x8e\x53\x2b\x21\x27\xe2\x68\xcf\x0b\ +\x5d\x56\x97\x5f\xd3\xce\x45\x33\xce\xa0\x4b\x94\x86\xe1\x1d\x05\ +\xef\xd7\x33\x54\xe6\x6f\xa0\xd0\x7f\xe9\x40\xd9\x44\x9c\x3e\x95\ +\xf9\x4d\xec\xeb\xff\x17\xef\xd5\x3b\xec\xaa\xcb\xc5\xb6\x69\x54\ +\xf0\x8b\x91\x34\xc7\xab\x99\xab\xc6\x16\xab\x84\xe1\x96\x8e\x9f\ +\xdb\x41\xe9\xe4\x00\xba\x0b\xa6\x01\x86\x0e\x20\x88\x49\x87\x24\ +\x23\x9b\xc9\xa9\x37\x92\xef\x9b\xa8\xe0\x2f\x24\xe0\x9c\xe6\x60\ +\x5f\x03\x7b\x7b\xd7\xf2\xee\x3a\x9d\x0f\x57\x67\x83\xc6\x76\x0c\ +\x95\x79\x57\xb4\xc5\xe7\x40\x23\x98\x8a\xea\x28\x75\xaf\x93\x57\ +\x5c\xd3\x45\xfe\xc4\x20\x9a\x0d\xba\x05\xa6\x0e\x02\xb0\xa5\x4b\ +\xb2\x99\xc3\xe4\x94\x85\x83\xf0\xde\x72\x7a\x63\x1d\x34\x07\x36\ +\xd0\x78\x66\x0d\xef\xbc\xe6\xa5\xf1\x8d\x2c\x30\xe5\x66\x04\xb7\ +\x7c\x0d\x1f\x0f\x03\x0b\x14\xfc\x73\x7a\x82\x9d\x7a\x41\x6d\x27\ +\x39\x25\x11\x74\x07\xcc\x21\x78\x53\x80\x23\x21\xdd\x1a\xc3\x25\ +\xa9\x37\x91\xe7\xad\x24\x53\x95\x4d\x77\xb4\x85\xa6\xc0\x3a\xf6\ +\x76\x35\xf0\xd6\x4b\x29\x1c\xd9\x91\x0a\x96\xb3\x12\x21\x96\x28\ +\xf8\x50\xbc\x8e\x94\x8b\x15\xfc\x3f\xf4\x64\x3b\x29\xbf\xa6\x93\ +\xd4\xc2\x18\x9a\x03\x86\x05\xa6\x06\x96\x92\x03\xaa\x54\x8a\x54\ +\xcd\xff\x98\x3c\xcf\x04\x32\x3c\xc5\x74\x45\x4f\x28\xf8\xd7\x69\ +\x6c\xdf\xc4\x86\x97\x53\x38\xba\x33\x19\x2c\xf7\x59\xa4\xb8\x07\ +\x49\x2c\x5e\x67\xe2\xbb\x88\x89\x27\x8c\xac\x88\x99\x31\xfd\x34\ +\x49\xb9\x36\x86\x03\x96\xa5\xa4\x83\xa1\xa4\x09\x28\xf0\x8d\xa7\ +\x32\x65\xbe\xca\xfc\x45\xa4\x99\x85\xb4\x47\x8e\x29\xf8\x35\x7c\ +\xd4\xba\x8d\x4d\xcb\x53\x39\xf1\x71\x32\x78\xdd\x47\x90\xe2\x8f\ +\x4a\xb1\x38\x1c\xea\x05\x4a\xbf\xc7\xe6\x61\x2d\x27\x42\xd2\x95\ +\x3d\xf8\x33\x9c\x01\x78\xd3\x1c\x2a\x1b\x0d\x34\xa5\xc2\x84\xf1\ +\x4c\x4a\x5d\x48\xb6\xa7\x82\x54\xab\x90\xb6\x70\x33\xfb\x02\xaf\ +\xb2\xbb\x65\x07\x6f\xfe\x33\x87\xf6\xc3\x7e\x07\xbf\xf3\x10\x52\ +\x3c\xaa\x14\xaf\xa9\x84\xfc\x33\x8e\xfc\x1d\x39\x51\xbc\x57\x9c\ +\xc1\x93\xec\x62\xb8\xc3\x65\x63\x28\x21\xa0\x34\xb1\x8a\x4b\xd3\ +\xae\x57\xf5\x5e\x46\x8a\x91\xcf\xa9\x70\x13\xfb\x83\xab\xd8\x75\ +\xec\x43\xde\x7a\x31\x9b\x8e\x63\x5e\x1b\x9f\x7b\x1f\x52\x3c\x19\ +\xaf\xb1\x8a\x07\xf8\x3b\xb6\xb8\x9d\xc2\x10\xfa\xc5\xfd\x58\x3e\ +\x89\x29\x87\xb2\xae\x0f\xc2\x6b\x02\x26\xa6\x4d\xa3\x3a\x7d\xf6\ +\xc0\x0b\xca\xaf\x67\xf2\x79\x68\x0f\xfb\x82\xaf\xb0\xa3\xa9\x89\ +\x8d\x2f\x67\xd3\x7b\xca\x13\xc4\xeb\x2e\x42\x6a\x6b\x91\x10\x0f\ +\x03\xd6\x40\x53\xe6\x68\x8b\x29\x0a\xc1\x84\x00\xa6\x22\xb7\x00\ +\x4b\x53\x1a\x82\xd7\x05\x54\x29\xf8\xc9\x69\xb5\xe4\xf9\x2a\x48\ +\x30\x32\x68\x0d\xee\x61\x7f\x68\x39\xdb\x0f\x34\xd1\xf0\x7c\x1e\ +\xc1\xd3\x66\x97\x82\xbf\x15\x57\x34\xc4\x67\xb0\x25\xc8\xc2\xe5\ +\x79\x60\x1e\xa5\x41\x28\x0f\x22\x04\x98\x62\x38\xf3\xba\x18\x2c\ +\x9f\xea\xac\x59\x4c\xc9\xac\xa1\xc0\x3f\x1e\x9f\x9e\xc0\x67\xc1\ +\x9d\x2a\xf3\xcb\x78\x67\xe7\x71\xde\x59\x9d\x4b\xa8\x57\x3f\x8e\ +\x47\xde\x8e\x23\xb6\xc6\x6b\x32\x67\x02\x2f\x83\xa8\xa5\x2c\x08\ +\xe3\x22\xe0\x80\xc1\x37\x37\xab\xa9\x0b\x66\xe4\xcc\xe1\xd2\x8c\ +\x99\x14\xfa\xcb\xf1\xea\x7e\x8e\x07\xb7\xd3\xd8\xbf\x9c\x2d\x3b\ +\x5a\xd9\xba\x3a\x07\x3b\xac\x1f\xc5\x94\xf3\x91\xa2\xf9\xdc\x8c\ +\x16\x85\xcb\x59\x21\xc4\x4c\x6c\x6a\xc9\x0d\x43\xc9\x20\x3c\xf2\ +\x9b\xf0\x3e\xc3\x54\xf0\x3f\x60\x92\x82\x1f\xa3\x32\xef\xd1\x7d\ +\x0a\x7e\x1b\x8d\xbd\x2b\xd8\xfc\xde\xe7\x6c\x7d\x2d\x07\x69\x8b\ +\xbd\x58\xf2\x26\x5c\x71\xf8\xdc\xcd\x46\x35\xc9\x59\x21\xb9\x03\ +\x03\xac\x62\x97\xa8\x00\xdc\xc1\x72\xb1\xf4\x41\x78\xbf\x61\x31\ +\xbb\xe0\x3a\x95\xf9\xcb\x29\x4e\xac\x44\x10\xe5\x70\xa0\x81\x7d\ +\x7d\xcb\x78\xb3\xbe\x8f\x8f\x36\x64\x83\x60\x23\x86\xfc\xa9\x82\ +\x3f\x75\x6e\x87\xbb\xe2\x2c\x03\x13\x88\x45\xe7\xce\x2a\xbd\x88\ +\x84\x42\xc9\xfa\xce\xbd\xa0\x0d\x35\x66\x02\x12\x15\xfc\xbc\xb1\ +\x0b\x54\xe6\x2f\xa3\x28\xa9\x62\xa0\x45\xfe\x34\xb4\x99\x03\x7d\ +\xcb\x59\xbf\x2e\x40\xe3\xd6\x74\xd0\xe5\x06\x04\x5f\x65\xfe\x0c\ +\x40\x7c\x0d\x48\xf9\x80\x61\xea\x89\xbf\xbe\x7c\x36\x49\xf9\x89\ +\xbc\x7d\xfa\x20\x21\x37\x0a\x40\xa6\x37\x85\x1f\x15\x5d\xcb\xa4\ +\x74\x05\x9f\x58\x46\xcc\x0d\x71\x28\x50\xcf\xfe\xae\xd7\xd8\xf4\ +\x56\x3f\x4d\xef\x0f\xc0\xbf\x08\xe2\x57\x48\xfa\x61\x38\xe2\x55\ +\x42\x05\x44\x22\x0b\x66\x5e\x38\x99\x59\x65\x55\xf8\xbd\xe9\xdc\ +\x3e\x76\x1e\x4f\x1d\x5d\xc3\x98\xb4\x2c\x16\x14\x5f\xc7\xa4\xcc\ +\x4b\x28\x4d\x1e\x4f\xc8\xe9\xe6\x60\x7f\x3d\xbb\x3b\x57\xb2\xe5\ +\x0d\xf8\x74\x4f\x2a\x58\xee\x13\x20\xee\xc3\xfd\xb6\x8d\x05\xe7\ +\x7e\x13\x4b\x16\xa1\x91\xbc\xa8\x6a\x3a\x1e\x6f\x32\x61\xcd\xe0\ +\xa1\x8a\x3b\x39\x10\x38\x81\xe1\xf5\x52\x9d\xa5\x6a\x3e\xa9\x94\ +\xde\x58\x3b\xfb\xfb\xd6\xb3\xeb\xcb\x3a\xd5\xcb\x0b\xbe\x68\x4e\ +\x00\x9f\xfb\x18\x52\x3c\xa0\xe0\xf9\x46\xc4\xb1\x84\xf2\xb0\xed\ +\xfb\xa7\x97\x4d\xe4\xda\xca\x69\x84\x85\x01\x86\x45\x96\x37\x83\ +\x35\x33\x97\x72\xdb\xce\xfb\x79\xe5\xe8\x5a\x6e\x2e\x9b\xcb\x91\ +\xd0\x46\x76\x1c\x5f\xcf\x07\x0d\x3a\xdd\x2d\x7e\xf0\xca\x7b\x71\ +\x87\x5b\x83\x91\x32\x70\x03\x8e\xcc\xb9\x2a\x77\x0a\x59\x69\xb9\ +\xf4\xc5\x24\x9a\x95\x40\x4c\x37\xc8\xf0\xa4\xf3\x66\xcd\x4b\x3c\ +\x79\x68\x29\x7f\xd9\xf5\x24\x9d\x27\x0f\xd3\x79\xc8\x20\xd0\xe6\ +\x75\xb1\xdc\x25\x48\xed\x45\x80\x91\x34\x60\xa8\xcf\x9f\xe0\xf8\ +\x79\xfa\x95\x83\xcc\x28\x3e\x46\xed\xf4\xa9\x80\x1f\x2c\x1f\x5d\ +\x3d\xed\xbc\x7f\x74\x0f\x2d\xcd\x1d\x9c\xfa\x38\xc0\xc9\x2f\x0d\ +\x94\xbb\x56\x3c\xee\x6f\x91\x62\x25\x12\x46\xda\xc0\x42\x34\x77\ +\x0a\x3d\x39\x74\x77\x84\xf9\xe5\x5f\xeb\x78\x35\xb3\x00\x33\x05\ +\xd6\x36\x6e\x62\xc5\x07\xeb\x38\x72\xf2\x18\xc4\x6c\x1b\xd3\xf7\ +\x31\x1e\xbd\x1e\x29\x5f\x40\x8a\x56\x00\x18\x59\x03\x3a\x9a\xbc\ +\x9b\xde\x24\xe8\xcc\x80\x94\x18\xc7\xc3\x9f\x30\xeb\xf1\x9f\xe1\ +\xf8\x7b\x09\xf7\xf6\xc7\x10\xda\x61\x0c\x6b\xb3\xd2\x6a\xa4\xf8\ +\x50\xc9\x1e\xce\xfa\xc8\x1b\xa8\x06\xa6\xe1\xe8\x50\xf4\x19\x24\ +\xf7\x82\x61\x3b\x01\xc7\x3d\x40\x58\x5b\x85\xc7\xb3\x19\x29\x9a\ +\x94\x22\x48\x40\x8e\xbe\x6b\xd6\xb9\x48\x34\xd2\x7a\x24\x82\x43\ +\x38\xda\x4a\x5c\xb1\x19\x61\xee\x41\x43\x41\x8f\xfe\x7b\xe2\x04\ +\xe0\x4f\x48\xb6\x28\xf0\xdd\x48\x82\xdf\xa9\x7b\x62\xf9\x8c\xbc\ +\xff\xfc\x4d\xfd\x79\x03\xff\x67\x06\xfe\x03\x1b\x85\x94\x1a\x1f\ +\xbe\x73\xb2\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x01\x4f\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x04\x00\x00\x00\xfd\x0b\x31\x0c\ +\x00\x00\x01\x16\x49\x44\x41\x54\x78\x01\xed\x96\x4b\x4a\x03\x41\ +\x14\x45\xcf\x20\x66\x1a\x14\x5d\x81\x26\xad\x7b\x08\x82\x38\xd0\ +\x6d\x88\xe0\x46\x14\x07\xe2\x36\x32\x51\x83\x9a\x55\x28\x22\xb8\ +\x03\x23\x22\x0e\x84\x56\xb4\x03\x7e\xba\x53\x4a\xf3\x28\x32\x10\ +\x2c\x0b\xee\x24\xd4\x39\xe3\xcb\x85\xa2\xea\xbd\x22\x31\x85\x24\ +\x12\x1d\x4e\xc8\x29\xa9\xbc\xe3\x09\xdd\x2f\x8e\x18\xb0\x4c\x20\ +\x19\xcf\xb8\x08\x5f\x58\x21\x88\x33\x5c\xa4\x37\x34\x09\xe0\x15\ +\x17\xed\x21\x01\x38\xf3\x3f\xf4\x2c\x33\x66\x5d\x53\xd0\x62\x68\ +\xa9\x07\xe6\x14\x05\xb0\x4a\x65\xb9\xbe\xa6\x00\xf6\x7d\x72\x5b\ +\x53\x30\xc3\x95\x25\x0b\x96\x14\x05\xd0\xa1\xb0\xec\x25\x0d\x45\ +\x01\xec\xf8\xf4\x9e\xa6\x00\xff\x4c\x2b\xba\x9a\x82\x79\x1e\x2d\ +\x3f\xa4\xa5\x28\x80\x0d\x3f\x10\x7b\x9a\x82\x4d\x6d\xc1\x82\x3f\ +\xa2\x5b\xcd\x11\x9d\x5b\xba\xa4\xab\xbd\xa6\xbb\x9a\x87\x36\xb2\ +\xec\x05\x0d\xe5\xa8\x78\x63\x51\x3b\xec\xb6\xb4\xe3\xfa\x58\xb3\ +\x70\xee\x2c\x75\xcf\xac\x72\x65\x56\xac\xf1\x27\x05\x2e\xda\x03\ +\x02\x18\xe0\x22\xbd\xa6\x49\x00\x19\x39\x2e\xc2\x9c\x8c\x40\xda\ +\x1c\xf1\xc4\x7b\xed\x47\xed\x67\xed\xd7\x8f\x65\xed\xc4\x87\xd2\ +\x6e\xfe\x29\x6d\x12\x89\xc4\x54\xf3\x0d\x0a\x7f\x93\xd6\xf9\xe7\ +\x0c\x36\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x04\x32\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x12\x00\x00\ +\x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ +\xd2\x01\x07\x0b\x05\x06\xab\xd4\xb8\x1c\x00\x00\x03\xaf\x49\x44\ +\x41\x54\x78\xda\xb5\x96\xcd\x4b\x63\x57\x14\xc0\x7f\xf7\x46\x13\ +\x34\x89\x93\x9a\x28\x88\x1f\x09\x8e\x8b\x6e\x9c\xea\xe0\xc6\x27\ +\xe8\x80\x6e\x82\x10\x19\xac\x4b\x75\xd1\x59\x64\xd3\x2e\x66\xe7\ +\x6a\x96\xb3\x18\x98\xbf\xa1\x9b\xa1\x8b\x30\x2e\x4a\x2b\x68\x57\ +\x82\xdf\xd2\x8e\x16\x41\x34\x7e\x4c\x05\xbf\x88\x08\xad\x21\xef\ +\xf3\xbe\xd7\x8d\x79\x38\x1d\xa3\xa5\xd8\x0b\x07\x0e\xe7\x1d\xce\ +\xef\x9e\x73\x38\xe7\x3e\xf8\x9f\x8f\xa8\xf4\x21\x9d\x4e\x67\x0a\ +\x85\xc2\x98\x69\x9a\x9a\xe3\x38\x6d\x4a\x29\x80\x23\x60\xe9\xd1\ +\xa3\x47\xb9\xf5\xf5\xf5\x1f\xff\x13\x60\x7c\x7c\xfc\xe9\xe6\xe6\ +\xe6\x5b\x29\xe5\xc0\xe0\xe0\x20\x4f\x9e\x3c\x21\x1e\x8f\xe3\xba\ +\x2e\x85\x42\x81\xb5\xb5\x35\x66\x67\x67\x71\x1c\x67\xbe\xb9\xb9\ +\xf9\xe5\xea\xea\xea\x6f\xff\x1a\xf0\xec\xd9\xb3\xcc\xe9\xe9\xe9\ +\x7b\x4d\xd3\xaa\x46\x47\x47\x69\x6c\x6c\xa4\xba\xba\x1a\x21\x04\ +\xae\xeb\x62\xdb\x36\x86\x61\x70\x72\x72\xc2\xbb\x77\xef\x58\x5e\ +\x5e\x76\x62\xb1\xd8\xe8\xfe\xfe\x7e\xc5\x6c\x02\x65\x65\x64\x64\ +\xe4\x69\x3e\x9f\xff\xe5\xf9\xf3\xe7\x55\x93\x93\x93\x24\x12\x09\ +\xa2\xd1\x28\xf5\xf5\xf5\x24\x12\x09\x1a\x1a\x1a\x88\xc7\xe3\x44\ +\x22\x11\x22\x91\x08\x9d\x9d\x9d\xe8\xba\x2e\x37\x36\x36\xc6\x5a\ +\x5a\x5a\x7e\xbe\xbc\xbc\x3c\xbd\x13\x60\x59\xd6\x0f\x9a\xa6\xb5\ +\xbf\x78\xf1\x82\x48\x24\x42\x2c\x16\xa3\xa1\xa1\x81\x48\x24\x42\ +\x28\x14\x22\x10\x08\x10\x08\x04\x08\x85\x42\x44\xa3\x51\xc2\xe1\ +\x30\x8f\x1f\x3f\x66\x77\x77\x57\xee\xed\xed\x7d\x69\x9a\xe6\xf7\ +\xb7\x01\x24\x40\x57\x57\x57\xc6\x75\xdd\x81\x89\x89\x09\x6a\x6b\ +\x6b\x89\xc5\x62\x24\x12\x09\x82\xc1\x20\x81\x40\x00\x29\x25\x52\ +\x4a\x1f\x22\xa5\x24\x1c\x0e\xd3\xde\xde\x4e\x36\x9b\xc5\xf3\xbc\ +\x81\xfa\xfa\xfa\x4c\x45\x40\xa1\x50\x18\xcb\x64\x32\x34\x35\x35\ +\x11\x0e\x87\xa9\xab\xab\x43\x08\x81\x94\x12\x21\xc4\x67\x72\x13\ +\xda\xd5\xd5\x45\x3a\x9d\x46\xd7\xf5\xb1\x8a\x00\xd3\x34\xb5\xbe\ +\xbe\x3e\x82\xc1\x20\xd1\x68\x14\x21\x04\x9e\xe7\xe1\x79\xde\x27\ +\xce\x65\xdb\x4d\xbb\x10\x82\xa1\xa1\x21\x94\x52\xda\x6d\x80\x2a\ +\x00\xa5\x54\x5b\x6b\x6b\x2b\xa1\x50\xc8\x0f\x3e\x3c\x3c\xec\x07\ +\xb8\x0d\x90\xcb\xe5\x7c\xbd\xa3\xa3\x03\xa0\xed\x2e\x00\x42\x08\ +\xaa\xaa\xaa\x50\x4a\xa1\x94\xc2\xf3\x3c\x1f\x76\x1b\x40\x29\x85\ +\x6d\xdb\x38\x8e\x83\x6d\xdb\x9f\x65\xfb\x4f\xc0\xd1\xe1\xe1\x61\ +\x7b\x73\x73\x33\xb6\x6d\x23\x84\x60\x7a\x7a\xda\xaf\x75\x39\xb8\ +\xeb\xba\x38\x8e\x83\x52\x0a\xc3\x30\xb0\x6d\x1b\xcb\xb2\xd8\xd9\ +\xd9\x41\x29\x75\x54\xb1\x07\x9e\xe7\x2d\xcd\xcd\xcd\x61\x18\x06\ +\x96\x65\x61\x9a\x26\x96\x65\xf9\x7a\x59\xca\x36\xc3\x30\xd0\x75\ +\xdd\xb7\xcf\xce\xce\xe2\xba\xee\x52\x45\x80\x94\x32\x97\xcb\xe5\ +\xc8\xe7\xf3\xe8\xba\x4e\xa9\x54\x42\xd7\xf5\x4f\xc4\x34\x4d\x4a\ +\xa5\x92\x2f\xa6\x69\xa2\xeb\x3a\xdb\xdb\xdb\xcc\xcc\xcc\x00\xe4\ +\x2a\x0e\x9a\x65\x59\x86\x10\xa2\xfb\xe0\xe0\x20\x35\x38\x38\x88\ +\xeb\xba\x58\x96\xe5\xaf\x07\xcb\xb2\xb0\x6d\xdb\xcf\xa2\x0c\x2b\ +\x16\x8b\xbc\x7a\xf5\x8a\xb3\xb3\xb3\x79\x60\xea\xae\x49\xfe\x53\ +\x4a\xf9\xfb\xf1\xf1\xf1\x37\xe7\xe7\xe7\xb2\xbb\xbb\xdb\x6f\x5e\ +\x39\xa8\xae\xeb\x7e\x79\x4a\xa5\x12\x57\x57\x57\xbc\x79\xf3\x86\ +\xe5\xe5\x65\x07\xf8\x0e\xc8\xdf\xb9\x2a\x5c\xd7\x0d\x0a\x21\xe6\ +\x77\x76\x76\xc6\x3e\x7c\xf8\x20\x5b\x5b\x5b\xa9\xa9\xa9\xf1\x83\ +\x97\xeb\x5d\x2c\x16\xd9\xda\xda\xe2\xf5\xeb\xd7\xac\xac\xac\x38\ +\x40\x09\xf8\x1a\xb8\x04\x7e\xbd\x6f\x5d\x27\x81\xb8\x10\xe2\xad\ +\x94\x72\xa0\xbf\xbf\x9f\xde\xde\x5e\x52\xa9\x14\x00\xfb\xfb\xfb\ +\x2c\x2e\x2e\xb2\xb0\xb0\x00\x30\x0f\xbc\x04\xde\x03\x5f\x5c\x5f\ +\xf6\x02\xf8\x16\xf8\xe9\xbe\x07\x27\x09\x7c\x05\x8c\x01\xda\x8d\ +\x21\x3a\x02\x96\xae\x1b\x7a\x01\x1c\x03\xa4\x52\xa9\x2d\x40\x7c\ +\xfc\xf8\x51\x02\x36\x90\xbe\xf6\xbb\xf7\x24\xef\x90\x9b\x3e\x17\ +\xd9\x6c\xd6\xee\xe9\xe9\xd1\x81\xbf\xae\xcb\x96\x7c\xc8\xa7\x37\ +\x09\x5c\x4d\x4d\x4d\x29\x4d\xd3\x1c\xe0\x0a\x28\x3e\x24\xa4\x9c\ +\x95\x91\xcd\x66\xed\x64\x32\x69\x3f\x34\xe0\x26\xe4\x14\x50\xc0\ +\x00\x90\x14\x0f\xfc\x97\x72\xf3\xc6\x7f\x00\xfc\x0d\x91\xe4\x07\ +\x58\x63\x81\xe3\x00\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ +\x82\ +\x00\x00\x07\x66\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\xc8\x00\x00\x00\xc8\x08\x06\x00\x00\x00\xad\x58\xae\x9e\ +\x00\x00\x07\x2d\x49\x44\x41\x54\x78\x5e\xed\xdd\x41\x6e\x1c\x47\ +\x10\x44\xd1\xf1\x7d\xfa\x0e\xb2\x4e\x26\xe9\x64\xa6\xef\xd0\xf7\ +\xb1\x41\x40\xf0\x4e\x46\xf5\x00\x91\x08\x28\x1f\xd7\x39\x31\x59\ +\x3f\xea\xa3\x36\x04\xf9\xc7\xcb\x0f\x02\x08\xfc\x92\xc0\x1f\xd8\ +\x20\x80\xc0\xaf\x09\x10\xc4\xed\x40\xe0\x7f\x08\x10\xc4\xf5\x40\ +\x80\x20\xee\x00\x02\xef\x11\xf0\x82\xbc\xc7\xcd\xa7\x96\x10\x20\ +\xc8\x92\xa2\x1d\xf3\x3d\x02\x04\x79\x8f\x9b\x4f\x2d\x21\x40\x90\ +\x25\x45\x3b\xe6\x7b\x04\x08\xf2\x1e\x37\x9f\x5a\x42\x80\x20\x4b\ +\x8a\x76\xcc\xf7\x08\x10\xe4\x3d\x6e\x3e\xb5\x84\xc0\x63\x41\xae\ +\xeb\xfa\xd6\xc8\xe6\xbe\xef\x1f\x8d\x7b\x6d\xdc\xe9\xba\xae\x3f\ +\x5f\xaf\xd7\x97\xc2\xb3\xff\x7d\xdf\xf7\xc7\x93\xbd\xde\x11\xe4\ +\xaf\xd7\xeb\xf5\x09\xa0\xe9\xe7\xe3\xbe\xef\xaf\x4d\x0b\x6d\xde\ +\xe5\xa7\x20\x9f\xf7\xa4\xed\xe7\x2b\x41\xda\x2a\x59\xb8\x0f\x41\ +\xbc\x20\x0b\xaf\xfd\xf9\x91\x09\x42\x90\xf3\xdb\xb2\x70\x92\x20\ +\x04\x59\x78\xed\xcf\x8f\x4c\x10\x82\x9c\xdf\x96\x85\x93\x04\x21\ +\xc8\xc2\x6b\x7f\x7e\x64\x82\x10\xe4\xfc\xb6\x2c\x9c\x24\x08\x41\ +\x16\x5e\xfb\xf3\x23\x13\x84\x20\xe7\xb7\x65\xe1\x24\x41\x08\xb2\ +\xf0\xda\x9f\x1f\x99\x20\x04\x39\xbf\x2d\x0b\x27\x09\xf2\x4c\x10\ +\xbf\x27\xb5\x50\x92\xf4\x91\xdf\x94\xb0\xf2\x77\xb1\x08\x92\xbe\ +\x2d\x0b\xf3\x09\xb2\xb0\x74\x47\x3e\x27\x40\x90\x73\x56\x26\x17\ +\x12\x20\xc8\xc2\xd2\x1d\xf9\x9c\x00\x41\xce\x59\x99\x5c\x48\x80\ +\x20\x0b\x4b\x77\xe4\x73\x02\x04\x39\x67\x65\x72\x21\x01\x82\x2c\ +\x2c\xdd\x91\xcf\x09\x10\xe4\x9c\x95\xc9\x85\x04\x08\xb2\xb0\x74\ +\x47\x3e\x27\x40\x90\x73\x56\x26\x17\x12\x20\xc8\xc2\xd2\x1d\xf9\ +\x9c\x00\x41\xce\x59\x99\x5c\x48\x80\x20\x0b\x4b\x77\xe4\x73\x02\ +\x04\x39\x67\x65\x72\x21\x01\x82\x2c\x2c\xdd\x91\xcf\x09\x10\xe4\ +\x9c\x95\xc9\x85\x04\x08\xb2\xb0\x74\x47\x3e\x27\x40\x90\x73\x56\ +\x26\x17\x12\x20\xc8\xc2\xd2\x1d\xf9\x9c\x00\x41\xce\x59\x99\x5c\ +\x48\x80\x20\x0b\x4b\x77\xe4\x73\x02\x04\x39\x67\x65\x72\x21\x01\ +\x82\x2c\x2c\xdd\x91\xcf\x09\xd4\x0a\x72\x7e\x84\xd9\xc9\xeb\xba\ +\xfe\x99\xfd\x46\xdf\xf6\x7f\x04\xee\xfb\x7e\xfc\x0f\x62\x1b\x89\ +\xfe\x16\x87\xf8\x04\x4b\x90\xae\xeb\x45\x90\xae\x3e\x08\x52\xd6\ +\x07\x41\xca\x0a\xf1\x82\x74\x15\x42\x90\xae\x3e\xbc\x20\x65\x7d\ +\x10\xa4\xac\x10\x2f\x48\x57\x21\x04\xe9\xea\xc3\x0b\x52\xd6\x07\ +\x41\xca\x0a\xf1\x82\x74\x15\x42\x90\xae\x3e\xbc\x20\x65\x7d\x10\ +\xa4\xac\x10\x2f\x48\x57\x21\x04\xe9\xea\xc3\x0b\x52\xd6\x07\x41\ +\xca\x0a\xf1\x82\x74\x15\x42\x90\xae\x3e\xbc\x20\x65\x7d\x10\xa4\ +\xac\x10\x2f\x48\x57\x21\x04\xe9\xea\xc3\x0b\x52\xd6\x07\x41\xca\ +\x0a\xf1\x82\x74\x15\x42\x90\xae\x3e\xbc\x20\x65\x7d\x10\xa4\xac\ +\x10\x2f\x48\x57\x21\x04\xe9\xea\xc3\x0b\x52\xd6\x07\x41\xca\x0a\ +\xf1\x82\x74\x15\x42\x90\xae\x3e\xbc\x20\x65\x7d\x10\xa4\xac\x10\ +\x2f\x48\x57\x21\x04\xe9\xea\xc3\x0b\x52\xd6\x07\x41\xca\x0a\xf1\ +\x82\x74\x15\x42\x90\xae\x3e\xbc\x20\x65\x7d\x10\xa4\xac\x90\xc6\ +\x75\xae\xeb\xfa\xf6\x7a\xbd\xbe\x87\x77\xfb\x7e\xdf\xf7\x8f\xf0\ +\x77\xac\x8d\xff\x6d\xfe\x70\x5c\x63\x83\x04\x69\x6c\xe5\xd9\x4e\ +\x04\x79\xc6\xeb\xd1\x34\x41\x1e\xe1\xaa\x1c\x26\x48\xb0\x16\x82\ +\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\ +\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\ +\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\ +\x04\x09\x82\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\ +\x14\x4d\x90\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\ +\xb8\x43\xd1\x04\x09\x82\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\ +\x12\x84\x3b\x14\x4d\x90\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\ +\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\x26\x48\x10\xee\x50\x34\x41\ +\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\x20\x68\x82\x04\xe1\x0e\x45\ +\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\x26\x48\x10\xee\ +\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\x20\x68\x82\x04\ +\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\x26\ +\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\x20\ +\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\ +\x09\x82\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\ +\x4d\x90\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\ +\x43\xd1\x04\x09\x82\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\ +\x84\x3b\x14\x4d\x90\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\ +\x20\x41\xb8\x43\xd1\x04\x09\x82\x26\x48\x10\xee\x50\x34\x41\x82\ +\xa0\x09\x12\x84\x3b\x14\x4d\x90\x20\x68\x82\x04\xe1\x0e\x45\x13\ +\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\x26\x48\x10\xee\x50\ +\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\x20\x68\x82\x04\xe1\ +\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\x26\x48\ +\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\x20\x68\ +\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\ +\x82\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\ +\x90\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\ +\xd1\x04\x09\x82\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\ +\x3b\x14\x4d\x90\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\ +\x41\xb8\x43\xd1\x04\x09\x82\x26\x48\x10\xee\x50\x34\x41\x82\xa0\ +\x09\x12\x84\x3b\x14\x4d\x90\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\ +\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\x26\x48\x10\xee\x50\x34\ +\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\x20\x68\x82\x04\xe1\x0e\ +\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\x26\x48\x10\ +\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\x20\x68\x82\ +\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\ +\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\ +\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\ +\x04\x09\x82\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\ +\x14\xfd\x58\x90\xeb\xba\xfe\x7a\xbd\x5e\x7f\x3e\xd8\xef\xe3\xbe\ +\xef\xaf\x0f\xe6\x7f\x9b\x51\x82\xe4\xaa\xbc\xae\xeb\xf3\x0e\x7e\ +\xde\xc5\x27\x3f\x5f\xef\xfb\xfe\x78\xf2\x01\x82\x3c\xa1\xf5\x70\ +\x96\x20\x0f\x81\x3d\x18\x27\xc8\x03\x58\xad\xa3\x04\xc9\x35\x43\ +\x90\x1c\xdb\xb1\x64\x82\xe4\x50\x13\x24\xc7\x76\x2c\x99\x20\x39\ +\xd4\x04\xc9\xb1\x1d\x4b\x26\x48\x0e\x35\x41\x72\x6c\xc7\x92\x09\ +\x92\x43\x4d\x90\x1c\xdb\xb1\x64\x82\xe4\x50\x13\x24\xc7\x76\x2c\ +\x99\x20\x39\xd4\x04\xc9\xb1\x1d\x4b\x26\x48\x0e\x35\x41\x72\x6c\ +\xc7\x92\x09\x92\x43\x4d\x90\x1c\xdb\xb1\x64\x82\xe4\x50\x13\x24\ +\xc7\x76\x2c\xf9\xa7\x20\xf1\xef\xbb\xef\xfb\x47\xfc\x4b\xca\xbe\ +\x80\x20\x65\x85\x58\xa7\x8b\x00\x41\xba\xfa\xb0\x4d\x19\x01\x82\ +\x94\x15\x62\x9d\x2e\x02\x04\xe9\xea\xc3\x36\x65\x04\x08\x52\x56\ +\x88\x75\xba\x08\x10\xa4\xab\x0f\xdb\x94\x11\x20\x48\x59\x21\xd6\ +\xe9\x22\x40\x90\xae\x3e\x6c\x53\x46\x80\x20\x65\x85\x58\xa7\x8b\ +\x00\x41\xba\xfa\xb0\x4d\x19\x01\x82\x94\x15\x62\x9d\x2e\x02\x04\ +\xe9\xea\xc3\x36\x65\x04\x7e\x27\x41\x26\xd0\xae\xfd\xe3\x74\x13\ +\x70\x9f\x7e\xc7\x9b\x97\xf7\xe9\xd7\xbc\x33\x5f\xf9\x87\xe3\xde\ +\x39\xc8\xd3\xcf\x10\xe4\x29\xb1\xe0\x3c\x41\x9e\xfd\xe9\xd1\x60\ +\x15\xff\x45\x13\x64\x82\xf2\xe1\x77\x10\x84\x20\x87\x57\x65\xe7\ +\x18\x41\x08\xb2\xf3\xe6\x1f\x9e\x9a\x20\x04\x39\xbc\x2a\x3b\xc7\ +\x08\x42\x90\x9d\x37\xff\xf0\xd4\x04\x21\xc8\xe1\x55\xd9\x39\x46\ +\x10\x82\xec\xbc\xf9\x87\xa7\x26\x08\x41\x0e\xaf\xca\xce\x31\x82\ +\x10\x64\xe7\xcd\x3f\x3c\x35\x41\x08\x72\x78\x55\x76\x8e\x6d\x17\ +\xe4\x5b\x63\xed\x1b\xff\x78\x5a\x63\x0f\x9f\x3b\xfd\x14\xe4\x4b\ +\xe1\x7e\x7f\xc7\xff\x89\x67\xe1\xa1\xad\x84\x40\x8c\xc0\xe3\xff\ +\x72\x1b\xdb\x44\x30\x02\x85\x04\x08\x52\x58\x8a\x95\x7a\x08\x10\ +\xa4\xa7\x0b\x9b\x14\x12\x20\x48\x61\x29\x56\xea\x21\x40\x90\x9e\ +\x2e\x6c\x52\x48\x80\x20\x85\xa5\x58\xa9\x87\x00\x41\x7a\xba\xb0\ +\x49\x21\x01\x82\x14\x96\x62\xa5\x1e\x02\x04\xe9\xe9\xc2\x26\x85\ +\x04\x08\x52\x58\x8a\x95\x7a\x08\x10\xa4\xa7\x0b\x9b\x14\x12\xf8\ +\x17\xc5\x5a\x12\x14\xba\xe4\x5b\x22\x00\x00\x00\x00\x49\x45\x4e\ +\x44\xae\x42\x60\x82\ +\x00\x00\x0a\x31\ +\x73\ +\x61\x76\x65\x41\x73\x44\x65\x74\x61\x69\x6c\x3d\xe5\xb0\x87\xe6\ +\xa0\x87\xe7\xad\xbe\xe4\xbf\x9d\xe5\xad\x98\xe5\x88\xb0\xe5\x85\ +\xb6\xe4\xbb\x96\xe6\x96\x87\xe4\xbb\xb6\x0d\x0a\x63\x68\x61\x6e\ +\x67\x65\x53\x61\x76\x65\x44\x69\x72\x3d\xe6\x94\xb9\xe5\x8f\x98\ +\xe5\xad\x98\xe6\x94\xbe\xe7\x9b\xae\xe5\xbd\x95\x0d\x0a\x6f\x70\ +\x65\x6e\x46\x69\x6c\x65\x3d\xe6\x89\x93\xe5\xbc\x80\xe6\x96\x87\ +\xe4\xbb\xb6\x0d\x0a\x73\x68\x61\x70\x65\x4c\x69\x6e\x65\x43\x6f\ +\x6c\x6f\x72\x44\x65\x74\x61\x69\x6c\x3d\xe6\x9b\xb4\xe6\x94\xb9\ +\xe7\xba\xbf\xe6\x9d\xa1\xe9\xa2\x9c\xe8\x89\xb2\x0d\x0a\x72\x65\ +\x73\x65\x74\x41\x6c\x6c\x3d\xe9\x87\x8d\xe7\xbd\xae\xe7\x95\x8c\ +\xe9\x9d\xa2\xe4\xb8\x8e\xe4\xbf\x9d\xe5\xad\x98\xe5\x9c\xb0\xe5\ +\x9d\x80\x0d\x0a\x63\x72\x74\x42\x6f\x78\x3d\xe7\x9f\xa9\xe5\xbd\ +\xa2\xe6\xa0\x87\xe6\xb3\xa8\x0d\x0a\x63\x72\x74\x42\x6f\x78\x44\ +\x65\x74\x61\x69\x6c\x3d\xe5\x88\x9b\xe5\xbb\xba\xe4\xb8\x80\xe4\ +\xb8\xaa\xe6\x96\xb0\xe7\x9a\x84\xe5\x8c\xba\xe5\x9d\x97\x0d\x0a\ +\x64\x75\x70\x42\x6f\x78\x44\x65\x74\x61\x69\x6c\x3d\xe5\xa4\x8d\ +\xe5\x88\xb6\xe5\x8c\xba\xe5\x9d\x97\x0d\x0a\x76\x65\x72\x69\x66\ +\x79\x49\x6d\x67\x3d\xe9\xaa\x8c\xe8\xaf\x81\xe5\x9b\xbe\xe5\x83\ +\x8f\x0d\x0a\x7a\x6f\x6f\x6d\x69\x6e\x44\x65\x74\x61\x69\x6c\x3d\ +\xe6\x94\xbe\xe5\xa4\xa7\x0d\x0a\x76\x65\x72\x69\x66\x79\x49\x6d\ +\x67\x44\x65\x74\x61\x69\x6c\x3d\xe9\xaa\x8c\xe8\xaf\x81\xe5\x9b\ +\xbe\xe5\x83\x8f\x0d\x0a\x73\x61\x76\x65\x44\x65\x74\x61\x69\x6c\ +\x3d\xe4\xbf\x9d\xe5\xad\x98\xe6\xa0\x87\xe7\xad\xbe\xe6\x96\x87\ +\xe4\xbb\xb6\x0d\x0a\x6f\x70\x65\x6e\x46\x69\x6c\x65\x44\x65\x74\ +\x61\x69\x6c\x3d\xe6\x89\x93\xe5\xbc\x80\xe5\x9b\xbe\xe5\x83\x8f\ +\xe6\x96\x87\xe4\xbb\xb6\x0d\x0a\x66\x69\x74\x57\x69\x64\x74\x68\ +\x44\x65\x74\x61\x69\x6c\x3d\xe8\xb0\x83\xe6\x95\xb4\xe5\xae\xbd\ +\xe5\xba\xa6\xe9\x80\x82\xe5\xba\x94\xe5\x88\xb0\xe7\xaa\x97\xe5\ +\x8f\xa3\xe5\xae\xbd\xe5\xba\xa6\x0d\x0a\x74\x75\x74\x6f\x72\x69\ +\x61\x6c\x3d\x50\x61\x64\x64\x6c\x65\x4f\x43\x52\xe5\x9c\xb0\xe5\ +\x9d\x80\x0d\x0a\x65\x64\x69\x74\x4c\x61\x62\x65\x6c\x3d\xe7\xbc\ +\x96\xe8\xbe\x91\xe6\xa0\x87\xe7\xad\xbe\x0d\x0a\x6f\x70\x65\x6e\ +\x41\x6e\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x44\x65\x74\x61\x69\x6c\ +\x3d\xe6\x89\x93\xe5\xbc\x80\xe6\xa0\x87\xe7\xad\xbe\xe6\x96\x87\ +\xe4\xbb\xb6\x0d\x0a\x71\x75\x69\x74\x3d\xe9\x80\x80\xe5\x87\xba\ +\x0d\x0a\x73\x68\x61\x70\x65\x46\x69\x6c\x6c\x43\x6f\x6c\x6f\x72\ +\x44\x65\x74\x61\x69\x6c\x3d\xe6\x9b\xb4\xe6\x94\xb9\xe5\xa1\xab\ +\xe5\x85\x85\xe9\xa2\x9c\xe8\x89\xb2\x0d\x0a\x63\x6c\x6f\x73\x65\ +\x43\x75\x72\x44\x65\x74\x61\x69\x6c\x3d\xe5\x85\xb3\xe9\x97\xad\ +\xe5\xbd\x93\xe5\x89\x8d\xe6\x96\x87\xe4\xbb\xb6\x0d\x0a\x63\x6c\ +\x6f\x73\x65\x43\x75\x72\x3d\xe5\x85\xb3\xe9\x97\xad\xe6\x96\x87\ +\xe4\xbb\xb6\x0d\x0a\x64\x65\x6c\x65\x74\x65\x49\x6d\x67\x3d\xe5\ +\x88\xa0\xe9\x99\xa4\xe5\x9b\xbe\xe5\x83\x8f\x0d\x0a\x64\x65\x6c\ +\x65\x74\x65\x49\x6d\x67\x44\x65\x74\x61\x69\x6c\x3d\xe5\x88\xa0\ +\xe9\x99\xa4\xe5\xbd\x93\xe5\x89\x8d\xe5\x9b\xbe\xe5\x83\x8f\x0d\ +\x0a\x66\x69\x74\x57\x69\x6e\x3d\xe8\xb0\x83\xe6\x95\xb4\xe5\x88\ +\xb0\xe7\xaa\x97\xe5\x8f\xa3\xe5\xa4\xa7\xe5\xb0\x8f\x0d\x0a\x64\ +\x65\x6c\x42\x6f\x78\x3d\xe5\x88\xa0\xe9\x99\xa4\xe9\x80\x89\xe6\ +\x8b\xa9\xe7\x9a\x84\xe5\x8c\xba\xe5\x9d\x97\x0d\x0a\x62\x6f\x78\ +\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\x44\x65\x74\x61\x69\x6c\x3d\ +\xe9\x80\x89\xe6\x8b\xa9\xe7\xba\xbf\xe6\xa1\x86\xe9\xa2\x9c\xe8\ +\x89\xb2\x0d\x0a\x6f\x72\x69\x67\x69\x6e\x61\x6c\x73\x69\x7a\x65\ +\x3d\xe5\x8e\x9f\xe5\xa7\x8b\xe5\xa4\xa7\xe5\xb0\x8f\x0d\x0a\x72\ +\x65\x73\x65\x74\x41\x6c\x6c\x44\x65\x74\x61\x69\x6c\x3d\xe9\x87\ +\x8d\xe7\xbd\xae\xe6\x89\x80\xe6\x9c\x89\xe8\xae\xbe\xe5\xae\x9a\ +\x0d\x0a\x7a\x6f\x6f\x6d\x6f\x75\x74\x44\x65\x74\x61\x69\x6c\x3d\ +\xe6\x94\xbe\xe5\xa4\xa7\xe7\x94\xbb\xe9\x9d\xa2\x0d\x0a\x73\x61\ +\x76\x65\x3d\xe4\xbf\x9d\xe5\xad\x98\x0d\x0a\x73\x61\x76\x65\x41\ +\x73\x3d\xe5\x8f\xa6\xe5\xad\x98\xe4\xb8\xba\x0d\x0a\x66\x69\x74\ +\x57\x69\x6e\x44\x65\x74\x61\x69\x6c\x3d\xe7\xbc\xa9\xe6\x94\xbe\ +\xe5\x88\xb0\xe5\xbd\x93\xe5\x89\x8d\xe7\xaa\x97\xe5\x8f\xa3\xe5\ +\xa4\xa7\xe5\xb0\x8f\x0d\x0a\x6f\x70\x65\x6e\x44\x69\x72\x3d\xe6\ +\x89\x93\xe5\xbc\x80\xe7\x9b\xae\xe5\xbd\x95\x0d\x0a\x63\x6f\x70\ +\x79\x50\x72\x65\x76\x42\x6f\x75\x6e\x64\x69\x6e\x67\x3d\xe5\xa4\ +\x8d\xe5\x88\xb6\xe5\xbd\x93\xe5\x89\x8d\xe5\x9b\xbe\xe5\x83\x8f\ +\xe4\xb8\xad\xe7\x9a\x84\xe4\xb8\x8a\xe4\xb8\x80\xe4\xb8\xaa\xe8\ +\xbe\xb9\xe7\x95\x8c\xe6\xa1\x86\x0d\x0a\x73\x68\x6f\x77\x48\x69\ +\x64\x65\x3d\xe6\x98\xbe\xe7\xa4\xba\x2f\xe9\x9a\x90\xe8\x97\x8f\ +\xe6\xa0\x87\xe7\xad\xbe\x0d\x0a\x63\x68\x61\x6e\x67\x65\x53\x61\ +\x76\x65\x46\x6f\x72\x6d\x61\x74\x3d\xe6\x9b\xb4\xe6\x94\xb9\xe5\ +\xad\x98\xe5\x82\xa8\xe6\xa0\xbc\xe5\xbc\x8f\x0d\x0a\x73\x68\x61\ +\x70\x65\x46\x69\x6c\x6c\x43\x6f\x6c\x6f\x72\x3d\xe5\xa1\xab\xe5\ +\x85\x85\xe9\xa2\x9c\xe8\x89\xb2\x0d\x0a\x71\x75\x69\x74\x41\x70\ +\x70\x3d\xe9\x80\x80\xe5\x87\xba\xe7\xa8\x8b\xe5\xba\x8f\x0d\x0a\ +\x64\x75\x70\x42\x6f\x78\x3d\xe5\xa4\x8d\xe5\x88\xb6\xe5\x8c\xba\ +\xe5\x9d\x97\x0d\x0a\x64\x65\x6c\x42\x6f\x78\x44\x65\x74\x61\x69\ +\x6c\x3d\xe5\x88\xa0\xe9\x99\xa4\xe5\x8c\xba\xe5\x9d\x97\x0d\x0a\ +\x7a\x6f\x6f\x6d\x69\x6e\x3d\xe6\x94\xbe\xe5\xa4\xa7\xe7\x94\xbb\ +\xe9\x9d\xa2\x0d\x0a\x69\x6e\x66\x6f\x3d\xe4\xbf\xa1\xe6\x81\xaf\ +\x0d\x0a\x6f\x70\x65\x6e\x41\x6e\x6e\x6f\x74\x61\x74\x69\x6f\x6e\ +\x3d\xe5\xbc\x80\xe5\x90\xaf\xe6\xa0\x87\xe7\xad\xbe\x0d\x0a\x70\ +\x72\x65\x76\x49\x6d\x67\x44\x65\x74\x61\x69\x6c\x3d\xe4\xb8\x8a\ +\xe4\xb8\x80\xe4\xb8\xaa\xe5\x9b\xbe\xe5\x83\x8f\x0d\x0a\x66\x69\ +\x74\x57\x69\x64\x74\x68\x3d\xe7\xbc\xa9\xe6\x94\xbe\xe5\x88\xb0\ +\xe8\xb7\x9f\xe5\xbd\x93\xe5\x89\x8d\xe7\x94\xbb\xe9\x9d\xa2\xe4\ +\xb8\x80\xe6\xa0\xb7\xe5\xae\xbd\x0d\x0a\x7a\x6f\x6f\x6d\x6f\x75\ +\x74\x3d\xe7\xbc\xa9\xe5\xb0\x8f\xe7\x94\xbb\xe9\x9d\xa2\x0d\x0a\ +\x63\x68\x61\x6e\x67\x65\x53\x61\x76\x65\x64\x41\x6e\x6e\x6f\x74\ +\x61\x74\x69\x6f\x6e\x44\x69\x72\x3d\xe6\x9b\xb4\xe6\x94\xb9\xe4\ +\xbf\x9d\xe5\xad\x98\xe6\xa0\x87\xe7\xad\xbe\xe6\x96\x87\xe4\xbb\ +\xb6\xe7\x9a\x84\xe9\xa2\x84\xe8\xae\xbe\xe7\x9b\xae\xe5\xbd\x95\ +\x0d\x0a\x6e\x65\x78\x74\x49\x6d\x67\x44\x65\x74\x61\x69\x6c\x3d\ +\xe4\xb8\x8b\xe4\xb8\x80\xe4\xb8\xaa\xe5\x9b\xbe\xe5\x83\x8f\x0d\ +\x0a\x6f\x72\x69\x67\x69\x6e\x61\x6c\x73\x69\x7a\x65\x44\x65\x74\ +\x61\x69\x6c\x3d\xe6\x94\xbe\xe5\xa4\xa7\xe5\x88\xb0\xe5\x8e\x9f\ +\xe5\xa7\x8b\xe5\xa4\xa7\xe5\xb0\x8f\x0d\x0a\x70\x72\x65\x76\x49\ +\x6d\x67\x3d\xe4\xb8\x8a\xe4\xb8\x80\xe5\xbc\xa0\x0d\x0a\x74\x75\ +\x74\x6f\x72\x69\x61\x6c\x44\x65\x74\x61\x69\x6c\x3d\xe6\x98\xbe\ +\xe7\xa4\xba\xe7\xa4\xba\xe8\x8c\x83\xe5\x86\x85\xe5\xae\xb9\x0d\ +\x0a\x73\x68\x61\x70\x65\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\x3d\ +\xe5\xbd\xa2\xe7\x8a\xb6\xe7\xba\xbf\xe6\x9d\xa1\xe9\xa2\x9c\xe8\ +\x89\xb2\x0d\x0a\x62\x6f\x78\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\ +\x3d\xe5\x8c\xba\xe5\x9d\x97\xe7\xba\xbf\xe6\x9d\xa1\xe9\xa2\x9c\ +\xe8\x89\xb2\x0d\x0a\x65\x64\x69\x74\x4c\x61\x62\x65\x6c\x44\x65\ +\x74\x61\x69\x6c\x3d\xe4\xbf\xae\xe6\x94\xb9\xe5\xbd\x93\xe5\x89\ +\x8d\xe6\x89\x80\xe9\x80\x89\xe7\x9a\x84\xe5\x8c\xba\xe5\x9d\x97\ +\xe9\xa2\x9c\xe8\x89\xb2\x0d\x0a\x6e\x65\x78\x74\x49\x6d\x67\x3d\ +\xe4\xb8\x8b\xe4\xb8\x80\xe5\xbc\xa0\x0d\x0a\x75\x73\x65\x44\x65\ +\x66\x61\x75\x6c\x74\x4c\x61\x62\x65\x6c\x3d\xe4\xbd\xbf\xe7\x94\ +\xa8\xe9\xa2\x84\xe8\xae\xbe\xe6\xa0\x87\xe7\xad\xbe\x0d\x0a\x75\ +\x73\x65\x44\x69\x66\x66\x69\x63\x75\x6c\x74\x3d\xe6\x9c\x89\xe9\ +\x9a\xbe\xe5\xba\xa6\xe7\x9a\x84\x0d\x0a\x62\x6f\x78\x4c\x61\x62\ +\x65\x6c\x54\x65\x78\x74\x3d\xe5\x8c\xba\xe5\x9d\x97\xe7\x9a\x84\ +\xe6\xa0\x87\xe7\xad\xbe\x0d\x0a\x6c\x61\x62\x65\x6c\x73\x3d\xe6\ +\xa0\x87\xe7\xad\xbe\x0d\x0a\x61\x75\x74\x6f\x53\x61\x76\x65\x4d\ +\x6f\x64\x65\x3d\xe8\x87\xaa\xe5\x8a\xa8\xe4\xbf\x9d\xe5\xad\x98\ +\xe6\xa8\xa1\xe5\xbc\x8f\x0d\x0a\x73\x69\x6e\x67\x6c\x65\x43\x6c\ +\x73\x4d\x6f\x64\x65\x3d\xe5\x8d\x95\xe4\xb8\x80\xe7\xb1\xbb\xe5\ +\x88\xab\xe6\xa8\xa1\xe5\xbc\x8f\x0d\x0a\x64\x69\x73\x70\x6c\x61\ +\x79\x4c\x61\x62\x65\x6c\x3d\xe6\x98\xbe\xe7\xa4\xba\xe7\xb1\xbb\ +\xe5\x88\xab\x0d\x0a\x66\x69\x6c\x65\x4c\x69\x73\x74\x3d\xe6\x96\ +\x87\xe4\xbb\xb6\xe5\x88\x97\xe8\xa1\xa8\x0d\x0a\x66\x69\x6c\x65\ +\x73\x3d\xe6\x96\x87\xe4\xbb\xb6\x0d\x0a\x61\x64\x76\x61\x6e\x63\ +\x65\x64\x4d\x6f\x64\x65\x3d\xe4\xb8\x93\xe5\xae\xb6\xe6\xa8\xa1\ +\xe5\xbc\x8f\x0d\x0a\x61\x64\x76\x61\x6e\x63\x65\x64\x4d\x6f\x64\ +\x65\x44\x65\x74\x61\x69\x6c\x3d\xe5\x88\x87\xe6\x8d\xa2\xe5\x88\ +\xb0\xe4\xb8\x93\xe5\xae\xb6\xe6\xa8\xa1\xe5\xbc\x8f\x0d\x0a\x73\ +\x68\x6f\x77\x41\x6c\x6c\x42\x6f\x78\x44\x65\x74\x61\x69\x6c\x3d\ +\xe6\x98\xbe\xe7\xa4\xba\xe6\x89\x80\xe6\x9c\x89\xe5\x8c\xba\xe5\ +\x9d\x97\x0d\x0a\x68\x69\x64\x65\x41\x6c\x6c\x42\x6f\x78\x44\x65\ +\x74\x61\x69\x6c\x3d\xe9\x9a\x90\xe8\x97\x8f\xe6\x89\x80\xe6\x9c\ +\x89\xe5\x8c\xba\xe5\x9d\x97\x0d\x0a\x61\x6e\x6e\x6f\x50\x61\x6e\ +\x65\x6c\x3d\xe6\xa0\x87\xe6\xb3\xa8\xe9\x9d\xa2\xe6\x9d\xbf\x0d\ +\x0a\x61\x6e\x6e\x6f\x3d\xe6\xa0\x87\xe6\xb3\xa8\x0d\x0a\x61\x64\ +\x64\x4e\x65\x77\x42\x62\x6f\x78\x3d\xe6\x96\xb0\xe6\xa1\x86\x0d\ +\x0a\x72\x65\x4c\x61\x62\x65\x6c\x3d\xe9\x87\x8d\xe6\xa0\x87\xe6\ +\xb3\xa8\x0d\x0a\x63\x68\x6f\x6f\x73\x65\x6d\x6f\x64\x65\x6c\x3d\ +\xe9\x80\x89\xe6\x8b\xa9\xe6\xa8\xa1\xe5\x9e\x8b\x0d\x0a\x74\x69\ +\x70\x63\x68\x6f\x6f\x73\x65\x6d\x6f\x64\x65\x6c\x3d\xe9\x80\x89\ +\xe6\x8b\xa9\x4f\x43\x52\xe6\xa8\xa1\xe5\x9e\x8b\x0d\x0a\x49\x6d\ +\x61\x67\x65\x52\x65\x73\x69\x7a\x65\x3d\xe5\x9b\xbe\xe7\x89\x87\ +\xe7\xbc\xa9\xe6\x94\xbe\x0d\x0a\x49\x52\x3d\xe5\x9b\xbe\xe7\x89\ +\x87\xe7\xbc\xa9\xe6\x94\xbe\x0d\x0a\x61\x75\x74\x6f\x52\x65\x63\ +\x6f\x67\x6e\x69\x74\x69\x6f\x6e\x3d\xe8\x87\xaa\xe5\x8a\xa8\xe6\ +\xa0\x87\xe6\xb3\xa8\x0d\x0a\x72\x65\x52\x65\x63\x6f\x67\x6e\x69\ +\x74\x69\x6f\x6e\x3d\xe9\x87\x8d\xe6\x96\xb0\xe8\xaf\x86\xe5\x88\ +\xab\x0d\x0a\x6d\x66\x69\x6c\x65\x3d\xe6\x96\x87\xe4\xbb\xb6\x0d\ +\x0a\x6d\x65\x64\x69\x74\x3d\xe7\xbc\x96\xe8\xbe\x91\x0d\x0a\x6d\ +\x76\x69\x65\x77\x3d\xe8\xa7\x86\xe5\x9b\xbe\x0d\x0a\x6d\x68\x65\ +\x6c\x70\x3d\xe5\xb8\xae\xe5\x8a\xa9\x0d\x0a\x69\x63\x6f\x6e\x4c\ +\x69\x73\x74\x3d\xe7\xbc\xa9\xe7\x95\xa5\xe5\x9b\xbe\x0d\x0a\x64\ +\x65\x74\x65\x63\x74\x69\x6f\x6e\x42\x6f\x78\x70\x6f\x73\x69\x74\ +\x69\x6f\x6e\x3d\xe6\xa3\x80\xe6\xb5\x8b\xe6\xa1\x86\xe4\xbd\x8d\ +\xe7\xbd\xae\x0d\x0a\x72\x65\x63\x6f\x67\x6e\x69\x74\x69\x6f\x6e\ +\x52\x65\x73\x75\x6c\x74\x3d\xe8\xaf\x86\xe5\x88\xab\xe7\xbb\x93\ +\xe6\x9e\x9c\x0d\x0a\x63\x72\x65\x61\x74\x50\x6f\x6c\x79\x67\x6f\ +\x6e\x3d\xe5\x9b\x9b\xe7\x82\xb9\xe6\xa0\x87\xe6\xb3\xa8\x0d\x0a\ +\x64\x72\x61\x77\x53\x71\x75\x61\x72\x65\x73\x3d\xe6\xad\xa3\xe6\ +\x96\xb9\xe5\xbd\xa2\xe6\xa0\x87\xe6\xb3\xa8\x0d\x0a\x73\x61\x76\ +\x65\x52\x65\x63\x3d\xe4\xbf\x9d\xe5\xad\x98\xe8\xaf\x86\xe5\x88\ +\xab\xe7\xbb\x93\xe6\x9e\x9c\x0d\x0a\x74\x65\x6d\x70\x4c\x61\x62\ +\x65\x6c\x3d\xe5\xbe\x85\xe8\xaf\x86\xe5\x88\xab\x0d\x0a\x73\x74\ +\x65\x70\x73\x3d\xe6\x93\x8d\xe4\xbd\x9c\xe6\xad\xa5\xe9\xaa\xa4\ +\ +\x00\x00\x04\x4b\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x12\x00\x00\ +\x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ +\xd2\x01\x07\x0b\x04\x27\xfe\xa6\x99\x03\x00\x00\x03\xc8\x49\x44\ +\x41\x54\x78\xda\xb5\x96\xc1\x4b\x1c\x67\x14\xc0\x7f\xdf\xb7\x3a\ +\x8b\xee\xae\x6e\xdd\x55\x10\xa3\x2b\x9a\x43\x2f\x5a\x0d\x7a\x70\ +\x84\x28\xe8\x65\x23\xae\x04\xeb\x51\x3d\xd4\xc3\x5e\x52\x30\x37\ +\xff\x02\x0f\x42\xc0\xff\xa0\x3d\x84\x1e\x96\x88\x94\x56\xd0\x9e\ +\x84\x44\xa3\xd2\x9a\x88\x20\xba\x4a\x52\xc1\x48\x58\x11\x5a\x75\ +\x67\x66\x67\xbe\x99\x5e\xdc\xa9\x6d\xa3\x96\x62\x3f\x78\xf0\x78\ +\xf3\x78\xbf\xef\xbd\xc7\x7b\xdf\xc0\xff\x7c\xc4\x75\x1f\x92\xc9\ +\x64\x2a\x97\xcb\x8d\x58\x96\xa5\x3b\x8e\xd3\xa0\x94\x02\x38\x04\ +\x56\x2a\x2b\x2b\x33\x1b\x1b\x1b\xdf\xff\x27\xc0\xe8\xe8\xe8\x83\ +\xb7\x6f\xdf\x3e\x93\x52\xf6\xf4\xf5\xf5\xd1\xda\xda\x4a\x2c\x16\ +\xc3\x75\x5d\x72\xb9\x1c\xeb\xeb\xeb\x2c\x2e\x2e\xe2\x38\xce\x72\ +\x5d\x5d\xdd\xd3\xb5\xb5\xb5\x5f\xfe\x35\xa0\xb7\xb7\x37\x75\x7c\ +\x7c\xfc\x42\xd7\xf5\x92\xe1\xe1\x61\x6a\x6a\x6a\x28\x2d\x2d\x45\ +\x08\x81\xeb\xba\xd8\xb6\x8d\x69\x9a\x7c\xf8\xf0\x81\xe7\xcf\x9f\ +\xb3\xba\xba\xea\x44\xa3\xd1\xe1\x83\x83\x83\x6b\xb3\x09\x14\x95\ +\xa1\xa1\xa1\x07\xd9\x6c\xf6\xa7\xc7\x8f\x1f\x97\x8c\x8f\x8f\x13\ +\x8f\xc7\x89\x44\x22\x54\x55\x55\x11\x8f\xc7\xa9\xae\xae\x26\x16\ +\x8b\x11\x0e\x87\x09\x87\xc3\xb4\xb4\xb4\x60\x18\x86\x7c\xf3\xe6\ +\xcd\xc8\xbd\x7b\xf7\x7e\x3c\x3d\x3d\x3d\xbe\x11\x50\x28\x14\xbe\ +\xd3\x75\xbd\x69\x62\x62\x82\x70\x38\x4c\x34\x1a\xa5\xba\xba\x9a\ +\x70\x38\x4c\x30\x18\x24\x10\x08\x10\x08\x04\x08\x06\x83\x44\x22\ +\x11\x42\xa1\x10\xcd\xcd\xcd\xec\xed\xed\xc9\xfd\xfd\xfd\xcf\x2d\ +\xcb\xfa\xe6\x53\x00\x09\xd0\xd6\xd6\x96\x72\x5d\xb7\x67\x6c\x6c\ +\x8c\xf2\xf2\x72\xa2\xd1\x28\xf1\x78\x1c\x4d\xd3\x08\x04\x02\x3c\ +\x7a\xf4\x88\x81\x81\x01\x1f\x22\xa5\x24\x14\x0a\xd1\xd4\xd4\x44\ +\x3a\x9d\xc6\xf3\xbc\x9e\xaa\xaa\xaa\xd4\xb5\x80\x5c\x2e\x37\x92\ +\x4a\xa5\xa8\xad\xad\x25\x14\x0a\x51\x51\x51\x81\x10\x02\x29\x25\ +\x42\xfc\xd9\x26\x21\x04\x42\x08\x1f\x22\xa5\xa4\xad\xad\x8d\x64\ +\x32\x89\x61\x18\x23\xd7\x02\x2c\xcb\xd2\xbb\xbb\xbb\xd1\x34\x8d\ +\x48\x24\x82\x10\x02\xcf\xf3\xf0\x3c\xef\x2f\xce\x45\xdb\x55\xbb\ +\x10\x82\xfe\xfe\x7e\x94\x52\xfa\xa7\x00\x25\x00\x4a\xa9\x86\xfa\ +\xfa\x7a\x82\xc1\xa0\x1f\x7c\x60\x60\xc0\x0f\x70\x65\x36\x7c\x40\ +\x26\x93\xf1\xf5\xfb\xf7\xef\x03\x34\xdc\x04\x40\x08\x41\x49\x49\ +\x09\x4a\x29\x94\x52\x78\x9e\xe7\xc3\x3e\x95\x81\x52\x0a\xdb\xb6\ +\x71\x1c\x07\xdb\xb6\xff\x91\xed\xdf\x01\x87\xef\xde\xbd\x6b\xaa\ +\xab\xab\xc3\xb6\x6d\x84\x10\xcc\xcd\xcd\xf9\xb5\x1e\x1c\x1c\x04\ +\x60\x7e\x7e\x1e\xc7\x71\x50\x4a\x61\x9a\x26\xb6\x6d\x53\x28\x14\ +\xd8\xdd\xdd\x45\x29\x75\x78\x6d\x0f\x3c\xcf\x5b\x59\x5a\x5a\xc2\ +\x34\x4d\x0a\x85\x02\x96\x65\x51\x28\x14\x7c\xdd\x75\x5d\x5c\xd7\ +\xf5\x6d\xa6\x69\x62\x18\x06\x96\x65\x61\x59\x16\x8b\x8b\x8b\xb8\ +\xae\xbb\x72\x2d\x40\x4a\x99\xc9\x64\x32\x64\xb3\x59\x0c\xc3\x20\ +\x9f\xcf\x63\x18\x86\x2f\x45\x40\x3e\x9f\xf7\xc5\xb2\x2c\x0c\xc3\ +\x60\x67\x67\x87\x85\x85\x05\x80\xcc\x4d\xab\x22\xa1\x69\xda\xb7\ +\x9d\x9d\x9d\x3d\xb3\xb3\xb3\x68\x9a\x86\x94\x12\x4d\xd3\xfc\x3e\ +\x08\x21\xfc\xfe\x14\x57\xc6\xc5\xc5\x05\x93\x93\x93\x6c\x6d\x6d\ +\x2d\x03\xbd\x37\x4d\xf2\x6f\x52\xca\xad\xa3\xa3\xa3\xaf\x3e\x7e\ +\xfc\x28\xdb\xdb\xdb\xfd\xe6\x15\xcb\x65\x18\x86\x5f\x9e\x7c\x3e\ +\xcf\xd9\xd9\x19\x33\x33\x33\xac\xae\xae\x3a\xc0\xd7\x40\xf6\xc6\ +\x55\xe1\xba\xae\x26\x84\x58\xde\xdd\xdd\x1d\xd9\xdc\xdc\x94\xf5\ +\xf5\xf5\x94\x95\x95\xf9\xc1\x8b\xf5\x3e\x3f\x3f\x67\x7b\x7b\x9b\ +\xe9\xe9\x69\x5e\xbf\x7e\xed\x00\x79\xe0\x4b\xe0\x14\xf8\xf9\xb6\ +\x75\x9d\x00\x62\x42\x88\x67\x52\xca\x9e\x87\x0f\x1f\xd2\xd5\xd5\ +\x45\x63\x63\x23\x00\x07\x07\x07\xbc\x7a\xf5\x8a\x97\x2f\x5f\x02\ +\x2c\x03\x4f\x81\x17\xc0\x67\x97\x97\x3d\x01\x9e\x00\x3f\xdc\xf6\ +\xe0\x24\x80\x2f\x80\x11\x40\xbf\x32\x44\x87\xc0\xca\x65\x43\x4f\ +\x80\x23\x80\xc6\xc6\xc6\x6d\x40\xbc\x7f\xff\x5e\x02\x36\x90\xbc\ +\xf4\xbb\xf5\x24\x6e\x90\xab\x3e\x27\xe9\x74\xda\xee\xe8\xe8\x30\ +\x80\xdf\x2f\xcb\x96\xb8\xcb\xa7\x37\x01\x9c\x4d\x4d\x4d\x29\x5d\ +\xd7\x1d\xe0\x0c\x38\xbf\x4b\x48\x31\x2b\x33\x9d\x4e\xdb\x89\x44\ +\xc2\xbe\x6b\xc0\x55\xc8\x31\xa0\x80\x1e\x20\x21\xee\xf8\x2f\xe5\ +\xea\x8d\x7f\x05\xf8\x03\xd8\xcb\xf0\xd4\x8e\x80\x5e\x37\x00\x00\ +\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x76\x50\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x01\x2a\x00\x00\x01\x08\x08\x06\x00\x00\x00\xe8\x5e\xb9\x12\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\xd0\xcb\x00\x00\ +\xd0\xcb\x01\x9f\x0e\xc0\x23\x00\x00\x00\x09\x76\x70\x41\x67\x00\ +\x00\x01\x2a\x00\x00\x01\x08\x00\xdc\x89\x70\xd2\x00\x00\x74\x99\ +\x49\x44\x41\x54\x78\xda\xed\xbd\x67\x98\x5d\xd7\x79\x1e\xfa\xae\ +\x73\xce\xcc\x99\x72\xa6\x62\x66\x30\x00\x06\x04\x2b\xc0\xde\x04\ +\x52\x50\xa5\x2c\x51\x85\x12\x65\x39\xb2\x64\xcb\x45\x91\xcb\x75\ +\x42\xdf\x9b\x9b\xe7\x96\x27\xbe\x6e\x71\xb9\x56\x6c\xc5\x92\x15\ +\xeb\xda\x4a\x64\x3b\x91\xe4\xc4\x91\x13\x3b\x11\x25\xf6\x02\x12\ +\x20\x08\x90\x60\x01\x09\x90\x00\x89\x4e\xf4\x36\xfd\xcc\xcc\xe9\ +\x7b\xaf\xfb\x63\xb7\x55\xf7\x5e\xfb\x94\x29\xc4\xfe\xf0\x0c\xce\ +\xde\xab\xaf\x5d\xde\xfd\x7e\xdf\x5a\xdf\x5a\x04\x89\x5c\xf6\x32\ +\xba\xe5\x01\xef\xf0\x23\x00\xfe\x0f\x00\xb7\x00\x28\x02\xf8\x01\ +\x80\xff\x02\xe0\x34\x00\x5c\xd8\xfd\x9d\xa5\x6e\x6a\x22\x97\xa9\ +\xa4\x97\xba\x01\x89\x2c\xad\x30\x20\xb5\x05\xc0\xb7\x01\xdc\x03\ +\x60\x00\xc0\x08\x80\x0f\x03\xb8\x19\xc0\x7e\x00\x17\x73\x63\x9b\ +\x31\x7f\xe6\xd5\xa5\x6e\x72\x22\x97\xa1\xa4\x96\xba\x01\x89\x2c\ +\x0b\x69\x03\xf0\xcf\x01\xdc\xaa\x08\xff\x14\x80\xef\x03\xf8\x38\ +\x00\xc2\x00\x5b\x22\x89\x2c\x9a\x24\x40\x95\x08\x00\xf4\x01\xb8\ +\x3d\x24\xfe\x76\x00\x7f\x03\xe0\x17\x01\xb4\x25\x60\x95\xc8\x62\ +\x4b\x02\x54\x89\x00\x40\xb7\xfb\x17\x26\x1b\x00\x7c\x0b\xc0\xff\ +\x05\xa0\x27\x01\xab\x44\x16\x53\x12\xa0\x4a\x24\x8e\x0c\x00\xf8\ +\x7d\x00\xff\x06\xc0\x48\x02\x56\x89\x2c\x96\x24\x40\x95\x48\x5c\ +\xe9\x04\xf0\xeb\x00\xfe\x03\x80\xeb\x46\xb7\x3c\x80\x04\xb0\x12\ +\x69\xb5\x24\x40\x95\x48\x3d\x92\x01\xf0\x79\x00\xdf\x83\x33\x5a\ +\x98\x80\x55\x22\x2d\x95\x04\xa8\x12\x69\x44\x3e\x00\x07\xac\x3e\ +\x07\x20\x95\x80\x55\x22\xad\x92\x04\xa8\x12\x69\x54\xae\x07\xf0\ +\x1d\x00\xff\x0c\x40\x47\x02\x56\x89\xb4\x42\x12\xa0\x4a\xa4\x19\ +\x32\x0a\xe0\x4f\x01\xfc\x0e\x80\xfe\x04\xac\x12\x69\xb6\x24\x40\ +\x95\x48\xa4\xa4\x52\x69\xd0\xe8\x64\x3d\x00\x7e\x03\xc0\x37\x01\ +\x8c\x25\x46\xf6\x44\x9a\x29\x09\x50\x25\x12\x2a\x94\x52\xac\x1d\ +\x1b\xc3\x5d\x77\xde\x8c\x74\x3a\x0d\x4a\x43\x21\xab\x1d\xc0\x57\ +\xe0\x4c\x0e\xbd\x05\x48\x8c\xec\x89\x34\x47\x12\xa0\x4a\x24\x54\ +\x28\x05\x7a\x7b\xba\xf1\x4b\x5f\xfc\x38\x3e\xff\xe9\x0f\xa2\xb3\ +\xb3\x23\x0a\xac\x52\x08\xdc\x6e\x3e\x8a\xc4\xed\x26\x91\x26\x48\ +\x02\x54\x89\x44\x0a\xa5\x14\xb9\xee\x2c\xbe\xf4\x93\x1f\xc2\x57\ +\xbe\xf8\x71\xf4\xf7\xf5\xc0\xb6\x23\x95\xc1\x3b\x01\xfc\x47\x00\ +\x5f\x02\x90\x49\xc0\x2a\x91\x46\x24\x01\xaa\x44\x8c\x84\x52\x8a\ +\xf6\x4c\x06\xf7\x7d\xe4\x4e\xfc\xfa\x57\x3e\x8b\x75\x6b\x86\x4d\ +\xc0\xea\x2a\x00\x7f\x01\x67\xe9\x98\xee\x04\xac\x12\xa9\x57\x12\ +\xa0\x4a\xc4\x58\x28\x00\x42\x08\xde\x77\xe7\x26\xfc\xcb\x5f\xfd\ +\x1c\x6e\xd8\xb8\x21\x4a\x0d\x04\x80\x55\x00\xfe\x10\xc0\x57\x01\ +\x0c\x25\x60\x95\x48\x3d\x92\x00\x55\x22\xb1\x85\x52\x8a\x9b\xae\ +\x1b\xc3\xbf\xfc\x95\xcf\x61\xcb\x7b\x6e\x02\x40\xa2\x00\xab\x0b\ +\xc0\xbf\x80\xb3\xde\xd5\x35\xc9\x88\x60\x22\x71\x25\x01\xaa\x44\ +\xc2\x85\xb8\xbf\x94\xfd\xa1\xb0\x6d\x8a\xf5\xa3\x83\x78\xe0\xcb\ +\x9f\xc6\x27\x7f\xe2\x2e\xb4\xb5\xb5\x45\x81\x55\x06\xc0\xcf\x00\ +\xf8\x2e\x80\xbb\x80\x64\x44\x30\x11\x73\x49\x80\x2a\x11\x23\xa1\ +\x00\xa8\xfb\xbf\x07\x5a\x36\xa5\x18\xec\xeb\xc6\x2f\x7d\xf1\x63\ +\xf8\xe2\x67\xef\x41\x77\x77\x27\xec\x68\x55\xf0\xc3\x70\x46\x04\ +\x3f\x83\xc4\xed\x26\x11\x43\x49\x80\x2a\x11\x73\xa1\x01\x48\x79\ +\x62\x53\x8a\xce\x8e\x76\x7c\xfe\xbe\xf7\xe1\x57\xbe\x74\x1f\x86\ +\x06\xfb\x4d\x8c\xec\x37\x02\xf8\x6b\x00\xbf\x02\x20\x9b\x80\x55\ +\x22\x51\x92\x00\x55\x22\x91\x42\x23\xc2\x29\xa5\x68\x4b\xa7\xf0\ +\xb1\xf7\xdf\x82\xff\xf5\x2b\x9f\xc5\x86\xf5\xa3\x26\xcc\x6a\x2d\ +\x80\x3f\x03\xf0\x9b\x00\xfa\x12\xb0\x4a\x24\x4c\x92\xcd\x1d\x2e\ +\x73\xc9\x8d\x6d\x06\x80\x7e\x00\xff\x14\xce\x08\x1d\x27\x14\xc0\ +\xf0\xc8\x30\x3e\xf0\x9e\x4d\xe8\xca\x66\xfc\x30\xa8\x12\x02\x58\ +\xb7\x7a\x10\xd7\x5e\xb5\x0e\x17\x2e\xcd\xe0\xe2\xf8\x34\x08\x41\ +\x98\x64\x01\xbc\x0f\xc0\x6a\x00\x7b\x72\x63\x9b\xe7\x92\x0d\x24\ +\x12\x51\x49\xc2\xa8\x12\x31\x12\xc7\x3a\x45\x64\x90\x72\xcd\x56\ +\xde\xa1\x4d\x29\x36\x5e\xb9\x06\xff\xdb\x2f\x7d\x16\x1f\xda\x72\ +\x2b\x48\x2a\x15\x65\x64\xcf\x02\xf8\x55\x38\xaa\xe0\x8d\x40\x62\ +\x64\x4f\x44\x96\x04\xa8\x12\x31\x10\xaa\xa6\x51\x54\x79\x08\x9b\ +\xda\x18\x1d\xee\xc3\xaf\xfd\xfc\x27\x71\xff\xbd\x5b\x90\xcd\xb6\ +\x9b\xb8\xdd\x7c\x06\x8e\x91\xfd\xc3\x40\x02\x56\x89\xf0\x92\x00\ +\x55\x22\x86\x22\xa0\x12\x95\x0e\xb9\x74\x94\x52\xf4\xe6\x3a\xf1\ +\xf3\x3f\x75\x0f\x7e\xee\x9f\x7c\x0c\xbd\x3d\x39\x13\x23\xfb\x5d\ +\x70\xa6\x2f\xfc\x0c\x12\xb7\x9b\x44\x18\x49\x80\x2a\x11\x73\x89\ +\x04\x28\x3e\xc4\xb6\x29\xb2\xed\x19\xdc\xff\xd1\xcd\xf8\x5f\x7e\ +\xe1\xd3\x18\x5d\xbd\xca\x04\xac\xae\x81\x33\x31\xf4\x5f\x00\xe8\ +\x4a\xc0\x2a\x11\x20\x31\xa6\x5f\xf6\x12\xcf\x98\xde\xa6\xd0\x00\ +\x15\x21\x42\x10\x21\x04\x57\xac\x1d\xc6\x95\x63\xa3\x38\x7d\x7e\ +\x02\x53\xd3\x79\x90\x70\x2b\x7b\x17\x1c\x15\x30\x07\xc7\xc8\x5e\ +\x4c\x8c\xec\x97\xb7\x24\x8c\x2a\x91\x68\xa1\xe1\x0c\xaa\x5a\xb3\ +\x61\x59\x9e\xca\x27\xe7\x75\xfe\x28\x6e\xd9\x74\x05\xfe\xc5\x2f\ +\xfd\x24\xee\xbc\x75\x93\x49\xad\x5d\x70\x9c\x99\xff\x12\xc0\x95\ +\x40\x62\xb7\xba\x9c\x25\x01\xaa\x44\x62\x08\x85\x08\x59\x04\xc0\ +\xec\x42\x05\x27\x2f\xe6\x51\xae\x58\x20\x62\x72\xe6\xd0\xa6\x14\ +\x1b\xd6\x0d\xe3\x81\x2f\x7f\x06\x1f\xfd\xe0\x9d\x26\x0b\xf1\x65\ +\xe0\x2c\x13\xf3\x5d\x38\xcb\xc6\x24\x60\x75\x99\x4a\x02\x54\x89\ +\x44\x0a\xe5\xff\x93\xe2\x28\xa5\x98\x98\x2d\xe1\xf8\xf9\x59\x2c\ +\x94\xaa\x4c\x26\xe9\x10\x36\xa5\x58\x35\x90\xc3\x57\xbe\x78\x2f\ +\x7e\xea\xbe\x0f\xa2\x2b\x7a\x21\x3e\x02\xe0\x27\xe0\x8c\x08\x7e\ +\x0a\xc9\x42\x7c\x97\xa5\x24\x40\x95\x48\x6c\xa1\x34\xf8\x63\x42\ +\x31\x3b\x5f\xc6\xb1\xb3\x33\x98\x9d\x2f\xbb\x21\xcc\xec\x75\xff\ +\x98\x82\x52\x8a\xee\xce\x2c\x7e\xfa\xbe\xf7\xe3\x17\xbf\xf0\x09\ +\x0c\xf4\xf7\x9a\xcc\x64\xbf\x05\xce\x12\xc7\xbf\x04\xa0\x3d\x01\ +\xab\xcb\x4b\x12\x63\xfa\x65\x2e\x46\xc6\xf4\xe1\x61\xbc\xff\x3d\ +\x9b\xd0\x99\xcd\xc8\x86\x72\x00\x85\x52\x0d\xd3\x73\x0e\x38\x55\ +\x2c\x1b\xf9\x42\x05\xe9\x34\x41\x57\xb6\x0d\x84\x04\x00\xc5\x15\ +\x0a\x20\x9d\x4a\xe1\xaa\x2b\x46\xb1\x76\x74\x18\x27\xcf\x5c\x44\ +\x7e\x6e\x21\xca\xc8\xde\x0b\xe0\x23\x6e\xb5\xaf\xe7\xc6\x36\x57\ +\x12\x23\xfb\xe5\x21\x09\xa3\x4a\xc4\x4c\x28\x00\x10\x45\x18\xcf\ +\x9a\x00\xa0\x5c\xb1\x70\xf2\x42\x1e\xe7\x26\xe7\x61\xd9\x36\x74\ +\x7a\xa0\xb3\x10\x1f\x70\xd7\x6d\xd7\xe2\xd7\xbf\xf2\x93\xb8\x61\ +\xe3\x55\x88\x26\x56\xe8\x03\xf0\xbb\x70\xb6\xe7\x1a\x05\x12\xbb\ +\xd5\xe5\x20\x09\x50\x25\x62\x2e\x14\x92\x3d\x9d\x03\x29\x26\xbc\ +\x66\x51\x9c\x19\x9f\xc3\xa9\x8b\x79\x54\x6b\xb6\x03\x71\x9a\x39\ +\x58\x94\x52\x5c\x7f\xf5\x5a\xfc\xfa\x3f\xbd\x1f\x5b\x36\xdf\x84\ +\x54\x8a\x44\x01\x56\x16\xc0\xaf\xc1\xd9\xf8\x74\x13\x90\x80\xd5\ +\xbb\x5d\x12\xa0\x4a\xc4\x48\x68\xd8\xf4\x4e\x66\x99\x2a\xca\x20\ +\x19\xa5\x14\x17\xa7\x0b\x38\x7e\x6e\x16\x85\x72\xcd\x4f\xaa\x12\ +\xdb\xa6\x58\x3b\x32\x80\x5f\xfd\xb9\x4f\xe1\x13\x1f\x79\x2f\xda\ +\xdb\x23\x17\xe2\x4b\xc3\xd9\x4a\xfe\xfb\x70\xb6\x96\x4f\xc0\xea\ +\x5d\x2c\x09\x50\x25\x62\x2c\xf2\xe4\x84\x00\x9c\xa8\x10\xc3\x1a\ +\xdc\xa7\xe6\x4a\x38\x76\x76\x06\xf9\x42\x45\x5b\xb0\x37\x7d\xa1\ +\xbf\xa7\x0b\x3f\xf7\xb9\x7b\xf0\x85\xcf\xde\x83\x9e\x5c\xb7\xc9\ +\x9a\xec\x5b\x00\x7c\x0f\xc0\xe7\x01\xa4\x13\xb0\x7a\x77\x4a\x02\ +\x54\x89\xc4\x12\x5e\xfb\x53\xcf\x4a\xa7\x0a\x93\x54\xbe\x50\xc5\ +\xb1\xb3\x33\x98\xca\x17\xa5\xc2\x78\x35\xd0\x46\x67\x47\x1b\x3e\ +\xfb\xb1\xbb\xf0\x95\x9f\xfd\x24\x86\x87\x06\x4d\xc0\xea\x3a\x00\ +\xff\x01\xc0\xaf\x03\xe8\x48\xc0\xea\xdd\x27\xc9\xa8\xdf\x65\x2e\ +\x26\xa3\x7e\x43\xc3\xc3\x78\xdf\x1d\x9b\xd0\xd9\x91\x81\xa8\xbc\ +\x11\x00\x0b\xee\xa8\x9f\x0a\xa0\xbc\x03\x02\x8a\xaa\x65\x23\xbf\ +\x50\x01\x21\x04\xdd\x1d\x6d\x20\x84\x5d\x36\x86\x2f\x37\x95\x72\ +\xdc\x6e\xc6\xd6\x8e\xe0\xcc\xf9\x49\x4c\xcf\x44\xba\xdd\x74\x03\ +\xb8\x07\x40\x27\x80\xd7\x72\x63\x9b\x4b\xc9\x88\xe0\xbb\x47\x12\ +\x46\x95\x48\xb4\x88\x96\x72\xf1\x54\x30\x92\xf3\xc9\x79\xee\x55\ +\xa9\xd9\x38\x75\x31\x8f\x53\x97\xe6\x50\xb5\x6c\xbe\x00\xef\x8c\ +\x61\x65\xb7\xdd\x70\x25\x1e\xf8\xf2\xfd\xb8\xed\xe6\xeb\x4c\x5a\ +\xda\x0d\xe0\xff\x06\xf0\x2d\x00\x57\x00\x89\xdd\xea\xdd\x22\x09\ +\x50\x25\x62\x2e\x94\x28\xf1\xca\xff\x65\xfc\xfa\x44\xd3\x3a\x9b\ +\xcf\xb2\x29\xce\x4f\xcc\xe3\x9d\xf3\x33\x28\x57\x6a\xdc\xa4\x07\ +\x51\xcb\xa3\x94\xe2\xaa\xf5\x23\xf8\xb5\x9f\xff\x34\x3e\xfc\xbe\ +\xdb\x4d\xdc\x6e\xda\x00\xfc\x22\x80\xff\x04\xe0\x36\x20\x01\xab\ +\x77\x83\x24\x40\x95\x88\x91\x88\x33\xcc\x25\x42\xa5\x00\x27\x2f\ +\xc8\xdb\x13\x22\x50\x07\x9d\x11\xc1\xf1\x99\x22\x8e\x9e\x9d\xc1\ +\x5c\xb1\x0a\xbf\x08\x55\xdd\x94\x62\x64\x55\x2f\xbe\xfc\x85\x8f\ +\xe1\xfe\x8f\xbf\x1f\x9d\x66\x6e\x37\xf7\x02\xf8\x5b\xf7\x37\x71\ +\xbb\x59\xe1\x92\x00\x55\x22\xc6\x42\x43\x63\x64\xf6\x24\xad\xb8\ +\xe0\xea\x74\x6c\xf8\xcc\x7c\x19\x47\xce\x4c\x63\x6a\xae\x14\x5a\ +\xba\x4d\x29\x7a\xba\x3b\xf1\xf9\xfb\x3e\x80\x2f\xfd\xd4\xc7\xd0\ +\xdf\xdf\x6b\x62\x64\xbf\x0d\x0e\xb3\xfa\x45\x00\x6d\x09\x58\xad\ +\x5c\x49\x80\x2a\x11\x33\x89\xd8\x8a\x46\xcb\x9e\xbc\x48\x4a\xa5\ +\x70\x0f\x67\x16\x8a\x35\x1c\x3b\x3b\x8b\x8b\xd3\x05\x0e\x7c\xc4\ +\xb9\x5a\xd4\xa6\xc8\xb6\xa7\xf1\xf1\x0f\xdd\x86\x5f\xfe\xd2\x7d\ +\x58\xbb\x66\xd8\x04\xac\xae\x80\x63\xb3\xfa\xbf\x01\xe4\x12\xb0\ +\x5a\x99\x92\x00\x55\x22\xf5\x09\x3b\x3b\x9d\x2a\x36\x7e\x60\x26\ +\x52\xa9\x00\x8a\xc5\x17\x42\x80\x72\xb5\x86\x77\xce\xcf\xe2\xcc\ +\xf8\x3c\x2c\x71\x15\x50\x06\xad\x28\xa5\x48\x11\x82\xbb\x6f\xbb\ +\x0e\xbf\xf6\x8b\xf7\x63\xd3\x75\x1b\x4c\x5a\x3b\x00\xe0\xf7\x01\ +\xfc\x09\x80\x91\x04\xac\x56\x9e\x24\xd3\x13\x2e\x73\x31\x9d\x9e\ +\xb0\xe5\xce\x8d\xe8\xca\xb6\xc9\xfb\x3c\x10\x60\xa1\x54\xc5\xf4\ +\x5c\x89\x43\x1f\xe5\x5e\x10\x3a\x1b\x94\x5b\xa8\x4d\x29\xe6\x0a\ +\x15\x54\x6b\x36\xba\x3b\xdb\x90\x49\xa7\xa4\xe5\x65\xd8\x22\x86\ +\x07\x7b\x71\xdd\xd5\xeb\x31\x93\x2f\xe0\xc2\xa5\x49\xd8\x36\x0d\ +\xdb\x9e\x2b\x03\xe0\x3d\x00\xae\x85\xe3\xd0\x3c\x95\x4c\x5f\x58\ +\x39\x92\x30\xaa\x44\xcc\x84\x7a\x33\xd0\xb5\x91\xea\x99\xeb\xca\ +\x25\x61\xbc\x5c\xd4\x07\x29\x2f\xda\xa6\x14\x17\xa6\x16\x70\xf4\ +\xec\x8c\xbb\xb6\x95\x1e\xfc\xa8\x4d\x31\xb6\x7a\x10\xbf\xf4\x33\ +\x1f\xc7\xc7\x3e\xb4\x19\xd9\xac\x91\xdb\xcd\xe7\xe1\xcc\x64\xdf\ +\x02\x24\x23\x82\x2b\x45\x12\xa0\x4a\x24\x52\xd4\x5e\x7e\xe2\x28\ +\x9f\xda\x7d\x46\x2e\xcb\xfd\xe7\x1a\xb3\xa4\x5d\xe2\x3d\xb7\x9b\ +\x7c\x11\x87\x4f\x4f\x63\x76\xa1\xac\x58\x06\x19\x3e\xd3\xa2\xd4\ +\xc6\x40\x5f\x37\x7e\xf6\x27\x3f\x8c\xcf\xdd\xf7\x21\xe4\x72\x5d\ +\x26\x76\xab\x0f\xc0\x01\xab\xcf\x01\x48\x25\x60\xb5\xfc\x25\x01\ +\xaa\x44\x0c\x44\xc5\x95\xf8\xa8\x30\x70\x72\x92\x05\xec\x49\x3d\ +\x22\x08\x9f\xb5\x79\x31\x73\x85\x0a\x0e\x9f\x9e\xc1\xc4\x4c\x51\ +\x72\x80\x66\x57\xb9\xa2\x94\xa2\xab\xb3\x1d\x9f\xf9\xe8\x5d\xf8\ +\x85\x9f\xfe\x04\x86\x87\x06\x4c\xc0\xea\x7a\x38\xab\x2f\xfc\x73\ +\x00\xd9\x04\xac\x96\xb7\x24\x40\x95\x48\xb4\x78\xac\x87\x3a\x06\ +\x20\x16\x94\x02\x58\x21\x8a\x6c\x34\x16\x40\x89\xac\x0c\x00\x8a\ +\x95\x1a\x8e\x9e\x9d\xc1\xb9\xf1\x79\x66\xab\x2d\x95\x81\x9e\xa2\ +\x3d\x93\xc2\x87\xef\xbe\x11\xbf\xfc\xa5\x4f\xe3\xca\x2b\xd6\x9a\ +\x80\xd5\x28\x9c\x75\xad\xfe\x35\x80\xfe\x04\xac\x96\xaf\x24\x40\ +\x95\x48\xa8\xf8\xf0\xe3\x81\x8c\xf6\xdd\x0f\x54\x40\x09\x9c\x62\ +\x02\x14\x37\x22\x08\x67\x97\x9b\x13\x17\xf2\x38\x71\x61\x16\xd5\ +\x9a\x05\x7d\x0b\x9c\x11\xc4\xdb\x6f\xbc\x12\xbf\xfa\xf3\x9f\xc6\ +\xad\x37\x5d\x87\x50\xef\x40\x47\x72\x00\xfe\x15\x80\x7f\x07\x60\ +\x2c\x01\xab\xe5\x29\xc9\xa8\xdf\x65\x2e\x51\xa3\x7e\x00\xb0\x6a\ +\x68\x08\xef\xbb\x63\x23\xba\x3a\xda\xa4\x38\xe2\x8e\xfa\x4d\xcd\ +\x15\x75\x0b\x79\x2a\x03\xa5\xf5\xad\x54\x5a\x25\xa3\xef\x79\x23\ +\x82\xa5\xaa\x85\x5c\x67\x3b\xda\xd2\xa9\x90\xf4\xc0\x60\x7f\x0e\ +\xd7\x5e\x3d\x86\x85\x62\x05\xe7\x2e\x4e\xc0\xb2\xec\x30\xa7\xe6\ +\x34\x80\x5b\x01\xdc\x0c\x60\x5f\x6e\x6c\xf3\xa5\x64\x44\x70\x79\ +\x49\xc2\xa8\x12\x69\x5c\x04\xb5\x4e\xc5\x9c\x58\xf6\x14\xc6\xa0\ +\xd8\x70\xd1\xa1\x99\x02\xb8\x34\x5d\xc4\xa1\x53\xd3\xc8\x17\xaa\ +\x8a\xf4\xec\x39\xc5\xe8\x50\x1f\x7e\xfe\xf3\x1f\xc5\xa7\x3e\xba\ +\xc5\x64\xb7\x9b\x14\x80\x4f\xc2\x59\x88\xef\xa3\x48\xdc\x6e\x96\ +\x95\x24\x40\x95\x88\x91\xc8\x8b\xe5\xa9\xfd\xfe\xc4\x04\x61\xe0\ +\x24\x83\x8b\xf7\x27\xb8\xe4\x30\xf1\x00\x30\xb3\x50\xc2\xa1\xd3\ +\x53\x98\xcc\x97\xc2\x0d\xf8\x94\xa2\x37\xd7\x81\x9f\xfa\xe4\xfb\ +\xf0\xd3\x9f\xfd\x09\x53\xb7\x9b\x3b\xe1\xb8\xdd\xfc\x1c\x80\x4c\ +\x02\x56\xcb\x43\x12\xa0\x4a\xc4\x48\xb4\xe3\x7e\x0c\xdd\xf1\x40\ +\x26\x0e\x38\xb1\x71\x92\xcf\xa0\x14\xef\x08\x01\xb0\x50\xac\xe2\ +\xf0\xe9\x69\x9c\x9f\x5c\x50\x82\x8f\xdf\x02\x9b\xa2\x23\x9b\xc1\ +\xbd\x1f\xb8\x0d\x5f\xfe\xc2\x27\x4c\xdd\x6e\xae\x04\xf0\x17\x70\ +\x76\x6a\xee\x4e\xc0\x6a\xe9\x25\x01\xaa\x44\xcc\x85\x52\x35\x8d\ +\xa2\x1e\x24\xc9\x76\xa7\x70\xc6\x13\x0f\xa0\xfc\x74\x6e\x58\xb9\ +\x6a\xe1\xd8\xb9\x19\x9c\xbc\x38\x87\x9a\xbf\xb6\x55\x30\xd3\x9d\ +\x75\xf1\x49\xa7\x09\xee\xbe\xfd\x3a\xfc\xf2\x97\xee\xc3\xa6\x6b\ +\x8d\xdc\x6e\x06\x01\xfc\x21\x80\xaf\x02\x18\x4e\xc0\x6a\x69\x25\ +\x31\xa6\x5f\xe6\x62\x62\x4c\x1f\x1c\x1a\xc2\x96\xdb\x37\xa2\x4b\ +\xb5\xc2\x27\x01\xe6\x8b\x55\x4c\xb9\x6a\x58\x94\xb0\x06\x72\x40\ +\xc1\xd0\xa0\x02\x36\x2a\x85\xfb\x18\x69\x03\xf9\x85\x32\x2a\x55\ +\x1b\x3d\x5d\x6d\xc8\xa4\x89\xba\x50\x57\x86\x57\xf5\xe1\xaa\x2b\ +\xd7\x21\x3f\x57\xc0\x85\x4b\x53\xb0\xed\x50\x23\x7b\x1b\x80\xcd\ +\x00\xae\x86\xb3\x6a\xe8\x74\x62\x64\x5f\x1a\x49\x18\x55\x22\x86\ +\xc2\xf3\x1d\x89\x54\x85\xe5\x14\x6c\x4f\x61\xec\x49\xc7\xa0\xbc\ +\x70\x6e\xbe\xa7\x1b\x66\x53\x8a\xf3\x53\xf3\x38\x74\x6a\x1a\xf3\ +\xc5\xaa\x5c\x3f\xdb\x4e\x4a\x71\xc5\x9a\x55\xf8\x85\x9f\xbe\x17\ +\x3f\xf1\xc1\xf7\x20\x9b\x6d\x8f\x52\x05\x33\x00\xbe\x08\x67\x26\ +\xfb\xdd\x40\xe2\x76\xb3\x14\x92\x00\x55\x22\x46\xe2\xbc\xec\x44\ +\x37\x3f\xdd\x49\xc3\xae\xa6\x10\x02\x4e\x66\xea\x5d\x34\x40\x01\ +\xbc\x9a\x37\x99\x2f\xe1\xed\x93\xd3\x98\x76\xb7\x94\x07\x34\x8c\ +\xcd\xa6\x18\xea\xcf\xe1\x0b\x9f\xf9\x10\x3e\xfb\xc9\x0f\x9a\xee\ +\x76\xf3\x21\x38\x60\x75\x3f\x12\xb7\x9b\x45\x97\x04\xa8\x12\x69\ +\x4c\xc4\x91\x3a\x0e\x98\xc2\xc1\x29\x8a\x3d\x01\xe1\x00\xc5\x3a\ +\x34\x7b\x51\x73\x85\x0a\x0e\x9d\x9a\xc2\xc5\xe9\x02\xc4\xd5\x62\ +\x78\xbb\x15\x45\x77\x57\x3b\x3e\xf5\x91\xf7\xe0\x67\xff\xc9\xc7\ +\x4c\xdd\x6e\x6e\x04\xf0\x57\x00\x7e\x15\x89\xdb\xcd\xa2\x4a\x02\ +\x54\x89\x98\x89\x37\x2d\x9d\x33\xa6\xf3\x8a\x9f\x76\xba\x02\xa2\ +\xc0\xa9\x4e\x80\xa2\x72\x3d\x84\x00\xc5\x72\x0d\x87\x4f\x4f\xe3\ +\xf4\xa5\xb9\x60\x6d\x2b\x45\xd9\x94\x52\x64\xdb\xd2\xf8\xc0\xe6\ +\x1b\xf0\xe5\x2f\x7e\xca\xd4\xed\x66\x2d\x80\x6f\x00\xf8\x2d\x00\ +\x7d\x09\x58\x2d\x8e\x24\x40\x95\x08\x10\x6e\x62\xe2\x9c\x80\xc5\ +\x99\x51\xf2\xd6\xa3\x6e\x2a\x5a\x3f\x38\x51\x05\xda\x45\x01\x94\ +\x53\x27\xf5\x81\xa6\x6a\xd9\x78\xe7\xfc\x2c\x8e\x9f\x9d\x41\xa5\ +\x6a\xfb\xae\x34\x3c\xa4\x3a\xff\xa7\x53\x04\xb7\xdd\xb0\x01\x5f\ +\xf9\xd9\x4f\xe1\x96\x1b\xaf\x75\xb6\xf1\x0a\xbf\x22\xbd\x00\x7e\ +\x13\x0e\x60\xad\x4d\xc0\xaa\xf5\x92\x59\xea\x06\x78\xe2\xde\xec\ +\x34\x9c\xd5\x18\xc7\x00\x64\x15\xc9\x0c\xc6\x95\xa4\xf4\xa4\x09\ +\x65\x34\x2a\xf5\x94\xd1\x68\xbd\xa6\xf9\x29\x1c\x96\x90\xd5\xa6\ +\xf0\x37\x9f\xa1\xda\x42\xf5\xd3\x10\xf8\xb9\x54\xa1\x29\xc4\x09\ +\xa0\xe0\xd9\x90\xbe\x6e\x2a\x97\x47\x1d\x23\xfb\x99\xf1\x79\x94\ +\xab\x36\xae\x5e\xdb\x87\xae\x6c\x46\x55\x89\x2f\x57\x5f\xb1\x1a\ +\x5f\xfe\xc2\x27\xf0\xd0\x53\xbb\xf0\xd2\x9e\x03\xa8\x56\x6b\x61\ +\x23\x82\x59\x00\xbf\x02\x60\x0d\x80\xff\x67\x74\xcb\x03\x07\x00\ +\xe0\xc2\xee\xef\x18\x5e\xf6\x44\xe2\xc8\xb2\x00\x2a\x17\xa4\x06\ +\x01\xfc\xef\x00\x3e\x03\x60\x03\x5a\xcb\xf6\x9a\x01\x3e\xad\x96\ +\xc5\x6c\x63\x1a\xce\x14\x85\x88\x96\x10\x75\xb3\x54\x3a\x9a\x17\ +\x15\x13\x9c\x9c\xa0\x06\x00\x4a\xc8\x40\x01\x5c\x9a\x29\xa0\x5c\ +\xad\xe1\x9a\x75\xfd\xe8\xeb\x6e\xe7\x22\x79\xb2\x47\x31\x3a\xdc\ +\x87\x9f\xf9\xec\x47\xd0\xd7\x9b\xc3\xb6\x9d\x7b\x50\x28\x94\xc2\ +\xc0\x2a\x05\xe7\x79\x1d\x81\xe3\xd8\xbc\x63\x74\xcb\x03\x34\x01\ +\xab\xe6\xcb\x92\x03\x95\x0b\x52\x59\x38\x8b\xef\xff\x2b\x38\x73\ +\x57\x12\x59\x69\x12\x32\xb1\xd3\x8d\xd6\x9c\x78\x41\xf2\x24\xa9\ +\x46\x00\x8a\x0f\xa7\x98\x99\x2b\xe3\xed\x93\x93\xb8\x66\x6d\x3f\ +\x86\xfb\x3a\xb5\xe5\x53\x4a\xd1\xdf\xdb\x85\xfb\x3f\xbe\x05\xfd\ +\x7d\x3d\x78\xec\xe9\x17\x4c\x76\x69\xbe\x0b\x8e\xdb\xcd\xef\x00\ +\xf8\x9f\xa3\x5b\x1e\xa8\x25\x60\xd5\x5c\x59\xf2\x09\x9f\xee\x84\ +\xc3\x3b\x01\x7c\x13\x40\xcf\x52\xb7\x27\x11\x59\x06\x87\x86\xb0\ +\xe5\x8e\xeb\x9c\x35\xd3\x21\x03\xd2\x7c\xb1\x8a\xc9\x7c\xb0\xdd\ +\x55\x84\x06\xc8\x04\x99\x83\x93\x53\x6f\x7c\x80\xf2\xcf\x09\x50\ +\xa9\xda\x98\x99\x2f\x23\x95\x22\xe8\xee\x6a\xd3\x82\x0f\x05\xd0\ +\x9e\x49\x63\xfd\xba\x11\x0c\xad\x1a\xc0\xb9\x0b\x93\xc8\xcf\x2d\ +\x44\x81\xd5\x20\x80\x8f\x00\xa8\x00\x78\x23\x37\xb6\xb9\x9a\x4c\ +\x0c\x6d\x9e\x2c\x17\xa0\xfa\x30\x9c\xbd\xd7\x0c\x96\x0f\x4a\x64\ +\xb1\x65\xd5\xf0\x30\xee\xbe\xed\x3a\x74\x75\xb4\x49\x20\x45\x08\ +\x30\x5f\x70\x80\x2a\x4c\x9d\x0b\xa2\x14\xd3\xcb\xd1\x42\x80\x62\ +\x22\x09\x80\x9a\x4d\x31\x33\x5f\x86\x4d\x29\x7a\xbb\xda\x91\x4e\ +\x11\xb9\x0c\x37\x63\x3a\x05\xac\x59\x3d\x88\x75\x6b\x47\x30\x31\ +\x39\x8b\xc9\xe9\xd9\xa8\x4b\xd5\x05\xe0\x83\x70\x3e\xb8\xaf\xe5\ +\xc6\x36\x17\x12\xb0\x6a\x8e\x2c\x17\xa0\xba\x1b\xc0\x4f\x22\x01\ +\xaa\xe5\x27\x24\x85\xd5\x6b\xc7\x70\xd7\x2d\x57\x69\xd7\xa3\x9a\ +\x2f\x56\x31\x31\x5b\x32\x66\x4d\xc2\xa1\x52\xb4\xe0\xa4\xc8\x1c\ +\x05\x50\x7c\x98\xb3\xb6\xd5\xec\x42\x19\xe5\x8a\x85\x9e\xae\x2c\ +\xda\x32\x29\x01\xfc\x82\xd4\x84\x00\x43\x83\xbd\xd8\x70\xc5\x5a\ +\xcc\x2d\x14\x71\x31\xda\xed\xa6\x1d\x8e\x2a\xb8\x01\x0e\x58\xcd\ +\x24\x6e\x37\x8d\xcb\x72\x01\xaa\x3b\x90\x00\xd5\xf2\x13\x4a\x91\ +\xcd\xf5\x61\x74\xfd\x95\xb8\x63\xd3\x1a\x2d\x50\xcd\x15\x2b\x98\ +\xcc\x17\xe5\x31\xc1\x18\xc0\xe4\x54\xa7\x30\xc6\x87\x14\x10\x0a\ +\x50\x6e\x00\x15\x52\xb3\x76\xff\xf9\x62\x15\x0b\xa5\x2a\xba\x3b\ +\xda\x90\x6d\x4b\x4b\x20\xc5\x96\xd7\xd7\xd3\x85\xab\x37\xac\x45\ +\xcd\xb6\x71\xfe\xc2\x04\x6a\x35\x2b\x6a\x21\xbe\x9b\xe1\xec\xd4\ +\x7c\x00\xc0\xb9\x04\xac\x1a\x93\x15\x01\x54\xa2\x1b\x45\xf2\xd7\ +\xcc\x3f\xaa\x08\x23\x20\xe9\x34\xda\xba\x7a\xd1\x3b\xba\x01\x7d\ +\xfd\x7d\xb8\xfd\xda\x61\x74\x77\x64\x14\x13\x14\x88\x92\x51\x19\ +\xcf\x8d\x88\x09\x4e\x7c\x7c\x4c\x80\x12\x12\x53\x00\xc5\x52\x0d\ +\xb3\x0b\x65\x74\xb6\x67\xd0\x99\xcd\x40\x91\xcc\xaf\xaa\xbb\x33\ +\x8b\xab\xae\x58\x8b\xf6\x6c\x3b\xce\x9e\x1f\x47\xb9\x5c\x09\x03\ +\x2b\x02\xe0\x2a\x00\xef\x07\x70\x02\xc0\xb1\x04\xac\xea\x97\x25\ +\x1f\xf5\x8b\x92\x6c\xb6\x1d\x37\xdc\xb0\x09\xab\x06\x7b\x23\x52\ +\x12\xf7\x7f\xaa\x1c\x7d\xe2\x9e\x27\xca\x65\x79\x17\x4b\x34\x72\ +\xa8\x82\x09\x21\xc8\x64\x3b\xd1\xd6\xd1\x0d\x92\x4a\xa3\xa7\xab\ +\x1d\xed\x6d\x69\x7f\x8b\x2b\x3e\x31\xe5\x3e\x24\x91\x2d\xd2\x0c\ +\x0d\x46\x8f\x0a\xfa\x05\xe8\xeb\x8a\x01\x50\xec\x41\x7e\xa1\x82\ +\xb7\x4e\x4e\xe2\xea\xb5\xfd\x18\x1d\xec\x96\x36\x31\x0d\x7c\x18\ +\x29\x7a\xba\xb3\xb8\xf7\x43\x77\xa2\xaf\x37\x87\x47\x9e\xda\x85\ +\x4b\xe3\x53\x51\x46\xf6\x9b\x01\xfc\x35\x9c\x9d\x9a\xff\x6e\x74\ +\xcb\x03\x95\x64\x44\x30\xbe\x2c\x6b\xa0\x72\xb6\x41\xea\xc0\x47\ +\xdf\x7f\x2b\x36\x5d\xb3\x16\x80\x06\x5b\x88\xf3\x5f\x14\xee\xa8\ +\x9e\x27\xa2\x3b\x23\xe6\x38\x46\xd4\x85\x29\xcb\x35\x48\x62\x5e\ +\x5f\x4c\x51\x82\x92\x2e\x9d\x00\x28\xa9\x14\x31\x9f\x7e\xc0\x86\ +\xd7\x09\x4c\x72\x1a\x3d\x7b\xe2\xc3\xf5\x00\x15\xf4\xcd\x3b\x76\ +\x0e\x1c\xb7\x1b\x0b\x87\x4e\x4d\xa3\x54\xb1\x70\xc5\xea\x1e\xa4\ +\x35\xfd\xa5\x14\xe8\x68\xcf\x60\xcb\x9d\xd7\xa3\x27\xd7\x85\x87\ +\x9e\x78\x1e\xef\x9c\x3c\x17\x05\x56\x63\x70\x46\xb5\xd7\x01\xf8\ +\xd6\xe8\x96\x07\xf2\x09\x58\xc5\x93\x65\x0d\x54\x80\xf3\x10\xa5\ +\x52\x04\x29\x12\x4c\x36\x54\x83\x15\x45\xc0\xaa\xc2\xcb\x93\xc2\ +\xfc\x23\x86\x6a\x11\x44\x96\x25\xe7\xd7\x65\xe0\x29\xdc\x52\x82\ +\x95\x79\x05\x71\x6b\xa0\x91\x7e\x72\x4d\x03\x27\x26\x30\x16\x40\ +\xb9\x07\xba\x8d\x25\x6a\x96\x8d\x77\xce\xcd\xa2\x5c\xa9\xe1\xaa\ +\x35\x7d\xc8\xb6\xa7\x35\x9b\xa8\x02\xe9\x74\x0a\xb7\x5c\xbf\x01\ +\xb9\xee\x4e\x3c\xfc\xe4\x4e\xec\x7f\xfb\x78\xd4\x96\xf2\x7d\x00\ +\x7e\x1b\x0e\x58\xfd\xc1\xe8\x96\x07\x2e\x00\xc9\x4c\x76\x53\x59\ +\xf6\x36\xaa\xae\xce\x0e\xdc\x7e\xeb\x26\x0c\x0d\xe4\xa4\xbc\x44\ +\x1b\xd0\x0c\x76\xc5\x84\xc4\x00\x2d\xa1\x19\x26\xa9\x4c\x93\xd5\ +\x2d\xcd\x00\x35\x2d\x04\xb9\xc6\xf4\x89\xd9\x52\x78\x7a\xe3\xc9\ +\xa0\xd4\xa8\x8c\x7a\x00\xca\xf9\x61\x72\x2a\xda\x64\x53\x8a\xfc\ +\x42\x05\x85\x72\xcd\x57\x79\xd5\x4d\xa0\x20\x00\x06\xfa\xba\x71\ +\xe5\x15\x6b\x51\xae\x54\x71\x21\x7a\xb7\x9b\x0c\x9c\x67\x7d\x13\ +\x80\xbd\x00\x26\x12\xbb\x95\x99\xac\x08\xa0\xba\xe3\xd6\x4d\x18\ +\xea\x77\xe7\x82\x0a\x29\xc2\x54\x41\x6d\x3c\x9b\x74\xc9\x01\x4b\ +\x4e\x14\x99\x7c\x19\xd9\xd6\xbc\xe9\x09\x93\xb3\x66\xf3\xa8\x94\ +\xd1\x61\xcc\x89\x89\x50\x41\x58\xb3\x00\x4a\x64\x83\x0b\xa5\x2a\ +\xf2\x0b\x15\x74\x77\xb4\xa1\xa3\x3d\xc3\x14\x25\x1b\xe4\x72\x5d\ +\x1d\xb8\x6a\xc3\x3a\xa4\x52\x69\x9c\xbb\x30\x8e\x4a\xb8\x8f\x60\ +\x0a\x0e\x50\xdd\x05\xe0\x10\x80\xd3\x09\x58\x45\xcb\xca\x58\x3d\ +\x81\x6a\x8e\x11\x8c\x54\xc9\xe9\xbd\x31\xad\x88\xa2\xa9\xfc\xe0\ +\xca\x65\xba\x21\xfc\x8f\x51\xb3\xa9\x5b\x47\x74\x26\x76\x1c\x8e\ +\x1f\x85\x0b\x49\xaa\xfe\x6b\xb5\x28\xea\x0c\xeb\xa3\xd4\x3c\x66\ +\x59\x05\x4a\xa9\xfe\x1e\x7a\xc9\xc0\x82\x04\x0d\xbd\xae\x41\x1d\ +\xde\xbd\x0a\x5c\xa9\xf5\x9b\x4b\x50\x39\x3f\x80\x99\xf9\x32\x0e\ +\x1c\x9f\xc0\xc5\xe9\x42\x50\xab\xa2\xb1\x14\x40\x5f\x4f\x27\x3e\ +\xf9\xd1\xbb\xf1\xb9\xfb\xee\xc1\xe0\x80\xd1\x6e\x37\xef\x85\xe3\ +\x76\xf3\xd3\x00\xd2\xc9\x0a\x0c\xe1\xb2\x32\x18\xd5\x2d\x9b\xb0\ +\x6a\xa0\x27\x44\xd5\x0b\x63\x56\xce\x81\x91\xad\xa9\x85\xec\x4a\ +\xd1\xa4\x7a\x72\x35\x46\xa6\xe2\x9b\x9d\xa2\x8b\x24\x04\xf3\xae\ +\xea\xa7\x06\x55\x6a\x56\xa4\x76\x80\x52\xc1\xb6\x22\xd8\x93\x73\ +\x18\xce\xa0\x9c\xf0\x68\x35\xb3\x62\x59\x98\xce\x97\x90\x4a\x11\ +\xf4\x74\xb6\x73\x4c\x49\xcc\xd3\x96\x49\x63\xdd\x9a\x61\xac\x5a\ +\x35\x80\x8b\x97\xa6\x4c\xdc\x6e\x56\x01\xf8\x09\x00\x45\x00\xfb\ +\x13\xb7\x1b\xbd\x2c\x7b\x63\x3a\x2b\xd2\xac\x02\xea\xd8\x14\x2c\ +\x66\x29\xc7\x30\x30\xab\xd7\x76\xc5\x15\xa3\xb0\x9c\x13\x21\xbc\ +\x6e\xf0\x32\xce\x4c\x62\x84\xb6\x56\x08\x21\xb0\x6c\xd7\x90\x6e\ +\x0a\x4a\x8a\x04\x71\xc1\x89\x0b\x52\xa8\x77\x80\x19\x40\xe9\xea\ +\xf1\x5a\x40\xe0\xec\x76\x73\xe4\xf4\x34\x4a\x65\xc7\xc8\xde\xd6\ +\x96\x92\xcb\x76\xcf\xdb\x33\x69\xdc\x71\xf3\xb5\xe8\xc9\x75\xe1\ +\x91\x27\x77\xe2\xd0\xd1\x53\x51\x57\x61\x18\xc0\x1f\xc3\x19\x19\ +\xfc\xb7\xa3\x5b\x1e\x98\x4a\x0c\xec\xb2\xac\x28\xa0\xf2\x24\x18\ +\xdf\x03\xce\x4f\x2e\xe0\xec\xc4\x3c\x08\x91\x79\x87\x9e\x21\xc9\ +\xa8\x42\x54\xe9\x88\x1c\xa3\x08\xe2\xcb\x8c\x62\x5a\x44\x0f\x33\ +\xe1\xac\x50\x5b\x9c\x61\x64\x7c\x18\x73\x72\x44\xd3\xaa\x72\xd5\ +\xf2\x55\x38\xad\xd0\xb0\x53\x0d\xb3\xa1\x11\xc5\xb4\x0c\xa0\xdc\ +\x52\x99\x04\x96\x4d\x71\xf2\x42\x1e\xa5\x8a\x85\x6b\xc7\xfa\xd1\ +\xd5\x91\x11\x17\x38\xf5\x0f\xd3\x29\x82\x8d\x57\xad\xc3\xcf\xfc\ +\xd4\xbd\x78\x7c\xeb\x8b\x78\xfd\xcd\x43\x51\x33\xd9\x73\x00\xfe\ +\x4f\x38\xeb\x82\xfd\xee\xe8\x96\x07\x4e\x02\xc9\x88\x20\x2b\x2b\ +\x0c\xa8\x02\x4e\xe5\x1d\x15\x4a\x35\x4c\xcd\x16\x7d\x54\x62\x1f\ +\x05\xd5\x83\x41\x54\x0c\x2b\xcc\x40\x4f\xf4\x8a\x97\x16\x08\xa3\ +\x8c\xf9\x26\x03\x02\x50\x03\x60\x1c\x69\x05\xc3\xd2\x81\x91\x72\ +\x42\xad\x36\x4f\x34\x60\x44\xc5\xab\x60\xb1\x15\x00\xc5\x8a\x4d\ +\x81\xf3\x93\xf3\x28\x57\x6b\xd8\xb8\x7e\x10\x7d\xdd\xed\xca\x2d\ +\xbc\x9c\xeb\x41\xb1\x7e\xcd\x20\x3e\x7f\xff\x3d\xe8\xed\xe9\xc6\ +\xae\x97\xf7\xa1\x54\xaa\x44\x6d\xcd\xf5\x0b\x00\x46\x01\xfc\x06\ +\x80\xd7\x47\xb7\x3c\x90\x80\x95\x2b\x2b\xc3\x98\x2e\x59\x30\x19\ +\x55\x8f\x38\xff\x11\x30\xf8\x40\xbc\x17\x27\x98\xd0\x47\x08\xff\ +\x32\x39\xe7\x94\xc3\x01\xe2\x97\xc7\x94\x23\xb4\x43\x55\x16\x5b\ +\x07\xab\x97\x4a\x84\xc6\xcb\xcb\x57\x21\xa5\x01\x5b\x16\xa1\xee\ +\x1c\x31\xa1\xbe\xb0\x3f\x22\xf7\xa3\x59\x7f\xaa\xf6\xfb\x97\x5a\ +\x30\x7e\xab\x86\x06\x24\x97\x1d\xcd\x40\x00\x6f\x7c\xf7\xca\x8e\ +\xbb\x03\x33\xd5\x1a\xca\x65\xdb\xb8\xdb\x3e\xcd\x24\x4f\x6f\xa3\ +\x54\x0a\x60\x72\xb6\x84\x37\x8f\x8d\x63\x7c\xa6\xa8\x78\x22\xf9\ +\x8e\x0c\x0d\xe4\xf0\xe9\x7b\xdf\x87\x4f\xdf\xfb\x01\xf4\xf6\x44\ +\xee\x76\x43\x00\xdc\x0b\x67\xb7\x9b\x4f\x00\x20\x89\x91\xdd\x91\ +\x95\x6d\x4c\x07\x30\x35\x57\xc6\xd4\x9c\x33\x87\x47\xa5\xe9\xb0\ +\xac\x44\xc9\x80\x04\xe3\x93\xce\xd8\x2d\xa9\x86\x21\x46\x52\x35\ +\xd3\x52\x1b\xb1\xe2\xcc\xa1\x8a\x6b\x99\x6a\x36\xa3\xa2\x31\x63\ +\x69\xcc\x42\x4c\x99\x13\x60\xce\x9e\xf4\xe5\xf2\x01\x3a\x80\xe2\ +\xd2\x30\x19\xcb\x55\x1b\x53\x73\x25\x64\xd2\x69\xe4\xfc\xb5\xad\ +\xd4\x2a\x68\xb6\x3d\x83\xb1\x75\x23\xe8\xef\xeb\xc5\xf9\x8b\x13\ +\x98\x5f\x28\x46\x19\xd9\x47\xe1\xac\x6d\x35\x05\xe0\xed\xdc\xd8\ +\x66\xeb\x72\x37\xb2\xaf\x1c\xa0\x72\xe7\x51\x89\xf7\x77\x2a\x5f\ +\xc2\x54\x3e\x58\x2e\x56\x65\x4c\x37\xb2\x5d\xd5\x09\x58\x4e\xde\ +\x78\xa0\xe5\x94\x53\x07\x70\x69\x12\x98\x01\x52\xbd\xb0\x15\x6f\ +\xbe\x43\x1c\x70\xd2\xa9\x7c\x71\xc1\xc9\x89\x33\x30\xe4\xd3\x06\ +\x00\x4a\x2c\x94\x00\x55\x8b\x62\x7a\xce\xd9\x21\xba\xb7\xbb\x8d\ +\x5b\xdb\x4a\x2c\x37\x93\x4e\x61\x74\x64\x15\x56\x8f\x0c\x61\x62\ +\x72\x1a\x33\xb3\xf3\x51\x97\xb2\x0f\xc0\x3d\x6e\xad\xfb\x72\x63\ +\x9b\x2b\x97\x33\x58\xad\x1c\xa0\x1a\xe0\x17\xff\xf4\x00\x60\x2a\ +\x5f\xc2\xa4\xc7\xa8\x88\x08\x49\xfc\x49\x33\x01\x4b\x15\x14\xf1\ +\x95\x34\x03\x2d\x45\xc1\xc6\x10\xd3\x24\x0a\x45\x22\x63\xf5\x7f\ +\x84\x57\x08\x95\x05\xca\x00\xa5\x86\xa6\xa8\xa9\x48\x91\xec\x89\ +\x09\x68\x16\x40\x09\x58\x05\xcb\xb6\x31\x33\x57\x46\xa5\x66\xa3\ +\x37\x97\x45\x26\xad\x1f\x11\x4c\xa7\x08\x86\x06\xfb\x30\xb6\x6e\ +\x35\xf2\x73\x0b\x18\x9f\x98\x01\xa5\x08\x73\xbb\xe9\x04\xf0\x01\ +\x38\xab\x87\xee\xc9\x8d\x6d\x5e\xb8\x5c\x27\x87\xae\x58\xa0\x02\ +\x9c\x1b\x3c\x95\x2f\x61\x6a\xae\xe4\x67\x14\xc1\xa2\x59\x80\xc5\ +\x1d\x35\xc8\xb2\xe4\x3a\x14\x71\x06\x95\x34\x05\x97\x04\x1b\x9d\ +\x0c\x36\x5a\x8b\x9a\xd1\xbc\xa9\xd0\xb4\x7e\xfd\x44\xea\x6f\xdd\ +\xaa\x9d\x10\x68\x02\x50\x41\x78\x08\x83\x12\x4e\x45\xdb\x57\x7e\ +\xa1\x82\x85\x62\x0d\xbd\x5d\xed\xc8\xb6\xa7\x95\x99\x28\x9c\xe7\ +\xa2\xbf\x37\x87\x2b\xd6\xaf\x45\xb5\x5a\xc5\x85\x4b\x93\xb0\xac\ +\xd0\x11\xc1\x0c\x80\xf7\x00\xb8\x0e\xc0\xeb\x00\x26\x2f\x47\xb0\ +\x5a\x39\x40\xa5\x71\xa1\x99\x9a\xf3\x54\x3f\x3e\x5c\xcb\xae\x98\ +\x00\x13\xc0\xe2\xc3\xe3\xb3\x2c\xb1\x2d\x61\x12\x95\x8c\xd4\x81\ +\x56\x66\xaa\xa4\x1a\x88\x78\x31\x54\x01\x4d\xd1\x53\xc9\x52\xf4\ +\xed\x30\x55\xed\xf8\x38\x13\x70\x62\xd2\x69\x0a\xd7\x01\x94\x58\ +\xce\x42\xa9\x8a\xd9\xf9\x32\xba\x3a\xda\x9c\xb5\xad\xa8\xb2\x38\ +\x10\x02\xe4\xba\xb2\xd8\x30\xb6\x16\x99\x74\x1a\xe7\x2f\x4e\xa0\ +\x52\xa9\x46\xb9\xdd\xdc\x00\x07\xb0\x0e\xe2\x32\x74\xbb\x59\x79\ +\x40\xe5\x89\x52\xf5\x93\xcb\x6f\x25\x60\x71\x47\x31\x30\xa4\x59\ +\xc0\xc5\xd7\x15\x4a\xcf\x22\xdb\x64\x9e\xc0\x4b\xc4\xfc\x51\x35\ +\xfb\xa2\x11\x6d\x52\x72\x23\xaa\x06\x21\xe2\x0f\xb7\x46\x19\xc7\ +\x83\xb3\x56\x03\x94\x58\x07\x05\x45\xb1\xe2\xcc\x64\xcf\xb6\x65\ +\x90\xeb\x6a\xd7\x5c\x01\x27\x53\x47\xb6\x0d\xeb\xd6\xad\x46\x4f\ +\x77\x37\xce\x5f\x98\x40\xa1\x58\x8a\x7a\x36\xd6\xc3\x59\x93\xfd\ +\x0c\x80\x23\xb9\xb1\xcd\xf4\x72\x01\xab\x15\x03\x54\x83\x9e\x31\ +\x9d\x8d\x24\xc0\x64\xbe\x84\xa9\xb9\xa2\xff\xa2\x46\x81\x15\xd0\ +\x38\x60\xf1\x71\x0a\x23\x7e\x4c\xe2\x63\x0a\x5c\x72\xdd\x11\xe9\ +\xf4\xb3\x4b\xe3\xd9\xa1\x88\x08\x48\x42\x21\x52\x61\xe1\x43\x7b\ +\x91\x03\xf4\x3a\x9b\x16\x55\xb7\x5c\x9c\xc7\xde\x4c\x80\x72\xf2\ +\x85\xcf\xd9\x62\xf7\x21\x24\x00\x2a\x96\x8d\xa9\x7c\x11\x29\x42\ +\xd0\xdb\x9d\x75\x97\x28\x52\xb7\xb1\x3d\x93\xc6\x9a\xd1\x21\x0c\ +\x0d\xf5\xe3\xd2\xf8\x14\x66\xa3\xdd\x6e\x86\xe0\xb8\xdd\x2c\x00\ +\x78\x33\x37\xb6\xb9\x76\x39\x80\xd5\x8a\x01\x2a\x91\x51\x79\x09\ +\xa7\xe6\x8a\xce\x56\x4d\x84\x67\x15\x8b\x0f\x58\x4c\xfa\xd0\x4a\ +\x42\x83\x95\xed\x34\x15\x6e\x9e\x58\x0c\x8b\x7c\xd0\x6a\x8d\xfa\ +\xc7\x02\x92\x3f\x69\x4a\x2f\x46\x40\x44\xd4\x91\xd4\x07\x44\x55\ +\x59\x54\x5b\xa4\x9f\xa2\xde\x51\x3c\xc4\x07\x28\x27\x8f\x1a\x79\ +\x2d\x8b\x62\x6a\xae\x84\x9a\x45\xd1\x9b\x6b\x47\x26\x1d\x3e\x22\ +\x38\xbc\x6a\x00\x6b\xd6\x8c\x60\x66\x26\x8f\xa9\xa9\x59\x44\x48\ +\x0e\xce\x88\x60\x07\x9c\x0d\x24\x4a\xef\x76\xb0\x5a\xb1\x40\x05\ +\x37\x31\x67\x4c\xf7\x81\xa6\xd9\x80\x15\x9c\xc5\x05\x2d\xa9\x9c\ +\xba\x18\x8e\xba\xdd\xea\xfa\x65\x14\x88\xb6\x7d\xc5\x15\x51\xbd\ +\x13\x98\x57\x84\x11\x3e\x96\xaf\x8d\x10\x2c\xaa\x7d\xb2\x7d\x8b\ +\x89\xa6\x7c\x8e\xa6\x03\x94\x90\x99\x2d\x9f\xba\xe5\xcc\x2e\x94\ +\x51\x2c\x57\xd1\xeb\xed\x76\xa3\x99\x79\x9f\x4a\x11\x0c\xf4\xe5\ +\xb0\x7e\x6c\x0d\x8a\xc5\x32\x2e\x8e\x1b\xed\x76\xb3\x05\xce\x42\ +\x7c\x7b\x72\x63\x9b\xf3\xef\x66\xbb\xd5\x0a\x03\x2a\x2a\x25\x11\ +\x47\xfd\x00\x48\xec\x0a\xa8\x13\xb0\x98\x40\x15\xec\xb4\x0a\xb4\ +\x4c\xa2\x89\xa6\x01\x44\xca\x48\x22\xe2\x43\x6a\x20\xba\x3f\x98\ +\xd9\xdf\x4d\x27\x81\x42\x66\x26\x7a\xee\x44\xb4\x69\x24\x10\x20\ +\xf2\x44\xcd\xb0\xb6\x34\x03\xa0\x82\x9f\x20\xc1\x5c\xa1\x8a\x7c\ +\xa1\x82\x9e\xae\x76\x74\xb6\x67\x84\xf2\xd8\xde\x11\xf4\xe4\x3a\ +\x71\xc5\xfa\x51\x80\x02\x17\x2e\x4e\xa2\x5a\x0b\x5d\xdb\x2a\x0d\ +\x67\xa7\x9b\x9b\x00\xbc\x01\xe0\xe2\xbb\x15\xac\x56\x84\x0b\x8d\ +\x4c\xff\x05\x87\x05\xaa\xf8\xd2\x52\xb5\xab\x05\x97\xcc\x5b\x0f\ +\x89\x59\xb8\x4d\x74\xd6\xd1\xb9\x5a\x78\xee\x16\x61\xf6\x90\xe0\ +\x4f\xe3\x42\x22\xba\x8f\x28\xbe\xf4\xca\x68\x02\x0d\xf2\x42\xb0\ +\xee\xcb\xea\x1f\x55\x1a\xb1\x35\x0c\x88\x46\xfd\x51\x4d\x27\xd4\ +\x9d\xa1\x42\x30\x9f\x92\x67\x64\xdc\x87\x86\x8a\x39\xa0\xe8\x04\ +\x05\xeb\x6a\xe4\x97\x29\x7c\xb2\xc4\xd6\x89\xcf\x80\x78\xff\x82\ +\x7c\x34\x00\x53\x11\xa4\x94\xcf\x48\x50\x0e\xe0\xd8\x52\xf7\x1e\ +\x1d\xc7\xc5\xe9\x42\x68\xb7\x08\x80\x55\xfd\x3d\xf8\xc4\x4f\xbc\ +\x17\xf7\xdd\xfb\x3e\xf4\xf5\xe6\x4c\xdc\x6e\x3e\x09\xe0\xfb\x00\ +\x3e\x0a\xbc\x3b\xdd\x6e\x56\x04\xa3\xba\xfd\x96\x4d\x18\xec\x53\ +\xcd\x4c\x27\xc1\xcc\x74\x40\xc1\x7e\xd8\x30\x33\x75\xa8\x3e\x96\ +\x15\x9c\x99\x98\x97\xe4\x34\x66\xaa\x28\x53\x8b\xa6\x1d\x81\x0a\ +\xa6\x6d\x06\x31\x24\x54\xd1\xbd\x30\xfe\xd3\xd8\xc0\xf9\x20\x95\ +\x71\x9a\x49\x28\xb1\x1f\x01\x87\x59\xdb\x96\xa8\x82\xf9\x9d\x66\ +\xd3\x1b\x8c\xe2\x71\x6d\xd1\xa9\x8b\xdc\x47\x32\xdc\xa0\x5f\xae\ +\x5a\x98\xcc\x17\x91\x4e\xa7\xd0\xd3\xed\xae\x6d\xa5\x99\x67\x91\ +\x6d\xcf\x60\xcd\xe8\x08\x06\x06\x7a\x71\xf1\xd2\xa4\x89\xdb\xcd\ +\x1a\x00\x1f\x01\x30\x0e\xe0\x60\x6e\x6c\xb3\xfd\x6e\x62\x56\x2b\ +\x06\xa8\x24\x63\xba\x9b\x72\x32\x5f\xc2\x64\xbe\x08\x0e\x8a\x5a\ +\x00\x58\x52\x79\x61\x75\x19\xaa\x87\xe1\xed\x60\x20\x49\x65\x17\ +\x17\x3b\xab\x0e\x82\xce\x55\x27\xb4\x4f\x7e\x8c\xa1\xcd\x29\x4c\ +\xa8\x7a\x92\x82\xf4\x7e\x12\xf8\x8c\x88\x68\xd3\x32\xf5\x87\xcf\ +\x20\x65\xce\x34\xc6\x2d\xb9\x99\x42\x9d\xf5\x01\x94\x58\x16\x15\ +\x02\xab\x16\xc5\x54\xde\x71\xbb\xe9\xeb\xce\xf2\x6e\x37\x42\x39\ +\x6d\x99\x14\x56\x0f\x0f\x62\xf5\xc8\x10\xa6\xa6\x66\x31\x3d\x3b\ +\x17\x75\xb5\xfb\xe1\x80\x55\x0d\x8e\xdb\xcd\xbb\x66\x21\xbe\x15\ +\x04\x54\x39\x65\xfe\xa9\xb9\x62\xc0\xa8\xc4\x51\x37\x25\x88\x40\ +\x09\x5a\xe1\xf6\xa6\xc5\x05\x2d\x36\xbd\x0a\x68\x88\x22\x40\xdd\ +\x47\xd3\x41\x03\xc7\x28\x4e\xea\x01\x22\x00\x3a\xd4\xf0\x99\x94\ +\xa2\x58\x65\x0d\x94\x35\xd0\xeb\x8b\xa7\xde\x3c\x00\x29\x8d\x8c\ +\x10\x94\xb9\x46\x3a\xc3\xbb\x6e\xaa\x81\xb2\x09\x1a\x3b\x94\x5c\ +\x0e\x1f\xe8\x9d\x13\x00\xb6\x4d\x31\x3d\x57\x46\xa9\x6a\xa1\x2f\ +\x97\x45\x26\x93\x82\xce\xbf\x31\x4d\x08\x06\x07\x7a\x31\xb6\x76\ +\x14\xf3\xf3\x05\x8c\x4f\x4e\xc3\xb6\x43\x9f\xa5\x4e\x38\x73\xad\ +\x06\xe0\x18\xd9\x0b\xef\x06\xbb\xd5\xca\x07\xaa\xbc\x6a\x66\x7a\ +\xfd\x80\x05\x34\x81\x65\x09\x11\x61\x70\x11\x5e\x97\x00\x49\x4c\ +\x87\x88\xa2\x53\x41\xaf\x09\x10\xa3\xad\x04\x4a\x5c\x33\x10\xc2\ +\x95\x40\x25\x54\x52\x03\x0e\x35\x2d\x5e\x4a\xeb\x32\x2e\xe5\x8c\ +\x50\x80\xe1\x4f\x7c\xd5\x94\x68\x08\x55\x10\xde\x2c\x80\xf2\x63\ +\x55\x1b\x56\x30\x65\x50\x38\x6e\x37\x73\xc5\x0a\x7a\xbb\xda\xd1\ +\xd1\x9e\x56\x14\xe2\x8e\x08\x12\x82\xde\x9e\x6e\xac\x5f\x3f\x0a\ +\xab\x56\xc3\xc5\x4b\x93\xa8\x85\xbb\xdd\xb4\x01\xd8\x0c\xe0\x1a\ +\x00\xaf\x01\x98\x5e\xe9\x60\xb5\x22\x8c\xe9\x80\xd2\x3c\xcb\xc7\ +\x29\x2c\xe0\x7e\x1e\xc9\xd8\xc9\x17\xaa\x5b\xe3\x48\xaa\x47\x61\ +\x78\xd5\x9a\x8f\x99\x40\x7e\x8d\x26\x3e\x07\x6f\x74\x07\xd7\x06\ +\xc9\xf0\xcc\x74\x88\x8a\x4f\x3d\x53\x3e\x65\x2b\x15\x9a\x24\x89\ +\x67\x60\x27\x2a\x73\xb8\x0c\x3e\x94\xfb\xd3\x9a\xce\xf9\x0a\x84\ +\xca\xd5\x6c\x4a\x1c\x6a\x70\xd3\x52\xbe\x2c\x0a\xc2\xd9\xa7\xf8\ +\xeb\xe2\x75\x28\xb8\xdf\x8a\x42\xdc\xfc\x7c\x22\xc9\xd7\x50\xfb\ +\xec\xe8\x9f\x93\x20\x0f\x55\x3e\x0f\x62\x18\xa5\x14\x17\xa7\x0b\ +\xd8\x7b\x74\x1c\x13\xcc\xda\x56\xaa\xb4\x29\x02\x8c\x0c\xf6\xe1\ +\x53\xf7\xbe\x1f\xf7\xde\x73\x37\x72\xdd\x9d\x51\x46\xf6\x34\x80\ +\x2f\xc0\x59\xdb\xea\x6e\x00\x58\xc9\x46\xf6\x15\x03\x54\x9e\x48\ +\x37\x9b\x3d\x96\x00\xa6\x3e\xc0\x12\x77\x2d\x31\x05\x2d\xb6\x7d\ +\xaa\x41\xa9\x50\xe0\x22\xe2\xe6\x95\x54\x7a\xc1\x04\x92\xc5\xab\ +\x56\x6c\xba\xb0\x70\xf6\x44\x19\x20\xb3\xa1\x68\x30\x12\x53\x29\ +\x3a\x1b\x52\x0e\x37\xf2\xc7\xd4\x4d\x01\xcd\x64\x78\x22\x00\x91\ +\x57\x8e\x77\x2d\xc1\xa8\xc3\x54\x36\xe6\xbb\x05\x53\x2e\x2f\xfc\ +\x4c\xf2\xb3\xc2\xb7\x3c\x0c\xa0\x3c\x90\x12\x23\x45\x80\xf2\x9e\ +\x1b\x02\x60\x66\xae\x8c\xbd\x47\xc7\x71\x76\x7c\x5e\xf5\x7d\xe1\ +\xee\x7f\x5f\xae\x0b\x1f\xfe\xc0\x9d\xb8\xff\x93\x1f\xc2\xd0\x60\ +\x9f\xc9\x6e\x37\x1f\x82\x33\x22\xf8\x59\x00\xa9\x95\x0a\x56\x2b\ +\x46\xf5\x1b\xec\xcf\x39\x77\x50\x48\x31\x35\xeb\x1a\xd3\x15\x23\ +\x5d\xa1\x06\x6a\xe6\x20\xdc\xde\xa4\x50\xa1\x22\x54\x24\x1d\x25\ +\xd7\xd5\x43\x84\x42\x09\xf3\x1f\x51\xa6\x97\x51\x48\x5e\x62\x39\ +\xac\x73\xea\x81\x86\x88\x5e\xb9\xbf\x54\x93\xc9\x33\x72\xeb\x8d\ +\xef\x24\xaa\x78\x55\xa3\x42\x46\x03\xc3\xfa\x40\x19\x14\x23\xa2\ +\xf1\x5d\x37\x10\xc1\x82\x0c\x91\xeb\x53\xaa\x78\x4c\x84\x4e\xcd\ +\x0b\x92\x29\x8c\xf8\x6e\x5d\x95\x9a\x8d\xc9\xd9\xa2\x03\x46\xdd\ +\x59\xa4\x15\xcf\x50\xe0\x76\x93\xc2\xea\x91\x55\x18\x1e\x1a\xc0\ +\xf8\xc4\x14\x66\xf3\x91\x6e\x37\xc3\x70\x8c\xec\x79\x38\xbb\xdd\ +\xac\xb8\x85\xf8\x56\x16\x50\xb1\xc2\x8c\xfa\x05\xc6\x74\xc4\x02\ +\x2c\xee\x28\xc2\x8e\xe5\x1c\x36\x0f\xb4\xf8\xbc\xf2\xda\xed\x5a\ +\xdf\x45\xa2\x68\x07\xd7\x76\x12\x0b\x84\xf4\x20\xad\xb3\x35\x45\ +\x18\xdb\x15\x18\xe5\x60\x97\xe2\xc5\x93\x0e\x82\x13\x95\xad\xc9\ +\x07\x68\xaa\x06\x85\x40\x3d\x55\xd5\x23\xe8\x8b\xde\x01\x65\x6a\ +\xd4\xdc\xfc\x46\x01\xca\x49\xaa\x01\x29\xa6\x2d\x96\x4d\x31\x99\ +\x2f\xa1\x5a\xb3\xd1\xef\x1a\xd9\xf9\xaa\x82\x32\x32\xe9\x14\x56\ +\x0d\xf6\x61\xed\xe8\x08\x66\xf3\xf3\x98\x9c\x9e\x45\x84\xf4\xc0\ +\x01\xab\x36\x00\xaf\xe7\xc6\x36\x97\x57\x92\xdd\x6a\x65\x00\xd5\ +\xcd\x9b\x30\xd8\xa7\x36\xa6\x3b\xd3\x13\x82\xed\xc4\x59\xc0\x82\ +\xa2\xc0\xe6\xb0\x2c\x75\x0a\xb3\x39\x54\x61\xf5\x11\x65\xfd\xe1\ +\x9b\x54\xe8\x0c\xee\x41\xa8\xce\x50\x2e\x19\xf9\xe5\x85\xdf\xeb\ +\x10\xaa\x3c\x0c\xbf\x28\xe2\x09\x89\x28\x8a\x1d\xa1\x84\x30\xa2\ +\xa7\xa8\x97\x79\xc9\x25\xe3\x39\x82\x6b\x4f\x59\x1f\x43\x05\x52\ +\x86\x02\x94\x1b\x60\x0c\x50\x7e\x7a\x3e\xde\xb6\x1d\x55\xb0\x50\ +\xaa\xa1\x2f\x97\x45\x7b\x26\x2d\x81\x94\x27\xe9\x14\x41\x5f\x6f\ +\x0e\x63\xeb\x46\x51\x2e\x57\x70\x69\x7c\x1a\x56\xb8\xdb\x4d\x16\ +\xc0\xfb\xe0\x2c\x75\xbc\x07\xc0\xdc\x4a\x01\xab\x15\x63\xa3\x0a\ +\x6c\x05\xca\x08\xf9\x94\xb1\x17\xd4\x65\xc7\x0a\xb3\x65\x29\x0c\ +\xf0\x6c\xd9\x26\x4b\xe6\xca\xef\x92\x6c\xcc\x75\x44\x66\x08\xce\ +\x8b\x29\x1b\x6f\x28\x07\x5e\x81\xa1\x46\x3d\x1b\xdd\x35\x96\x13\ +\xef\x4f\x7f\xd5\xcd\x11\x27\x30\xc0\xfb\x65\x2b\x40\x8f\x2b\x51\ +\x51\x7c\x60\x2f\x22\x5a\x10\xf2\xaf\xa2\x50\x98\x38\x75\x41\xb2\ +\x43\x71\xba\x1d\x61\x8b\x54\x7e\x80\xf8\xba\xd5\xcf\x54\x94\x1d\ +\x4a\xea\x2a\x63\x13\x55\x5d\x14\x0a\xe0\xec\xc4\x3c\x5e\x3b\x7c\ +\x09\x53\xf9\x92\xf2\xfa\x7b\xc9\x53\x29\x82\xd1\xe1\x41\x7c\xfa\ +\x13\x1f\xc4\x3d\x1f\xb8\x03\x9d\x1d\xd9\x28\xbb\x55\x3b\x80\x5f\ +\x06\xf0\xd7\x70\x5c\x6f\x56\x84\x91\x7d\xc5\x00\x95\x27\x2a\x80\ +\x70\x23\x9a\x04\x58\x71\x41\x8b\x35\xc1\xcb\x23\x42\x72\x3d\xc4\ +\x3f\xa7\x6e\x3a\x0e\x25\xfc\x8a\x78\x66\x41\xb9\xb7\x49\x67\x03\ +\xd3\x4c\x09\xa0\xd2\x21\xb8\x82\xb9\xed\xd5\xd9\x2b\xa0\x99\x66\ +\xa0\xb8\x8e\x5a\x6f\x1a\xbf\xd1\xc1\x9f\x34\x37\x8c\xeb\xbe\x68\ +\x8c\x57\x3f\x05\x7e\x84\x00\xd0\x44\xe6\x89\x6e\x31\x2a\xaa\x2a\ +\xd4\x1d\x24\x96\xeb\x01\x00\x42\xd4\xcf\x00\x93\xca\x14\xa0\xc4\ +\x51\x5b\xbe\x0c\xe7\x77\x72\xb6\x88\xd7\x8f\x5c\xc2\x85\xa9\x05\ +\xa9\x3c\xf6\x24\x45\x80\xc1\xbe\x1c\x3e\xfa\xa1\xbb\x70\xdf\xbd\ +\xef\x43\x7f\xb4\xdb\x4d\x0a\xc0\xa7\xe1\x18\xd9\xef\x01\x96\xbf\ +\xdb\xcd\x8a\x03\x2a\x4f\x38\x78\xa0\xf2\xc3\x10\xa4\x33\x03\xac\ +\x30\x96\x65\x0a\x5a\xec\x43\x28\x01\x17\x00\xbd\x65\x5b\xe0\x8b\ +\x04\xf2\x39\x37\x1a\x15\x80\x2a\x5b\x01\x5f\x6f\x3c\x26\xc4\x19\ +\x94\xa8\xa3\x06\x89\x20\xa4\xc4\x21\x12\xf1\xa7\xb9\x67\xf2\x0d\ +\xe2\x3a\xaf\x8e\x82\xd7\x3c\xc1\x48\x2f\xaa\x88\x0c\x53\xf2\xda\ +\x28\x0e\xfa\xf9\xf7\x58\x7c\x18\x98\x26\x48\x93\x45\x19\x7a\x26\ +\x3e\x07\xcd\x02\x28\xca\x64\x20\x04\x98\x2b\x54\xb0\xf7\xe8\x38\ +\x4e\x9c\xcf\xc3\x56\x8d\x28\x32\x57\x2d\xd7\xdd\x81\xf7\x6e\xbe\ +\x05\x9f\xfb\xf4\x3d\x58\x33\xb2\xca\x64\x44\x70\x33\x80\xef\x02\ +\xf8\x19\x00\x99\xe5\x0c\x56\x2b\xc3\x46\xa5\x32\xa6\xbb\xe2\xb9\ +\xd0\x68\x7d\xf4\x42\x87\xe8\x4d\xed\x58\x7c\x2a\x9d\xb1\x5a\x3f\ +\xaa\xc7\xe4\xf5\xdf\x2f\xde\xe5\xc7\x37\x84\xab\x6c\x49\xda\x55\ +\x12\x74\xbb\x2b\x2b\x98\x8b\xe2\xc2\x68\x67\xa2\x1b\x80\x8e\x56\ +\x42\x8c\x45\x11\x97\x95\x53\x77\x41\xd5\xed\x17\x27\x7b\x52\xd5\ +\x19\x4b\x9e\x54\x2a\x16\x93\x88\x1f\xcb\xe4\x8d\xf1\x4e\x7e\x55\ +\xab\x83\xfb\x14\x65\x83\x72\x7e\xe4\x46\xcb\xb6\x2c\x45\x6f\xdc\ +\xd3\x9a\x45\x31\x91\x2f\xc1\xb2\xa9\x63\x64\x4f\xc9\xba\xbc\x77\ +\xda\x96\x49\x63\x68\x68\x00\xa3\xab\x57\x61\x7a\x66\x16\xd3\x33\ +\x91\x6e\x37\x03\x70\x8c\xec\x15\x00\x6f\xe4\xc6\x36\x57\x97\xa3\ +\xdd\x6a\x65\x01\x15\x6f\x4c\x00\xe0\x00\xd5\x04\x6b\x4c\x37\xd8\ +\xdc\x41\x3a\xd5\x6d\xb5\x85\x06\x41\x2b\x06\x20\x49\xed\x66\x46\ +\xde\xd4\x23\x82\x44\x0d\x92\xaa\xa5\x97\x25\xb0\x51\x4f\x7b\xf0\ +\xff\x54\x1f\x62\x53\xa0\x52\x18\xc6\x95\x33\xd6\x69\x38\xfa\x51\ +\x42\x35\xe1\x80\x6e\xf9\x16\x2a\x18\xb4\x02\x36\xc5\x1b\xde\xd9\ +\xc2\x7c\xd6\xa4\xb1\x26\x70\xc8\x48\x82\x84\xba\x75\xa5\xd8\x03\ +\xaa\x41\x13\x15\x89\x63\x43\x55\xae\x38\x36\x75\xf6\x11\x2c\x55\ +\x2c\xf4\x77\x67\xd1\xde\x96\x52\x34\xdb\x39\x4b\x13\x82\xfe\xbe\ +\x5e\xac\x5b\xbb\x1a\x85\x42\xd1\x71\xbb\xa1\xa1\xb7\xb0\x0b\xce\ +\x7c\xab\x5e\x38\x46\xf6\xe2\x72\x03\xab\x15\xa3\xfa\x51\x2a\xdb\ +\x8e\x00\xd5\x97\x29\x64\xe9\x96\x28\xb5\x30\xa6\x6a\x28\xda\xb4\ +\x58\x1b\x8d\xa4\xea\x09\xea\x04\xc7\x1e\x94\x43\xea\xc2\x68\x13\ +\xc3\x04\x74\xd7\xc1\xb7\xb1\x30\xaa\xab\x7c\x11\xc0\xb4\x9b\x6d\ +\xb0\x42\xa7\x8d\x02\x27\xaa\xf9\x33\xc9\xe4\xed\x00\x4d\xd4\xb6\ +\x33\xad\x29\xce\xed\xa8\xd2\xe6\x04\x28\x47\x2e\x79\xa6\x06\x29\ +\x3c\xd0\xe8\x44\xfb\x27\x4f\x7d\x94\x9a\x14\x61\xee\xa7\x4a\xc5\ +\xe3\xc2\xf5\x6a\x1e\x1f\xc6\xb6\x2f\xc8\x6c\xdb\x14\xa7\x2e\xe6\ +\xf1\xfa\xd1\x4b\x98\x99\xaf\x28\x2e\x4c\xf0\x93\x49\x13\xac\x1b\ +\x1d\xc2\xfd\x9f\xfa\x30\xde\x7f\xd7\x2d\xc8\xb6\x65\xa2\x54\xc1\ +\x2e\x00\xff\x12\xc0\x5f\x02\xb8\x2a\xea\x2e\x2e\xb6\xac\x18\x46\ +\x35\xa0\x98\x9e\x40\xe0\x6c\xaf\x3d\x31\x5b\x12\x09\x06\x9f\xce\ +\x50\x2d\xe4\xe3\x34\xac\x49\x8e\x96\x4a\x10\xb7\x8e\x77\x43\xb9\ +\xc2\x88\xc4\xaa\x54\x2c\x8b\x89\x13\x1a\x22\x4e\x67\x60\x23\x08\ +\x9f\x42\xd1\x39\xef\x44\x63\xe0\xae\x47\x58\xb2\x24\x45\xea\x5f\ +\x10\x35\x33\x61\x19\x97\x00\x38\x9a\xa9\x0c\xe2\x77\x44\x26\x2a\ +\xee\x6b\xcf\x12\x28\x69\xb5\x06\xc2\xa8\x8b\x41\xf9\xbc\xb6\x28\ +\x74\x90\xb2\x75\xd6\xc7\xa0\xc4\xeb\xc0\x59\x36\x15\x65\xcc\x17\ +\xab\x98\x9a\x2b\xa1\xbb\xb3\x0d\xdd\x1d\x19\x29\x81\xaf\x78\x10\ +\x82\xae\x8e\x2c\xc6\xd6\x8d\x22\x9b\x6d\xc3\x85\x0b\x13\x28\x47\ +\xef\x76\x73\x13\x80\xdb\xe1\x4c\x0c\x3d\xbf\x5c\x98\xd5\x8a\x61\ +\x54\x2a\x61\xbe\x45\xd2\x17\x8b\x4b\xa7\xf3\xcf\x53\xb0\x80\x20\ +\x2e\xa0\x52\x2a\xb2\xa0\x1f\xd5\x33\xd1\x9b\x78\x83\xac\x17\x24\ +\xda\x94\xd9\xd7\x88\x0a\x2f\xa8\xef\xf3\x26\x96\xcc\x3a\xee\x89\ +\xed\xf6\x3b\x12\x03\x94\xa2\x8c\xe5\x2c\x96\x78\x64\x29\xa2\x10\ +\x76\x0a\x83\xae\x4a\x48\xfd\xd5\x74\x86\x8a\x60\xc3\xdf\x2d\xa9\ +\xab\xdc\x4d\x14\xd8\x10\x5c\x90\x64\xf1\x9f\x6d\x8c\x12\x87\x02\ +\xbb\x18\x61\x23\xa8\xfa\x99\x11\x43\xd9\xe7\x87\x7b\x9e\x35\xcf\ +\xb4\x97\x76\x66\xae\x84\xd7\x0e\x5f\xc4\xe9\x8b\x73\xa0\xb6\xba\ +\x7b\x80\xf3\xb1\xeb\xcd\x75\xe2\x03\xef\xbd\x1d\xf7\x7f\xf2\x43\ +\x18\x5e\x15\xe9\x76\x43\xe0\xd8\xac\xbe\x0f\xe0\x3e\x2c\x13\xb7\ +\x9b\x15\xc1\xa8\x6e\xbb\x25\x6c\xc2\x67\xd1\xb7\x51\xc9\xac\x45\ +\x2f\x71\x6c\x59\x72\xbc\xce\x08\xcf\x8c\x44\xb1\x6c\x88\x6b\x0f\ +\xe1\xdb\xc7\xda\xb1\xc4\x76\x0b\xf5\x10\xbe\x60\x08\xc5\xf1\x61\ +\x1a\xda\x18\x3e\x9f\x53\x6f\xab\x0b\x93\x48\x6d\x4f\x55\x4b\xd8\ +\x46\xa5\x1a\xd6\xc1\xe3\x45\x70\xb1\x28\x0b\x94\x22\x00\x72\x2a\ +\xb3\xca\x48\xa9\xe8\x2d\xf3\x01\x91\x8d\xdc\x94\x07\x3f\xc2\xe6\ +\x51\xb0\x3b\xae\xab\x6a\x3b\x54\x10\xc3\xd3\x27\x35\x13\x73\x62\ +\x08\x01\xaa\x35\x1b\xe3\xb3\x45\x10\x00\x7d\xb9\x2c\x52\x29\xf5\ +\x9d\x23\xc4\x31\xb2\x0f\x0f\xaf\xc2\xc8\xf0\x20\x26\x27\xa7\x31\ +\x93\x9f\x8f\x72\xbb\x19\x81\x03\x58\xd3\x00\x0e\x2c\xb5\xdb\xcd\ +\x8a\x00\x2a\x4f\xf5\x53\x5d\xd6\xc9\xd9\x22\x26\x67\xf9\x65\x5e\ +\xf4\x4b\xa0\xc8\x12\xb9\x74\x4b\x1c\xd0\x62\x8e\x7d\x63\x38\x11\ +\x81\x86\x69\xa1\x46\xb5\x13\x31\x46\x0b\xc0\x44\x63\x14\x87\x01\ +\xe4\xf8\xed\x90\x55\x2c\x4d\x52\x50\xd6\xfc\xc3\xfc\x11\x4d\x38\ +\x2f\xdc\xab\x18\x59\x17\x7b\x40\xc3\x52\x53\xdd\x82\x89\x7a\x1b\ +\x96\x00\x3b\xca\xe3\xa0\x48\xb1\xdd\x44\x62\x65\xbc\x4a\xca\x8e\ +\x08\xf2\x7d\xe7\xc3\xa4\x18\x03\x80\x72\x5b\xc9\x84\x59\xb6\x33\ +\x22\x58\xa9\xda\xe8\xef\xe9\x40\x5b\x46\x56\x92\xbc\xf4\x99\x74\ +\x0a\x03\x03\x7d\x58\x3b\x3a\x8c\xb9\xf9\x79\x4c\x4e\xe5\x23\xee\ +\x06\x7a\xe1\x80\x55\x0a\xc0\xde\xdc\xd8\xe6\xf2\x52\x81\xd5\x8a\ +\x02\x2a\x9f\x65\x33\xa9\x26\x67\x9d\xed\xb2\x74\x1f\xc7\x46\x58\ +\x96\x94\x5e\x03\x5a\x84\x47\x49\x88\x7e\x7a\xec\xfe\x7a\x84\xff\ +\x4f\x00\x28\xa2\x68\xa7\xa0\x8a\x08\x75\x28\xd3\x33\x94\x4a\xab\ +\x5c\x85\xc6\x0b\xc9\x98\x3a\xa2\xa7\xe6\xe8\x0b\x93\x76\xac\x11\ +\x2a\xd7\x13\xa9\xc0\xf8\x45\xe5\x62\x79\xa6\x44\x04\xc0\xe1\x5e\ +\x7e\x2a\xa1\x80\x4f\x88\x98\x1b\xc1\x32\x34\xdd\xa8\x20\x7f\xca\ +\x77\x24\x36\x40\x29\x9a\x26\xe7\xa1\x52\x98\xcf\xfa\x6c\x60\x7a\ +\xae\x8c\xf9\x52\x15\xfd\xb9\xac\xbf\xa5\xbc\xaa\xce\x54\x0a\xe8\ +\xe9\xe9\xc6\xd8\xba\x35\xa8\x55\xca\xb8\x38\x3e\x0d\xcb\x0a\x75\ +\xbb\xe9\x00\xf0\x7e\x38\x8e\xcd\x7b\x72\x63\x9b\xe7\x97\x02\xac\ +\x56\x16\x50\x29\x86\xa4\x26\xf2\x45\xdf\x98\x0e\x70\x1f\x36\x4e\ +\xe2\xb0\x2c\xc0\x1c\xb4\x08\x0b\x24\x02\x5b\x52\xa9\x70\x22\xf3\ +\xe2\x1a\x2c\xb1\x2f\x05\x70\xb1\xea\x25\xd7\x8e\x90\x1e\x91\x90\ +\xbe\x9a\x32\x30\x36\x7d\x5c\xdd\x10\xb2\xb1\x9b\x2f\x4c\xa1\x92\ +\xa9\xf1\x41\x28\x94\x86\x06\xc9\x4f\x8b\x44\xaf\x14\x40\xc4\xe8\ +\x92\xc2\xbd\x51\x5c\x36\xbf\x14\x25\xca\x4a\xcc\x4a\x0d\x50\x62\ +\x5b\xa3\x00\xca\x0f\xf5\xf3\x3a\x07\xf9\x42\x05\x33\xf3\x65\xf4\ +\x74\x65\xd1\xc5\xec\x76\x23\xd6\x99\x22\x04\x5d\x9d\x1d\x18\x5b\ +\x37\x8a\x4c\x8a\xe0\xc2\xa5\x49\x54\xab\xa1\xbb\xdd\x64\xe0\xbc\ +\xa3\xd7\xc3\x71\x68\x9e\x58\x6c\x23\xfb\x0a\x03\x2a\x59\x26\x67\ +\x1d\xa7\x64\xa2\x7b\x90\x1a\x64\x59\x00\x42\x27\x5c\x7a\xc7\x7e\ +\x12\x46\x1d\x93\x56\xe9\x64\x99\x14\x91\xc3\xd8\x70\xa6\x95\x21\ +\x2a\x21\x7f\x22\xab\x81\x44\x45\x5c\x18\x7c\x90\x75\xb5\x3a\x30\ +\x48\x2c\x94\x0b\xa5\xda\xa4\xd4\x08\x8c\x58\xab\x8f\xcc\xa6\xc2\ +\xec\x4e\x1e\x73\x63\xea\x60\x75\x34\x0e\x3c\xf8\x8b\xc4\xaa\x6e\ +\xbe\x5b\x11\x05\x6c\x4a\x51\xb3\x6c\x54\x2d\x1b\x55\x8b\xa2\x56\ +\x73\x8e\xfd\xb0\x9a\x0d\xcb\x72\x56\x41\xb0\xd9\xc1\x16\x78\x7f\ +\x04\x84\x1d\x69\x14\x40\x2a\x4a\xcd\xe3\x9a\xad\x18\x65\x24\x00\ +\x16\x4a\x35\x4c\xce\x16\xd1\x99\x75\xb6\x94\xd7\x5d\x61\x02\x20\ +\xdb\xde\x8e\x35\x6b\x56\xa3\xa7\xbb\x03\x17\x2e\x4e\xa0\x58\xaa\ +\x44\x8d\x08\x6e\x82\xb3\x08\xdf\x21\x00\xa7\x16\x13\xac\x32\x8d\ +\x17\xb1\x48\x42\xf5\x11\xce\x8a\x96\x3c\x00\xf8\x43\xb4\xf2\x67\ +\xd5\xbf\xc1\x84\x1d\xf5\x09\x01\x2d\x76\x94\x84\x10\x45\x42\xd7\ +\x6c\x41\xfc\xd2\x1d\x90\xa1\xfe\x6b\xc4\xbe\x08\xd4\xb7\x93\x10\ +\x78\xf9\xfc\xd6\xfa\xe1\x7e\x58\x08\x02\x53\x45\xb4\xd8\x11\x2a\ +\x66\x13\x6d\x2c\x62\xf3\x42\x45\xa4\xa3\xc2\x38\x3d\x55\xe7\x50\ +\xde\x3a\xde\x02\xae\x88\x17\xec\x42\x80\x73\x33\xb5\xc8\xe7\xde\ +\x57\x91\xa1\x70\xf7\x9f\x79\xf1\x7d\x30\x72\x46\x84\x6b\x2e\xf0\ +\x58\x96\x8d\x9a\x6d\xa3\x5a\xa3\xa8\xd6\x6c\xd4\x2c\xcb\x01\x1e\ +\xef\xcf\x9f\xa7\xc7\x02\x0c\xaf\xbe\x11\xe2\x3d\x01\x81\xfd\x8e\ +\x10\x82\x4c\x2a\x85\x4c\x9a\x20\x9d\x4e\x21\x93\x22\x48\xa5\x53\ +\x48\xa7\x08\xd2\x29\x82\x14\x21\x0c\x48\xe8\xd5\x3c\x91\x45\x71\ +\x97\xcc\xc5\xfe\xb9\x42\x15\xaf\x1d\xb9\x84\x1b\x2a\x35\x5c\x39\ +\xda\xcb\x1b\xd9\x99\xeb\x43\x08\xd0\xdd\x95\xc5\x7b\xee\xb8\x09\ +\xb9\x5c\x37\x9e\xde\xbe\x1b\xe7\x2e\x4c\x46\x19\xd9\xef\x86\xe3\ +\x76\xf3\x5b\x00\x1e\x1c\xdd\xf2\x80\x75\x61\xf7\x77\xd0\x6a\x59\ +\x31\x40\x25\xbf\x70\x4c\x38\x85\x8f\x48\x54\x03\x58\x00\x03\x5a\ +\x02\x60\x39\x71\xe6\xa0\x45\x88\xe3\x07\x47\x98\x3a\x89\xf8\xde\ +\x11\x84\x34\x9a\x06\x0f\x43\x30\xe9\x85\x3b\xf7\x6c\x26\x6c\x9b\ +\xfd\x6e\x12\xf9\xc1\x63\xc1\x4f\x7f\xc1\xf4\x7a\x6f\xe4\xa4\x0a\ +\xd1\x40\x15\x42\x83\x8c\xcc\x58\x2c\x3d\x14\x55\x1d\x45\x01\xd4\ +\xbf\x31\x92\xf2\xc4\x37\xd1\x4f\x22\xb3\x0d\x9b\x3a\x93\x26\xab\ +\x35\x1b\x95\x9a\x8d\x4a\xcd\x42\xb9\x6a\xa1\x52\xb5\x1c\x36\xe4\ +\x03\x92\xad\x1c\xf5\x13\xfd\x02\x95\xec\xc6\x6f\xbe\xcd\x4d\x3b\ +\x10\xa9\x91\x07\x5e\x29\x42\x90\x4a\x11\x64\xd2\x29\xb4\x67\x52\ +\x68\xcb\xa4\x90\x49\x07\x7f\x84\xf0\xcf\x96\x0e\xa0\xc4\xce\x96\ +\x2a\x35\xbc\x79\x7c\x02\x85\x72\x0d\x1b\xd7\x0f\x20\xeb\xee\xd2\ +\xac\xba\x66\x1d\xd9\x36\xdc\x70\xfd\xd5\xe8\xee\xea\xc4\xd3\xdb\ +\x76\xe3\xe8\x89\xb3\x51\x77\xef\x5a\x00\xff\x1e\xc0\x5a\x00\x7f\ +\x33\xba\xe5\x81\x62\xab\xc1\x6a\xc5\xaa\x7e\x5e\xc2\x09\xc5\xa8\ +\x9f\x98\x4a\xb7\x57\x27\x7f\xc0\xc6\xc9\x2f\x34\x6f\xae\x60\xcb\ +\x8d\x32\x9c\xab\x5d\x68\xb4\x69\xc4\x3a\xa4\x36\x46\xfb\x03\x72\ +\xda\x8f\xaa\xdf\x3a\xf0\x62\x42\x54\x4c\xc8\x54\x2d\x34\x35\x63\ +\x51\x63\xb0\xa3\xfa\x42\x59\x77\x1a\xf1\xfa\xb9\xc0\x54\xae\xda\ +\x98\x2f\x56\x31\xb3\x50\xc1\x64\xbe\x88\xe9\xb9\x32\x66\x17\x2a\ +\x98\x2f\x54\x51\xac\x58\xa8\xd6\x2c\x58\x16\x33\xd7\x8e\x38\xa3\ +\xa1\xbe\xad\xd1\x3d\xe7\xc6\x00\x58\xb5\xda\x4f\x03\x3f\x8d\x77\ +\x9f\x02\x15\x5f\x6e\xbc\xa7\x4e\x5a\x2e\x78\x96\x2a\x16\x0a\xa5\ +\x1a\x16\x4a\x35\x2c\x94\xaa\x98\x2f\x56\x51\xac\xd4\x50\xa9\x3a\ +\x20\xea\x56\xcb\x95\xa5\xdb\xf9\xc6\x01\x66\x8a\xa9\x7c\x11\xc5\ +\x92\xe5\x8c\x08\xb6\xe9\xa7\x4d\xa6\x52\x29\xf4\xf6\xe6\x30\xb6\ +\x76\x35\x8a\xc5\x12\xc6\x27\x66\x60\xdb\x14\x21\xe4\xaa\x1b\xc0\ +\x87\xdd\xdf\xd7\x72\x63\x9b\x8b\xad\x54\x03\x57\x16\x50\x51\x39\ +\xc5\xe4\xac\x6b\x4c\x67\x44\xbb\x38\x5e\x18\x60\x49\x27\x5e\x90\ +\xc2\xc6\xc4\x1a\xbd\x19\x55\x90\x7d\xb8\xfd\x1f\x09\x84\x84\x99\ +\xeb\x42\x79\x41\x59\x5c\xcb\xd5\x64\x48\xb9\x7c\xb1\x1a\x68\xe5\ +\x5e\x11\x80\x44\xc3\x89\x64\x79\x52\x6d\xf1\x1e\x92\xd7\x4c\x68\ +\x68\x46\x7f\xb4\x50\xf9\x52\x12\x30\x57\x1e\x96\x4d\x51\xa9\xd8\ +\x98\x2f\xd5\x30\xbb\x50\x71\x56\x80\x9d\x2b\x61\x76\xa1\x82\x62\ +\xa5\x86\x5a\xcd\xb1\x1f\x79\xe0\xe7\xe7\x16\x07\x2e\x3c\xb0\xe1\ +\xee\x89\x68\x0f\x14\xee\x1d\x67\x9f\x64\xee\x5e\x08\x58\xe9\x84\ +\x07\xb0\x1a\x0a\xa5\x2a\x16\x4a\x35\x14\x4a\x01\x70\x39\xac\x9e\ +\x04\x20\x49\x15\x6c\x93\x02\x33\x0b\x0e\x30\xf7\x76\x67\xa5\x2d\ +\xe5\xd9\xb4\x29\x42\xd0\xd5\xd5\x89\xf5\xeb\x46\x01\xd8\xb8\x78\ +\x69\x0a\xb5\x5a\xe8\x6e\x37\xed\x70\x54\xc1\x2b\xe0\x8c\x08\xce\ +\xb6\xca\x6e\xb5\xb2\x80\x4a\x14\xe2\x30\xaa\x89\x59\x61\x03\x52\ +\x2f\xba\x5e\x96\x25\x9d\x78\x5f\x52\x1e\x94\xf8\x72\x88\xc4\xaa\ +\x42\x1f\x72\xc5\x4a\x9f\x22\xc0\x28\x5f\x06\x37\x6f\x98\x13\x33\ +\xd7\x05\x8e\x3a\x06\xf1\x91\x4b\x28\xab\x6e\x46\x0c\x09\x53\xff\ +\x64\x26\xc5\xb4\x8d\x86\xe4\xe5\xb6\x7c\xf7\x58\x9f\xf3\x32\xcf\ +\x17\x1d\x60\x9a\xca\x97\x30\x3d\x5f\x42\x7e\xa1\x8c\x42\xb9\x86\ +\xaa\x65\xbb\xc0\x04\x7e\xfc\xc0\x05\x37\x7e\xfa\x85\x02\xac\x48\ +\x93\xc0\xca\x0f\xab\xff\xaa\x7a\xc6\xfc\x72\xd5\x42\xa1\x54\x45\ +\xa1\x54\x45\xb1\x5c\x43\xb5\x66\x39\xec\xc7\xef\x4f\x60\x46\xf0\ +\xf8\xe6\x7c\xb1\x8a\xa9\x7c\x09\xdd\x1d\x6d\xc8\x75\xb6\xfb\x65\ +\x8a\x13\x6c\x53\x04\xe8\xe8\xc8\x62\xdd\x9a\x51\x74\x64\xdb\x70\ +\xe1\xe2\x64\x94\xdb\x4d\x1a\xc0\x2d\x00\x6e\x05\xf0\x26\x80\x0b\ +\xad\x00\xab\x15\x02\x54\x1b\x31\xd0\xd7\xad\xcc\xef\x01\x95\x34\ +\x7a\x26\xa4\x6b\x14\xb4\x38\x60\x62\xbf\xb6\x8a\x87\x97\x7d\xe0\ +\xb5\xf1\x42\x25\x44\x78\x21\x58\x96\xc0\x03\x95\xae\xcd\x72\xb8\ +\x8a\x79\x49\xb9\x0c\x00\x2b\xae\x18\x4d\xea\x0c\x6b\x10\xc3\xd4\ +\x54\x98\x66\x53\x8a\x4a\xcd\xc6\x5c\xb1\x8a\xe9\xb9\x32\x26\xf3\ +\x25\xcc\x16\x9c\xe5\x7b\x59\x60\x0a\xae\xb7\x0b\x10\xe2\x28\xad\ +\x70\x1f\xfd\x33\xa2\x07\x9f\xba\xc1\x4a\xc5\xc2\x1b\x14\x4a\x1d\ +\x06\x59\xae\x5a\x28\x96\x6b\x28\x94\x6b\x28\x55\x2c\x58\xb6\xcd\ +\xb0\xad\xe0\x9a\x17\xcb\x16\xc6\x67\x8b\x68\x6f\x4b\xa1\xb7\x3b\ +\xeb\x34\x4e\x65\xcf\x23\x40\x5b\x5b\x06\xa3\xab\x87\x31\xd0\x9f\ +\xc3\xa5\x4b\x93\x58\x28\x94\xc2\xda\x4d\x00\x5c\x0d\x67\x99\xe3\ +\x77\x00\x1c\x6f\x36\x58\xad\x18\xa0\xea\x67\x18\x15\x9b\xc8\x07\ +\x2a\x29\x92\x48\x69\x81\x70\xc0\xd2\xc5\xfb\xeb\x9c\x2b\xbf\xbc\ +\xa2\x13\xb2\x02\x70\x88\xa2\x2c\x26\x8d\x12\x90\x8c\x19\x17\x53\ +\x17\x91\x7b\x1d\x17\xa0\xd5\x42\xb8\x3f\x76\x36\xbb\x7a\xd3\x51\ +\xf9\x8f\xaa\x8a\x53\x88\xe8\x87\xe6\x33\x27\x9b\xa2\x52\xb5\x30\ +\x57\xa8\x60\x6a\xae\x8c\xa9\xb9\x12\xf2\x0b\x15\xf7\xc5\x64\xed\ +\x37\x41\x4e\x99\x31\xc9\x80\x25\x81\x95\xf0\xb1\x09\xf0\x8c\x59\ +\x2c\xc6\x10\xac\x84\xab\x2d\x80\x95\xe9\xb5\x37\x17\x8f\x71\x95\ +\x2a\x16\x8a\x95\x1a\x8a\x95\x1a\xaa\x35\x17\xb4\x52\x8e\xd1\xbe\ +\x6a\xd9\x18\x9f\x29\x82\x52\x60\x20\xd7\xc1\x6d\x29\x0f\xf0\x63\ +\x3b\x99\x74\x1a\x43\xab\x06\xb1\x7a\x78\x00\x53\xd3\xb3\x98\xcd\ +\x2f\x44\x35\x61\x35\x9c\x15\x43\xa7\x00\xbc\x95\x1b\xdb\x6c\x37\ +\x0b\xac\x56\x06\x50\xdd\xbc\x11\xfd\xbd\xde\x84\x4f\xfe\x01\x18\ +\x9f\x2d\x3a\x9b\x37\x8a\x24\x45\x3e\x30\x04\xad\x20\x65\xf0\x4c\ +\xb3\x2f\xb6\x38\xa1\x93\x79\x00\x35\x0f\x70\x30\xc7\x8a\xc9\x2f\ +\xd4\x4f\x84\x38\xf6\x40\x3d\x17\x4a\x06\x32\x81\xaf\xf1\xbd\x11\ +\x56\xc5\x94\xb2\x71\x21\xe2\x9f\xea\xea\x78\x62\x36\x55\x9d\x18\ +\x24\xa7\xac\xd1\xdc\x65\x4e\xe5\xaa\x8d\x7c\xa1\x8a\xc9\xb9\x12\ +\xa6\xe6\xca\x98\x2b\x54\x51\xae\x3a\xaa\x0e\x7b\x8f\x44\x3f\x4b\ +\x25\x60\x49\xd7\x83\x61\x57\x5e\x3a\xa6\xb1\xaa\x81\x11\xf6\x9a\ +\x45\x81\x15\x6f\xbf\xe4\x0e\x00\xa1\x4d\xcd\x16\x8f\x6d\x55\xaa\ +\x0e\x68\x95\x3c\xd0\x82\xf3\x31\x98\xca\x97\x50\xae\x5a\x18\xe8\ +\xc9\xfa\x6e\x37\xe2\xe0\x2b\x01\x90\x4e\xa7\xd0\xd7\xdf\x8b\xb1\ +\x35\x23\x98\x9f\x5f\xc0\xc4\xd4\xac\xca\x54\xcc\x4a\x1f\x80\x8f\ +\xb8\xc7\x7b\x73\x63\x9b\x2b\xcd\x00\xab\x95\x03\x54\x92\x8d\xca\ +\x49\x3a\x31\xc3\xaa\x7e\x62\xac\x78\x12\x0f\xb4\x88\xea\xcb\xab\ +\x79\x88\x45\xd6\xa5\x65\x52\xdc\x0b\xc4\x37\x44\xb6\x6d\xe9\x58\ +\x95\x82\x81\x89\x2f\x15\x53\x46\xa8\xaa\x41\x94\x87\x4d\x97\xa8\ +\xc9\xe8\x5e\xff\x29\x75\xf6\xb8\x73\x98\x93\x0b\x4e\xc5\x0a\x2a\ +\x55\x1b\xb6\xb7\x52\x02\x6b\x40\xe6\xbb\xca\x15\xce\xcf\xb7\xd5\ +\xb0\x2b\x36\xaf\xc8\xae\x20\xdf\xe7\x66\x80\x95\xee\x19\x69\xa5\ +\xd8\xb6\xa3\x2e\x97\x2a\x8e\x7a\x58\xa9\xda\x98\x9e\x2b\x61\xa1\ +\x54\xc5\x40\xae\x03\xd9\x2c\x03\x05\xc2\xc7\x24\x95\x22\xe8\xce\ +\x75\x63\xfd\xba\x51\x58\xb5\x2a\x2e\x8d\x4f\x99\xba\xdd\x0c\xc1\ +\x31\xb2\x2f\x34\x0a\x56\x2b\x0b\xa8\x14\x93\x37\x27\x66\x8b\x18\ +\x9f\x09\x1f\xf5\xab\x1b\xb4\x38\xba\x2f\xa8\x7f\x1a\x67\x64\xff\ +\xe1\xd5\x01\x8e\xee\xe1\xd6\x00\x1b\x5f\x84\x08\x9c\x5e\x31\x32\ +\x42\x11\x39\x73\x38\x10\x91\x88\x78\x43\x15\x4f\xf7\xc7\xfd\x13\ +\xd6\x5e\xb1\x29\x50\xb5\x6c\xcc\x15\x5d\xb5\x2e\x5f\xc2\x5c\xb1\ +\xea\x82\x13\xfc\x6b\x23\x31\x4b\x0f\xb0\x04\xc0\x61\x01\x2b\x60\ +\x4c\x08\xda\x21\x5e\xe7\x30\x55\x10\xc1\xfd\xe4\xef\x37\x09\xbf\ +\x9f\x1a\xb0\x12\x6e\x49\xd4\x5d\x69\x89\xd8\xcc\x68\xe2\xf8\x4c\ +\x11\xe3\x33\x05\xf4\x76\x67\xd1\xc3\x18\xd9\x3d\x61\x47\x04\x3b\ +\x3a\xb2\x58\xb7\x76\x14\x6d\x6d\x29\x5c\xb8\x34\x89\x4a\xb8\xdb\ +\x4d\x1b\x80\x3b\x01\x6c\x84\xe3\x76\x33\xd9\x88\xdd\x6a\xc5\x00\ +\x55\x9f\xcb\xa8\xc4\x04\xe3\x1a\x63\x3a\xa0\x61\x49\xd2\x01\x7f\ +\xc2\xaa\x02\x60\x8e\xb9\x07\x57\x63\xb3\xe2\x1e\x52\x0e\x84\xfc\ +\x60\x1e\x54\x84\x34\xa6\xee\x33\xa2\x1a\x21\xbd\xbc\x11\x9d\xe6\ +\x4e\x15\xec\x86\x5f\x51\x41\x43\x7f\x62\x09\x3f\x4d\xd1\xeb\x67\ +\xcd\xb2\x31\x5f\xae\x61\xda\x05\xa7\xbc\xa7\xd6\x51\x41\xad\xe3\ +\x2e\x98\x5a\x15\x16\x19\x96\x52\x6d\xd7\xb1\x5d\xa6\x51\xe1\x60\ +\xa5\x4f\xa3\x03\x2b\xf1\x8e\x36\x7b\x24\xb0\x51\xb1\x29\xc5\xcc\ +\x7c\x19\x67\xc6\xe7\x91\x6d\x4b\xa3\xb7\xdb\x5d\x2e\x46\xe5\x36\ +\x46\x80\xf6\xb6\x36\xac\x1d\x1d\x41\x6f\xae\x13\x17\x2e\x4d\xa2\ +\x58\x2a\x47\xb9\xdd\x5c\x0f\x67\x13\x89\xb7\x01\x9c\xae\x17\xac\ +\x56\x0c\x50\xf5\x6b\x56\xf8\x9c\x98\x29\x62\x7c\xb6\xe8\x5f\xc8\ +\x20\x46\x48\x1b\x07\xb4\x14\x0f\x5e\xf8\x7c\x29\x06\xa8\x22\xd9\ +\x13\xa4\x87\x99\x65\x5e\xe2\xcb\xc6\x81\xa8\x08\x64\xe2\x8b\x20\ +\x19\x70\xd9\x8c\x7a\x56\xe5\xcd\x23\x62\xac\x34\xf1\x45\xc2\x33\ +\x9e\xfe\x7a\x51\x96\x45\x51\x28\xd7\x30\x33\x5f\xc1\xe4\x5c\x19\ +\xb3\x0b\x65\x1e\x9c\x54\x6d\x90\xd8\x14\x03\x58\xc2\x05\x23\xda\ +\x6b\xa8\x60\x57\xd2\xdc\xa9\x28\xb0\x0a\x4f\x13\x65\x9f\x94\xc0\ +\x8a\x63\x5d\xf5\x5d\xf6\x66\x08\x21\x04\xa5\x8a\x85\x73\x93\xf3\ +\xa0\x00\x7a\xbb\xdb\x99\x38\xa6\x6d\x8e\xf7\x17\xd2\xde\xda\x56\ +\x43\xfd\x18\x9f\x9c\x46\x7e\xae\x10\x05\xb6\xeb\x01\x7c\x10\xc0\ +\x59\x00\x87\x73\x63\x9b\x69\x5c\xb0\x5a\xd1\x40\x05\x28\x46\xfd\ +\x20\xde\xf4\xb8\xa0\xa5\x7a\xa0\x21\x3d\x88\xba\x38\x15\x98\x98\ +\x01\x58\xf4\x86\x0f\xfe\xcb\xc5\x37\x81\xeb\x23\x11\xca\x54\xd1\ +\x2e\xe9\xf2\xe8\xe2\x22\x42\xc3\xc5\x29\x98\x82\xc0\xb2\x1d\x70\ +\x72\x26\x60\x3a\x93\x0f\x8b\xe5\x5a\x30\x5a\xa7\x68\x4f\x60\x87\ +\xe2\x1b\xa7\x62\x59\x3a\xc0\x62\x4e\x95\x13\x30\xbd\xbb\xc4\x6a\ +\x66\xec\xf5\x65\x8d\xec\xe1\x60\x15\x71\x5f\xd9\xf6\x73\x57\x94\ +\xff\x7a\x2d\x2d\x58\x01\xd5\x1a\xc5\xc5\xe9\x02\xaa\x35\x1b\x03\ +\xb9\x0e\x10\x42\x50\xb3\x1c\xdb\x20\x61\xae\x83\x33\x22\x98\x42\ +\x7f\x7f\x3f\xd6\x8e\x0e\x21\x9f\x9f\xc3\xd4\x74\xe4\xda\x56\x43\ +\x00\x3e\x02\xa0\x00\x67\x99\xe3\x5a\x1c\xb0\x5a\x11\x40\x75\x5b\ +\x08\x50\x8d\xcf\x16\x31\xee\x8e\xfa\x29\xd9\x42\x0c\xd0\xf2\x1e\ +\x42\xee\xa1\x53\x3c\xc4\x2a\x56\xe5\xbf\x30\x4c\xa1\x51\x6a\x81\ +\x8a\x49\x89\xac\xd0\xd4\x6e\xc5\xd6\x27\x9d\xab\xd2\xa9\x2f\x87\ +\x00\x70\x44\x9d\x28\x4c\xdc\xe4\x96\x4d\x51\xaa\x58\xc8\x2f\x94\ +\xfd\x99\xe1\x05\x17\x9c\xa8\xd7\x78\xe6\xcf\x63\x42\x52\x8d\x1e\ +\x68\x41\x03\x5a\x4c\x7b\x45\x95\x50\x65\xbf\x52\x83\x9b\xde\x3e\ +\xa8\x1b\x3c\xe1\xef\x71\xc4\xfd\xe6\xa6\xac\xc8\x0c\x7b\x29\xed\ +\x55\xdc\xa5\x26\x8e\x2a\x38\x3e\x53\xc0\x7c\xa9\x8a\xa1\xbe\x0e\ +\xb4\xb7\xa5\xdd\x15\x21\x6c\x58\x9c\x4a\xee\x38\x53\xe7\x72\x39\ +\xac\x5f\x37\x82\x72\xb9\x8c\x4b\x13\xd3\xb0\xc3\xb7\x94\xcf\xc1\ +\xd9\xed\xa6\x13\x8e\xdb\x4d\xc9\x14\xac\x56\x0e\x50\xf5\xea\x18\ +\x55\x01\x13\x33\x45\x89\xed\xc4\x05\x2d\x22\x3e\x60\x9a\x49\x7e\ +\xde\xcc\x5f\x29\x4e\xc3\x8c\x58\x1f\x30\x08\xf1\xec\x43\x1e\x9c\ +\x43\xdb\x17\xd5\x03\x2d\xf6\x49\x04\x2b\x3f\x34\x82\x45\x8a\xc0\ +\x44\xb4\x89\x85\x30\x06\x59\x3c\x70\x9a\x75\xe7\x3a\xcd\xb8\xb3\ +\xc3\x6b\x2e\x38\x71\xd8\x24\x67\xd7\x02\x17\x5b\x97\x96\x65\x31\ +\x27\x2a\xc0\x12\xab\x90\x3f\x04\x21\x46\xf6\x18\x60\x25\x3e\x2f\ +\x7c\x98\xd0\x1e\xb6\x1d\x8a\xb6\x2e\xa5\x4c\xbb\x73\xd5\xfa\x73\ +\x1d\xe8\xee\x6c\xf3\x97\xac\xf1\x96\xb1\xf1\x9c\xf3\x53\x29\x82\ +\xce\xae\x4e\x8c\xad\x5d\x8d\x14\xa1\xb8\x10\xed\x76\x93\x05\xf0\ +\x5e\x00\xfd\x00\x76\x98\x4e\x5f\x58\x31\x40\xd5\xd7\xab\x5e\xe1\ +\x93\x65\x54\x80\xfc\x92\x03\x9a\x77\x4c\x7c\xc1\x09\xfb\x2b\x80\ +\x0f\x09\x4a\x56\xdb\x17\xf8\xaf\xa4\xf6\x2b\xab\x7b\xc8\xd9\x34\ +\x4c\x39\x12\xf3\x82\xfc\x20\x2b\x87\xe4\xb9\x9e\x6b\x54\x0a\xaf\ +\x33\x2a\xe3\xbb\x26\xb9\x4a\x2c\x9b\xa2\x5c\xb1\x90\x77\x77\x46\ +\xf1\xd4\xba\x9a\x45\xdd\xb9\x38\xfc\xbf\x00\x71\xc0\xfd\x89\xe0\ +\xe5\x77\x46\x35\x15\x21\x04\xb0\xd8\x0b\xa8\xfc\x60\x48\xd7\x2d\ +\x04\xac\xd8\xfb\xa4\x05\x2b\x3e\x6d\xd8\x07\x8c\x57\xfd\x08\xdf\ +\x0e\xae\xad\x06\x37\x64\x11\x64\xae\x50\xc5\xa5\xe9\x02\x72\x9d\ +\xed\xe8\xeb\xce\xfa\xe1\xd4\x75\xf6\x0e\x66\xc0\x03\x1d\xd9\x2c\ +\xd6\xad\x1d\x41\x77\x67\x16\xe7\x2f\x4d\xa0\x5c\x8e\x74\xbb\xb9\ +\x09\xc0\x49\x38\x73\xad\x22\x0d\xec\x2b\x68\x17\x1a\x7e\x59\x57\ +\x9d\xe7\x7d\xb0\xcd\x7b\xb0\x62\x59\xb0\x70\x19\xa4\x32\xbc\x65\ +\x3c\x82\xa5\x6a\x29\x82\x10\x61\xbd\x25\xc2\xa4\xf3\x51\x13\x10\ +\x27\x9e\xb0\xa3\xef\xdc\xf6\x4c\x90\x8f\x83\x32\xe4\xb5\xb7\x21\ +\xe6\x55\xdc\x78\x71\xe1\x38\x67\x67\x1d\x5e\x81\x52\xaf\x07\x05\ +\x10\x4a\x41\xb8\xad\x78\xa8\x32\x35\x8b\x85\x36\xdc\xa9\x04\xa5\ +\x2a\xc6\xf3\x25\x9c\x9b\x5a\xc0\xb9\xe9\x82\xb3\x39\xa6\x67\x14\ +\xf7\x40\x42\x41\x9b\x82\xd3\x70\xf0\x52\x81\x96\x8a\x65\x89\x80\ +\x15\xaa\x0e\x6a\x55\x41\x11\xac\x34\x1f\x15\x25\x58\xc9\x69\x39\ +\x40\x54\x80\x95\xe2\xd0\x6f\x2b\x1b\xb2\xd4\x42\x88\xc3\xac\x76\ +\xed\x3f\x87\x43\xa7\xa7\xfd\x49\xb6\x9e\x50\xea\x8c\xdc\x96\xdd\ +\x15\x28\xda\xda\xdb\x71\xe7\x1d\x37\xe3\xfe\x4f\x7e\x10\xab\x87\ +\xfa\xa3\xa6\x02\x77\x01\xf8\x1c\x9c\xd5\x17\x22\x65\xc5\xac\x47\ +\x05\xc8\x4b\x2c\x51\xf5\x7b\xc5\xa4\x0f\x16\x04\xf2\x1e\x1f\x16\ +\x44\x38\xa5\x8b\x7a\x3f\xcc\x83\xe6\xae\xc7\x47\xbc\x38\xca\xaa\ +\x56\xc4\x5f\x1f\x8a\x7a\x0f\x9d\x9f\x9e\x79\x0a\x29\x40\xbd\x87\ +\x97\x06\x79\x79\x61\x91\xcd\x3d\x27\x6c\xfa\xa0\x8d\xd2\x62\x79\ +\x14\xa0\xec\x42\x6d\x70\x1b\x25\x94\xaf\x9c\x4d\x1c\xf5\x62\xb8\ +\x6d\xb0\x28\x45\xb5\xea\xb8\x66\x94\x2a\x35\x94\xab\x16\x6a\x16\ +\x65\x46\xea\x74\x25\x78\x9d\x80\x7f\xed\xf9\x10\x37\x15\x37\x1b\ +\xd4\xbb\x04\x54\x8a\xf7\x6d\x5b\x80\x0b\xb0\xec\xe5\xf2\xae\x4f\ +\xb0\x2a\x82\xbf\xe6\x39\x71\xe0\x3c\x58\xc5\x85\xf8\xae\x3a\x84\ +\xb0\x6b\x98\x51\xdf\xf5\x8d\x80\x38\xbb\x35\xbb\x33\xb4\xa9\x93\ +\xd0\x4d\x2f\xc6\x07\xc7\x5e\xa1\x84\x52\x66\x6d\x2c\xb7\x8d\xd4\ +\x7b\xbe\x18\x3b\x9d\xb7\xda\x1d\xa3\x2d\x78\x7e\x7a\x11\xdb\x5a\ +\x2d\x8a\x10\x02\x2c\x94\xaa\x38\x37\x31\x8f\x2b\x47\x7b\x91\x4d\ +\xa9\x95\x30\xcb\xa6\x80\x4d\x91\x4a\xa5\x30\xb6\x6e\x0d\x46\x86\ +\x07\x70\x71\x62\x26\x8a\x1e\x76\xc0\x50\xab\x5b\x51\x40\xc5\x2f\ +\x49\x1b\x3c\xd4\xe2\xfd\x54\x5d\x1b\x1d\x68\x11\x22\xae\xb6\xc9\ +\xe4\xe1\xbe\x8e\xc1\x67\x33\x58\xc0\x4e\x88\x13\xda\x25\x28\x77\ +\x6e\x98\x1b\xef\x52\x66\x6f\x1b\x72\xaf\xcd\x1e\x10\x49\xa0\x8c\ +\x60\xf7\x60\x1f\x96\x54\x6c\x4e\x6c\x51\xc8\x64\x4f\xaa\xd9\xc1\ +\x85\x82\x75\xbf\x70\xc0\xa9\x52\x63\x96\x16\x71\x13\x9a\xd9\x53\ +\x82\x8e\x11\x02\xff\xc5\xe7\xee\xa7\x50\x0c\x61\xa8\x25\x0b\x5a\ +\xf5\x02\x16\x07\x44\x0c\x58\x79\x8b\xdf\xf9\xd7\x9e\xba\x20\xe2\ +\xb7\x33\x0a\xac\x20\xa5\x0d\xf0\x2a\x28\x8b\x50\x12\xb4\xc7\xfb\ +\x70\x79\x75\xbb\xb0\x15\x00\x26\x03\xd0\x24\x7c\xcd\xae\x56\x0b\ +\x85\xb3\x3d\xfc\x35\xeb\xfa\x71\xe7\xc6\x11\x64\xdb\xc2\x31\x85\ +\x10\x82\xa9\xa9\x69\x6c\x7b\xfe\x65\xbc\x7d\xf8\x94\xc9\xf3\x71\ +\x1c\x40\xd1\xa4\x2d\x2b\x06\xa8\x54\xeb\x49\x47\xa5\xd5\x5d\x27\ +\xca\x3c\x4a\x5c\x62\x17\x81\x7c\x20\x70\xd1\xc4\x61\x02\xde\x0b\ +\x41\xdc\x97\xd9\xfb\x36\xc2\xff\x42\x06\x31\x0c\xab\x22\x54\x00\ +\x2c\xa6\x6e\xaf\x44\x56\x05\x11\xd3\x48\x7d\x61\x80\x90\x61\x5f\ +\x32\x63\xe2\xf5\x46\xca\xe4\x27\x8a\x24\xb6\xed\x38\xb4\x56\xaa\ +\x36\x4a\x55\x07\x9c\x58\xd6\xe4\x49\xca\x04\x9b\x54\xe2\xd5\x45\ +\xe4\xc0\x80\x3c\xc9\xc0\xe5\xf5\xd1\x04\xb0\x58\x62\xe6\x83\x03\ +\x02\x80\xf4\xd7\x2c\xa7\x41\x5e\x07\xc8\x78\x76\x65\x0e\x56\xea\ +\xb4\x1e\xcb\x06\x55\x80\x15\xdb\x75\x8a\x00\xbc\xfc\x20\xc2\x00\ +\xaa\x8a\x7f\x2e\x8e\x50\x0a\xb4\xb7\xa5\x70\xd3\x95\x43\xb8\xf9\ +\xea\x55\xc8\xb6\xa5\x43\x41\x93\x10\xe0\xdc\xb9\xf3\xd8\xba\xfd\ +\x25\xbc\x73\xea\xbc\x49\x15\x07\x01\x7c\x07\x40\xd5\x64\x75\xd0\ +\x25\x07\xaa\x54\xa6\x03\x76\xad\x64\x96\x58\xa5\xbf\x50\x6f\xcd\ +\x74\x70\xc8\xc4\x52\x7d\x20\x0c\xb4\x18\x8c\x52\xb0\x25\x0a\x1a\ +\xb8\x7c\xb0\x0f\x17\xdb\x1e\xb6\x5d\x5c\x5e\xe6\x21\xf4\xbf\xda\ +\x72\x3d\x5e\x18\x9b\x07\x0c\xd3\x93\x54\x52\xb6\x97\x92\x16\x29\ +\x30\x3a\x4e\xd5\xf5\xe2\x9c\x25\x77\x6b\x2e\x6b\x2a\x57\x6d\x67\ +\x39\x5e\xcb\x86\x6d\x0b\xb3\xc8\x75\xf7\xc2\xd8\x9e\x42\xb9\x1f\ +\x25\xb3\x13\xd4\x5b\x16\xac\xfd\x4b\xcf\xb2\x2c\x0d\x60\x79\x1f\ +\x17\x2d\xbb\x62\x55\x41\x4e\x53\x23\x4a\xb0\xf2\xef\x8d\x08\x56\ +\xcc\xa5\x8e\x06\x2b\xe6\x56\x51\x96\x75\x45\xa8\x80\xec\xb3\xb9\ +\xc8\x58\x45\x29\xd0\xd5\x91\xc1\x1d\xd7\x8d\x60\xe3\xd8\x00\xd2\ +\x29\x12\xbe\x1a\x2b\xa5\x38\x7a\xec\x04\xb6\x6e\x7f\x09\x17\xc7\ +\xa7\x4d\x98\xd4\x21\x00\xbf\x01\x67\xfd\x2a\x23\x59\x72\xa0\xea\ +\x18\xde\x88\xc2\xb9\x7d\x46\xb3\xdd\x02\x16\x01\x9e\x30\xf8\x80\ +\xc1\xda\x43\xc2\x41\xcb\x67\x2b\xac\x21\x94\x05\x19\x1f\x3c\xd8\ +\x17\x9f\x30\xf5\x32\x46\x52\xd6\x66\x25\x74\xc3\x09\xe3\x0d\x63\ +\xbc\xea\x16\xe4\x0d\x8a\x12\xd4\x45\x9f\x9d\x89\x65\x53\xc5\x1a\ +\xea\x2c\x22\x10\x7f\x27\x15\xdb\xa6\xa8\x5a\xce\x5a\xe1\xd5\x9a\ +\x03\x4c\x1e\x63\xa2\xc2\x75\x90\x49\x8f\xa4\x00\xc7\x10\xc2\xfd\ +\x30\x77\x48\x09\x5e\x32\x68\x09\x2c\x8b\x53\xdd\x35\x80\x25\xaa\ +\x83\xac\xea\x05\x57\xc5\x72\x59\x72\xb8\xdd\x4a\x63\x93\x62\xed\ +\x47\x02\x73\x0a\x46\x44\xa8\xcf\xc0\x38\xb6\xe7\xb7\x29\x42\x05\ +\xf4\x91\x74\x71\x59\x15\xa5\x40\x7f\x4f\x16\x77\x6d\x1a\xc5\x15\ +\xab\x7b\x84\x7b\x26\xdc\x59\x42\x50\xab\xd5\xf0\xe6\xfe\x83\xd8\ +\xbe\x73\x0f\x66\xe7\x16\x4c\x40\xea\x05\x00\xff\xca\xfd\x85\xe9\ +\x5a\xeb\x4b\x0d\x54\xa4\x73\x78\x23\x2d\x9c\xdb\x67\x9c\x81\xd5\ +\x12\x88\x18\x06\xe6\xa1\x0f\x01\x2d\x2f\x8f\x7f\x4c\x19\xd0\xe1\ +\x0c\xcf\x24\x30\x90\xb3\x15\xb1\x5f\x79\xef\xab\xca\x15\x2c\x1b\ +\x9c\x82\x32\x18\xb0\xa3\x0c\x88\x29\x41\x92\xef\x35\x6f\xcc\x87\ +\x74\x4c\x5d\xf6\x60\x51\x0a\xcb\x72\x1c\x4f\xbd\x8d\x0c\x6a\x96\ +\xed\xcf\x7f\x11\x41\x57\x9e\x00\xaf\xb7\x6b\xc9\x77\xd0\xe4\x66\ +\xa9\x92\x07\x2a\xab\x9f\x98\xaa\x40\x8b\x67\x59\x22\x60\x29\x55\ +\x42\x51\x1d\x74\x3f\x4c\x2c\x10\xb1\xaa\x60\x14\x58\x81\xb0\xf5\ +\x51\x2e\x6d\x60\xa7\x62\xd5\x3c\x91\x4d\x05\xc6\x75\x95\x0a\xe8\ +\x0f\xc8\x68\x54\xc0\xc5\x34\xac\x8f\xae\xea\xc6\xdd\xd7\x8f\x62\ +\xa4\xbf\x33\x14\x1e\x09\x21\x28\x97\x4a\x78\xe9\x95\x7d\x78\xf1\ +\xd5\x37\xa3\xb6\xda\x02\x00\x0b\xc0\x43\x00\x7e\x13\xc0\x61\xc0\ +\x1c\xa4\x80\xa5\x03\x2a\xbf\x47\xeb\x3f\xfe\x31\x4c\xee\xfb\xc7\ +\xba\x0a\xa1\x8a\x13\xe5\xa8\x9e\x08\x5a\x4a\x20\x10\x2d\xba\x2e\ +\x63\x61\xd9\x0d\xf1\x9f\x59\xef\xfb\xe7\x26\x0d\x10\x8c\xb3\x59\ +\x11\xc6\x66\xc5\xc4\x39\x35\xb2\xb6\x2e\xf0\xf5\xb3\xba\x27\x43\ +\xfc\xfc\xf7\x96\x06\xfb\xc6\x59\xae\x6d\xc9\xdb\x5b\xae\x66\x39\ +\xe7\xc1\x9e\x74\xec\xb5\x20\xbe\x8a\x24\x3d\x52\x51\xe0\x44\x94\ +\x87\xda\x90\xa0\x1f\x8a\x7b\xc5\x04\xa8\x81\x8b\x07\x2d\xce\xbe\ +\xe6\x52\x68\x51\x25\x14\x01\x8b\x65\x57\xac\x8a\xa7\x52\x05\xa3\ +\xc0\x8a\x53\xed\x18\x55\x4c\x05\x56\x9c\x29\x3d\xcc\xb8\xce\xa8\ +\x80\x9c\x7d\x60\x89\x54\x40\x42\x80\x0d\xa3\x7d\xd8\xbc\x69\x35\ +\xfa\xba\xdb\x23\xec\x51\x04\x73\x73\x73\x78\x6e\xe7\x2b\xd8\xbb\ +\xff\x48\xd4\x04\x4f\xc0\x31\x98\x7f\x17\xc0\x1f\x01\xb8\x58\xcf\ +\x8e\x35\x4b\x01\x54\x6c\x8f\xc8\xa3\x5f\x00\x5d\xf7\x0d\x76\x3c\ +\x5f\x16\xdb\xa6\x28\x96\x6b\xce\x0b\x46\x00\x6f\x89\x55\xc7\x17\ +\xc9\x79\x31\x53\xfe\x8c\x64\xf5\xec\xec\xa0\xf2\xe0\x9b\xc5\xa9\ +\x55\x94\xfa\x54\x9c\x63\x49\xec\xd6\x56\xf2\xb8\x60\x60\x39\x52\ +\xda\xcf\x00\x0d\x2a\x48\xaa\x9f\xaf\x96\x00\x80\x0d\xd8\xee\xcb\ +\x6a\x83\xfa\xb3\x81\x2d\x9b\xa2\x66\xdb\xb0\x2d\xef\xd8\xdb\x63\ +\x8e\xdb\xf8\x4b\x66\x5d\x2c\x7b\x92\xee\x84\x66\xc2\xa7\x94\x3e\ +\xbe\xd2\x17\x9a\x9b\x50\xe5\x87\xc6\x87\xfe\x80\xee\xf2\xcc\xd9\ +\x6b\xb3\x16\xb0\x02\x10\x02\xc0\x4c\x0d\x61\xd8\x95\x38\x0a\x67\ +\x0a\x56\xde\xf5\xe5\xf6\x07\x24\x7e\x1b\xfd\x27\x2b\xca\x5e\xc5\ +\xde\x76\xc1\x5e\xb5\xd8\x2a\x20\x05\x90\x49\x11\x5c\x7f\xc5\x20\ +\x6e\xbb\x76\x18\x9d\xd9\x4c\x24\x48\x8d\x8f\x4f\x60\xeb\xf6\xdd\ +\x38\x72\xec\xb4\x6c\xda\x90\x65\x1a\xc0\xd7\x01\xfc\x25\x80\xb9\ +\x7a\xb7\xd5\x5a\x6c\xa0\x22\xe2\x6f\x9a\x10\xac\x7e\xef\x3f\x0b\ +\x7d\x0d\x6c\xea\x18\x7d\xfd\x87\x87\xf9\x6f\x7a\xae\x84\xf1\x99\ +\x82\xb3\x89\x63\x8a\x20\x45\x52\xee\xaf\xb3\x86\x0e\x71\x37\x77\ +\x4c\x11\x67\x01\xb0\x54\x2a\x05\x42\x68\x00\x6c\xbe\xf9\x87\x80\ +\x53\xfa\x3c\xf5\x40\x7c\xe1\x85\xee\xb0\x54\xdd\x4b\x41\xd9\x97\ +\x86\x39\x0e\x58\x18\x05\xe0\x6d\x68\x09\x7f\x63\x4b\xdb\xa6\xb0\ +\xa8\xd3\x5f\xea\x87\x79\xa9\x85\xa1\x75\xee\x3a\x30\x70\x63\x04\ +\x50\x1a\xf6\x14\xda\x57\x3e\x28\x2e\x6c\xc9\xa0\x24\xce\x36\xe7\ +\xf7\xc9\x0b\x30\x9c\xe1\xa0\x9c\x2d\xca\x2d\x43\x02\x2c\x86\x5d\ +\xb1\xe4\x84\x65\x57\xf5\x82\x15\x33\x1a\xe7\xab\x65\x08\x1f\x09\ +\x54\xda\xab\x34\x2a\x20\x37\x38\xa3\x08\x6a\x36\xab\xa2\x14\xe8\ +\x68\x4f\xe3\xd6\x6b\x86\x71\xc3\x86\x41\xb4\xa5\x53\x91\xe5\x9f\ +\x3c\x79\x1a\x4f\x6f\xdf\x8d\x33\xe7\xc6\x4d\xec\x51\xa7\x00\xfc\ +\x6b\x00\x7f\x0f\xc3\xd1\x3d\x9d\x2c\x16\x50\x11\xc5\x31\xf3\x1b\ +\xef\xea\x53\xe6\x3f\x67\xbe\x8f\x0d\x85\xa9\xc7\x29\x9c\x61\x0d\ +\x9e\x9f\x9e\xb7\xe9\xa3\xf3\xeb\x31\xb4\x80\xa5\x11\x38\xc0\x06\ +\x17\xe0\xd8\x38\xf6\xf1\x51\x33\xb7\x80\x1a\x79\xe0\xe2\xb5\x97\ +\x05\x1b\x9d\xda\x2a\xae\xc2\xc0\xdb\x92\x04\x08\x61\x19\x51\xbd\ +\x00\x15\x06\x4e\xc4\x04\x90\xa2\x52\x50\x39\x15\x61\x63\x20\x03\ +\x97\x12\xb4\x3c\x96\xa5\x00\x2c\x96\xf1\xf8\x6c\x8a\x70\xc6\xf6\ +\x48\xb0\x82\x08\x46\xf5\x81\x15\xd7\x1e\x95\xbd\x2a\x44\x05\x64\ +\x4d\x06\x94\x9d\xa8\xd5\x02\x56\x45\x29\x45\x4f\x57\x3b\xde\xb3\ +\x69\x35\xae\x5e\xd3\xe7\xcf\x27\x54\xde\x61\x42\x60\x5b\x16\xde\ +\x3e\x74\x14\xcf\xee\x78\x05\x93\xd3\x79\x13\x90\xda\x07\xc7\x68\ +\xbe\x15\x00\x6d\x74\x83\xd2\xc5\x00\xaa\x08\x90\x82\x6e\xec\xbd\ +\xe1\xca\x00\xef\x0b\xc4\x18\x90\x29\x05\x25\x14\x96\xad\x59\x25\ +\x41\x62\x2b\x8c\xff\x9f\xe0\x84\xaa\x4c\xc3\xa8\x71\x7e\xd9\x60\ +\x00\x93\x65\x25\x0a\x7f\x40\x33\x07\x58\x26\x0d\x77\xee\x17\xc4\ +\x5f\x0b\x95\x8a\x47\x98\xf4\xc2\xc5\x0b\xb5\x41\xc5\x66\x55\x44\ +\x09\xca\x01\x07\x0d\x0a\x0a\x3e\x40\xcc\x2c\x33\x06\x95\xb4\x80\ +\x65\xc0\xae\xb4\x60\x85\x30\x30\x52\x81\x15\xcb\x6c\x02\x10\x91\ +\x55\x3f\x8d\xbd\x2a\x4c\x05\x64\x28\x93\x8e\x4d\x35\x83\x55\x51\ +\x0a\x0c\xf5\x75\xe1\xee\x1b\x46\xb1\x66\x55\xb8\x07\x0b\x21\x04\ +\xd5\x6a\x05\x7b\x5e\xdf\x8f\x9d\x2f\xee\xc5\x7c\xf8\x6e\x34\xde\ +\x1d\x7c\x06\x0e\x48\xed\x05\xe2\x19\xcd\x75\xd2\x6a\xa0\x12\x41\ +\x2a\x0c\xb4\x5a\xdb\x10\x22\xfc\xba\xff\x71\x2f\xbe\x94\x86\x05\ +\x1d\x01\xd8\xfc\x74\x8a\x34\x6c\x1c\x73\x1c\x06\x52\x2a\xb0\x0b\ +\xa2\xc2\x41\xaa\x19\x00\xa5\x04\x27\x2d\x70\xc5\xbc\xf6\xca\x13\ +\xc2\x00\x93\x73\xc0\xf6\xcf\x8b\x0b\xfa\xc9\xba\xb7\xb8\xf9\x5d\ +\x3d\x3b\x00\x35\x28\xd9\x15\x3b\x77\xca\x49\xe7\xaa\xf9\xbe\x0d\ +\xdb\x1c\xac\x7c\x55\xce\x27\x50\x8c\x0a\x17\x62\xaf\x32\x55\x01\ +\x7d\x20\x52\x4d\x7f\x67\xea\x6f\x44\xd6\x8f\xe4\x70\xd7\xf5\xa3\ +\x18\xec\xed\x88\xb4\x47\x15\x0a\x05\xec\x7a\xf1\x35\xbc\xb2\xf7\ +\x6d\x54\xc2\xf7\xf7\x03\x80\x0a\x80\xff\x0e\xe0\x77\xe1\xa8\x7d\ +\x4d\x01\x29\xa0\xb5\x40\xa5\x03\x29\xa2\x49\xd3\x62\x11\xaa\xe5\ +\x11\xc5\x7f\xf8\x83\x46\x6a\x00\x88\x47\x10\xbe\x28\xae\xaa\x56\ +\x81\x94\x5e\xd5\x13\xd5\xbc\x50\x80\xd2\x81\x53\x50\x65\xe4\xe5\ +\x54\xaa\x8b\x9c\xd0\xe0\x7f\xdd\x54\x05\x1f\x98\x78\x84\xf2\xe2\ +\x24\x96\x25\x02\x16\x09\x6c\x81\xfe\x3b\x2d\xb0\x2b\xb5\x2a\xe8\ +\x5e\x33\x4a\x65\xb0\x82\xde\x66\xa5\x9c\x63\xc5\x61\x0a\x51\xda\ +\xab\x54\x2a\xa0\xd7\x68\xad\x0a\x08\xd6\xaa\xd9\xd8\x74\x05\x8a\ +\xc0\x1d\xe6\x3d\x1b\x47\xfc\xa5\x5b\xb4\xb7\x97\x10\x4c\x4f\x4f\ +\x63\xdb\x8e\x97\x71\xe0\xd0\x3b\xb0\x2c\x1a\x05\x52\xf3\x00\xbe\ +\x0d\x6a\xff\x29\x08\x99\xba\xb0\xfb\xaf\x62\xb5\x2f\x4a\x5a\x05\ +\x54\x24\xe2\x57\x08\xa3\x26\xaf\x46\xfd\x8d\xe1\x98\x92\x0c\x3a\ +\x22\xbb\x92\x3c\xde\x15\x2d\x96\xc1\x89\x30\xc9\xf4\x2f\x7c\xd3\ +\x41\x4a\x61\xb7\x92\x96\x3f\x01\x9f\x89\x6f\x96\x02\xe4\x94\xd7\ +\xaf\x9e\x5b\x24\x33\x41\x4f\x82\x81\x06\xf1\x3a\xba\x20\x12\x0b\ +\xb0\x22\xd8\x15\x61\xd2\x71\x06\x74\x70\xaa\x20\x6b\x1b\x52\x1a\ +\xd8\xc1\xaa\x61\x3c\xcb\x09\xb3\x57\xe9\x54\x40\x42\x35\xdc\x48\ +\xd2\xfb\xd0\x10\x89\x0a\xdc\x61\x56\xe1\xe6\xab\x87\x0c\xdd\x61\ +\x2e\x60\xeb\xf6\xdd\xbe\x3b\x4c\xc4\xc7\xeb\x12\x40\xbf\x6a\xd7\ +\xca\xff\xf1\xbe\x1f\x7c\xaf\xf8\xb7\x1b\x9b\xff\x3a\xb7\x02\xa8\ +\x62\x82\xd4\x62\xb0\x2a\xa2\x3e\xe5\x7e\x89\x36\xab\xa4\xf2\x71\ +\x11\x50\xa8\x7c\xe0\xde\x3c\xd1\xc6\xc5\xd6\x59\x0f\x48\xe9\x55\ +\x3d\xfd\x9a\x4b\xb1\x00\x4a\x04\xbb\x88\x4b\xab\x4b\xa9\x63\x52\ +\x62\x7f\x01\x70\x0c\x81\xed\x73\x00\x12\x54\x01\x58\x2c\x08\x41\ +\xcd\xae\x58\xb0\x02\x22\xed\x56\x32\x98\x31\x60\xc5\xda\x90\x24\ +\x15\x31\x40\x1e\x25\xce\x08\x2a\x20\xd8\x7a\x5b\xc8\xaa\x44\x77\ +\x98\x54\x84\x3b\x0c\x40\x71\xf4\xe8\x09\x3c\x6d\xee\x0e\x73\x04\ +\xd4\xfe\xed\x4a\xfe\xfc\x8f\xa6\xde\x7e\xd8\xfa\xdb\x8d\xdf\xf7\ +\xbf\x15\x66\x0f\x90\x99\x34\x1b\xa8\xe2\x82\x54\xcb\xc5\x88\x4d\ +\x71\x20\xa0\x56\xf9\x04\x14\x51\xb2\x2a\xd9\xb9\x98\x05\x22\xb1\ +\x4d\xe6\x20\xa5\xb3\x47\x89\xaa\x26\xcf\xaa\xf8\x36\x73\xfd\x50\ +\x81\x4b\x04\x38\x85\x3f\xaf\xaa\x48\xde\xe6\xc4\xc7\x40\x7a\x8c\ +\xd9\xb9\x6a\x2a\x1f\x4d\x7f\x95\x09\x0e\xb0\xa2\xd9\x55\xa0\x0a\ +\xea\xed\x56\x1c\x58\x79\xa0\xa1\x01\xab\x30\xe3\xba\xd2\x5e\xa5\ +\x51\x01\x63\xb3\xa9\x3a\x58\x95\xca\x1d\x46\x7f\x7f\x09\xac\x5a\ +\x0d\x6f\xc4\x73\x87\x79\x89\x5a\xd5\xdf\x98\x7a\xeb\x47\x3b\xab\ +\x0b\x93\xec\xdd\x6e\x02\x0f\xe4\xa5\x99\x40\x55\x0f\x48\x11\xf7\ +\x8a\xb6\x10\xb4\x4c\xd8\x14\x00\x12\x5e\x04\xcf\x66\x14\x2a\x1f\ +\x0b\x52\x02\x10\xb1\xe9\x44\xc0\x64\x0b\xab\x0f\xa4\x1a\x03\x28\ +\x9d\x5a\x27\x3f\xa3\xe1\xb7\x48\x8c\xa5\x21\xe9\x89\x4f\x81\xbc\ +\xb4\x60\x1e\xe9\xe0\xba\xa9\x58\x96\x6f\x1f\xf2\xce\x01\x85\x8a\ +\xc7\xd8\x8a\xc0\x02\x11\x24\x00\xe2\xc1\x0a\xfe\x2b\xc6\x82\x15\ +\xc7\xe0\x20\xb2\x19\xb6\x52\x16\xb4\x22\x54\xc0\x10\xc3\xba\xcf\ +\x9e\x1a\x60\x55\x14\xc0\xe8\xaa\x2e\xdc\x7d\xfd\x1a\x0c\xf7\x77\ +\x86\xdf\x3b\x42\x50\x2e\x97\xf0\xd2\xcb\x71\xdc\x61\xe8\xa3\x76\ +\xb5\xfc\x5b\x97\xf6\x7c\xff\x20\x9c\x05\x38\x29\x53\x75\x93\x94\ +\xd6\x40\x9a\x05\x54\xf5\x83\x54\x0b\x99\x55\x2c\x36\xe5\x1d\x89\ +\x6c\x4a\x62\x1a\x1a\x95\x4f\xa8\x93\x6f\x87\x9a\xbd\x49\x6d\x69\ +\x22\x48\xf1\xed\x90\x7d\xbe\x55\x00\x15\x06\x4e\x3a\x76\xa4\xbd\ +\xf6\x21\x71\xe2\x77\x89\x05\x2e\x9e\x4d\xb9\xdf\x31\xc6\x9e\xe5\ +\x78\xc1\x04\x3a\x20\xaf\xe2\x81\x5b\xe5\xc0\x53\x05\xd9\x69\x0c\ +\x2a\xb6\x04\x56\xe5\xf2\xd5\x3c\x06\x38\x3c\x8d\x8f\x61\x42\xa2\ +\x71\x9d\x9d\xb9\x6e\xa4\x02\x72\xaf\x30\x0f\x76\x7e\x11\xcc\x6f\ +\x9c\xd7\x9e\x10\xe0\xca\x98\xee\x30\x3b\x76\xbe\x82\xd7\xf7\x1f\ +\x41\xad\x66\x47\x81\x54\x09\xd4\xfe\x5b\xab\x3c\xf7\xd5\xf1\xbd\ +\x7f\x7f\x1e\xc1\x2a\xc1\x4d\xe4\x82\xb2\x34\x03\xa8\x96\x25\x48\ +\x29\x8b\x8f\x6a\x85\x09\xab\x52\x65\x93\xde\x62\xdd\xdc\x2b\x3e\ +\xa3\x08\x8c\x7c\xba\xb8\x20\x65\xc6\xa2\xa2\x01\x8a\x68\xc2\xe3\ +\x5c\xef\xf0\xe7\x92\x2b\x97\xfa\xfc\xc8\x8d\x93\x47\x0a\xbd\xeb\ +\x24\x7a\x26\x38\x80\xc5\xb0\x2b\x6f\x3a\x43\x84\x2a\x48\xdc\x37\ +\x3f\x50\xc1\x04\xb0\xe2\xa6\x37\xf0\x6c\x46\xa5\xb3\x99\xa8\x80\ +\x5e\xe5\x1c\x4b\x52\x18\xd6\xb9\xbc\xcc\x3b\xae\x67\x55\x01\xb8\ +\x53\x0a\x64\xd2\xf1\xdd\x61\x9e\x79\x6e\x37\x0e\x1f\x3b\xad\x70\ +\x86\x97\x64\x96\xda\xd6\x37\x2b\xf9\x73\x7f\x39\x7d\xf0\xd1\x3c\ +\x02\x90\x12\x1b\xdc\x74\xb0\x6a\x14\xa8\x9a\x01\x52\xa4\x09\x80\ +\x2b\x37\x8c\x08\xbf\x7e\x65\x21\x6c\xca\x0b\x57\xcd\x99\xf2\x52\ +\x29\xa9\x53\x88\xca\xc7\x25\x51\xdb\xa5\x78\xd5\x8f\x69\x4d\x23\ +\x20\xa5\x9c\x9e\xa0\x03\x28\x33\x70\x12\x0d\xe0\x61\x29\x75\x42\ +\x59\x04\x12\xdb\xcc\x80\x96\x8a\x65\xf9\x0c\x8b\x9d\x46\x40\x18\ +\x76\x65\xaa\x0a\xb2\xd4\x46\xc0\x1e\x4e\x1d\xf3\x03\xc0\x31\x30\ +\xb5\xea\x45\x82\x36\x88\x2a\xa0\x5f\x2e\x04\x03\x15\xfb\xfe\xd6\ +\xcb\xaa\x5c\xd0\xa5\x2d\x77\x87\x39\x43\xad\xea\x1f\xce\x9f\x79\ +\xf5\xef\x17\xce\xef\xab\x82\x07\x29\x45\x47\x9a\x0b\x56\x8d\x00\ +\x55\x93\x40\x4a\xca\xd3\x24\xd1\xa9\x6b\x51\x2d\x50\x34\x9f\x08\ +\x65\xb0\xd9\x04\x40\xe4\x5a\xa0\xb1\x4b\x49\xc6\x73\x4e\x1d\x34\ +\x07\x29\x79\x52\xa9\x22\x3d\xd3\x0e\x70\xf9\xd8\xda\xd5\x77\xc0\ +\x1c\x98\x62\xdc\x15\xa1\x32\xce\xc6\xc2\x54\x17\xa8\x87\x2c\x00\ +\x05\xfd\x61\x47\xf7\x40\x78\xdb\x95\x4e\x15\x14\xc1\x8a\x57\x03\ +\x35\xeb\x9e\x83\x61\x39\xcc\xab\xe6\xbf\x7d\x8a\xf9\x55\x41\x67\ +\x7c\x3d\x91\xb3\x97\x89\xe0\x55\x1f\xab\xe2\xd9\x54\x4f\x57\x9b\ +\xb9\x3b\x8c\x6d\xe1\xed\x43\xc7\xf0\xec\x73\x2f\x1b\xba\xc3\xd0\ +\xfd\x76\xb5\xf4\xdb\xd3\x07\x1f\x79\xba\xba\x30\xe9\x35\xdd\xbb\ +\x23\x2a\x20\x6a\x3a\x58\xd5\x0b\x54\x44\x73\xbe\x2c\x40\x4a\x66\ +\x51\xaa\x5f\x93\xf9\x54\x9a\x86\x2a\x0c\xe8\x7e\x49\x3e\x70\x29\ +\x98\x9b\x92\x41\x35\x08\x52\x1c\x96\x10\x89\xe8\x71\xe3\x96\x46\ +\x00\x45\x22\x58\x95\x78\x60\x28\x94\xfb\x61\xda\xa4\x06\xad\xc0\ +\xa0\xce\x33\xac\x60\xba\x02\x71\xcf\x99\x11\x38\x88\xac\x29\x50\ +\xb1\xe2\x80\x15\x3b\x12\xe8\xd1\x22\xde\x5e\xc5\xd3\x30\x11\x38\ +\xd4\x6c\x8a\x0d\x8c\xcf\xaa\xb4\xc6\x2e\x0a\x0c\xf5\x75\xe2\xae\ +\xeb\xe3\xb8\xc3\x1c\xc0\xce\xdd\x7b\x31\xbf\x50\x8c\x76\x87\xa1\ +\xf4\x39\xab\x3c\xf7\x5b\xe3\x7b\x7f\xf0\xba\x5b\x73\x18\x48\x85\ +\x81\x15\x84\xf0\x58\x52\x0f\x50\x11\xcd\xb1\x2a\x8d\x0e\x8c\x5a\ +\xc8\xa4\x98\x62\x25\xc4\x89\x40\x30\x13\x36\xa5\x98\xa5\x2e\x4f\ +\x37\xd0\xf7\x54\x65\x3c\xe7\x92\x36\x09\xa4\x22\x59\x94\x70\xe5\ +\x75\x0f\x2c\x0f\x66\x0d\xdc\x2e\xbf\xff\x3c\x62\x71\x4f\xb0\xaf\ +\xda\x05\x31\x12\x60\x79\x36\x2c\x0d\xbb\xf2\xd7\x1b\x03\x8d\x01\ +\x56\xec\xdb\xc5\x83\x95\xff\x56\xb1\x60\x05\xd1\xf0\xce\x20\x28\ +\x07\x36\xc2\x44\x50\x08\xbf\x22\x9b\x0a\x61\x55\xe2\x08\xa0\x27\ +\x63\x23\x39\x6c\xbe\x7e\x14\x83\x3d\xd9\x66\xbb\xc3\x54\x41\xed\ +\xff\x59\x5d\x18\xff\x83\xc9\xfd\x0f\x9e\x84\xb3\x5b\x0c\x3b\xb2\ +\xc7\xde\x59\x13\xd6\xa4\x02\x31\x63\x69\xa5\xea\x17\xc6\xb2\xf8\ +\xe3\xe6\x9b\xa8\x22\x90\xd1\x90\x4d\x85\xb0\x2a\x42\x34\x15\x31\ +\x91\x61\x2a\x9f\x72\x84\x8f\x05\x84\x38\x20\x25\x4d\xf4\x0c\x61\ +\x51\x06\x00\x15\x05\x4e\x44\x7b\x22\x08\x55\x9d\xf2\x68\xce\x02\ +\x17\xa3\x75\x39\x31\x22\x60\xb1\x36\x2c\x6e\xc6\xb8\xf3\x86\xb3\ +\x3b\xe4\x44\xae\x7b\xce\x82\x0b\x33\x45\x80\x41\x25\x69\xb9\x60\ +\xd5\xab\x18\xb0\xa9\x90\x51\x40\x8d\x61\x5d\xfd\xde\xca\xac\x4a\ +\xf5\x9b\x4a\x11\x5c\xb3\xb6\x1f\x77\x5c\x37\x82\xee\xce\x68\xa3\ +\xf9\xf4\xf4\x0c\xb6\xed\x78\x09\x07\x0e\xbd\x03\xdb\x8e\x74\x87\ +\x29\x50\xbb\xf6\x57\xe5\xe9\x13\x7f\x36\x73\x64\xeb\x14\xe4\x91\ +\x3d\xdd\xb1\xe9\x6f\x6c\x89\x0b\x54\x26\x60\xa4\x0b\x0f\x49\xdb\ +\xbc\x79\x54\x3c\x80\xe8\x8c\xdf\x61\x5d\x53\x1c\x2b\xcb\x20\xdc\ +\xff\x3a\x95\x4f\xd5\x73\xa1\x89\x5c\x7d\xbc\xfb\x0e\x9a\x06\x52\ +\x42\x35\x6a\x80\xd2\x80\x93\x39\xa1\x62\xb5\x02\x39\xbd\x7f\xca\ +\xb1\xa9\xe0\xa2\xb0\x8e\xc2\x6c\x7f\x7d\xc0\x72\xfb\xcd\x2e\xb3\ +\x02\xee\x5c\x50\x05\xc3\xd6\x3d\x87\xc8\xa6\x84\x49\x99\xc2\x85\ +\x89\x5e\xdb\x9c\xbf\x8e\x9c\x0a\xc8\xe2\x13\xe2\xb3\x2a\x9f\xc1\ +\xc1\x59\xbf\xac\x2d\x93\xc6\x8d\x57\x0e\xe2\xa6\x2b\x9d\xdd\x61\ +\xec\x10\x94\x22\x84\xe0\xfc\xf9\x0b\x78\x7a\xdb\x6e\xd3\xdd\x61\ +\xc6\xa9\x55\xfe\xd3\xf9\x33\xaf\x7d\x7f\xe1\xfc\xbe\x02\xe4\x91\ +\x3d\xef\xa6\xc5\x55\xf5\x1a\x02\xad\x38\x40\x15\x07\x8c\x10\x91\ +\x96\xfb\xa5\x30\x78\x07\xea\x6e\xa6\x10\xc3\xb1\x25\x22\x9c\x33\ +\xbf\x61\x8d\x26\xea\x5f\x55\x33\xb8\x51\x3e\xbf\x0d\x21\x76\xa9\ +\x7a\x41\x8a\x04\x75\x70\xe9\xa5\xf6\x19\xce\xa9\x52\x5e\x4a\x0e\ +\x7e\x63\xdd\x03\xca\x1e\xb1\x80\x2d\x82\x56\x28\x60\xa9\xd8\x15\ +\x05\x4f\x8e\x62\x6c\xd2\x00\x7e\x8a\x80\xb4\xbd\x55\xc4\x64\x50\ +\x1f\x40\x42\x46\x01\x83\x9b\xc3\x1b\xd6\x8d\x58\x95\xe2\x1a\x76\ +\x75\x64\x70\xfb\xb5\xc3\xb8\x76\x5d\xbf\xef\x0e\xc3\x12\x41\x3e\ +\x9b\xe7\x0e\xb3\xdb\xd0\x1d\x86\x1e\xb3\xab\xc5\x3f\x98\x3e\xf4\ +\xe4\xc3\xd5\xf9\x8b\x16\xd4\x23\x7b\xa6\x80\x13\x07\xc4\x22\xc5\ +\x14\xa8\x1a\x06\x23\xc5\x2f\x9b\xaf\x29\x38\xa5\x37\x41\x99\x34\ +\x5f\x88\x97\x50\x2b\x84\x71\xf9\x49\x58\x60\x08\x57\xf9\xb8\xdc\ +\x3e\x48\x71\x94\x47\x60\x32\x06\x4c\x8b\x6b\xb2\x0c\x52\x6a\xbb\ +\x15\xcb\xe6\x54\x97\x88\x68\xc2\xe3\x49\xc0\xa6\x82\x42\x9c\x97\ +\x8b\xe1\x55\x34\x0a\xb0\x88\x7b\xce\xb2\x2b\xaf\x9f\x75\xee\x28\ +\xc3\xb2\x16\x15\x78\x68\xe6\x57\xe9\x5e\x51\x3f\xca\x84\x4d\x79\ +\xbf\x3a\x56\xc5\x00\x26\x6c\xa0\x3f\x97\xc5\x7b\x36\x8e\x60\xfd\ +\x48\xf4\xee\x30\x56\xad\x86\x37\x0e\xb8\xee\x30\x79\x03\x77\x18\ +\x6a\xbf\x5a\x2b\xe5\x7f\x67\xe2\x8d\x7f\x78\x11\xd4\x66\x6f\x59\ +\x18\x08\x99\xfe\xea\xf2\x23\x24\x0d\x27\xcd\x56\xfd\xc2\xc0\x48\ +\x0c\x6f\x1e\x89\x12\x8b\x0c\xa1\x46\x6a\x36\x45\xc2\xb2\xf0\xbf\ +\x1a\x36\xa5\xec\x8c\x90\x99\x3b\x15\x18\x10\x07\x2f\x1c\x20\x09\ +\x6c\x8c\x6d\xaf\x5f\xbf\x08\x4a\x24\x94\x45\x11\xfe\x3f\x05\x7b\ +\x8a\x06\xa7\x38\x37\x8f\x6a\x32\x3a\xe0\x44\x82\x34\xde\x66\xad\ +\x61\x80\xe5\x5e\x0f\xd1\xdf\x0e\x0c\xb3\x71\xc2\xa3\x76\x94\x61\ +\x47\xd3\x88\x6c\x5c\xf7\x49\x10\xf3\x1e\xa9\x54\x40\x18\x18\xd6\ +\xfd\xbe\xc4\x61\x55\xbc\xac\x1e\xec\xc2\x5d\x9b\x56\x63\xa8\x5f\ +\xbd\x86\x94\xdf\x95\x14\x41\xb9\x54\xc6\x4b\xaf\xec\xc5\x8b\xaf\ +\x18\xb9\xc3\xd8\xd4\xb6\x9e\xac\x2e\x5c\xfa\xbd\xa9\x03\x3f\x3e\ +\xc4\xdc\xa1\x56\xa9\x7a\x51\x20\xa6\x14\x13\xa0\x32\x01\x1d\xd3\ +\xbc\xaa\x32\x48\x2b\xac\xe9\x22\x9b\x32\x55\x5a\x82\x64\xf1\xd8\ +\x54\xa8\x01\xdd\x2f\x92\x57\xf9\xe0\x57\xc3\xb3\x25\x22\xc6\xb1\ +\x4d\x88\x09\x52\x61\x2c\x4a\x0b\x50\x8a\xcb\xc4\xf1\xae\x98\x9f\ +\x98\x80\x4d\xf9\xff\x05\x77\xdc\xeb\xaa\x0b\x36\xa1\x80\x25\xec\ +\x28\x53\x0f\x58\x05\xa3\x81\xec\x48\x9a\xde\xb8\x2e\x39\x11\x87\ +\xbc\x6e\x52\x54\x1c\x56\xe5\xb7\x03\xbe\x11\xdf\x73\x6a\xde\xb0\ +\xba\x17\x77\x5e\x37\x82\xde\xee\x76\xd9\xb7\x8f\x01\x3b\xdf\x1d\ +\xe6\xf9\x57\xf1\xfa\xfe\xc3\x26\xee\x30\x65\x6a\x57\x7f\x50\x9e\ +\x7a\xe7\x6b\x33\x47\x9f\x65\xdd\x61\x1a\x65\x49\x61\x8f\x42\x5d\ +\x2a\x60\x23\x36\x2a\x31\xbc\xde\xdf\xa6\x88\xe8\xd7\x67\x52\xbb\ +\xf7\xba\xaa\x41\x2d\x3e\x9b\x12\xde\xf9\xd0\xde\x72\xcd\xe4\x18\ +\x14\x0b\x52\x7c\x10\xd7\xd6\x98\x20\x15\xce\xa2\xd4\x00\xe5\xa7\ +\x6c\x90\x55\xf1\xa0\xc4\xd4\x2f\x6c\x14\x1a\x84\x6b\x00\x8b\xb8\ +\xe0\xc2\x00\x91\xa7\x0a\xb2\x76\xab\x38\x60\x85\x10\xe3\xba\x18\ +\x61\xbc\x63\x4c\x3d\xac\x4a\x34\xca\x53\x20\x93\x4a\xe1\xba\xf5\ +\xfd\xb8\xf5\xaa\x21\x74\x64\xd3\x01\x18\xb3\x00\xcb\xdc\x6b\x67\ +\x77\x98\x97\x70\xf8\xd8\x29\x13\x77\x98\xbc\x5d\x2b\xff\xc5\xc2\ +\xb9\xd7\xbf\xb3\x70\x6e\xef\x1c\xf8\xe9\x07\xaa\x5b\x1d\x87\x25\ +\x35\x13\xdc\x00\x44\x03\x95\x29\xc8\xc4\x0d\x47\x44\x78\x3c\xd1\ +\xd0\x00\xbe\x72\xc5\x2a\x9d\x26\x3d\x8c\xc1\xa6\xbc\x76\x28\x0d\ +\xe8\x60\xd5\x4b\x7d\x39\x62\x9b\x39\x30\xe1\x22\x63\x80\x54\x0c\ +\x80\x92\x00\x53\xd1\xf3\xf0\x40\x45\x32\xe1\x51\x0c\x80\x8b\x30\ +\xf1\x94\x03\x34\xd5\xf6\x57\xfe\xe8\x1c\xd1\xa8\x82\x7e\x3a\x3d\ +\x58\xc9\xf8\xa3\xb7\x57\x89\x1b\x82\xb2\x2a\xa0\x34\x11\x14\x02\ +\x88\x71\xd3\x15\xe2\xb0\x2a\x02\x1b\x14\xd9\xf6\x34\x6e\xbe\x6a\ +\x15\x36\xad\xef\x47\x5b\x3a\x05\x3b\x84\x7f\x10\x02\x9c\x3c\x79\ +\x06\x4f\x6f\xdb\x8d\xd3\xe7\x2e\x19\xd8\xa3\xe8\x39\xbb\x5a\xf8\ +\x93\x99\x63\xcf\xfe\x43\x65\xf6\x6c\x05\xc1\xea\x07\x61\x00\x13\ +\x05\x36\x3a\x96\x14\x15\x1e\x05\x66\x00\x9a\xe7\xeb\x17\x37\x9c\ +\x18\xa4\x8d\xdd\x08\xb9\xf0\x38\x45\xf3\x4d\xaa\x97\x4d\x71\x60\ +\x18\x06\x76\x24\x48\x23\xb3\xaa\x20\xc0\x07\x39\x0e\x4c\x1a\x07\ +\x29\xd1\x3d\x46\xc5\x9e\x94\x0c\x51\xb8\xa6\x51\x57\x98\x72\x89\ +\x5c\xa8\xa1\xaa\x78\xe2\xb3\x2c\x8e\x61\x29\xd9\x95\x7b\x6d\x54\ +\xaa\x60\x04\x58\x39\x20\x44\x02\x9b\x94\x5b\x33\x15\x98\x8e\x97\ +\x4e\xa7\x02\x4a\x6f\x55\xe8\xeb\xa6\x79\xdf\x15\xe8\x45\x6d\xa0\ +\xa7\xb3\x0d\xb7\x5f\x3b\x82\x2b\x47\x7b\x7c\xf7\x21\xbe\x58\x17\ +\x16\x09\x60\xdb\x36\xde\x3a\x78\x0c\xcf\x6c\x7f\xc9\xcc\x1d\x86\ +\xda\x6f\xd7\x4a\xb3\xbf\x3f\xf5\xd6\x43\xcf\xd8\xd5\x22\x05\xbf\ +\x44\x8b\x49\x8f\xea\x65\x49\xc6\xec\x49\x25\x61\x40\x55\x2f\x9b\ +\x8a\xcf\xbe\x68\xe4\xf3\x6e\x26\xe2\x1b\xcf\xfc\x72\x6c\xc6\x3f\ +\x0f\x99\x1a\xa0\xbd\x1c\xc2\xb1\xe8\x4e\x43\xd4\xb9\x94\xf5\x70\ +\xc9\x05\x00\x63\x6b\x51\x80\x50\x14\x48\x11\xfe\xbf\xf0\x39\x55\ +\x7c\x02\x45\xbd\x42\x7b\x74\x97\x45\x14\xaa\x86\xb5\x60\xe0\x8f\ +\x2a\x40\x4b\x06\x2c\xe2\x66\x52\x2e\x23\x0c\x05\x73\x32\x01\x2b\ +\x8e\x5a\x09\x6f\x5f\x4c\xd5\x2d\x36\xab\x52\xb2\x2b\x27\x70\x55\ +\x5f\x07\xde\xb3\x71\x04\xa3\x03\x5d\xee\x35\x51\xbf\xdb\x29\x42\ +\x50\xa9\x56\xb0\xe7\xb5\xfd\xd8\xf1\xc2\x5e\xcc\x17\xa2\xdd\x61\ +\x28\xb5\x76\x55\xe7\x2e\xfd\xde\xd4\x5b\x3f\xde\xeb\x56\x2b\x3e\ +\xd4\x51\xcc\xa6\x5e\x96\xd4\x30\xab\x6a\xc6\xcc\xf4\x26\xa4\xaf\ +\xdf\x98\x6e\x46\xdd\x62\x32\x2b\x81\x09\x99\xb1\xa9\x88\xe9\x08\ +\x22\x3a\x84\xaa\x7c\x0c\x6e\x70\xc6\x73\xa1\x62\x03\x90\x8a\x64\ +\x51\x5a\x80\x52\x5c\x39\xc5\x65\x0c\xc5\x29\x55\x24\x07\x5e\xc1\ +\xd6\x57\x40\xc0\xb4\x7c\x10\x62\x55\x42\x1f\x10\x9c\x84\xa2\x2a\ +\x68\x0a\x56\x3e\x30\x91\x08\x7b\x95\x97\x34\x84\x4d\x35\x87\x55\ +\x05\x87\xeb\x86\x72\xb8\x73\xe3\x08\x06\x7a\xb2\x4e\x1f\x58\xeb\ +\x3d\x47\xc4\x08\x0a\x0b\x0b\x78\xfe\x85\x3d\x78\xf9\x75\x23\x77\ +\x98\x1a\xb5\x6b\x0f\x95\xa6\xde\xf9\xea\xec\xd1\x67\x4e\x22\xb0\ +\x47\xe9\x46\xf0\x4c\x01\x24\x2e\x4b\xaa\x9b\x55\xe9\x80\xaa\xd9\ +\x6c\x2a\xaa\x9c\x06\x45\x7e\xd1\xe3\xcc\x44\x8f\x32\xa2\xeb\xf2\ +\x85\x5b\xd3\x35\xe5\x85\xb1\x2a\x45\x80\x04\x52\x7e\x79\xf5\x83\ +\x94\x9f\x52\xc6\x3d\xae\x4e\xa9\xbb\xaa\x40\xa3\x2b\xec\x09\x95\ +\xc0\x8b\x1f\xed\x73\xd2\xc8\xfb\xf5\x69\x96\x11\x46\xc4\x68\x9f\ +\xff\x5a\xb0\x3e\x77\x8c\x73\x8b\xc4\x6c\x64\x15\x30\xb8\x7a\x8a\ +\x89\xa0\x9c\x6a\xa8\x5b\x9d\x53\x33\x02\xe8\x15\x4f\x9d\xfb\x78\ +\xf5\xda\x5e\xdc\x7e\xcd\x30\xba\x3a\xf4\xee\x30\xde\x87\x65\x7a\ +\x7a\x06\xcf\x6c\xdf\x8d\xfd\x07\x8f\xc3\x8a\x76\x87\x29\xda\xb5\ +\xf2\x77\x0b\x17\xde\xf8\xd6\xfc\x99\x3d\xac\x3b\x0c\x98\xe6\x89\ +\xc7\xd0\xa4\x61\xcf\xeb\xfd\x35\x2d\x87\x93\x66\xad\x9e\xd0\x48\ +\x9a\xe6\x80\x96\x4e\x77\xe3\x00\x81\x28\x81\x02\xca\x5f\xa2\x2c\ +\x57\x9a\xd5\x2d\x55\x17\xce\xa6\x64\x9e\x12\xa4\xe1\xa7\x29\x88\ +\xc6\x73\xb6\xc8\x38\x20\x25\x02\x56\xd0\x2e\x13\x80\x92\xda\xab\ +\xb9\x5b\x62\xb0\xf2\x5d\xa3\x6c\x1d\xa2\x2d\xca\x0b\x95\x99\x8d\ +\xc7\xae\xd8\x89\x9e\x9e\x2a\x18\x35\x35\x41\x98\x75\x20\xcf\x20\ +\x67\xa6\x01\xa8\xd6\x8f\x62\x67\xad\x1b\x91\x01\xe9\xb5\xe3\x01\ +\x8f\xc5\x05\x0a\x8a\xb6\x4c\x0a\xd7\x5f\x31\x80\x1b\x37\x0c\xa2\ +\x3d\xc3\xae\x21\x25\x63\x08\x21\xc0\xd9\x73\x17\xf0\xd4\xb3\x2f\ +\xe2\xf8\xc9\x73\x61\xb7\xc3\xbb\xc6\x93\x76\xa5\xf0\xe7\xf9\x13\ +\x3b\xff\x73\x69\xea\x1d\xd1\x1d\xc6\x14\x40\x54\x0d\x8a\xea\x7d\ +\xa3\x69\x24\xc9\x68\x0a\x52\x9d\xc7\x65\x53\x71\xd3\xd5\x2d\x3a\ +\xf0\x50\x28\x2f\x11\xdd\x25\x11\x8d\x65\x38\x85\x66\xa4\x2f\xb4\ +\xd3\xcc\x89\x88\xab\x32\x23\x94\x5b\xa5\x74\x75\x69\x36\x48\xa9\ +\x00\x2a\x1a\xa7\x42\xaf\x2a\x1b\xe8\x3f\xa1\x22\x68\x71\x80\xa5\ +\xde\x0d\x99\x80\xf0\xb6\xab\x28\xb0\x82\x30\x7d\x80\x35\x47\x6b\ +\xed\x55\x01\x50\x82\x8d\x65\x40\xcb\x8c\x55\x29\xde\x74\xaf\x9d\ +\x04\xa0\x36\x45\x57\x36\x83\x5b\xae\x5a\x85\x6b\xd6\xf6\x23\x95\ +\x52\x6b\x8b\x81\x8a\x4b\x71\xe4\xe8\x09\x3c\xf9\xec\x6e\x5c\xb8\ +\x34\x65\x62\x34\x3f\x51\x2b\xe5\xff\x78\xe6\xd0\xe3\x8f\xd4\x4a\ +\xb3\x9e\x3b\x4c\x5c\xf6\x24\x86\x37\x9b\x2d\x19\x83\xa2\x89\x31\ +\xdd\x34\x7c\xc9\xc5\x5c\x35\xd1\xcf\x44\x6f\xb8\xbb\x51\x6c\x8a\ +\x73\x22\x56\xb3\x36\x0e\x30\x25\xe3\x39\x53\xb4\x62\xba\xb9\x1e\ +\xa4\x88\x54\x9d\x29\x40\xc9\x57\x80\xc4\x7f\x0a\x5c\x7b\x13\x5b\ +\x9f\x0c\x5a\x3c\x60\xe9\xd9\x95\x21\x58\x31\x4c\xc8\xb7\x49\x69\ +\xed\x55\x3a\x36\xa5\x67\x44\x5a\x62\x20\x00\x9e\xe4\x03\x48\x29\ +\xfa\x72\x59\xdc\x71\xed\x30\xc6\x86\x72\x5e\xcf\xd5\x45\xb9\xee\ +\x30\xfb\xde\x7c\x1b\xcf\xec\x78\xc5\xc8\x1d\x86\x52\xeb\xf5\xea\ +\xfc\xf8\x1f\x4e\xbd\xf5\xe3\xdd\xc1\x5e\x5e\x0d\x4d\x21\x68\xb6\ +\xc4\x05\x4a\x09\xa8\xe2\x82\x53\xbd\xec\x2b\xaa\x5c\xf3\xee\xb2\ +\x4f\xbe\x82\x9e\x04\x18\x40\xb8\x73\xb9\x15\x3a\x95\x8d\x05\x06\ +\xef\x97\x67\x38\xea\x79\x53\x2a\x36\xc5\xa3\x0d\xd7\x36\x3f\x56\ +\xad\xf2\x01\xea\xba\xb8\x76\x30\xf5\xa8\x40\x4a\xc9\xa2\x4c\x01\ +\x4a\x64\x62\xf5\xdc\x2b\x30\x2b\x4f\x8a\x9b\x85\xba\x07\x2c\x60\ +\xa9\xd8\x95\x31\x58\xf9\x23\x6f\x8c\xea\x07\xde\xb8\xce\xad\xed\ +\xa4\x71\x6b\x51\x83\x97\xf8\x1b\xe4\x15\xb7\x68\x57\xc9\xc8\x40\ +\x27\xee\xbc\x6e\x04\x43\xbd\x11\xee\x30\x24\x85\x72\xa9\x88\x17\ +\x5e\xda\x8b\x5d\x2f\xbd\x81\x62\xa9\x6c\xe0\x0e\x53\x7b\xa6\x3c\ +\x7d\xf2\x8f\x66\x8e\x3c\x7d\x08\xfa\xa9\x07\x6c\x35\xf5\x86\x37\ +\xcc\x92\xe2\x84\x9b\x1a\xd3\x4d\xc3\xd1\x60\x78\xc3\x52\xbf\xda\ +\x17\xa5\x9b\x1a\x34\x39\x92\x4d\x85\x30\x38\x45\x84\x6e\x61\x3e\ +\x36\x5d\x3d\x20\xc5\xba\xe8\xb0\xf5\xc8\x00\x25\xe4\x8d\x79\x39\ +\x7c\xa1\x8a\x6c\xc4\x05\x2d\x2d\x60\xa9\xd9\x55\x24\x58\x41\x8e\ +\x97\x8d\xeb\x60\xd8\x14\xaf\x02\x8a\x9b\x2f\x84\xdb\x99\xf8\x7e\ +\xc9\x6f\x25\xcb\xe0\x9c\xb2\xd7\xaf\xee\xc1\xed\xd7\x0c\xa1\xa7\ +\xab\x8d\x61\x7d\x6c\x83\x82\x76\xcd\xe5\xe7\xb0\x6d\xc7\x4b\x78\ +\xed\x8d\x43\xa8\xd6\xac\x28\x90\xaa\xd8\xb5\xf2\x3f\x14\x2e\x1d\ +\xf8\xb3\xf9\x53\x2f\x9f\x47\x30\xb2\xd7\xa8\xfa\xd5\x54\xc0\xa9\ +\xa3\x3e\x00\xad\xdd\x29\x39\x4e\x78\x63\x1f\x6a\xa3\x6a\x82\xf8\ +\x70\x40\x52\x97\x65\x34\x25\x41\x51\xa6\x9a\xc1\x05\x85\x29\x67\ +\xaf\x43\xad\xf2\x41\x8c\x63\x6b\x92\xb1\x51\x01\x52\xe2\xb2\x30\ +\xdc\x01\x07\x50\x52\xbd\x0a\x00\x35\x16\x37\xb9\xcf\x34\x18\x86\ +\x13\x00\x56\xc0\xb7\xb8\x35\xcf\x3d\x03\xba\x29\x58\xa9\x96\x66\ +\x41\xc0\x9e\xb8\x69\x09\xaa\x76\xea\x54\x41\xef\x97\x63\x53\x0a\ +\x30\xd3\xbc\x6e\x99\xb4\xb3\xd0\xdd\xcd\x57\xad\x42\x47\x7b\x5a\ +\xf2\xd9\xe3\x30\x94\x10\x5c\xba\x34\x8e\xa7\x9e\x7d\x11\x07\x8f\ +\x9c\xf4\xc1\x56\x2f\x74\xce\xae\x14\xff\x6a\xee\xd4\xee\xbf\x29\ +\x4e\x1c\x66\x77\x87\x69\xb5\xc4\x56\xe1\xea\x15\x16\xa8\x9a\xa5\ +\xf6\x89\xe7\xa6\xe1\xf1\x2f\x91\xea\x54\xa9\xfe\x29\xd4\x3e\x11\ +\x49\x04\x36\x24\xf9\x0e\x82\x8f\xd7\xa2\x9d\x48\x7b\x18\x40\x88\ +\xcc\xa2\xbd\x22\x9a\x85\xf9\xc4\xb6\x72\xa0\x63\x0e\x52\xa1\x0c\ +\x4a\xa1\x6a\x46\xdd\x0b\x5f\xa8\x98\x2c\xb8\x76\x2c\x68\x11\x3f\ +\x8c\xf8\x0c\x8b\xdd\x82\x9d\x55\x05\xa3\xc0\x4a\xf2\xcb\xe3\xec\ +\x55\x41\x73\x55\xeb\x48\x79\xe1\x4a\xc3\x7a\x08\xab\x92\x01\x2d\ +\x60\x77\x36\x05\xb2\x6d\x69\xdc\xb0\x61\x00\x1b\xc7\xfa\x91\x49\ +\x85\xed\x0e\xe3\x94\x70\xe2\xe4\x29\x3c\xb1\xf5\x05\x9c\x3a\x6b\ +\xe4\x0e\x73\xc1\x2a\xe7\xbf\x31\x73\x74\xeb\xff\xa8\xce\x8f\x8b\ +\xbb\xc3\xe8\x9a\xb8\xd8\xe1\xba\x73\xe3\xf0\x38\xc6\xf4\xb8\x6a\ +\xdf\xe2\x0a\x31\x0a\xd2\xc6\xd6\x83\x9e\xa1\x6c\x4a\xf3\xc2\xeb\ +\x67\xb2\xeb\xd8\x14\xcb\x6e\x88\x54\x1e\xd7\x06\x6d\xd1\x0a\x75\ +\x50\x97\x86\x29\x9f\x68\x2e\xaa\xf1\x35\x62\x12\x52\xe1\xc0\xb7\ +\x46\x11\x1e\xb0\xa8\xef\xff\x27\xb2\x2b\x33\xb0\xf2\xc1\x86\xa1\ +\x55\xd2\x0e\xc7\xaa\xd7\x42\x78\xd5\x74\xfa\x92\x88\x5f\x60\xeb\ +\x12\x58\x15\x05\x90\xeb\x6c\xc3\xad\x57\x0f\x61\xc3\xea\x1e\x1e\ +\xeb\x44\x10\x05\x40\x2d\x1b\x6f\xbd\x7d\x04\x4f\x6d\xdb\x8d\x89\ +\xa9\x59\x03\xa3\xb9\x7d\xa8\xb6\x30\xfe\x6f\xa6\xde\x7e\x74\x1b\ +\xb5\x2a\x36\xe4\x9e\x35\xaa\xa6\x45\x85\xc7\x79\x12\x1a\x9a\x02\ +\x61\x32\x3d\xa1\x19\xd2\x52\x30\x23\x82\xa1\x97\x3f\x53\x37\xa3\ +\x2e\xb5\x4f\x54\xb9\x42\x7b\x45\xd4\x65\xe9\x52\x19\x20\x25\x4f\ +\xe6\x84\x25\x63\x38\x90\x22\x32\x00\x29\x59\x97\x90\xc6\x2f\x4a\ +\xa6\xab\x6a\x58\x57\x74\x46\x3b\x10\x46\xb9\xac\x81\xba\xc7\x00\ +\x16\x0d\x4a\x56\xed\xc3\x17\x05\x56\x81\x41\x5b\x20\x41\x0c\x42\ +\x48\x2a\xa0\x60\x58\x37\x67\x55\xe0\xeb\x82\xfc\xe6\x0d\xf6\x64\ +\x71\xfb\xb5\xc3\x58\x3d\xd0\x85\xb0\xf7\x9c\x10\x82\x4a\xb9\x82\ +\x57\xf6\xbc\x89\xed\xbb\xf6\x18\xed\x0e\x43\xed\xda\xee\xca\xec\ +\x99\xaf\x4e\x1f\x7a\x62\x9f\x5b\x2d\xfb\x04\x2d\x25\x08\x35\x43\ +\xa4\x32\x9b\x6d\xa3\x32\x65\x5b\x42\x78\xa3\xd7\x29\xa2\x3a\x22\ +\xbc\xcf\x11\x3a\x98\x56\xed\x8b\xea\xa5\xce\x77\x50\x51\x2f\xef\ +\xce\xa2\xb0\x75\x09\x6c\x4a\x5c\xd7\x8a\xad\x97\x67\x72\x2c\xeb\ +\x8a\x9e\x9d\x2e\x6b\xaa\x44\x38\x17\x3a\x29\x82\x5c\xd4\xb5\x71\ +\x25\xd8\x86\xdd\x3f\x83\x1f\x44\x83\xb6\xc9\x3b\xca\x98\x83\x95\ +\xcf\x9d\x08\xe4\x39\x4d\x3e\x68\x41\xcb\xa6\x4c\x57\x3a\xe0\x32\ +\x49\xc7\x8e\xac\x59\xd5\x8d\xdb\xaf\x19\x42\x7f\x2e\x2b\x62\x9b\ +\x30\xb7\x8a\xa0\xb0\x50\xc0\x73\x3b\x5f\xc1\x4b\x7b\x0e\xa0\x6c\ +\xe2\x0e\x63\x55\x1e\x2b\x5e\x3a\xf4\x6f\xf3\x27\x77\x9d\x84\xbc\ +\xf2\x81\xae\xaa\xb8\xe1\x71\x59\x8f\x31\x3b\xaa\x47\x3c\xa0\x32\ +\x04\x14\x6d\x78\x9d\x00\xd5\x18\xd3\x22\xba\x00\x11\x10\x22\x4a\ +\x89\xa3\xf6\x11\x29\x0f\x89\xc8\x6b\x06\xa4\x91\x0d\x10\xd2\xa8\ +\x54\x3e\x6e\x0a\x01\x11\x6b\x0e\x63\x5d\x66\x00\xd5\xc8\xcd\x62\ +\x01\x93\x05\x2d\xd5\x7e\x7d\x61\x5b\x5b\x85\x82\x15\xaf\xf1\x49\ +\x01\x6a\x67\x61\xce\xa9\x06\xf2\xb0\xa0\x50\x8e\x77\xa8\xf8\x05\ +\x05\x48\x8a\xe0\xaa\xd5\x3d\xb8\xf9\xaa\x55\xe8\x56\xb9\xc3\x30\ +\x55\x10\x42\x30\x35\x39\x8d\xa7\xb7\xbd\x88\x37\xde\x3a\x06\xcb\ +\x32\x70\x87\xa9\x16\xff\x6e\xfe\xcc\x2b\x7f\x59\xb8\xf8\x96\xe8\ +\x0e\x13\x76\xe9\x5b\xa1\xfe\xd5\x9b\xae\xae\x7a\xa3\xa6\x27\x44\ +\x85\x37\x43\xa5\x8b\x5f\x86\x41\x0e\x62\x10\x5b\x8f\xda\xa7\x67\ +\x63\xec\xaf\x02\x30\x88\x2e\x8b\x01\x9b\x12\x54\x4e\xb5\xca\x47\ +\x84\xea\x59\x80\x31\x07\x29\xd1\x1e\xa6\x7b\x6f\x0c\xb6\x00\xf7\ +\xc5\x9b\x86\xc0\x95\xec\xb3\x29\x57\xd9\x12\xd8\x55\x6c\xb0\x62\ +\xe6\x43\xf1\xf6\xaa\x08\x36\xc5\x36\x8a\x9a\xa4\xd5\x30\x29\x0a\ +\xb4\xa5\x53\xd8\x38\xd6\x8f\x4d\xeb\xfb\xd1\xde\x96\x12\xe6\x6f\ +\x89\xd7\x0f\x38\x7b\xe6\x3c\x1e\xdf\xba\x0b\xc7\x4e\x9c\x0b\xbd\ +\xd6\x4e\xf9\x74\xca\xaa\xcc\x7d\x7b\xf6\xf8\x8e\xff\x5a\x99\x3d\ +\xa3\xdb\x1d\x66\x39\x4b\x43\x80\x55\xcf\xe6\x0e\xcb\x52\xc4\x97\ +\x3f\xac\x0b\x44\x99\x51\x50\x6d\x74\x6a\x9f\xb6\x64\x81\x99\xe9\ +\xe8\x5e\x38\x6a\xc5\xe9\xa4\x54\x1f\x0b\x52\x41\x98\xd0\x6f\x1d\ +\x48\x89\x2c\x4a\xc1\xa0\xe2\x80\x93\xd4\x6c\x26\xaf\xbf\xe2\xa6\ +\xfb\x9f\xc7\xb0\x4c\xf6\xe1\xd3\x82\x15\x37\xfa\x17\xe8\x6e\x66\ +\x4b\xb0\xc8\xac\x4a\x4a\x0f\xdd\x14\x05\xc0\x06\xd0\x91\xcd\xe0\ +\xa6\x0d\x83\xb8\x7a\x4d\xaf\xbb\x3b\x8c\xa8\xef\xb1\xef\x1f\xc5\ +\xa1\xc3\xef\xe0\x89\xad\x2f\xe0\xfc\xc5\x49\x13\x77\x98\x53\xd5\ +\xc2\xd4\xd7\x67\x0e\x3d\xf1\x98\x55\x99\xaf\x29\x9e\x96\x46\x59\ +\xcb\x52\x8a\x51\x9b\x4c\x67\xa6\x37\xda\x90\xd6\xf5\x52\x60\x00\ +\xaa\xda\xe5\x17\x19\x3a\x34\x31\xd0\xbe\x34\x2b\x85\x46\x74\xbd\ +\xa9\x6c\xca\x3b\x12\x41\x96\x4d\xc3\x02\x0d\x09\xc0\x22\x1c\xa4\ +\x14\x00\x45\xf4\xbd\x34\xc1\x2d\xe5\xcc\x6b\x37\xa3\x04\x58\x8a\ +\xdd\x62\x9c\x70\xc5\x82\x77\xec\xcb\x2f\xaa\x61\x60\x9e\x7e\x49\ +\x75\x23\xd0\xce\x0f\xe0\xd0\x48\xfc\x95\xf4\x4a\xbf\x7f\xbd\xdd\ +\x6d\xb8\xed\xaa\x21\xac\x1d\x8a\xde\x52\xbd\x56\xab\x61\xef\xbe\ +\xb7\xf0\xf4\xf6\x97\x31\x33\x3b\x1f\x3d\xb2\x67\x5b\x6f\x54\xf2\ +\xe7\xfe\x78\xfa\xd0\xe3\xbb\x0d\x76\x87\xd1\xf5\x28\x2a\xbc\x51\ +\x60\x6b\x05\x00\x72\x65\x36\xd3\x98\x6e\x0a\x48\x4d\x01\x2e\x1d\ +\x61\x61\x7f\x4d\x26\x26\x9a\x10\x9a\xe8\xba\x64\xb6\x14\x0a\x8e\ +\x71\x58\x94\xb2\x4e\xbd\xca\xc7\xe3\x2f\x0b\x3c\xf1\x41\x2a\xce\ +\x26\xa5\xda\x66\x13\x80\x7d\x86\x39\xa2\x21\x02\x16\xcb\xae\x4c\ +\x56\xe7\x64\x18\x53\xd0\xa6\x10\x15\x10\x3c\x56\xe9\x58\x95\x38\ +\x02\xa8\x64\x55\x6e\x8d\xc3\xfd\x9d\xb8\xed\x9a\x55\x18\xea\xed\ +\xe0\x96\x0b\x96\x90\x80\x10\x94\x4a\x45\xec\x7a\xf1\x35\x3c\xff\ +\xe2\x3e\x33\x77\x18\xab\xfa\x5c\x69\xf2\xe8\x9f\xcc\x1e\x7f\xee\ +\x30\x73\xc1\xc3\x00\x61\xb1\x00\x67\xd1\x01\xac\x15\x33\xd3\x17\ +\x51\xfc\xb9\xcc\x8c\xef\x25\xfb\x35\xf5\x3e\xb3\xd0\x1a\x42\xb9\ +\xb9\x33\xfe\x03\xcc\xff\xaa\x9e\x50\x3e\x0d\x75\x1f\x7a\x75\x1e\ +\xee\x2b\xaf\x68\x03\x57\xbc\xb6\x1d\x44\x1d\xce\x76\x93\x92\xc0\ +\x47\x4e\x8c\x0b\x9a\x1e\xa4\x73\xcf\x29\x03\x62\x94\xb9\x8a\xec\ +\xeb\xef\x1d\x50\x16\x18\xd9\x3b\xa1\x7a\xe7\xd8\xb9\x46\x7e\xba\ +\x80\x89\x04\x61\x84\x63\x57\xbe\x6a\x17\x01\x56\x4c\xb3\xd4\x2a\ +\xa0\x7f\x63\xd9\x04\xdc\x13\x12\xe7\x51\xf3\xcb\xf0\x40\x6e\x6c\ +\x55\x37\x6e\xb9\x7a\x95\xeb\x0e\x43\x15\xe9\x83\xb6\xcf\xce\xe6\ +\xf1\xcc\xf6\xdd\xd8\xb3\xf7\xa0\x99\x3b\x4c\xb5\xf4\xe0\xc2\xf9\ +\xbd\x7f\xbe\x70\x6e\xaf\xb7\x3b\x4c\x2b\x54\xb6\xa5\x64\x4c\xb1\ +\xa4\x1e\xa0\x5a\x54\xe6\x14\x55\x6a\x57\x36\x83\xc1\xde\x4e\x10\ +\xd1\xc9\xd7\x7d\x11\x59\x23\x38\x7b\xae\x9d\x54\xe9\x96\xa3\x5f\ +\xb2\x58\x15\xae\x8b\x07\x5f\x17\x5b\x8f\x4a\xbd\x0b\x53\xfb\x14\ +\x75\x48\x69\xb8\x7e\xe8\xc2\x88\x74\xac\x5a\xdb\x8a\xbb\xe4\xa1\ +\xcc\x0a\xa8\x59\x14\xc5\xb2\x05\xc9\x29\x45\x60\x68\xdc\xc7\xc4\ +\x65\x5a\xdc\x8e\x32\x08\xd4\x3c\x4f\x15\x54\xae\x76\x00\x06\x90\ +\x3c\x50\x03\xe5\x3e\x3c\x51\xab\x72\x06\xec\x4a\x60\x55\xe2\x6c\ +\x75\x51\x53\xa4\x40\x3a\x45\x70\xf5\x9a\x5e\xdc\x78\xc5\x00\xb2\ +\x8c\x3b\x0c\xff\x36\x3b\x6d\x02\x21\xb8\x78\x71\x1c\x4f\x6c\xdd\ +\x85\xb7\x0f\x9d\x80\xad\xb9\x9e\x4c\x05\x73\x56\x79\xfe\x7b\x73\ +\x27\x5f\xfc\x4f\xa5\xa9\xe3\x8b\xe9\x0e\xd3\x0c\x69\x19\xf0\xad\ +\x70\x46\x05\x5c\xbd\xb6\x1f\xeb\x47\x7a\x24\x10\x00\xa0\x7e\x41\ +\xdd\x08\x9d\x1a\x14\xe4\x53\xa8\x54\x41\x06\x46\xeb\xe3\x1f\x3a\ +\x0e\x88\x98\x32\xfd\x10\x22\xa6\x25\xe1\xe5\x33\x85\xb2\x2a\x1a\ +\xd7\x53\xa1\x7f\x92\xfa\x07\x1e\x58\x38\x75\x4f\x0a\x03\x84\xd2\ +\x35\x71\x41\x1f\x26\xf2\x65\xec\x3f\x39\x03\xcb\xe2\xe3\xa8\x70\ +\xe4\xb7\x81\x61\x5a\x22\xc3\x52\x6e\x6f\xc5\x4e\xca\xe4\x96\x7d\ +\x11\x96\x12\x16\x27\x6c\xfa\x7d\x50\x4f\x33\x30\x7f\x55\x9c\x7a\ +\x6c\x00\xed\x6d\x69\x6c\x5a\xdf\x8f\xeb\xd6\xf6\x21\x93\x26\xae\ +\xba\xa7\x2f\xec\x9d\x77\x4e\xe1\xb1\xa7\x76\xe2\xe4\x99\x8b\xc1\ +\xc7\x54\x27\xd4\xbe\x58\x2b\xce\x7c\x6b\xe6\xe8\xd6\x07\x6b\x85\ +\xa9\x32\x5a\xc7\xa4\xa2\x3b\xbc\xcc\x8c\xee\x2b\x1e\xa8\xda\x32\ +\x29\x64\xdb\x9c\x8f\x0e\xfb\x52\x07\xe7\xce\x7f\xe2\x4b\x1e\xbc\ +\xc7\x8a\x35\x99\x04\x84\x89\x05\x3e\x5e\x06\xca\x03\x25\xa8\x0e\ +\xd4\x54\xf5\x08\xcc\x8c\x0d\x15\x9e\xf4\xb0\x32\xe2\x80\x94\x10\ +\xa2\xbe\x56\x0a\x21\x84\xa0\x3d\x53\x73\xea\x10\xdb\xc6\x1e\xf9\ +\xe0\x44\x83\xa2\xfd\xa9\x05\x40\xf8\xf6\x56\x6a\xb0\xe2\x30\x08\ +\x02\x16\x45\xb2\x2a\xc5\x08\x20\x82\x79\x59\x62\x06\x6a\x03\xb9\ +\x8e\x0c\x6e\xba\x72\x10\xeb\x87\x73\x81\xda\x0d\xe6\x8d\x66\xee\ +\xb3\x65\x59\x38\xf0\xd6\x61\x3c\xbe\xf5\x05\x4c\x4c\x1a\xb8\xc3\ +\xd8\xd6\x91\xea\xfc\xc5\x3f\x9d\x3e\xf8\xf8\x36\x6a\x57\x03\x0d\ +\x3c\x11\x00\x2b\x14\xa8\xc4\x3b\xa8\xf2\x15\x65\x3e\xb2\x7c\x46\ +\xe9\x3c\xfc\x99\x90\xa8\x7f\x48\x1d\x52\x9d\xe2\xcb\xc4\x54\x15\ +\x7e\xee\xbe\xbc\x9e\x1d\x2d\xac\xf9\x21\xdd\x61\x08\x8c\x90\x47\ +\x82\x24\x21\x1d\xd1\xe6\x97\xc5\xe7\x46\x8c\x55\x4b\x91\x87\x01\ +\x48\x1a\x4c\x98\x0a\xda\x8c\x30\x9b\x14\x78\x1b\x22\xd8\xfd\xf7\ +\xfc\x40\xe1\xe2\xd7\xc1\xaa\x24\xe0\x23\xfe\x4c\xf9\x81\x9e\x2c\ +\x6e\xbd\x7a\x15\x46\xfa\x3a\x41\x43\xae\x08\x21\x04\x95\x4a\x05\ +\x2f\xbf\xb2\x0f\xcf\xee\x78\x15\x73\xd1\xee\x30\xa0\x56\xf5\xe5\ +\xf2\xcc\xc9\xaf\xcd\x1c\xd9\xba\xcf\x6d\xc5\x52\x33\x9a\x65\xc5\ +\xa6\x80\xfa\x80\xca\x14\xed\x5b\xfc\x55\x20\x75\x97\xae\x7c\x4d\ +\x89\x32\x32\x24\x9f\x41\x1d\x22\xbb\x21\xaa\x44\x92\x96\x26\x9d\ +\x87\x37\x40\x47\x63\x64\x3a\xa4\x9a\x1b\x16\xc9\xc0\xc2\x6a\x24\ +\x0e\xc3\xf3\xd9\x94\xc8\x66\x3d\xa1\xfc\xab\x4d\x5c\xc0\xf0\x18\ +\x16\xb7\xe0\x9d\xe1\xf6\x56\x9a\xd3\xba\x59\x55\x18\x36\x8c\x0e\ +\x76\xe2\x96\xab\x56\xa1\x3f\xd7\x0e\x6a\xeb\x52\x3a\xd7\x62\x61\ +\xbe\x80\x6d\x3b\x5e\xc6\x8b\xaf\xbc\x69\xe4\x0e\x63\xd7\xca\x4f\ +\x15\x2e\x1e\xf8\xb3\xf9\xd3\x2f\x9f\xc0\xd2\xa9\x7a\xcd\x12\xd3\ +\xb6\xc7\xee\xe3\xca\x62\x54\x91\x48\x11\x03\x4a\x48\x58\xb0\x61\ +\x39\x4a\x35\x33\x4e\xd5\xe6\xed\x25\x2a\x78\x95\xb5\x37\x7d\xc9\ +\x8a\xaa\xe2\x82\x14\x89\x4a\x10\x72\x9d\xfc\x5c\xc2\x7e\x7d\xe2\ +\xdc\x29\x2d\x58\x79\xf6\x2a\x76\x0a\x81\x6e\x7b\xf4\x30\x56\xa5\ +\xea\x94\x62\x84\xd5\x69\x13\xc1\x86\xd5\x39\xdc\x74\xc5\x00\x3a\ +\x3d\x77\x18\x05\x55\xf7\xae\xcb\xe4\xe4\x14\x9e\xdc\xfa\x02\xf6\ +\x1d\x38\x02\xcb\xb2\xa3\x8c\xe6\x45\xbb\x52\xf8\x6f\x73\xa7\x5f\ +\xfe\x4e\x71\xfc\xd0\x24\x96\xc6\x68\xde\x32\x60\x69\xb6\x34\x13\ +\xa8\x5a\xc8\xb4\x48\x64\x0c\x11\x5f\xda\x10\xbb\x92\x59\xc9\x8a\ +\x17\x99\x98\xe4\x23\x06\x21\xfa\x6c\x44\x09\x18\x3a\x36\x26\xc0\ +\xaa\x50\x06\xcb\x12\x45\x00\x26\x91\xc0\x25\x56\x15\xde\x0b\x42\ +\x02\xc3\x38\x27\x94\xfb\x01\xb7\x7e\x94\x57\x6c\xc4\x26\x0d\x5c\ +\x43\x42\x56\x3c\xe0\xe6\x3b\x29\x58\x95\x7a\xf2\xa6\x5a\xda\x32\ +\x29\x5c\xb3\xa6\x17\x1b\xc7\xfa\xd1\x9e\x21\x72\x5b\x84\x6b\x7e\ +\xe6\xcc\x39\x3c\xfa\xe4\xf3\x38\xfa\xce\x59\xff\x7a\x68\x85\xd2\ +\x99\x5a\x79\xf6\x3b\xf9\x63\xcf\xfd\x7d\x65\xee\xbc\xe7\x0e\x13\ +\x06\x06\x8d\x02\x4a\xb3\x01\x69\xd1\x01\x4e\x04\xaa\x56\xa8\x6b\ +\x0d\x97\x49\x6d\x0b\xd4\xb6\x61\x0b\xe3\x39\xec\x97\x9a\x30\xff\ +\x29\x5f\x5c\x8d\x01\x5c\x4a\xab\x53\x5f\xa4\xf5\x9a\xf8\xf3\x70\ +\x1f\x39\xa2\x01\x52\x22\x9c\x33\xed\xd7\xb4\x57\x9b\x5f\xec\x2f\ +\xd7\x27\xb9\x47\x52\xfb\xa4\x0e\x03\xa9\x54\x0a\xa9\x54\xd8\x87\ +\x9e\xb0\xb9\xa1\xbc\xcd\x84\x99\x49\xe5\x4f\x63\x72\x73\x18\x6e\ +\xd2\xc0\xab\x80\x4c\x55\xda\x79\x07\x6a\x26\xa5\xce\xc2\xab\x7f\ +\x94\x52\x74\xb4\xa7\x71\xc3\xfa\x7e\x6c\x18\xed\x41\x9a\x10\x79\ +\x8e\x14\x23\x94\x52\x1c\x3a\x74\x1c\x8f\x3d\xb5\x13\xe7\x0c\xdc\ +\x61\x28\xb5\x4f\xd7\x16\xc6\xff\xdd\xf4\xe1\x27\x1f\xb7\x2b\x05\ +\x4b\xb8\x68\xf5\x02\x40\x5c\x80\x5a\xb6\x80\xa4\x2b\x73\x59\xab\ +\x7e\x84\x10\x14\x0a\x45\xec\xd8\xf5\x2a\x3a\xb2\xed\xbe\x0a\xe0\ +\xc6\x46\x64\x56\x1e\xea\x13\x45\xc5\x9a\x42\x6d\xd4\x10\x74\x54\ +\x76\x6d\x60\x8c\xb6\xc6\x69\xaf\x9b\x58\x7c\x5b\x08\x21\xc8\x76\ +\x64\x31\xb2\x6e\x0c\xab\xd7\xae\xc5\xba\x55\xdd\xe8\xeb\x6a\x63\ +\x4c\xe7\x7c\xd3\x04\x13\x15\x87\x28\xc1\x21\x95\x01\x2b\x02\xac\ +\x82\xa9\x0d\x31\x66\x91\xeb\x08\x93\xa8\x22\x4a\x46\x75\x8a\xde\ +\xae\x36\xdc\x7c\xe5\x20\xd6\x0c\x76\xf1\xdd\x90\x8a\x72\xdc\x61\ +\x5e\x7b\xfd\x00\x9e\x7c\x76\xb7\xa1\x3b\x4c\x6d\x7f\x65\xf6\xcc\ +\x9f\xce\x1c\x7e\x6a\x37\x0d\xdc\x61\x28\xcc\x01\xa5\x55\xcc\x6a\ +\xc9\x55\xbb\x28\xf1\x80\x4a\x64\x3d\x51\xe7\x51\xe1\xa6\x12\x76\ +\x93\x00\x00\xa5\x72\x15\xfb\xde\x3a\xb6\xc8\x97\x72\xd9\xdf\xb7\ +\x45\x93\x8e\xce\xfd\xb8\xf1\x8e\x3b\xf0\x93\x9f\x78\x2f\xfa\xba\ +\xdb\xfd\x7d\xf6\x24\x12\x15\x62\x24\xf3\xc0\xc9\x07\xad\xa8\xa5\ +\x84\x19\xb0\x52\xba\xe6\x85\xb2\x29\x26\x91\x62\xf9\x17\x65\x52\ +\x57\x86\xfa\x3a\x71\xf3\x95\x03\x58\xd5\x93\xd5\x8e\xf4\x02\x00\ +\x49\x11\x14\x0b\x45\x3c\xff\xc2\x1e\xec\x78\xe1\x75\x14\x8a\x26\ +\xee\x30\x95\x9d\xc5\xf1\xc3\x5f\xcf\x9f\xd8\x79\x88\xb9\x3a\x8b\ +\xc5\x78\x9a\x21\x8d\xd6\x55\x2f\x18\x53\x20\x9a\x51\xd5\x0b\x58\ +\x4d\x05\xb6\x14\x21\x8d\xc1\x61\x6c\x59\xd4\xca\x96\xb5\x94\x4b\ +\x45\x1c\x3f\xf8\x36\xca\x1f\xbc\x15\xa9\xa1\x1c\x6c\xcd\xf3\x46\ +\xa0\x63\x92\xf2\x8e\xc8\xa1\x4b\x09\x33\xc6\x6c\xbf\x64\xcd\xda\ +\xe6\x6a\x56\xa5\x02\x23\xfd\x88\x9e\xd7\xf6\xb5\xab\xba\x70\xd3\ +\x95\x03\xc8\x75\x2a\xdc\x61\x98\x71\x47\xb8\xee\x30\x4f\x3f\xfb\ +\x22\x5e\x79\xed\x2d\x43\x77\x98\xe2\x43\xf3\x67\x5f\xfb\x8b\xc2\ +\x85\x37\xcf\x63\xf9\x3f\x5c\xcd\x56\x2b\x9b\xc2\x16\xeb\x55\xfd\ +\x9a\x0d\x58\x16\x12\x59\x96\x42\x08\x41\xa9\xb0\x80\xf9\xfc\x2c\ +\x40\x46\xa0\xb2\x2a\x13\xef\x43\xa2\xd1\x5b\x89\xab\x56\x05\x2a\ +\x1e\x03\x56\xf0\xe6\x7e\x89\x60\xa5\x61\x53\x41\xb1\x1a\x56\x25\ +\xab\x77\xbc\x31\x9d\x8d\x77\xdc\x61\xae\x5c\xdd\x83\xeb\xd7\xf7\ +\x21\xdb\x96\x0e\xd9\x78\xc1\xe9\xe7\xf9\x0b\x97\xf0\xd8\x53\x3b\ +\xf1\xd6\xc1\x77\x4c\xdc\x61\xe6\xad\xf2\xdc\x7f\xce\x9f\xd8\xf5\ +\xbd\xf2\xf4\xc9\x59\xa8\x8d\xe6\x54\xf8\xd5\x85\x9b\xa6\x6b\x34\ +\x3c\x4a\x9a\x0d\x50\x46\xa2\x02\xaa\x45\x37\xa8\xdb\xb5\xca\xe9\ +\x54\x5b\xd7\x02\x80\x9e\x26\xd7\x9b\x48\x13\x84\xda\x14\x95\x72\ +\x49\x0a\x67\xb1\x49\x87\x53\x01\x9b\x22\x2e\x40\x05\x13\x3d\xfd\ +\xd1\x3e\x04\xcc\x4a\x9c\xbd\xab\xf5\xc1\x83\x68\x08\x8f\x16\x16\ +\xd3\x6c\x0a\xb4\x67\xd2\xb8\x6e\x5d\x2f\xae\x59\xd3\x8b\x4c\x8a\ +\x70\xab\x1f\xa8\x48\xd8\xb1\xe3\x27\xf1\xf0\x13\xcf\xe3\xe4\xe9\ +\x0b\x26\xee\x30\x97\xaa\x85\xa9\x6f\xcf\x1e\x7d\xe6\xc1\x5a\x71\ +\xda\x73\x87\x91\x2e\x8d\xee\x92\x99\xdc\x96\x25\x0a\xaf\x37\x5d\ +\x1c\x91\xca\x8c\xc3\xa8\xe2\xaa\x73\xa6\x80\x47\xaa\x73\x17\x0e\ +\x65\x3a\x7a\xdf\x06\x49\xdd\xdd\x82\x4e\x27\xd2\x64\xe1\xc7\x33\ +\x18\x4b\xba\x72\xd0\xcf\x9b\xd6\x09\xdf\x60\xce\xa9\x83\xdc\xf6\ +\x56\x22\x31\x0a\x57\xd9\xf8\x36\xa9\xd5\x3f\xbe\xd5\x41\x5b\xba\ +\x3b\x32\xb8\x71\x7d\x3f\xd6\x0d\x75\x07\xab\x8b\xaa\xca\x75\xdd\ +\x61\xde\xdc\x7f\x08\x8f\x3d\xb5\x0b\xe3\x93\x33\x26\xee\x30\xc7\ +\x2a\x73\xe7\xfe\x6c\xe6\xf0\x53\xdb\xa9\x55\xf5\x76\x87\xf1\x2f\ +\x83\x2a\x8b\xe6\xbc\xa5\x2c\x25\x86\x2c\xb9\x11\x3f\x15\x92\xa9\ +\x59\xd4\x31\x2a\x3f\x99\x3d\xbe\x7d\xdc\x2a\xcf\x7d\x0d\xd4\xde\ +\x6f\xda\xf0\x44\x96\x46\xfc\x01\x48\x6f\x3a\x3a\x09\xec\x53\xaa\ +\x3f\x6f\xea\x3a\x11\xf2\xf2\x36\x78\x06\xe4\x88\x3c\xd9\x41\xb7\ +\xaa\x84\xd6\xa0\x2f\xac\x98\x21\x4e\x43\xeb\xef\xce\xe2\xce\x6b\ +\x87\x7c\x9f\x3d\x08\xd9\xfd\x73\x42\x50\xad\x54\xb0\xeb\x85\x3d\ +\xf8\xe1\xc3\xdb\xcc\x40\xca\xaa\xbe\x5a\x9a\x3c\xfa\xdb\xd3\x6f\ +\x3f\xf6\x2c\xb5\xaa\x61\x1f\x71\xf6\x17\x9a\x73\x44\xa4\x33\x55\ +\x17\xe3\xe6\xab\xb7\xde\x66\xb5\x5b\xca\xdf\x8a\xe9\x09\xf5\x30\ +\x2c\x3a\xbe\xf7\xef\x9f\x1d\xbc\xf1\x73\x17\x32\x5d\x83\xf7\x11\ +\x92\x5a\x0f\x42\xda\x22\x76\x6a\x54\xf5\x8d\x2f\xdf\x77\x6a\xe3\ +\xd4\x03\x45\x1b\xa8\x26\x9c\x49\xef\x17\x40\xc3\xd3\x29\x06\xc5\ +\x15\xd5\x11\xa9\x55\xda\xfa\x69\xd8\x9b\x21\xb4\x2d\x32\x9f\xae\ +\x0e\x90\x54\xa6\x2f\x95\xe9\xbc\x1b\x84\x64\xc3\x2a\xa3\x61\x2f\ +\x2a\x91\x8a\x0d\xa8\x04\x71\x95\x35\x7f\xda\x80\xbc\xee\xb9\xaf\ +\xc6\x69\x67\x9a\x2b\xda\x13\xa9\xfe\xf1\x0c\x6e\x75\x5f\x27\x6e\ +\xda\x30\x80\xbe\x6e\xf7\xf1\xa2\xea\x3c\x8e\x3b\xcc\x02\x9e\xd9\ +\xfe\x12\x76\xbd\xf4\x86\xa1\x3b\x4c\x69\x6b\xe1\xc2\xfe\x7f\x37\ +\x7f\xe6\xd5\x93\x90\x59\x54\xbd\xbf\xd0\x9c\xc7\x91\xc5\x56\xfb\ +\x9a\xce\xf0\x74\x40\x25\x9a\x29\xc5\x70\x5d\xfa\x46\xc2\xc9\xd4\ +\x5b\x3f\x3e\x00\xe0\x40\xba\xa3\xbf\x3d\x95\x6e\x4b\x79\x00\x42\ +\x29\x65\xbe\x99\xec\xf8\x33\x3c\xfd\x80\x0f\x77\xdf\x04\x7e\xbc\ +\x89\x7a\x2f\xb5\x58\x96\x62\x80\x9d\xad\x8f\x9d\x08\x14\xe4\xa1\ +\x7c\x1e\x22\xe5\xe3\xf2\x44\xa4\x45\x54\x5a\xa6\x6e\x1a\x9a\x3e\ +\x46\x79\x41\xdf\xa9\x5d\xb3\x73\x63\x77\xdd\xd0\xb5\xe6\x96\x1b\ +\x09\xd2\x5a\xa0\x52\xd9\x6d\x7c\xf6\xa4\xb0\xd9\x48\x9b\x8b\x0a\ +\x53\x06\x4c\x96\x12\xe6\xab\x8c\x1e\xbd\xe3\x6c\x5e\x8c\xa4\x08\ +\xc1\xd8\x50\x37\x6e\x58\xdf\x8f\xce\x2c\x6b\x34\x67\x52\xbb\x87\ +\x29\x42\x30\x31\x39\x85\xc7\x9f\xda\x89\xd7\xdf\x3c\x6c\xe2\x0e\ +\x53\xb2\x2a\x0b\xff\x30\x7f\xea\xe5\xbf\x2a\x4e\x1c\x9e\x84\x1e\ +\xa4\xa4\x8c\x88\x96\xb8\x46\xf6\xb8\xac\xc5\xb4\x9e\xa8\x36\x37\ +\x6b\x74\x50\x99\xde\x74\x66\xba\x0e\xb0\x9a\x15\xee\x49\x0a\x00\ +\xb1\x4a\x33\x96\xe5\x8c\x04\x6a\xc9\x7d\x93\x7f\xbd\x63\x93\x97\ +\xbc\xde\xb2\x4d\xea\x88\x53\x8e\x2e\x2e\x4e\xbc\x77\x6c\x83\xda\ +\x35\x68\x85\x06\xaa\x1e\x33\xe0\x2f\x89\x10\x48\xbc\x6f\x03\xf1\ +\xbf\x1c\x12\x58\x49\x4b\x09\x6b\x76\x1d\x96\x57\x37\x15\x76\x3d\ +\x96\x90\x2d\x58\x43\x2a\x93\x4e\xe1\xea\xd1\x1e\x5c\xbb\xa6\x17\ +\xed\x19\x12\xb1\x64\x30\x70\xfa\xf4\x59\x3c\xf4\xf8\x0e\x1c\x39\ +\x7e\xc6\x0d\x0b\x01\x29\x4a\x67\x6a\xa5\x99\xff\x98\x3f\xfe\xdc\ +\x0f\x2a\x73\x17\x54\xee\x30\xaa\xe3\x7a\xc1\x07\x9a\x7c\x61\x12\ +\x95\x77\xb1\xd5\xb8\xba\xea\x0b\x53\xfd\x5a\x31\xfa\x17\x56\xbe\ +\xf8\xb8\x49\x8c\x4b\xf8\x85\x26\xbe\x1e\x69\x65\x3f\xc3\xfa\xad\ +\x03\xf0\xb0\xeb\xa4\xcb\x17\x96\x2e\xea\x18\xfa\x71\xbb\x90\x8b\ +\x45\xf8\x6c\x32\xa3\x72\xc3\x19\xc0\x92\xb7\xb7\x0a\x5a\xa3\x77\ +\xbf\x8b\x56\xff\x54\x54\x8f\xda\x40\x47\x7b\x1a\x9b\xd6\xf5\xe2\ +\x8a\x91\x1c\x52\x06\xee\x30\x07\x0f\x1e\xc7\x43\x4f\xec\xc0\xb9\ +\x0b\x13\x26\xee\x30\x67\xaa\xf3\x97\xfe\xbf\x99\xc3\x4f\x3e\x6e\ +\x57\x8b\x35\xf0\x20\xd5\x2c\x26\x14\x56\x46\x54\xd9\x51\xf9\x10\ +\x33\xfd\x92\x19\xed\x4d\xa6\x27\xd4\xcb\x9a\xa2\x7e\x75\xe5\xc7\ +\xad\x37\xaa\x1c\x84\x94\x11\xd5\xb6\x46\xca\x08\x03\xa4\xa8\x38\ +\x56\x54\x71\x61\x61\xaa\xbc\xba\xf8\xa0\x4f\xc4\xec\x21\x24\x9a\ +\x03\xce\xc0\xed\x63\x90\x73\x10\x68\x78\x24\x00\x2b\x6e\xf3\x05\ +\x9e\x55\x85\x6d\xa6\xa0\xeb\x86\x14\x4a\x29\x7a\xba\xda\x70\xe3\ +\xfa\x7e\xac\x1e\xe8\x0c\xef\x93\xeb\x0e\xf3\xea\x9e\xfd\x78\x7c\ +\xeb\x8b\x98\x9e\x9d\x33\x71\x87\x39\x50\x9e\x39\xf5\x8d\xd9\x23\ +\xcf\xbc\x44\xa9\x25\x36\xb3\x11\x30\x42\x0b\xca\x88\x2a\xdb\x34\ +\x7d\xdc\xb6\xd5\x0b\x80\x52\x3b\x5a\x39\x3d\xa1\x9e\x32\x9b\x05\ +\x82\x26\xc0\xa0\x6b\x4b\x23\xc0\xd3\x2c\xb0\x8a\x93\x1e\x9a\xf8\ +\x30\x11\xdf\x6b\x6a\x90\x87\xd5\xaa\x98\x90\xe0\x97\xf0\xa7\x60\ +\xf7\xeb\xa3\x61\x30\xaa\xfd\x55\xab\x7f\xe1\x6d\x74\x60\x6e\x55\ +\x6f\x07\x6e\xbc\xa2\x1f\x03\xb9\x76\x80\x65\x6a\x42\x3b\x3c\x77\ +\x98\xe7\x76\xbe\x8a\x6d\x3b\xf7\x98\xba\xc3\xec\x2a\x8e\x1f\xfa\ +\xb3\xfc\x89\x5d\x07\xe1\x9a\x2b\x60\xfe\xd2\x86\xa9\x82\xf5\xa8\ +\x7c\x71\xeb\x6d\x16\x98\xc4\x91\x46\x54\x57\x00\xe6\x2e\x34\xcb\ +\x85\x55\x21\x46\x1a\xd3\x3a\xeb\x01\xa0\x7a\xfb\xda\x08\x58\xb1\ +\x62\xc2\xae\xa0\x48\x03\x7d\x3a\x02\x68\x1f\x1c\x79\x45\x0a\x2f\ +\xcc\xff\x23\xaa\x5c\xf0\x8d\xe6\xc1\x08\x1f\xe1\x54\x40\x9d\x1b\ +\x8c\xa6\x34\xe7\x48\x67\xa7\x72\x65\xcd\x60\x17\x6e\x5c\xdf\x8f\ +\xee\xce\x8c\x52\xd5\x0b\x70\xd0\x71\x87\x79\xe2\xe9\x5d\x78\x69\ +\xcf\x01\x43\x77\x98\xc2\x23\x8e\x3b\xcc\x7e\x6f\x77\x18\xf6\xba\ +\xb5\x0a\xa4\xea\x55\xf9\x10\x11\x6e\x92\x66\xb1\xd8\x54\x68\x1b\ +\xa3\x46\xfd\x1a\x0d\x8f\x93\xb7\x11\x96\x04\x98\xbf\xfc\x30\x28\ +\xcb\xa4\x7d\xf5\xb4\x5d\x97\x07\x11\x61\x26\xf1\x3a\x31\x49\x63\ +\xc4\xa8\x78\x43\xb5\x10\x0e\x7e\x29\x1b\x6f\x09\xdf\x00\xac\x22\ +\x4b\xe7\x0a\x14\xd5\xbf\x28\xa1\x70\xdc\x61\xae\x18\xe9\xc6\x75\ +\x6b\x7b\x5d\x77\x18\xaa\x2c\x1b\xa0\xbe\x3b\xcc\xc3\x8f\xef\xc0\ +\x81\x83\xc7\x61\x53\x44\x8d\xec\x2d\x58\xa5\xb9\xff\x92\x3f\xb1\ +\xeb\x7b\xe5\x19\xdf\x1d\xc6\xab\x3a\xce\x6f\x54\x9c\xaa\x6b\x61\ +\x69\x9b\x01\x6c\xcd\x60\x76\x51\xed\x6f\x28\xdc\x44\xf5\x6b\x15\ +\x7b\x32\x01\x87\xa8\xb6\x98\xd6\xa9\x2a\xb7\x55\x4c\x28\xea\xfd\ +\xaa\xc7\x0e\x05\xc3\x78\x20\x1c\xe8\x00\x75\xbb\xcc\x80\x4a\xd7\ +\x1b\xc8\x8c\xca\xb1\x47\x01\xa0\xaa\x25\x58\x58\x5b\x15\x94\x7b\ +\x2c\x4a\x2a\x5a\x58\x03\xa9\xe3\x0e\x73\xed\x9a\x1e\x5c\xb9\x3a\ +\x87\x4c\x8a\x48\xcb\xc4\x88\x6d\x3e\x7a\xec\x24\x7e\xfc\xd8\x76\ +\x9c\x38\x65\xe4\x0e\x33\x5e\x2d\x4c\xfd\xfb\xd9\xa3\x5b\x1f\xac\ +\x15\x67\xc4\xdd\x61\xe2\x02\x51\xb3\x59\x96\xe2\x6a\xc4\x2e\x4b\ +\x95\xdf\xa4\xec\x46\xeb\x34\x62\x53\x40\x7d\xa3\x7e\x8b\xc1\x9e\ +\x74\xe9\x11\x23\x6d\x33\xd5\x37\x2c\x51\x1c\x2b\x26\x4c\xca\x94\ +\x80\x88\x75\xd0\xe8\x5b\x1a\x64\x95\xd5\x40\xf7\x94\x65\x54\x3e\ +\x9b\xe2\xed\x4c\x61\x4d\x56\x26\x09\x5d\xe7\xc5\xf9\xbf\x2b\x9b\ +\xc6\xa6\xb1\x3e\xac\x5d\xd5\x15\xfe\x85\x70\xdd\x61\xf6\xbd\x71\ +\x10\x0f\x3f\xf9\x3c\xc6\x27\x66\x0c\xdd\x61\xce\x7f\x73\xe6\xf0\ +\x93\xac\x3b\xcc\x72\x01\xa9\x66\x00\x43\xa3\xe0\x03\x4d\xbe\xd0\ +\xcb\x1a\x37\xaf\xa9\x31\xbd\x95\xec\x29\x6e\x1d\xba\x7c\x30\x48\ +\xb3\x5c\xc1\x4a\x25\x51\x4c\x2a\xea\x18\x9a\x38\x5d\x6d\xf1\x18\ +\x15\x73\x95\x1d\x37\x3f\xfe\xb2\x07\xcb\x05\xb3\x1d\x90\x6d\x52\ +\x72\xa1\x1a\x3b\x95\x1b\x28\xa2\x44\x7f\x77\x3b\x6e\x58\xdf\x87\ +\xa1\xde\x0e\x00\x14\x3a\x6d\x2f\x05\x82\x72\xa5\x82\x5d\x2f\xbe\ +\x8e\xa7\xb6\xbd\x84\xb9\xf9\x82\x89\x3b\xcc\x9e\xd2\xd4\xf1\xaf\ +\xcf\x1e\xdb\xb6\x0f\x81\x39\x6e\xb9\x82\x94\xd4\x7c\xcd\x31\x0c\ +\xca\x32\x66\x3a\x21\x69\x1b\x65\x76\x9c\xc4\x59\x8f\xca\x14\x04\ +\x74\xe1\x71\x01\xa8\x91\x32\x9a\xa9\xbe\x35\x5a\x0e\x10\x0e\x14\ +\x71\xf2\xc6\xb5\x4f\x99\xa6\x33\x66\x54\x44\x79\x4e\xfc\xd7\xd8\ +\xd5\xf6\xe0\xd8\xac\xa8\xbf\x84\x0b\x54\x93\x33\xeb\x11\x26\xef\ +\x48\x5f\x07\x6e\x58\xdf\x87\xde\xce\xb6\xd0\xe2\x08\x21\x98\x9f\ +\x5b\xc0\xd3\xdb\x5e\xc4\xf3\x2f\xee\x33\x71\x87\xb1\x5c\x77\x98\ +\x6f\xba\xee\x30\xa6\xaa\x5e\x54\x7c\x2b\x41\xaa\x95\x80\xd1\x2a\ +\xd5\xce\x04\x4c\x01\xc4\xb3\x51\x89\xe7\x71\x18\x4e\xbd\x20\x16\ +\x27\x6d\xab\x18\x91\x4e\xef\x08\x8b\xd3\xa5\x47\x9d\x79\xa3\x8e\ +\xa1\x89\x83\xa2\x3c\x40\xfd\x40\xd5\x09\x1d\x44\x3a\x12\xb5\x35\ +\x03\xad\xcf\x58\xbc\xd9\xe9\x63\x43\xdd\xd8\xb8\xae\x17\x9d\xed\ +\xd1\x6b\x48\x4d\x4c\x4c\xe1\x91\x27\x9e\xc7\x6b\x6f\x1c\x82\x65\ +\x51\x13\x77\x98\x7f\x9c\x3f\xf5\xf2\x77\x18\x77\x18\xf1\xfa\x34\ +\x02\x1e\x4b\xc9\xc8\x9a\xa9\x56\x9a\xf4\x11\x06\x69\xc3\xd2\xfb\ +\x12\xd7\x29\xb9\x51\x96\xd4\x28\x8b\x69\x46\x7b\x5a\xc5\x96\xea\ +\x61\x57\xcd\xb4\x4f\xa9\xe2\xa2\xa0\x20\xa8\x4f\xb9\x85\x8c\xb9\ +\xc8\xab\xae\x9b\xe6\x33\x4f\x4d\x01\x64\xd2\x04\x57\xae\xce\xe1\ +\xea\xd1\x1c\xda\xd3\x29\x7e\x0d\x29\xb1\x6c\x02\x9c\x3a\x75\x16\ +\x3f\x7a\xf4\x39\x1c\x3e\x76\xda\x0f\xd3\x57\x40\x67\x6b\xa5\x99\ +\xbf\x99\x3d\xfe\xdc\x0f\xaa\x8e\x3b\x8c\xc2\x96\xa7\xec\x64\x33\ +\xd8\xcf\x62\x81\x94\xea\xb2\xc6\x2d\xcb\xa4\xbc\xa6\xa8\x7c\x9e\ +\xc4\xb5\x51\x99\xa4\x69\x44\xd5\xd3\x95\x15\x16\xbe\x94\x60\xa5\ +\x4b\x0f\xa8\xdf\xc1\x7a\xec\x53\xaa\xfc\xaa\x34\x71\x41\x4a\xbc\ +\xde\x0d\x01\x15\x10\x80\x40\xa8\xed\x3c\x4e\x79\x4c\x19\x94\x02\ +\x1d\x6d\x69\x5c\xb7\xb6\x07\x63\x43\xdd\x48\x91\xa8\xf2\x29\x0e\ +\xbc\x75\x14\x3f\x7e\xf4\x39\x9c\x35\x70\x87\x01\xb5\xcf\x56\xe7\ +\xc7\xbf\x35\x7d\xf8\xc9\xc7\xec\x6a\xa1\x26\x56\xaf\xb8\x5e\x40\ +\xf4\x0b\xbc\x1c\x41\xaa\x5e\x35\xcd\xa4\xff\xf5\x80\x91\xd1\x63\ +\x52\xcf\xcc\xf4\xa5\x66\x3e\xcb\x09\xac\x00\x73\x40\xd2\xa5\x0b\ +\xbb\x59\x51\xf1\x62\x7d\x61\xe7\x61\xe5\x34\x0c\x52\x00\x6f\xc8\ +\x6e\x42\x81\x5c\x19\xb9\xce\x0c\xae\x1f\xeb\xc3\x48\x7f\x87\x1b\ +\xa1\xae\x81\x10\x82\x5a\xb5\x86\x97\x5f\x7d\x13\x8f\x3e\xbd\x0b\ +\xd3\x33\x46\xee\x30\x6f\x55\x66\xcf\x7c\x7d\xe6\xf0\xd3\x2f\x52\ +\x6a\xb1\xd5\xc7\x55\x73\xe2\x02\x98\x69\x9e\x56\x81\xd4\x72\x61\ +\x6a\x91\xd2\xe8\x9a\xe9\x4b\xc5\x7c\x5a\x51\x3e\x2b\xa6\xea\x55\ +\x23\xea\x9e\x58\x66\xd4\x8d\x6b\xa6\xf1\x5c\x52\x69\x88\xef\x3a\ +\x5c\x9f\xd0\x90\xe6\xd3\xc8\x7c\xe1\x32\x98\x6b\xc7\xf5\xeb\xfb\ +\xd0\xdf\xdd\x1e\x9a\xc7\xd9\x5e\xad\x84\x6d\x3b\x5e\xc6\xb3\x3b\ +\x5e\x35\x75\x87\x79\xc1\xdd\x1d\xe6\x20\xf4\xf7\xa1\x11\xe0\x31\ +\x0d\x33\x4d\x1f\x96\x77\x29\x41\xaa\x1e\xf6\x69\x2c\xf5\xda\xa8\ +\xd8\xe3\x46\xc0\x04\x11\x65\xc5\xa9\x27\x2a\xad\x4a\xea\x55\xed\ +\xea\x61\x57\xba\xe3\x30\x75\x4e\xd7\x66\x20\xbc\x4e\xc4\x28\xcf\ +\x89\x37\xb4\x51\xc9\x94\x99\xca\x47\x2e\xe3\x51\xc4\x40\x93\x55\ +\xdb\xf8\xd5\x03\x9d\xd8\xb4\xae\x07\xdd\xd9\x4c\xf8\x45\x21\x04\ +\x33\x33\xb3\x78\xec\xc9\x9d\xd8\xfd\xea\x01\x54\x6b\xb5\x28\x90\ +\xaa\xda\xd5\xe2\x23\x0b\xe7\xf6\x7e\x6b\xe1\xfc\xbe\x73\x08\xdf\ +\x78\x81\x3d\xae\x07\xa0\xa2\xd2\xd6\x0b\x6a\xcd\x66\x5f\x51\x71\ +\x8d\x96\xaf\xbb\x1e\x91\x52\x0f\xa3\x6a\x44\xd5\x33\x29\xab\x55\ +\x60\x15\x55\x0e\x0c\xf3\xb1\x12\xc5\xae\x54\x69\x9b\x09\x46\xf5\ +\x1b\xcf\xe5\xfb\x40\x11\xf3\xe1\x09\x0a\xa2\x42\x6e\xca\xd7\xa2\ +\xf8\x0d\x5b\x93\x93\xc2\x59\xbc\x6e\xfd\x70\x97\xb3\x86\x54\x1b\ +\xb3\xa5\xba\x22\x1b\x21\x04\xe7\xcf\x5f\xc4\x8f\x1e\xdd\x8e\xfd\ +\x6f\x1f\xf7\xfd\x00\x43\x5a\xbd\x60\x95\xe7\xff\x73\xfe\xc4\xae\ +\xef\x96\xa7\x4f\xcc\x2a\xae\x9b\xc9\x8b\xd5\x8c\x17\x3a\x2a\xbe\ +\x95\x71\xf5\x96\x23\x5d\xcc\x88\xeb\x80\x18\x65\x69\xa5\x59\xdb\ +\x65\xb5\x5a\xd5\x33\x2d\x0f\x4d\xac\x83\x95\x7a\x47\xea\xa2\xca\ +\x84\xa2\x5c\x28\xd2\x35\x4b\xe5\xd3\xe5\x8b\x2f\x4c\xcf\xa9\x0b\ +\x3c\x1c\xf8\xf8\x58\xc5\x2a\x85\x51\x3b\xc6\x38\x76\xae\xb6\x74\ +\x0a\x57\x8f\x76\x63\xc3\x48\x0e\xe9\x14\xbf\x86\x94\x74\x11\x09\ +\x70\xe4\xc8\x09\x3c\xf8\xc8\x36\xbc\x73\xea\xbc\x89\xd1\x7c\xbc\ +\x56\x9c\xfe\xf6\xcc\x91\xad\xff\xd3\xdd\x1d\x46\x75\xff\xe2\x00\ +\x94\xee\x38\x0e\xb0\xb5\x02\xc0\x96\x82\x91\xc5\xb9\x0e\xb1\xa4\ +\x91\x35\xd3\x1b\x55\xc5\x9a\x05\x56\xac\x98\xa8\x7d\x26\x20\x07\ +\xc3\x36\x88\xe5\xc2\xb0\x4c\x28\xf2\x46\xa5\x37\x55\xe3\xe2\xa6\ +\x75\xd3\x99\x4e\x4f\x70\xd6\x38\x20\x62\xe9\x0a\x3e\x46\xd9\x34\ +\x54\x5f\x9e\x7f\x44\x1d\x77\x98\xeb\xd6\xf6\x62\xcd\x40\xa7\x33\ +\x8a\xa8\x9c\x24\x45\x7d\x77\x98\xbd\xfb\x0e\xe2\xc7\x8f\xed\xc0\ +\xa5\x89\x69\x83\x85\xee\xac\xe3\xd5\xb9\x8b\xdf\x98\x3e\xfc\xe4\ +\xb3\xb4\x56\x16\xdd\x61\xd0\xe2\xe3\x46\x40\x28\x2c\x5d\xa3\x69\ +\x1a\x2d\xb3\xde\x76\xc4\x92\x46\x37\x77\x58\x0e\x60\x15\x55\x07\ +\x10\x1f\xc0\x60\x90\x0e\x30\x07\xbb\x7a\x8e\xc3\x24\x2e\x10\x45\ +\x95\x4d\x89\x89\x8d\x4a\x20\x4c\x22\xa5\xe6\x2e\x84\xc4\x82\xa8\ +\x0f\x5c\xde\xca\x0a\xc1\x39\x40\x29\x45\x6f\x77\x1b\xae\x5f\xd7\ +\x87\xc1\x9e\xf6\xf0\x8e\x10\x82\x4a\xb9\x82\xe7\x5f\x78\x0d\x4f\ +\x3c\xb3\xdb\xcc\x1d\xc6\xae\xee\x29\x4f\x9f\xfc\xb7\x33\x47\xb6\ +\xbe\x2e\x5c\x3f\x13\xf6\xd4\xac\xe3\xe5\xa6\x06\xd6\x5b\xd6\xa2\ +\x82\x14\xd0\xdc\x5d\x68\x96\x2b\x58\xc5\x89\x63\x25\x0e\x20\x85\ +\xe5\x81\x41\x3e\x55\x1a\xc0\xec\xe6\xea\x54\x97\x28\x95\x4e\xf7\ +\xb2\x2a\x44\x54\xd9\x9c\xe2\xfd\x4a\x7c\xc4\x91\x55\x3b\x8e\x55\ +\x85\xc8\x70\x6f\x07\x36\x8d\xf5\xa2\xa7\xa3\x0d\x61\x66\x78\x42\ +\x08\xe6\xe7\xe7\xf1\xe4\xd6\x17\xb0\xe3\xc5\xbd\x28\x97\x4d\xdc\ +\x61\xca\x5b\x8b\x97\xde\xfa\xc6\xdc\xa9\x97\xde\x41\xf8\x9a\xe6\ +\xaa\x30\x13\x15\xa6\x59\x6c\xaa\x9e\x3c\x2b\x01\xa4\x1a\x96\x66\ +\x00\x55\xa3\x60\xd1\x88\x8a\xb6\x98\xf6\xa7\x7a\x0c\xe7\x51\xc7\ +\xaa\xbc\x50\x94\x65\x92\x2e\x2c\x7d\x14\x53\x33\x57\xfd\x38\x74\ +\x22\x3e\xca\x51\xaa\xb8\x20\x0c\x4a\xa9\xd9\x14\x05\x08\xb0\x6e\ +\xb0\x0b\xd7\xad\xe9\x41\x67\x7b\x3a\x62\xa6\x39\xc1\xf8\xf8\x14\ +\x1e\x7a\xec\x39\xec\xd9\x77\xd0\xc0\x1d\x06\x65\xbb\x5a\xf8\xef\ +\x73\xa7\x5f\xf9\xf7\xc5\x4b\x6f\x8f\x23\x00\x29\x53\x70\x52\x5d\ +\xf7\x7a\x01\x4a\x17\xde\x0c\xa0\x89\x9b\x37\x2e\x03\x6a\x14\xa4\ +\x1a\x06\xac\x66\x31\xaa\x66\x80\x15\x50\x1f\x80\xc5\x8d\xd3\xd5\ +\x03\x44\xb7\x0b\x21\x65\xc3\xb0\x4e\x95\x2c\x85\xca\xc7\xf7\xdb\ +\x60\xf5\x04\x2a\xe5\x14\x9e\x49\xca\x56\x44\xa5\x3c\x94\x49\x40\ +\x29\x45\x26\x45\xb0\x61\x24\x87\xab\x56\x77\xa3\x2d\x9d\x92\xcd\ +\x51\x4c\x00\x21\x04\x27\x4e\x9e\xc5\x83\x0f\x3f\x8b\x43\x47\xcd\ +\xdc\x61\xac\x72\xfe\xaf\x67\x8f\x3f\xf7\x5f\x2a\xf9\x73\x0b\x9a\ +\xeb\xd0\x28\x38\xe9\xe2\xea\x05\xa8\xa8\xb4\xad\x64\x4a\xad\x8e\ +\x6b\x48\x5a\xa1\xfa\xb1\xc7\xad\x52\xd1\xe2\x02\x4c\x3d\xec\x4a\ +\x15\xd6\x2c\xc0\x42\x48\x99\x88\xa8\x23\xaa\x2e\x13\x11\xf3\x1a\ +\x33\x2a\x81\x50\x05\xe1\xd4\x19\xf5\x93\x1a\xe5\x63\x58\x50\xbc\ +\x4d\x29\x3a\xda\x52\xb8\x66\x4d\x0f\xd6\xad\xea\x72\x76\x87\xf1\ +\x93\xaa\xd4\x3e\x8a\xfd\x07\x8e\xe0\x87\x0f\x6f\xc3\xd9\xf3\x86\ +\xee\x30\x85\xc9\x6f\xce\x1c\x7e\xea\x11\xab\x3c\xe7\xb9\xc3\xc8\ +\xc5\x86\x83\x4e\x9c\xb4\x8b\x05\x50\x51\xf1\xcb\x15\xc0\x1a\x96\ +\x66\xef\x94\xbc\x9c\xc0\x4a\x97\x1e\x30\x07\x33\x56\x74\xf1\x71\ +\x00\x0b\x9a\x32\xe3\xc6\xe9\xd2\x9b\xd4\xa9\x92\x58\x79\xfc\x8e\ +\x2b\x1e\x4d\x0a\x55\x58\xc0\xa4\x6c\x0a\xe4\x3a\x32\xd8\xb8\xae\ +\x17\x23\x7d\x1d\xa1\x2d\xf0\x76\x87\x79\xe9\x95\x37\xf0\xf0\x13\ +\x3b\x0d\xdd\x61\xac\xb7\x2a\x73\xe7\xbe\x36\x73\xe8\x89\x5d\xd4\ +\xb6\x54\xa5\x47\xbd\x48\x8d\xaa\x7d\xec\x79\x9c\x34\x71\xe2\x1b\ +\x01\xb8\x15\x07\x52\x40\xeb\xb6\x74\x07\x9a\x3f\x0d\xa1\x51\x36\ +\x24\x86\xd5\x3b\xdd\x40\x15\xaf\xab\x4b\x0c\xaf\xd7\x5e\x55\xaf\ +\xca\x67\x9a\x27\x82\x51\x11\xa8\xf6\x3f\x67\x9f\x4e\x0a\xf8\xce\ +\xc8\x41\x3c\xe5\x12\x52\x00\x83\xb9\x36\x6c\x5a\xd7\x8b\xbe\xee\ +\x76\x45\x59\x94\xad\x11\x85\x62\x09\xcf\x6e\x7f\x09\x5b\x9f\x7b\ +\x15\x85\x62\x29\x0a\xa4\x28\xb5\xaa\x3b\x4b\x53\xc7\xbe\x36\x7b\ +\x6c\xfb\xdb\x21\xfd\x8f\x0b\x4e\x61\xf1\x71\x8f\xc5\xcb\x16\x96\ +\xbe\x55\x2c\xaa\x91\xf2\x4c\xe2\x9a\x0a\x50\x9e\xb4\x02\xa8\xd8\ +\x8e\xc4\xb1\x47\xb1\xd2\x6c\x5b\x13\x62\x96\x17\x37\x1e\x9a\x34\ +\xad\x98\x7a\xd0\x4c\x95\x0f\xfe\xb9\xf1\xf4\x04\x41\xe7\xf3\xe3\ +\x1c\xb8\xa2\x52\xfa\xa0\xb2\xd5\x7d\x1d\xd8\xa8\x72\x87\xa1\x6c\ +\x2a\xf8\xee\x30\x8f\x3c\xf1\x3c\x5e\x7c\x79\xbf\x99\x3b\x4c\xad\ +\xf4\x50\xe1\xc2\x9b\xdf\x9c\x3f\xb3\xe7\x2c\xc2\x37\x02\x85\x22\ +\xbc\x5e\x70\xaa\x27\x5d\xb3\x00\x2a\x4e\x7c\x2b\x58\x57\x54\xfa\ +\xa6\x4a\x2b\x81\xca\x6b\xb8\x29\x10\x35\x6b\x94\x0f\x88\x0f\x70\ +\xf5\xc6\xc3\xa0\x0e\xd5\x31\x60\x76\x53\x4d\xd2\x36\x02\x5c\x88\ +\x93\x97\xb2\xff\x09\xc0\xa1\x66\x54\x8e\xa4\x08\xb0\x7e\x55\x17\ +\xae\x5e\xd3\x83\x6c\x26\x25\x81\x14\x7b\x4e\x08\xc1\xb9\x73\x17\ +\xf1\xe0\x23\xdb\xf0\xe6\x5b\xc7\x4c\xdc\x61\x0a\x76\xa5\xf0\xfd\ +\xb9\x53\xbb\xff\xaa\x38\x71\x64\x16\xfa\x7b\xd3\x08\xb3\x6a\x25\ +\xcb\x6a\x36\x18\xd5\x93\x67\xd9\xa9\x7a\xa2\xb4\x1a\xa8\xbc\x0e\ +\xb4\xda\x58\xce\x8a\xe9\xd4\x82\xa8\x3c\xaa\xf8\x7a\x8e\xc3\xa4\ +\x9e\xa9\x07\x51\x69\xeb\x01\x2e\x77\xc2\x67\x34\xab\xf2\x3b\x48\ +\x83\xae\xea\x5c\x5c\x28\xa5\x68\xcf\xa4\x70\xd5\xea\x1c\xae\x18\ +\xee\x76\x76\x87\x11\x0a\x63\x55\x3e\x02\xe0\xf0\x91\x77\xf0\xc3\ +\x87\x9e\xc5\xf1\x93\x26\xee\x30\x74\xc2\x2a\xcf\x7e\x6b\xe6\xc8\ +\x33\xff\x50\x5d\x18\x67\xdd\x61\x54\xfd\x8f\x0b\x5e\xad\x66\x59\ +\x51\x60\xa2\x0a\xaf\xa7\xac\xc5\x04\xb0\x96\xc9\x62\x00\x95\xd7\ +\x91\xc5\x06\x24\x28\xf2\x46\x01\x12\x9b\x07\x86\x65\x21\x22\x0d\ +\x0c\xf2\x84\xd5\x09\x4d\xde\x66\x82\x9c\x11\x48\x09\x19\xdc\x42\ +\x3d\xfd\x8e\x82\x9b\x8d\x4e\x81\x4e\xc1\x1d\x46\x07\x52\x81\x3b\ +\xcc\xdb\x78\xf0\x91\xe7\x0c\xdd\x61\xec\xe3\xb5\x85\x89\xaf\x4d\ +\x1f\x7a\xfc\x69\xbb\x5a\x8c\xf3\xf2\x34\x0b\x9c\x4c\xcb\x6a\x24\ +\x8d\x69\x7c\x54\x58\x54\x99\xcd\x00\xb0\x96\xca\x62\x01\x15\xdb\ +\x21\x53\xfb\x13\x14\xe9\x21\xe4\xad\x57\x75\x63\xcb\x06\xe2\x83\ +\x47\x3d\xaa\x9c\x0a\x68\xea\x05\x2d\xd3\x3a\xe2\xe4\xa9\xeb\x81\ +\xa3\xc2\x9f\x27\x3d\x5d\x6d\xb8\x7e\xac\x17\xab\x7a\xb2\xca\x4c\ +\x2c\x48\x39\xee\x30\x7b\xf0\xf8\xd6\x17\x91\x9f\x33\x71\x87\xb1\ +\xf6\x54\x66\xcf\x7c\x75\xfa\xd0\xe3\x7b\xc0\xb3\x28\x55\xf3\xa2\ +\xc2\x5a\x01\x4e\xa6\xe9\x9a\x09\x50\x8d\xc6\xc7\x05\xbf\x45\x01\ +\x28\x4f\x16\x13\xa8\xd8\x8e\xb6\xca\xfe\x14\x77\x6a\x01\x1b\xaf\ +\x0a\x37\x8d\x17\xeb\xd1\xb5\x13\x9a\xb8\x28\x80\xa9\x07\x80\xe2\ +\xb4\x3d\xc2\x98\x4e\xc3\xa1\xcc\x9d\x96\xee\xd9\xa8\x86\x7a\xb3\ +\xd8\x34\xd6\x2b\xef\x0e\x43\xd9\x1f\xea\xba\xc3\x2c\xe0\xc9\xa7\ +\x77\x61\xfb\x0b\xaf\x1b\xb9\xc3\x50\xab\xf2\x74\x71\xe2\xe8\x9f\ +\xe4\xdf\xd9\x71\x1c\xc1\x6e\xc5\xba\xfe\xd5\x1b\x56\x2f\x38\x85\ +\xc5\x99\xe4\x89\x03\x50\xf5\xe4\x5b\x51\x2c\x8a\x95\xa5\x00\x2a\ +\xaf\xa3\xad\x56\xf7\x4c\xe3\x4d\xc2\x4d\xe2\xc3\xda\x6e\x1a\xa7\ +\xeb\x77\x58\x5d\xf5\x4a\x2c\xd6\xe6\xe0\x14\xe5\x0d\xe6\xc2\x84\ +\x4f\x02\x8a\x75\xab\xba\x70\xdd\x5a\x77\x77\x18\xf0\x35\x70\xf6\ +\x28\x77\x77\x98\x1f\x3f\xba\x1d\xaf\xee\x35\x74\x87\xa9\x95\xfe\ +\xdb\xc2\xb9\xbd\x7f\xbe\x70\x6e\x2f\xeb\x0e\x23\xd4\x22\x35\x1b\ +\x06\xe1\x8d\x82\x57\x3d\xec\x49\x15\x57\x2f\x40\x99\xd4\xd9\x6c\ +\x35\x70\x51\x65\xa9\x80\x8a\xed\xf0\x62\xa9\x7b\xcd\x04\x2c\xd3\ +\x34\xba\x7a\x75\x71\x26\xea\x70\x23\x13\x4c\x75\x62\x60\xa3\x0a\ +\x9e\x59\x6f\xfe\x39\x3b\xe1\x33\xed\xb9\xc3\xb8\xbb\xc3\xc8\xeb\ +\xa7\x07\x01\x84\x10\x9c\x3c\x79\x16\x3f\x7c\xe8\x59\x1c\x3c\x7a\ +\xca\x0d\x0b\xad\x7b\xd6\xaa\x2c\xfc\x87\xfc\x3b\x3b\xbf\x57\x9e\ +\x3e\x61\xe2\x0e\x03\x83\xb8\x46\xc1\x6a\x31\x55\xc0\xb0\xf0\xc5\ +\x56\x03\x97\x44\x96\x12\xa8\xd8\x0b\xd0\x4a\x75\x4f\x77\x6c\x62\ +\x67\xaa\x07\xb0\xe2\xb0\x27\xc4\x28\x37\xae\xc4\xc9\x6f\x1b\x2d\ +\xf3\xe2\x0b\x03\x3d\x94\xa0\x2d\x93\xc2\xc6\x75\x7d\x58\x33\xd8\ +\x89\x34\x21\x8c\x63\xb1\xfa\xdd\xdf\x7f\xe0\x08\x7e\xf8\xd0\x36\ +\x9c\x39\x3f\x6e\x32\xb2\x77\xb6\x56\x9a\xfd\xfa\xcc\xe1\x27\x7f\ +\x54\x2b\x4e\xd7\x0c\xfa\xd4\x88\x0a\x28\x86\xb7\x42\x25\x8c\x9b\ +\x46\x97\x27\x0e\x00\xa9\xc2\x97\x3d\x8b\x62\x65\x39\x00\x15\xd0\ +\x5a\x75\xcf\x74\xa4\x0f\xa8\x5f\xb5\x43\x44\xb8\x2a\xae\x1e\x3b\ +\x95\xaa\x6d\x71\xd5\x40\x4d\x39\x26\x40\x45\x15\x21\x14\xbd\x5d\ +\x6d\xe8\xeb\x6e\xf3\xcf\x95\x95\xb2\xee\x30\x8f\xef\xc4\xd4\x4c\ +\xde\x64\x64\xef\xad\xda\xc2\xf8\x1f\x4d\xbd\xf5\xf0\x0e\x6a\xd7\ +\xd8\xb6\xab\x1b\xd3\x9c\xf0\xa5\xb4\x57\x35\x0b\xdc\x5a\xa1\x06\ +\x2e\xa9\x2c\x17\xa0\xf2\xc4\x14\x90\x4c\x80\x2d\x2c\x1e\x0d\xa4\ +\x89\x33\x47\xaa\x11\x95\xcf\x44\x9a\x61\xab\x72\xfa\x19\xc5\x6c\ +\x00\x77\xf2\x39\x95\xf4\xb4\xa8\xac\x84\x10\x14\x5d\x77\x98\xa7\ +\xb7\xbf\x62\xe6\x0e\x63\xd7\x9e\xaf\xcc\x9e\xf9\xa3\xe9\x43\x4f\ +\xec\x47\x60\x34\x37\x79\x89\x56\xb2\x0a\x28\x9e\x2f\x26\x40\x45\ +\xd5\xb7\xa4\xb2\xdc\x80\x0a\x68\xcc\xfe\xd4\xac\x99\xe4\x26\x69\ +\xe2\xce\x91\x8a\xcb\x7a\x16\x43\xe5\x03\x93\xd6\x28\xbd\xa3\xee\ +\x05\xab\x24\x44\xa1\x14\x21\xc0\xcc\x4c\x1e\x8f\x3e\xf1\x3c\x5e\ +\x78\xf9\x4d\x13\x77\x98\x1a\xb5\x2a\x3f\x2a\x8e\x1f\xfe\x5a\xfe\ +\xc4\xce\x33\x50\xef\x0e\x63\xd2\xbf\x46\x54\xc0\x56\xb1\xaa\xb0\ +\xb4\xad\x3c\x5e\x51\x6a\x9e\x4a\x96\x23\x50\x79\x62\x62\x7f\x6a\ +\xc5\x4c\xf2\x7a\x66\x9b\x37\x73\x94\xaf\xd1\x89\x9d\x3a\x09\x2b\ +\xc7\x33\xa6\x1b\xd7\x11\x98\xa1\x18\x23\xb9\x10\x97\x22\x04\xe7\ +\xce\x5d\xc2\x8f\x1e\xd9\x8e\x37\xde\x3a\x0a\x9b\x46\xb9\xc3\x60\ +\xc1\xae\x95\xbe\x3b\x7f\x66\xcf\xb7\x0b\x17\xde\x9c\x86\x1e\xa4\ +\x94\x4d\x31\x08\x8f\xc3\xb6\x16\x43\x05\x0c\x8b\x6b\x36\x40\xa9\ +\xc2\x4d\xd8\xe4\xb2\x90\xe5\x0c\x54\x80\x9a\xbd\xc4\x1d\xbd\x6b\ +\x16\x18\xe9\xca\x6d\x24\xae\x11\x95\x0f\x75\xe6\x55\x89\x91\xea\ +\x17\x5d\x08\x2f\x87\x8f\x9e\xc0\x0f\x1f\xda\x86\xe3\x27\xcf\x81\ +\x10\x82\xf0\x1a\xe8\x84\x55\x59\xf8\x66\xfe\xf8\x8e\xff\x5a\x9e\ +\x39\x55\x82\x5a\xdd\x33\xa9\x36\x2a\x5c\x17\xb7\x58\x2a\x60\x58\ +\x5c\xb3\x40\xac\x5e\x35\x71\xd9\xca\x72\x07\x2a\x4f\x4c\x41\x65\ +\x31\x5c\x5f\xe2\xa8\x7f\xcb\x5d\xe5\xf3\x84\x92\x08\x63\xba\x69\ +\xa1\x84\x00\x96\x65\x63\xdf\x1b\x07\xf1\xa3\x47\x9f\xc3\xc5\xf1\ +\x68\x77\x18\x50\xfb\x78\xad\x34\xfb\xd5\xe9\x83\x8f\x3e\x6e\x95\ +\xe7\xc5\xdd\x61\xea\x05\xaa\xb0\xf8\xc5\x50\x01\xa3\xce\xe3\x02\ +\x54\x23\x69\x56\x2c\x40\x79\xb2\x52\x80\xca\x93\x66\x03\x96\x2a\ +\x0d\x42\xf2\x34\x92\x6e\x39\x4f\xec\x8c\x5e\xe6\x85\xc2\x77\xe7\ +\xd3\xe1\x0e\x21\x04\x95\x4a\x05\x3b\x5f\x78\x1d\x8f\x6f\x7d\xc1\ +\xcc\x1d\x86\xda\xaf\xd6\x16\xc6\xff\x60\xf2\xc0\x8f\x5e\x02\xa5\ +\x04\xf1\x40\x4a\x68\xa1\x71\xb8\x69\xda\x46\x59\x55\x58\xfc\x62\ +\x80\xd8\x8a\x07\x28\x4f\x56\x1a\x50\x79\xd2\x28\x60\x85\xa5\x69\ +\x96\xf1\x1c\x11\xf1\xd4\x20\x2c\x6e\xb9\xf5\x48\xe0\xeb\x17\xa9\ +\xfd\x39\xd5\x8a\x6b\x9b\x13\x00\x24\x45\x30\x3f\x5f\xc0\x53\xcf\ +\xbc\x80\xed\xbb\x5e\x47\xb9\x5c\x89\x02\x29\x9b\xda\xb5\x27\x2b\ +\xb3\x67\xfe\xdf\xe9\x43\x4f\x1c\x41\xb4\xaa\xb7\x18\x2a\x60\x3d\ +\x4c\x2b\x6e\x7c\xa3\x00\xd5\x48\x9a\x15\x07\x50\x9e\xac\x54\xa0\ +\xf2\xa4\x5e\xc0\xaa\x67\x1e\x54\x58\xba\x46\x1d\x8c\xeb\x05\x2e\ +\xd3\xf2\xa3\x84\x82\xa4\xa8\x3e\x52\x77\xe6\x56\x4d\x08\x26\x26\ +\xa6\xf1\xf0\xe3\xcf\xe1\x95\xd7\xdf\x86\x65\xd9\x91\xee\x30\xd4\ +\xaa\xfe\xd7\xc2\xa5\x83\xdf\x98\x3b\xb9\xeb\x22\x1a\x33\x9a\x37\ +\x12\xdf\x2c\x15\x50\x0c\x6b\xa5\x0a\x18\x96\xee\x5d\x07\x50\x9e\ +\xac\x74\xa0\xf2\x24\x8e\x61\xbc\x51\x1b\x55\x54\x79\xcd\x70\x30\ +\x5e\x4c\x5f\x3e\x0a\x80\xd6\x67\x4a\x77\xfc\xf3\x4e\x9d\x3a\x8b\ +\x07\x1f\xd9\x86\x83\x47\x3c\x77\x98\xd0\xd2\x66\xed\x5a\xe9\x2f\ +\x17\xce\xec\xf9\xeb\x85\x0b\x6f\xce\xa1\x39\x20\x65\x92\x76\x31\ +\x55\xc0\xa8\xf3\x7a\xd2\x36\x6a\x68\x5f\xd1\xf2\x6e\x01\x2a\x4f\ +\xe2\x8e\xf0\xb1\x79\x74\x12\x97\x3d\xc5\xb5\x53\x99\xb4\xc1\xa4\ +\xec\xb8\xc2\xcf\xf2\x26\xd1\xc6\x74\xd5\x76\x56\x07\xde\x3e\x86\ +\x07\x1f\xd9\x86\x33\xe7\xcc\xdc\x61\xec\x6a\xe1\x8f\x67\x8e\x3e\ +\xf3\x3f\x2a\xf9\x73\xd5\x3a\xfb\xd4\x6c\x15\xb0\x59\x00\xb6\x9c\ +\x58\xd6\xbb\x06\xa0\x3c\x79\xb7\x01\x95\x27\xcd\x9c\x6e\x10\x96\ +\xae\x51\x95\xaf\xd1\x3c\xcd\x9b\x99\x6e\xba\x5d\x16\x0d\xdc\x61\ +\x5e\xdd\xb3\x1f\x0f\x3f\xb9\x13\x93\xd3\x79\xa4\xa2\x47\xf6\x0e\ +\xd4\x4a\xf9\xdf\x9f\xdc\xff\xc3\x67\xa9\x55\xa9\xf7\xfa\x98\xa4\ +\x6f\x74\x5a\x42\x58\xdc\x4a\x51\x01\xdf\x75\xf2\x6e\x05\x2a\x4f\ +\x9a\x39\xdd\xa0\x19\xbe\x7a\xf5\x3c\x48\xf5\xf8\xf8\x99\xd4\x45\ +\xb9\xb2\x0d\x9d\x92\x09\x21\x28\x95\x4a\xd8\xbe\xe3\x15\x6c\x7d\ +\xee\x15\x2c\x14\x4a\x51\x20\x45\x41\xed\x1d\xd5\x85\x89\xdf\x9b\ +\xdc\xff\xc3\x7d\x6e\x9d\x81\x01\x3f\x9e\x98\xa6\x8f\x0b\x56\xba\ +\xf0\x56\xab\x80\xe2\x79\x02\x50\x1a\x79\xb7\x03\x95\x27\x71\xa7\ +\x05\x44\xa5\x6b\xc6\xc4\xcd\x46\xe7\x4c\x35\x92\x57\x71\x5d\x22\ +\x66\xa6\x53\xea\xbb\xc3\x3c\xfe\xd4\x2e\xbc\xf0\xca\x9b\xa8\x56\ +\xa3\x77\x87\xa1\xb6\xf5\xa0\xe3\xb3\xf7\xf8\x49\x00\x69\xa6\xde\ +\x46\x5f\xae\x7a\xc0\x28\x2c\xbe\x59\x86\xf5\x46\xa7\x34\x24\xe0\ +\xa4\x90\xcb\x05\xa8\x58\x69\x06\x7b\x0a\x13\x15\x03\xaa\x67\xdd\ +\xa9\x7a\xa4\x7e\x75\x2a\x14\x70\x08\x08\x21\x38\x7f\x61\x1c\x3f\ +\x7a\x78\x9b\xe3\x0e\x63\x47\xbb\xc3\x50\xab\xfa\x37\xc5\x89\xc3\ +\x7f\x9e\x7f\xe7\xf9\x49\x38\x20\xd5\x08\xb8\xd4\x93\xbe\x15\x76\ +\x29\x55\x58\x33\x55\xc0\xb8\x79\x2f\x0b\xb9\x1c\x81\xca\x93\x7a\ +\x0d\xe4\x8b\x35\xca\xd7\xec\x39\x53\xa1\xbe\x7e\x61\xeb\x51\x11\ +\x00\xc7\xde\x39\x8d\xed\xcf\xbf\x8a\xa3\xef\x9c\x71\xdc\x61\xc2\ +\x4d\x52\xe3\xb4\x56\xfe\xfa\xfc\xd9\x3d\xdf\x5f\x38\xff\x46\x11\ +\xcd\x1f\xd9\x33\xcd\xd7\x8c\xb9\x55\xaa\xb0\xa5\x54\x01\x2f\x4b\ +\xb9\x9c\x81\x8a\x95\x66\x81\x96\x89\x2c\x99\x9b\x0c\x78\xb5\x4f\ +\x88\xd3\x03\x55\xcd\xb2\xb0\x6b\xf7\x3e\x54\xa2\x55\x3d\x00\xf4\ +\x98\x5d\x2d\xfe\xc1\xf4\xc1\xc7\x1f\xaa\x2e\x8c\x8b\xee\x30\x71\ +\xda\xda\x8c\x74\xef\x16\x15\xf0\xb2\x97\x04\xa8\x64\x79\xb7\xaa\ +\x7c\x61\xf5\x50\x42\x52\xd0\xe1\x18\xa5\x14\xd5\x9a\x65\x32\xfd\ +\xe0\x15\xab\x32\xff\x3b\x13\x6f\xfc\xe3\x0b\xd4\xaa\x34\x0a\xaa\ +\xcd\x4c\xbb\x52\x55\xc0\x44\x5c\x49\x80\x2a\x5c\x96\xd3\x28\x5f\ +\xbd\x62\xe6\xeb\x17\x73\x5f\x3f\x41\x2c\x50\xfb\x89\x5a\x71\xfa\ +\x5f\x4f\xbc\xf1\x8f\x07\x61\xa6\xea\x85\x49\xb3\xc1\xad\x19\x2a\ +\x60\xab\x98\x56\x02\x4e\x06\x92\x00\x95\xb9\xbc\x1b\x55\xbe\x20\ +\x0d\xa9\xbb\x6d\x25\x4a\xad\xbf\xab\xe6\xcf\xff\xf1\xd4\xdb\x8f\ +\x9c\x47\xe3\x20\xa5\x6a\x7f\xa3\x69\x9a\xa1\x02\xd6\x33\x09\xd4\ +\xb4\xec\x44\x22\x24\x01\xaa\xfa\x24\x6a\x76\xf9\x62\x39\x18\x37\ +\x8b\x7d\x85\xfa\xfa\x85\xc8\x2c\xb5\x6b\x7f\x5e\x9e\x3e\xf9\xed\ +\x99\x23\x4f\xe7\xb1\x34\x20\xd5\x8c\x74\xcd\x9a\x9d\x5e\x4f\x79\ +\x89\x18\x48\x02\x54\x8d\x8b\x89\xcd\xa9\xd1\xb9\x5b\x26\xac\x48\ +\x55\x96\xae\x8d\x8a\xf2\x63\xab\x7e\x67\xa8\x55\xfd\xa3\xf9\xb3\ +\xaf\xfd\x60\xe1\xdc\xeb\xf5\xba\xc3\x44\xc9\x62\xa8\x80\xcd\x48\ +\x9f\x00\x53\x8b\x25\x01\xaa\xe6\x4b\xb3\x41\x2a\x62\x09\xe1\xb0\ +\x91\x3c\x23\x70\x23\x70\xa6\x27\xc4\xe9\xe2\x9b\xb4\x56\xf9\x9d\ +\xa9\x83\x8f\x3e\x55\x9d\xbf\xe4\xd5\xd3\xea\x17\xb3\x51\x15\xb0\ +\x5e\xf5\xb0\x5e\x15\x30\x91\x26\x4a\x02\x54\xad\x97\x56\xcd\x8f\ +\x6a\xa6\xd1\x9d\x02\xc4\x32\x28\x8b\x02\x74\xbb\x5d\x2d\xfd\xe6\ +\xa5\x3d\x7f\xfb\x1a\xcc\x97\x0b\x6e\x86\x34\xc3\x56\x15\x96\xa6\ +\x59\xe1\x89\xb4\x40\x12\xa0\x5a\x7c\xd1\xb1\xa6\x66\x3e\xf8\x71\ +\x40\x8c\x02\x80\x6d\x95\xcf\xa7\xda\x3a\x2f\x01\x58\xa3\x49\x57\ +\x05\xa5\xff\xc3\xaa\x2e\xfc\xde\xf8\x6b\x7f\x77\x1c\xd1\x33\xcd\ +\x5b\x7d\xcd\xea\x4d\xdf\xac\x49\xa0\x89\x2c\xa2\xa4\x1b\x2f\x22\ +\x91\x16\x49\xe3\xbb\x2d\xc4\x28\x3f\xdd\xd6\x5d\x6c\xef\x19\xbd\ +\x1e\x84\xdc\xad\x48\xbb\x00\x4a\xbf\x6d\x55\x16\x7e\x77\xfc\xf5\ +\xbf\x3b\x87\x80\x49\x2d\x85\x2c\x95\x0a\x98\xc8\x12\x4a\x02\x54\ +\x2b\x4f\x5a\x02\x60\x95\xfc\x59\xab\x7b\xed\x6d\x47\x49\x2a\xbd\ +\x1e\xc0\x35\x70\x9e\x0d\x1b\xc0\x09\x50\xfb\xdf\xd4\xca\x73\xdf\ +\x9c\xd8\xfb\x83\x59\xa8\x41\x2a\x7a\xfa\x43\xf3\xa4\xd5\x2a\x60\ +\x22\xcb\x50\x5a\xfd\xd5\x4e\x64\x71\xa5\xd1\x91\x41\xba\xfa\xae\ +\x5f\x5d\x4d\x52\x99\xcf\x80\x60\x03\x80\x12\xb5\xed\x47\xcb\xd3\ +\x27\xde\x9a\x39\xf2\xb4\x55\x47\xf9\xcd\x96\x56\xb9\xe2\x24\xb2\ +\xcc\x65\xa9\x1f\xbc\x44\x16\x5f\x74\xab\x8c\x7a\x12\x36\xf2\xb8\ +\x94\xd2\xe8\x84\xdb\x44\x56\xb0\x2c\x87\x07\x30\x91\x95\x21\xad\ +\x7a\x56\x12\xc0\x49\x24\x52\xfe\x7f\x90\xbe\xf8\xd8\xd4\xeb\x70\ +\x25\x00\x00\x00\x14\x74\x45\x58\x74\x41\x75\x74\x68\x6f\x72\x00\ +\x4a\x61\x6b\x75\x62\x20\x53\x74\x65\x69\x6e\x65\x72\xe6\xfb\xf7\ +\x2f\x00\x00\x00\x49\x74\x45\x58\x74\x43\x6f\x70\x79\x72\x69\x67\ +\x68\x74\x00\x50\x75\x62\x6c\x69\x63\x20\x44\x6f\x6d\x61\x69\x6e\ +\x20\x68\x74\x74\x70\x3a\x2f\x2f\x63\x72\x65\x61\x74\x69\x76\x65\ +\x63\x6f\x6d\x6d\x6f\x6e\x73\x2e\x6f\x72\x67\x2f\x6c\x69\x63\x65\ +\x6e\x73\x65\x73\x2f\x70\x75\x62\x6c\x69\x63\x64\x6f\x6d\x61\x69\ +\x6e\x2f\x59\xc3\xfe\xca\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\ +\x74\x65\x3a\x63\x72\x65\x61\x74\x65\x00\x32\x30\x31\x30\x2d\x30\ +\x36\x2d\x32\x30\x54\x32\x33\x3a\x32\x34\x3a\x32\x35\x2d\x30\x34\ +\x3a\x30\x30\x77\x9c\x29\x53\x00\x00\x00\x25\x74\x45\x58\x74\x64\ +\x61\x74\x65\x3a\x6d\x6f\x64\x69\x66\x79\x00\x32\x30\x31\x30\x2d\ +\x30\x36\x2d\x32\x30\x54\x32\x33\x3a\x32\x34\x3a\x32\x35\x2d\x30\ +\x34\x3a\x30\x30\x06\xc1\x91\xef\x00\x00\x00\x19\x74\x45\x58\x74\ +\x53\x6f\x66\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\ +\x73\x63\x61\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x00\ +\x21\x74\x45\x58\x74\x53\x6f\x75\x72\x63\x65\x00\x68\x74\x74\x70\ +\x3a\x2f\x2f\x6a\x69\x6d\x6d\x61\x63\x2e\x6d\x75\x73\x69\x63\x68\ +\x61\x6c\x6c\x2e\x63\x7a\x69\x66\xe3\x5e\x00\x00\x00\x0d\x74\x45\ +\x58\x74\x54\x69\x74\x6c\x65\x00\x47\x6f\x20\x44\x6f\x77\x6e\xf3\ +\xfd\x14\x79\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x09\x4d\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x09\x02\x49\x44\x41\x54\x68\x81\xed\x9a\x7b\x54\ +\x93\xf7\x19\xc7\x3f\x6f\x02\x04\x84\x70\xf1\x08\x82\x17\x44\x10\ +\xc1\x8a\xab\xb4\x38\xb1\xd5\xf5\x88\x99\x52\x56\x95\x7a\xc6\x2c\ +\x9d\xb5\x30\xd6\x33\xa7\xa7\xdd\xe9\x6d\x2d\x3b\x6e\x6d\x57\xb7\ +\xb5\xb5\xad\xae\xb6\xdb\xa9\xb6\xd4\x56\x5d\xab\x5d\x77\x4a\x71\ +\x30\x10\x5b\x6a\x5b\xea\x44\x04\x05\xa3\xf5\x16\xa1\x48\x02\x28\ +\x97\x24\xe4\x9e\xbc\xfb\x83\x06\xd3\x98\x40\x02\xa8\xff\xec\x39\ +\x27\xe7\x79\x79\xf3\xfb\x3d\xf9\x7c\x7f\xcf\xf3\xbb\xbc\x09\xf0\ +\x7f\xbb\xb9\x26\x78\xba\xa9\x50\x28\x12\x81\x6d\x52\xa9\xf4\x4e\ +\x41\x10\x22\x6e\x30\x93\xbb\xd9\xec\x76\xfb\x29\x51\x14\x37\x55\ +\x57\x57\xef\x1b\xb6\xb5\x42\xa1\x88\xc8\xcb\xcb\xeb\xac\xab\xab\ +\x13\x4d\x26\x93\x38\x52\x73\x38\x1c\x63\xf2\x32\x1a\x8d\x62\x5d\ +\x5d\x9d\x98\x97\x97\x27\x2e\x5c\xb8\xf0\x01\x77\xde\x00\xf7\x1b\ +\xfd\xfd\xfd\x6b\x36\x6c\xd8\x10\x9d\x91\x91\x81\x28\x8a\x38\x1c\ +\x0e\x00\x44\x51\xfc\x9e\xf7\x74\x6f\x24\xde\x97\x78\xb3\x67\xcf\ +\x26\x3f\x3f\x9f\x2d\x5b\xb6\x3c\x01\xfc\x03\xb0\x3b\xfb\x48\xdc\ +\x05\x88\xa2\x78\x4b\x42\x42\xc2\xf7\x82\x7b\x83\x77\x58\xad\xf4\ +\x2a\x95\x58\xf5\xfa\xeb\x06\x2f\x8a\x22\x16\x8b\x85\xe9\xd3\xa7\ +\x23\x08\xc2\x14\x20\xdc\x95\xd7\x93\x00\xe9\x50\x01\x9d\xd7\xa7\ +\xb7\x6f\xe7\xc3\x19\x33\xa8\x5c\xba\x98\x0a\x85\x82\x2b\x97\x2e\ +\x5d\x17\x78\x37\x36\x80\x60\xd7\x7b\xd7\x94\xd0\x50\x81\x01\x1c\ +\x76\x3b\x5f\xad\x5b\x87\x55\xd5\xc8\xfd\x7f\x9e\x87\xc4\x78\x86\ +\xb6\xb4\x55\x1c\x2e\x28\x20\x63\xe7\x4e\xa2\xe3\xe2\xc6\x14\xde\ +\x53\x5b\x57\xbb\x26\x03\xce\x9a\xf7\x26\xa8\xae\xb8\x98\x10\x73\ +\x2b\x4b\x57\x9a\x90\x98\xcf\x72\x79\xee\x1a\xda\x02\x57\xb0\xf8\ +\xd5\x1f\xd1\xf8\xd8\x63\xf4\xf6\xf4\x8c\x39\xbc\xd3\xbb\xb3\x79\ +\x15\xe0\x4d\x7d\xf7\x89\x13\xa8\x76\x95\x90\xb9\x48\x0f\x61\x12\ +\xfa\xa6\xcc\x42\x1f\xbb\x86\x84\xf8\xf1\x84\x4b\x0e\x90\xf5\xdb\ +\x78\xea\x37\x6e\x44\xef\x65\x4e\x8c\x76\x01\xf0\x49\x80\xfb\x07\ +\xb8\x5e\xb7\x56\x56\x92\x56\xa0\xa0\x3f\xc4\x41\x73\xf4\x22\xbe\ +\x74\x6c\xa0\x5d\x7d\x85\x28\xe1\x6b\xa4\x53\x1e\x22\x2c\xa4\x9a\ +\xdb\x73\x64\x1c\xdb\xbc\x19\xa3\xd1\x38\xa6\xf0\xde\xcc\xd3\x24\ +\xf6\xfa\x61\x53\x72\x73\xf9\x66\x7f\x23\xff\x11\x57\x52\xdf\x97\ +\x4b\x88\xb4\x83\x59\x92\x42\x64\xda\xd7\x41\x10\x61\xf2\x23\xc4\ +\x25\x1f\x62\xf2\xf8\x16\x1a\x76\xec\xc0\x62\xb1\x8c\x19\xbc\xcf\ +\x19\x70\x6d\xe4\x1e\x64\x7c\x52\x12\xb7\xfe\x6d\x07\x92\xb7\x3f\ +\x64\x55\xda\x46\xb2\x26\xdd\x4f\x94\xec\x04\xf4\x1f\x82\xde\x8f\ +\x40\x12\x0c\xb1\x45\xcc\x59\x7e\x86\x30\xf5\x67\x34\xec\xd9\x83\ +\xd5\x6a\x1d\x13\x78\x77\xb6\x61\x05\x78\x0b\x92\xb0\x60\x01\xd3\ +\x1f\x7f\x96\x23\x2f\x06\x22\x4a\x62\x41\xca\xc0\xab\xbf\x0a\xb4\ +\xa5\x10\x18\x0d\x13\x56\xb3\x60\xbd\x16\x73\xd5\x4e\x4e\x94\x96\ +\x62\xb7\xdb\x47\x0d\xef\x7e\xed\x55\xc0\x50\x1b\x98\xd3\xa7\x64\ +\x67\x33\x4e\x51\xc8\xb1\x0f\xe7\xe3\x10\xc6\x0f\x08\x90\x88\xd0\ +\x5f\x06\xba\x2a\x08\x8a\x87\xf0\x65\xe4\xbc\x22\xa7\x6b\xc7\xcb\ +\x28\x6b\x6a\x7c\x8a\x3b\xdc\xea\x65\xb7\x0f\x6e\xc0\xde\x05\x0c\ +\x97\x01\xa7\xbf\x75\xcd\x1a\x74\xf2\x3b\xb8\xd8\x90\x8b\x28\x91\ +\x0f\x88\x10\xec\xa0\xdb\x0b\x86\x1a\x18\x37\x0b\x42\x6f\x27\x6f\ +\xd7\x74\x2e\x3c\x53\xcc\xd9\xfa\xfa\x11\xc3\xbb\x0e\xee\xb0\x02\ +\xfc\x09\x9a\xb1\x7e\x3d\xe7\x1a\x23\x38\x7f\x64\x05\xa2\x24\xe2\ +\xbb\x4c\x58\x41\xbb\x1b\x8c\x5f\x42\xd8\x7c\x08\x9e\xca\x9a\x4f\ +\x32\x38\xf1\xf0\xc3\xb4\x7e\xf3\xcd\xa8\xe0\xfd\xda\xc8\x7c\x09\ +\x2e\x08\x02\x99\xcf\x3e\xcb\xa9\xcf\x03\xd1\xb4\xfc\x1c\xd1\x18\ +\x04\x36\x40\x30\x41\xdf\x7b\x60\xaa\x87\xb0\xc5\x08\x52\x28\xd8\ +\x7f\x17\x8d\x8f\x3e\x8a\xa6\xad\x6d\xc4\x22\x7c\x9a\xc4\xfe\xd6\ +\xaa\x44\x22\x61\xc1\x4b\x2f\x51\xfb\x7a\x0b\x5a\xd3\x3a\xd0\x49\ +\x41\x07\x98\x74\xd0\xf3\x16\x58\x9a\x20\x62\x05\xd2\x40\x35\xab\ +\xdf\xce\xa0\xa1\xb8\x98\xcb\x5d\x5d\x7e\x8b\x18\xd1\x32\xea\x6b\ +\xf0\x20\x99\x8c\x3b\xdf\x7c\x93\xf2\xe2\x46\x8c\x21\xeb\x07\x04\ +\x68\x81\xde\x6e\x50\x97\x80\xf1\x0c\x44\xe4\x23\x1b\xa7\xe4\xee\ +\xdf\x25\xd3\xf0\xdc\x73\x68\xb5\x5a\xbf\x44\xb8\x5f\xfb\x24\xc0\ +\xd7\x91\x01\x18\x27\x97\x73\xc7\xf6\xed\xec\x2b\xa8\xc1\x1a\xfe\ +\xcb\xab\x22\xba\xdb\xa1\xad\x04\xfa\x5b\x21\xbc\x88\xa8\xb8\x7a\ +\xee\xfc\x59\x14\x0d\xaf\xbd\x86\xc1\x60\xf0\x4b\x84\x5f\xcb\xa8\ +\x3f\xf0\xce\xbf\x23\x63\x63\x59\x50\x52\xc2\xae\xb5\x87\xb0\x44\ +\xe4\x5f\x15\xd1\xa9\x82\x96\x12\x30\x74\x80\xfc\x21\xa6\xa4\xd6\ +\x33\x73\x5a\x0f\x8d\x25\x25\x98\xcd\x66\x9f\xe1\xfd\x3a\x0b\xf9\ +\x0b\xef\xf4\x31\x33\x66\x90\xbe\xe5\xaf\x7c\xb0\xa1\x0e\x7b\x48\ +\xd6\x80\x08\x1d\xa0\x39\x0d\xaa\x3d\x60\xd4\x43\xc4\x43\xa4\x2d\ +\xb9\x80\xd0\xfc\x29\xcd\x07\x0f\x62\xb1\x58\x7c\x16\x31\xac\x00\ +\xe7\x69\x74\x24\xf0\x4e\x9f\x30\x7f\x3e\x33\x7f\xff\x17\xca\xb6\ +\x6a\xb1\xc9\x32\xaf\x66\xa2\xed\x28\xa8\xf6\x82\x55\x80\x88\x7c\ +\x32\x73\x17\xd2\x59\x56\x46\x5b\x5b\x9b\x4f\xf0\x7e\x6d\x64\x23\ +\x85\x77\xfa\x99\x59\x59\x44\xe6\x16\xf2\xd9\x47\x21\x38\x82\x52\ +\xae\x8a\x38\x7f\x08\x2e\x7c\x0c\xd6\x60\x82\xa6\xdf\x4e\x47\x4d\ +\x0d\xad\x2a\x95\x5f\xc7\x8d\x21\x05\x8c\x66\xe4\xdd\xfd\x9c\xd5\ +\xab\xb1\xcf\x5d\xc6\xd1\xa6\x74\xec\x21\xf1\x60\x06\xf4\x22\xf4\ +\x3b\xb0\x7d\xeb\x20\x78\xce\x5c\xa2\x6f\x49\xc6\x72\xfa\x34\x7d\ +\x7d\x7d\xc3\x42\xfb\x55\x42\xa3\x85\x77\xfa\x8c\xa2\x22\xd4\x8e\ +\xc9\x5c\xd0\xe5\xc0\xd4\x1c\xc4\x99\x4f\xa3\x0f\xcd\xc1\x38\x73\ +\x16\x0e\xbb\x85\x5b\xf2\x96\x63\x6d\x6a\x42\xa3\xd1\x8c\xed\x3e\ +\x30\x16\xf0\x4e\x9f\xf9\xe4\x93\x34\x36\xdb\x78\xf1\xfe\x83\xec\ +\xd9\x5c\x41\xbb\x4e\x8b\xcd\x70\x19\x9b\xb1\x9b\xbe\x94\x44\xba\ +\x8e\xd5\xa3\x51\xab\xbd\x0e\x9e\x3b\x9b\xab\x5d\xf3\x50\x3f\xd6\ +\xf0\x00\x82\x20\xb0\xe8\xf9\xe7\x09\x5b\xb6\x8c\xcb\xe5\xe5\x7c\ +\x5c\xb8\x99\x98\xb4\x78\xc8\xfd\x31\x8f\xfc\xab\x96\x5f\xa4\x26\ +\x31\xf1\xdc\x39\x74\xb7\xdd\x46\x78\x78\xb8\xd7\xf2\xf1\x54\x42\ +\xd7\x08\x70\xcd\xc0\x58\xc0\xbb\x8a\xb8\x6d\xd1\x22\xf4\xe9\xe9\ +\x9c\xbb\xf7\x5e\x3a\x2b\x2b\x51\x6f\xd9\x4b\x7e\xca\x54\x34\x61\ +\x21\xd8\x95\x4a\x3a\x3a\x3a\x90\xcb\xe5\x1e\xfb\xbb\x5f\x7b\x15\ +\xe0\x49\xe9\x68\xe1\x5d\x7d\x68\x68\x28\x3f\xc8\xc8\xc0\x94\x96\ +\xc6\xc5\x95\x2b\x99\x54\x51\x41\x47\x69\x29\x97\xcd\x66\x64\x2b\ +\x56\x90\x98\x98\x88\x20\x08\xd7\xf4\xf3\x36\x07\x9c\x02\x96\x00\ +\x49\x00\x3a\x9d\x6e\x56\x69\x69\x29\xf5\xf5\xf5\x1e\xf7\x03\x6f\ +\xa3\xe1\x6f\xbb\x79\xf3\xe6\x91\x32\x7b\x36\xf1\x89\x89\xa8\x72\ +\x72\xb8\x74\xe4\x08\x66\xbd\x1e\xbd\x5e\x8f\x5c\x2e\xf7\x2f\x03\ +\xf1\xf1\xf1\xc5\x45\x45\x45\x77\xc5\xc4\xc4\x88\x0e\x87\x43\x2a\ +\x95\x4a\x07\x47\xc1\x5b\xc7\xd1\x58\x6d\x6d\x2d\x36\x9b\x8d\xe4\ +\xe4\x64\x82\x83\x83\x49\x4d\x4d\x25\x29\x29\x89\xde\xde\x5e\x82\ +\x83\x83\xbd\x66\xd0\xd3\x46\x16\x00\x20\x08\x82\x90\x9f\x9f\x1f\ +\x90\x9c\x9c\x3c\xf8\x46\xc7\xc9\x46\x9a\x5b\xd5\x04\x8d\x8f\x25\ +\x29\xfd\x56\x26\x05\x0d\x79\xea\xf0\xcb\x02\x03\x03\xd1\x68\x34\ +\xdf\x83\x0b\x08\x08\x60\xc2\x84\x09\x43\x96\x9f\x5f\x67\x21\x73\ +\xe7\xbf\x51\xe4\xe4\x50\x7a\xbe\x13\xb9\xf4\xbb\x9a\xb4\xf7\x71\ +\xf8\x9c\x76\xb0\xcd\xc5\xa3\x27\xe9\xeb\xfd\x96\x4f\x2b\x3f\xe5\ +\x4c\xef\xc0\x79\xc6\x66\xd0\xf0\x79\x79\x19\x15\x07\x6a\x38\xda\ +\xd8\x44\xf3\x89\xa3\x54\x57\x7e\x81\x5a\x6f\x1b\x88\xdb\xd3\xca\ +\xa9\xe3\x8d\x28\x95\x4a\xaa\x3f\x3f\xeb\x15\xd6\x93\xf7\x64\x5e\ +\x05\xc8\x42\x1b\x91\x04\x44\xf2\xc7\xfb\x96\x0e\x0a\xd8\xff\xf0\ +\x3d\xfc\x64\xf9\x07\x83\x6d\xfa\x9a\x7e\xcd\xf8\xe8\x39\x68\x8e\ +\x3c\xc1\xdc\xe4\xd5\x00\x34\xec\xfe\x29\x59\x2b\xee\xe3\x6c\xc3\ +\xd7\x3c\x7d\x77\x36\xbd\xb5\xbf\x61\xd9\xf2\x5c\x8e\x2b\x3b\xd1\ +\xb5\x6c\x67\x72\x6c\x2a\x5a\x6c\x5c\xfc\xba\x8c\x5f\xad\xff\x83\ +\x5f\x0b\x80\x5f\x19\x50\xbd\xab\x24\x74\x62\x21\xe3\x24\x03\xf0\ +\xbd\xa7\xdf\xa0\xe8\x58\x02\x01\x5d\xef\x0f\xb6\x31\x1f\xef\x41\ +\x1a\x18\xc3\x3f\xf7\x99\x79\x6a\xdb\x0b\x00\xd8\x9b\x7a\x70\xd8\ +\x0d\x6c\xdc\x76\x85\x2a\xd5\x45\x02\x9a\x7b\x09\x9d\x58\x48\xf6\ +\x0f\x27\x61\xed\x57\xa3\xb7\x99\xf8\xef\x29\x2d\x77\x3d\xb0\x8e\ +\xea\x8a\xad\x3e\xc3\x83\x8f\x8f\x94\x4e\xab\xa9\xb8\x44\x74\xe6\ +\xf2\x81\x8e\xb6\x4e\xa2\x67\x9d\xa5\xf3\xf0\x2e\x9e\x8a\x38\x4e\ +\x8b\x79\x60\x32\x7d\xb9\xbf\x8d\xa9\x39\x6f\x32\xb9\xbb\x95\xd2\ +\xd3\x03\x0f\x27\x5f\x94\xb7\x33\x6e\xc2\x2a\x9e\x2a\x2e\xa4\xba\ +\xa2\x8c\x67\xde\x50\x12\xb3\xe0\x1e\x40\x64\xfb\xbe\xf9\xa8\xbe\ +\xda\x4d\x5b\xcd\xfb\xbc\x57\x67\x62\xda\x94\x68\xbf\xca\xc7\xa7\ +\x7d\x00\xe0\xe8\x2b\x8f\xf2\x6a\x9b\x1e\x71\xc2\x56\x0a\x0a\x76\ +\xf2\xee\xbb\xef\x41\xd2\x3b\x98\xba\x3f\xa1\xbc\xdb\xc8\xe1\xb7\ +\xce\xb0\x25\xa9\x9c\x17\x5a\x75\x48\xa7\xbe\xc6\x91\x99\x4b\xf8\ +\xd3\xba\x14\x2e\x55\xbe\xcc\x4b\xdf\xea\x08\x9b\x67\xe5\xb3\x9d\ +\xcb\xd8\x58\x77\x09\x80\xb8\x2b\x6f\xb1\x76\xf9\xe3\xec\xda\x7f\ +\x0c\x75\xdf\x23\x84\x4f\x4d\x25\x33\x2d\xd2\x6f\x78\x4f\x19\x10\ +\x00\xa6\x4d\x9b\x76\xf0\xc0\x81\x03\x59\xae\xab\xd0\xf5\xb4\x92\ +\x92\x12\xda\xdb\xdb\x59\xbb\x76\xad\x4f\x22\x64\x32\x19\x2a\x95\ +\x8a\xec\xec\xec\x6e\x83\xc1\x90\x06\xa8\x9d\xb1\x06\x33\x50\x5b\ +\x5b\x4b\x4b\x4b\xcb\x0d\x11\xa0\x54\x2a\x89\x8c\xf4\x3d\x03\xce\ +\x0d\xd5\x6b\x09\x19\x0c\x86\xdd\x9b\x36\x6d\x6a\x01\x30\x99\x4c\ +\x77\x28\x14\x8a\x94\xa8\xa8\xa8\x21\xeb\xcf\xdb\xd2\xe6\x6b\xbb\ +\xb4\xb4\x34\x9f\xe1\x9d\xe6\x75\x23\xeb\xea\xea\x7a\xa7\xab\xab\ +\xeb\x1d\x00\xa9\x54\xfa\xf7\x07\x1f\x7c\x30\x25\x3d\x3d\x7d\xf0\ +\x9b\xe5\xb1\x3c\x0b\x8d\xd4\x3b\x1c\x0e\x9f\xbf\xd8\x3a\x7f\xf2\ +\xe4\x49\x02\x03\x03\x6f\x3a\xb4\xd3\x87\x85\x85\xd1\xd4\xd4\x04\ +\xd0\x81\xcb\x4f\xac\xde\x6c\x62\x5c\x5c\x5c\x67\x55\x55\x95\x68\ +\xb5\x5a\xc5\x9b\x6d\x56\xab\x55\xac\xac\xac\x14\x63\x62\x62\x1c\ +\x12\x89\xe4\x79\x20\xcc\x15\xd6\xe3\xbf\x1a\x00\x39\xc0\x8b\xc0\ +\x34\xbc\x2c\xb5\x37\xd8\xae\x00\xfb\x81\x6d\x80\xd2\xf5\x0d\x6f\ +\x02\x00\x22\x81\x14\x40\x76\xfd\xb8\x7c\x36\x3d\xd0\xce\x40\x09\ +\x8d\xed\xd1\xf8\x66\xdb\xff\x00\x0b\x62\x0d\xcf\xef\xd6\x72\x27\ +\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x77\xc9\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x01\x2a\x00\x00\x01\x08\x08\x06\x00\x00\x00\xe8\x5e\xb9\x12\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\ +\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x20\x63\x48\x52\x4d\x00\x00\x7a\x26\x00\x00\x80\x84\x00\x00\xfa\ +\x00\x00\x00\x80\xe8\x00\x00\x75\x30\x00\x00\xea\x60\x00\x00\x3a\ +\x98\x00\x00\x17\x70\x9c\xba\x51\x3c\x00\x00\x00\x06\x62\x4b\x47\ +\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\x00\x09\x70\ +\x48\x59\x73\x00\x00\xd0\xcb\x00\x00\xd0\xcb\x01\x9f\x0e\xc0\x23\ +\x00\x00\x75\xde\x49\x44\x41\x54\x78\xda\xed\xbd\x67\xb4\x24\xd7\ +\x75\xdf\xfb\x3f\xd5\xf1\xe6\x1c\x26\x03\x18\x60\x30\x18\x0c\x66\ +\x10\x07\x83\x9c\x01\x82\x14\x49\x91\x22\x29\x3d\x2a\xd9\xb2\x6c\ +\x53\x92\x6d\xc9\xb2\xad\x67\x39\x2b\x58\x8e\x1f\xfc\xd6\xfb\x60\ +\xd9\x7e\x5e\x96\xc3\xf2\x32\x2d\x4a\xcc\x49\x94\x45\x52\x24\x45\ +\x10\x04\x88\x8c\xc1\x00\x83\xc9\x37\xe7\x7b\xfb\x76\xee\x3a\xef\ +\x43\xa5\x93\xab\xaa\xc3\x0d\x83\xda\xc0\x9d\xee\x3a\x67\x9f\x50\ +\xe9\xd7\xfb\xec\x93\x08\x12\x49\x64\x9b\x64\xf2\xf4\xa7\xbc\xaf\ +\x07\x00\xfc\x2c\x80\x4f\x02\xe8\x02\xf0\x1a\x80\x7f\x07\xe0\x5b\ +\x00\x30\xfb\xdc\xef\x6f\x77\x55\x13\xd9\x66\x21\xdb\x5d\x81\x44\ +\xde\x9b\xc2\x40\xea\x24\x80\x7f\x09\xe0\x09\x00\x19\x46\xe5\x55\ +\x00\x7f\x1d\xc0\x73\x40\x02\xab\xf7\xba\x58\xdb\x5d\x81\x44\xde\ +\x7b\xe2\x42\x8a\x00\x78\x0a\xc0\x1f\x00\x78\x1f\x78\x48\x01\xc0\ +\x09\x38\xa0\xca\xc4\xc9\x3b\x91\x6b\x53\x12\x50\x25\xb2\xa5\xe2\ +\x42\x2a\x03\xe0\x67\x00\xfc\x27\x00\xb7\x1b\xd4\x6f\x07\x30\xb0\ +\xdd\x75\x4e\x64\xfb\x25\x01\x55\x22\x5b\x26\x2e\xa4\xfa\x00\xfc\ +\x3a\x80\xff\x07\xc0\xa1\x90\x24\x3d\xee\x5f\x22\xef\x71\x49\x6f\ +\x77\x05\x12\x79\x6f\x88\x0b\xa9\x71\x00\xff\x08\xc0\x2f\xc2\x71\ +\x9a\x27\x92\x48\x24\x49\x40\x95\x48\x47\x85\x71\x9a\xdf\x04\xc7\ +\x69\xfe\x21\x24\xcf\x5d\x22\x31\x25\x79\x60\x12\xe9\x98\x30\x90\ +\x3a\x0d\xe0\xdf\x02\x78\x60\xbb\xeb\x94\xc8\xee\x94\xc4\x47\x95\ +\x48\x47\xc4\x85\x94\x05\xe0\xc3\x00\xfe\x0b\x12\x48\x25\xd2\x82\ +\x24\xa0\x4a\xa4\xed\xe2\x42\x2a\x0f\xe0\xaf\x01\xf8\x7d\x00\x47\ +\xb7\xbb\x4e\x89\xec\x6e\x49\x9a\x7e\x89\xb4\x55\x5c\x48\x0d\x02\ +\xf8\x3b\x00\x7e\x15\x4e\x2f\x5f\x22\x89\xb4\x24\x09\xa8\x12\x69\ +\x8b\x30\xfe\xa8\xfd\x00\x7e\x1b\xc0\x4f\x03\xc8\x9a\xd2\x50\x00\ +\x29\x2b\x05\xdb\x6e\x6c\x77\xf5\x13\xd9\xe1\x92\x34\xfd\x12\x69\ +\x59\x18\x48\xdd\x06\x67\x10\xe7\xcf\xc3\x00\x29\x4a\x29\x52\xa9\ +\x14\xee\xb9\xf3\x38\xf6\xee\xdf\x0f\x4a\xe9\x76\x9f\x42\x22\x3b\ +\x5c\x12\x50\x25\xd2\x92\x30\xd3\x61\x1e\x47\x30\x1d\x46\xfb\x5c\ +\x51\x4a\xd1\xd5\x95\xc7\x47\xdf\xff\x20\xfe\xd2\xc7\x9f\x42\x7f\ +\x5f\x0f\x12\x4e\x25\x12\x26\x49\xd3\x2f\x91\xa6\xc5\x85\x54\x1a\ +\xc0\xc7\x01\xfc\x73\x00\xd7\x9b\xf4\x6d\x9b\x62\x68\xb0\x0f\x3f\ +\xf5\xe1\x47\xf1\xf4\xc3\xb7\x63\xa3\x54\x4f\xac\xa9\x44\x22\x49\ +\x02\xaa\x44\x9a\x12\x17\x52\x3d\x00\x7e\x09\xc0\xdf\x07\x30\x62\ +\xd2\xb7\x6d\x8a\x7d\x7b\xc6\xf0\xf3\x9f\x78\x0a\xa7\x6f\xbf\x09\ +\x29\xcb\x02\xa5\xb5\xed\x3e\x8d\x44\x76\x89\x24\xa0\x4a\x24\xb6\ +\xb8\x90\x1a\x05\xf0\x0f\xe1\x0c\x41\xe8\x36\xe9\x53\x4a\x71\xcb\ +\x91\x43\xf8\x4b\x9f\x78\x0a\xc7\x6e\x3a\x00\x50\x8a\xc4\x8e\x4a\ +\x24\x8e\x24\xa0\x4a\x24\xb2\x30\x4e\xf3\xc3\x00\x7e\x0f\xc0\x47\ +\x61\x78\x86\x28\xa5\x20\xc4\xc2\xe9\xbb\x8e\xe1\xe7\x3e\xf6\x04\ +\x0e\xec\x19\x86\x4d\x69\xb2\x08\x5a\x22\xb1\x25\x01\x55\x22\x91\ +\x84\x81\xd4\x3d\x70\xa6\xc3\x3c\x6c\xd2\xa7\x94\x22\x93\xc9\xe0\ +\x89\x87\xee\xc4\x4f\x7d\xe8\x61\x8c\x0c\xf4\xc0\xb6\x29\x40\x00\ +\x0a\xe2\xc0\xca\x33\xab\x12\x72\x25\x12\x22\x09\xa8\x12\x09\x15\ +\x66\x3a\xcc\xb3\x00\xfe\x35\x80\x63\x26\x7d\x9b\x52\xf4\xf6\x74\ +\xe1\xc3\xcf\x3c\x80\x0f\x3d\x75\x0a\xdd\xf9\x2c\x6c\xcf\x69\x4e\ +\x01\x10\xa7\xe9\x97\x34\xff\x12\x89\x2a\x09\xa8\x12\x31\x8a\x0b\ +\xa9\x1c\x9c\x35\xcd\x7f\x0b\xc0\x5e\x93\xbe\x6d\x53\x8c\x8e\x0c\ +\xe2\x93\x1f\x79\x1c\x8f\x9c\xbe\x15\x99\x74\x4a\x6e\xee\x51\xff\ +\x9f\x44\x12\x89\x24\x09\xa8\x12\xd1\x8a\x0b\xa9\x01\x00\xbf\x06\ +\x67\xb1\xbb\x7e\x93\xbe\x4d\x29\x0e\x1d\x98\xc4\xcf\x7f\xfc\x29\ +\xdc\x75\xfc\x06\x10\x02\x7f\xf8\x01\x85\xba\x85\x97\xe0\x2a\x91\ +\x28\x92\x80\x2a\x11\x49\x18\x7f\xd4\x5e\x00\xff\x0c\xc0\xcf\xc1\ +\xb1\xaa\xb4\x42\x29\x70\xe2\x96\xc3\xf8\xb9\x8f\x3f\x89\x23\xd7\ +\xed\x01\xa5\xd4\x19\xc8\xc9\xd0\x29\x71\x49\x25\xd2\xac\x24\xa0\ +\x4a\x84\x13\x06\x52\xc7\xe0\xf8\xa3\x9e\x45\xc8\x48\x73\x2b\x95\ +\xc2\x83\xf7\x1c\xc7\x4f\x7f\xe4\x31\xec\x19\x1b\xf4\xfd\x51\x3a\ +\x87\xb9\x17\x9b\x58\x53\x89\x44\x95\x04\x54\x89\xf8\xc2\x40\xea\ +\x61\x38\x3d\x7b\xf7\x98\xf4\x29\xa5\xc8\xe5\xb2\x78\xe6\xd1\x7b\ +\xf0\xb1\x0f\x3c\x80\xfe\xde\x2e\xd8\xd4\x86\x47\x25\xce\xa0\x52\ +\xb5\xfd\x12\x5f\x55\x22\x11\x25\x01\x55\x22\x00\xb8\xe9\x30\x1f\ +\x85\x33\x46\xea\xb0\x49\xdf\xb6\x29\x06\xfa\x7b\xf1\xd1\x0f\x3c\ +\x84\xf7\x3d\x72\x07\xf2\xb9\x0c\x33\x1d\x26\xa0\x12\x67\x50\x49\ +\xd6\x55\x02\xa9\x44\xa2\x49\x02\xaa\x44\x3c\x48\x75\xc3\x19\x65\ +\xfe\x0f\xe1\x8c\x3a\xd7\x8a\x6d\x53\x4c\x4e\x8c\xe0\xa7\x3f\xfa\ +\x04\xee\xbf\xf3\x66\xa4\x52\x04\xb6\x4d\x41\xe4\xae\x3d\x18\x81\ +\x95\x48\x22\x11\x25\x01\xd5\x7b\x58\x98\xa6\xde\x30\x80\xdf\x04\ +\xf0\xcb\x88\x30\x1d\xe6\xc6\x1b\xf6\xe3\xe7\x3f\xf6\x14\x8e\xdf\ +\x7c\x10\x00\xf5\x57\x3f\xf0\x3e\x23\x03\x2b\x91\x44\x22\x4a\x02\ +\xaa\xf7\xa8\x30\x90\xba\x0e\x4e\x53\xef\xe3\x88\xf0\x3c\xdc\x79\ +\xe2\x66\xfc\xec\x4f\x3c\x81\xeb\xf6\x8d\xf1\x2b\x1f\xb0\xce\x72\ +\xea\xc0\xaa\xd1\xa0\xb0\x29\x45\x26\x6d\x41\x05\xac\xc4\x45\x95\ +\x48\x54\x49\x40\xf5\x1e\x14\x06\x52\x77\xc2\x71\x9a\x3f\x0a\x83\ +\x91\x43\x29\x45\x3a\x9d\xc6\x23\xf7\x9d\xc4\x4f\x7e\xe8\x11\x8c\ +\x0e\xf5\xf1\x3d\x7b\x00\xe7\x2c\x27\x00\x2a\xd5\x06\xa6\x16\x0b\ +\xe8\xef\xc9\x61\x6c\x20\xcf\xf0\x28\x21\x53\x22\xf1\x25\x01\xd5\ +\x7b\x4c\x98\x85\xee\x9e\x81\x33\xfc\xe0\x36\x93\x3e\xa5\x14\xdd\ +\x5d\x79\xbc\xff\xc9\xd3\xf8\xd0\x53\xf7\xa2\xa7\x3b\xc7\x8d\x34\ +\x57\xf5\xec\x6d\x96\x6b\xb8\x3c\xbf\x81\x8d\x62\x0d\x7d\xdd\x59\ +\x0d\x9a\xa8\xf7\x7f\x22\x89\x84\x4a\x02\xaa\xf7\x90\xb8\x90\xca\ +\xc2\x59\xcf\xfc\xb7\xe1\xac\x6f\xae\x15\x9b\x52\x0c\x0f\xf6\xe3\ +\xe3\x1f\x7c\x14\x8f\xdd\x77\x1c\xd9\x4c\x9a\x19\x69\xee\xe0\x89\ +\x80\x6f\xd4\xad\x15\x2a\xb8\x3c\xb7\x8e\x62\xa5\x0e\xcb\x0a\x8c\ +\x34\xae\x95\x98\x38\xa8\x12\x89\x29\x09\xa8\xde\x03\xc2\x34\xf5\ +\xfa\xe0\xec\x0c\xf3\x77\xe1\x4c\x8d\xd1\x0a\xa5\x14\x07\xf6\x8e\ +\xe3\xa7\x3f\xfa\x24\xee\xba\xed\x30\x2c\x66\x3a\x0c\xdb\x75\xe7\ +\xad\x84\x40\x29\xb0\xb0\x5e\xc4\xd5\x85\x02\xaa\xb5\x86\x1f\xa6\ +\x9a\x7d\xcc\xce\x4f\x4e\x24\x91\x28\x92\x80\xea\x1a\x17\x06\x52\ +\x93\x00\xfe\x29\x80\xbf\x8c\x08\xd3\x61\x6e\x39\x72\x3d\x7e\xe6\ +\x27\x9e\xc0\xcd\x37\xec\x75\xa6\xc3\x40\x37\x78\x93\xa2\x61\x53\ +\xcc\x2e\x17\x31\xb3\x54\x40\xbd\xe1\x0c\x53\xf0\x54\xa8\x32\x0d\ +\xe0\xae\xf7\x92\x48\x22\x91\x24\x01\xd5\x35\x2c\x0c\xa4\x6e\x06\ +\xf0\xaf\x00\xfc\x18\x80\x94\x4e\x9f\x52\x20\x95\x22\xb8\xe7\x8e\ +\x63\xf8\xe4\x8f\x3f\x86\x7d\x13\x43\xc1\xf2\x2c\x90\xc7\x42\x11\ +\x02\x54\xeb\x36\xa6\x16\x36\x30\xbf\x5a\x02\x37\xde\x13\x00\x25\ +\x7c\xba\x04\x4c\x89\x34\x2b\x09\xa8\xae\x51\x61\x20\xf5\x00\x9c\ +\x9e\xbd\xd3\x26\x7d\x4a\x29\xb2\xd9\x2c\x9e\x78\xe8\x2e\x7c\xf4\ +\xfd\x0f\x60\xa8\xaf\xdb\x5f\xe8\x4e\xd2\x85\x13\x5c\xac\xd4\x71\ +\x79\x6e\x03\xab\x85\xb2\x14\x0f\x10\x10\xa6\xd9\xa7\x1a\x3f\x95\ +\x2c\x48\x9c\x48\x54\x49\x40\x75\x0d\x8a\x0b\xa9\x14\x80\x0f\x03\ +\xf8\x97\x00\x6e\x32\xe9\x53\x4a\xd1\xd7\xdb\x83\x0f\x3e\x73\x3f\ +\xde\xf7\xc8\x5d\xe8\x62\x16\xba\x23\x9a\xf5\x59\xd6\x8b\x55\x5c\ +\x9e\x5b\xc7\x46\xa9\xc6\x45\x13\xa6\x49\x48\xdd\x7f\x59\x1c\x25\ +\x68\x4a\xa4\x19\x49\x40\x75\x8d\x89\x0b\xa9\x3c\x80\x5f\x04\xf0\ +\x8f\x01\x8c\x9b\xf4\x29\xa5\x18\x1b\x1d\xc6\x4f\x7e\xf8\x51\x3c\ +\x70\xd7\x51\xa4\xd3\x29\x50\x71\x62\xb1\x60\x0e\x2d\xaf\x97\x70\ +\x79\x6e\x03\xa5\x6a\x83\xf3\x47\x39\xf9\xb9\xaa\x02\xdc\x04\x2f\ +\x57\x32\x32\x3d\x91\x58\x92\x80\xea\x1a\x11\xa6\xa9\x37\x04\xe0\ +\x37\x00\xfc\x4d\x38\xdb\x59\x69\x85\x52\x8a\xeb\x0f\xed\xc3\x27\ +\x3f\xf2\x38\x4e\x1c\x3d\xc4\x2d\x74\xc7\x36\xd6\x3c\xc4\xd8\x36\ +\xc5\xdc\x4a\x11\x53\x0b\x1b\xa8\x35\x6c\xd7\x57\xe5\x02\x8d\x19\ +\xec\xe9\xe4\xcd\xe4\x22\xe5\xe9\x76\x06\x26\xe3\xa8\x12\x89\x28\ +\x09\xa8\xae\x01\x61\x20\x75\x10\xc0\xef\x02\xf8\x29\x00\x99\xb0\ +\x74\x27\x8f\xdf\x84\x4f\xfe\xf8\xe3\xb8\xfe\xc0\x78\xb0\xd0\x1d\ +\x54\x73\xf5\x08\x6a\x0d\x1b\x53\x8b\x05\xcc\x2d\x6f\xa2\x61\xb3\ +\x3d\x7b\xbc\xe7\x9c\x32\x69\xb9\x09\xc8\xca\x95\x13\x12\x52\x25\ +\x12\x4d\x12\x50\xed\x72\x61\x20\x75\x12\x8e\xd3\xfc\x09\x44\x98\ +\x0e\xf3\xc0\xa9\xdb\xf0\xf1\x1f\x7b\x18\xe3\x23\xfd\xd2\x6e\xc5\ +\xde\x5c\x3d\xb8\x19\x95\xab\x75\x5c\x9e\x5f\xc7\xd2\x5a\x59\xea\ +\xc1\x0b\x2c\x29\xd6\x84\xe2\xa1\xc5\xe5\xee\x1f\x24\x8d\xbf\x44\ +\xa2\x4b\x02\xaa\x5d\x2c\xcc\x74\x98\x27\xe0\x40\xea\xa4\x49\x9f\ +\x52\x8a\xae\xae\x3c\x9e\x79\xf4\x14\x7e\xec\xa9\x53\xe8\xef\xe9\ +\xd2\x6e\xa9\xee\xc1\x6a\xa3\x54\xc3\xa5\xd9\x75\xac\x6d\x56\x02\ +\xb4\x10\xc2\x01\xcb\x1f\x2f\xa5\x80\x96\xdc\xe8\xf3\x74\x12\x63\ +\x2a\x91\xe8\x92\x80\x6a\x97\x8a\x0b\xa9\x0c\x9c\x66\xde\xef\xc2\ +\x69\xf6\x69\x85\x52\x8a\xc1\xc1\x7e\x7c\xe4\xd9\x87\xf0\xd8\x7d\ +\x27\x90\xcb\xa5\xe5\x89\xc5\x82\x2c\x6f\x94\x71\x69\x76\x1d\xc5\ +\x72\xdd\x6f\xea\x01\x00\x11\xda\x88\x41\xb8\x5b\x16\x07\x2c\xed\ +\x4c\xbf\x44\x12\x89\x2c\x09\xa8\x76\xa1\xb8\x90\xea\x05\xf0\x37\ +\xe0\x38\xce\x87\x4c\xfa\x94\x52\xec\xdd\x33\x86\x9f\xfc\xf0\xe3\ +\xb8\xe7\xc4\x61\xa4\x2c\x0b\xd4\x0e\xa6\xc3\x88\xee\x23\x4a\x29\ +\xe6\x57\x4b\xb8\x32\xbf\x81\x8a\xd7\xb3\xc7\x34\x07\xc3\x80\xc5\ +\x59\x59\x5c\x84\x58\xb1\xed\xbe\x92\x89\xec\x16\x49\x40\xb5\xcb\ +\xc4\x85\xd4\x38\x9c\xa1\x07\xbf\x08\x67\x28\x82\x51\x6e\xbe\xe9\ +\x10\x7e\xea\xc7\x1f\xc7\xd1\x1b\xf6\x81\x80\x32\xcd\x3d\x61\x6c\ +\x01\x80\x86\x4d\x31\xbd\x58\xc0\xd4\x62\x01\x0d\xdb\x06\x61\x3c\ +\xeb\xa2\xb3\x5d\x02\x16\x13\xe9\x6f\xe0\xa0\x75\xa6\x27\x92\x48\ +\x74\x49\x40\xb5\x4b\x84\x71\x9a\xdf\x04\x67\x10\xe7\x87\x11\x3a\ +\x1d\xc6\xc2\x5d\x27\x8f\xe2\x13\x1f\x7a\x04\xfb\x27\x87\xfd\x39\ +\x7b\x80\xb0\xde\x26\x25\x20\x04\xa8\xd4\x1a\xb8\x32\xbf\x81\xf9\ +\x95\xa2\xbf\x94\x0b\x25\xfe\x06\xec\x5c\xde\x80\x0c\x2c\x40\x84\ +\x56\x10\x2f\x5a\x5b\x62\xba\x44\x12\x31\x49\x02\xaa\x5d\x20\x0c\ +\xa4\x4e\xc3\x71\x9a\x3f\x60\xd2\xf7\x76\x87\x79\xe4\xbe\x3b\xf0\ +\xe3\xef\xbb\x0f\xc3\x03\xbd\x4e\x53\x4f\xd8\xb2\x8a\xb1\x95\xb0\ +\x59\xae\xe3\xe2\xec\x3a\x56\x36\xca\xbc\x0e\x75\x60\x05\x40\x0b\ +\x2c\x40\x07\x2d\x31\x84\xd5\x49\x86\x26\x24\x12\x5d\x12\x50\xed\ +\x70\x71\x21\x65\x01\xf8\x20\x1c\x4b\xea\xa8\x49\x9f\x52\x8a\xde\ +\xde\x6e\xbc\xff\xc9\xfb\xf0\xcc\xc3\x77\xa2\xbb\x2b\xeb\x8e\x34\ +\x87\xe3\xe5\x56\x6c\x08\xba\xbe\x59\xc1\x85\x99\x75\x14\x4a\x55\ +\xf8\x38\x62\xc1\xe3\xfb\x9c\x28\xd3\xb3\x17\x05\x5a\x34\x80\x92\ +\x24\x44\x1b\x93\x48\x22\xa2\x24\xa0\xda\xc1\xe2\x42\x2a\x07\xe0\ +\x17\x00\xfc\x13\x38\x4b\xb5\x68\xc5\x99\x0e\x33\x84\x8f\x7e\xe0\ +\x11\xdc\x7f\xd7\x51\x64\x33\x29\xdf\x1f\xe5\x63\x81\x19\x42\x4e\ +\x01\x2c\xad\x96\x70\x71\x76\x1d\xe5\x6a\xdd\x05\x8c\x3b\xd9\x45\ +\x18\x6a\x2e\xf7\xec\xa9\xad\x2c\xa7\x1e\xec\x01\x34\x34\xa2\xa6\ +\xc8\x44\x12\xe1\x24\x01\xd5\x0e\x15\x17\x52\x83\x70\x16\xb9\xfb\ +\x55\x38\xbd\x7c\x5a\xa1\x94\xe2\xba\x83\x7b\xf1\x89\x0f\x3d\x86\ +\x93\xb7\x1c\xe2\x17\xba\x83\x3c\x21\xc6\xb6\x29\x66\x96\x36\x71\ +\x65\x3e\x98\x0e\xc3\xf7\xec\x79\x93\x92\xa3\x01\xcb\x51\x11\xa1\ +\x15\x0c\x50\x90\x2c\x2e\x4a\x92\xcd\x1d\x12\x89\x2c\x09\xa8\x76\ +\xa0\xb8\x90\xda\x0f\xe0\x77\x00\x7c\x12\xce\xf2\xc1\x5a\x21\x00\ +\x6e\xbb\xf5\x26\x7c\xfc\x83\x8f\xe0\xf0\xc1\x09\x84\x2d\xa0\x52\ +\xab\x37\x70\x65\x61\x03\x33\x4b\x45\x69\x3f\x3e\xd9\x51\x6e\x06\ +\x16\xe7\x1c\x27\x9c\x87\x4a\xbb\x69\x3b\x15\x56\xd5\x4b\x3a\x02\ +\x13\x09\x93\x04\x54\x3b\x48\x18\xa7\xf9\x6d\x00\xfe\x0d\x80\xa7\ +\xe0\xf8\xa7\x94\x42\x29\x45\x26\x93\xc6\xe9\xbb\x8e\xe3\x23\xef\ +\x7f\x10\x93\xa3\x03\x9c\x15\x25\xae\x60\x40\x00\x94\xaa\x0d\x5c\ +\x9c\x5d\xc3\xe2\x6a\x29\x58\x85\xd3\x85\x50\x2c\x60\x79\x19\x42\ +\x0d\x2d\x80\x72\xf3\xfe\x12\x49\xa4\x15\x49\x40\xb5\x43\x84\x99\ +\x0e\xf3\x18\x1c\x48\xdd\x69\xd2\xf7\x76\x87\x79\xe2\xe1\xbb\xf1\ +\xfe\x27\x4e\x61\xa0\xb7\xcb\x38\x67\x0f\x00\xd6\x8b\x35\x9c\x9f\ +\x5e\x73\xa6\xc3\x30\x90\xf1\x2c\x1f\xea\x0e\x53\x10\xf3\x00\x64\ +\x60\x01\x21\xd0\x02\xb8\x85\xf3\x12\x49\xa4\x15\x49\x40\xb5\x03\ +\xc4\x85\x54\x1a\xc0\x27\x00\xfc\x73\x38\x9b\x82\x6a\xc5\x9b\x0e\ +\xf3\xc1\xa7\x1f\xc0\xa3\xa7\x8f\x23\x9f\xcf\x18\xe7\xec\x01\xce\ +\x74\x98\x0b\x33\x6b\xd8\x2c\xd7\x9c\x46\x99\x6a\xa4\xb9\xbf\xeb\ +\xb1\xde\xc2\x62\xc3\xa3\x40\x4b\xe5\x32\x4f\xc6\x51\x25\x12\x57\ +\x12\x50\x6d\xb3\xb8\x90\xea\x01\xf0\x4b\x70\xb6\x55\x1f\x36\xe9\ +\x7b\xd3\x61\x7e\xe2\x03\x8f\xe0\xee\xdb\x6e\x44\x3a\x4d\xb8\x31\ +\x52\xf2\xb0\x01\x67\xe3\x85\x4b\x73\xeb\xce\xee\x30\xc6\xe6\x9d\ +\x97\x47\x60\x61\xb1\xf1\x62\x3a\x3e\x2d\x13\x48\x85\x9a\x88\xbb\ +\xd0\xa8\x83\x13\x49\x44\x2b\x09\xa8\xb6\x51\x5c\x48\x8d\x01\xf8\ +\x07\x00\xfe\x1a\x80\xee\xb0\x34\x37\xdf\x78\x08\x1f\xfb\xe0\x23\ +\x38\x7a\x78\x5f\xb0\x25\x15\xc0\x0c\x32\x0f\x46\x92\xd7\x1b\x36\ +\xae\x2e\x14\x70\x75\x61\xc3\x59\x43\x0a\x5e\x73\x50\x18\x9f\xde\ +\x24\xb0\xd8\xb4\x72\x3c\x75\xf6\xfe\xd3\xee\x8d\x95\x60\x2a\x91\ +\xe8\x92\x80\x6a\x1b\x84\x71\x9a\x1f\x06\xf0\x2f\x00\x7c\x04\x86\ +\x7b\x41\x29\x45\x2a\x95\xc2\x9d\x27\x6e\xc6\x47\x3e\xf0\x10\x0e\ +\xee\x19\xd1\x36\xf5\xbc\xe1\xe4\x95\x5a\x03\x17\x67\x36\x30\xb7\ +\xb2\xe9\xf7\xb2\x05\xce\x73\x47\x35\x2a\xb0\xbc\xed\x46\x75\xcd\ +\xc2\xa0\x9e\xfc\x71\xd0\xb1\xa7\x19\xf0\x99\x0c\x4e\x4f\x24\xa2\ +\x24\xa0\xda\x62\x61\x20\x75\x0a\xce\x74\x98\x87\x4c\xfa\xde\x74\ +\x98\x87\x4e\xdf\x8e\x1f\x7b\xea\x34\x46\x87\x7a\x99\xdd\x8a\x1d\ +\x11\x99\x51\x28\x39\x4e\xf3\x65\x77\x3a\x0c\x61\x96\x48\x60\x47\ +\x19\x84\x01\xcb\x89\x83\x50\x16\x65\x74\xf4\xd0\x62\xd3\x50\xa8\ +\xea\x9a\x78\xda\x13\x89\x2e\x09\xa8\xb6\x50\x98\xe9\x30\xef\x87\ +\xb3\xcf\xde\x31\x93\xbe\xb7\x3b\xcc\x33\x8f\xdf\x8b\x27\x1f\xbc\ +\x03\xbd\xdd\x39\x69\xce\x1e\xc0\xcf\xdb\x5b\x29\x54\xf0\xee\xd4\ +\x1a\x0a\xa5\x2a\x37\xbe\x89\x08\xdd\x72\x2a\x60\x01\xec\x98\xaa\ +\x30\x2b\x4b\x0d\x2d\x4f\x57\xec\x71\x64\xeb\xca\xa7\x4e\x24\x91\ +\x70\x49\x40\xb5\x45\xc2\x4c\x87\xf9\x39\x00\xff\x0c\xc0\x5e\x93\ +\xbe\x37\x1d\xe6\xc3\xcf\x3e\x84\xd3\x77\xdc\x8c\x5c\x36\x1d\x34\ +\xf7\x14\xa6\x94\x4d\x81\x85\xd5\x22\x2e\xcc\xac\xa1\x54\x69\x08\ +\x0b\xdd\x29\xa6\xbc\x28\x80\xe5\x94\xeb\x1e\xc7\xb0\xb2\xbc\x23\ +\x69\x63\x07\xca\x6c\xeb\x9e\x48\x22\x2d\x48\x02\xaa\x2d\x10\x17\ +\x52\x03\x00\xfe\xb6\xfb\xd7\x6f\xd2\xf7\xa6\xc3\x7c\xf4\x03\x8f\ +\xe0\xb6\xa3\x07\x91\xb6\x88\x0b\x29\xb7\xa9\xe5\x2b\x3a\x07\x0d\ +\x9b\x62\x6a\xa1\x80\xcb\x73\xeb\xa8\x37\xf8\x35\xa4\x3c\x35\x7f\ +\x62\x71\x4c\x60\x99\xac\x2c\x40\x18\xc2\x20\x9c\x07\xbf\x94\x8c\ +\xb8\x41\x60\xe2\xa0\x4a\x24\xba\x24\xa0\xea\xb0\xb8\x90\xda\x0b\ +\xe0\xb7\x00\xfc\x2c\x1c\xab\x4a\x29\x94\x02\x96\x45\x70\xfc\x96\ +\xc3\xf8\xe8\x07\x1e\xc6\x0d\x07\xc6\x39\xcb\x28\x70\x4d\x3b\x98\ +\x21\x00\x2a\x35\x1b\x97\x66\xd7\x30\xbd\xb4\x19\xac\x21\xe5\x4d\ +\x44\x6e\x06\x58\x00\x33\xd4\x21\xa8\x97\x17\x6b\x82\x96\x53\x26\ +\x5f\x9e\xf3\xc7\xaf\xa2\x10\xe0\x36\x12\xac\x12\x9c\x25\x92\x80\ +\xaa\x53\xc2\x38\xcd\x6f\x85\xe3\x8f\x7a\x16\x11\xa6\xc3\xdc\x7b\ +\xd7\xad\xf8\xd0\xd3\x0f\x60\x62\x6c\x80\xdf\xf8\x4e\xb1\x85\xd5\ +\x66\xa5\x8e\xf3\xd3\x6b\x58\x58\x2d\x06\x31\x84\x05\x4c\x04\x60\ +\xa9\x96\x6e\xd1\x58\x59\x4e\x9e\x41\x2e\x7c\xb6\x6a\x70\x29\xcf\ +\xd5\xfd\x57\x70\x6d\xa9\x24\x07\xe0\x38\x80\xe1\xc9\xd3\x9f\x8a\ +\x3a\x21\xa7\xd5\x89\x3b\xcd\xa4\x6f\xc7\x64\xa1\xb8\x79\x88\xfa\ +\xb4\x0d\x79\x00\x40\x05\xc0\x55\x00\x2b\x00\x1a\xb3\xcf\xfd\x7e\ +\x1b\x4e\xad\x75\x49\x40\xd5\x01\x61\xa6\xc3\x3c\x0c\x67\x3a\xcc\ +\x3d\x26\x7d\x4a\x29\xba\xbb\xf3\x78\xec\xc1\xbb\xf0\xcc\x23\x77\ +\x63\xb0\xbf\x5b\xee\xd9\x13\x1e\xc3\xd5\xcd\x0a\xde\x9d\x5a\xc5\ +\xda\x66\x15\x00\xdf\x1c\x94\x9b\x71\x06\x60\x79\x79\x23\x9e\x95\ +\xe5\xe4\x1b\x7c\x27\x44\x43\x28\x2d\xb8\x48\x48\x3c\x00\x60\x1f\ +\x80\xff\x06\xa0\xd1\xca\xfd\x88\x29\xbb\x61\x86\x62\x27\xeb\x68\ +\x03\xb8\x04\xe0\xcb\x00\xfe\xdf\xc9\xd3\x9f\x5a\xde\x09\xb0\x4a\ +\x40\xd5\x66\x61\xa6\xc3\xfc\x04\x9c\xe9\x30\x87\x4d\xfa\x94\x52\ +\x0c\x0d\xf6\xe3\xfd\x4f\xdd\x8f\x07\x4f\xdd\x8a\x9e\x7c\x56\x39\ +\x46\xca\x5b\x6d\x13\x00\x16\xd6\x4a\x78\x77\x7a\x15\xc5\x92\xbb\ +\x86\x14\x21\xfc\xcf\xa9\xd6\xef\x14\x0f\x58\x4e\x5a\x3d\xb4\xf8\ +\xbc\xe5\x73\x6b\xc3\xdb\x94\x02\x30\xd2\x7a\x36\x89\xc4\x94\x71\ +\x00\xb7\xc3\x59\xb5\xe3\xb7\x27\x4f\x7f\xaa\xb2\xdd\xb0\x4a\x40\ +\xd5\x46\x71\x21\xd5\x0d\xe0\xaf\xc3\x19\x6d\x3e\x6a\xd2\xa7\x94\ +\x62\xdf\x9e\x71\x7c\xf8\xd9\x87\x70\xc7\xf1\xc3\xc8\xa6\x2d\xdf\ +\xcf\xa4\x92\x06\xa5\x98\x59\xdc\xc4\xc5\xd9\x75\x54\x6a\x41\xcf\ +\x9e\xb7\x4e\x39\x25\x0a\x67\x3b\xe2\x03\x4b\xb7\x74\x0b\x51\x58\ +\x41\xaa\x15\x12\xd8\xb9\x7c\xde\x5a\x54\xf2\x7a\x54\x52\x56\x89\ +\xec\x2c\xc9\xc0\x99\x2d\xf1\x39\x00\x3f\xdc\xee\xca\x24\xa0\x6a\ +\x93\xb8\x90\x1a\x05\xf0\xf7\x01\x7c\x0a\xce\xfc\x3d\xa3\xdc\x7c\ +\xe3\x21\xfc\xf8\xfb\x1f\xc2\xcd\x37\xec\x73\x17\xba\x73\xc2\x85\ +\x15\x83\x41\x00\xd4\x1a\x36\x2e\xcd\xad\xe3\xea\x7c\xc1\x9f\x0e\ +\xe3\x99\x51\x81\x45\xd4\x1e\x60\x31\x49\x40\x38\x28\x99\xa1\x15\ +\xe8\x31\xe5\xa8\xe2\xbd\x7a\x53\x75\xd9\x89\xec\x18\x19\x86\xd3\ +\x22\x48\x40\xb5\xdb\x85\x71\x9a\x5f\x0f\xa7\xa9\xf7\x31\x38\xbf\ +\x46\x4a\xf1\xa6\xc3\xdc\x71\xe2\x66\x7c\xe8\x99\x07\x70\x60\xcf\ +\xb0\x30\x5a\x1b\xce\xea\x97\x6e\xa0\x45\x80\x52\xa5\x81\xf3\xd3\ +\xab\x98\x75\xa7\xc3\x38\x06\x89\x0b\x23\xc6\xd9\x1e\x17\x58\x5e\ +\x1c\xbf\x86\x95\xc6\xca\x72\x0f\x02\x6b\x89\x0a\x4d\x40\x79\x9c\ +\x42\x14\x6b\x29\x9d\xcd\x03\xc4\x8a\xa8\x9d\xc8\x36\x48\xe8\xfc\ +\xd3\xad\x90\x04\x54\x2d\x08\x03\xa9\xbb\x01\xfc\x6b\x00\x8f\xc2\ +\xe0\x9a\xa1\x94\x22\x9f\xcb\xe2\x81\xd3\x27\xf1\xbe\xc7\x4e\x61\ +\x74\xa8\x0f\xec\xba\x03\x1c\xb0\xdc\xb5\xa1\xd6\x37\xab\x38\x37\ +\xb5\x8a\xe5\x75\x66\x77\x18\xc2\x8c\x0a\x67\x81\xa5\xd9\x6f\x4f\ +\x07\x2c\x2f\x2f\x36\xce\x04\x2d\x21\xa9\x11\x5c\x5e\x9e\x34\x04\ +\x40\xb9\xde\x01\xe4\x7a\xfa\x51\x2d\xac\xea\xe7\xe2\x24\xf2\x9e\ +\x97\x04\x54\x4d\x0a\xd3\xb3\xf7\x3e\x38\x90\x3a\x6e\xd2\xa7\x94\ +\xa2\xbf\xaf\x07\x4f\x3d\x7a\x0a\x8f\xdc\x77\x12\x7d\x3d\x79\x50\ +\x4a\xa5\x71\x47\x2c\xac\x96\xd6\xca\x78\x67\x6a\x15\x85\x62\x0d\ +\x20\xd0\xf4\xec\x31\xc0\xf2\x58\x11\x15\x58\x8c\x92\x7a\xfc\x94\ +\x19\x5a\x6c\x19\xde\x01\x51\xc4\x39\xa3\x2c\x78\x60\x79\x96\x1c\ +\x49\x67\xd1\x37\x71\x08\xeb\x14\xa8\x95\x0b\xb0\x1b\x0d\xa8\xad\ +\xab\x04\x62\xed\x16\xef\x8a\xee\x86\xdf\x87\x04\x54\x4d\x88\x0b\ +\xa9\x2c\x80\x9f\x81\x33\x90\x73\xbf\x49\x9f\x52\x8a\xf1\xb1\x61\ +\xfc\xd8\xd3\x0f\xe0\x9e\x93\x47\x90\xcf\x05\xd3\x61\xc4\x39\x71\ +\x9e\xf3\x79\x76\x79\x13\xe7\xa7\x57\x51\xaa\x34\x60\xb9\x5e\x73\ +\x95\xef\x27\x0e\xb0\xe0\x0d\x08\x05\xfc\x42\x95\xd0\x52\xf6\xea\ +\x09\xa0\x89\x00\xae\x60\x1e\xa1\x3c\xb0\x93\x82\x22\x9b\x49\xe1\ +\xd6\xeb\x46\x70\x70\xbc\x0f\xd4\xbe\x1e\xb5\xf2\x26\xea\x95\x92\ +\xb2\xd7\x53\xfb\x2e\x91\x48\x5a\xd7\x86\x28\xc6\xd4\x29\x7b\x5b\ +\x09\x37\xa1\xc9\x98\xe5\xd2\xf2\x3a\xce\x9c\x39\x8b\x4a\xa5\xba\ +\xdd\x67\x67\x94\x04\x54\x31\xc5\x85\x54\x3f\x9c\x9d\x61\xfe\x0e\ +\x9c\xa9\x31\x5a\xa1\x94\xe2\xfa\x43\x7b\xf1\xa1\xf7\x3d\x84\x5b\ +\x8f\x1c\x44\x26\x65\x49\x0f\x17\x3b\xf1\xb7\x61\x53\x5c\x9e\xdb\ +\xc0\xa5\x59\x6f\x3a\x4c\x60\x8d\x78\xab\x68\x52\x02\x83\xa3\x5c\ +\x01\x2c\x27\x82\x55\x97\xac\x2c\x46\x85\x6f\x1a\x72\x11\xf1\xc0\ +\x65\x7a\x45\x28\x05\x7a\xbb\x32\x78\xea\xee\x43\x10\x32\x52\xe2\ +\xa6\x9d\x36\x56\x2c\x6f\x58\xa4\xe1\x61\x66\xa5\xa8\xe5\x51\x49\ +\x99\x2a\xbe\x31\xb1\x34\x42\x7e\x9a\xd1\xff\x5e\xd0\xd9\x77\xa7\ +\x71\xe9\xe2\x25\x94\xcb\x95\x1d\xdd\xb1\x91\x80\x2a\xa2\x30\xfe\ +\xa8\x49\x38\x93\x8a\x7f\x1e\x40\x5e\xa7\xef\x4d\x87\xb9\xed\xd8\ +\x61\x7c\xf0\x99\x07\x71\xfd\x81\x71\x10\xa2\x5f\x31\x80\x10\xa0\ +\x52\x6d\xe0\xc2\xcc\x1a\xa6\x17\x9d\xe9\x30\x5e\x3e\xaa\x0d\x16\ +\xa4\x51\xe3\x26\x60\x81\x77\xba\x33\xea\xbe\x95\xe5\xa4\x55\x40\ +\x8b\x53\x56\x5b\x5b\x4e\x36\x0a\x2b\x28\xe4\xb9\x27\x00\x52\xd6\ +\xd6\xbe\x1c\xb1\x86\x6f\x6b\x94\x83\x60\x1a\x29\x6d\x14\x50\x89\ +\xcd\xfe\xb0\x6a\xe8\x56\xa7\x60\x53\x13\x0f\x52\xda\xd5\x36\x08\ +\x2c\x8b\x24\x4d\xbf\x6b\x45\x18\x48\x1d\x85\x33\x1d\xe6\x03\x70\ +\x06\x23\x2a\x85\x52\x8a\x6c\x26\x8d\x53\x77\xdd\x8a\x67\x9f\x38\ +\x8d\xc9\x51\xcf\xe8\xa2\x01\x38\x18\x7d\x42\x80\xcd\x52\x0d\xef\ +\x5c\x5d\xf5\xa7\xc3\xb0\xbf\x6e\xaa\x0d\x16\x58\xeb\x8a\xcb\x2f\ +\x2a\xb0\x98\x44\xa2\x95\xe5\xa4\x8f\x00\x2d\x29\x52\x1e\xb9\xee\ +\xcd\xf3\xd3\x02\xba\x0d\xf7\xa7\x2d\xfd\x85\x34\x6a\x54\xb8\x62\ +\x2c\x0b\x4a\xfd\x45\x9b\x4f\x64\x2b\x4a\x91\x81\x6a\x18\xf1\x6e\ +\xe9\x6b\x4d\x40\x15\x22\x8c\xd3\xfc\x41\x38\xd3\x61\xee\x35\xe9\ +\x53\x4a\xd1\xd3\x9d\xc7\xa3\x0f\xdc\x85\xc7\x1f\xba\x13\x83\x7d\ +\x5d\x4c\x24\x7c\x52\x30\x2b\x44\x61\x65\xa3\x82\xb7\xaf\xac\x38\ +\xbb\xc3\x30\xf9\x00\x7a\x60\xa9\x9a\x83\x5e\x45\xfd\xb2\xa0\x02\ +\x56\xa0\xa5\xb5\xb2\xdc\xc2\x54\x96\x16\x57\x86\x94\x48\x3f\xdd\ +\x46\x7b\xbd\x5a\xbb\x3d\xcd\x49\xa4\x97\x3d\x46\x0d\x77\x0c\xa0\ +\xdc\x6f\xd4\x14\x1f\xfd\xb4\x76\x92\x24\xa0\x32\x88\x0b\xa9\x14\ +\x9c\xa5\x82\x7f\x0f\xc0\x4d\x26\x7d\x4a\x29\x86\x87\xfa\xf1\xbe\ +\xc7\xef\xc3\xe9\xbb\x8f\xa1\x3b\x9f\x91\x2d\x6f\x66\x24\x25\x05\ +\x30\xbf\x52\xc2\xb9\x2b\x2b\xd8\xac\xd4\xf9\x35\xa4\x98\x3c\xa5\ +\xb1\x4d\xcd\x00\x8b\x09\x14\xad\x2c\x95\x2f\x8b\xad\x2a\x84\xd1\ +\xf2\x46\x70\x89\x65\x52\xe6\x4f\x9b\xa0\xcd\x12\xf3\x25\xa4\xcd\ +\x64\xd0\xc4\xc8\xfa\x4e\x00\x2a\x48\x17\xd5\x8a\x12\x02\x77\x09\ +\xb0\x12\x50\x69\x84\x99\x0e\xf3\x57\x00\xfc\x63\x38\x9b\x30\x68\ +\x85\x52\x8a\xfd\x7b\xc7\xf1\x81\xa7\x1f\xc0\xc9\x63\x37\x20\x9b\ +\x09\x5a\x86\x8a\xce\x1a\xd8\x0d\x8a\xab\x8b\x05\x5c\x98\x5e\x43\ +\xa5\xde\x08\x96\x0b\x26\x72\x1a\xed\x94\x17\x13\xb0\x98\x02\xf5\ +\x03\x3e\xd9\xbe\x21\x05\xb4\x98\xc4\x3a\x6b\x2b\x28\x4b\xa6\x0f\ +\xdf\x78\x14\xdb\x8c\x0a\x89\x0b\xb0\x16\x5e\xb2\xd8\x56\x93\xa0\ +\x1a\xb7\xe8\xed\x80\x54\xc8\x49\xef\x16\x46\x01\x48\x40\xa5\x14\ +\x17\x52\xc3\x00\xfe\x6f\x00\xbf\x0c\xa0\x37\x2c\xcd\xd1\x9b\x0e\ +\xe1\xc7\x9e\x79\x10\x37\x5e\xb7\x17\x69\x8b\x28\xe9\x44\xe1\xbc\ +\xcf\xb5\x9a\x8d\x0b\x33\x6b\xb8\x32\xef\xee\x0e\xe3\x8e\x37\xa0\ +\x20\xca\xe6\x58\xe8\x1c\x3d\x05\xb0\x80\x70\x2b\x8b\x8d\x53\x42\ +\x0b\x6a\x9f\x96\x90\x85\x5f\x09\xd5\xba\x23\x0d\x9b\xa2\xde\xb0\ +\xf5\x9b\x51\x74\x50\x68\x13\x31\x2a\x95\xa6\xa1\xe4\x1e\x28\xfb\ +\xee\x42\xd8\x12\xcb\x17\xa5\xc8\x88\x3d\x4c\x59\xc4\x19\xe2\xd2\ +\xe4\xf9\xec\x04\x49\x40\xc5\x08\xe3\x34\x3f\x04\xe0\x77\x01\xfc\ +\x24\x42\xa6\xc3\xa4\xd3\x29\xdc\x71\xdb\xcd\x78\xf6\xc9\xfb\xb0\ +\x7f\x72\x24\x98\x28\xec\x2b\x05\x07\x84\x00\xc5\x72\x1d\xe7\xae\ +\xae\x62\x6e\x79\x93\x1b\x10\xe9\xc4\x33\xce\x76\x06\x58\xaa\xe6\ +\xa0\xa3\xaf\x07\x96\x53\xb4\xba\x59\xc8\xe6\x15\x0e\x2d\x46\x9b\ +\x2a\x8c\x9e\x10\x78\x5d\x5d\xd8\xe0\xd6\xcb\xd2\x4b\xb3\x6b\xa8\ +\x47\x23\x4a\x68\xde\x5a\xbf\x8e\xa6\x61\x18\x36\x6c\x81\xf9\xa2\ +\xf2\x0f\x29\x73\x55\x84\xab\x0d\x30\xb5\x13\x9c\x0a\xca\xde\x98\ +\xbc\x7d\xa3\xbd\xd8\x37\xda\x1b\xed\x3a\xec\x50\x49\x40\xe5\x0a\ +\x03\xa9\x3b\xe0\x8c\x34\x7f\x02\x61\xd3\x61\xf2\x59\x3c\x70\xea\ +\x24\x9e\x7c\xe4\x6e\x8c\x0e\xf5\x42\xec\xb8\x66\x61\x40\x08\xb0\ +\x56\xa8\xe2\xed\x2b\xcb\xee\x74\x18\xdd\xf6\xe9\x94\x1b\xb0\xd7\ +\x4e\x60\x39\xa0\x89\x0b\x2d\x1e\x21\x94\x4f\x61\x84\x17\x05\xb0\ +\x51\xac\x61\x03\x35\x68\x54\xda\x2a\x4d\xbd\x84\x26\xa0\xe8\xf2\ +\x35\x3a\xab\xa9\x06\x44\x2a\x2b\x89\x41\xa1\x89\xb7\x54\x86\xa6\ +\xca\xe2\x62\xad\x56\xd6\xbf\x38\xd4\x9b\xd7\x34\x34\x77\xc1\xb8\ +\x04\x57\x12\x50\x81\xeb\xd9\x7b\x0a\x0e\xa4\x4e\x9a\xf4\xbd\xe9\ +\x30\x4f\x3e\x72\x0a\x0f\x9c\xba\x0d\xfd\xbd\xec\xea\xc2\xdc\x28\ +\x16\xff\x51\x58\x58\x2d\xe1\xec\xe5\x65\x14\x4a\xde\x74\x18\x6a\ +\xdc\x89\x98\x30\xbd\x83\x40\x6b\xc0\x62\xcb\x68\x0a\x5a\x5c\x04\ +\x5b\x2b\x56\x55\x0d\x2f\xe5\xab\xd0\xa1\xf7\x43\x55\x77\x51\xa4\ +\x28\x6e\x45\x08\xb9\xd9\xa6\xac\x2e\x81\x64\xe9\x70\xf3\x1a\x09\ +\x7b\x6f\x98\x64\xdc\x88\x72\xa1\x5c\xf1\x1e\x08\x9d\x20\xfc\x8e\ +\x3f\x62\x5e\x8e\xa6\xb8\xa1\x07\xe0\x74\x7c\x88\x1b\xc3\xf2\xdf\ +\x77\x87\x8d\xf5\x9e\x07\x15\x33\x1d\xe6\xff\x02\xf0\x3b\x00\x0e\ +\x98\xf4\x29\xa5\x98\x18\x1b\xc6\xb3\x4f\xde\x8f\x3b\x4f\xdc\x84\ +\x7c\x36\xad\x7c\x78\x3c\x9b\xca\xa6\x14\xd3\x8b\x9b\x38\x37\xb5\ +\x82\xb2\xbb\x3b\x0c\x28\xf8\x89\xc5\x0a\x60\x89\xbb\xc1\xc4\x01\ +\x96\x93\xce\x6c\x65\x39\x79\x46\x84\x96\x77\x3a\xec\xa1\xa2\xab\ +\x8f\x28\xd5\x35\x23\x26\xd1\x7e\x5e\xd1\x98\xb1\x71\xba\xec\xa9\ +\xe6\x40\x65\x87\x99\xfc\x4b\xa2\xaf\x4e\x57\x07\xd1\x36\x52\x5b\ +\x50\x8a\x5a\x08\x3f\x30\x01\x8a\x9a\xea\xdb\xdc\x31\xf2\x9e\x06\ +\x95\x0b\xa9\x3e\x00\x7f\x03\xc0\xdf\x03\x30\x14\x96\xe6\x86\x43\ +\x7b\xf1\x81\xa7\x1f\xc4\xd1\x1b\x0f\x20\x93\xe6\x97\x40\x67\x47\ +\x0b\x13\x00\xb5\x46\x03\x97\x66\x37\x70\x71\x76\x1d\x35\x77\x3a\ +\x4c\xa0\x0c\x79\x8c\x53\x5c\x60\x29\x7a\xe4\x9a\xb1\xb2\x9c\x3c\ +\x14\xd0\x62\x33\x84\x01\x5c\x86\x7a\x44\x77\x69\x77\x6e\x42\x4c\ +\x68\x17\x7d\x58\x74\x08\x98\x80\x78\x70\x52\x16\xdf\x24\xa0\xfc\ +\x7f\x75\xce\x74\x71\xd5\xc2\x08\xf5\xdd\x89\xf2\x9e\x04\x15\xe3\ +\x8f\x9a\x80\x33\xf4\xe0\xaf\x20\xc2\x74\x98\xe3\xb7\xdc\x80\xf7\ +\x3f\x79\x3f\x0e\xed\x1b\x77\xa6\x7e\xa8\x7a\xf6\x5c\x58\x95\x6b\ +\x0d\x9c\xbb\xba\x8a\xa9\x85\x82\xb3\x6a\x27\xe1\x27\x5d\x18\x27\ +\x16\x47\x05\x16\xeb\x1f\x52\x0c\x6b\x70\xd2\x85\x5b\x59\x41\xbc\ +\x97\x07\xdb\x73\xe8\xe6\xa6\x3e\x5d\xe5\x41\x34\xe4\x68\xdd\xc6\ +\xed\xfb\xa5\x8f\x98\x51\x98\x65\xd5\x0c\x9c\x9c\xf8\x08\x83\x20\ +\x5a\x05\x94\x90\x31\xd7\xb0\xa3\x72\xcd\x77\x1b\xa0\x3c\x79\xcf\ +\x81\x8a\x81\xd4\x11\x00\xff\x12\xc0\x87\x10\x36\x1d\x26\x9b\xc1\ +\xa9\x3b\x8f\xe1\xa9\x47\xef\xc5\xc4\xc8\x40\x68\xcf\x5e\xa1\x58\ +\xc3\xd9\x2b\x2b\xfc\xee\x30\x82\x85\x23\xa5\x87\x1a\x58\x6a\x87\ +\xbb\xb9\x49\xc8\x64\xc9\x06\x85\xaf\x35\x45\x79\x38\xfa\x63\xe7\ +\x15\x73\xc5\x7c\x1d\x85\xe9\x41\xbd\x0b\x21\x48\xc8\x30\x51\x21\ +\x56\xff\x32\x36\x2b\x51\x2c\x2b\xd3\xa4\x92\x48\xe3\x9a\x9a\xb2\ +\x9e\x82\xa3\x76\x00\x4a\x5b\x8f\x5d\x0a\x29\xe0\x3d\x06\x2a\x06\ +\x52\xf7\xc3\x99\x0e\x73\xbf\x49\x9f\x52\x8a\xde\x9e\x2e\x3c\x72\ +\xff\x9d\x78\xf8\xbe\xdb\x31\xd8\xdf\xc5\xc7\xbb\x9f\xbe\x75\x44\ +\x80\xa5\xb5\x32\xce\x5e\x5e\xf6\x77\x87\x01\xd4\x4e\x54\x76\x82\ +\xb2\x09\x58\xec\x76\xe9\x2a\x0b\x8b\x77\xa2\x9a\xad\x2c\xb6\x2c\ +\xfd\x32\xc4\x72\xa3\x4d\x37\x96\x4a\x2b\xac\xb9\xa8\xb8\x5e\xba\ +\xf2\x78\x5d\x12\x9a\x32\x3c\x6f\xb3\x42\xd8\x4c\xb7\xa8\x2f\x76\ +\x24\x38\x31\x81\x51\xac\x27\x3e\xdc\x0c\x6d\xd1\x8a\x12\x23\x29\ +\x14\x65\xec\x32\x68\xbd\x67\x40\xc5\x4c\x87\xf9\x20\x1c\x4b\xea\ +\x66\x93\x3e\xa5\x14\x23\x43\x03\x78\xfa\xb1\x7b\x71\xf7\x1d\x47\ +\xd1\xdb\x95\xf5\x62\xa0\x7a\xb9\x28\x80\xd9\xc5\x4d\xbc\x7d\x65\ +\xd9\x9f\x0e\xe3\xfb\x7a\x28\x14\x96\x51\x3c\x60\x39\x69\xf4\xbd\ +\x84\x4e\x38\x6f\x65\xe9\xa0\xe5\xa4\xd7\x2c\xa7\xe2\x0d\xdc\x0c\ +\xfe\x09\xea\xa7\xf7\x8b\xf3\xf9\x89\x2f\x01\xd1\xa7\xd2\xbe\x31\ +\x4d\xfa\x90\x64\xbd\xe8\x6f\x64\x2b\x60\xd2\x56\x23\xa6\xf5\xc4\ +\x87\xb7\x00\x28\x37\x1f\xc9\x7f\xb5\xcb\x00\xe5\xc9\x7b\x02\x54\ +\x2e\xa4\xf2\x00\x7e\x01\xc0\x3f\x81\xe3\x9b\xd2\x0a\xa5\x14\x07\ +\xf6\x8e\xe3\xd9\xa7\xee\xc7\xad\x37\x5f\x8f\x5c\x26\x25\xf4\x9a\ +\x05\x68\x21\xf0\xd6\x90\x5a\xc7\xbb\xd3\xab\xa8\xd6\x6d\xdf\xa0\ +\x60\xf7\xc9\x53\xf7\x0c\x82\x9b\xcb\xd7\x6e\x60\x39\x59\x28\x80\ +\xa4\x1b\xb1\x2e\x1d\x68\xf2\x57\xea\x69\xcc\x2e\xa5\x61\x24\x14\ +\x1c\xa3\xfb\x4d\x19\xe3\xf5\xa4\x46\x7c\x0b\xe3\x36\x81\x4c\xa3\ +\xea\xc3\x9a\x93\x51\xad\x27\x3e\x2e\x3a\xa0\x74\xf5\x8b\xd2\x23\ +\xb8\x9b\xe4\x9a\x07\x95\x0b\xa9\x41\x38\xbd\x7a\x7f\x0b\x21\xd3\ +\x61\x08\x80\x9b\x6f\x3a\x84\x67\x9f\x7a\x00\x87\x0f\xee\x41\x3a\ +\x25\x3b\xa0\xfd\x9e\x3d\x42\x51\xa9\xd9\x78\x77\x6a\x0d\x97\xe7\ +\xd6\x61\xdb\x54\xf9\x62\x52\x42\x39\xeb\xca\x49\xcb\xe6\x29\xfb\ +\xaf\xbc\xba\xf0\xf9\x78\xe1\xe1\xc0\x22\x2a\x08\x89\x15\x53\x0e\ +\x4e\x25\xd2\x2e\x38\xdc\xc5\x31\x48\x90\x6b\xc8\x1b\x11\xba\x00\ +\x12\x7f\x11\x8d\x2f\x15\xdb\x8b\xe9\x34\x96\xb9\xeb\xd0\x8c\xc4\ +\x06\x93\x10\xa1\xea\x16\xd8\x7a\x40\x39\x57\x4e\x5c\x61\x75\xb7\ +\x01\xca\x93\x6b\x16\x54\x8c\x3f\xea\x00\x9c\xf1\x51\x9f\x44\xc4\ +\xe9\x30\x4f\x3f\x7e\x1a\x7b\xc7\x87\x60\x59\xc2\xc6\x9e\xbe\x2e\ +\xdc\x35\xa4\xea\x38\x7b\x65\x19\xb3\xcb\x45\xf7\xa1\x71\xe6\xea\ +\xa9\xe6\xd6\x89\xbb\x10\xb7\x17\x58\x6e\xce\x0a\xd3\x88\xf3\x33\ +\x89\xf3\x07\x95\xad\x58\x65\xdf\x9e\x21\x4a\xdd\x0c\x16\x47\x4f\ +\xf2\x43\x1b\xda\xf8\xba\x10\x31\x3b\xad\x99\x26\xd7\x33\x42\x3d\ +\xe2\x81\x89\x3f\x8a\x03\x27\xee\x5b\x1b\x00\xc5\x25\xdc\xe5\x90\ +\x02\xae\x51\x50\x31\x90\x3a\x01\x67\xa4\xf9\xd3\x08\x99\x0e\xd3\ +\x95\xcf\xe1\xfe\x53\x27\xf0\xe8\x83\x77\x62\x64\xb0\x4f\x32\x8c\ +\xd8\x63\x02\x60\xb5\x50\xc1\x99\x4b\xce\x74\x18\xc2\x90\x84\x9d\ +\x58\xac\x5e\xe3\xbc\x8d\xc0\x72\x03\x9d\xa6\x18\x5f\x4b\xd5\x5a\ +\xec\xc1\xa1\x06\x2e\x4c\x5d\xbd\x5d\x65\x88\x46\x57\x3d\x4e\x4a\ +\x33\xf1\x8f\x88\x2f\x89\xe6\x56\x48\x0e\x15\x68\xf5\x8c\xee\x6b\ +\xaa\xc9\x85\x9a\xad\xb3\x38\x0e\xf9\xd6\xe0\x14\xa4\x31\xf5\x6a\ +\x36\xd3\x93\x47\x35\x27\xaf\xbe\x5e\xc9\x14\x9a\x6d\x13\x66\x3a\ +\xcc\x63\x00\xfe\x2d\x9c\xb9\x7b\x5a\xa1\x94\x62\xa0\xbf\x17\x4f\ +\x3c\x7c\x37\xee\xbd\xeb\x38\xfa\x7a\xf2\xb2\x53\x58\x18\x8e\x30\ +\xb7\x52\xc4\x19\x77\x3a\x0c\x81\x08\x05\x79\x62\xb1\x7a\x8d\xf3\ +\xe8\xc0\x72\xc2\x89\x12\x09\xec\xc8\x25\xee\xd1\x23\x12\xde\x04\ +\x53\x4a\x3e\x31\x0e\x4a\xa6\x41\x9c\x94\x49\x66\x1a\xbe\x2e\x05\ +\x47\xee\x32\xd4\x65\x10\x58\x6b\x52\x71\x4c\xa0\xce\xa8\xf2\xa7\ +\x05\xc4\xef\x25\x6c\x06\x4c\xb2\x4e\x7b\xac\x27\x55\xb9\x2a\x40\ +\x79\xbd\x7d\xba\xba\xab\xca\xdb\xa9\x72\x4d\x81\xca\x85\x54\x06\ +\xc0\x27\xe0\x6c\x06\x7a\xc8\xa4\x4f\x29\xc5\xe4\xf8\x30\x9e\x79\ +\xe2\x3e\x9c\x38\x76\x23\xba\x72\x69\x28\x7f\x69\xdc\xa0\x06\xa5\ +\xb8\x3a\xbf\x81\x77\xae\xae\xa0\x5c\x6d\x18\x96\x0b\xe6\x7b\xdf\ +\x74\xcd\x41\x20\x1a\xb0\xbc\xba\x3a\xe1\x7c\x46\xe2\x48\xf5\x80\ +\x45\x82\xaf\x49\x80\xad\xaa\x27\xcf\x5f\x6d\x41\x31\xba\x53\x89\ +\x0f\x15\xe0\x42\xa5\xb5\x57\xc3\x6f\x51\x6a\x99\x48\x24\x0a\xf0\ +\x87\x04\x61\x74\x30\x5a\x6b\x68\x3f\x9c\x54\x41\xb1\x00\x25\x64\ +\xa0\x2f\xa7\x75\xff\xdd\x76\xc9\x35\x03\x2a\x17\x52\x3d\x70\xd6\ +\x8f\xfa\xfb\x70\xd6\x93\x32\xca\xe1\xeb\xf6\xe1\x7d\x4f\xde\x8f\ +\x23\x37\xec\xe7\xa6\xc3\x70\x2f\x2c\xdc\xe9\x30\x75\x1b\xe7\x67\ +\xd6\x70\x61\x66\xcd\x99\x0e\x03\x38\x4d\x09\x61\xdb\x29\xd1\xba\ +\x72\xfe\x0d\xc6\x37\xb5\x0a\x2c\x1f\x37\x8c\xf3\x49\x1e\x0f\x6e\ +\xf2\x2f\x11\x55\x6e\x42\x4a\x2a\x99\x4b\x4a\xf7\x14\x65\xf5\xa3\ +\xc2\x2a\x4c\x8f\x46\x0b\x15\x78\x43\xc3\xf1\xc2\xf4\x0e\x9a\xf2\ +\x8f\x0f\x25\x59\xaf\x39\x38\x39\xf9\xb4\x0f\x50\xd4\xd5\x63\x71\ +\xbd\xdb\x00\xe5\xc9\xae\x07\x15\xe3\x8f\x1a\x03\xf0\x8f\x00\xfc\ +\x55\x00\x5d\x3a\x7d\x4a\x81\x54\x8a\xe0\xf8\xd1\xc3\x78\xe6\xf1\ +\xfb\xb0\x7f\xef\xa8\xb3\xd0\x9d\x4a\x17\xce\xd0\x81\x52\xa5\x8e\ +\xb3\x57\x56\x30\xb5\x50\xe0\x36\x0d\xa5\x80\x72\x73\x4f\x19\x32\ +\x01\xb0\x94\xfe\xab\x40\x45\x09\x2c\xc2\x9a\x45\x8c\x3a\x61\xac\ +\x2a\xde\x39\xae\x6a\x73\xc2\xe5\x9b\x30\x60\x41\x20\x95\x9c\x17\ +\x97\x5c\x3a\xa0\x5c\x4a\x9d\xc4\xb1\xb8\x84\x73\x84\xfa\xa5\x94\ +\x0f\x65\x0a\xf1\xd6\x57\x98\x25\x45\x63\xbf\xc4\x9d\x86\x93\x58\ +\x46\xe8\x75\x90\xa2\x03\x6f\xba\xba\x88\xdd\x43\xad\x5d\x0d\x2a\ +\x06\x52\x87\xe1\x0c\xe2\xfc\x08\x42\xa6\xc3\xe4\xdc\xe9\x30\x8f\ +\x3d\x7c\x0f\xc6\x86\x07\xe0\x4d\xd9\x53\xb9\x74\x9c\x2d\xd5\x1d\ +\xa7\xf9\xc2\x6a\x29\x08\x17\x5c\x3c\x4e\x58\x00\x2c\xd6\xba\xf2\ +\xf2\x71\x43\x02\x5b\x2d\x06\xb0\x28\x98\xe6\x15\xdb\x7b\x47\xdd\ +\x70\xde\x61\x15\xe8\x4b\xdd\x95\xac\xe3\x3d\x48\x10\xd5\xad\x2a\ +\x3a\xdc\x45\x72\x49\x2e\x21\x6d\x0e\xd1\x84\xc4\x7e\x8f\x34\xc3\ +\x1a\x7c\x46\x49\x13\x73\x98\x6f\x4e\xaf\x69\x54\x8b\x46\x6b\x83\ +\x85\xb9\xe9\xb8\x3c\x9b\xb7\x9e\xb8\x43\x2d\xa0\xe0\x99\x55\xbb\ +\x5e\x76\x2d\xa8\x18\x48\x9d\x82\xe3\x34\x7f\xc8\xa4\xcf\x4e\x87\ +\xb9\xff\xde\x13\x18\xe8\xed\x96\x7a\xc5\x00\xbe\xf3\x6c\x71\xb5\ +\x84\x37\x2f\x2d\x63\xb5\xe0\xec\x0e\x23\xf5\xc2\xb1\xd0\xf0\xc3\ +\xd4\xcd\x41\x20\xdc\xe1\xce\xa6\x71\xbe\x73\xa6\x9b\x0b\x46\xc1\ +\x23\xe4\x56\x82\x87\x6d\x90\xce\x33\x26\xbc\x96\x1c\x6f\xaf\xc9\ +\xe7\xc1\xbe\xe0\x44\x31\xa0\x4a\xf2\x9d\xab\x47\x7f\x72\xd7\x44\ +\x95\x5a\x39\x0e\x54\x4c\x41\xf4\x99\xa9\xb9\x41\x61\xe0\x09\xf7\ +\xc2\xab\xf4\xd8\xb0\x4e\x80\xc9\xc9\x37\x9a\xf5\x24\xd6\x57\x99\ +\xb7\x09\x50\x50\x39\xd2\xc3\xeb\xb7\x53\x65\x57\x82\xca\x85\x94\ +\x05\x67\x7f\xbd\x7f\x05\xe0\x16\x93\x3e\xa5\x14\xa3\xc3\x03\x78\ +\xf2\xd1\x7b\x71\xc7\x89\x9b\xd1\x93\xcf\x9a\x37\x6f\xa4\xc0\xf4\ +\x62\x01\x6f\x5d\x5e\x46\xb1\x5c\x0f\xde\x7b\xd5\xc4\x62\xc1\x12\ +\xd3\x35\x07\x9d\xf4\xae\x2a\xe7\x70\x77\x34\xb8\x1e\x42\xf7\xe5\ +\x67\x39\xe0\xe4\x2b\xd0\xcc\x77\x90\x53\xc1\x82\xa2\x92\x55\xe5\ +\xd7\x55\xdc\x89\x58\xf2\x9b\x9b\xfd\x52\x94\x4f\x1a\x5c\x30\xad\ +\x49\x16\x15\x62\x3a\x5d\xca\x47\x31\x87\x54\x91\x94\x50\x75\x38\ +\x15\x2a\x4e\xa4\x30\xa1\xd9\x48\x82\x9e\xb4\x28\x60\x32\x45\x35\ +\x05\x27\x45\x86\x71\x00\xa5\xab\xd7\x6e\x03\x94\x27\xbb\x0e\x54\ +\x2e\xa4\x72\x70\x76\x2a\xfe\x67\x00\xf6\x98\xf4\x29\xa5\x38\xb0\ +\x6f\x1c\xef\x7b\xe2\x7e\x1c\xbd\xe9\x10\x72\xee\xee\x30\xaa\xf9\ +\x77\x04\x40\xdd\xa6\xb8\x38\xbb\x86\x73\x57\xdd\xe9\x30\x42\x6f\ +\x99\x97\x27\xc0\x0f\x19\x08\x6b\x0e\x02\x08\xb1\xb0\x18\x00\x52\ +\x17\x3e\x84\x08\xb5\x83\x44\x0d\xce\xca\x13\xcf\x89\xa8\xbe\x32\ +\x16\x93\x44\x29\x65\x02\xa5\x48\xb6\x51\x78\xbb\x0f\xbc\x62\xf4\ +\x81\x99\x86\x77\x57\x88\x50\x34\xed\x14\xd4\x52\x77\xe5\x13\x1f\ +\x56\x94\xd3\x57\x5b\x35\xa6\xba\x84\x0d\x24\x55\xae\x90\x10\xa5\ +\x9c\x26\x00\x45\xa9\x02\xb6\x5e\xe4\xee\x19\x46\xb5\x7b\x40\xc5\ +\x34\xf5\x06\x00\xfc\x3a\x80\xbf\x0d\x67\xd1\x3b\xad\x10\x02\x1c\ +\xbd\xe9\x3a\x3c\xf3\xf8\x7d\x38\x74\x60\x02\x99\x94\xd7\xb3\xe7\ +\xf5\x80\x10\x66\x3a\x8c\xb3\xa5\xfa\xdb\x57\x57\x70\xc9\x9b\x0e\ +\x03\x80\x9d\x17\x27\xb9\x7c\x54\xf3\xf4\x9a\x06\x96\x4c\x4d\xdf\ +\x2e\x0a\xcc\x21\xa9\xb9\x25\x41\x14\x42\x93\x51\xaa\x0b\x94\x56\ +\x95\xa3\xce\x38\xc4\x99\x25\x3c\xa9\x9a\x91\x3e\x15\xe3\x3d\xef\ +\x24\xe4\x98\xc6\x82\x82\x2a\x77\xca\xba\xe0\x49\xc4\xc4\x3e\xe8\ +\x78\x2a\x7a\x79\xc9\x23\xe0\x85\xe4\xad\xc0\x49\x71\x82\x7a\x38\ +\x29\x8e\x54\x69\xa9\x06\x67\xbb\xd4\xa4\xda\x15\xa0\x62\x20\xb5\ +\x0f\xc0\x6f\x01\xf8\x59\x38\xcb\x07\x2b\x85\x52\x8a\x4c\x3a\x8d\ +\x3b\x4e\x1c\xc1\x13\x8f\x9c\xc2\xe4\xd8\x90\xb3\xd0\x9d\xac\xe9\ +\xc3\xaa\x50\xaa\xe1\xcc\xc5\x65\xcc\x2c\x15\x84\x1e\x35\xd7\x7a\ +\x72\xc7\x25\x01\x7a\xeb\xca\xd1\x77\x75\x34\xfe\x2b\x40\x06\x96\ +\x0f\x1d\xc6\x22\xf2\xea\x25\xba\x87\x03\xe7\x3a\xdb\x56\xe4\x94\ +\xf8\xe6\x1e\xd3\x63\xa8\x6a\xc2\x11\xe9\xc0\xe4\x94\x92\x2e\xb4\ +\x41\xb7\xd9\x9f\x6b\x22\x18\x5b\xd4\xcf\x4d\xd7\x71\x25\x5a\x51\ +\xaa\xc3\xe0\xc7\x49\x75\x1a\x3a\x32\xf2\x20\x61\xeb\x10\x69\xfa\ +\x8d\xa6\xc2\x22\x84\x94\xd5\x6e\xb6\x79\x47\xf9\xab\x61\x2a\x6b\ +\x37\x39\xda\x77\x3c\xa8\x18\x48\xdd\x0a\x67\x3a\xcc\xfb\xe0\xf8\ +\xa7\x94\xe2\x4d\x87\x79\xe0\xde\x13\x78\xf0\xbe\x3b\x30\xd4\xdf\ +\x0b\xcb\x52\xfb\x5b\xdc\x14\x58\x5e\xaf\xe0\x8d\x8b\x4b\xfc\x74\ +\x18\xc9\xf7\x44\xf5\xfb\xe4\x21\xba\xff\x0a\x08\x80\x05\xa2\xb6\ +\x8a\x58\xa8\xf8\x71\x94\x7f\x81\xfd\x43\xb1\x69\xea\x0f\x41\x60\ +\x22\x9d\x42\xa1\x1a\x7a\x10\xc0\x4c\x53\x17\x95\x55\x26\x5d\x41\ +\x12\x8b\x6f\x62\x6a\x5d\x2a\xca\x82\x53\x04\x87\x77\x44\x38\x65\ +\x3f\x86\x8a\xf7\xd1\x43\xbb\xe0\x8b\x62\x31\x28\xbe\xb3\x54\xc0\ +\x63\x14\x48\x69\x97\x6e\x89\xd1\xb4\xe3\xbf\x36\x07\x28\x4e\x41\ +\x6b\xcd\xed\x9e\xb6\xdf\x8e\x06\x15\x33\x1d\xe6\x61\x38\x3d\x7b\ +\x77\x9b\xf4\x29\xa5\x18\xec\xef\xc5\xe3\x0f\xdf\x8d\xbb\x6f\x3f\ +\x86\x5e\x6f\x3a\x8c\xf8\x62\x32\x69\x66\x97\x37\xf1\xe6\xc5\x65\ +\x6c\x14\xab\x8e\xcf\x89\xc2\xf7\x4b\x01\x62\x53\x2e\xb0\xae\x80\ +\x70\x60\xa9\xf2\xf0\xeb\x40\x34\xf6\x8d\x4b\x38\x76\x98\x83\xae\ +\xb5\xe4\x8d\xcb\x92\x7d\x6d\x7c\xb3\xcd\xec\x1e\x87\x40\x55\xa1\ +\xf9\x68\xc8\x5b\xca\x43\x7f\x68\x18\x0f\xaa\x19\x52\x10\xd5\x69\ +\xad\xd4\x23\x1a\xf4\xb8\xe5\x79\xbe\xa8\x50\xaf\xbb\x73\x01\xe5\ +\x15\x19\x02\x80\x85\x82\x49\x53\xc7\x38\x70\x52\x56\x4b\x88\xd0\ +\x18\x90\xe6\x7a\xed\x22\xd9\xb1\xa0\x72\x21\x95\x06\xf0\x13\x00\ +\x7e\x0f\xc0\x0d\x26\x7d\x4a\x29\xf6\x8c\x8f\xe0\xe9\xc7\x4f\xe3\ +\xd8\xd1\x1b\xd0\x95\xcb\x68\xba\xd2\x03\x27\xe3\xe5\xd9\x0d\xbc\ +\x75\x65\x19\x95\x6a\x83\xef\x89\x63\x96\x4f\x69\x27\xb0\x02\x67\ +\x37\x09\xac\x22\x16\x3a\x6c\x26\x4c\x3b\x50\xdc\x3e\x8b\x1b\x36\ +\x25\x5a\x3a\xc2\xd4\x99\xa0\x09\x6a\xa8\x2b\xc4\x30\xa2\x8d\xe4\ +\xd6\x53\x8f\xe1\x7c\xa7\x91\x02\x49\xd4\x94\x5a\x3d\x1d\xc4\x44\ +\x8b\x86\xb7\xc6\x98\xd4\x44\x7d\x2c\x8b\x00\xb0\xd0\xa6\x67\x18\ +\x9c\x14\x47\xc6\x3c\xcc\x80\xa2\x8c\x1a\x05\xdd\xb5\x80\xf2\x64\ +\xc7\x81\x8a\x69\xea\x75\x03\xf8\xeb\x00\xfe\x01\x80\xd1\xb0\x74\ +\x37\x5e\xbf\x0f\x4f\x3f\x7e\x1f\x6e\xb8\x6e\x1f\xb2\x69\xb7\x67\ +\x0f\x72\x33\x86\x10\xa0\x5a\xb7\x71\x6e\x6a\x15\xe7\xa7\xd7\x50\ +\x77\xa7\xc3\x28\xa7\xbe\x30\xce\x76\xb5\xef\x29\x1e\xb0\x94\x4e\ +\x73\xf7\x8d\xe1\x46\xbb\x0b\xcd\x30\x65\x0f\x1b\xd3\x7d\x4e\x98\ +\xf4\xe2\xba\xc1\x12\x84\xa8\xc6\x15\x25\x54\x5e\x6c\x4e\x8a\xc2\ +\x7b\xe4\x20\xbc\xf9\x08\x05\x97\x51\x87\xaa\x95\xb8\x57\x53\x01\ +\x39\xf1\x25\x96\x0a\xd3\xac\x9e\x20\x85\x6a\x3a\xfb\xd8\xa6\xa3\ +\x34\x62\x3c\xac\x03\x20\x22\x9c\x54\xd5\x57\x9d\x57\x18\xa0\x4c\ +\xf9\xef\x46\xd9\x51\xa0\x62\x20\x35\x02\x07\x50\x9f\x82\x03\x2c\ +\xa5\x50\x00\x29\x8b\xe0\xb6\x5b\x0e\xe3\xc9\x47\xef\xc5\xde\x89\ +\x51\x77\xa1\xbb\xe0\xf5\x64\x5f\x54\x6f\x4b\xf5\x33\x97\x97\x71\ +\x75\x61\xc3\x5f\x43\xca\x7b\x29\x95\xc3\x06\x84\xc5\xe9\xd4\xbe\ +\xa7\x70\x60\x01\xbc\x65\xc4\xef\xa2\x20\x4d\x6c\x61\x0a\x0b\x9a\ +\x78\xbc\x29\xe5\x7c\x91\xfc\x54\xbe\x8f\x9d\x5f\x1a\x98\x12\xca\ +\xe8\xca\x65\x99\x96\x75\xe1\x20\xa4\x18\x8d\x20\xa5\x88\xe3\xfa\ +\xd0\x30\x45\x15\xcf\xf6\xe8\x99\x06\x83\xba\x43\xcc\x15\x51\x8a\ +\x26\xa1\x60\x5a\x49\xcd\x41\x71\xa3\x50\xca\x94\xcf\xf8\xbf\xe4\ +\xa1\x0d\x68\x09\x4e\x9c\x56\x84\xe6\x9d\xe4\x5f\xd3\xa5\x61\x03\ +\x77\x8f\x8b\x6a\x67\x81\xca\x95\xeb\xe1\x34\xf5\x3e\x66\xaa\x1f\ +\x3b\x1d\xe6\x91\x07\xef\xc6\xc8\x60\x5f\xd0\xb3\xc7\xbd\xb5\xc1\ +\xdd\x58\x2d\x54\xf1\xc6\xc5\x45\xcc\xaf\x38\xbb\xc3\x38\x2f\xae\ +\xdc\xa4\x52\x0e\xcc\x0c\x69\x0e\x3a\x9a\x32\xb0\x48\x90\x91\x50\ +\x7f\xf0\x8e\x7b\x86\x44\xbe\x33\x9c\x30\x10\x65\xcf\x24\xf0\x80\ +\x0b\x67\x48\xd4\x0f\x9f\xe0\xd3\x62\xc3\xe4\xa4\x6c\x3d\xe4\xeb\ +\x20\x65\xaa\xbc\x39\x9a\x70\xd3\x8b\xc1\x75\xa9\xc9\x19\x85\xf9\ +\x60\xc4\xd7\x92\x2a\xf2\x13\x90\x23\x81\x45\xed\x3c\x67\x20\x26\ +\xea\x09\xb0\x62\x2d\xab\x30\x30\x01\xd1\xe0\x64\x3a\x77\x1d\x9c\ +\xf4\x79\xea\xcb\xd8\xe9\xb2\x23\x40\xc5\x58\x52\x77\xc1\x71\x9a\ +\x3f\x02\xc3\x63\x4d\x29\x45\x5f\x4f\x17\x1e\x7e\xe0\x4e\xdc\x7b\ +\xd7\x6d\xe8\xef\xed\xe2\x01\x02\x48\x34\x99\x5f\x2d\xe1\xf5\x0b\ +\x4b\x58\x2b\x54\x34\xd6\x11\xd7\x57\xe6\x96\xa3\x6e\x0e\x02\x31\ +\x80\x25\x52\xc6\x83\x8c\xae\xa9\xc7\xfa\xb1\xc0\x20\x83\xb1\x84\ +\xd8\x5d\x96\x59\x73\x4a\xe0\x1d\x53\xac\xdc\x25\x27\x01\xce\x7b\ +\xc7\x14\xac\x53\x0d\x8e\xe5\x5f\x68\xa1\xcf\x52\x67\xed\x98\xde\ +\x0b\xad\x1f\x48\xa3\xa8\xf4\x1d\x31\xf6\x12\x95\x82\xc5\x51\x52\ +\x72\x9e\x54\x15\xcc\x9b\x2d\xb2\xaf\x4b\x70\xaa\xfb\x46\x58\x13\ +\x70\x62\x14\x4c\x96\x50\x1c\x40\x51\xea\x7d\xd9\xdd\x8d\xc0\x6d\ +\x07\x15\x33\x1d\xe6\x19\x38\xc3\x0f\x8e\x9b\xf4\x29\xa5\x18\x1b\ +\x19\xc0\x93\x8f\xdc\x8b\xdb\x6e\xbd\x09\xdd\x8a\xe9\x30\x1c\x17\ +\x6c\xe0\xea\xc2\x06\xde\xbc\xb4\xe4\x4e\x87\x21\xdc\x8b\xc7\xfb\ +\x9e\x02\xeb\x0a\xd0\x37\x07\x9d\x7a\x68\xfc\x57\x6e\x42\xde\x0f\ +\xa4\x68\xda\xb1\x4e\x6e\xb6\x55\xc5\x36\xcd\x3c\x87\x3b\x00\x71\ +\x78\x02\xe7\xef\xe6\xac\x21\xf8\x95\x08\x8a\x67\x9b\x4a\x01\x61\ +\xa9\xd8\xd4\xd3\x18\x64\xec\x35\xe1\x4e\x4b\x21\xfc\x8f\x44\x88\ +\xb2\x78\x3d\x22\xe9\xa9\x87\x0c\x04\x07\xea\x1e\x3f\xea\x11\x9e\ +\x49\x15\x64\x45\xfc\xa6\xaf\xe4\x6c\xa7\x22\xaf\x44\x42\xaa\x88\ +\xc9\xd4\x4f\x73\x5e\xad\xc2\xc9\x49\x16\xc5\x82\xa2\x1e\xa7\x76\ +\xb5\x6c\x2b\xa8\x5c\x48\x65\x01\xfc\x0c\x80\xdf\x86\x33\xa0\x53\ +\x2b\x94\x52\x1c\xda\x3f\x81\xa7\x1f\xbf\x0f\x37\xde\x70\x10\xb9\ +\x4c\xca\xb8\x0c\x52\xbd\x61\xe3\xfc\xf4\x1a\xde\xbe\xba\x82\x5a\ +\xdd\x66\x9a\x30\xf2\xae\x30\xa2\x75\xe5\x84\x85\xac\x84\xa0\xf0\ +\x5f\x01\x81\x2f\xc5\xb7\x6e\x24\xa8\xf0\x26\x96\x07\x3d\xd1\x22\ +\x0a\x44\x26\x08\x07\x3e\xce\x8a\x12\x56\x66\x20\xbc\xe5\xc4\xf2\ +\x91\xaf\xb5\x93\x40\x67\x55\x81\xe9\x14\x30\xde\x23\xc5\x41\x5c\ +\x57\x88\xa1\xd1\xa3\x1d\x45\x10\x58\x9d\x72\x32\x39\x8c\xf7\x3d\ +\x51\x21\x8c\x7d\xd1\xd9\xe6\x60\x10\xce\xa3\x90\x32\xf0\x64\xf7\ +\x61\xd4\xee\x94\x4c\x8d\x67\x18\xc9\xf7\x64\x4c\xc6\x58\x7b\x06\ +\x04\x86\xc4\xec\x2c\xd9\x36\x50\xb9\x90\xea\x07\xf0\xab\x00\xfe\ +\x0e\x9c\xa9\x31\x5a\x21\x84\xe0\x96\x23\x87\xf0\xd4\xa3\xa7\xb1\ +\x7f\x5f\x30\x1d\x46\x39\x67\x8f\x00\xe5\x6a\x03\x6f\x5d\x5a\xc6\ +\x45\x77\x3a\x0c\x6f\x1d\x31\x7e\x18\x06\x40\xb2\x65\xa4\x6e\x0e\ +\x7a\xfa\xaa\xe6\x20\xd7\xb3\xe7\xc3\x47\xb4\x86\xc4\x5e\x3d\x91\ +\x4e\xcc\xa4\x62\xf0\xf6\x18\x85\x02\x16\xa2\x73\x9d\xad\x82\x96\ +\x3c\x4c\x75\x04\x47\xb9\x09\x2c\xc1\x42\x35\x52\xe1\xaa\x16\xa6\ +\x21\x9f\xc0\xfa\xd2\xbf\x2c\x8a\x1e\x3f\x6a\xd2\x55\x37\x0b\x7d\ +\x63\x8a\x05\x11\xa7\x13\xe1\x75\x0d\xfc\xe5\x90\x66\x3e\x07\x05\ +\x48\xb9\xb5\x03\x4e\x4e\xf2\x10\xeb\x89\x39\x90\x3a\x0b\xa2\x58\ +\x75\x3b\x5c\xb6\x05\x54\x2e\xa4\xf6\x00\xf8\xa7\x00\xfe\x12\x9c\ +\x49\xc6\x4a\xa1\x94\x22\x93\x49\xe3\xae\x13\x47\xf0\xc8\x43\xa7\ +\x30\x36\x32\x80\x94\xb0\x3b\x0c\x0b\x0f\x42\x80\x8d\x62\x15\xaf\ +\x5f\x58\xc2\xcc\xe2\xa6\x1b\x01\x49\x9f\x08\x8e\xa5\x38\xcd\x41\ +\xb1\x4c\xd6\x96\x92\xc1\xc9\xbf\x6c\xaa\xe6\x1f\x6b\x7d\x05\x4c\ +\x0b\xc6\x43\x11\xa9\x82\xbc\xcf\x8a\x7d\xeb\x45\x90\x51\x76\xe8\ +\x02\x5b\xac\x0b\x4c\xa9\x3e\x80\xba\xd7\x92\x37\xc3\xe4\x73\x61\ +\x2f\x83\xfa\x90\x93\x60\x38\x05\xc3\x8c\xd0\x37\x87\x6f\xba\xc9\ +\x65\x11\x09\x3e\xfc\x21\xef\xf0\xf6\x83\x55\x90\x11\xfc\x51\x1c\ +\x66\xa8\x98\xaf\xe0\xa7\x62\x14\x1c\x3e\xd2\xb6\xc2\x49\x3e\x2f\ +\xb9\xa9\x6b\xba\x01\x94\x7f\xf4\x77\x85\x6c\x29\xa8\x18\xa7\xf9\ +\x51\x38\xfe\xa8\xf7\x23\x64\xa1\xbb\xee\xae\x1c\x1e\x38\x75\x02\ +\xf7\xdd\x7b\x3b\x06\xfa\x7a\x60\xf9\x93\x67\x64\x6b\x07\x14\x58\ +\x5c\x2f\xe3\xb5\xf3\x0b\x58\x5a\x2f\x07\xbd\xf9\x8a\x89\xc5\xf2\ +\x66\x9d\xd1\x9b\x83\x6c\x99\x3e\x3f\xd4\x04\xe2\xac\x37\x55\x8b\ +\x4e\x32\x63\x14\xbe\x28\xe5\xd0\x05\xc8\x73\xf7\xb4\x9d\x00\xfe\ +\x39\x28\x7a\x1f\x15\x55\x51\x54\x52\xb6\x20\xa0\x81\x55\x98\x68\ +\x9b\x6e\x2a\x09\x1f\xa9\xae\x07\x9c\xec\x3b\xf2\x61\xc6\x9a\xd7\ +\xec\xc9\xb3\x56\x0f\x6b\x25\xb1\xd6\x94\xd8\x14\x64\x8b\x61\x7c\ +\x5e\xfc\x70\x05\xd1\xf9\xa5\x3f\xa5\xc8\x7b\x0a\xea\x00\x25\x14\ +\xe3\xad\x49\x45\x95\x17\x72\xf7\x90\x6a\xcb\x40\xc5\x40\xea\x21\ +\x38\x3d\x7b\xa7\x4c\xfa\x94\x52\x0c\x0d\xf4\xe2\xf1\x87\xee\xc6\ +\xc9\x13\xb7\xa0\xa7\x2b\x07\x4b\xf3\x13\xee\xc1\x63\x7a\xb1\x80\ +\xd7\x2f\x2c\x62\xa3\x54\xe3\x74\x4d\x13\x8b\xa3\x34\x07\x3d\xab\ +\xc5\x5f\xa3\x08\x80\x4d\xf9\x87\x8f\xba\x75\x66\x97\xd5\x60\x9b\ +\x82\xc4\xcd\x90\x10\x67\xec\x57\xca\x22\xee\x20\x50\x0f\x43\x84\ +\xd1\x87\x5f\x49\xb5\x2f\xca\xed\xa5\xe3\x9c\xf6\xfa\x26\x98\xd6\ +\xaa\xf2\x5f\x23\xf5\x03\xcb\x5d\x5d\xa2\xce\x5c\xfd\xe3\xac\xeb\ +\xf6\x83\x16\x38\xea\xb2\xc5\x73\x92\x5f\x76\xe6\x72\x48\xf4\xe3\ +\x21\x26\x13\x42\xb6\x4a\x54\x40\x11\xfd\x51\x41\x18\xaf\x23\x94\ +\x4f\x83\x4f\xd6\x07\x16\x17\x4e\xea\x7a\xea\xad\x27\xbd\xe5\xb6\ +\x9b\x1a\x7a\xb2\x6c\x09\xa8\x5c\x48\xa5\xe0\x2c\x15\xfc\x2f\x00\ +\xdc\x68\xd2\xa7\x94\x62\xef\xe4\x08\x9e\x7a\xf4\x34\x6e\xbe\xe9\ +\x3a\xe4\xdc\xe9\x30\xbc\x85\x13\xe8\xdb\xb6\x8d\x8b\xb3\xeb\x38\ +\x73\x29\x98\x0e\xa3\xf2\x5d\x99\x26\x16\xab\x9a\x83\xb6\x4d\x61\ +\x53\x8a\x86\xed\xfc\xd9\x0d\x1b\x75\x9b\xa2\xd1\xb0\x51\x6f\x50\ +\xd4\x6d\xdb\x85\x53\xf0\x8c\x52\xcf\x39\xce\x64\xee\x35\xc5\x08\ +\x3c\x78\x11\x58\x84\xc0\xb2\x9c\xbf\x94\x45\x90\x4e\xa5\x90\x49\ +\x5b\xc8\xa4\x09\xd2\x96\x85\x54\xca\x42\x3a\x6d\x39\x03\x58\x09\ +\x11\x9a\x73\x94\xf7\x85\x05\x06\x9c\xd0\x5b\x68\xf8\xc5\x64\xd2\ +\xf3\x4d\x5d\xdd\x4d\xd1\x3b\xb0\xb4\x76\x9a\xca\x84\x54\x99\x05\ +\xba\xea\x41\x7c\xc7\x64\x00\xf2\x3e\x72\xb9\xe9\x17\x30\x84\xc9\ +\x51\xd9\x71\x17\x60\x8a\x6a\xca\xa0\x8c\x6e\x90\xce\xbb\x23\x72\ +\x0a\xbd\xc5\x15\x1f\x4e\x7c\x29\xaa\x38\x21\x8a\x83\xda\xee\x77\ +\x52\x75\x1c\x54\x2e\xa4\xba\xe0\x6c\xba\xf0\x8f\xe0\x6c\xc2\x60\ +\x94\x9b\xae\xdf\x8f\xa7\x1e\x3b\x8d\x83\x07\xf7\xf8\xd3\x61\x3c\ +\x61\x5f\x2a\x42\x80\x4a\xdd\xc6\xdb\x57\x56\xf0\xee\xd4\xaa\x33\ +\x1d\x46\xbb\x85\x95\x97\x3e\xb0\xae\xbc\xf7\xc6\x01\x0d\x45\xbd\ +\x61\xfb\x7f\xb5\xba\x8d\x6a\xdd\xf9\xee\x01\xcb\x83\x12\x27\x8c\ +\x9f\x27\xb0\x9e\x28\xd3\xa2\x23\x3e\x5d\x89\xaf\x44\x85\x7a\x11\ +\x10\x52\xf3\x75\x2c\xcb\xf2\x01\x96\x49\x5b\xc8\x66\x52\xc8\x65\ +\x52\xc8\xa6\x53\xc8\xa6\x2d\x64\xd2\x4e\x3c\x6f\x61\x32\x6f\x83\ +\xc2\x77\x2e\xfb\xc7\x08\xeb\xd7\x57\x28\xea\x2d\x34\x28\x92\x70\ +\x97\x44\x17\x21\x06\x08\xc0\x30\xfa\xc9\x25\x25\x73\x62\xaa\xb2\ +\x72\xbc\x74\x54\x6e\x52\x52\xc9\x4a\x0a\x74\xb9\x12\xc3\x06\x42\ +\x89\xf5\x50\xf8\xb0\xa2\x0e\xcc\x74\xbe\xc6\xb3\x9e\xa8\x7c\x62\ +\x6a\x3d\xec\x2e\xe9\x28\xa8\x5c\x48\x0d\x03\xf8\xbf\x01\xfc\x0a\ +\x9c\xed\xac\x94\x42\x29\x90\x4e\x59\xb8\xed\xd8\x61\x3c\xfe\xf0\ +\x29\x8c\x8f\x0f\x23\x9d\xb2\xf4\x99\x13\x60\xb3\x5c\xc7\x1b\x17\ +\x96\x70\x65\x61\x3d\x18\x2a\x14\xba\x85\x15\x1c\x2b\xa9\xe1\x80\ +\xa8\x5a\x6b\xa0\x5a\x6f\xa0\x56\x77\x80\xd4\xb0\x69\xa4\xb5\x86\ +\x00\xc6\x52\xe2\x80\x83\xa0\x6c\xb6\x1e\x5c\x13\xd0\xd7\x16\x5c\ +\x54\x2e\x3c\x29\x45\xa3\x41\xd1\x68\x00\xd5\x7a\x03\x9b\xe5\xba\ +\x0b\xb0\x00\x5e\x5d\xb9\x0c\xba\xb2\x29\xe4\xb3\x69\x64\x5d\x70\ +\x11\x61\x20\x29\xdf\x6c\x13\xbb\xe4\x64\x5f\x85\xce\xa0\xd2\x6f\ +\xdd\x25\xdd\x92\x58\xa2\x5b\xce\xca\xf8\x1a\xab\x78\x22\x24\x36\ +\x70\x83\xb9\x2a\xa2\x55\xe4\x1c\x50\x71\x19\x18\x22\x36\xd9\x98\ +\xa6\x20\x55\xe8\xb8\xbe\x2d\x1e\x30\xaa\x6e\x48\xa1\x7e\xed\x84\ +\x93\xe9\x9a\x87\x6a\xec\x4c\xe9\x08\xa8\x18\x7f\xd4\x21\x38\x1b\ +\x81\x7e\x02\xce\xc6\xa0\x4a\xa1\x94\x22\x9f\xcb\xe2\xde\xbb\x8e\ +\xe1\x81\xd3\x77\x62\x70\x20\x98\x0e\xa3\x7a\x79\x08\x80\x95\x8d\ +\x0a\x5e\x3b\xef\x4c\x87\x61\xfd\x14\x7e\x0f\x19\x00\x6f\x0a\x8a\ +\x6d\xd3\xc0\x4a\xaa\x35\x50\xa9\x35\x50\x6f\xd8\x68\xd8\x76\xd3\ +\xb3\x08\x3a\x05\x29\xd6\x15\x24\x0e\xc6\x74\xac\x3e\xa0\xde\x68\ +\xa0\x54\x6d\x80\xc0\x81\x7b\x36\x93\x42\x57\x2e\x8d\x7c\x36\x8d\ +\x7c\x26\x85\x4c\xc6\x72\x7c\x60\xba\xa6\xa1\x1f\x26\x0f\x8c\x50\ +\x9b\x43\xe1\x08\x32\x6a\xa8\x08\x47\xf9\xf1\xec\x86\x06\x0a\x73\ +\x01\x94\x0d\x3e\xb9\xba\xba\xb7\x3a\xca\x02\x79\xda\xb3\x0b\xc0\ +\x46\x29\x41\xf8\x83\xa3\x5a\x1e\xc6\x2b\xce\x85\x5d\x44\x38\xe9\ +\x6a\xa8\x03\x94\xc6\x55\x26\xe7\xbd\x7b\x7c\xe9\xed\x07\x15\x03\ +\xa9\x3b\x00\xfc\x1b\x00\x8f\x9b\x2e\x09\xa5\x14\xfd\xbd\xdd\x78\ +\xf8\xfe\x3b\x70\xf7\x1d\xc7\xd1\xd3\x93\x77\x9b\x34\x14\xba\x65\ +\x80\x67\x97\x37\xf1\xda\xf9\x45\x67\x77\x18\xcf\xe1\xcc\xbc\x8c\ +\x9e\x45\x52\xad\x3b\x50\xaa\x54\x3d\x30\xb5\xe7\xf7\x84\x08\x16\ +\x5b\xcb\x90\x12\xf3\x63\x21\x45\x18\x90\x71\xc7\x8e\xd4\x6d\x8a\ +\x7a\xa5\x8e\x62\xa5\x0e\x8b\xb8\xe0\x4a\x07\xe0\xea\xca\x39\xbe\ +\x2f\x2b\x68\xa0\x82\x2f\x4c\xbc\x1f\x7c\x9d\xc4\x38\x4d\x94\xc6\ +\xa9\x2e\x24\x34\x5d\x53\x21\x1f\xad\x12\x65\xb5\xf9\x14\x54\xcc\ +\x4d\x1a\xef\x44\x24\xa7\x3b\xdb\xbb\x27\x32\x4b\xb9\x2a\x82\xe4\ +\xb0\x97\x4d\x38\x7e\x9a\x8d\x94\x01\x53\x1f\x85\x2b\xa1\x49\x38\ +\xa9\x2e\x33\x75\xeb\x17\xc3\xe0\xda\xb1\xd2\x56\x50\x31\x0b\xdd\ +\x3d\x0d\x67\xf8\xc1\x09\x93\x3e\xa5\x14\xe3\x23\x83\x78\xe2\xd1\ +\x53\x38\x76\xf4\x46\xe4\x73\x19\xb5\xdf\xc5\xed\xad\xa3\x94\xe2\ +\xf2\xdc\x3a\xde\xb8\xe0\x4c\x87\xb1\x98\x5f\xff\x86\x0d\xd4\xea\ +\x4e\x33\xae\x5c\x75\x9a\x72\xad\x58\x4c\x3a\x21\x2a\x08\xb5\x0b\ +\x52\xac\xbe\x7b\xac\xb4\xb6\xdc\x74\x2a\x4b\xa8\xde\xa0\xa8\x37\ +\x5c\x70\x59\x40\x26\xe5\x40\xab\x3b\x9f\x41\x77\x2e\xed\xfb\xb7\ +\xc4\xab\xac\x83\x93\x74\xfe\x21\xf1\xcd\xfe\x50\x87\xdd\x26\xfd\ +\x7d\x54\x5b\x37\xe2\x02\x77\x7c\x41\x8a\x70\x25\xdc\xe4\x35\xd4\ +\xfd\xa6\x1f\x03\x4d\xb1\xb9\xc8\x9f\x4f\x90\x07\xc7\x33\x65\xef\ +\x61\x7b\xe0\xc4\x1d\x79\xa6\xaa\xb6\x3b\x70\x77\xd0\xab\x6d\xa0\ +\x72\x21\x95\x01\xf0\x49\x00\xbf\x03\xe0\x40\x58\x9a\xeb\x0e\x4c\ +\xe2\xa9\x47\xef\xc5\xf5\xd7\x1d\x40\xc6\x9d\x0e\xa3\xfa\x65\x26\ +\x70\xb6\x54\x7f\xe7\xea\x0a\x37\x1d\xa6\x6e\x53\xbf\x29\xe7\x35\ +\xe7\xec\x36\x59\x4d\x2a\xe1\x81\xe4\xfc\x43\x14\x0a\x61\x90\x22\ +\x8c\xbe\xce\x8a\x0a\x3e\x0c\x69\x82\x68\xee\x8a\xb1\xe3\x42\xab\ +\x75\x1b\xd5\x7a\x15\xeb\xc5\x2a\x32\x69\x0b\xf9\x6c\x1a\x3d\xf9\ +\x34\xba\x73\x69\x64\xd3\x29\x1e\x5a\xcc\xc8\x6d\xe5\x54\x19\xa2\ +\x7a\xbd\xb5\x7d\x7e\x62\x52\x43\x7c\x04\x8b\x8b\x18\x5e\x58\x89\ +\x55\x41\x67\x86\x1e\x02\x9a\xd5\x0e\x04\x63\x88\x28\xf5\x84\x02\ +\xa9\x08\x1c\x39\x9e\xb2\x3f\xba\x6e\xfd\x3c\x58\xd1\x50\x00\xc5\ +\x01\x94\xc1\x99\x15\xf9\x6a\xef\x3c\x69\x0b\xa8\x5c\x48\xf5\x01\ +\xf8\x9b\x00\xfe\x1e\x80\x41\x9d\x2e\x05\x60\x11\x82\x63\x47\x0e\ +\xe1\x89\x47\xee\xc5\xe4\xe4\x58\xb0\x3b\x0c\xf3\x73\xec\x7d\x25\ +\x04\x28\x55\x6a\x78\xf3\xe2\x32\x2e\xce\xac\xa1\xe6\x3a\xc1\x2b\ +\xd5\xba\x0f\xa7\xad\x58\xad\x42\x9c\x1a\x23\x41\xa8\x8d\x90\x62\ +\xc1\xc3\x8f\xab\x12\x36\x0e\x15\x9c\xe4\xe2\x88\x78\x91\x35\xb5\ +\xba\x8d\x5a\xbd\x8a\x42\xa9\x86\x74\xca\x42\x3e\x9b\x42\x8f\x6b\ +\x69\x65\x33\xbc\xa5\xa5\x5c\x21\x4b\x70\x5b\x11\x29\xd0\x78\x05\ +\x63\xc6\xf1\x84\xa1\x3a\x7d\xc5\xd8\x24\xaa\xa0\x94\xae\x81\x18\ +\xb8\x9b\x14\xe7\xc1\x36\xcd\x18\xf6\x68\x8d\x35\x36\x4c\x60\x17\ +\x91\x4b\x0e\x8e\x88\xd7\xf3\xac\xba\xd0\xdc\xa9\xea\xae\x10\x44\ +\x40\x51\x26\x0d\xd5\xe9\x53\xb2\x6b\xa8\xd5\x32\xa8\x5c\x48\x4d\ +\x00\xf8\x27\x00\xfe\x32\x9c\xa1\x08\x4a\xa1\x94\x22\x9b\x49\xe3\ +\xae\x93\x37\xe3\xe1\x07\xee\xc6\xd0\xd0\x80\xbc\x3b\x0c\xdb\x76\ +\x20\xc0\x5a\xa1\x8a\x97\xcf\xcd\xe3\xd2\xec\x3a\xca\x55\xa7\x69\ +\xb7\x55\x70\xf2\x84\x5b\x76\x65\xab\x20\x25\x34\xf5\x38\x0b\xc7\ +\xe8\xb7\x52\x00\xce\xaf\x56\x10\x58\x6f\xd8\x28\x94\x6c\x6c\x96\ +\x05\x68\xe5\x33\x4e\x2f\xa2\xc6\xa2\xd2\xdd\xaa\x30\x69\x66\x29\ +\x5c\xdd\x48\x04\xc5\xcd\xd1\x38\xca\x85\x84\x8c\x7f\x4b\xf6\x3f\ +\x05\x24\xf2\xb8\xa5\x36\x6a\xf8\x79\xa3\x54\xf2\x5c\xcb\xa4\x60\ +\xf9\xc3\x2f\x0b\x43\x85\x72\x9a\x68\xda\x09\x81\xba\x16\x1e\x35\ +\x6b\xec\x78\x69\x1a\x54\x8c\xd3\xfc\x08\x9c\xdd\x8a\x3f\x88\x90\ +\xe9\x30\x3d\xdd\x79\x3c\x70\xef\x09\x9c\xba\xeb\x04\xfa\x7a\xbb\ +\xfd\x5f\x70\xe9\x81\x77\xaf\xe5\xd4\x62\x01\x3f\x78\x63\x06\xd3\ +\x4b\x9b\x1d\xf1\x37\x45\x17\x95\x75\xe3\x7e\xc4\x82\x94\xa1\x67\ +\x4f\xab\x13\xd5\x8a\xd2\x00\x4a\x01\x1c\x3e\x0b\x82\x7a\x83\xa2\ +\x50\xaa\x63\xb3\x5c\x47\x3a\x55\x41\x57\xce\x6b\x1e\x66\x90\x4e\ +\x59\x81\x2f\x90\xf2\x3e\xb6\xf6\x08\x6d\x3a\x3a\x00\x80\xe9\x35\ +\x64\x9a\x56\x9c\x95\x43\x64\x67\x36\x21\x01\x78\x7c\x27\xbb\x93\ +\xab\xb4\x24\x8c\x7f\xc8\x98\x5a\x6e\x1a\x31\x9e\x70\x43\x17\xc4\ +\x3b\xa1\xf3\x5f\xe9\x2e\x41\x38\x9c\x38\x76\xfa\xf0\x54\x34\x09\ +\xdb\x7a\x1f\x3b\x2b\x4d\x81\x8a\x81\xd4\xfd\x70\xa6\xc3\xdc\x67\ +\xd2\xa7\x94\x62\x78\xb0\x0f\x8f\x3f\x74\x37\x6e\xbb\xf5\x66\xe4\ +\xf3\x59\x66\xce\x9e\xab\xc3\xe8\xd6\xea\x36\xde\x9d\x5a\xc5\x0f\ +\xce\xcc\xb8\x0b\xdd\x6d\xdf\x15\x35\xf7\xf0\xf1\x56\x4e\x3c\x48\ +\x45\x70\x9a\x9b\x20\x45\xd4\x75\xe2\xab\x43\x14\x61\xe2\xd9\x70\ +\x87\xa8\x37\x6c\x6c\x14\x9d\xe6\x61\xc6\x83\x56\x57\x06\xdd\xd9\ +\x94\x33\xae\x8d\x50\xc5\xb3\xde\xca\xfd\x51\xf9\xb8\xa8\x3a\x5a\ +\x7a\xd7\xa8\x32\x37\xb1\x67\x8f\x57\xd7\x0d\x5d\x90\x72\x50\x0b\ +\xeb\xb7\xf2\xd3\x09\xc0\x51\x4c\xaf\x0a\xaa\xc4\xc0\x90\xfa\xf6\ +\x99\x3a\x1f\xd5\x79\x1a\x5c\x50\xca\xa5\x6f\x84\xd3\xd6\x5f\xb9\ +\x9d\x2d\xb1\x41\xc5\x2c\x74\xf7\x61\x38\xd3\x61\x6e\x36\xe9\x53\ +\x4a\xb1\x6f\xcf\x28\x9e\x7a\xf4\x5e\x1c\xbe\xe1\x10\xb2\x99\xb4\ +\xf3\x0b\x4d\x01\x7f\xa2\x2f\x85\x33\x4d\xa5\x61\xa3\x52\x6b\xe0\ +\xcc\xa5\x65\xbc\x72\x6e\x1e\xa5\x4a\x63\x9b\x21\xe5\x7e\x32\xff\ +\x10\x01\x42\x81\x5e\x07\x21\x45\x78\x28\x9a\xac\x28\x25\xa0\x04\ +\x7d\xfe\x9c\x84\x73\x66\x02\x6b\x0d\x1b\xb5\x62\x15\x1b\xa5\x2a\ +\xb2\xe9\x14\xba\x5d\x4b\x2b\x9f\x4d\x23\x95\x22\x0c\xa4\x14\x3f\ +\xd3\x0a\x67\x76\xe4\xeb\xce\xf9\xa0\xe4\x66\x63\x50\xa2\xc1\x17\ +\xe5\xf6\xcc\x48\x0b\xe8\x79\xa9\x45\x07\x3c\x11\xc7\x35\x09\xff\ +\xba\xff\x50\x0d\xc7\x38\x18\x68\x74\x18\xa3\x2c\x68\x46\x08\x3e\ +\x36\x0a\x05\xaa\x62\xc1\x89\xa9\x37\x35\xb3\x79\x37\x49\x2c\x50\ +\x31\xd3\x61\x7e\x01\xc0\x3f\x86\xe3\x9b\xd2\x0a\x01\x70\xe4\xf0\ +\x01\x3c\xf1\xe8\xbd\xd8\xb7\x77\x12\x99\xb4\xbb\x86\x94\xfb\x8f\ +\x6d\x3b\xf3\xe5\x1a\x0d\xe7\x21\x29\x57\xea\x78\xf5\xfc\x02\xce\ +\x5c\x5a\x66\x16\xba\xdb\x1e\xd1\x3a\xcf\x01\x48\x51\xa1\x3e\xa9\ +\x70\x00\x71\xb0\x21\x44\x5d\x0f\xf0\xd0\x09\x6b\xe6\x49\x40\xe3\ +\xb3\x62\xee\x93\xbe\x39\x47\x00\x80\xc2\x19\xc1\x5f\x6b\xb8\xbd\ +\x87\x29\x74\xbb\x3d\x87\xf9\x6c\xda\x1d\x5c\x2a\x48\xac\xb7\xc2\ +\xd0\x0f\xa8\x00\x9e\xec\x3b\x12\x94\x38\x9f\x0c\x11\x03\xe0\x58\ +\x35\x62\x4e\x2a\x77\x37\xd1\xea\xb0\x68\xe4\x7d\x5a\x7c\x3c\xe5\ +\x76\xad\x11\x46\xb4\x8b\x5d\x8c\x5c\x42\xfd\x65\x34\xc1\x49\x17\ +\xbf\x9b\x21\x05\xc4\x00\x95\x0b\xa9\x21\x38\xbd\x7a\x7f\x03\x4e\ +\x2f\x9f\x52\x28\xa5\x48\xa7\x53\x38\x79\xeb\x8d\x78\xf4\xc1\xbb\ +\x31\x32\x32\xec\xee\x0e\xe3\xc4\x35\xdc\x91\xe2\xb6\x4d\xfd\xe9\ +\x2d\x1b\xc5\x2a\x5e\x38\x3b\x87\x0b\x33\x6b\x9a\x35\xba\xb7\x5a\ +\x78\x80\x70\x2f\x39\xe7\x97\x8a\xe3\x38\x6f\x1e\x52\x46\x2b\x2a\ +\xa4\x89\xa7\x02\x94\x7e\x83\x51\xf6\x40\xbe\x09\x36\x85\x3f\x1c\ +\x64\x7d\xb3\x8a\x6c\xda\x42\xb7\x3b\x4e\x2b\x97\x49\x39\x9d\x23\ +\x21\xad\x27\xdd\xb5\x0e\xc4\x64\x8e\x88\xe1\x0a\x38\x39\xee\x27\ +\x1e\x3b\x82\xc5\xc4\x0f\x77\x80\x34\xee\x2a\x68\x9d\x89\x4e\x76\ +\xbe\x59\xa7\xb4\x28\x29\x9f\x47\xa0\x25\x3b\xf7\x83\x2c\xe4\x61\ +\x0a\x26\xbf\x95\xa8\xa1\x83\x13\xa5\xe6\x5b\xb1\x5b\x00\x16\x09\ +\x54\x2e\xa4\x7a\x01\xfc\x2e\x80\x5f\x84\xb3\x7c\xb0\xfa\xc4\xdd\ +\xe9\x30\xa7\xef\xbe\x15\xf7\x9d\xba\x1d\xfd\xfd\xbd\xb0\x08\xf1\ +\xa7\xb1\x34\x6c\xca\x8d\x75\x22\x04\x58\x58\x2d\xe1\x87\x6f\xcd\ +\x62\x66\x69\x73\xbb\xaf\x87\x5b\x27\xd9\x2f\xa5\x77\x9e\x33\xe9\ +\xe4\xae\xba\xe8\x90\x32\xf8\xa3\xa2\x5a\x51\x91\x01\xa5\x83\x93\ +\xce\xf1\xae\x09\xb0\x29\x45\xb9\xd6\x40\xb9\xd6\xc0\x6a\x31\x68\ +\x1e\x76\xe7\xd2\x3c\xb4\x3c\xa1\x8a\xbc\x94\xbe\x13\xa1\x54\xe3\ +\x9a\xe2\x8a\x71\x48\x54\x61\xf7\xa8\xbb\xf0\x82\x23\x9d\xb3\xdc\ +\xbb\x2e\x8c\xc3\x5c\xde\x32\x4b\xdc\x8c\x94\x8d\x57\xcf\xfb\xd3\ +\x2d\x17\x43\x79\x7a\x69\xfd\x4e\xf2\x39\x09\xb1\x9c\x63\x4c\x83\ +\xa3\xdd\x42\x29\x44\x00\x15\xe3\x38\xff\x38\x9c\xd5\x38\x8d\x90\ +\xea\xef\xeb\xc6\xa3\xf7\xdf\x89\xdb\x4f\xde\x82\xae\x7c\x1e\x94\ +\x52\x54\x0d\xa3\xc4\x2f\xcf\x6d\xe0\x87\x6f\xcd\x62\x65\xa3\xb2\ +\x03\xac\x28\xe1\x5d\x55\xf9\xa5\xc0\x03\xc1\xfb\xae\x1a\x71\xae\ +\x6e\xfa\xb5\x07\x52\xa2\x2f\x2a\xb4\xf7\x4f\x07\x28\x95\x35\xa6\ +\x3c\x10\xf2\x17\x42\xa9\xed\x2c\xff\x5c\xa9\x36\xb0\xe6\x59\x5a\ +\x79\xc7\x09\x9f\xf5\xa0\x25\x0a\x8d\xf6\xae\x50\xbf\x8e\x54\x03\ +\x3b\xa1\xe9\xc7\x39\x83\x98\x70\x26\x11\x55\x76\xad\x89\xd3\x68\ +\x82\xf2\x54\x3d\x8c\xbe\x0f\x4c\x61\xfa\x70\xf9\x28\x5a\x78\x62\ +\xad\x44\x1f\x97\x0e\xac\xe1\xbb\xd8\x78\x1f\x41\x3d\xb4\xbd\x82\ +\x3b\xe0\x7d\x8b\x2a\x51\x9b\x7e\x3d\x70\x9c\xe7\xc6\xcd\x40\x27\ +\x46\x9d\xe9\x30\x47\x6e\xbc\x01\xa9\x74\x0a\xb5\x7a\x43\x3b\xbf\ +\xce\xb6\x29\xde\x99\x5a\xc5\x4b\xef\xcc\x63\xb3\x54\xdb\x11\x90\ +\x72\x84\x7d\xd1\xd5\x7e\x29\x25\xa4\xb8\x28\xd3\x38\x29\x03\xa4\ +\x0c\x4e\x73\x6d\xf3\x50\xa8\x9c\x68\x45\x89\x80\x52\x59\x4f\x7a\ +\x38\xa9\xa1\xa4\xd6\x0d\x0e\x39\x4b\xcb\x22\xc8\xba\x23\xe2\xf3\ +\xd9\x14\xf2\x99\x14\x52\xcc\x90\x07\xa2\x84\x95\xe0\x3c\x37\xf9\ +\x6b\xc4\x1a\x98\x1c\xe8\x9c\x2a\xe1\x1d\xd9\x3e\xf0\x58\x47\xbb\ +\xd4\x86\x94\xe1\xc2\x24\x13\xbf\xfb\x5a\x7e\x18\x03\x31\xe9\xc4\ +\xa9\x04\x43\xef\xdf\xb8\x70\xd2\x89\xc9\x3a\xdb\xe9\x12\x15\x54\ +\x29\x00\xf9\xb0\xab\x30\x3e\x36\x84\xfd\xfb\xf6\x80\x58\x16\xea\ +\x75\xdb\xa8\x5e\x6b\xd8\x98\x5e\x2c\x60\xb3\xbc\x73\x20\x25\xaf\ +\x88\x00\xb5\x5f\x4a\x70\x9e\x7b\x11\x92\x85\xd2\x2c\xa4\x08\x8f\ +\x08\xb3\x0f\x4b\x5d\x9f\x58\x80\x12\xe0\x64\x6a\xee\x79\x87\x54\ +\x0a\x56\x3b\x91\xa8\x4d\x51\xae\x3a\xf3\x2f\x2d\x42\x90\x4e\x11\ +\xe4\x32\x29\x1f\x5c\x19\x6f\x70\x29\x97\x5c\x2c\x50\x4d\x2a\x45\ +\x5f\x9f\xc4\x16\xc7\xe2\xe1\xf3\xa3\x3c\x9d\xf8\x2c\x24\xd2\x68\ +\x8e\x15\x3e\x2c\x2f\xbd\x34\xe5\xc6\x3f\x0c\xd2\x52\xee\x3b\x04\ +\x18\xb2\x65\xa8\x1c\xf8\x88\x0c\x27\x4f\x57\xb5\xa2\xc2\x0e\x79\ +\xed\x22\x49\x54\x50\x95\x00\x9c\x37\x29\x10\x42\x70\xe6\xed\xcb\ +\x20\xd6\x77\xf1\xd8\x43\xa7\x30\x34\x34\x64\x5c\xd7\x29\x97\x49\ +\xe1\xd4\x2d\x93\x48\xa7\x2c\xbc\x3b\xb5\x8a\x06\xa5\xdb\x7a\xe1\ +\x88\xe2\xed\x54\x37\xf9\x42\x86\x21\xf8\x7a\x2a\xf0\xc4\x83\x54\ +\x78\x53\x4f\x01\xb2\xa6\x00\xa5\x9e\xe0\x2c\x1f\x0a\xe5\x4b\xb4\ +\x52\xdf\x41\xb6\x01\x56\xab\x53\x54\xeb\x75\x14\xca\x75\xa4\x18\ +\x6b\xab\x8b\x69\x22\x72\x68\xf0\x7d\x40\x80\x48\xaa\xa0\x85\x27\ +\x38\xbc\xa5\x0a\x08\x0e\x77\xc5\xf6\xeb\x2c\xbb\x74\x4e\x76\x16\ +\x70\x4a\xbf\x93\x5c\x33\x88\x30\x14\xfd\x61\x3e\x84\x04\xef\x3e\ +\xd7\x6a\xf4\x06\xa2\x36\x61\x39\xf9\x6b\xa6\xcb\x67\x8a\xdd\x84\ +\xaa\x54\x98\x42\xe1\xea\x0b\xe8\xdd\x7f\xb7\x0d\xe0\x0a\x80\xc7\ +\x00\x8c\xea\x2f\x10\xc5\xfc\xc2\x0a\xe6\x17\x96\x30\x36\x32\x80\ +\xfe\xfe\x5e\x63\xde\xb9\x4c\x0a\x93\x23\x3d\x20\x84\x60\x79\xbd\ +\x84\x46\x83\x6e\x9b\x75\xc5\x5b\x53\x6c\xb3\xce\x0f\x54\xc4\x09\ +\x90\x22\x26\x48\x91\xe6\x21\xc5\x2c\xa6\x4e\x84\x7a\x84\x42\x4a\ +\x4c\x2b\x7c\x21\xcc\xf9\x78\x7f\xc1\x57\x37\xd6\xcb\x43\xd4\xe1\ +\x83\xa2\xfd\x05\xd5\x01\xa5\xce\x6a\x0f\xe5\xaa\xb3\x38\xe0\x66\ +\xb9\xe6\xfa\x33\xa9\x7f\xde\xc4\x22\xcc\xe6\x19\xce\x17\xee\x27\ +\x8d\xb3\x8e\x04\xcb\xc9\x0b\xf7\x96\x0b\xe2\xaf\x8c\xf3\x2f\x65\ +\x43\x64\x57\x3e\x21\x62\x2a\x11\x96\x94\x23\x31\xef\x54\x17\x86\ +\x2a\x28\x06\x30\x04\xee\x35\x21\x8e\xf2\xe1\x6c\x7a\x9d\xe8\xec\ +\x82\xb1\xc1\x2e\x8c\x0d\xaa\x66\xb6\x11\xac\x6d\x6c\xe2\x95\xd7\ +\xdf\x46\xa9\xa4\x1c\x58\x4d\x01\x7c\x11\xc0\x4b\x85\xab\x2f\x60\ +\x3b\xc5\x8a\xa1\xfb\x1a\x80\xdf\x00\x70\x36\x4c\xf1\xfc\xa5\x69\ +\x7c\xfe\x2b\xdf\xc2\x3b\xe7\x2e\x98\x77\xd5\xa0\x40\x2e\x9d\xc2\ +\xed\x37\x8e\xe1\x9e\xa3\x93\xe8\xce\xa7\xb7\x65\x9a\x0c\x37\x04\ +\xc1\x0f\xe4\x23\xc5\x26\x9f\xdc\xc3\x17\x11\x52\x6c\x39\x42\x73\ +\x50\x0b\x29\x36\x9d\x00\x4b\xef\x88\x5d\xdd\x93\x78\xe9\x34\x80\ +\x22\x90\x01\xc5\xc2\x09\x3e\x9c\xc4\x38\x05\x0e\x44\x02\x69\xff\ +\xf8\x84\x62\x7e\xb6\xdb\xe9\xb2\x5e\xac\x62\x61\xad\x84\x99\xe5\ +\x22\x66\x97\x8b\x58\x5c\x2b\x63\xbd\x58\x45\xa5\xd6\x70\x3a\x64\ +\x5c\x4c\x71\xc3\x2b\x3c\xf0\xf9\x17\x55\x65\x12\x8a\x2f\xa1\x0b\ +\x3c\x31\xad\xda\x37\xae\x63\x87\xdf\xa9\xa6\xed\x54\x64\xd2\x13\ +\x45\x98\xe4\x53\x63\xac\x2e\xee\x53\x23\xde\x64\x66\x76\xc2\xb4\ +\xff\x47\xdd\xd5\xa8\x5a\x1c\x58\x65\xa5\xf3\xd1\x95\x3b\x24\xa1\ +\x16\x15\xe0\x5b\x55\x00\xf0\x36\x80\x1f\x01\xb8\x05\x86\x65\x5c\ +\x08\x21\x28\x6c\x96\x70\xf9\xca\x0c\xba\x72\x19\x8c\x8d\x8d\x20\ +\x95\xd2\x17\x45\x08\xc1\xe8\x40\x17\x06\x7a\x72\x58\xde\x28\xa3\ +\x5c\x69\x6c\xa9\x65\x25\x59\x53\xaa\x66\x9d\xa9\xc9\xa7\x1a\x86\ +\xa0\xb2\xb4\x98\xb2\x44\x48\xf9\xb9\xea\x20\xe5\x9b\x4f\xac\x85\ +\xc1\x03\x33\x00\x92\x19\x50\xe0\xc2\xd8\x7a\xaa\xe1\x14\x54\x02\ +\x3e\x78\x88\xf7\xc7\xe4\x6a\xfe\x23\x3e\x50\x89\x02\x62\x62\x79\ +\x36\x75\x96\xf1\xa9\x54\x1b\x28\x55\xea\xd8\x2c\x39\x6b\x6c\x55\ +\x6a\x36\x6a\x0d\x1b\x36\xe5\x37\x99\xf7\xad\x1d\xa5\xc7\x5d\x61\ +\x8b\xf8\x96\x0c\xe1\xe3\x88\xda\xfa\x0a\x80\x26\xfe\x40\x11\x65\ +\xde\x01\x34\xfd\x62\x84\xbc\x88\x54\x06\x15\x00\xc7\x5d\x7b\xca\ +\x9c\xa5\xd6\x57\xa7\x8e\x1c\x1d\xec\xc2\xd8\x60\x37\xa7\x4c\xdd\ +\xe7\x2b\xd4\xa2\xa2\xf4\x4b\x5d\x93\xb7\xbe\xb4\xf2\xd6\x97\xb1\ +\x9d\x12\x09\x54\x00\x07\xab\x2b\x00\xbe\x0b\x60\x3f\x9c\x09\xc9\ +\x4a\xab\x8c\x10\x82\x72\xa5\x8a\xcb\x57\x67\x00\xbb\x81\xc9\x89\ +\x51\xa4\x33\x19\x63\x19\x83\xbd\x39\x8c\x0e\x74\x63\xad\x58\xc5\ +\x66\xa9\xb6\x25\x17\x20\xac\xc9\xa7\xb2\x62\x44\x48\x31\x2a\xfa\ +\xe6\x20\x53\x16\xf7\x3d\x8a\x25\xa5\x6b\xea\x09\x56\x94\x0f\x11\ +\xa6\x3e\x6c\x13\x0f\x4c\x98\xca\x7a\x92\xe0\x24\x82\x89\x01\x92\ +\xfa\x62\x1a\xfe\x8c\xaa\x02\xbc\xd8\x38\x12\x58\x08\x8d\x06\x45\ +\xa5\xd6\x40\xb9\x52\x77\x9b\x8a\x75\x94\x2a\xce\x88\x79\x6f\x45\ +\x0d\xaa\xba\x9e\x02\x5b\x54\xe3\xac\xfc\x28\x8d\xe3\x8a\x0f\x67\ +\x60\x26\x99\x3d\xbc\x09\xe4\xef\xa2\x2d\xe6\x2b\x0d\x59\x90\x1b\ +\x9f\x94\x49\x2f\xd6\xd6\x08\x27\xf0\x46\xdb\xd8\x60\x17\xc6\x06\ +\xba\xe5\x41\x1a\x51\x40\x05\x7c\xb1\xff\x86\x87\x5f\x5a\x78\xf1\ +\xbf\x6d\xa1\xe9\x20\x4b\xac\x29\x34\xb3\xcf\xfd\x3e\x00\x60\xf2\ +\xf4\xa7\xde\x06\xf0\x4b\x00\xa6\xe1\x4c\xa7\x51\x2e\xed\x42\x08\ +\x41\xa9\x5c\xc5\x9f\x3f\xf7\x32\xd6\x0b\x9b\x78\xe4\xc1\x7b\xd0\ +\xd7\xd7\x67\xdc\x85\x63\x7c\xa8\x0b\x0f\x9d\xd8\x87\x17\xce\xce\ +\xe1\xd2\xec\x5a\x47\x9b\x82\x51\x9a\x7c\x46\x48\xb1\xff\xb2\x4d\ +\x3e\xf8\x01\x1a\x48\x71\x2a\x88\x0a\x29\x95\x15\x15\x94\xcf\xd7\ +\x85\xd1\xe4\xce\x8b\xf0\x05\x6b\xce\x9f\x98\x61\xa4\x3d\xd4\xa5\ +\xe2\xcd\x03\x5d\x33\x89\xb5\x4a\xd9\xae\x7a\xfe\x1c\x02\xab\xa2\ +\xde\x70\xac\xab\x52\xd5\x83\x9a\x73\x1d\xd3\x29\x67\x9b\xb1\x4c\ +\xca\x72\xbf\xbb\x6b\xc8\x13\xc0\x22\xae\x9e\xe7\x64\x26\x42\x3d\ +\x0c\xc3\x06\x64\x0f\x13\x13\x4b\xe0\x3f\xd7\xa2\xe3\x5a\xe5\x65\ +\x12\xd7\xae\xa2\xde\x1a\xd0\x21\x43\x08\x82\xf9\x7b\x21\x83\x3a\ +\x4c\x56\x57\x4c\x39\xf0\xd4\x13\x78\xe3\x3f\x72\xb7\x68\xcb\x1d\ +\x34\x4d\xad\x9e\x30\xfb\xdc\xef\x63\xf2\xf4\xa7\xe6\x00\xfc\x26\ +\x80\x29\x38\xd3\x6a\x86\x54\xba\x84\x10\x34\x1a\x36\x7e\xf4\xca\ +\x59\x6c\x14\x8a\x78\xf2\xd1\xd3\x18\x1b\x1b\xd5\xc3\x8a\x02\x03\ +\x3d\x59\xdc\x7f\xeb\x1e\xf4\xe4\xd2\x78\xeb\xf2\x32\xea\x76\xa7\ +\x7a\x04\x05\x18\xb1\x20\x00\x03\x11\x46\x55\x4c\x2e\x41\x8a\x85\ +\x53\x70\x11\xc0\x7f\x15\xf2\x6f\x12\x52\x12\xa0\x44\x3d\xf1\x14\ +\x8d\x80\x22\x72\x98\x10\xa0\xd1\x88\x7e\x9d\x95\xe5\x0a\x2f\x33\ +\x15\x74\x08\xd3\xe3\xc7\xfa\xad\xbd\x6b\xe3\x9a\x24\x9e\x4f\x06\ +\xb6\xb3\xf9\x05\x6b\x9b\x78\xcd\xcd\xb4\xbb\x8b\x8f\x95\x72\xf7\ +\x4e\x74\x8f\x53\x29\xe2\xac\x29\xcf\xdd\x4f\x68\x76\x4b\x16\x68\ +\xe2\x1d\x2a\x9b\x9c\xac\x0a\x55\x46\x12\x30\x80\x63\xc6\x32\x70\ +\x30\x12\xfc\x58\xea\x35\x41\xc1\xe8\xc2\xdf\xda\xcd\xa6\x14\xf5\ +\x46\xb0\xbb\x92\xb7\x35\x9c\x07\xbc\xf0\x15\x71\x29\xf9\xf2\xc7\ +\x80\x14\x8f\x51\x25\x52\x3b\x29\x4d\xaf\x47\xe5\xc2\x6a\x03\xce\ +\x32\x2f\x53\x70\x96\x1f\x3e\x68\xb8\x7e\x38\x7b\xee\x32\x36\x8b\ +\x25\x3c\xf5\xe8\x69\x1c\x3c\xb8\x5f\x7f\x69\x28\xd0\x95\x4d\xe3\ +\xae\x9b\x27\xd0\x9d\xcf\xe0\xd5\x77\x17\x50\xae\xb6\xd7\x6f\x25\ +\x5a\x53\x6a\xab\x4a\x48\x23\x34\xf9\x88\x98\x40\xd9\xec\x90\xf7\ +\xfd\x63\xbf\xb7\x1f\x52\x62\x1a\xae\x62\x7a\x7d\xc5\xf9\x6b\xc1\ +\xa4\x83\x5d\x04\x91\x7f\xf5\xc5\x73\xa0\x1a\x68\x11\xae\x87\x4c\ +\x0b\x2c\xef\x54\xfd\xe6\x99\xbb\xfd\x99\xed\xec\xe0\xe3\x24\xf7\ +\x7a\x15\x83\x46\xb1\x65\x39\x2b\xcf\x12\xcb\xd9\x1c\x36\x45\xe0\ +\xee\x9d\x48\xfc\x3d\x14\x9d\xf5\xd3\xfc\xda\x20\x58\x03\x55\x7e\ +\x7f\xd9\x71\x53\x54\x88\x83\x10\xc7\x8e\xa3\x0a\x9c\xf3\x1e\x4c\ +\x78\xb8\xd8\xde\xa7\xed\xed\x37\xe9\x86\xb9\x7b\x4f\xda\xd4\xdb\ +\x38\x37\xd8\xfe\x6d\x65\xa3\xc7\x75\xa5\xf0\xc3\x32\x08\x21\xb0\ +\x23\x6c\x84\x9a\x12\x67\xc6\x07\x03\x53\xb6\x0c\x56\x2d\xad\xf0\ +\xe9\xc2\xaa\x06\xe0\xbf\x03\x98\x81\xb3\xeb\xcc\x49\x9d\x3e\x21\ +\x04\x57\xa7\x17\xf0\x85\xaf\x7e\x1b\x8f\x3f\x7c\x0f\x6e\xb9\xf9\ +\x46\x58\xa9\x94\xd2\xba\xa2\x70\x4c\xf8\xe3\xd7\x8f\xa0\x3b\x9f\ +\xc6\x8b\x67\xe7\xb0\x51\xac\xb6\x71\xd9\x17\xde\x9a\xf2\x0f\x43\ +\x7a\xf9\xa4\x97\x97\x88\x59\x70\xed\xbd\xd6\x20\xc5\x15\x63\x80\ +\x54\x44\x2b\xca\x08\x28\x13\x9c\x54\x4d\x64\xdd\xf5\xd4\x8a\xdc\ +\xf5\x2f\x35\x07\xa9\x50\x2f\x01\x5a\x01\x9c\xdc\x6f\x21\xc0\x72\ +\xb2\x20\xfe\xd8\xa9\x60\x23\x6c\xaf\xf9\xe8\xf5\x8a\x39\x8e\x7b\ +\x37\x4b\xb7\x38\xaa\xdc\x95\x9b\xbd\x9f\xec\x33\xc1\x1e\x4b\x23\ +\x38\xdd\xc3\x00\x61\x2e\xa4\x18\x0b\xc7\x76\xcc\x20\xd8\x34\x80\ +\x6b\x00\x28\x0a\xdb\x76\x80\xe4\x6d\x86\x0b\xc6\x2a\xe2\xc7\x78\ +\x05\x25\x78\xe7\x13\x67\xaf\x4a\xcd\x7d\x63\x7f\xba\xa9\xf0\xa9\ +\x38\xd9\xf6\x4b\xcb\x4b\x11\xbb\xb0\xa2\x00\xbe\x01\x67\x2e\xe0\ +\xbf\x01\xf0\x04\x34\x4f\x2e\x21\x04\x4b\x2b\xeb\xf8\xea\x37\xbe\ +\x87\x8d\xc2\x26\xee\xba\xe3\x38\x32\x99\xac\xf6\x42\x12\x42\x70\ +\x78\xef\x20\xba\x73\x19\x3c\x7f\x66\x16\x8b\x6b\xa5\x96\x2d\x2b\ +\xdf\x9a\x32\x5a\x55\x31\x9b\x7c\x4c\x84\xdc\xf4\x0b\x8e\xc4\xb2\ +\xbd\x73\xe4\xeb\x16\x36\x44\x41\x84\x94\xd9\x8a\x8a\x06\x28\x19\ +\x4e\xea\xcb\x2c\x53\x2b\xda\xed\x20\x0a\x6b\x2a\x38\x60\xeb\x1f\ +\xc0\x49\x01\x2d\x09\x58\x41\x93\xd0\x7f\xa5\x28\xb3\xb4\x1d\xf1\ +\x5a\x97\xee\x6e\x31\x08\xdc\x50\xc4\x9b\x46\xe3\xdd\x47\x0a\x04\ +\x83\x43\xfd\xb6\x9e\x72\xd9\x61\xe7\xab\xcd\x81\x2d\x68\xb2\x31\ +\x63\xa6\x14\xcd\xb9\x60\x98\x83\x46\x87\x2d\x8b\x0a\x79\x33\x50\ +\xd2\xbe\x33\x91\xee\x47\x44\xa1\x46\x48\x6d\x59\x53\x30\xce\x38\ +\x2a\xad\x78\x4e\x76\x00\x2f\x03\xf8\x2b\x00\xfe\x07\x80\xaa\x4e\ +\x9f\x10\x82\x42\xb1\x8c\x3f\xfb\xce\x8b\xf8\xd6\x9f\x3f\x8f\x62\ +\xb1\x18\x6a\x29\xed\x1d\xed\xc1\xc3\x27\xf7\xe1\xc0\xb8\x79\x10\ +\x69\x34\x91\xe1\xe2\x56\x8c\xfd\x60\x34\xa2\x36\xf9\x34\x7e\x29\ +\x88\xf9\xb2\x60\x8a\x06\x29\xef\x57\x5b\xea\xd5\x33\x40\x8a\x80\ +\xaf\x0f\x01\xef\x5c\x0f\x9a\x3e\x84\x0f\xe3\x20\x45\xfc\x08\xcf\ +\x59\x2d\x0e\xf4\x8c\x73\xd5\xfd\x3f\xa6\x2c\xe6\x0b\xaf\xc7\x9f\ +\x80\xf3\x1f\x13\x46\xfc\x7b\x23\x9c\xaf\x7f\x9d\x14\x4d\x67\xe1\ +\x7e\x99\x57\xb5\x10\x7e\x78\x0c\xf7\xca\xab\x5b\x70\x3a\x41\x2f\ +\x2d\x1f\x27\x7c\x67\x74\xbc\x53\xe1\x9e\x15\xc9\x62\x57\xff\xd8\ +\x75\x58\x88\xe2\x53\xbc\xfd\x1d\xad\x4d\xe4\xe1\x09\x61\x52\xb8\ +\xfa\x82\x3b\x84\xe1\xae\x35\x50\xfa\x6d\x10\x92\x02\x70\x3b\x34\ +\xab\x2d\x78\x4e\xf6\xe9\xd9\x05\xac\xaf\xad\x63\x72\x62\x04\x5d\ +\x5d\x5d\xc6\x32\xba\xf3\x69\xec\x19\xee\x41\xa5\x66\x63\x75\xa3\ +\x02\xbb\x89\xab\xa3\x1f\x8e\xa0\x80\x11\x6b\xce\x43\xd4\x91\x9b\ +\x83\x26\xbf\x94\x6a\xac\x54\xa8\x4f\x8a\xb3\x9c\x08\x1f\xef\x43\ +\x06\x7e\x1d\xc4\x97\xd6\x4b\x4c\x88\x1a\x50\x1c\x68\x45\x38\xf9\ +\xc3\x12\xc4\x38\xf1\x82\xb2\xd0\x21\x86\x3f\xfd\xcd\xe2\xe1\xc5\ +\xbf\x03\x32\xc7\x42\x80\xc5\xa6\x16\xaf\x29\x7b\xde\x1d\x80\x95\ +\xca\x8a\x65\xeb\x21\x02\x53\xf9\xac\x31\x67\x2e\xfd\xe8\xb1\x0f\ +\x07\xc4\xef\x7a\xd9\x33\xd2\x83\x3d\x23\x3d\xf2\x75\x27\x04\xa5\ +\x52\x19\xaf\xbd\xf9\x8e\x71\x1c\xd5\xe6\xd4\x8f\x5e\x42\x60\xd4\ +\xb0\x77\x52\x4c\xd0\x31\x58\xb5\xc5\xa2\x62\x65\xf6\xb9\xff\x80\ +\x67\xfe\xfb\x7f\x58\xb6\xeb\xe5\xdf\x02\xe8\x3f\x00\x30\xaf\xd3\ +\x25\xc4\x71\xfc\xbd\x76\xe6\x3c\xbe\xf8\xd5\x6f\x63\x7a\x7a\xd6\ +\xf8\x2b\x41\x29\xd0\xd3\x95\xc1\xbd\xc7\x26\x71\xe2\xf0\x28\xb2\ +\x69\xab\xf5\xe1\x0b\x44\xf3\xa9\x52\x13\x21\xc5\xc6\x1a\x20\xc5\ +\xea\xa9\x86\x44\x44\x83\x14\xff\x9c\x2a\x27\x30\x6b\xac\x28\x3f\ +\x3a\x22\xa0\x14\x03\xc9\x99\x68\x01\x40\x91\x6d\x2b\x7e\xc0\x27\ +\x07\x30\x51\x93\x01\x9f\x64\x69\x85\x01\x4b\x1a\x5b\xc6\xdf\x13\ +\xd5\xf5\x12\xef\x5b\x1c\x58\xf1\xf7\x50\x78\x2e\x84\xce\x0e\x22\ +\x1d\xb0\xd7\x86\x29\x57\x65\x45\x89\x10\xdb\x32\xab\x8a\xea\xc0\ +\xa4\xb3\xae\x3a\x52\xa3\xb6\x83\x0a\x00\xf9\xaf\x47\x08\x99\x7f\ +\xe1\x0f\xca\xd5\xb5\xe9\x7f\x0f\x6a\xff\x0a\x80\x77\xc2\x12\x39\ +\xd3\x6e\xbe\x89\x73\xe7\x2e\xc0\xd4\xdc\xa5\x14\xc8\xa6\x53\xb8\ +\xfd\xc6\xf1\xd8\xd3\x6e\x94\xd6\x14\x14\x0f\x81\x7b\xa0\x1a\xd8\ +\x09\x46\x93\x7f\x90\xf8\x4f\xf6\xa9\x54\x35\xe9\xa0\xaa\x8b\xe6\ +\x17\x97\xcf\x8e\xf8\xf5\xd2\xbf\x74\x0a\x2b\x4a\xac\x37\x17\xc6\ +\x34\xeb\x14\xd7\x8c\x87\x92\xee\xe2\xb2\x80\xe1\xff\xcc\x8f\x2e\ +\x0f\x2e\x51\x37\x80\x53\x04\x60\xb1\xf7\x53\xea\x11\xe5\x9b\x82\ +\xcd\xc2\x4a\xf7\x2c\x71\x97\x97\x03\x25\x4f\x4d\xee\x99\x63\x80\ +\xa4\xbf\xa8\xe0\xf2\x56\xfe\x7a\x74\x5e\xa2\xc0\xca\x58\xcb\x56\ +\xa5\xdd\xa0\xe2\x28\xbb\x7c\xe6\x8b\xf6\xd2\xeb\x7f\xf4\xc7\xb4\ +\x51\xfb\x45\x00\x3f\x30\x26\x24\x04\x73\x0b\x2b\xf8\xe2\xd7\xbe\ +\x83\x97\x5f\x79\x13\x76\xc3\xbc\xb1\x83\x65\x11\x1c\x3d\x38\x8c\ +\x07\x8e\xef\xc3\x60\x5f\xae\x39\xcb\x2a\xe6\x65\x96\xad\x2a\xe7\ +\x0b\xdb\xe4\x0b\x74\x09\x17\x44\x0c\x0f\xb9\x04\x29\x01\x8e\x3c\ +\xa4\xc0\xbf\x17\x44\xf5\xb2\x69\xac\x28\x11\x50\x4c\xd3\x8e\xbf\ +\x17\x01\xa0\x54\x17\x41\x09\x24\xee\x2a\xf1\x7f\x04\xd0\x43\x4c\ +\xca\x5e\x0d\x2d\x1d\xb0\x58\xb2\x88\xd6\x95\xd2\x77\x25\xc0\x8a\ +\x6f\xbe\x7b\xd7\x8f\x39\x57\xc3\x8f\x0d\x7f\xdb\x79\xdf\xa5\xb2\ +\xa3\x46\x02\x1e\xff\x83\xa4\xfc\x81\x34\xfd\xa0\x6e\x99\x55\x25\ +\x9f\xb2\x21\xac\x23\xb0\x6a\x27\xa8\x54\x15\x25\xb5\xcd\x25\x6b\ +\xee\x87\xff\xf9\xbb\x76\xad\xfc\x0b\x00\xfd\x02\x80\x86\x36\x03\ +\xe2\x0c\xe9\xff\x93\x6f\x3e\x87\xef\x7d\xff\x45\x54\x2a\xe5\x50\ +\x27\xfb\xc1\x89\x3e\x3c\x7c\x62\x3f\x26\x47\xba\x8d\xdd\x0e\xb1\ +\xac\x29\x08\x0f\x0b\x91\xf5\xfd\x53\x64\x9e\x56\x89\x57\xc2\x03\ +\xc9\xd5\x83\x0d\x17\x20\x25\x45\x69\x81\xa6\xb2\x1a\xc4\xaa\x89\ +\x80\x72\x53\x1b\xac\x27\x91\x10\x32\x90\x88\xf6\x4f\x0c\x41\x98\ +\xbe\x01\x5c\x01\xb4\xc0\xe7\xc4\x00\x4b\x6b\x5d\x71\x20\x0a\x03\ +\xbe\x19\x56\xfc\x57\xcd\x0f\x93\x04\x32\xfe\xd9\x60\xb3\x12\x7f\ +\xf0\xb4\x12\x19\x01\x1d\x24\x55\x30\x87\xc7\x54\x8b\x8e\xc3\xaa\ +\x5d\xa0\x0a\xab\xa8\x35\xff\xe2\x1f\x9c\x6d\x94\xd7\x7f\x05\xd4\ +\xfe\xff\x00\x94\xb5\x19\x11\x82\x52\xb9\x86\x3f\x7f\xee\x65\xfc\ +\xe9\x9f\xfd\x05\x36\x36\x36\x42\x61\xe5\x4c\xbb\xd9\x8f\xeb\xf7\ +\x0c\x44\xff\x75\x61\x6a\xa8\x7c\x70\xf4\x4f\x2a\xff\x0c\x2a\xd5\ +\x75\xbf\x7c\xb2\x25\x40\x84\x97\x25\x08\x23\x91\x5e\x2c\xbf\xee\ +\x4a\x4b\x40\x78\x01\x19\x2b\x8a\x0f\x92\xad\x27\x13\x98\x74\xd6\ +\x11\x21\x92\xaa\x51\x57\xce\x5b\x07\x2d\x03\xb0\xd8\x5c\x58\xeb\ +\x8a\xbb\x5e\x41\x64\x33\xb0\x52\xf9\x03\x03\x06\xc9\x0f\x9c\xda\ +\x9a\x92\x7e\x79\xe4\x72\x23\x38\xd6\xb7\xc9\xaa\xda\x76\x58\xb5\ +\xa3\xd7\x2f\xea\x49\x90\xe2\xec\xeb\x85\x4c\xdf\xe4\x77\x53\xd9\ +\xde\x2a\x21\xd6\x9d\xd0\xac\x1a\x4a\x88\x33\x46\x64\x66\x7e\x09\ +\xcb\xcb\x2b\x98\x18\x1b\x46\x4f\x4f\x0f\x4c\x92\xcf\xa6\xb0\x67\ +\xb8\x07\xb6\x4d\xb1\xbc\x5e\x86\x6d\x43\xb8\x89\x44\x02\x40\x58\ +\x4f\x9f\xf6\xe1\x61\xc8\xc6\xe9\x80\x81\x91\x00\x27\x39\x4e\xd7\ +\xb3\xc8\x97\xc9\xeb\xe9\x5e\x28\xe6\x45\x12\xea\xc9\xe9\x09\x56\ +\x94\xe4\x77\xe2\x20\x21\x58\x49\x1a\xab\x47\xff\x48\x44\x50\x94\ +\xac\x29\x35\xb4\xd8\x04\x12\xb0\x78\x93\x4a\xb2\xae\xe2\xc0\x0a\ +\xca\x6b\xcb\xdf\x7b\xe5\x8f\x95\xca\x5f\xe5\xd7\x57\x4a\x26\xd4\ +\xc1\x70\x09\xa3\x7c\x4a\x09\x64\x69\xad\xd7\xcf\xfe\xf2\xe6\xf4\ +\x4b\x62\xaf\x9f\xae\x26\x1d\x83\x55\xab\xa0\x8a\x4b\x5a\x52\x5e\ +\x7c\xa7\x0a\xbb\xf1\x83\x6c\xdf\xe4\x0c\xb1\x52\x77\x02\xe8\x37\ +\x15\xb0\xb8\xb4\x86\x99\xd9\x79\x8c\x0c\xf5\x63\x60\xc0\xa8\x8a\ +\x4c\xca\xc2\xc4\x70\x0f\x32\xe9\x14\x96\xd6\x4b\xa8\xbb\x0b\xf1\ +\x69\x97\x71\x21\x1a\x58\xf8\x0f\x74\x04\x90\x41\x9f\xbf\xd2\x9a\ +\x52\xfd\x9a\x0b\x3d\x7c\x92\x65\x14\xe1\x57\x9f\xfd\xb5\xf7\x00\ +\x10\x44\x08\x0d\x56\xc1\x82\x52\x59\x38\x2c\x9c\x54\x2f\x45\xd8\ +\x50\x04\xd6\xcf\xa5\xfc\x53\x3c\xbb\x3a\x68\xe9\x80\xc5\xb2\x23\ +\x00\x16\x0f\x81\x38\xb0\xe2\xae\x9f\xe2\xe9\x35\x39\xd7\xd9\x73\ +\x10\x9f\x01\x21\x52\xed\x7e\x50\xfd\xe8\x45\xb2\xaa\xc4\x1f\x64\ +\x59\x5a\x03\x55\xe3\xcb\x9b\xd3\x2f\xbd\xcc\xdc\x10\x18\x3e\x11\ +\x51\x27\xb6\xb4\xd2\xf4\x6b\xb6\xd2\x64\x73\xe6\x95\xfa\xf2\x9b\ +\x9f\xfb\x1f\x76\xad\xf4\xcb\x00\x7d\xdd\x58\x08\x09\xa6\xdd\xbc\ +\xf9\xd6\x3b\xa0\xd4\xd6\x36\x05\xd9\x69\x37\xa7\x6f\xdd\x83\xbe\ +\xee\x0c\x93\x8f\x58\x11\x55\x35\x85\x87\x80\x08\x9f\xaa\x93\xd4\ +\x98\xf4\x4a\x48\x29\xae\x9e\xaa\x87\xcf\x0b\x88\x07\x29\xe2\x57\ +\x94\x08\x75\xe0\x99\x25\x5b\x50\xcc\xad\xd1\xc2\x29\x6c\x48\x41\ +\x6c\x11\x41\x26\x14\xa8\x84\x27\x11\x2f\x91\x00\x5c\xff\x1a\x32\ +\xbe\x2b\x5f\x4f\xd4\x89\x0a\x2b\x8d\x73\x5d\x73\x8f\xc5\x73\xe0\ +\x3e\xa5\xfb\xaf\x22\x22\xf3\x3d\x92\x55\xa5\x7e\x8e\xdb\x28\x51\ +\x6d\xbb\x8e\xc2\xaa\x59\x50\x11\xcd\x71\xd4\xca\x92\xda\xe6\x12\ +\xe6\x5f\xfc\xaf\x7f\xd2\x28\x6f\xfc\x55\x50\xfa\x2d\x18\xc6\x24\ +\xb0\xd3\x6e\x9e\x7f\xe1\x55\xd4\x6a\xe6\x39\x7f\xde\xb4\x9b\x87\ +\x4e\xec\xc7\xe8\x40\x17\xbf\x56\x90\xa2\x36\x44\x38\xd6\x9e\x8a\ +\x44\x2d\x22\x67\x17\xe1\xe1\x54\xf9\xa5\xc4\x97\x27\x3e\xa4\x20\ +\xeb\x70\x3f\xe6\x3c\x0c\xc2\x20\xe0\xa7\xd1\xf4\xfe\xf9\xf6\x0e\ +\x89\xf9\x27\x5e\x13\xf6\x3c\x4c\xce\x7c\x43\x5d\x95\xd6\x15\x6b\ +\xfd\x48\xd7\x5d\xbe\xde\x46\x58\xa9\x9c\xeb\x0a\x90\x99\x9a\x80\ +\xca\xfb\x2c\x7e\x2a\x7f\x18\x75\x56\x95\xe6\xb3\x23\xac\x6a\x0b\ +\xac\xa0\x39\x8e\x24\xcd\x80\x2a\x0a\xc2\xc3\x48\xea\x3d\x3e\xa9\ +\x85\x97\xff\xe7\xcb\xb5\xcd\xf9\x4f\x81\xda\x9f\x06\xa0\x5d\x2d\ +\xcf\x5b\x35\xf4\xcf\xbe\xf3\x42\xac\x69\x37\x0f\x9d\xdc\x8f\xfd\ +\xc2\xb4\x1b\xf1\xe6\x2b\xc3\x89\xe9\xe1\x11\x3e\x4d\xbf\x8e\x21\ +\xe6\xbe\x94\x1f\x0b\x1e\xc8\x65\x87\x43\x8a\xc8\x3a\x8a\x66\x9e\ +\x1e\x50\x6a\x38\x89\x60\xd2\x7a\xcf\xc3\xfe\xdc\x74\xe2\x74\x1c\ +\xfe\x5e\x43\xae\x03\x57\x4f\xf6\x9a\x06\xd7\x53\xbb\xcb\x34\xf3\ +\x4f\x3c\x58\xf1\x95\x12\xe1\xa1\x7a\xba\xc5\x67\x82\xfb\x51\x12\ +\xca\x6d\xcd\xaa\x8a\x92\x47\x5b\x25\x0c\x3c\x61\x56\x53\x14\x6e\ +\x68\xa5\x19\x1f\x55\x5c\xba\xea\x28\xeb\x7f\x2f\xcd\xbf\xb5\x96\ +\xee\x1e\xfa\x4e\x2a\xdf\x9f\x26\xc4\x3a\x09\x40\xb9\x14\x28\x21\ +\x04\xb6\x6d\x63\xca\x9f\x76\x33\x6a\x9e\x76\x43\x9c\x69\x37\x93\ +\xc3\xbd\xa8\xd6\x6d\xac\x16\x2a\x7e\x3e\xce\xa7\xa3\x24\x37\xd1\ +\x14\xbf\xa6\x44\x13\x1e\x29\xbf\xe0\x1f\x75\x9c\xde\x79\x0e\x95\ +\x1e\x5b\x1f\xf0\x16\x07\xfb\xe2\xb3\x8e\x75\xb6\x7e\x5e\x68\xd4\ +\x9e\x35\x35\x98\x14\x18\x22\x86\x3f\xe1\xa6\x73\x8f\x81\x11\x5a\ +\x6a\x7f\x9a\x0e\xb4\xea\xe5\x9b\xe3\xc1\x8a\xbb\xbe\xc2\x8f\x84\ +\x74\xed\xc1\xe7\xa9\x34\x69\x88\x94\x5c\xfe\x34\xfe\x30\x0a\x65\ +\x09\xe9\xa1\x39\xf6\xa4\x25\x1f\x95\xdd\xf8\x8a\xeb\xa3\xb2\x84\ +\x22\x4c\xd6\x53\x14\x16\xc4\x92\xb8\xa0\x8a\x0a\xa3\x30\x48\x89\ +\x9f\xa4\xbc\x7c\xbe\x04\xbb\xf1\x5c\xb6\x6f\x7c\x95\x58\xe9\x3b\ +\xe0\x6c\x7a\xaa\x14\x4a\x81\xf9\x45\x67\xb7\x9b\xf1\xd1\x41\xf4\ +\xf5\xf5\x19\x6b\x9b\xcb\xa4\x30\x39\xdc\x03\xcb\x22\x58\x5e\xaf\ +\xa0\x61\x53\x67\x03\xcc\x30\x08\x49\x0f\xab\xc1\x39\x2e\x84\x1b\ +\x75\x84\xb2\xfc\xaa\x2a\xca\xe3\x1f\x5c\xc5\x8b\xc2\x90\x4b\x7e\ +\x61\x19\x90\xb1\x16\x06\x47\x8c\xf0\xb1\x4a\x12\x98\x44\x66\x49\ +\x04\x92\x91\xa4\x30\xaa\x04\x2d\x19\x5a\x5c\x72\x15\xb0\x98\x9b\ +\xac\x85\x95\xe2\x1a\x87\xc1\x4a\x35\x56\x4e\x7a\xa0\x15\x01\xda\ +\x1f\x2e\xf1\x81\x64\x2b\x4c\x84\xf0\x38\x86\x87\xd8\xd4\x14\x80\ +\xe8\x49\x6b\xa0\xaa\x7f\x75\x73\xfa\xe5\x97\x35\x15\x0b\x0b\x53\ +\x85\x37\x05\xad\x38\x4d\xbf\xb0\x0a\x98\x0a\x8f\x42\x5a\x6b\x73\ +\xe6\x95\xf2\xf2\x99\xaf\xfc\x27\xbb\x56\xfc\x75\x80\xbe\x1b\x56\ +\xa1\xf3\x97\xa6\xf1\xb9\x2f\x6b\xa6\xdd\x30\xcf\x01\xa5\x40\x36\ +\x93\xc2\xc9\xc3\x63\xb8\xe7\xe8\x84\x33\xed\x26\xd2\x69\xca\x0f\ +\xac\xf3\x35\xfc\x21\x33\x0e\x30\x15\xce\xbe\x33\x90\x82\xac\x03\ +\x48\x7a\x66\x40\xf1\x70\xe2\xc9\xe2\x5a\x34\xca\xff\xa2\xc5\xaa\ +\xc0\xc5\xe5\xad\x70\xdc\x73\x3e\x2c\x85\x75\xc5\xe9\x85\x58\x4e\ +\x66\x58\x41\x73\x2f\x14\xbd\x6f\x86\x57\x4f\xf2\x59\x9a\xac\x2a\ +\x5d\xf9\xd2\x0f\x69\xd8\x5b\xde\xb4\xe1\x22\x89\x62\xa5\xe8\xa8\ +\xc0\x89\x03\xb1\x50\x89\x0a\xaa\x76\xc1\x28\x2c\x3d\xa9\x15\xe6\ +\xec\xf9\x1f\xfd\x8f\xcf\xd7\x4b\x6b\xbf\x0c\x6a\x1b\x37\x13\xf3\ +\xa7\xdd\x7c\xfd\xcf\xf1\xf2\xab\xe1\xd3\x6e\x52\x16\xc1\xcd\x07\ +\x86\x70\xff\xad\x7b\x30\xd8\x9b\xf3\x57\xd5\x51\x3e\x04\x8a\x87\ +\x42\xfb\xa9\x79\x08\x4d\x57\xc7\xb7\xd0\xfc\x03\xd3\xaf\x78\x2b\ +\x90\x62\x5e\x62\x12\xe4\x27\x5a\x1d\x4a\x40\x71\x70\x12\x70\xa3\ +\xb3\xaa\x22\xfc\x05\x60\x62\xc1\xc5\xc4\x71\x57\x43\x3d\x76\x4a\ +\x0b\x63\xe9\x3c\x99\xeb\xad\x6a\xe6\x29\xe2\xbd\x4c\xb5\x50\x88\ +\xd0\x04\xe4\x9f\x43\xcd\xf7\xa6\xfd\x4c\xdc\xd5\xe1\x42\xc4\x67\ +\xb2\x0d\xc2\xdf\x0e\xa1\x98\x88\x9f\xfa\x13\x88\x08\xab\xb8\xce\ +\xf4\x66\x2b\x18\xcf\x54\xa4\x36\x59\x7c\xe5\x7f\x7d\xbf\x5a\x98\ +\xfb\x25\x6a\x37\xbe\x0a\x40\xbb\x3f\x3c\x21\x04\x6b\xeb\x9b\xf8\ +\x93\x3f\x7b\x0e\xdf\x7b\xee\x45\x54\x2a\x15\x10\x8b\x28\x33\xf6\ +\xe4\xe0\x44\x1f\x1e\xba\x6d\x1f\x26\x86\xbb\x23\x9c\xaa\xfb\x3d\ +\x86\x35\x65\x74\xa0\x43\xf1\x52\x40\x78\x29\xb8\x67\x96\x7d\x29\ +\xc4\xa2\xa2\x40\x0a\x46\x4b\xc3\x08\x28\x01\x4c\x1c\x70\x84\x33\ +\x8f\xfa\xa7\x4a\x28\x41\x8b\x0b\xe7\xcf\x95\xbb\x6a\x9a\xe6\xad\ +\x7f\x0e\xc2\x35\x92\x60\xe5\x69\xeb\x78\x21\x02\x41\xf1\xa3\x65\ +\x7a\x25\xb5\x3f\x64\xb1\xac\x2a\x9d\x7b\xc2\x94\x48\x53\xa1\xd6\ +\x25\x8e\x95\xd4\x2c\xc4\x94\x12\x05\x54\x51\xa0\x13\x35\x6d\x9c\ +\x93\xb1\x96\xdf\xf8\xfc\xd9\xca\xf2\xbb\xbf\x46\xed\xda\x7f\x05\ +\x50\xd1\x16\x42\xdc\x69\x37\xdf\x57\x4d\xbb\x21\xca\x5a\x8c\x0d\ +\x75\xe1\xc1\xdb\xf6\xe2\xba\xc9\x7e\xce\x11\x1a\xd9\x8a\x0a\x92\ +\xf0\x9f\xaa\x13\xd7\x24\x56\xc2\x49\xf5\xab\xee\x27\x61\x5f\x96\ +\x26\x21\xc5\xe6\x17\x0a\x28\x2f\x82\x3f\x15\xe2\x69\x78\x7e\xa3\ +\x18\x7f\xda\x6d\xb7\x04\x68\xa9\xac\x2c\xef\x20\xdc\xba\x12\xcf\ +\x5d\x03\x2b\xc6\xf2\x62\xad\x30\xfe\xde\x08\x2f\xbf\x08\x10\x31\ +\x0d\x7b\x5f\x5a\xb2\xaa\xc2\x44\x3f\x00\xb4\xbd\xe2\xaf\x9b\x1a\ +\xc7\x4a\x42\x88\x0e\x89\x9b\x36\x8a\x33\x3d\x2e\x21\x9b\xfd\x54\ +\x85\x59\xe5\xe5\x0b\x05\x50\xfa\x17\x99\x9e\xb1\x2a\xb1\xd2\xb7\ +\x03\xc8\x29\x2b\x49\xbc\x69\x37\x8b\x58\x5e\x5e\xc5\xe4\x38\x33\ +\xed\x46\x04\x8f\xfb\x70\xe4\xb3\x29\x4c\x0e\xf5\xa0\x41\x29\x56\ +\x37\x2a\xa0\x34\x78\x59\x83\x5f\x2f\xc5\xc3\x49\x98\x87\xc3\x7b\ +\xb1\x7d\x60\x69\xc2\x35\xf9\xe8\x75\x98\x47\x51\xac\x47\x04\x48\ +\xb1\x56\x85\xb2\xeb\x9e\xb1\x2c\x24\x40\x09\x26\x90\x7f\x28\x76\ +\xe3\x41\x88\x0f\xf9\xe3\x13\xc8\xe0\x62\xe3\x95\xc0\x62\x14\xd4\ +\xd6\x15\x7f\x0d\x98\x5b\x2d\x5c\x67\x39\x9e\xb7\x52\x44\x58\x89\ +\xe5\x6b\x9e\x56\x62\x88\x22\x9a\x4f\x6d\x56\x02\xfc\xcc\xca\xdc\ +\x49\xb0\x65\x50\xda\x9a\x33\x9d\xf2\xce\xf4\x76\xbc\xe3\xaa\x2b\ +\x18\x2a\x61\xa0\x8a\x0a\x97\xb8\xe1\x62\xbc\xa9\x0c\xab\xb6\x31\ +\x5b\xad\x6d\x2e\xbc\x90\x1b\xd8\x3f\x47\xac\xcc\xed\x20\x44\xd3\ +\xcd\xe7\xc8\xe2\xd2\x2a\x66\x66\x17\x30\x32\xd4\x8f\xc1\xc1\x7e\ +\x3e\x53\xee\x8e\x03\xd9\xb4\x85\x89\xa1\x6e\x64\xd2\x29\x2c\x6f\ +\x94\x51\xb7\x29\xac\x90\x1e\x3d\x7d\x38\xfb\x80\xcb\x26\xbb\x59\ +\x87\x39\x66\xf4\x64\x48\x69\xf4\xd8\x7a\x31\xa7\x68\x1c\x0c\xc9\ +\xea\x89\x2f\x83\x7f\x83\x18\x38\x09\x37\x8e\xb0\x79\x44\xf8\xd3\ +\xc2\xcb\xad\x98\xbf\x34\x2f\x13\xce\x01\x8b\x63\xa4\x07\x3a\xa6\ +\xbe\x11\x60\x15\x5c\x17\xee\xe4\x83\xeb\xc6\xdc\x1b\xfe\x4a\x04\ +\xd7\x89\xfb\xc1\x60\xc3\xd9\x7c\x45\x42\x09\xf9\xf0\x17\x3a\x94\ +\x5a\x7c\xf9\x50\x95\xaf\x12\x67\x9d\xfa\x36\x81\x4a\xd7\xfa\xd2\ +\x55\x21\x6a\x78\x18\xcc\x00\xb4\xbe\x7a\x42\x5c\x52\xc6\x3d\x29\ +\xbf\x9e\xd5\xb5\xa9\xda\xe2\x6b\x9f\xf9\x9f\xf5\xf2\xea\xaf\x81\ +\xda\x67\x8c\x95\x22\x04\x57\xa6\xe7\xf1\xf9\xaf\x7c\x0b\x6f\x9c\ +\xf1\xa6\xdd\xc8\x55\x23\x08\xa6\xdd\x1c\x3b\x34\x8c\x53\x47\x27\ +\xd1\xd7\x95\x71\xd6\xb6\xd2\xfd\x24\x4a\xd5\x54\x54\x59\x73\x36\ +\xc2\x0f\x9f\x16\x52\x7a\x67\x2d\xaf\x17\x75\x29\xe3\xa0\x4c\x1f\ +\x3d\x92\x15\x25\x59\x50\x82\xe5\xa4\x06\x13\x61\xf2\x34\xff\x17\ +\x50\x86\xc9\x57\x80\x97\x7f\x22\xa2\x95\xc5\x01\x8b\xb9\x66\xee\ +\x41\x1c\x58\xa9\xc6\x95\x05\x6a\xfc\xf9\xf2\xf7\x88\xfb\xa5\x80\ +\x90\x89\xf2\x5e\x35\x67\x55\x85\x3c\x5b\x5a\x31\x97\xdd\xa2\x98\ +\x0c\x0a\x93\x6e\x94\xf0\x48\x62\x02\x55\x54\xf2\xc5\x35\xfb\xa2\ +\x5c\x43\xa5\x25\x66\xd7\x4a\x58\x7c\xe5\xd3\x7f\x5a\xdd\x98\xfb\ +\x15\x4a\x1b\xdf\x45\x84\x69\x37\x5f\xf9\xfa\x77\xf1\xc3\x1f\xbe\ +\x82\x5a\xad\xe6\x5b\x4a\xca\x0b\x41\x08\x6e\xd8\xd3\x8f\xfb\x8f\ +\xef\xc5\xc8\x40\x5e\xda\xba\x29\xf4\x61\xe3\x9c\xb4\xba\xe1\x08\ +\xc2\x5b\x20\x9d\x2e\x78\x10\x41\xfe\xd2\x14\xa4\x02\x53\x4a\xb6\ +\xa2\x74\x80\xf2\x8e\xd9\x34\x1c\x44\x08\x1f\x2f\x26\x08\xb5\xa6\ +\x58\x78\xf1\x3a\x4c\x65\xf8\x87\x44\x61\x5d\xf9\x67\xc2\x5d\xe6\ +\x10\x58\x71\x64\x13\xee\xaf\x02\x48\xea\x1f\x16\xc3\x83\xdc\x8c\ +\x55\xa5\x4b\x2e\xfe\x90\x31\xd0\xe4\x1e\x23\xa2\x29\xbb\x55\xa1\ +\xca\x0a\xb7\x9b\x01\xa1\x4c\x68\xc7\xa4\xe4\x56\xf5\xe3\x9c\x24\ +\x01\x90\x5a\x7e\xf3\xf3\xaf\x94\x97\xce\xff\x2d\x6a\xd7\x3f\x0b\ +\xa0\xae\x2d\x90\x10\x14\x8a\x25\xfc\xe9\x9f\xbf\x80\x6f\x7e\xfb\ +\x07\xf2\xb4\x1b\x91\x04\xc4\x31\x93\x1f\x38\xbe\x17\xfb\x46\x7b\ +\x15\x7a\xaa\xea\x84\x9c\x8d\xe9\xa4\x4c\x0f\x3d\x13\xe1\xc3\x4f\ +\x91\x77\x24\x48\x09\x2f\x1c\x67\x45\x81\x01\x87\x00\x28\xd6\x72\ +\x92\x1c\xe0\x91\x60\xa4\xca\x4b\xa5\xcf\x43\x4b\xb4\xb0\xf4\x9b\ +\x53\x80\x01\x14\xe1\xaf\xa3\xe6\x1a\x88\xd7\x88\x04\x0a\x6a\x0b\ +\xc7\x04\x19\xc5\x0f\x50\x58\xd3\x4c\xf7\x43\xa7\xff\x11\x0b\x93\ +\xb0\xe6\x5f\xab\xcc\x32\x2e\x9d\xdb\x2e\x06\x84\x8a\xce\x47\x15\ +\x15\x1a\x51\x21\x13\x35\x1f\x51\x47\x1b\x5e\x59\xbe\xb0\x46\x08\ +\xf9\x5e\xba\x7b\x34\x4d\xac\xf4\x6d\x30\x4c\xbb\x69\xd8\x36\xa6\ +\x66\x16\xb0\xb6\xb6\x81\x3d\x93\xce\xb4\x1b\xfe\x79\xe0\xcd\xff\ +\xae\x5c\x1a\x93\xc3\x3d\xa8\xd6\x1b\x58\x2d\x54\x9d\x7d\xe2\x48\ +\xf0\xc0\x13\xcd\xc3\x6e\xfe\xe5\xd3\x8f\x76\xd7\xea\x40\x6d\x05\ +\xa8\x26\xbf\xaa\xf5\x84\x78\x15\xd4\xbc\x48\x16\x10\x24\x48\x20\ +\xf5\xfe\x71\x90\xd1\x0c\xe4\x54\xda\x4f\xb2\xa6\x16\x5a\x3a\x60\ +\x41\x00\x16\x73\x12\x51\x61\xc5\x3d\x50\x82\x15\xcc\x5c\x10\xf5\ +\xa1\xe1\x87\x45\x7a\x03\x75\x84\x52\x6b\x1b\x5e\x94\x90\x1f\x46\ +\x2e\x13\x22\xe5\x41\x41\x5a\xf7\x51\xcd\xbc\xf2\xb2\xb1\x8a\xf1\ +\x3e\xc3\x4f\x59\x21\xcd\x82\x2a\xca\x27\x69\x73\x7e\x52\xfe\xd5\ +\xf5\x99\x52\xa3\xbc\xf6\x7c\xb6\x6f\xcf\x3a\x49\x65\x4e\x02\x44\ +\x39\x30\x8a\xc0\xe9\xfd\x98\x5b\x58\xc1\xfc\xfc\x12\xc6\x47\x87\ +\xd0\xdf\xdf\xcb\x65\xc9\xfd\xb2\x02\xc8\x66\x2c\x4c\x0e\xf7\x80\ +\x10\x82\x95\x8d\x0a\x1a\x94\x46\x70\xa6\x0b\xe1\xa1\xa0\x62\xe3\ +\x45\x38\xf1\xdd\xdc\xe2\xcb\xa7\xec\xcd\x8a\xe0\x9f\xe1\x9b\x7a\ +\x04\xe2\xc3\xcd\xc2\x8c\x83\x89\xff\x55\x1e\xef\xc4\x01\x47\xf8\ +\x53\x73\x4b\x84\x97\xba\x1c\x1d\x40\x65\x58\x69\xc0\xaf\xb9\x26\ +\x2a\x66\x88\x96\xa9\xd6\x27\xc5\xa1\x83\x2b\x48\xa8\x93\x54\x84\ +\x50\x0f\xe6\xa4\x14\x79\x88\x9f\x32\x28\xf9\x67\x47\x2e\xd0\x89\ +\x6c\x4b\xaf\xdf\xcc\x2b\xaf\xa0\xb9\xa1\x4c\xcd\xea\x48\xa2\x2a\ +\x3c\x8c\x7c\xba\xf0\x66\xf5\x74\x15\x8f\x12\x6e\x95\x97\x2f\x94\ +\x97\xdf\xfc\xc2\x7f\xae\x97\xd6\x7e\x13\xd4\xbe\x18\x76\xc2\xef\ +\x5e\x9c\xc2\x67\xbf\xf4\x67\x78\x87\x99\x76\xa3\xba\xd9\x14\x40\ +\x26\x6d\xe1\xb6\xeb\x47\x71\xe7\x4d\x63\xe8\xce\xa5\x9d\x9d\x69\ +\xb9\x07\xdb\x74\x92\x61\x90\x02\xf7\x8c\xea\x7e\xd1\xd9\xc7\x5e\ +\x7e\x90\x04\x28\xfa\x7a\x41\x7e\xea\xb1\x42\xf0\x7b\x03\x65\x08\ +\xf0\xe0\xd0\xc1\x89\x71\x2d\x71\x7f\xaa\x9b\xa5\xd4\x13\x0e\x74\ +\xc0\x92\xac\x1b\xf6\x7a\x72\xd1\xd1\x60\x65\xba\x6e\x62\x39\x4a\ +\x9e\x88\xf0\x50\xe8\x4b\xf7\x41\xf1\x43\xc2\xdd\x57\xe5\xa7\xea\ +\x77\x5e\x27\x24\xa4\x0e\x6d\x93\x76\xbd\xf3\x88\x18\xee\x4b\x14\ +\x67\x7a\xd4\xf0\x76\x5f\x84\xc8\xe1\xf5\xf2\x9a\xbd\xf8\xea\xa7\ +\xbf\x50\x2d\xcc\xff\x1a\xa5\x8d\x97\x8c\x85\x10\x82\xd9\xf9\x65\ +\x7c\xee\x2b\xdf\xc6\x4b\x2f\x47\x9b\x76\x73\x64\xff\x10\xee\xbd\ +\x65\x12\x03\xde\xb4\x1b\x0e\x0a\x3a\xc0\x84\x5d\x3a\xf6\x05\x31\ +\x0c\x34\x25\x4a\x75\xf0\x96\x01\xfb\x32\x04\xca\x3a\x48\x99\xac\ +\x28\x11\x50\x3a\x38\x05\xe5\xc6\xfc\x63\x5e\x43\x09\x5a\xd0\x83\ +\x92\xb5\xae\x82\x6b\xc6\x5a\x31\xc1\x17\x11\x70\xec\x7d\x22\xd2\ +\x75\x64\xe2\xd8\xab\xa2\xf8\xc1\x60\xaf\x5f\x98\x55\x15\x4f\x88\ +\x31\x94\xaf\x4a\x38\xb4\x9a\xaa\xc2\xd6\x4a\x6c\xb6\x58\x2d\x66\ +\xd0\xac\xf5\xd5\xae\xf2\x02\xa1\x94\x2c\xbf\xf1\xb9\xef\x57\x96\ +\x2f\xfe\x2a\xb5\xeb\xdf\x40\x84\x69\x37\x5f\xfd\xd3\xef\xe3\x3b\ +\x7f\xf1\x82\xbb\xdb\x8d\x65\x2c\xe0\xc0\x58\x2f\xee\xbf\x75\x0f\ +\xc6\x87\xcc\xbb\x39\x3b\x79\xf0\x0f\xaf\xf8\x8b\xac\x83\x92\x7f\ +\x24\x51\x2a\xf8\xcd\x54\xfb\x5a\xd8\x7c\x62\x40\x4a\x61\x45\x29\ +\x01\xc5\xd6\x91\x1d\xa8\xa9\xb1\xaa\x8c\x7f\xc4\xb3\xe6\x08\x57\ +\x97\x28\xc0\x62\x41\x14\xd4\xd7\x0c\x2b\xbe\xef\x84\xbf\x86\xe2\ +\x65\x57\x5d\x5f\xd1\x32\x16\xef\x93\xde\x74\x10\xee\x97\x08\x45\ +\xae\x3c\x36\x61\xc8\x0f\x1f\x11\xce\x5d\x61\xe9\xf1\x37\x98\xbd\ +\xae\x2d\xc9\xb6\xbe\xeb\x29\x4d\xe4\x6e\xfd\xb4\xca\xcb\xe7\x17\ +\x49\x2a\xfd\x5c\xba\x6b\xb8\x8f\x58\xe9\xa3\xd0\xf8\xe1\x08\x21\ +\xa8\xd5\xeb\xb8\x32\x35\x87\xe2\x66\x11\x7b\x27\xc7\x90\xcb\xe7\ +\x84\x4b\xc4\x3b\x9e\x7b\xf2\x69\x8c\x0f\x76\xa3\x54\x6d\x60\x63\ +\xb3\x0a\xef\x01\xd4\xf9\x37\xb8\x5f\x5f\x2e\xdc\x10\x0f\xfd\xc3\ +\xad\x7a\x01\x4d\x3b\x2a\x87\x42\xca\x00\x03\x15\xa0\xa4\x01\x99\ +\xec\x53\x13\xf5\x4f\x4c\xc2\x8d\xc5\x52\x03\x8b\xaf\x96\x78\x4e\ +\x31\x60\xc5\x96\x2f\x5e\x63\xb1\x72\x82\xbe\x14\xcc\x31\x44\xf1\ +\xe3\x12\x09\x0c\x44\x9d\xb7\x32\x79\x58\x86\xfa\xe6\xdf\x64\x7b\ +\x7d\x54\xad\x1a\x17\x71\x01\x07\xa0\x33\xa0\x22\x9a\xfc\x74\xe1\ +\xed\xfe\x24\xd5\xb5\xa9\x82\x5d\x2d\xfe\x20\xdb\x3b\x51\x27\xa9\ +\xf4\x6d\x00\xd1\x4c\xbb\x21\xb0\x29\xc5\xf4\xec\x22\x96\x96\x57\ +\xb0\x67\x7c\x18\xbd\xbd\xc1\x0d\x65\x5f\x00\x47\x1f\xc8\x67\xd3\ +\x98\x18\xea\x46\xc3\xa6\x58\xdb\x64\xa6\xdd\x28\x7f\x35\x03\xf0\ +\x28\xe1\x24\xe8\xf0\x2f\x55\xb8\x0e\x3f\xe2\x9d\xa9\x71\x5c\x48\ +\xf9\x47\x82\xc5\x02\xc2\x01\x8a\xbb\x7b\x04\x60\xd7\x3b\x8f\xfc\ +\x9f\x68\x86\x79\x5f\x89\x77\x9e\x32\xb0\x88\xaa\xae\x2a\x28\xfb\ +\xdf\x85\xa7\x02\xf2\xb5\xe4\x9f\x03\xe1\x3a\x8b\x69\x54\x20\x62\ +\xca\xd0\x3f\x8c\xba\xfc\x54\x59\xa9\xdf\x73\x75\xde\xe1\xd0\x62\ +\x65\xcf\x48\x0f\x26\x9b\x07\xd5\xd7\x5c\x50\x91\xd0\x82\xc2\xc3\ +\x9b\x16\x16\x54\x71\x01\x23\x86\x37\x0b\x17\x5d\xfa\x56\xc2\x49\ +\xbd\xb8\x54\xad\x6e\x4c\xbf\x98\xeb\xdf\xb7\x60\xa5\x72\x27\x40\ +\x08\xbf\x1e\xb1\x20\x0b\x4b\xab\x98\x9e\x99\xc7\xe8\x48\x3f\x06\ +\x07\x07\xc0\xfd\xc6\x0a\x30\xc8\xa4\x2c\x8c\x0f\x75\x21\x9d\xb2\ +\xb0\xb2\x51\x41\xbd\xe1\x4e\xbb\x69\xd5\x9a\x32\x59\x4c\x2a\xb8\ +\x68\xe3\x88\xd0\x82\xd0\x43\x8a\xb3\x52\xb8\x97\x9c\x1f\x44\xc9\ +\xc1\x89\xb5\x74\x58\x09\xb1\xa2\x02\x35\x26\x0f\xd1\xd2\x22\xfe\ +\x3f\x3c\xb0\x24\x58\xc9\xe7\xc5\xc3\x8a\xbd\x36\xcc\xb5\x56\x5c\ +\x37\xa5\x70\xf7\x5c\x0f\x0c\xb6\x7e\xfc\x49\x68\x13\x09\x84\x62\ +\xef\xb5\x2a\xbd\x9a\x84\xaa\x1f\x24\xf1\x93\x00\xfe\x14\x9a\xc9\ +\x91\x1e\xe9\x54\x9b\x00\x55\x5c\x6b\x28\xec\x38\x72\x78\x1c\x67\ +\x7a\xd4\xca\xc4\x95\xa6\x2b\x1f\x56\xdf\x5a\x61\xa1\xb6\xf8\xda\ +\x1f\x7d\xba\xb6\x39\xff\x1b\x94\xda\x67\x8d\x95\x20\x04\x97\xa7\ +\xe6\xf1\xc7\x5f\xfc\x26\xde\x78\xe3\x6d\x50\xdb\xe6\x7f\xf5\x99\ +\x87\xd1\x9b\x76\x73\xcb\xc1\x61\xdc\x75\x64\x1c\xbd\x5d\x19\x6e\ +\xff\x08\x26\x01\xf7\x10\x1b\x9e\x3b\xfe\x04\x74\x57\x9a\x09\x33\ +\x39\x80\xb9\xe4\x21\x90\x92\xac\x28\xcf\x07\xc5\x96\xe7\x5b\x35\ +\x84\xaf\x07\xf1\xd5\xcd\xfe\x2a\x41\x8f\xcf\x46\xb0\xb4\x98\x34\ +\xea\xba\x0b\x50\x25\xea\x6b\xcb\xc1\x4a\xf9\x84\x08\x90\x8f\x70\ +\x5d\xd5\xf7\x56\xa3\xc2\x9c\x9f\xee\x56\xea\x44\x7f\xfb\x49\x68\ +\x9a\x88\xea\x5b\x2d\x2d\xb3\x24\xca\xf0\x84\x4e\x54\xb4\x5d\xe9\ +\xc3\xc2\x09\x6d\x54\xb1\xf4\xfa\x67\xff\xac\xba\x7a\xf9\xd7\xa9\ +\x5d\xff\x3e\x42\xa6\xdd\x2c\x2e\xaf\xe1\x0b\x5f\xfb\x73\x3c\xf7\ +\xfc\xcb\xa8\x55\x6b\xc6\x1e\x41\x42\x80\xeb\x26\xfb\x71\xef\x2d\ +\x93\x18\xee\xcb\xc9\x85\xb3\x9f\x44\x91\x98\x8d\x64\xde\x26\xe9\ +\x21\x97\xac\x24\xf9\xd7\x5b\x39\xb0\x39\x06\xa4\x3c\x7d\x8e\x23\ +\x22\xa0\x14\x50\xd2\xe2\x49\x3f\x88\x8a\x83\x97\x04\x2d\x01\x58\ +\xb2\xf3\x5f\xb4\x9c\x44\x1d\xd1\x12\x26\xdc\xf9\x2a\x8d\x1a\xed\ +\xd3\xc3\x1f\x8a\xd1\xf2\x91\x21\x53\xf1\x47\x44\xd1\x0b\xa9\x4b\ +\xaf\x7e\xab\xd5\xbf\x62\xb2\xf1\xd6\x71\x5a\x6d\x09\x2f\xda\xb5\ +\xa5\xbb\xae\x80\xc8\xd6\x4f\x8b\xe9\xc3\xf2\xb5\x56\xce\x7e\xed\ +\x95\xd2\xdc\x99\xbf\x4b\x1b\xd5\x2f\x22\x6c\xda\xcd\x66\x09\xdf\ +\xf8\xd6\x0f\xf0\x7f\xbe\xf5\x7d\x14\x37\xe5\xdd\x6e\xc4\x42\x26\ +\x87\xbb\x71\xfa\xd8\xa4\xd2\x61\xa9\x7b\x90\xc3\x5a\x05\x44\x77\ +\x45\x98\x30\xb9\x85\xc1\xbe\xe4\xcd\x41\xca\x8f\x22\x0a\x40\x71\ +\x15\x70\x2d\x2f\xd1\xaa\x62\x41\xa6\x08\x67\xcc\x25\xbf\x4e\x2a\ +\x60\xf1\xd6\x15\x61\xce\xc8\xab\xba\x1a\x56\xe2\xb9\xc8\x56\x6a\ +\xf4\x1f\x02\xd1\xaa\x12\x9b\x59\xc4\xf8\x19\x89\x72\x41\x4d\xa4\ +\xfb\x2e\xdd\x5c\x6d\xb9\x6a\x89\x08\xd0\x50\x91\x7e\xd7\xe3\xbe\ +\x7b\x6d\x11\xcf\x47\xa5\x3a\x2b\x12\x23\x5c\xfb\xde\xed\xa0\x4f\ +\x52\x59\xbb\xb2\x46\x1b\x95\xe7\x32\xbd\xe3\x59\x92\xca\x1c\x83\ +\x61\xda\x4d\xbd\x61\xe3\xea\xcc\x3c\xd6\xd6\xd6\xb1\x77\x72\x14\ +\xdd\xdd\x5d\x4c\x3c\x7f\x3f\x08\x01\xba\x72\x4e\x8f\x60\xad\x6e\ +\x63\xad\x58\xf5\xf5\x62\xf9\xac\x54\x4d\x10\xa2\x09\x67\x2a\x22\ +\xbf\x68\x7c\x59\xb1\x21\xc5\x22\x89\x4d\x23\xc2\x09\xf1\x45\x62\ +\x95\x06\x58\x92\x75\x45\x42\xea\xc9\x9d\x1f\x73\x93\x18\x3d\x19\ +\x5a\x21\x15\x35\xea\x84\x83\x40\x02\x22\x77\x14\x7e\x9d\xd8\x34\ +\x66\x5d\x22\xd7\x97\x49\x32\x39\xdc\x4a\xaf\x5f\xed\x6b\x9a\x91\ +\xe9\xcd\x02\xab\x29\xe3\x43\x07\x2a\x12\x31\x7c\x37\x7d\x12\x00\ +\xa4\xb6\xb9\x50\xaa\x15\x97\x5e\xc8\xf6\x4f\x16\xac\x54\xf6\x36\ +\x10\xa2\x1c\x18\x45\x88\x33\xfd\x60\x76\x7e\x19\x73\xf3\x8b\x98\ +\x18\x1d\x42\xff\x40\x9f\x1f\x17\x5c\x94\xe0\x21\xc9\x66\x2c\x8c\ +\x0f\x76\xc3\x22\x04\xab\x85\x0a\x6c\x9b\x22\x18\x01\x1e\x06\xac\ +\x20\x9c\x1d\xd1\x1c\x19\x60\x42\x3e\xfe\xc9\x93\x26\x21\x45\xd8\ +\xf3\x24\xfe\xb1\xf4\x34\xf9\x63\xaa\xa2\xfd\x71\x49\xc1\x58\x5a\ +\x22\xb0\x14\xd7\x97\xe8\xea\x2b\xd6\x93\x4d\x1b\x24\xe4\xaf\xa7\ +\x5f\xfd\x68\x56\x95\xf2\xc1\x12\xad\x1b\x08\x07\x21\x9f\xcd\x34\ +\xff\x4c\xd0\xd2\xc5\x70\xa0\x62\xaf\x6d\x74\x50\xbd\x6a\x2c\x38\ +\x9a\xb4\x04\xac\x66\x36\x77\xd8\x29\xd2\x34\xd1\xab\x6b\x57\x4b\ +\xcb\x6f\x7c\xe1\x0f\x6a\xc5\xa5\x7f\x0a\x6a\x5f\x0e\x2b\xe8\xdc\ +\x85\x29\x7c\xe6\x0b\xff\x07\x67\xdf\x3e\x0f\xde\x14\xe6\xdf\x5c\ +\x6f\xb7\x9b\x5b\xaf\x1b\xc6\xc9\xc3\xa3\xc8\xe7\xd2\xf0\x97\xb6\ +\x52\x3c\xd4\xe2\xaf\xa6\xf8\x30\x6a\x21\x25\xe8\xab\xba\xcf\x5b\ +\x81\x14\x67\x45\x89\xbd\x7f\x6e\x3d\x82\xa1\x09\x31\x6f\x9a\x0e\ +\x5a\x9c\x85\x25\x5b\x57\x5a\x58\x31\xf1\xd2\x39\x2a\xae\x75\x24\ +\x6b\x4a\xa7\x2b\x9b\x6d\x92\xbe\xfe\x9e\x86\x17\x66\x1e\xfc\xa9\ +\x2a\x91\xa8\xf3\x89\x71\x8a\x3b\x40\x22\x55\x33\xaa\x39\xd7\xf1\ +\x8a\x18\xf4\x5a\x35\x1d\x55\x7a\xa4\x51\x2d\x34\x96\x5e\xff\xe3\ +\x2f\x56\xd6\xa6\x7e\x83\xda\x8d\x57\x8d\x09\x08\xc1\xcc\xdc\x12\ +\x3e\xfb\xa5\x6f\xe2\x47\x2f\xbd\x8e\x46\xc8\xb4\x1b\xcb\x22\xb8\ +\x71\xdf\x00\xee\x39\x32\x8e\xfe\x1e\x77\x21\x3e\xb1\x9a\x66\x6a\ +\x85\x34\x4b\xd4\x79\xe8\x7e\xed\xfd\x50\x0d\xa4\x58\x7f\x14\x6b\ +\x45\xe9\x00\xa5\xab\x52\xd8\x9f\xea\xba\x4a\xeb\x5f\x05\xff\x70\ +\xf5\xd7\xc2\x4a\x79\x29\x08\x5f\x31\x3f\x4e\x03\xfa\x56\xac\x2a\ +\xf1\xbe\xea\x6e\x99\x26\x2f\xb5\xae\x26\x94\x08\x5f\xa5\x7b\xac\ +\xce\xa9\xf3\xfe\xf4\xce\x73\xa3\x9d\xce\xf4\x56\x81\xd4\x6e\xbd\ +\xb0\xf4\x04\xd4\x26\x2b\x6f\x7d\xf9\xb9\xf2\xe2\xdb\x7f\x97\x36\ +\x6a\xdf\x44\xc8\xb4\x9b\xd5\xb5\x02\xbe\xf4\xf5\xef\xe1\xdb\xdf\ +\x79\x1e\xe5\x72\x39\xd4\xc9\xbe\x7f\xac\x07\xf7\x1e\x9d\xc0\xd8\ +\x60\x97\xa4\xa3\xfb\xe5\x95\x1e\x68\x4d\x33\x41\xfd\x63\xcf\xdb\ +\x19\x60\xf3\x34\x40\x8a\x09\x06\x6b\x45\xb1\xe7\xae\xb2\x80\x82\ +\x3f\xcf\xfc\x31\xff\xb1\xdb\xb8\x8b\xd7\x4d\x5e\x8d\x94\xb9\x1a\ +\x3a\x58\x71\xf1\x2c\x90\x00\xfe\xbd\x0e\xf9\x71\x88\x22\x3a\xab\ +\x4a\x09\x0d\xd9\xc2\xd5\x95\x19\x05\x58\xd1\x8c\x3f\xc3\x8f\x5e\ +\x13\xa7\x1b\xf1\x6a\xb4\x4b\x2f\x54\x44\x1f\x55\x2b\x9f\xaa\xb7\ +\x44\x15\xae\x3b\x0e\x0b\xef\xd4\xa7\x55\x59\xb9\xb4\x08\xd0\xe7\ +\x33\xdd\xa3\xfd\x24\x95\x3e\x82\x90\x69\x37\x97\xaf\xce\x62\x73\ +\xb3\x88\x7d\x7b\xc6\x90\xcf\xe7\x99\x78\xe1\x34\x08\xd0\x93\xcf\ +\x60\x6c\xa0\x0b\xe5\x4a\x03\x1b\xa5\x9a\xd3\x14\x24\xc1\x83\x65\ +\x06\x92\x79\xb4\xbb\xf4\xeb\xef\xbf\x2c\x86\x26\x5f\x28\xa4\x64\ +\x2b\x8a\xbf\x06\xec\x79\x06\xb7\x89\x30\x71\x26\x2b\x8a\x7a\x69\ +\x08\x1b\xc6\x3f\x36\x54\xd2\x67\xf4\x28\x11\xe2\x9d\x7f\x28\x13\ +\xc0\xe9\x31\x71\x9e\x65\x1b\x7c\x12\x4d\x38\x5f\x2f\x2e\x1f\xf6\ +\x93\xd1\xd3\xe6\xe1\x7e\x61\xc3\xf5\xba\xf2\xa7\xb6\x6c\x49\x9f\ +\x3a\x9f\x5c\x9c\x13\x30\x39\xd2\x83\x3d\xc3\xf2\x78\xe7\x98\xce\ +\xf4\xce\xdb\x65\x06\x49\x37\x91\x66\xcb\x69\xba\x05\x62\x6d\x4e\ +\xbf\x3c\xdb\x28\xaf\xff\x5e\xdf\xa1\xfb\xe6\x52\xb9\xde\xbf\x0c\ +\xa8\x37\x90\x20\x84\xa0\xd6\xb0\xf1\xfc\x8b\x6f\x62\xa3\x50\xc4\ +\xfb\x9e\x7c\x00\x13\x13\x63\xe0\x17\x5a\x0f\xbe\x51\x4a\xd1\xd7\ +\x9d\xc1\x5d\x47\xc6\xd0\x75\x39\x8d\xf3\x33\xeb\xb0\x6d\xca\xf3\ +\x2c\x2a\xa4\x84\xbc\x8d\x4d\xbd\x10\x48\xc9\xe5\xcb\x56\x14\x7f\ +\xde\x42\x22\x20\xb4\x49\x41\x40\xd0\x9d\x4f\x21\x9d\x62\x60\xa3\ +\x18\xc5\x46\x15\x81\x6c\x58\x00\x84\x80\x3a\xdc\x77\xea\x87\xa8\ +\xc3\xd8\xfc\x68\x90\x96\xba\x8a\xa2\x0e\xf7\xe2\x2b\xc2\xbd\xef\ +\xd4\xff\xce\xe6\x6d\x28\x83\xd2\x90\x78\x27\x9c\x06\x85\x19\xea\ +\x22\x9e\xaf\x3a\x6f\x4a\x29\xba\x73\xc2\x6b\x4e\x82\x74\x6d\x96\ +\xa8\x39\xc7\xae\x41\x33\xa0\xea\xb4\x6c\x17\xe0\xac\xf2\xf2\xf9\ +\x8d\x7a\x79\xf5\xdf\x0f\xde\xf8\xe4\x6c\xba\x6b\xf0\x57\x41\xac\ +\x09\x5d\x05\x29\x80\x37\xde\xba\x80\x42\xa1\x88\xf7\x3f\xfd\x20\ +\xae\xbf\xee\x80\xf6\x74\x28\x75\xb6\xe6\x3a\x71\xfd\x08\xba\x72\ +\x69\x9c\xbd\xb2\x8a\x6a\xdd\x86\x79\xbd\x06\xc3\x95\x11\x9b\x17\ +\x82\x31\xca\xe1\x92\xb5\xda\xb8\x60\x35\x14\x9d\x30\xd1\xd2\x0a\ +\xca\x50\xfb\x44\x78\x90\x7a\x92\x4a\x11\x1c\xd9\xd7\x8f\xd1\xfe\ +\x9c\x12\x50\x00\xb8\x97\x4d\x7c\x76\xa9\x14\x44\xa5\x30\x2a\xa6\ +\xa5\x7c\x12\x0e\x08\x42\xc6\x94\xc9\x84\x4a\x65\x52\xe9\x98\xf2\ +\x19\xb3\x39\x30\x65\xf0\x16\x54\x50\x04\x35\xe6\xcf\x60\x39\x48\ +\xab\x04\x34\x9f\xb9\x0c\x6c\xbe\x0e\x14\x14\x99\x74\x94\x5d\xf1\ +\x76\xb6\xec\x44\x50\x6d\xa7\x90\x7a\x71\xb9\xba\xf4\xfa\x67\xff\ +\xf7\xd0\xd1\x67\x17\x32\xbd\x13\xbf\x41\xac\xd4\x4d\x5a\x65\x42\ +\x70\xe9\xea\x1c\xfe\xf0\xf3\x7f\x8a\x67\x9f\xbc\x1f\xb7\x1e\x3b\ +\x82\x54\x2a\xc5\x2d\xb0\x07\x04\x60\x4b\xa5\x08\x6e\xde\x3f\x88\ +\xee\x5c\x1a\x6f\x5c\x5c\xc6\x66\xb9\x0e\x22\xce\x49\x67\x7d\x33\ +\x10\xad\xa9\x88\xdd\xe4\x2a\x37\x0c\x67\x69\xf1\x90\x82\x11\x52\ +\x3a\x40\x11\x0d\xb4\xc0\xa5\xcf\xa6\x53\xe8\xca\xa6\x95\x56\x93\ +\x27\xfc\xfb\x45\x35\xe1\xc1\x41\x28\xac\x20\x82\x82\x2a\xc0\xa1\ +\x28\x4b\x80\x4f\x78\x1e\x94\xb3\x0d\x7c\xa3\x9a\x52\x09\x8c\xd1\ +\xa1\xa6\x02\x55\xa0\x24\x5e\x2b\xca\x64\xc8\x67\x13\x94\x68\x53\ +\xf1\x1a\xee\x3e\x69\xc6\x47\x15\xd7\x17\xb5\xd3\x7d\x54\xf2\x27\ +\xb5\x51\x5a\x38\x7b\x21\xd3\x3d\xfc\x5a\x2a\xd7\x77\x3d\xb1\x52\ +\xfb\x74\x17\x90\x10\x82\x62\xb1\x8c\x0b\x17\xa7\x90\x49\x11\x4c\ +\x4e\x8e\x21\x9d\x66\xf9\x2f\x4e\x24\x06\x06\x7b\x72\x18\xe8\xcd\ +\x61\xbd\x58\x45\xb9\xda\x60\x1c\xd2\x26\xdf\x14\x1b\x1e\xc5\x37\ +\x65\xf6\x4b\xb1\x23\xa0\x8d\x3e\x2b\xef\x3b\x43\x3c\xcf\x29\xae\ +\x82\x14\xeb\xb9\x4a\x59\x16\x26\x87\xba\xd0\x93\x4f\x45\x7a\x4f\ +\x98\xf5\x56\x15\xe1\x6c\x09\xea\xf7\x4e\x61\x5c\x19\xf2\x81\x02\ +\x26\x8c\x4f\x8c\x86\xe4\xa9\x38\x56\xe5\xa7\x3b\x56\x83\x53\xf8\ +\xce\x5a\x54\x6d\x28\x43\xbc\xba\xbb\xc9\x47\x95\x38\xd3\x0d\x4e\ +\xf6\xf2\xf2\xf9\x59\x92\xca\xbc\x98\xee\x1e\x1e\x23\x56\xfa\x7a\ +\x68\x7a\x49\x09\x21\xa8\x54\x6b\xb8\x78\x79\x06\xd5\x4a\x15\xfb\ +\xf7\x8e\x23\x9b\xcb\xfa\x59\x71\xa0\x72\xff\xed\xed\xce\x60\xa4\ +\x3f\x8f\x62\xa5\xe6\x58\x56\x06\x20\x45\x82\x90\x18\xae\x80\x5d\ +\x24\x1d\xa6\x0e\xc1\x77\x57\x57\x68\x22\xfa\x37\x8a\x1d\x1b\xc5\ +\xfc\x59\x16\xc1\x9e\xe1\x2e\xf4\x76\x65\xe0\x01\xdb\xf4\xb4\xcb\ +\x8e\x7a\x08\x75\x60\xea\xa2\x7a\xda\xf8\x8b\xac\x52\xd0\x07\x91\ +\x90\xac\x94\xfa\xbc\xd9\x1c\xe7\x4d\x26\x51\x22\x15\x85\x37\x4d\ +\x0b\xa5\x8f\xb1\xed\xa0\x8a\x6a\xb7\xc5\xb6\xef\x76\x02\xa8\xc2\ +\xf4\xb6\x13\x60\xa4\xba\x3e\xb5\x6a\xd7\x4a\xcf\x67\x9d\x69\x37\ +\x47\x01\x62\x98\x76\xd3\xc0\x95\xe9\x39\xac\xae\xae\x63\xef\x9e\ +\x31\x74\x77\x77\x2b\x1e\xfc\xe0\x89\xee\xca\xa5\x30\x3e\xd0\x85\ +\x5a\xc3\xc6\x7a\xb1\xe6\xe7\xa3\xb5\xa6\xdc\x7c\x62\x2d\x19\x23\ +\x86\xb3\xf9\xc5\x81\x14\x61\xcf\x01\x10\xc7\x40\xa9\xc4\xb2\x08\ +\xf6\x0c\x75\xa1\x27\x9f\x0e\x32\x8f\x30\x50\x54\xf4\x8b\xf1\x61\ +\xc2\xd3\xa0\x3f\x14\x5b\xaa\x8a\xf8\xf8\x68\x89\x9c\x42\x2c\x2f\ +\xf2\x60\x26\x43\xad\x62\x51\x8a\x84\x46\x13\xbc\x37\x2d\x2a\xdd\ +\xa7\x0e\x4c\x51\xf5\x9a\x05\x98\x2e\x3c\xae\x9e\x55\x2f\x2e\x95\ +\x6a\x85\x85\x17\x33\xfd\x93\x9b\x56\x2a\x77\x1c\x84\xe4\xa1\x10\ +\x42\x88\x3b\xed\x66\x09\xb3\x73\x0b\x98\x1c\x1f\x76\xa6\xdd\x70\ +\x3f\xbc\xc1\x13\x4c\xe0\x4c\xbb\x19\x1b\x70\x80\xb6\x56\xac\xc2\ +\xa6\xd0\x83\x4a\x01\x18\xb3\x35\xa5\x87\x1e\xfb\x22\x19\xb7\xdf\ +\x12\xac\x17\xc2\x46\x32\x17\x4e\x35\x34\x21\x68\xfa\x29\x5c\xa1\ +\x21\xc0\x52\x0f\x10\xe5\x8e\x78\x23\x81\x70\xa1\x0a\xe3\x4a\x49\ +\x2a\x5e\x43\x93\x87\x49\x48\xb3\xa1\x9a\xb2\xa3\xe7\x06\xee\x7e\ +\xab\x4e\x91\x84\x9c\x86\x03\xaa\x4a\x33\xa0\xea\x98\xe5\xa4\x93\ +\xa8\x73\xfd\xb6\xf3\x33\x2a\xc0\xe2\x86\xc7\x01\x1d\x69\x54\x0b\ +\xf5\xf2\xf2\xf9\x57\xb3\xfd\x7b\xa6\xad\x4c\xf7\x31\x42\xc8\x80\ +\xe9\xc2\x2e\xad\xac\xe3\xf2\x95\x19\x0c\x0d\xf4\x61\x64\x64\x88\ +\x71\x8a\x13\xe9\x25\x4a\xa7\x2c\x8c\x0c\xe4\x91\x4b\xa7\xb0\xba\ +\x59\x45\xbd\x41\x83\xc1\x91\x40\x04\x6b\xa9\xf5\x66\xa1\x0e\x52\ +\xa2\x15\x25\x8f\x22\xf7\x92\x11\xe9\xcf\xb1\xa8\xba\xd1\x93\xcf\ +\x08\x97\x95\xbd\xc2\xc4\x05\x3c\x85\x6d\xdb\x4e\x37\xbb\xf7\x67\ +\x53\xd8\x94\x82\xd2\x20\xdc\xb6\x99\x78\x37\xdc\x0f\x73\x3f\x6d\ +\x4f\xdf\x3f\x66\xf4\x6d\xf6\xd8\x2b\xc3\xd6\x97\x29\x96\xc7\x1d\ +\x7b\x65\xf3\xe9\xa9\x26\xbd\x4d\x29\xa8\x74\x8e\xc2\xb1\x70\x6e\ +\xd1\xe2\xa2\xd5\xd5\xd3\x83\x7b\x4c\x28\x50\x2c\x16\xf1\xfa\x99\ +\x73\xad\x5a\x54\x9d\x70\xd5\x73\x79\xee\x86\x5e\x3f\x7e\x80\x52\ +\xf3\xe1\x61\x7a\x61\xf9\x11\xbb\x5a\x6c\x2c\xbf\xf1\xf9\x2f\x0d\ +\x1e\x79\x7a\x31\x3b\xb0\xff\x37\x88\x95\x3e\xae\xcb\x9c\x10\x82\ +\xe9\xb9\x25\x7c\xe6\x0b\xff\x07\xcf\x3c\xbe\x89\x3b\xef\xb8\xd5\ +\x71\xb2\x53\x75\x01\x29\xe2\x6c\x29\xdf\x95\x4b\xe3\xf5\x8b\xcb\ +\xd8\x28\xd5\xc0\x9b\x3d\x10\x8e\xe5\xaa\xf2\x2a\xd1\x47\xbb\x83\ +\x8d\xd5\x40\x8a\x9f\x43\x28\xa4\x91\x2a\xa1\xae\x32\x40\xfc\x5e\ +\x2a\xc7\x82\xac\x61\x6a\x69\x13\x73\xd3\xd3\x98\x9f\xba\x8a\x4a\ +\xb9\xe2\xbc\x40\xc2\xb5\x89\xf5\x1e\x50\xe3\xa1\x3a\x01\x0d\xcd\ +\x26\x96\x88\x43\x08\xa2\xd6\x37\x52\x5d\xc3\x42\x43\x33\x09\x7a\ +\x1a\x09\x21\x28\x57\xaa\x28\x16\x4b\xc6\x29\x61\x3b\x41\x3c\x50\ +\x85\xbd\xb4\xad\x42\x41\x27\xad\xa6\xef\x44\x59\xc6\x73\xa5\xd4\ +\xc6\xca\xd9\xaf\x3d\xd7\x7f\xdd\x83\xbf\xd9\x35\x76\xe4\xef\x91\ +\x54\xf6\x41\x18\x9c\xec\xab\x6b\x05\x7c\xf1\x6b\xdf\xc1\xda\x7a\ +\x01\x0f\xdd\x7f\x17\xba\xba\xbb\xf8\xae\x7a\xa1\xa4\xbd\x23\xdd\ +\xc8\x65\x53\x78\xfd\xe2\x0a\x96\xd6\xcb\x7c\x7e\xaa\x4f\xc2\xc2\ +\x83\x84\x28\xab\xcf\x2c\x00\x17\x93\xd8\x08\x29\xf5\xc0\x51\x39\ +\x63\x59\x87\xd0\x20\xff\x42\xb9\x86\x6f\x7f\xef\x25\xbc\xf9\xd2\ +\x4b\x28\x97\x8a\x11\x6e\xcd\x7b\x45\xb6\x10\x1a\x04\xce\x32\xda\ +\x66\x69\xc7\x00\x07\x1a\x31\x5c\x79\xac\x5a\x33\xbd\x9d\xcd\xb1\ +\x30\x7f\x50\xdc\xf4\x3b\xe6\xb3\xb2\x7a\x79\x91\xda\xf5\x1f\x66\ +\x7a\xc6\xfa\x49\x2a\x73\x23\x4c\xd3\x6e\x6a\x75\x5c\xba\x32\x83\ +\xcd\x62\x11\xfb\xf6\x8e\x23\x9f\xcf\x33\x2f\xba\x60\x95\x10\xa0\ +\x3b\x9f\xc1\x68\x7f\x1e\xe5\x6a\x03\x85\x52\xdd\x57\x33\x35\xfb\ +\x62\x4f\xb9\xd1\x36\xf9\xe4\x75\xad\x82\xef\x6e\xbc\x70\x77\x88\ +\x1b\x2a\xfe\x97\xb2\x88\xec\xa3\x72\xd3\x59\x84\x60\x61\x71\x0d\ +\xdf\xf8\x93\x6f\x61\xb3\xb0\x01\xcb\xb2\xf8\x55\x19\x92\xbf\x2d\ +\xfb\x33\x88\xa9\xe9\xd7\x2c\x78\xe2\xea\x01\x68\x1e\x54\x71\x3f\ +\x75\x60\x8a\xaa\xd7\xe9\xf0\x66\xd2\x5b\xb5\xc2\xfc\x46\xbd\xbc\ +\xfa\x42\xb6\x6f\x82\x5a\xe9\xec\x2d\x00\xc9\xaa\x2e\x32\x21\x04\ +\x0d\x4a\x31\x35\x3d\x8f\xc5\xa5\x15\xec\x99\x18\x41\x5f\x5f\xaf\ +\x17\xc9\x15\xe2\xf9\x93\x72\x99\x14\xc6\x06\xf3\x68\xd8\xc0\x7a\ +\xb1\xea\xce\x11\x94\xe1\xd3\x54\x0f\xa0\x90\x87\x12\x60\x6c\xdd\ +\x18\x3f\x14\x6b\xb8\x79\x80\xf2\x9d\x69\xc2\x5f\xe0\xa3\x92\x3d\ +\x0c\xc4\xb2\x70\xf9\xca\x34\x9e\xff\xe1\x2b\xb0\x6d\xed\x5c\xf0\ +\x44\xb6\x57\x28\xb5\x6b\x5f\x16\xd6\xa3\x6a\x37\xa0\x22\x89\x69\ +\x17\x9a\x6d\xb7\x5a\x76\xc1\x27\x69\x94\xd7\x2a\xd5\xb5\xab\x2f\ +\x67\xfa\x26\x97\x53\x99\xfc\xad\x20\x44\xb5\x1e\xb1\x9f\x68\x7e\ +\x61\x05\x57\xa7\xe7\x30\x36\x32\x80\xa1\xa1\x01\xa5\xef\xc7\xc3\ +\x49\x26\x65\x61\x74\x20\x8f\x54\x8a\x60\x6d\xb3\x86\x86\x4d\x61\ +\xb9\xe6\x93\x0c\x22\x3d\xa8\xa2\x0d\x22\xd5\xe8\x88\xf9\xb0\x75\ +\xf4\xbd\xfd\x4a\x4e\xf9\x16\x55\xaf\x0a\x54\x84\xe0\xf2\x95\x69\ +\xbc\xfc\xea\xdb\x09\xa8\x76\xae\x14\x1a\xd5\xcd\xff\x52\x9c\x7b\ +\xfd\x12\xf4\xed\xd1\x8e\x3b\xd2\x81\x78\xa0\x6a\x57\x78\xb3\x7a\ +\xcd\x7e\x46\xad\x9f\x98\x36\x72\x7a\xbb\x5e\x6e\x94\x97\xde\x39\ +\x93\xe9\x1d\xbf\x98\xca\xf6\x1e\x25\xc4\x1a\xd6\xdd\x01\xcf\x6f\ +\x75\xe1\xd2\x34\xfa\xfb\xba\x31\x3e\x36\x02\xcb\xb2\xb8\x9c\xd9\ +\xee\x71\x8b\x10\x0c\xf7\xe5\xd1\x9d\x4b\x63\xad\x58\x45\xad\x61\ +\x33\xc3\x12\x54\x40\x8a\xdf\xec\xd3\x35\xf9\xb8\xe6\x9e\x64\x45\ +\x09\x17\x46\x31\x3e\xc1\xf2\x9a\x7e\xb9\x8c\x0f\x51\xd6\xa2\x9b\ +\x9a\x9e\xc7\xcb\xaf\x25\xa0\xda\xb1\x42\xed\x57\x2a\x2b\x97\xfe\ +\x53\x65\xe5\xe2\x26\xf4\xa0\xe2\x52\xb4\x29\x5c\x92\x9d\xb8\x01\ +\x69\xa7\x9a\x73\x9d\xfd\xa4\x36\xca\x8b\xe7\x2e\xa4\xf3\xfd\x6f\ +\xa4\xf3\x03\xd7\x13\x2b\xb5\x57\x77\xd1\x09\x21\xd8\x2c\x96\x71\ +\xde\x9d\x76\xb3\x77\x0f\x3f\xed\x86\x88\x4d\x2c\x02\x0c\xf4\xe4\ +\x30\xd0\x93\xc5\x7a\xb1\x86\x4a\xad\xe1\x9c\x38\x51\x59\x51\xe6\ +\x66\x5f\xac\xa5\x8c\x85\xe6\x5e\x00\x24\x19\x50\x7a\x8b\xca\x6b\ +\xfa\x11\x3e\x6d\x02\xaa\x9d\x2d\xd4\x7e\xbd\x51\xd9\xf8\x9d\xe5\ +\x33\x5f\x7a\x83\x0d\x15\x3e\xa1\x39\x46\x88\x5e\xdc\xf0\x8e\x0c\ +\x4f\x68\xf7\xb0\x81\x76\xe5\x1b\xa5\x2c\x7f\x5a\x69\x73\x9f\x94\ +\xac\xbd\xfb\xcd\x57\x1a\x95\x8d\x7f\xd8\x3d\x79\xfc\x6f\x5b\xe9\ +\xfc\x93\xba\x6b\x4c\x08\xc1\x46\xa1\x88\xaf\x7c\xe3\x2f\xb0\xb6\ +\x5e\xc0\x13\x8f\xde\x8b\x9e\xde\x1e\x7d\xaf\x36\x01\xc6\x07\xf3\ +\xb8\xeb\xa6\x51\xbc\x71\x69\x05\xf3\x6b\x25\xa6\xf2\xfa\xd3\xf7\ +\xe2\xcd\x17\x88\x30\xc8\x25\x72\x3a\xc2\x97\xc3\x59\x5a\x72\x61\ +\x21\x42\xb8\xe2\xf4\x77\x86\x56\xec\x7a\xe9\x79\x6a\xd7\xd7\x0c\ +\xda\xaa\xd9\x6c\x72\x18\x31\xe9\x1b\xd2\x09\x69\x18\x4b\xd7\x38\ +\xd5\x50\x28\x54\x93\x2f\x11\xa7\x36\x1a\xca\x27\x9a\x70\xe1\xfe\ +\x13\x13\x40\x88\x26\x9c\xad\x12\x01\x28\xad\x51\x6a\x5f\xa9\x17\ +\x97\xbf\xba\xfc\xe6\xe7\xdf\x84\x59\xda\xea\x87\x32\x89\x0e\x54\ +\xe2\x8b\x28\x86\xeb\xf4\x9b\x0d\x6f\xb6\xbc\x56\x41\x13\x56\x4e\ +\x9c\x73\xf1\xc7\x5b\x15\xae\xbe\x70\xa9\x51\x5e\xff\x9d\xde\x83\ +\xa7\xe6\x53\xd9\x9e\x4f\x00\xfa\x91\xec\x95\x6a\x0d\xdf\xfe\x8b\ +\x97\xb0\xbe\xb1\x89\x67\x9f\x7e\x10\xa3\x23\xc3\xd2\xea\x0b\xde\ +\x01\xa5\xc0\x40\x4f\x06\x77\x1c\x1e\xc1\x99\x2b\xab\xb8\xba\x58\ +\xe4\x67\xe5\x33\x15\x0c\x9f\x1e\x42\x14\x69\x98\x4f\xc2\x02\x29\ +\x08\x50\x42\x4a\x6c\xb2\x32\xe7\xe7\x59\x57\xd2\x93\x1b\x52\x3d\ +\x0a\xbb\x50\x5a\x78\xfb\xbf\x17\xae\xfe\xf0\x0c\xb1\xd2\x96\x1f\ +\xac\x7e\xe1\x54\xbf\xc8\xd4\xa0\xe7\xbe\xd4\x24\x4c\x4f\x11\x47\ +\xa8\x51\x97\x98\x75\x09\x7f\x1e\x62\x1a\x31\x9d\x90\x3f\x97\x46\ +\x2a\x83\x78\xf1\x7c\x1d\xdc\x30\xb1\x2e\x41\x5e\xc4\x89\xa3\x00\ +\x81\xdd\xa8\xd9\x8d\xf2\x6a\xd5\xd5\xb5\x14\xb7\xae\x5d\xcd\xbb\ +\xa8\x56\x15\x00\x19\x54\xed\x02\x4b\xbb\x40\x14\x96\x3e\x2c\x9f\ +\x38\xe7\x16\x17\x6a\x6c\xb8\xa8\x63\x95\x16\xdf\x5e\x6a\x54\xd6\ +\xff\x5d\xff\x0d\x8f\xcc\xa7\xf3\x83\xbf\x08\x42\x06\x55\x95\x22\ +\x84\xc0\xb6\x29\x5e\x7c\xe5\x2c\xd6\x37\x36\xf1\xa1\x67\x1f\xc6\ +\x81\x03\x7c\xab\x91\x2b\x9c\x02\xdd\xb9\x14\x6e\xbb\x6e\x18\x5d\ +\xb9\x34\xce\xcf\x6e\x38\x5b\xca\xb3\x9a\x9a\x06\xaa\xb4\x9c\xb1\ +\xa4\xc7\x39\xa9\x98\xf2\x35\x90\x52\xf8\xd4\x74\xc2\x5e\x28\x3f\ +\x84\x28\x11\xc6\x9c\xac\x5d\xa7\x76\xa3\x4e\xed\x86\xf8\xc2\x44\ +\x07\x52\x6c\x10\x45\x8a\xf3\xbe\xc7\xc9\x27\xee\xa7\x58\x46\x3b\ +\xf3\x0e\xfb\x4c\x41\xbe\x31\xed\x6a\xc6\x35\x05\x3e\xd5\xd8\x1f\ +\xc9\x59\x2c\x84\xb7\xeb\x53\xcc\x5f\xd4\x09\xab\x47\x98\x7e\x3b\ +\xea\xd6\xca\xa7\xd5\xa8\x16\x6a\xe5\xe5\xf3\xaf\x65\xfa\x26\x67\ +\xad\x6c\xf7\x2d\x84\x90\x7e\x18\x64\x69\x79\x0d\x17\x2f\xcf\x60\ +\x64\xb0\x1f\xa3\xa3\xea\x69\x37\x9e\xa4\x52\x16\x46\xfa\x73\xc8\ +\xa5\x2d\xac\x15\x6b\xce\xb4\x1b\x4b\xdd\x1b\x18\x67\xee\xa0\x17\ +\xcf\x39\xcc\x85\x21\x0b\x6c\x19\xbe\x1e\xe3\xb7\xf2\xfe\x2c\x22\ +\x8f\xa3\x0a\x98\xe8\xfa\xa8\x5e\x3d\xeb\xac\x78\x2a\x4b\xa9\xb6\ +\x31\xf7\x8d\xea\xfa\xd4\xa2\x10\x1e\x05\x58\xa6\xf8\x08\xcd\x36\ +\x65\x5c\x58\x59\x9d\x92\x66\xdd\x1a\xa6\xb4\x44\x13\x2f\xfe\x9e\ +\xc4\x1a\xeb\xd4\x06\xd1\xe6\xaf\x5b\xfa\x4f\xf5\xf2\x6d\x05\x20\ +\x3a\xfd\xb9\xe5\x79\x50\xbb\x6e\x97\x17\xdf\x79\x27\xdd\x3d\xfc\ +\x76\x2a\xd7\x77\x13\x21\xd6\xb8\xee\x66\x78\x7e\xab\x77\x2f\x5c\ +\x45\x77\x3e\x8b\x3d\x93\x63\x48\xa5\x52\x52\xe9\x3e\x30\x08\xc1\ +\x60\x6f\x0e\x7d\xf9\x0c\xd6\x4b\x35\x54\x6b\x0d\xc6\xc1\x6e\x02\ +\x91\x0c\x24\x1e\x42\xd1\x57\x62\x60\x01\x15\x10\xcb\xf9\x4c\x59\ +\x04\x13\x83\x79\x77\xae\x5f\x70\x0e\x04\x51\x40\x45\x4b\xb5\xc2\ +\xdc\x9f\x54\xd7\xa6\x16\xc4\x08\xc3\x71\xfc\x26\x60\x73\x96\x54\ +\xdc\x38\x53\x1a\x9d\xb4\x33\x8f\xb0\xbc\xa3\xea\xb7\x7a\x9e\x51\ +\xcb\x35\x0e\x4f\x60\x65\xab\xc1\xb1\x95\x10\x14\xf3\x6e\xa6\x8c\ +\x98\xe5\x52\x94\x97\xde\xbd\x92\xca\x74\xbd\x9a\xee\x1a\xda\x47\ +\xac\xd4\x01\x21\xaf\x20\x53\x42\x50\x2a\x57\xf0\xee\xc5\xab\xa0\ +\xb6\x8d\xfd\x7b\xc7\x91\xc9\x66\x04\x9d\x20\x7b\x02\xa0\xb7\x3b\ +\x83\xc1\xde\x1c\x36\xcb\x75\x94\xaa\x0d\x84\x0f\x4b\x68\x61\x28\ +\x83\x5b\xa8\x38\xc9\x19\xde\x24\x6a\x0f\x5c\xc4\xb1\xa8\x26\x06\ +\xbb\x82\x5e\x3f\xe6\xaa\x58\x84\xe0\x6a\x38\xa8\xbe\xae\x00\x15\ +\x10\xdd\xaa\x6a\x67\x53\x30\xae\x7e\xd4\xa6\x5d\x54\xdd\xb0\xf3\ +\x6f\x47\x53\x33\x4a\x78\x33\xd2\xb2\xd3\x3d\x0c\x54\xec\xf7\x9d\ +\x6a\x55\x89\x75\x68\xa5\x2e\x9d\xd2\x25\x00\x48\x65\xf5\xca\x02\ +\xb5\x6b\x2f\x64\x7a\x46\x07\x48\x2a\x73\x18\x21\xd3\x6e\x2e\x5e\ +\x9e\xc6\xe6\x66\x11\x07\xf6\x4d\xf8\xbb\xdd\x10\xfe\x1f\xff\x6b\ +\x77\x2e\x8d\x91\xbe\x3c\xca\xb5\x06\x0a\xe5\x60\xda\x8d\x79\x58\ +\x82\xb9\xd9\x17\x75\x25\x06\x45\xcb\x14\x80\x3b\x3c\x61\x90\x6d\ +\xfa\x31\x56\x98\x6f\x51\xe9\x86\x27\xd0\x62\xad\x30\xff\x27\xd5\ +\xb5\xab\x0b\xcc\x75\x8c\x0b\x28\xf6\xfb\x56\x5a\x5e\xed\x86\x54\ +\x54\xa8\xb4\x02\x84\xed\xb6\xa6\x8c\x75\x34\xad\xfa\xbe\x93\x81\ +\xd2\x2c\x4c\xda\x0d\xa4\xb8\x75\x22\xb5\xc2\xfc\x46\xbd\xb4\xfa\ +\x42\xb6\x77\x02\x51\xa6\xdd\x5c\x9d\x9e\xc7\xfc\xc2\x32\xf6\xee\ +\x19\x95\xa6\xdd\xf8\x99\xbb\x87\xd9\x4c\x0a\xa3\xfd\x39\xd8\x94\ +\x62\xa3\x58\x83\xed\xe6\x13\x06\xaa\xa6\x9a\x7d\x62\xb8\x17\xc7\ +\xcc\x21\xb3\x08\xc1\xc4\x50\x1e\x3d\xee\x2e\x28\x84\xfd\xd7\x8a\ +\x02\xaa\xb9\xaf\x47\x04\x95\x29\xae\x5d\x8e\xf7\xa8\x61\xad\x40\ +\x4a\x25\xcd\x00\x20\x2e\xd8\xda\x61\xd9\x85\xd5\xbf\xa5\xf0\x28\ +\xa0\x62\xbf\x6f\x95\xf5\x24\x96\xd5\xc9\x26\x60\xab\xba\x61\x71\ +\xa2\x58\xce\xb4\x9b\x2b\x2f\x67\xfa\xf6\xac\x44\x99\x76\x33\xb7\ +\xb0\x8c\x2b\x53\xb3\x18\x1f\x1d\xc2\xf0\xf0\x00\x97\x3d\x6b\x61\ +\x11\x38\xd3\x6e\x46\xfa\xf3\x48\xa7\x1c\x27\xbb\x6d\x53\xb7\x49\ +\x26\x83\x4a\x02\x8e\xc2\xca\x92\xe1\xc4\x5b\x53\x41\xcf\xa1\x3f\ +\x4c\xd5\x97\xc0\x47\x25\x2f\x6f\x13\xcd\xa2\x32\x82\x0a\x8a\xb0\ +\x76\x36\x03\x55\x61\xdb\x15\x17\xc7\xa1\xdf\x49\xf8\xb4\x0b\x80\ +\x61\xf9\x49\x12\xb6\x8f\xce\x4e\x04\x8d\x18\xb6\x13\x9a\x7a\xb1\ +\xe3\xec\x7a\xb9\x5e\x5e\x7a\xe7\xcd\x4c\xef\xc4\xc5\x54\xb6\x27\ +\xd2\xb4\x9b\xf3\x17\xaf\xa2\xbf\xb7\x1b\x13\xe3\xc1\xb4\x1b\x11\ +\x54\x70\x7d\x43\x43\x7d\x39\x74\x65\x53\x58\x2f\x56\x51\x73\x17\ +\xe2\xf3\xf2\x72\x3e\x19\xe8\x28\x21\x86\x18\x56\x16\x3b\xd9\x39\ +\xf8\x73\x7c\x54\x79\x45\xaf\x1f\x89\xda\xf4\xfb\x7a\x75\xed\xea\ +\xbc\x70\x2d\x81\xd6\x9a\x80\xba\xef\x71\x9a\x55\x3b\x05\x52\xed\ +\x00\x43\xab\xf0\x81\x26\x9d\x49\x62\xa7\x8d\x0a\x2a\xf6\xfb\x56\ +\x35\xd3\x5a\xc9\xa3\x53\xcd\xb7\xf6\xc6\x51\x1b\xe5\xc5\xb7\x2f\ +\xa4\xf3\x03\x91\xa7\xdd\x9c\xbb\x70\x15\xe9\x94\x85\x7d\x7b\xc7\ +\x91\x49\xa7\x99\x12\xf8\xb1\x4d\x16\x01\xfa\xbb\xb3\xe8\xef\xce\ +\xa0\x50\xaa\xa3\x5c\xb3\xfd\x26\xa0\x0f\x9d\x98\xab\x31\x44\x5f\ +\x32\xc6\xf9\x4b\xb9\x4d\x3f\x7f\x03\x4c\xc2\x9f\x4f\x28\xa8\x36\ +\xe7\xbf\xe6\x5a\x54\x52\x64\x8c\xe3\x56\x9b\x84\xdb\x09\xb0\x56\ +\x9a\x8d\xed\xb4\xbe\x4c\xd2\x6e\x2b\x4b\x29\x51\x76\x26\x8c\x0b\ +\x81\x4e\x5a\x4f\x9d\xca\xab\x93\xf9\x88\xdf\xa5\xeb\x5b\x59\xb9\ +\x38\x43\xac\xd4\x8b\xe9\xee\xe1\xf1\x28\xbb\xdd\x9c\xbf\x38\x85\ +\x6a\xa5\x82\x03\xfb\x26\x90\xcb\x65\xfd\x22\x58\x50\x79\xd0\xe8\ +\xc9\xa5\x31\xd4\x97\x43\xa9\xd2\x40\xb1\x52\x0f\xed\xf1\x0b\x05\ +\x95\xc6\x9a\xe2\x7a\x22\xdd\xa7\xc0\xb2\xdc\x5e\xbf\x1c\xbf\x5d\ +\x96\x97\x57\xb8\x45\xb5\xf0\xf5\xea\xda\x95\x79\x55\x64\x48\x58\ +\x27\xac\xac\xa8\xcd\xb0\xed\x82\x54\x27\x81\xd1\xa9\xa6\x5d\x14\ +\x98\x02\x88\x06\x2a\x60\x7b\x9b\x69\xad\x94\xdf\x09\x5f\x53\x94\ +\xb8\x30\x7d\x51\x8f\x54\xd7\xa7\x57\xed\x6a\xf1\x87\x99\xde\xb1\ +\x9c\x95\xca\xdc\x0c\x10\xed\x1c\xc1\x7a\xc3\xc6\xa5\xab\xb3\x58\ +\x59\x5d\xc7\xfe\xbd\xe3\xe8\xe9\xe9\x0e\x32\x15\x40\x05\x38\xbb\ +\x34\x8f\xf4\xe7\x50\x6f\x50\x6c\x94\x6a\xee\x32\xb4\x31\x41\x15\ +\xd7\xca\x02\xd3\xf4\xcb\xa5\xa5\xa7\x30\x62\xd3\xef\x6b\x1a\x50\ +\xf9\x4a\x9a\xef\x61\xc7\xed\x72\xa0\xab\xe2\x77\x92\xdf\xab\x9d\ +\x8e\xfe\x66\x9a\x93\x88\xa0\x6b\xd2\xf7\x25\x2e\xa8\xd8\xef\x5b\ +\x69\x2d\x79\xdf\xdb\x01\xb1\x76\xc6\xb5\xa2\x2f\xc6\x93\x7a\x71\ +\xa9\x58\x2b\xcc\xbf\x98\xed\x9b\x2c\x59\xe9\xfc\xad\xd0\xee\x76\ +\x03\x50\x0a\x4c\xcf\x2e\x62\x7a\x66\x01\x7b\x26\x86\x31\x38\xd8\ +\xcf\xe5\xc8\x82\x0a\x00\xb2\x69\x0b\xc3\xfd\x39\x10\x42\xb0\x5e\ +\xac\xb9\xbb\xdd\x44\x03\x15\x3b\x88\x34\x1a\xa8\x82\xa6\xdf\x78\ +\x2b\xa0\xda\x5c\xf8\x6a\x75\xf5\x0a\xeb\xa3\x8a\x03\x23\xf1\x38\ +\x4a\x5c\x33\xcd\xbc\xb0\xf8\xed\x02\x58\x2b\x4d\xc4\xed\x74\xe6\ +\x2b\x25\xce\xa6\xf4\x3b\xc5\xf2\xd9\x0d\xb0\x12\xbf\x9b\xf4\xb8\ +\x78\xbb\x5a\xa8\x95\x97\x2f\xbc\x9a\xed\xdb\x33\x9b\xca\x76\x1f\ +\x43\xc8\xb4\x9b\xc5\xe5\x35\x5c\xbc\x34\x8d\xe1\xa1\x3e\x8c\x8f\ +\x0d\x7b\xc4\x90\x40\x05\xe2\xf4\xc2\x0d\xf7\xe5\x90\xcb\x58\x58\ +\xf7\xa6\xdd\x10\xc1\x6f\xd5\x02\xa8\x58\xe7\xbc\xe7\x4c\xdf\x62\ +\x50\x45\xd1\x69\x15\x50\x61\xf1\xad\x58\x68\x5b\x01\xa9\x66\x9b\ +\x69\x51\xce\xbf\x15\x1f\x97\x51\xe2\x80\x0a\xd8\x39\x96\xcf\x4e\ +\x81\x95\xf8\x1d\x11\xd3\x98\xc2\x40\xed\x9a\x5d\x5e\x7c\xe7\x6c\ +\xa6\x67\xf4\x9d\x54\xae\xf7\x08\x21\xd6\x18\x34\x42\x08\xc1\x7a\ +\xa1\x88\x73\x17\xae\xa2\x2b\x97\xc5\x5e\x76\xda\x0d\x93\x3d\xeb\ +\x97\x1a\xe8\xcd\xa2\xd7\x9d\x76\x53\xab\xdb\x1d\xb2\xa8\x1c\x87\ +\x7e\x87\x41\x05\x4d\x78\x33\xcd\x3e\xf6\xb8\xd9\x66\x4e\x5c\x80\ +\x45\x4d\xd3\x29\x48\xed\x14\x4b\x2d\x54\x9a\x05\x15\xfb\x7d\xbb\ +\x60\xd2\xee\xfc\x11\x12\x16\xe5\x1a\x44\x29\x23\x4a\x79\x04\xa0\ +\x28\x2f\x9d\xbb\x92\xca\x74\xbf\x92\xee\x1a\x3c\x40\xac\xd4\x7e\ +\x5d\xbd\xbc\x69\x37\xe7\x2e\x5c\x81\x6d\x37\xb0\x7f\xdf\x04\xb2\ +\xca\x69\x37\x4e\xd6\x84\x00\xbd\xf9\x34\x06\x7b\xb2\xd8\x2c\x3b\ +\x3d\x82\x9e\x4e\x5c\x1f\x95\xe8\x4c\x67\xc6\xa2\x82\xb4\xe0\xa3\ +\x22\xa0\xc5\xfa\xe6\xe2\x57\x2a\xab\x97\xc3\x86\x27\xa8\x8e\xc5\ +\xb0\x76\x37\x01\xa3\x7c\xef\x54\xd3\xd0\x94\x76\x3b\x21\xd5\xac\ +\x75\x1a\x49\xe2\x82\x0a\x68\x2f\x78\x5a\xb5\x6e\xe2\x5a\x42\xba\ +\x73\x69\x87\x1f\x4a\x57\x56\x14\xff\x94\x2e\x3d\xa9\xac\x5e\x5e\ +\x00\xb5\x7f\x98\xe9\x19\x1d\x8c\xb2\xdb\xcd\x85\x4b\x33\x28\x14\ +\x36\x71\x60\xff\x04\xba\xba\xf2\x4c\x7c\x50\x84\xf7\xbd\x2b\x9b\ +\xc2\x70\x5f\x0e\x95\x9a\x8d\xcd\x72\x5d\xdb\xf4\x33\xf7\xfa\x09\ +\xba\xc1\x17\xc6\x99\x9e\x92\x9e\xe8\x48\x16\x55\x31\x32\xa8\x54\ +\xe1\x51\xad\xac\x56\x20\xd6\x4c\xbc\x4a\xb7\x59\xa8\xb5\xdb\xfa\ +\x0a\x8b\x6b\x35\xff\x28\x3e\x2e\xa5\x34\x03\x2a\x60\xeb\x9b\x7a\ +\x5b\x91\x4f\xd4\x38\xd3\x75\xd0\xe9\x45\x89\xd7\xe6\x5b\x2b\xcc\ +\x6d\xd4\xcb\x6b\x3f\x74\x77\xbb\x39\x06\xc3\xb4\x1b\x9b\x52\x5c\ +\x99\x9e\xc3\xfc\xc2\x12\xf6\xef\x19\xf3\xa7\xdd\x70\xa0\x62\x4a\ +\xc8\x66\x2c\x8c\xf4\xe5\x9d\x69\x37\xa5\xba\x0b\x11\x9d\xf5\xe4\ +\x84\x9b\xc7\x51\x05\x99\x3b\xa0\xca\x05\xe3\xa8\x84\xba\x86\x80\ +\x6a\xb3\xa6\xb7\xa8\x7c\xa5\x16\x8e\xe3\x34\x01\xa3\xe8\x34\xf3\ +\x42\x87\xc5\x6f\x65\x13\x31\x6a\x9c\x28\xad\x34\x05\x23\x4b\xb3\ +\xa0\x02\x76\x96\xdf\xa8\x5d\x3a\xe2\x77\xc4\x4c\x1b\x96\x06\x86\ +\x30\x53\x3e\xa4\x51\x5e\x2d\x57\xd7\xae\xbe\x94\xed\xdf\xb3\xe2\ +\xf6\x08\xf6\xc0\x20\x73\xf3\xcb\xb8\x7c\xc5\x99\x76\x33\x32\x32\ +\x28\x15\xc3\x36\xd1\xd2\x29\x0b\xc3\x7d\x39\xa4\x2c\x82\xf5\x62\ +\x1d\x0d\x77\xda\x4d\xb3\xcb\xbe\x78\x62\x11\x60\x7c\x80\x19\x99\ +\xce\x3c\x9e\xd1\x7c\x54\x1c\xa8\x9a\x71\x9c\x8b\x61\x71\xad\x27\ +\x93\x5e\x1c\xcb\x4a\x15\xde\x69\x80\x6d\x87\x45\x16\xe7\x3a\xc4\ +\x92\x56\x40\x05\xec\x0c\x58\x45\xa9\x4f\x54\x9d\x76\xc3\x2c\x4a\ +\xba\xc8\x69\xed\x7a\xb9\x5e\x5a\x7a\xf7\x8d\x6c\xdf\xe4\x25\x67\ +\x21\x3e\x6b\x08\xba\x0c\x09\xc1\xca\xda\x06\xde\xbd\x70\x15\x03\ +\x7d\xdd\x98\x98\xf0\xa6\xdd\x50\x48\xbe\x24\x38\x83\x33\x07\x7b\ +\x72\xe8\xca\xa5\xb0\x51\xaa\xa1\x56\xa7\x4d\xcc\xf5\xe3\x85\x1d\ +\x47\xe5\x3d\x9e\xd4\xfd\x37\x1a\xa8\x96\xbe\x5c\x59\xbd\x14\x07\ +\x54\xaa\xf0\xb0\x5f\xf2\x38\x4d\xb5\x56\xbe\xb7\xcb\x01\xdf\x6e\ +\x20\xb5\x9a\x67\xb3\xf5\x88\x25\xad\x82\x0a\xd8\x39\xb0\x6a\xd5\ +\x6f\xd5\xae\xe6\x5e\xbb\xbe\xab\xc5\x6e\xd0\xd2\xc2\xd9\x77\x33\ +\xdd\xc3\x6f\xa4\xf2\x7d\x37\x10\x12\x36\xed\xa6\x84\x77\xde\xbd\ +\x82\x74\xca\xc2\xfe\xbd\xe3\xfe\x6e\x37\x22\xa8\x3c\x87\x79\x5f\ +\x57\x06\xfd\x5d\x59\x6c\x94\x9d\xdd\x6e\x22\x5b\x55\x41\xa1\x3e\ +\x55\x38\x50\x81\x7f\x4a\x09\xc2\x41\x55\x2f\x2e\x7d\xb9\xb2\x62\ +\x04\x15\x10\x0f\x3e\x61\xf1\xcd\x58\x59\x9d\x70\xb0\xab\xe2\x3b\ +\x11\xd7\x6c\x5e\x5b\x0a\x29\xa0\xbd\xa0\x62\xbf\xef\x36\x58\xb5\ +\x0a\x24\x84\xc4\xb7\x62\x55\x29\x75\xcb\xcb\xe7\xa7\xad\x54\xf6\ +\xc5\x74\xd7\xf0\x44\x94\x69\x37\xef\x5e\xbc\x8a\x4a\xb9\x82\x83\ +\xfb\x27\x91\xcb\xe5\x94\x7a\x9e\x74\xe7\xd2\x18\xea\xcd\x3a\xd3\ +\x6e\xaa\x8d\x48\xce\x73\x55\x85\x2d\x0b\x98\x18\x70\xd6\xa3\x0a\ +\x9e\x52\xea\x97\x17\xb2\x70\x9e\x07\xaa\x39\xe1\x7a\xc4\xf5\x4b\ +\xa9\xc2\x9b\x01\x59\x2b\x10\xdb\x89\x00\x6b\x36\xaf\x56\x1c\xf1\ +\x4d\x4b\x3b\x40\x05\xb4\xd7\xc7\xd4\x4a\x3e\x51\xe3\x5a\xa9\x7b\ +\x58\xbd\xa3\xa4\x33\xa5\x35\xe5\xc5\x85\x57\xd7\xa6\x96\xed\x7a\ +\xe5\xf9\x6c\xef\x78\x9e\xa4\x32\x47\x61\xd8\x9a\xab\x5e\xb7\x71\ +\xe9\xca\x0c\x56\x56\xd6\x71\x60\xdf\x84\x3f\xed\x86\xd5\x61\x8b\ +\xcc\x67\x9c\x1e\xc1\x5a\x83\x62\xa3\x5c\x83\xe7\x65\x57\xc3\xca\ +\x0f\xf4\x8f\x03\x8b\xaa\x0b\xdd\xfe\xea\x09\x41\xfb\x2f\x1a\xa8\ +\x96\xbf\x54\x59\xb9\x18\x06\xaa\xa8\x61\xdb\x61\x65\xb5\xea\xdf\ +\xda\x4e\x0b\xac\x13\x3e\xae\xa6\xa5\x5d\xa0\x02\xda\x0b\x92\xb8\ +\x4d\xb4\x38\x71\x71\xeb\x60\xfa\x6e\x0a\x8b\x92\x2e\x4a\x9c\x49\ +\x8f\xd4\x37\x17\x37\x6b\x9b\x0b\x2f\x64\xfb\x26\xcb\x56\x2a\x77\ +\x3c\xda\xb4\x9b\x39\xec\x99\x18\xc5\xd0\x60\x3f\x9f\xb1\xb0\x2d\ +\x4d\x26\x6d\x61\xb8\x2f\x0b\x02\x6f\xda\x4d\xb0\x5c\x0c\x0b\x2b\ +\xbe\x62\xc1\x37\xcb\x5f\x8f\x8a\x79\xcc\x68\x50\xa1\xa9\x30\x50\ +\x95\x96\x44\x50\x99\x1e\xf8\x66\x2c\xad\x56\xe1\xa4\x8b\x6b\x16\ +\x50\x61\xba\x9d\xb4\x94\x3a\x1d\xd7\x92\xb4\x13\x54\x40\xe7\x61\ +\xd5\x89\xa6\x20\x62\x84\x75\x02\x58\x51\xe3\x74\x79\x92\x46\x65\ +\xa3\x5a\x59\xb9\xf4\x72\xb6\x7f\xcf\x4c\x2a\xd3\x75\x3c\x74\xda\ +\xcd\xd2\x1a\x2e\x5c\xbc\x8a\x91\xa1\x7e\x67\xda\x8d\xd7\x88\x13\ +\xac\x2a\x10\x07\x36\x43\xbd\x59\x64\x33\x16\x36\x8a\xb5\x60\x6d\ +\x2b\x1f\x50\x3c\xa9\x78\x8b\x0a\xfc\x2e\x34\x8c\x43\x3d\xc2\xe6\ +\x0e\xc5\x7a\x71\xf9\x8b\x0a\x8b\x8a\xc9\xc9\x18\x16\xb7\x09\x18\ +\x76\xbc\x13\x00\x15\x16\xbf\x53\x01\xd6\xb2\xb4\x1b\x54\xc0\xce\ +\x87\x55\x9c\xfc\x10\x92\x8f\x4e\xbf\xd5\x66\x5d\x9c\x3c\x00\x00\ +\xb4\x51\xb5\xcb\x8b\x6f\xbf\x95\xe9\x9b\x78\x3b\x95\xed\xbd\x39\ +\x74\xda\xcd\x46\x11\xef\xbc\x7b\x05\xdd\xf9\x2c\xf6\xee\x19\x67\ +\xa6\xdd\x04\xc5\xfb\xcd\x3c\x42\x30\xd0\x9d\x45\x77\x3e\x8d\x8d\ +\x52\x0d\x95\x3a\x0d\x2a\x47\x18\x58\x09\xb5\xb6\x88\xbb\x66\xba\ +\xdb\xeb\x47\x85\x3a\x44\x00\xd5\x97\x5a\x00\x95\x2e\xbc\xd9\x26\ +\xa0\x29\x2e\x2e\xa0\x54\x3a\x71\xe2\x5b\x01\xdc\xae\x83\x14\xd0\ +\x19\x50\x79\xd2\x6e\x67\x79\xab\xd6\x90\x2e\xdf\x28\x69\xa3\xe4\ +\xdd\x49\x7f\x55\x14\x68\x11\x50\x8a\xf2\xe2\x3b\x97\xd3\xf9\xfe\ +\x97\xd2\xf9\x81\x83\xc4\x4a\x1d\xd4\xa5\xf5\xa6\xdd\xbc\xf3\xee\ +\x55\xd0\x46\x03\x07\xf6\x4f\x22\x9b\x49\x4b\x59\xb2\x46\x56\x4f\ +\x3e\x8d\x81\xee\x0c\x8a\x95\x3a\x4a\xee\x42\x7c\x6c\xed\x58\x60\ +\x51\x04\xeb\x51\x75\xe7\x55\x53\x68\x80\xa9\xa9\x39\xbc\xfc\xda\ +\x3b\x86\x5e\xbf\x95\x2f\x56\x56\x2e\x44\x05\x95\x2e\xae\x95\x26\ +\x60\x58\x7c\xdc\xef\xec\x71\xbb\x1c\xf0\x3b\xc5\x39\xdf\x76\x07\ +\x3a\x2b\x9d\x04\x15\x10\xdf\xfa\x89\x13\xd7\x4c\xfe\xad\x02\x29\ +\x2e\xb0\xda\xe9\x3c\x8f\x9c\x4f\x65\xe5\xe2\x3c\xb1\xac\xe7\xd3\ +\xdd\x23\x83\xc4\x4a\xdf\x84\x90\x69\x37\xe7\x2f\x4e\xa3\x50\xd8\ +\xc4\xc1\x03\x93\xdc\xb4\x1b\xa7\x30\xbe\x4b\xaf\x2b\x9b\xc2\x50\ +\x6f\x16\x95\xaa\x8d\x42\xa5\xce\x57\x48\xa8\x99\xd4\xf4\xf3\x85\ +\xc2\x1f\x9e\xf0\x9a\x61\x78\x42\x69\xe5\x0b\x95\x65\x25\xa8\x82\ +\x8c\xc2\xc3\x9a\x69\x02\x9a\xe2\x3b\x65\x65\x75\x32\xbe\x13\x56\ +\x57\x98\x7e\x5b\xa5\xd3\xa0\x02\xe2\x5b\x35\xed\x6c\xee\xe9\xea\ +\xd1\x4c\xaf\x5e\x2b\x43\x0c\x9a\x01\x56\x54\x5d\xe5\xb9\x56\xd7\ +\x67\xd6\xed\xea\xe6\x0f\xb2\xbd\x13\x84\xa4\x32\xb7\x02\x24\xa3\ +\x4c\xec\x4d\xbb\x99\x9a\xc3\xdc\xbc\x33\xed\xa6\xbf\xbf\x97\xcb\ +\x9e\x08\xa5\x64\xd3\xce\x48\x76\x6a\xbb\x0b\xf1\x29\x2a\xe2\x59\ +\x54\x12\xa8\x28\xf5\x0a\x8e\x02\xaa\x2f\x56\x96\x2f\xcc\xa2\x35\ +\x50\xe9\xc2\x5b\x81\x53\x54\xdd\x66\xbf\x77\xd2\x8f\xa5\x0a\xdb\ +\x71\x4d\x3d\x51\xb6\x02\x54\xc0\xf6\x00\xa9\x19\x27\x78\xbb\x00\ +\xd4\x2e\xeb\xa9\x19\x7d\xff\x5c\xea\xc5\xe5\x72\x75\x7d\xe6\x85\ +\xdc\xc0\xde\x15\x2b\x95\x3b\x01\x42\xba\x4d\x09\x67\xe7\x97\x71\ +\xf9\xca\x0c\xc6\xc7\x86\x30\x3a\x3c\xc8\x65\x29\xc2\x2a\x6d\x39\ +\x1b\x48\x38\xd3\x6e\x6a\x68\x38\x2b\xf1\x71\xf9\xf9\xbd\x7e\xb9\ +\xb4\x0f\xa8\xa0\xd3\x2f\x0c\x54\xd8\x6c\x94\x57\xbe\x50\x5e\x3e\ +\x1f\x17\x54\xba\xb8\xb8\xd6\x57\xa7\xad\xac\x66\x9c\xf1\xcd\xe4\ +\xb5\x95\x00\xeb\x98\x6c\x15\xa8\x80\xad\x07\x52\x94\x72\xa3\xd4\ +\x35\x2c\xaf\x38\x3a\xad\x38\xcf\xe3\xe4\xe5\x8b\x5d\x2b\x36\xca\ +\x4b\xef\xbe\x96\xed\xdf\x7b\xd1\xca\x74\xdd\x4a\x08\x19\xd2\x16\ +\x40\x08\x56\x56\x37\x70\xee\xfc\x55\x0c\xf4\x77\x63\x62\x62\x94\ +\x9f\x76\x23\x94\x6a\x11\x82\xc1\x9e\x2c\xf2\xd9\x14\xd6\x8b\xee\ +\xda\x56\x60\xe3\xbd\xa6\x5f\x4a\x7a\x92\xa3\x80\xaa\x5e\x5a\x0d\ +\x03\x15\x10\xdd\x82\xd2\x85\xb7\xcb\xb9\xae\xd3\x6d\x47\x6f\x61\ +\x9c\x66\xe4\x76\x01\xac\xa3\xb2\x95\xa0\xf2\x24\xaa\xff\xc9\xa4\ +\xdf\x6a\xd3\xcd\x14\x16\x25\xbe\x1d\xd6\x53\xdb\x7a\xfc\xc2\xd2\ +\x51\xbb\x4e\x4b\xf3\x67\xce\x65\x7b\xc7\x5f\x4b\xe5\xfa\x6e\x22\ +\xc4\x8a\x30\xed\xe6\x32\x32\x29\x0b\xfb\xf7\x4e\xb8\xd3\x6e\xd4\ +\xb0\xf2\xa6\xdd\xf4\x75\x65\xb0\x51\xaa\xa3\x52\x0f\xa0\x63\x59\ +\x04\x13\x4a\x1f\x55\x54\x50\xad\x7c\xde\x05\x95\x47\x4b\xe5\xe9\ +\x19\xae\x47\xb3\x3e\xac\x56\xe1\x14\x55\xaf\x9d\x80\x6a\x35\xbe\ +\x15\xe7\x7c\xc7\x65\x3b\x40\x05\x6c\x8d\x75\xd5\x4c\x7c\x94\xfa\ +\xc6\x3d\xaf\x28\xf9\xb5\xab\x7c\xe3\xb9\x97\x97\xce\x4d\xa5\xb2\ +\xbd\xcf\xa7\xbb\x06\xf6\x10\x2b\x75\x3d\x4c\xd3\x6e\x2a\x35\x9c\ +\xbb\x70\x15\xd5\x72\x05\x07\x0f\x4c\xba\xbb\xdd\x30\xb0\x12\x6a\ +\xd5\x93\x4b\x63\xd0\x9b\x76\x53\x69\x80\x02\x48\x11\x82\x49\x61\ +\x5f\xbf\x20\xa9\x07\x2a\xdd\xf0\x04\x6c\xd6\xcb\xab\x9f\x2f\x2f\ +\xbd\xeb\x59\x54\x61\x2f\x46\x54\x7f\x55\x33\xf0\x8a\x63\x85\xb5\ +\xa3\x27\x30\x0a\xa0\x9a\x49\xb7\xab\xac\x28\x56\xb6\x0b\x54\xc0\ +\xd6\x37\xf7\x10\x12\x66\x0a\x8f\x12\xdf\xae\x41\x9d\xcd\x3a\xd0\ +\xa3\x08\xa9\xac\x5e\x5a\x06\xe8\xf7\x33\x3d\xa3\xdd\xc4\x4a\xdf\ +\x82\x90\x69\x37\x17\xaf\xcc\x60\x65\x65\x0d\x07\xf7\x7b\xd3\x6e\ +\x02\xd7\xb9\x08\xac\x60\xda\x8d\x8d\x8d\x52\x0d\xc4\x38\xe0\x13\ +\x98\x9a\x9e\xc7\x2b\xaf\xbd\x1d\x06\xaa\x28\x53\x68\x74\xe1\xed\ +\x72\xac\x87\x1d\x37\x63\x3d\xa9\xe2\x9a\x05\x54\x94\x32\xdb\xdd\ +\x0c\xdc\x52\xd9\x4e\x50\x79\xb2\x55\xcd\xbd\x76\x02\x2b\xaa\x4e\ +\x98\x5e\x33\x83\x47\x5b\x19\x60\x0a\x00\xa4\xb6\x31\xbb\x59\x2f\ +\xad\xfe\x20\xdb\x3f\x59\xb6\x52\x99\xdb\x00\xf3\xb4\x9b\xa9\x99\ +\x45\x4c\x4f\xcf\x63\xef\xe4\x68\xb0\xdb\x0d\x53\x34\x5b\x78\x26\ +\x6d\x61\xa8\x2f\x07\x02\x82\x42\xa9\xe6\x4f\x4a\x06\x65\x9f\x70\ +\x6f\x99\x97\xb9\x10\x50\xad\x7d\x8e\xb1\xa8\x82\xc4\x6a\xe9\x74\ +\x13\x50\x3c\xde\xca\x26\xa0\x29\x7c\xab\x9b\x81\xdb\x22\x3b\x01\ +\x54\x40\x67\x9b\x7b\xcd\xe6\x6f\x0a\x37\xe9\x34\xeb\x4c\x6f\xa6\ +\xec\xa6\xd3\x37\xca\xab\xb5\xea\xea\x95\x1f\x65\x07\xf6\xcf\x5a\ +\xe9\xdc\x6d\x61\xd3\x6e\x16\x96\x56\x71\xe1\xe2\x14\x46\x86\xf9\ +\x69\x37\x62\x91\x5e\x93\x6f\xb0\x37\x8b\x5c\x26\x85\xae\x6c\x0a\ +\xf9\x4c\x0a\x54\x78\xce\x3d\x1f\x95\x09\x54\x8d\xca\xda\xe7\xca\ +\x4b\xe7\x66\x10\x0d\x54\xa6\xf8\x66\xad\xad\x4e\x34\x09\xe3\xea\ +\xe8\xd2\x74\xba\x07\x71\xc7\x40\x0a\xd8\x39\xa0\xf2\xa4\x13\xcd\ +\xbd\xa8\x3d\x7d\x61\x3a\xad\x82\xad\xd5\x26\x5f\x2b\x30\x55\xea\ +\xdb\xf5\x72\xa3\xb4\xf0\xd6\x9b\xb9\xc1\xfd\x67\xad\x4c\xf7\x31\ +\x42\x48\xc8\xb4\x9b\x4d\x67\xda\x4d\x97\x6e\xda\x0d\xab\x0f\xf4\ +\x77\x67\x90\xcb\xa4\x94\x35\x8c\xd2\xf4\x6b\x94\xd7\x3f\x5b\x5e\ +\x3a\xa7\x1b\xf0\xd9\x6a\x6f\x9f\x2e\x7c\x3b\xfd\x55\xed\x82\x5b\ +\x27\x9a\x81\xdb\x2a\x3b\x0d\x54\xc0\xf6\x8e\x24\x8f\xa2\xb3\x55\ +\x4d\xbe\x56\xcb\x88\x26\xd4\x46\x69\xfe\xad\x0b\xd9\xde\xb1\x1f\ +\xa5\x72\xbd\xd7\x11\x62\x45\x98\x76\x73\x05\xd4\x76\xa6\xdd\x64\ +\x32\x19\x63\xf6\x44\x89\x18\x0a\x10\x82\xe9\x99\x30\x8b\x6a\xfd\ +\x73\xe5\xc5\x77\x74\xc3\x13\xae\xc5\x26\xa0\x78\xbc\x95\x80\x0a\ +\x2b\x6f\x5b\x65\x27\x82\xca\x93\xed\x1c\x49\x1e\x45\xa7\x93\xc3\ +\x0d\xda\xd1\xcb\x17\x2b\x4d\x79\xe9\xdc\x5c\x2a\xd3\xfd\xfd\x74\ +\xd7\xe0\x08\xb1\x52\x47\x60\xe8\x11\xe4\xa6\xdd\xec\x9f\x44\x57\ +\x57\x2e\xbc\x04\xc5\x80\xcf\x08\xa0\xfa\x6c\x13\xa0\x32\xc5\x6f\ +\x77\x2f\xa0\x49\xb7\x93\xdf\x77\x55\x33\x4f\x25\x3b\x19\x54\x40\ +\x7b\x86\x1b\x74\xe2\x7b\x58\x3d\x5b\xe9\xe5\x6b\x97\xb5\x15\x56\ +\x47\x29\xbe\xb2\x7a\x79\x8d\xda\xf5\xef\x67\x7a\xc7\x09\xb1\xd2\ +\xc7\x01\x68\x77\xbb\x69\x50\x8a\x2b\x53\xb3\x98\x9f\x5f\xc6\xbe\ +\x3d\x63\xe8\xef\xeb\x01\x75\x61\xe4\x15\x64\x7a\xe2\x23\x80\xaa\ +\xd0\xa8\x6c\x98\x40\xe5\x49\x3b\x7a\x01\x55\x71\x5b\xd1\x04\x34\ +\xc5\xb5\x1b\x50\xaa\xf0\x28\xd6\xe4\x8e\x90\x9d\x0e\x2a\x4f\xda\ +\xd1\x7b\xb7\x55\x53\x5f\x76\x47\x93\x4f\x9d\x27\xa9\x15\xe6\x4b\ +\xf5\xe2\xf2\xf3\xd9\xfe\x3d\xab\x56\x2a\x73\x12\x50\x4f\xbb\xf1\ +\x2a\x30\x3b\xbf\xe4\xec\x76\x33\x36\x84\x61\x6e\xda\x4d\x48\x61\ +\x51\x2c\xaa\xea\xc6\x67\xcb\x8b\x6f\x8b\xce\x74\x51\x76\x5b\x13\ +\xd0\x14\xd7\x2e\x88\xb5\xd2\x5b\xb8\x23\x65\xb7\x80\xca\x93\x76\ +\x03\x2b\xaa\x4e\xb3\xcd\xbf\x9d\xde\xe4\x53\xe6\xd3\x28\xaf\xd5\ +\x2b\xcb\xe7\x5f\xc9\x0d\x1e\xbc\xe8\xf6\x08\x86\x4e\xbb\x79\xf7\ +\xc2\x55\x0c\xf6\xf7\x60\x62\x7c\x04\x96\x15\x5e\x15\x42\x08\xa6\ +\x42\x40\x65\x57\x0a\x7f\x5c\x6a\x1e\x54\xa6\xf8\xad\x68\x02\x86\ +\x1d\xb7\x6b\x08\x43\x14\x9d\x5d\x0b\x28\x4f\x76\x1b\xa8\x3c\xe9\ +\x24\xb0\xa2\xe6\x15\x57\x6f\x2b\x07\x76\x36\x93\x07\xf7\xd0\xd2\ +\x46\xd5\x2e\xce\xbf\x79\x36\x37\x78\xf0\x35\x2b\xd3\x7d\x84\x10\ +\x62\x9c\x76\x53\xd8\x74\xa7\xdd\xa4\x53\xd8\xc7\xec\x76\xa3\x2c\ +\x88\xba\x16\xd5\xf4\x3c\x5e\x79\xdd\x64\x51\x15\xfe\xb8\xb4\x70\ +\x36\x0c\x54\xca\xfa\x87\x84\x77\x6a\x20\x68\x98\xfe\x76\x8e\xc3\ +\xda\x95\x80\xf2\x64\xb7\x82\xca\x93\x56\xe7\xf2\xa9\x74\xb6\xc2\ +\x79\xde\xae\xba\xb6\x43\x8c\xe7\x51\x9a\x7f\xeb\x4a\xb6\x77\xec\ +\x07\xa9\x5c\xef\x3e\x42\xac\xc3\x3a\x7d\x6e\xda\x4d\xa5\x8a\x03\ +\xfb\xdd\x69\x37\x54\xfd\x56\x10\x02\x4c\xcf\x2c\xe8\x41\x45\xb0\ +\xd9\xa8\x14\xfe\xc8\x05\x95\x69\xae\x9f\x27\xed\x68\x02\x36\x63\ +\x69\xc5\x8d\x6f\x15\x50\xed\xe8\x09\xdc\x75\xb2\xdb\x41\xe5\x49\ +\x3b\x86\x24\x98\xc2\x9b\xcd\x2f\x6a\x9e\xad\x8c\x36\xef\x04\xbc\ +\xb8\xfc\xcb\x4b\xe7\x16\xad\x74\xd7\xf7\x32\xdd\xc3\xdd\xc4\x4a\ +\x1d\x83\x71\xda\x4d\x03\x17\x2f\xcf\x60\x75\xd5\xd9\xed\xa6\xbb\ +\xbb\x8b\xd1\xa0\x9c\xee\xf4\xcc\x02\x5e\x36\x5a\x54\xc5\x3f\x2a\ +\x2d\xbc\xe5\x59\x54\xcd\x82\xca\x14\xdf\xae\x26\xa0\x18\xd6\xc9\ +\x26\xa0\x49\xef\x9a\x03\x94\x27\xd7\x0a\xa8\x3c\x69\x65\x50\x66\ +\xbb\xac\xa7\x76\x4c\x30\xde\xb6\x26\x9f\x2e\xaf\xea\xda\x95\x0d\ +\x38\x3d\x82\x15\x62\xa5\x4f\x02\xd0\x4c\xbb\x21\xee\xb4\x9b\x05\ +\x4c\xcf\xcc\x63\xef\xc4\x08\x06\x07\xfb\xa4\x62\x3c\x50\x99\x9a\ +\x7e\x76\x75\xd3\x03\x55\x1c\xd9\x09\x4d\xc0\xb0\xe3\x66\x74\x5b\ +\x75\xb4\xef\x6a\xb9\xd6\x40\xe5\x49\x27\x7b\xf8\xda\xd9\xe4\xdb\ +\xca\x29\x35\xad\xe6\x47\x6a\x85\xf9\x4a\xad\x30\xff\x42\x6e\x60\ +\xff\x0c\xb1\x32\xb7\x47\x9a\x76\x73\x69\x0a\x23\x43\x03\x18\x1b\ +\x1d\x12\x46\x7f\x12\x4c\x85\x81\xaa\x56\xfc\x4c\x69\xfe\x2d\xaf\ +\xe9\xe7\x49\xbb\x9b\x80\xed\x02\xd8\x4e\xb2\xb2\xae\x19\x40\x79\ +\x72\xad\x82\xca\x93\x4e\x3b\xcc\xdb\x39\xc8\xb3\x99\x34\x9d\x6e\ +\xf6\x89\x65\x91\x46\x65\xa3\x51\x9c\x7f\xeb\xf5\xfc\xf0\x0d\x67\ +\xad\x74\xf6\x56\x10\x32\xae\x4d\x40\x08\xd6\x36\x36\x71\xee\xfc\ +\x15\xf4\x74\xe5\x30\x39\x39\x06\xcb\x4a\x05\xce\xf4\x50\x8b\xaa\ +\xf8\x99\xd2\xfc\x99\x76\xcc\xf5\x33\xc5\xb5\x73\x6c\x95\x18\xb6\ +\x5d\x4d\xc0\x6b\x4e\xae\x75\x50\x79\xd2\x0e\x87\x79\xa7\xe6\xea\ +\xc5\xad\x7b\x94\xfc\x5a\xe9\x25\x0b\xd7\xa7\x0d\x5a\x9c\x7b\xfd\ +\x7c\x6e\xe8\xd0\x8b\xa9\x4c\xd7\x0d\x20\xe4\x90\xae\x4c\x42\x08\ +\x4a\xa5\x0a\xce\x9d\xbf\x02\x50\x1b\xfb\xf7\x4d\x20\x93\xc9\x44\ +\x03\x55\xad\xf4\x87\x02\xa8\xa2\xd6\x39\x2e\xac\x74\xe1\x9d\x6e\ +\x02\x8a\xc7\x09\xa0\x34\xf2\x5e\x01\x15\x2b\x3b\x65\xae\xde\x76\ +\x8d\x99\x6a\x25\x2d\xfb\x42\x90\xd2\xfc\x99\xe9\x4c\xef\xf8\x5f\ +\xa4\x72\x7d\xa3\x84\x58\x47\x60\xd8\xed\xa6\x5a\xab\xe3\xfc\xa5\ +\x69\x6c\x16\x8a\x38\xb0\x7f\x02\x5d\x5d\x79\x67\x52\xf2\xeb\xef\ +\x68\x47\xa6\x3b\xa0\x7a\xb3\x99\x29\x34\x3b\x69\x6c\x55\x98\x4e\ +\x02\xa7\x08\xf2\x5e\x04\x95\x27\x5b\xb9\x3c\x4b\xbb\xd7\x94\x8a\ +\x53\x76\x27\xf3\x24\xe5\xa5\x73\x2b\xa9\x6c\xcf\xf7\xd2\x5d\x43\ +\x29\x62\xa5\x6e\x83\x69\xda\x4d\xc3\x99\x76\xb3\xb0\xb0\x82\xfd\ +\xfb\xc6\xb1\xb1\x51\x74\x41\xa5\x5c\x8a\xb8\x60\xd7\xcb\x9f\x29\ +\xcd\xbd\xa9\x1b\x47\x15\xe5\x45\xed\x84\x5f\x4a\x15\xd6\xce\x26\ +\x60\xdc\xb4\xef\x09\x79\x2f\x83\x8a\x95\xed\x58\x9e\x25\x4c\x67\ +\xbb\x9d\xe7\x91\xf3\xad\xac\x5e\x2e\x82\x36\x9e\xcb\xf6\x8e\xaf\ +\x11\x2b\x7d\x3b\x80\x1e\xa5\xa2\x5b\x83\xd9\xf9\x25\x5c\x9d\x9a\ +\x43\xc3\x6e\xe0\xca\xd5\x39\x2d\xa8\x68\xbd\xfc\x87\xc5\xb9\x37\ +\x5a\x19\x99\xbe\x53\xa6\xd7\xc4\x3d\x4e\xe0\x24\x48\x02\x2a\x59\ +\xae\xd5\x26\x5f\x9c\x87\xbd\x89\x1e\xc1\xb9\x5a\x75\x6d\xea\x47\ +\xf9\xe1\xeb\x2e\x92\x54\xfa\x24\x40\x86\xb5\xca\x84\x60\x79\x65\ +\x1d\xd3\x33\x0b\xa8\x37\x6c\x9d\x5a\xc1\xae\x57\xfe\x77\x08\xa8\ +\x76\xf2\xd8\xaa\x76\x36\x01\xdf\xf3\x92\x80\xca\x2c\xd7\x52\x93\ +\xaf\xe3\x3d\x84\x76\xad\x48\x8b\xf3\x67\xce\x74\x8d\xde\xf4\xaa\ +\x95\xca\x1e\x05\x21\xfb\xb4\x95\x21\x44\xe7\x9b\xf2\x34\x0a\xb4\ +\x51\xfd\xc3\xe2\xec\xeb\xd3\x68\xde\xa2\x0a\xd3\xd9\xe9\x4d\xc0\ +\x44\x5c\x49\x40\x15\x5d\xb6\xbb\x97\xaf\x5d\xf5\xee\xac\xd0\x06\ +\x8a\xb3\xaf\x5d\xca\x8f\xdc\xf0\x9c\x95\xce\xef\x07\x21\x87\xa1\ +\x59\xdb\x2a\x44\x0a\xb4\x5e\xfd\xdf\xc5\xd9\xd7\xc2\x40\xe5\x97\ +\xdc\x44\x5c\xa7\xa7\xd7\x34\x73\x9c\x88\x42\x12\x50\x35\x27\xd7\ +\x62\x93\xaf\x9d\x40\x23\xc5\xb9\x37\x17\xb2\xfd\x7b\xbe\x63\xe5\ +\x7a\xfa\x08\xb1\xb4\xd3\x6e\x0c\x52\xa0\x8d\xca\xa7\x23\x82\x6a\ +\x2b\x9a\x80\xcd\x8e\x62\x8f\x3b\x76\x2b\x11\x85\x24\xa0\x6a\x5d\ +\xb6\x73\x82\x71\x3b\xe1\xd2\xee\x97\x87\x94\x16\xdf\x5e\xcf\x74\ +\x8f\x7c\x37\x95\xef\xaf\x12\x62\xdd\x01\xcd\xb4\x1b\x8d\x14\xa8\ +\x5d\xfb\x74\x71\xe6\xd5\x76\x80\x2a\x4c\xaf\xd3\xd3\x6b\xe2\xd4\ +\x31\x11\x85\x24\xa0\x6a\xbf\x74\x62\x82\x71\x33\x0f\xf9\xd6\x36\ +\xf9\x34\x75\x28\x2f\x9f\xaf\x80\xd2\x1f\x64\x7b\x27\x66\x89\x95\ +\xba\x03\x40\x7f\xc4\xb4\x05\xda\xa8\xfd\xaf\x88\xa0\x62\xa5\x93\ +\x23\xd3\x5b\x0d\x4b\xa4\x49\x49\x40\xd5\x79\x69\x15\x52\xed\xee\ +\x9a\x6f\xb6\x7e\x4d\x4b\x6d\x63\xb6\x51\x5d\x9f\x7a\xa5\x6b\xf8\ +\x86\xb7\x88\x95\x3a\x0e\x90\x89\x08\xc9\x0a\xb0\xeb\x9f\xde\x9c\ +\x79\x65\x1a\xd1\x96\x79\x69\xf5\x7a\xb4\x62\x41\x45\xc9\x3f\x91\ +\x16\xa4\x19\x27\x67\x22\xf1\x84\x0a\x7f\xba\xf0\xb8\x7f\xed\xca\ +\x67\x2b\xfe\x50\x2b\xcc\xd3\xb9\x17\xfe\xcb\x57\xed\x5a\xf9\x17\ +\x01\xfa\x4d\x84\xbf\xd8\x14\x20\x8d\x76\xd6\xa1\xc3\xd7\x3d\x91\ +\x0e\x4a\x62\x51\xed\x0c\xd9\xce\x9e\xbe\xad\x7c\xc9\xc8\xe6\xcc\ +\x2b\x53\x5d\xe3\xb7\x7c\xd7\xb2\x32\x63\x20\xe4\x28\xf4\xcf\xe0\ +\xf9\x46\x6d\xf3\x3f\x16\x67\x5f\x2f\x34\x51\xce\x56\x0c\x02\x4d\ +\x64\x0b\x25\x01\xd5\xce\x95\x8e\x2f\x88\xb7\x5d\xe7\x55\x9c\x79\ +\x75\xb9\x6b\xfc\x96\x6f\x5b\xa9\x4c\x06\x84\x9c\x84\x6a\xda\x0d\ +\xa5\x9f\x29\xcd\xbf\xf5\xd9\xea\xfa\x14\x15\xea\xba\x5d\x4d\xc0\ +\x44\xb6\x51\x12\x50\xed\x3e\xd9\x09\x4e\xf2\xb8\x75\x12\x5f\x7e\ +\x52\x9c\x7d\x75\x33\x3f\x76\xe4\x7b\x56\x2a\xbb\xe2\x5a\x56\x03\ +\x6e\x3e\x35\x00\x5f\xa4\x76\xed\x9f\x2f\x9f\xf9\xd2\x82\x22\xef\ +\x56\x41\x15\x47\x27\x91\x1d\x22\x3b\xf1\xa1\x4f\xa4\x79\xd9\xc9\ +\xeb\x59\xa9\x84\x0e\xde\xf4\x54\x2a\x37\x74\xdd\x31\x62\x59\x1f\ +\x00\x90\x07\xc5\x25\x6a\xd7\xbf\x3c\xf7\xc3\xff\xec\x6d\xe5\x1e\ +\xd7\x9a\x42\x0b\xfa\x89\xec\x50\xd9\xee\x07\x35\x91\xad\x17\x71\ +\xfd\xf1\x9d\xf0\x0c\xa8\x80\x62\xb2\xa4\xa2\xac\xa1\x9e\xc8\x35\ +\x24\x3b\xe1\x21\x4d\x64\x77\x48\xa7\x9e\x95\x04\x38\x89\x84\xca\ +\xff\x0f\x54\x62\xd6\x8a\x59\xb9\x9c\x52\x00\x00\x00\x14\x74\x45\ +\x58\x74\x41\x75\x74\x68\x6f\x72\x00\x4a\x61\x6b\x75\x62\x20\x53\ +\x74\x65\x69\x6e\x65\x72\xe6\xfb\xf7\x2f\x00\x00\x00\x49\x74\x45\ +\x58\x74\x43\x6f\x70\x79\x72\x69\x67\x68\x74\x00\x50\x75\x62\x6c\ +\x69\x63\x20\x44\x6f\x6d\x61\x69\x6e\x20\x68\x74\x74\x70\x3a\x2f\ +\x2f\x63\x72\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\x6e\x73\ +\x2e\x6f\x72\x67\x2f\x6c\x69\x63\x65\x6e\x73\x65\x73\x2f\x70\x75\ +\x62\x6c\x69\x63\x64\x6f\x6d\x61\x69\x6e\x2f\x59\xc3\xfe\xca\x00\ +\x00\x00\x25\x74\x45\x58\x74\x64\x61\x74\x65\x3a\x63\x72\x65\x61\ +\x74\x65\x00\x32\x30\x31\x35\x2d\x31\x30\x2d\x31\x33\x54\x31\x35\ +\x3a\x30\x33\x3a\x33\x32\x2b\x30\x39\x3a\x30\x30\xf5\xf6\x5c\xde\ +\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\x74\x65\x3a\x6d\x6f\x64\ +\x69\x66\x79\x00\x32\x30\x31\x35\x2d\x31\x30\x2d\x31\x33\x54\x31\ +\x35\x3a\x30\x33\x3a\x33\x32\x2b\x30\x39\x3a\x30\x30\x84\xab\xe4\ +\x62\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\ +\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\ +\x72\x67\x9b\xee\x3c\x1a\x00\x00\x00\x21\x74\x45\x58\x74\x53\x6f\ +\x75\x72\x63\x65\x00\x68\x74\x74\x70\x3a\x2f\x2f\x6a\x69\x6d\x6d\ +\x61\x63\x2e\x6d\x75\x73\x69\x63\x68\x61\x6c\x6c\x2e\x63\x7a\x69\ +\x66\xe3\x5e\x00\x00\x00\x0d\x74\x45\x58\x74\x54\x69\x74\x6c\x65\ +\x00\x47\x6f\x20\x44\x6f\x77\x6e\xf3\xfd\x14\x79\x00\x00\x00\x00\ +\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x07\xc9\ +\x73\ +\x61\x76\x65\x41\x73\x44\x65\x74\x61\x69\x6c\x3d\xe5\xb0\x87\xe6\ +\xa8\x99\xe7\xb1\xa4\xe4\xbf\x9d\xe5\xad\x98\xe5\x88\xb0\xe5\x85\ +\xb6\xe4\xbb\x96\xe6\x96\x87\xe4\xbb\xb6\x0a\x63\x68\x61\x6e\x67\ +\x65\x53\x61\x76\x65\x44\x69\x72\x3d\xe6\x94\xb9\xe8\xae\x8a\xe5\ +\xad\x98\xe6\x94\xbe\xe7\x9b\xae\xe9\x8c\x84\x0a\x6f\x70\x65\x6e\ +\x46\x69\x6c\x65\x3d\xe9\x96\x8b\xe5\x95\x9f\xe6\xaa\x94\xe6\xa1\ +\x88\x0a\x73\x68\x61\x70\x65\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\ +\x44\x65\x74\x61\x69\x6c\x3d\xe6\x9b\xb4\xe6\x94\xb9\xe7\xb7\x9a\ +\xe6\xa2\x9d\xe9\xa1\x8f\xe8\x89\xb2\x0a\x72\x65\x73\x65\x74\x41\ +\x6c\x6c\x3d\xe9\x87\x8d\xe7\xbd\xae\x0a\x63\x72\x74\x42\x6f\x78\ +\x3d\xe5\x89\xb5\xe5\xbb\xba\xe5\x8d\x80\xe5\xa1\x8a\x0a\x63\x72\ +\x74\x42\x6f\x78\x44\x65\x74\x61\x69\x6c\x3d\xe7\x95\xab\xe4\xb8\ +\x80\xe5\x80\x8b\xe5\x8d\x80\xe5\xa1\x8a\x0a\x64\x75\x70\x42\x6f\ +\x78\x44\x65\x74\x61\x69\x6c\x3d\xe8\xa4\x87\xe8\xa3\xbd\xe5\x8d\ +\x80\xe5\xa1\x8a\x0a\x76\x65\x72\x69\x66\x79\x49\x6d\x67\x3d\xe9\ +\xa9\x97\xe8\xad\x89\xe5\x9c\x96\xe5\x83\x8f\x0a\x7a\x6f\x6f\x6d\ +\x69\x6e\x44\x65\x74\x61\x69\x6c\x3d\xe6\x94\xbe\xe5\xa4\xa7\x0a\ +\x76\x65\x72\x69\x66\x79\x49\x6d\x67\x44\x65\x74\x61\x69\x6c\x3d\ +\xe9\xa9\x97\xe8\xad\x89\xe5\x9c\x96\xe5\x83\x8f\x0a\x73\x61\x76\ +\x65\x44\x65\x74\x61\x69\x6c\x3d\xe5\xb0\x87\xe6\xa8\x99\xe7\xb1\ +\xa4\xe5\xad\x98\xe5\x88\xb0\x0a\x6f\x70\x65\x6e\x46\x69\x6c\x65\ +\x44\x65\x74\x61\x69\x6c\x3d\xe6\x89\x93\xe9\x96\x8b\xe5\x9c\x96\ +\xe5\x83\x8f\x0a\x66\x69\x74\x57\x69\x64\x74\x68\x44\x65\x74\x61\ +\x69\x6c\x3d\xe8\xaa\xbf\xe6\x95\xb4\xe5\x88\xb0\xe7\xaa\x97\xe5\ +\x8f\xa3\xe5\xaf\xac\xe5\xba\xa6\x0a\x74\x75\x74\x6f\x72\x69\x61\ +\x6c\x3d\x59\x6f\x75\x54\x75\x62\x65\xe6\x95\x99\xe5\xad\xb8\x0a\ +\x65\x64\x69\x74\x4c\x61\x62\x65\x6c\x3d\xe7\xb7\xa8\xe8\xbc\xaf\ +\xe6\xa8\x99\xe7\xb1\xa4\x0a\x6f\x70\x65\x6e\x41\x6e\x6e\x6f\x74\ +\x61\x74\x69\x6f\x6e\x44\x65\x74\x61\x69\x6c\x3d\xe6\x89\x93\xe9\ +\x96\x8b\xe6\xa8\x99\xe7\xb1\xa4\xe6\x96\x87\xe4\xbb\xb6\x0a\x71\ +\x75\x69\x74\x3d\xe7\xb5\x90\xe6\x9d\x9f\x0a\x73\x68\x61\x70\x65\ +\x46\x69\x6c\x6c\x43\x6f\x6c\x6f\x72\x44\x65\x74\x61\x69\x6c\x3d\ +\xe6\x9b\xb4\xe6\x94\xb9\xe5\xa1\xab\xe5\x85\x85\xe9\xa1\x8f\xe8\ +\x89\xb2\x0a\x63\x6c\x6f\x73\x65\x43\x75\x72\x44\x65\x74\x61\x69\ +\x6c\x3d\xe9\x97\x9c\xe9\x96\x89\xe7\x9b\xae\xe5\x89\x8d\xe6\xaa\ +\x94\xe6\xa1\x88\x0a\x63\x6c\x6f\x73\x65\x43\x75\x72\x3d\xe9\x97\ +\x9c\xe9\x96\x89\x0a\x64\x65\x6c\x65\x74\x65\x49\x6d\x67\x3d\xe5\ +\x88\xaa\xe9\x99\xa4\xe5\x9c\x96\xe5\x83\x8f\x0a\x64\x65\x6c\x65\ +\x74\x65\x49\x6d\x67\x44\x65\x74\x61\x69\x6c\x3d\xe5\x88\xaa\xe9\ +\x99\xa4\xe7\x9b\xae\xe5\x89\x8d\xe5\x9c\x96\xe5\x83\x8f\x0a\x66\ +\x69\x74\x57\x69\x6e\x3d\xe8\xaa\xbf\xe6\x95\xb4\xe5\x88\xb0\xe8\ +\xb7\x9f\xe7\xaa\x97\xe5\x8f\xa3\xe4\xb8\x80\xe6\xa8\xa3\xe5\xa4\ +\xa7\xe5\xb0\x8f\x0a\x64\x65\x6c\x42\x6f\x78\x3d\xe5\x88\xaa\xe9\ +\x99\xa4\xe9\x81\xb8\xe5\x8f\x96\xe5\x8d\x80\xe5\xa1\x8a\x0a\x62\ +\x6f\x78\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\x44\x65\x74\x61\x69\ +\x6c\x3d\xe9\x81\xb8\xe6\x93\x87\xe6\xa1\x86\xe7\xb7\x9a\xe9\xa1\ +\x8f\xe8\x89\xb2\x0a\x6f\x72\x69\x67\x69\x6e\x61\x6c\x73\x69\x7a\ +\x65\x3d\xe5\x8e\x9f\xe5\xa7\x8b\xe5\xa4\xa7\xe5\xb0\x8f\x0a\x72\ +\x65\x73\x65\x74\x41\x6c\x6c\x44\x65\x74\x61\x69\x6c\x3d\xe9\x87\ +\x8d\xe8\xa8\xad\xe6\x89\x80\xe6\x9c\x89\xe8\xa8\xad\xe5\xae\x9a\ +\x0a\x7a\x6f\x6f\x6d\x6f\x75\x74\x44\x65\x74\x61\x69\x6c\x3d\xe7\ +\x95\xab\xe9\x9d\xa2\xe6\x94\xbe\xe5\xa4\xa7\x0a\x73\x61\x76\x65\ +\x3d\xe5\x84\xb2\xe5\xad\x98\x0a\x73\x61\x76\x65\x41\x73\x3d\xe5\ +\x8f\xa6\xe5\xad\x98\xe7\x82\xba\x0a\x66\x69\x74\x57\x69\x6e\x44\ +\x65\x74\x61\x69\x6c\x3d\xe7\xb8\xae\xe6\x94\xbe\xe5\x88\xb0\xe7\ +\xaa\x97\xe5\x8f\xa3\xe4\xb8\x80\xe6\xa8\xa3\x0a\x6f\x70\x65\x6e\ +\x44\x69\x72\x3d\xe9\x96\x8b\xe5\x95\x9f\xe7\x9b\xae\xe9\x8c\x84\ +\x0a\x63\x6f\x70\x79\x50\x72\x65\x76\x42\x6f\x75\x6e\x64\x69\x6e\ +\x67\x3d\xe8\xa4\x87\xe8\xa3\xbd\xe7\x95\xb6\xe5\x89\x8d\xe5\x9c\ +\x96\xe5\x83\x8f\xe4\xb8\xad\xe7\x9a\x84\xe4\xb8\x8a\xe4\xb8\x80\ +\xe5\x80\x8b\xe9\x82\x8a\xe7\x95\x8c\xe6\xa1\x86\x0a\x73\x68\x6f\ +\x77\x48\x69\x64\x65\x3d\xe9\xa1\xaf\xe7\xa4\xba\x2f\xe9\x9a\xb1\ +\xe8\x97\x8f\xe6\xa8\x99\xe7\xb1\xa4\x0a\x63\x68\x61\x6e\x67\x65\ +\x53\x61\x76\x65\x46\x6f\x72\x6d\x61\x74\x3d\xe6\x9b\xb4\xe6\x94\ +\xb9\xe5\x84\xb2\xe5\xad\x98\xe6\xa0\xbc\xe5\xbc\x8f\x0a\x73\x68\ +\x61\x70\x65\x46\x69\x6c\x6c\x43\x6f\x6c\x6f\x72\x3d\xe5\xa1\xab\ +\xe5\x85\x85\xe9\xa1\x8f\xe8\x89\xb2\x0a\x71\x75\x69\x74\x41\x70\ +\x70\x3d\xe9\x9b\xa2\xe9\x96\x8b\xe6\x9c\xac\xe7\xa8\x8b\xe5\xbc\ +\x8f\x0a\x64\x75\x70\x42\x6f\x78\x3d\xe8\xa4\x87\xe8\xa3\xbd\xe5\ +\x8d\x80\xe5\xa1\x8a\x0a\x64\x65\x6c\x42\x6f\x78\x44\x65\x74\x61\ +\x69\x6c\x3d\xe5\x88\xaa\xe9\x99\xa4\xe5\x8d\x80\xe5\xa1\x8a\x0a\ +\x7a\x6f\x6f\x6d\x69\x6e\x3d\xe6\x94\xbe\xe5\xa4\xa7\xe7\x95\xab\ +\xe9\x9d\xa2\x0a\x69\x6e\x66\x6f\x3d\xe8\xb3\x87\xe8\xa8\x8a\x0a\ +\x6f\x70\x65\x6e\x41\x6e\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x3d\xe9\ +\x96\x8b\xe5\x95\x9f\xe6\xa8\x99\xe7\xb1\xa4\x0a\x70\x72\x65\x76\ +\x49\x6d\x67\x44\x65\x74\x61\x69\x6c\x3d\xe4\xb8\x8a\xe4\xb8\x80\ +\xe5\x80\x8b\xe5\x9c\x96\xe5\x83\x8f\x0a\x66\x69\x74\x57\x69\x64\ +\x74\x68\x3d\xe7\xb8\xae\xe6\x94\xbe\xe5\x88\xb0\xe8\xb7\x9f\xe7\ +\x95\xab\xe9\x9d\xa2\xe4\xb8\x80\xe6\xa8\xa3\xe5\xaf\xac\x0a\x7a\ +\x6f\x6f\x6d\x6f\x75\x74\x3d\xe7\xb8\xae\xe5\xb0\x8f\xe7\x95\xab\ +\xe9\x9d\xa2\x0a\x63\x68\x61\x6e\x67\x65\x53\x61\x76\x65\x64\x41\ +\x6e\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x44\x69\x72\x3d\xe6\x9b\xb4\ +\xe6\x94\xb9\xe9\xa0\x90\xe8\xa8\xad\xe6\xa8\x99\xe7\xb1\xa4\xe5\ +\xad\x98\xe7\x9a\x84\xe7\x9b\xae\xe9\x8c\x84\x0a\x6e\x65\x78\x74\ +\x49\x6d\x67\x44\x65\x74\x61\x69\x6c\x3d\xe4\xb8\x8b\xe4\xb8\x80\ +\xe5\x80\x8b\xe5\x9c\x96\xe5\x83\x8f\x0a\x6f\x72\x69\x67\x69\x6e\ +\x61\x6c\x73\x69\x7a\x65\x44\x65\x74\x61\x69\x6c\x3d\xe6\x94\xbe\ +\xe5\xa4\xa7\xe5\x88\xb0\xe5\x8e\x9f\xe5\xa7\x8b\xe5\xa4\xa7\xe5\ +\xb0\x8f\x0a\x70\x72\x65\x76\x49\x6d\x67\x3d\xe4\xb8\x8a\xe4\xb8\ +\x80\xe5\x80\x8b\xe5\x9c\x96\xe5\x83\x8f\x0a\x74\x75\x74\x6f\x72\ +\x69\x61\x6c\x44\x65\x74\x61\x69\x6c\x3d\xe9\xa1\xaf\xe7\xa4\xba\ +\xe7\xa4\xba\xe7\xaf\x84\xe5\x85\xa7\xe5\xae\xb9\x0a\x73\x68\x61\ +\x70\x65\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\x3d\xe5\xbd\xa2\xe7\ +\x8b\x80\xe7\xb7\x9a\xe6\xa2\x9d\xe9\xa1\x8f\xe8\x89\xb2\x0a\x62\ +\x6f\x78\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\x3d\xe6\x97\xa5\xe6\ +\x9c\x9f\xe5\x88\x86\xe9\x9a\x94\xe7\xb7\x9a\xe9\xa1\x8f\xe8\x89\ +\xb2\x0a\x65\x64\x69\x74\x4c\x61\x62\x65\x6c\x44\x65\x74\x61\x69\ +\x6c\x3d\xe4\xbf\xae\xe6\x94\xb9\xe6\x89\x80\xe9\x81\xb8\xe5\x8d\ +\x80\xe5\xa1\x8a\xe7\x9a\x84\xe6\xa8\x99\xe7\xb1\xa4\x0a\x6e\x65\ +\x78\x74\x49\x6d\x67\x3d\xe4\xb8\x8b\xe4\xb8\x80\xe5\xbc\xb5\xe5\ +\x9c\x96\xe7\x89\x87\x0a\x75\x73\x65\x44\x65\x66\x61\x75\x6c\x74\ +\x4c\x61\x62\x65\x6c\x3d\xe4\xbd\xbf\xe7\x94\xa8\xe9\xa0\x90\xe8\ +\xa8\xad\xe6\xa8\x99\xe7\xb1\xa4\x0a\x75\x73\x65\x44\x69\x66\x66\ +\x69\x63\x75\x6c\x74\x3d\xe6\x9c\x89\xe9\x9b\xa3\xe5\xba\xa6\xe7\ +\x9a\x84\x0a\x62\x6f\x78\x4c\x61\x62\x65\x6c\x54\x65\x78\x74\x3d\ +\xe5\x8d\x80\xe5\xa1\x8a\xe7\x9a\x84\xe6\xa8\x99\xe7\xb1\xa4\x0a\ +\x6c\x61\x62\x65\x6c\x73\x3d\xe6\xa8\x99\xe7\xb1\xa4\x0a\x61\x75\ +\x74\x6f\x53\x61\x76\x65\x4d\x6f\x64\x65\x3d\xe8\x87\xaa\xe5\x8b\ +\x95\xe5\x84\xb2\xe5\xad\x98\xe6\xa8\xa1\xe5\xbc\x8f\x0a\x73\x69\ +\x6e\x67\x6c\x65\x43\x6c\x73\x4d\x6f\x64\x65\x3d\xe5\x96\xae\xe4\ +\xb8\x80\xe9\xa1\x9e\xe5\x88\xa5\xe6\xa8\xa1\xe5\xbc\x8f\x0a\x64\ +\x69\x73\x70\x6c\x61\x79\x4c\x61\x62\x65\x6c\x3d\xe9\xa1\xaf\xe7\ +\xa4\xba\xe9\xa1\x9e\xe5\x88\xa5\x0a\x66\x69\x6c\x65\x4c\x69\x73\ +\x74\x3d\xe6\xaa\x94\xe6\xa1\x88\xe6\xb8\x85\xe5\x96\xae\x0a\x66\ +\x69\x6c\x65\x73\x3d\xe6\xaa\x94\xe6\xa1\x88\x0a\x69\x63\x6f\x6e\ +\x4c\x69\x73\x74\x3d\x58\x58\x0a\x69\x63\x6f\x6e\x3d\x58\x58\x0a\ +\x61\x64\x76\x61\x6e\x63\x65\x64\x4d\x6f\x64\x65\x3d\xe9\x80\xb2\ +\xe9\x9a\x8e\xe6\xa8\xa1\xe5\xbc\x8f\x0a\x61\x64\x76\x61\x6e\x63\ +\x65\x64\x4d\x6f\x64\x65\x44\x65\x74\x61\x69\x6c\x3d\xe5\x88\x87\ +\xe5\x88\xb0\xe9\x80\xb2\xe9\x9a\x8e\xe6\xa8\xa1\xe5\xbc\x8f\x0a\ +\x73\x68\x6f\x77\x41\x6c\x6c\x42\x6f\x78\x44\x65\x74\x61\x69\x6c\ +\x3d\xe9\xa1\xaf\xe7\xa4\xba\xe6\x89\x80\xe6\x9c\x89\xe5\x8d\x80\ +\xe5\xa1\x8a\x0a\x68\x69\x64\x65\x41\x6c\x6c\x42\x6f\x78\x44\x65\ +\x74\x61\x69\x6c\x3d\xe9\x9a\xb1\xe8\x97\x8f\xe6\x89\x80\xe6\x9c\ +\x89\xe5\x8d\x80\xe5\xa1\x8a\x0a\ +\x00\x00\x04\x44\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x12\x00\x00\ +\x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ +\xd3\x0a\x17\x0a\x12\x16\x5e\xb7\xf3\xf2\x00\x00\x00\x1d\x74\x45\ +\x58\x74\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\ +\x64\x20\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\ +\x64\x25\x6e\x00\x00\x03\xa8\x49\x44\x41\x54\x78\xda\xad\x96\x5f\ +\x68\x1c\x55\x18\xc5\x7f\x77\x76\x36\x9b\x34\xe9\xda\x6e\xda\xb2\ +\x2a\x98\x27\x31\x55\xfa\x66\xdb\x6d\x82\x42\x5e\x35\x45\xf0\x29\ +\x46\x10\x82\xe0\x83\xa2\x82\xb5\x11\x04\x8b\xcf\xea\x8b\x0f\xe2\ +\x9f\x60\x7c\x08\x41\x6a\x71\x5b\xcd\xa3\x88\x6d\xd3\xc4\x9a\x36\ +\x69\x35\x14\x2a\xad\x94\xe2\x96\x4d\x28\x49\x48\xc8\xee\xce\xec\ +\xcc\xbd\x9f\x0f\x33\x3b\xfb\x67\x92\xda\xa2\x1f\x5c\x66\x19\x66\ +\xce\x39\xdf\xf9\xee\x3d\xb3\xf0\x3f\xd4\xd0\xd0\x90\x75\x3f\xcf\ +\xbd\x04\xc8\x03\xac\x32\xb0\x91\x4e\xa7\xa5\xb7\xb7\x57\x46\x46\ +\x46\x6e\x00\xed\x80\xda\x8e\x40\x16\x17\x17\xa5\x5c\x2e\xcb\xbf\ +\x95\xeb\xba\xe2\xba\x8e\xb8\xae\x23\xc5\x62\x51\x0a\x85\x82\xcc\ +\xcf\xcf\x4b\x4f\x4f\x4f\x01\xd8\x03\x6c\xd9\xd1\x7d\x81\xd7\x49\ +\x1c\x59\x5b\x5b\x95\xd3\xa7\xf3\xb2\xbc\xbc\x2c\x22\x22\x53\x53\ +\x53\x92\xcb\xe5\x34\x90\xae\x91\xd8\x8d\x0c\x1d\x1d\x1d\x00\x4c\ +\x4f\x4f\xc7\xd9\x45\x50\x4a\x21\x22\x88\x08\x5a\xfb\x38\x8e\x4b\ +\xa9\x54\x22\x95\x4a\x01\x30\x30\x30\x80\xe3\x38\xd6\xf0\xf0\xf0\ +\xc7\x9e\xe7\xbd\x13\xda\xd8\x88\x11\x2f\x63\x8c\x68\xad\xc5\xf7\ +\xbd\xe8\xea\x79\x9e\xb8\xae\x23\x1b\x1b\x1b\x32\x3e\x3e\xbe\xdd\ +\x8c\x46\x80\xa4\x6a\x21\x88\x3a\xa8\x29\x15\x31\x04\xb7\x25\x9c\ +\x5f\x70\x1f\xc0\xf7\x35\x4b\x4b\x45\xb2\xfb\xf6\xf1\xdb\xa5\x39\ +\x4e\x9c\xf8\x10\xaf\xd8\x4f\xe5\x4a\x86\xf4\x73\x53\x00\x9d\x31\ +\x82\x56\xe0\xe0\x2a\x4d\x16\x21\x82\xb2\x2c\xaa\xae\xcb\xca\xea\ +\x2a\x9e\xeb\xf0\xf8\x13\xfb\xf1\xef\x3e\x83\x37\x97\xe2\xb5\xb1\ +\xa2\x4c\x9c\xb9\xa6\x80\xbd\x76\xab\xd7\xc6\x68\xce\x9f\x9f\x8e\ +\x94\x06\x80\x20\x08\x0a\x85\x84\x0e\x18\x2d\x18\xa3\x31\xc6\xf0\ +\xfc\xe0\x51\xfc\xe5\x7e\xbc\xb9\x76\x8e\x7f\xb7\x46\x08\xfe\x3e\ +\xd0\x1e\xeb\xc0\xf3\xaa\x0d\xc0\x21\x09\x82\x18\x41\x59\x0a\x31\ +\x75\x8b\x44\x84\x9d\xe9\x87\xa8\x16\xfa\xa8\x2e\xec\xe0\xcd\xc9\ +\x4d\xbe\x39\x79\xb1\x86\xf7\x32\x70\x6e\x8b\x0e\x0c\x17\xa6\x2f\ +\x44\x4a\x03\xc0\x78\x07\xbe\xaf\x19\x1c\x3c\x8a\x7b\xeb\x08\xee\ +\xa5\x76\x5e\x9f\x58\x65\x22\xbf\xc0\xdb\x6f\xbc\xca\xa7\x9f\x7d\ +\x0d\xb0\x0e\x38\x71\x02\xad\x39\xd2\x97\x43\x4c\xa8\xb2\xc1\xaa\ +\x68\x9b\x1a\xc3\xae\xdd\xdd\xb8\x37\x73\x94\xaf\xed\xe1\xbd\x53\ +\x77\x98\xc8\x2f\x30\xf6\xe5\xe7\xdc\xbe\x75\xbd\x06\xb5\x06\xb8\ +\x5b\x77\x30\x33\x13\xf8\x1c\xda\x61\x85\xc0\x4a\xa9\xc8\x73\xe7\ +\xfa\x61\x2a\xf3\x29\x46\xcf\xfc\xcd\xd8\xb7\x57\x19\x1d\x3d\x46\ +\xa6\x3b\x43\x69\x3d\x53\x83\xaa\x00\xda\xde\xea\x48\xf7\xf7\xf5\ +\x21\x08\xc6\x98\x26\x02\x80\x5d\xbb\xbb\x29\xff\x71\x88\xd2\xe5\ +\x14\x6f\xe5\xd7\x99\xcc\x5f\x65\xec\xab\x2f\xc8\x64\x32\x3c\x9c\ +\xcd\xb2\xbe\x72\x27\xd2\x1a\x3b\xc9\x00\xbe\xf6\x99\x99\x99\xad\ +\xcd\x3d\x1c\x74\x30\x50\xcf\xf3\x00\xb8\x7d\xf3\x59\x3e\xfa\xf1\ +\x27\x26\xf3\xbf\x73\xfc\xdd\x63\x14\x97\x96\x10\x84\x03\x07\x9e\ +\x42\xb5\x44\x5d\x8c\x40\x6b\x4d\xee\xf0\xa1\x48\x71\x6d\xb7\x78\ +\x5e\x95\x47\x1e\x7d\x8c\x17\x06\xf6\xb2\xff\xc5\x4f\x00\xf8\xfe\ +\xd4\x49\xba\x76\x76\x91\xcd\x66\x49\xa5\xda\x50\x4a\x61\x29\xeb\ +\xde\x04\x46\x6b\x66\x67\x67\x43\x60\xa2\xf3\xe0\xba\x2e\x00\x3f\ +\xfc\x72\x97\x73\x67\x7f\x46\x59\x8a\xae\xce\x4e\x6c\x3b\x49\x5b\ +\x5b\x92\x44\x22\x81\x52\xf1\xa4\x8e\x5b\xe4\x7b\x1c\x3c\xf8\x74\ +\x93\x7a\x31\x06\x5f\xfb\xfc\x75\xe3\x4f\x94\x05\x95\x8a\x43\x32\ +\x69\x07\xf3\xb1\xac\xe8\xcc\x68\xad\x31\x46\x6f\x4f\x50\xad\x56\ +\xd1\x5a\x87\xf6\x04\xfb\x1e\x15\xcc\xc5\x18\x83\x36\x3e\xc6\x37\ +\x24\x93\x36\x89\x44\xa2\x1e\x1b\x4a\x45\xef\x35\x38\x1b\x27\xd8\ +\xdc\xdc\x44\x6b\x1d\x78\xa3\x68\x52\xa8\x94\x42\x29\x85\x6d\xdb\ +\xc1\xef\xb0\xbb\xda\xdc\x1a\xb3\xab\xb1\x9a\x26\x52\x28\x14\x40\ +\x0c\x22\x06\x63\xea\xab\x51\xa9\xa5\x14\xad\x32\x83\x38\x21\xcc\ +\x26\xd9\xbe\x83\x8b\xbf\x9e\x65\x47\x9b\x0a\x22\x41\x24\x8a\x68\ +\x23\x26\x0c\x6a\x1a\x94\xab\xc8\xef\x1a\xa8\x11\xc3\xe5\x85\x2b\ +\xd4\xf7\x78\x73\xbd\xf2\x80\x1f\xfd\x7b\xad\x0f\x80\x27\x5b\xd3\ +\xd4\x06\xba\xc3\x95\xfc\x8f\xff\x64\x3c\x60\x05\x58\xf9\x07\xbb\ +\x78\x04\xf0\x58\x0d\x4c\x09\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ +\x42\x60\x82\ +" + +qt_resource_name = b"\ +\x00\x04\ +\x00\x06\xa6\x79\ +\x00\x63\ +\x00\x6f\x00\x70\x00\x79\ +\x00\x04\ +\x00\x07\xc4\xaf\ +\x00\x75\ +\x00\x6e\x00\x64\x00\x6f\ +\x00\x0a\ +\x03\x87\xc0\x73\ +\x00\x66\ +\x00\x6f\x00\x72\x00\x6d\x00\x61\x00\x74\x00\x5f\x00\x76\x00\x6f\x00\x63\ +\x00\x0a\ +\x04\xd5\xeb\x87\ +\x00\x66\ +\x00\x69\x00\x74\x00\x2d\x00\x77\x00\x69\x00\x6e\x00\x64\x00\x6f\x00\x77\ +\x00\x05\ +\x00\x6a\x63\x62\ +\x00\x63\ +\x00\x6f\x00\x6c\x00\x6f\x00\x72\ +\x00\x06\ +\x06\xac\x2c\xa5\ +\x00\x64\ +\x00\x65\x00\x6c\x00\x65\x00\x74\x00\x65\ +\x00\x05\ +\x00\x6a\x36\x95\ +\x00\x63\ +\x00\x6c\x00\x6f\x00\x73\x00\x65\ +\x00\x07\ +\x09\x8c\x83\x63\ +\x00\x73\ +\x00\x61\x00\x76\x00\x65\x00\x2d\x00\x61\x00\x73\ +\x00\x04\ +\x00\x06\xef\xa5\ +\x00\x68\ +\x00\x69\x00\x64\x00\x65\ +\x00\x06\ +\x07\xcc\x8f\xd9\ +\x00\x76\ +\x00\x65\x00\x72\x00\x69\x00\x66\x00\x79\ +\x00\x03\ +\x00\x00\x68\x70\ +\x00\x61\ +\x00\x70\x00\x70\ +\x00\x04\ +\x00\x06\xb6\x45\ +\x00\x64\ +\x00\x6f\x00\x6e\x00\x65\ +\x00\x07\ +\x0a\xb9\x04\x03\ +\x00\x73\ +\x00\x74\x00\x72\x00\x69\x00\x6e\x00\x67\x00\x73\ +\x00\x04\ +\x00\x06\xec\x30\ +\x00\x68\ +\x00\x65\x00\x6c\x00\x70\ +\x00\x0b\ +\x08\x7c\x58\x4f\ +\x00\x66\ +\x00\x6f\x00\x72\x00\x6d\x00\x61\x00\x74\x00\x5f\x00\x79\x00\x6f\x00\x6c\x00\x6f\ +\x00\x04\ +\x00\x07\x98\xc5\ +\x00\x73\ +\x00\x61\x00\x76\x00\x65\ +\x00\x04\ +\x00\x08\x16\x5d\ +\x00\x7a\ +\x00\x6f\x00\x6f\x00\x6d\ +\x00\x03\ +\x00\x00\x74\xc7\ +\x00\x6e\ +\x00\x65\x00\x77\ +\x00\x04\ +\x00\x07\x8c\x04\ +\x00\x71\ +\x00\x75\x00\x69\x00\x74\ +\x00\x04\ +\x00\x06\xd0\x25\ +\x00\x66\ +\x00\x69\x00\x6c\x00\x65\ +\x00\x09\ +\x07\x4d\x21\xa8\ +\x00\x66\ +\x00\x69\x00\x74\x00\x2d\x00\x77\x00\x69\x00\x64\x00\x74\x00\x68\ +\x00\x04\ +\x00\x07\x66\xbe\ +\x00\x6f\ +\x00\x70\x00\x65\x00\x6e\ +\x00\x08\ +\x0c\x9c\xab\x2c\ +\x00\x72\ +\x00\x65\x00\x73\x00\x65\x00\x74\x00\x61\x00\x6c\x00\x6c\ +\x00\x04\ +\x00\x04\x8c\xaf\ +\x00\x41\ +\x00\x75\x00\x74\x00\x6f\ +\x00\x0a\ +\x06\x8b\x64\x25\ +\x00\x63\ +\x00\x6f\x00\x6c\x00\x6f\x00\x72\x00\x5f\x00\x6c\x00\x69\x00\x6e\x00\x65\ +\x00\x06\ +\x06\xcf\x6c\x94\ +\x00\x65\ +\x00\x78\x00\x70\x00\x65\x00\x72\x00\x74\ +\x00\x08\ +\x06\x60\x56\xe4\ +\x00\x7a\ +\x00\x6f\x00\x6f\x00\x6d\x00\x2d\x00\x6f\x00\x75\x00\x74\ +\x00\x05\ +\x00\x78\xa8\xb3\ +\x00\x72\ +\x00\x65\x00\x52\x00\x65\x00\x63\ +\x00\x0d\ +\x03\x22\xb9\x5e\ +\x00\x73\ +\x00\x74\x00\x72\x00\x69\x00\x6e\x00\x67\x00\x73\x00\x2d\x00\x7a\x00\x68\x00\x2d\x00\x43\x00\x4e\ +\x00\x07\ +\x01\x66\x02\xfe\ +\x00\x7a\ +\x00\x6f\x00\x6f\x00\x6d\x00\x2d\x00\x69\x00\x6e\ +\x00\x04\ +\x00\x07\x4c\xf4\ +\x00\x6e\ +\x00\x65\x00\x78\x00\x74\ +\x00\x06\ +\x07\x27\x8c\x33\ +\x00\x6c\ +\x00\x61\x00\x62\x00\x65\x00\x6c\x00\x73\ +\x00\x04\ +\x00\x07\x78\xc6\ +\x00\x70\ +\x00\x72\x00\x65\x00\x76\ +\x00\x0d\ +\x03\x22\xba\xb7\ +\x00\x73\ +\x00\x74\x00\x72\x00\x69\x00\x6e\x00\x67\x00\x73\x00\x2d\x00\x7a\x00\x68\x00\x2d\x00\x54\x00\x57\ +\x00\x04\ +\x00\x06\xbb\x04\ +\x00\x65\ +\x00\x64\x00\x69\x00\x74\ +" + +qt_resource_struct_v1 = b"\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x23\x00\x00\x00\x01\ +\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x01\x00\x00\x47\xf0\ +\x00\x00\x01\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x8b\xda\ +\x00\x00\x01\x8e\x00\x00\x00\x00\x00\x01\x00\x00\xb6\x5c\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x01\x00\x00\x66\xb8\ +\x00\x00\x02\x70\x00\x00\x00\x00\x00\x01\x00\x01\xf9\x1e\ +\x00\x00\x01\x44\x00\x00\x00\x00\x00\x01\x00\x00\x97\xac\ +\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x01\x00\x00\x79\xde\ +\x00\x00\x00\x96\x00\x00\x00\x00\x00\x01\x00\x00\x37\x17\ +\x00\x00\x02\x22\x00\x00\x00\x00\x00\x01\x00\x00\xf9\xdf\ +\x00\x00\x01\x6a\x00\x00\x00\x00\x00\x01\x00\x00\xa0\x06\ +\x00\x00\x02\x42\x00\x00\x00\x00\x00\x01\x00\x01\x79\x84\ +\x00\x00\x01\x36\x00\x00\x00\x00\x00\x01\x00\x00\x90\x2d\ +\x00\x00\x01\x0e\x00\x00\x00\x00\x00\x01\x00\x00\x82\xbc\ +\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x01\x00\x00\x02\x8a\ +\x00\x00\x01\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x87\x63\ +\x00\x00\x00\x72\x00\x00\x00\x00\x00\x01\x00\x00\x1f\xed\ +\x00\x00\x00\x50\x00\x00\x00\x00\x00\x01\x00\x00\x11\xd8\ +\x00\x00\x01\xde\x00\x00\x00\x00\x00\x01\x00\x00\xe3\xf1\ +\x00\x00\x02\x0e\x00\x00\x00\x00\x00\x01\x00\x00\xf5\x90\ +\x00\x00\x01\xee\x00\x00\x00\x00\x00\x01\x00\x00\xeb\x5b\ +\x00\x00\x02\x50\x00\x00\x00\x00\x00\x01\x00\x01\xf1\x51\ +\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x0a\x70\ +\x00\x00\x00\x36\x00\x00\x00\x00\x00\x01\x00\x00\x0d\x86\ +\x00\x00\x01\xc8\x00\x00\x00\x00\x00\x01\x00\x00\xdf\xbb\ +\x00\x00\x01\x9c\x00\x00\x00\x00\x00\x01\x00\x00\xd5\x24\ +\x00\x00\x00\x60\x00\x00\x00\x00\x00\x01\x00\x00\x17\x91\ +\x00\x00\x01\xb6\x00\x00\x00\x00\x00\x01\x00\x00\xde\x68\ +\x00\x00\x02\x30\x00\x00\x00\x00\x00\x01\x00\x01\x70\x33\ +\x00\x00\x01\x52\x00\x00\x00\x00\x00\x01\x00\x00\x9a\xad\ +\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x01\x00\x00\x3c\x0b\ +\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x01\x00\x00\x80\x15\ +\x00\x00\x00\x82\x00\x00\x00\x00\x00\x01\x00\x00\x2c\x18\ +\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x01\x00\x00\x6f\x52\ +\x00\x00\x01\x78\x00\x00\x00\x00\x00\x01\x00\x00\xa8\x23\ +" + +qt_resource_struct_v2 = b"\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x23\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x01\x00\x00\x47\xf0\ +\x00\x00\x01\x75\xf3\xca\x7e\xa3\ +\x00\x00\x01\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x8b\xda\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x01\x8e\x00\x00\x00\x00\x00\x01\x00\x00\xb6\x5c\ +\x00\x00\x01\x75\xe3\x7f\xf9\x6b\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x01\x00\x00\x66\xb8\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x02\x70\x00\x00\x00\x00\x00\x01\x00\x01\xf9\x1e\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x01\x44\x00\x00\x00\x00\x00\x01\x00\x00\x97\xac\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x01\x00\x00\x79\xde\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x00\x96\x00\x00\x00\x00\x00\x01\x00\x00\x37\x17\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x02\x22\x00\x00\x00\x00\x00\x01\x00\x00\xf9\xdf\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x01\x6a\x00\x00\x00\x00\x00\x01\x00\x00\xa0\x06\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x02\x42\x00\x00\x00\x00\x00\x01\x00\x01\x79\x84\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x01\x36\x00\x00\x00\x00\x00\x01\x00\x00\x90\x2d\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x01\x0e\x00\x00\x00\x00\x00\x01\x00\x00\x82\xbc\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x01\x00\x00\x02\x8a\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x01\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x87\x63\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x00\x72\x00\x00\x00\x00\x00\x01\x00\x00\x1f\xed\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x00\x50\x00\x00\x00\x00\x00\x01\x00\x00\x11\xd8\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x01\xde\x00\x00\x00\x00\x00\x01\x00\x00\xe3\xf1\ +\x00\x00\x01\x75\xe3\x7f\xf9\x6b\ +\x00\x00\x02\x0e\x00\x00\x00\x00\x00\x01\x00\x00\xf5\x90\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x01\xee\x00\x00\x00\x00\x00\x01\x00\x00\xeb\x5b\ +\x00\x00\x01\x75\xfe\x68\xaf\x02\ +\x00\x00\x02\x50\x00\x00\x00\x00\x00\x01\x00\x01\xf1\x51\ +\x00\x00\x01\x74\xde\xd2\xc1\x11\ +\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x0a\x70\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x00\x36\x00\x00\x00\x00\x00\x01\x00\x00\x0d\x86\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x01\xc8\x00\x00\x00\x00\x00\x01\x00\x00\xdf\xbb\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x01\x9c\x00\x00\x00\x00\x00\x01\x00\x00\xd5\x24\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x00\x60\x00\x00\x00\x00\x00\x01\x00\x00\x17\x91\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x01\xb6\x00\x00\x00\x00\x00\x01\x00\x00\xde\x68\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x02\x30\x00\x00\x00\x00\x00\x01\x00\x01\x70\x33\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x01\x52\x00\x00\x00\x00\x00\x01\x00\x00\x9a\xad\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x01\x00\x00\x3c\x0b\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x01\x00\x00\x80\x15\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x00\x82\x00\x00\x00\x00\x00\x01\x00\x00\x2c\x18\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x01\x00\x00\x6f\x52\ +\x00\x00\x01\x75\xfe\x68\x20\xb4\ +\x00\x00\x01\x78\x00\x00\x00\x00\x00\x01\x00\x00\xa8\x23\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +" + +qt_version = [int(v) for v in QtCore.qVersion().split('.')] +if qt_version < [5, 8, 0]: + rcc_version = 1 + qt_resource_struct = qt_resource_struct_v1 +else: + rcc_version = 2 + qt_resource_struct = qt_resource_struct_v2 + +def qInitResources(): + QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) + +def qCleanupResources(): + QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) + +qInitResources() diff --git a/PPOCRLabel/libs/settings.py b/PPOCRLabel/libs/settings.py new file mode 100644 index 0000000000000000000000000000000000000000..7f9a4fdda63bf3564abb3b281b9602560b6893fd --- /dev/null +++ b/PPOCRLabel/libs/settings.py @@ -0,0 +1,60 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +import pickle +import os +import sys + + +class Settings(object): + def __init__(self): + # Be default, the home will be in the same folder as labelImg + home = os.path.expanduser("~") + self.data = {} + # self.path = os.path.join(home, '.labelImgSettings.pkl') + self.path = os.path.join(home, '.autoOCRSettings.pkl') + + def __setitem__(self, key, value): + self.data[key] = value + + def __getitem__(self, key): + return self.data[key] + + def get(self, key, default=None): + if key in self.data: + return self.data[key] + return default + + def save(self): + if self.path: + with open(self.path, 'wb') as f: + pickle.dump(self.data, f, pickle.HIGHEST_PROTOCOL) + return True + return False + + def load(self): + try: + if os.path.exists(self.path): + with open(self.path, 'rb') as f: + self.data = pickle.load(f) + return True + except: + print('Loading setting failed') + return False + + def reset(self): + if os.path.exists(self.path): + os.remove(self.path) + print('Remove setting pkl file ${0}'.format(self.path)) + self.data = {} + self.path = None diff --git a/PPOCRLabel/libs/shape.py b/PPOCRLabel/libs/shape.py new file mode 100644 index 0000000000000000000000000000000000000000..2770bac1df9b62c3023ca10be0da1c2cec0a5002 --- /dev/null +++ b/PPOCRLabel/libs/shape.py @@ -0,0 +1,217 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +#!/usr/bin/python +# -*- coding: utf-8 -*- + + +try: + from PyQt5.QtGui import * + from PyQt5.QtCore import * +except ImportError: + from PyQt4.QtGui import * + from PyQt4.QtCore import * + +from libs.utils import distance +import sys + +DEFAULT_LINE_COLOR = QColor(0, 255, 0, 128) +DEFAULT_FILL_COLOR = QColor(255, 0, 0, 128) +DEFAULT_SELECT_LINE_COLOR = QColor(255, 255, 255) +DEFAULT_SELECT_FILL_COLOR = QColor(0, 128, 255, 155) +DEFAULT_VERTEX_FILL_COLOR = QColor(0, 255, 0, 255) +DEFAULT_HVERTEX_FILL_COLOR = QColor(255, 0, 0) +MIN_Y_LABEL = 10 + + +class Shape(object): + P_SQUARE, P_ROUND = range(2) + + MOVE_VERTEX, NEAR_VERTEX = range(2) + + # The following class variables influence the drawing + # of _all_ shape objects. + line_color = DEFAULT_LINE_COLOR + fill_color = DEFAULT_FILL_COLOR + select_line_color = DEFAULT_SELECT_LINE_COLOR + select_fill_color = DEFAULT_SELECT_FILL_COLOR + vertex_fill_color = DEFAULT_VERTEX_FILL_COLOR + hvertex_fill_color = DEFAULT_HVERTEX_FILL_COLOR + point_type = P_ROUND + point_size = 8 + scale = 1.0 + + def __init__(self, label=None, line_color=None, difficult=False, paintLabel=False): + self.label = label + self.points = [] + self.fill = False + self.selected = False + self.difficult = difficult + self.paintLabel = paintLabel + + self._highlightIndex = None + self._highlightMode = self.NEAR_VERTEX + self._highlightSettings = { + self.NEAR_VERTEX: (4, self.P_ROUND), + self.MOVE_VERTEX: (1.5, self.P_SQUARE), + } + + self._closed = False + + if line_color is not None: + # Override the class line_color attribute + # with an object attribute. Currently this + # is used for drawing the pending line a different color. + self.line_color = line_color + + def close(self): + self._closed = True + + def reachMaxPoints(self): + if len(self.points) >= 4: + return True + return False + + def addPoint(self, point): + if not self.reachMaxPoints(): + self.points.append(point) + + def popPoint(self): + if self.points: + return self.points.pop() + return None + + def isClosed(self): + return self._closed + + def setOpen(self): + self._closed = False + + def paint(self, painter): + if self.points: + color = self.select_line_color if self.selected else self.line_color + pen = QPen(color) + # Try using integer sizes for smoother drawing(?) + pen.setWidth(max(1, int(round(2.0 / self.scale)))) + painter.setPen(pen) + + line_path = QPainterPath() + vrtx_path = QPainterPath() + + line_path.moveTo(self.points[0]) + # Uncommenting the following line will draw 2 paths + # for the 1st vertex, and make it non-filled, which + # may be desirable. + #self.drawVertex(vrtx_path, 0) + + for i, p in enumerate(self.points): + line_path.lineTo(p) + self.drawVertex(vrtx_path, i) + if self.isClosed(): + line_path.lineTo(self.points[0]) + + painter.drawPath(line_path) + painter.drawPath(vrtx_path) + painter.fillPath(vrtx_path, self.vertex_fill_color) + + # Draw text at the top-left + if self.paintLabel: + min_x = sys.maxsize + min_y = sys.maxsize + for point in self.points: + min_x = min(min_x, point.x()) + min_y = min(min_y, point.y()) + if min_x != sys.maxsize and min_y != sys.maxsize: + font = QFont() + font.setPointSize(8) + font.setBold(True) + painter.setFont(font) + if(self.label == None): + self.label = "" + if(min_y < MIN_Y_LABEL): + min_y += MIN_Y_LABEL + painter.drawText(min_x, min_y, self.label) + + if self.fill: + color = self.select_fill_color if self.selected else self.fill_color + painter.fillPath(line_path, color) + + def drawVertex(self, path, i): + d = self.point_size / self.scale + shape = self.point_type + point = self.points[i] + if i == self._highlightIndex: + size, shape = self._highlightSettings[self._highlightMode] + d *= size + if self._highlightIndex is not None: + self.vertex_fill_color = self.hvertex_fill_color + else: + self.vertex_fill_color = Shape.vertex_fill_color + if shape == self.P_SQUARE: + path.addRect(point.x() - d / 2, point.y() - d / 2, d, d) + elif shape == self.P_ROUND: + path.addEllipse(point, d / 2.0, d / 2.0) + else: + assert False, "unsupported vertex shape" + + def nearestVertex(self, point, epsilon): + for i, p in enumerate(self.points): + if distance(p - point) <= epsilon: + return i + return None + + def containsPoint(self, point): + return self.makePath().contains(point) + + def makePath(self): + path = QPainterPath(self.points[0]) + for p in self.points[1:]: + path.lineTo(p) + return path + + def boundingRect(self): + return self.makePath().boundingRect() + + def moveBy(self, offset): + self.points = [p + offset for p in self.points] + + def moveVertexBy(self, i, offset): + self.points[i] = self.points[i] + offset + + def highlightVertex(self, i, action): + self._highlightIndex = i + self._highlightMode = action + + def highlightClear(self): + self._highlightIndex = None + + def copy(self): + shape = Shape("%s" % self.label) + shape.points = [p for p in self.points] + shape.fill = self.fill + shape.selected = self.selected + shape._closed = self._closed + if self.line_color != Shape.line_color: + shape.line_color = self.line_color + if self.fill_color != Shape.fill_color: + shape.fill_color = self.fill_color + shape.difficult = self.difficult + return shape + + def __len__(self): + return len(self.points) + + def __getitem__(self, key): + return self.points[key] + + def __setitem__(self, key, value): + self.points[key] = value diff --git a/PPOCRLabel/libs/stringBundle.py b/PPOCRLabel/libs/stringBundle.py new file mode 100644 index 0000000000000000000000000000000000000000..2417104425323357e3ef49feaabfcfa35fefaf00 --- /dev/null +++ b/PPOCRLabel/libs/stringBundle.py @@ -0,0 +1,86 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import re +import os +import sys +import locale +from libs.ustr import ustr + +try: + from PyQt5.QtCore import * +except ImportError: + if sys.version_info.major >= 3: + import sip + sip.setapi('QVariant', 2) + from PyQt4.QtCore import * + + +class StringBundle: + + __create_key = object() + + def __init__(self, create_key, localeStr): + assert(create_key == StringBundle.__create_key), "StringBundle must be created using StringBundle.getBundle" + self.idToMessage = {} + paths = self.__createLookupFallbackList(localeStr) + for path in paths: + self.__loadBundle(path) + + @classmethod + def getBundle(cls, localeStr=None): + if localeStr is None: + try: + localeStr = locale.getlocale()[0] if locale.getlocale() and len( + locale.getlocale()) > 0 else os.getenv('LANG') + except: + print('Invalid locale') + localeStr = 'en' + + return StringBundle(cls.__create_key, localeStr) + + def getString(self, stringId): + assert(stringId in self.idToMessage), "Missing string id : " + stringId + return self.idToMessage[stringId] + + def __createLookupFallbackList(self, localeStr): + resultPaths = [] + basePath = ":/strings" + resultPaths.append(basePath) + if localeStr is not None: + # Don't follow standard BCP47. Simple fallback + tags = re.split('[^a-zA-Z]', localeStr) + for tag in tags: + lastPath = resultPaths[-1] + resultPaths.append(lastPath + '-' + tag) + + return resultPaths + + def __loadBundle(self, path): + PROP_SEPERATOR = '=' + f = QFile(path) + if f.exists(): + if f.open(QIODevice.ReadOnly | QFile.Text): + text = QTextStream(f) + text.setCodec("UTF-8") + + while not text.atEnd(): + line = ustr(text.readLine()) + key_value = line.split(PROP_SEPERATOR) + key = key_value[0].strip() + value = PROP_SEPERATOR.join(key_value[1:]).strip().strip('"') + self.idToMessage[key] = value + + f.close() diff --git a/PPOCRLabel/libs/toolBar.py b/PPOCRLabel/libs/toolBar.py new file mode 100644 index 0000000000000000000000000000000000000000..9a63929ae966ae02715f10868f9980230d064ccd --- /dev/null +++ b/PPOCRLabel/libs/toolBar.py @@ -0,0 +1,51 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +try: + from PyQt5.QtGui import * + from PyQt5.QtCore import * + from PyQt5.QtWidgets import * +except ImportError: + from PyQt4.QtGui import * + from PyQt4.QtCore import * + + +class ToolBar(QToolBar): + + def __init__(self, title): + super(ToolBar, self).__init__(title) + layout = self.layout() + m = (0, 0, 0, 0) + layout.setSpacing(0) + layout.setContentsMargins(*m) + self.setContentsMargins(*m) + self.setWindowFlags(self.windowFlags() | Qt.FramelessWindowHint) + + def addAction(self, action): + if isinstance(action, QWidgetAction): + return super(ToolBar, self).addAction(action) + btn = ToolButton() + btn.setDefaultAction(action) + btn.setToolButtonStyle(self.toolButtonStyle()) + self.addWidget(btn) + + +class ToolButton(QToolButton): + """ToolBar companion class which ensures all buttons have the same size.""" + minSize = (60, 60) + + def minimumSizeHint(self): + ms = super(ToolButton, self).minimumSizeHint() + w1, h1 = ms.width(), ms.height() + w2, h2 = self.minSize + ToolButton.minSize = max(w1, w2), max(h1, h2) + return QSize(*ToolButton.minSize) diff --git a/PPOCRLabel/libs/ustr.py b/PPOCRLabel/libs/ustr.py new file mode 100644 index 0000000000000000000000000000000000000000..b35cf5d3ff707b11d658efd6e585bb9de74d27cb --- /dev/null +++ b/PPOCRLabel/libs/ustr.py @@ -0,0 +1,29 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +import sys +from libs.constants import DEFAULT_ENCODING + +def ustr(x): + '''py2/py3 unicode helper''' + + if sys.version_info < (3, 0, 0): + from PyQt4.QtCore import QString + if type(x) == str: + return x.decode(DEFAULT_ENCODING) + if type(x) == QString: + #https://blog.csdn.net/friendan/article/details/51088476 + #https://blog.csdn.net/xxm524/article/details/74937308 + return unicode(x.toUtf8(), DEFAULT_ENCODING, 'ignore') + return x + else: + return x diff --git a/PPOCRLabel/libs/utils.py b/PPOCRLabel/libs/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..3c2f316dca16bd754d34a46c484c335e7a866d95 --- /dev/null +++ b/PPOCRLabel/libs/utils.py @@ -0,0 +1,167 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +from math import sqrt +from libs.ustr import ustr +import hashlib +import re +import sys +import cv2 +import numpy as np + +try: + from PyQt5.QtGui import * + from PyQt5.QtCore import * + from PyQt5.QtWidgets import * +except ImportError: + from PyQt4.QtGui import * + from PyQt4.QtCore import * + + +def newIcon(icon, iconSize=None): + if iconSize is not None: + return QIcon(QIcon(':/' + icon).pixmap(iconSize,iconSize)) + else: + return QIcon(':/' + icon) + + +def newButton(text, icon=None, slot=None): + b = QPushButton(text) + if icon is not None: + b.setIcon(newIcon(icon)) + if slot is not None: + b.clicked.connect(slot) + return b + + +def newAction(parent, text, slot=None, shortcut=None, icon=None, + tip=None, checkable=False, enabled=True, iconSize=None): + """Create a new action and assign callbacks, shortcuts, etc.""" + a = QAction(text, parent) + if icon is not None: + if iconSize is not None: + a.setIcon(newIcon(icon, iconSize)) + else: + a.setIcon(newIcon(icon)) + if shortcut is not None: + if isinstance(shortcut, (list, tuple)): + a.setShortcuts(shortcut) + else: + a.setShortcut(shortcut) + if tip is not None: + a.setToolTip(tip) + a.setStatusTip(tip) + if slot is not None: + a.triggered.connect(slot) + if checkable: + a.setCheckable(True) + a.setEnabled(enabled) + return a + + +def addActions(widget, actions): + for action in actions: + if action is None: + widget.addSeparator() + elif isinstance(action, QMenu): + widget.addMenu(action) + else: + widget.addAction(action) + + +def labelValidator(): + return QRegExpValidator(QRegExp(r'^[^ \t].+'), None) + + +class struct(object): + + def __init__(self, **kwargs): + self.__dict__.update(kwargs) + + +def distance(p): + return sqrt(p.x() * p.x() + p.y() * p.y()) + + +def fmtShortcut(text): + mod, key = text.split('+', 1) + return '%s+%s' % (mod, key) + + +def generateColorByText(text): + s = ustr(text) + hashCode = int(hashlib.sha256(s.encode('utf-8')).hexdigest(), 16) + r = int((hashCode / 255) % 255) + g = int((hashCode / 65025) % 255) + b = int((hashCode / 16581375) % 255) + return QColor(r, g, b, 100) + +def have_qstring(): + '''p3/qt5 get rid of QString wrapper as py3 has native unicode str type''' + return not (sys.version_info.major >= 3 or QT_VERSION_STR.startswith('5.')) + +def util_qt_strlistclass(): + return QStringList if have_qstring() else list + +def natural_sort(list, key=lambda s:s): + """ + Sort the list into natural alphanumeric order. + """ + def get_alphanum_key_func(key): + convert = lambda text: int(text) if text.isdigit() else text + return lambda s: [convert(c) for c in re.split('([0-9]+)', key(s))] + sort_key = get_alphanum_key_func(key) + list.sort(key=sort_key) + + +def get_rotate_crop_image(img, points): + + try: + img_crop_width = int( + max( + np.linalg.norm(points[0] - points[1]), + np.linalg.norm(points[2] - points[3]))) + img_crop_height = int( + max( + np.linalg.norm(points[0] - points[3]), + np.linalg.norm(points[1] - points[2]))) + pts_std = np.float32([[0, 0], [img_crop_width, 0], + [img_crop_width, img_crop_height], + [0, img_crop_height]]) + M = cv2.getPerspectiveTransform(points, pts_std) + dst_img = cv2.warpPerspective( + img, + M, (img_crop_width, img_crop_height), + borderMode=cv2.BORDER_REPLICATE, + flags=cv2.INTER_CUBIC) + dst_img_height, dst_img_width = dst_img.shape[0:2] + if dst_img_height * 1.0 / dst_img_width >= 1.5: + dst_img = np.rot90(dst_img) + return dst_img + except Exception as e: + print(e) + +def steps(): + msg = "1. 安装与运行:使用上述命令安装与运行程序。\n" \ + "2. 打开文件夹:在菜单栏点击 “文件” - 打开目录 选择待标记图片的文件夹.\n"\ + "3. 自动标注:点击 ”自动标注“,使用PPOCR超轻量模型对图片文件名前图片状态为 “X” 的图片进行自动标注。\n" \ + "4. 手动标注:点击 “矩形标注”(推荐直接在英文模式下点击键盘中的 “W”),用户可对当前图片中模型未检出的部分进行手动" \ + "绘制标记框。点击键盘P,则使用四点标注模式(或点击“编辑” - “四点标注”),用户依次点击4个点后,双击左键表示标注完成。\n" \ + "5. 标记框绘制完成后,用户点击 “确认”,检测框会先被预分配一个 “待识别” 标签。\n" \ + "6. 重新识别:将图片中的所有检测画绘制/调整完成后,点击 “重新识别”,PPOCR模型会对当前图片中的**所有检测框**重新识别。\n" \ + "7. 内容更改:双击识别结果,对不准确的识别结果进行手动更改。\n" \ + "8. 保存:点击 “保存”,图片状态切换为 “√”,跳转至下一张。\n" \ + "9. 删除:点击 “删除图像”,图片将会被删除至回收站。\n" \ + "10. 标注结果:关闭应用程序或切换文件路径后,手动保存过的标签将会被存放在所打开图片文件夹下的" \ + "*Label.txt*中。在菜单栏点击 “PaddleOCR” - 保存识别结果后,会将此类图片的识别训练数据保存在*crop_img*文件夹下," \ + "识别标签保存在*rec_gt.txt*中。\n" + return msg \ No newline at end of file diff --git a/PPOCRLabel/libs/yolo_io.py b/PPOCRLabel/libs/yolo_io.py new file mode 100644 index 0000000000000000000000000000000000000000..216fba388cabec6705718771b80b549577bf4e78 --- /dev/null +++ b/PPOCRLabel/libs/yolo_io.py @@ -0,0 +1,146 @@ +#!/usr/bin/env python +# -*- coding: utf8 -*- +import sys +import os +from xml.etree import ElementTree +from xml.etree.ElementTree import Element, SubElement +from lxml import etree +import codecs +from libs.constants import DEFAULT_ENCODING + +TXT_EXT = '.txt' +ENCODE_METHOD = DEFAULT_ENCODING + +class YOLOWriter: + + def __init__(self, foldername, filename, imgSize, databaseSrc='Unknown', localImgPath=None): + self.foldername = foldername + self.filename = filename + self.databaseSrc = databaseSrc + self.imgSize = imgSize + self.boxlist = [] + self.localImgPath = localImgPath + self.verified = False + + def addBndBox(self, xmin, ymin, xmax, ymax, name, difficult): + bndbox = {'xmin': xmin, 'ymin': ymin, 'xmax': xmax, 'ymax': ymax} + bndbox['name'] = name + bndbox['difficult'] = difficult + self.boxlist.append(bndbox) + + def BndBox2YoloLine(self, box, classList=[]): + xmin = box['xmin'] + xmax = box['xmax'] + ymin = box['ymin'] + ymax = box['ymax'] + + xcen = float((xmin + xmax)) / 2 / self.imgSize[1] + ycen = float((ymin + ymax)) / 2 / self.imgSize[0] + + w = float((xmax - xmin)) / self.imgSize[1] + h = float((ymax - ymin)) / self.imgSize[0] + + # PR387 + boxName = box['name'] + if boxName not in classList: + classList.append(boxName) + + classIndex = classList.index(boxName) + + return classIndex, xcen, ycen, w, h + + def save(self, classList=[], targetFile=None): + + out_file = None #Update yolo .txt + out_class_file = None #Update class list .txt + + if targetFile is None: + out_file = open( + self.filename + TXT_EXT, 'w', encoding=ENCODE_METHOD) + classesFile = os.path.join(os.path.dirname(os.path.abspath(self.filename)), "classes.txt") + out_class_file = open(classesFile, 'w') + + else: + out_file = codecs.open(targetFile, 'w', encoding=ENCODE_METHOD) + classesFile = os.path.join(os.path.dirname(os.path.abspath(targetFile)), "classes.txt") + out_class_file = open(classesFile, 'w') + + + for box in self.boxlist: + classIndex, xcen, ycen, w, h = self.BndBox2YoloLine(box, classList) + # print (classIndex, xcen, ycen, w, h) + out_file.write("%d %.6f %.6f %.6f %.6f\n" % (classIndex, xcen, ycen, w, h)) + + # print (classList) + # print (out_class_file) + for c in classList: + out_class_file.write(c+'\n') + + out_class_file.close() + out_file.close() + + + +class YoloReader: + + def __init__(self, filepath, image, classListPath=None): + # shapes type: + # [labbel, [(x1,y1), (x2,y2), (x3,y3), (x4,y4)], color, color, difficult] + self.shapes = [] + self.filepath = filepath + + if classListPath is None: + dir_path = os.path.dirname(os.path.realpath(self.filepath)) + self.classListPath = os.path.join(dir_path, "classes.txt") + else: + self.classListPath = classListPath + + # print (filepath, self.classListPath) + + classesFile = open(self.classListPath, 'r') + self.classes = classesFile.read().strip('\n').split('\n') + + # print (self.classes) + + imgSize = [image.height(), image.width(), + 1 if image.isGrayscale() else 3] + + self.imgSize = imgSize + + self.verified = False + # try: + self.parseYoloFormat() + # except: + # pass + + def getShapes(self): + return self.shapes + + def addShape(self, label, xmin, ymin, xmax, ymax, difficult): + + points = [(xmin, ymin), (xmax, ymin), (xmax, ymax), (xmin, ymax)] + self.shapes.append((label, points, None, None, difficult)) + + def yoloLine2Shape(self, classIndex, xcen, ycen, w, h): + label = self.classes[int(classIndex)] + + xmin = max(float(xcen) - float(w) / 2, 0) + xmax = min(float(xcen) + float(w) / 2, 1) + ymin = max(float(ycen) - float(h) / 2, 0) + ymax = min(float(ycen) + float(h) / 2, 1) + + xmin = int(self.imgSize[1] * xmin) + xmax = int(self.imgSize[1] * xmax) + ymin = int(self.imgSize[0] * ymin) + ymax = int(self.imgSize[0] * ymax) + + return label, xmin, ymin, xmax, ymax + + def parseYoloFormat(self): + bndBoxFile = open(self.filepath, 'r') + for bndBox in bndBoxFile: + classIndex, xcen, ycen, w, h = bndBox.strip().split(' ') + label, xmin, ymin, xmax, ymax = self.yoloLine2Shape(classIndex, xcen, ycen, w, h) + + # Caveat: difficult flag is discarded when saved as yolo format. + self.addShape(label, xmin, ymin, xmax, ymax, False) diff --git a/PPOCRLabel/libs/zoomWidget.py b/PPOCRLabel/libs/zoomWidget.py new file mode 100644 index 0000000000000000000000000000000000000000..4512d2ab4f582399798307d86fbedee1221cfd46 --- /dev/null +++ b/PPOCRLabel/libs/zoomWidget.py @@ -0,0 +1,38 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +try: + from PyQt5.QtGui import * + from PyQt5.QtCore import * + from PyQt5.QtWidgets import * +except ImportError: + from PyQt4.QtGui import * + from PyQt4.QtCore import * + + +class ZoomWidget(QSpinBox): + + def __init__(self, value=100): + super(ZoomWidget, self).__init__() + self.setButtonSymbols(QAbstractSpinBox.NoButtons) + self.setRange(1, 500) + self.setSuffix(' %') + self.setValue(value) + self.setToolTip(u'Zoom Level') + self.setStatusTip(self.toolTip()) + self.setAlignment(Qt.AlignCenter) + + def minimumSizeHint(self): + height = super(ZoomWidget, self).minimumSizeHint().height() + fm = QFontMetrics(self.font()) + width = fm.width(str(self.maximum())) + return QSize(width, height) diff --git a/PPOCRLabel/requirements/requirements-linux-python3.txt b/PPOCRLabel/requirements/requirements-linux-python3.txt new file mode 100644 index 0000000000000000000000000000000000000000..787a7fda11ade96de811381d158f2742298b0632 --- /dev/null +++ b/PPOCRLabel/requirements/requirements-linux-python3.txt @@ -0,0 +1,2 @@ +pyqt5==5.10.1 +lxml==4.2.4 diff --git a/PPOCRLabel/resources.qrc b/PPOCRLabel/resources.qrc new file mode 100644 index 0000000000000000000000000000000000000000..3ec50bce36369993a4b12f8886eea366c35b5733 --- /dev/null +++ b/PPOCRLabel/resources.qrc @@ -0,0 +1,40 @@ + + + +resources/icons/help.png +resources/icons/app.png +resources/icons/Auto.png +resources/icons/reRec.png +resources/icons/expert2.png +resources/icons/done.png +resources/icons/file.png +resources/icons/labels.png +resources/icons/objects.png +resources/icons/close.png +resources/icons/fit-width.png +resources/icons/fit-window.png +resources/icons/undo.png +resources/icons/eye.png +resources/icons/quit.png +resources/icons/copy.png +resources/icons/edit.png +resources/icons/open.png +resources/icons/save.png +resources/icons/format_voc.png +resources/icons/format_yolo.png +resources/icons/save-as.png +resources/icons/color.png +resources/icons/color_line.png +resources/icons/zoom.png +resources/icons/zoom-in.png +resources/icons/zoom-out.png +resources/icons/cancel.png +resources/icons/next.png +resources/icons/prev.png +resources/icons/resetall.png +resources/icons/verify.png +resources/strings/strings.properties +resources/strings/strings-zh-TW.properties +resources/strings/strings-zh-CN.properties + + diff --git a/PPOCRLabel/resources/icons/Auto.png b/PPOCRLabel/resources/icons/Auto.png new file mode 100644 index 0000000000000000000000000000000000000000..267f2e1d9dc3a44431b27679d8654063f77f20dc Binary files /dev/null and b/PPOCRLabel/resources/icons/Auto.png differ diff --git a/PPOCRLabel/resources/icons/app.icns b/PPOCRLabel/resources/icons/app.icns new file mode 100644 index 0000000000000000000000000000000000000000..9409991b4c47986568db5fa594f4522a6130976c Binary files /dev/null and b/PPOCRLabel/resources/icons/app.icns differ diff --git a/PPOCRLabel/resources/icons/app.png b/PPOCRLabel/resources/icons/app.png new file mode 100644 index 0000000000000000000000000000000000000000..267f2e1d9dc3a44431b27679d8654063f77f20dc Binary files /dev/null and b/PPOCRLabel/resources/icons/app.png differ diff --git a/PPOCRLabel/resources/icons/app.svg b/PPOCRLabel/resources/icons/app.svg new file mode 100644 index 0000000000000000000000000000000000000000..bf4a252c61df76d8563beb309820265a6c67922d --- /dev/null +++ b/PPOCRLabel/resources/icons/app.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/PPOCRLabel/resources/icons/cancel.png b/PPOCRLabel/resources/icons/cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..8fbfab89d036a18e8b38c2156ca2636baf78d16f Binary files /dev/null and b/PPOCRLabel/resources/icons/cancel.png differ diff --git a/PPOCRLabel/resources/icons/close.png b/PPOCRLabel/resources/icons/close.png new file mode 100644 index 0000000000000000000000000000000000000000..aa52a8d67a2567a142c89ed68843291ba43ff480 Binary files /dev/null and b/PPOCRLabel/resources/icons/close.png differ diff --git a/PPOCRLabel/resources/icons/color.png b/PPOCRLabel/resources/icons/color.png new file mode 100644 index 0000000000000000000000000000000000000000..1a1e1ad03b799acb31b1ace1c68c48ca0635b2ef Binary files /dev/null and b/PPOCRLabel/resources/icons/color.png differ diff --git a/PPOCRLabel/resources/icons/color_line.png b/PPOCRLabel/resources/icons/color_line.png new file mode 100644 index 0000000000000000000000000000000000000000..6ef10bfc47505002aa3d06f67a4b6a6c6434f72f Binary files /dev/null and b/PPOCRLabel/resources/icons/color_line.png differ diff --git a/PPOCRLabel/resources/icons/copy.png b/PPOCRLabel/resources/icons/copy.png new file mode 100644 index 0000000000000000000000000000000000000000..a4c9bddc74e0e365fc448b8e61d760b1d179537f Binary files /dev/null and b/PPOCRLabel/resources/icons/copy.png differ diff --git a/PPOCRLabel/resources/icons/delete.png b/PPOCRLabel/resources/icons/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..a1a4074f08042ab12ef344a8d79adbd6c44fd2f8 Binary files /dev/null and b/PPOCRLabel/resources/icons/delete.png differ diff --git a/PPOCRLabel/resources/icons/done.png b/PPOCRLabel/resources/icons/done.png new file mode 100644 index 0000000000000000000000000000000000000000..d8a03f4f479f3496e72cab5a60c61c4bf1217582 Binary files /dev/null and b/PPOCRLabel/resources/icons/done.png differ diff --git a/PPOCRLabel/resources/icons/done.svg b/PPOCRLabel/resources/icons/done.svg new file mode 100644 index 0000000000000000000000000000000000000000..aa8fd28843e6281cade711282d748a3cd4e61a6c --- /dev/null +++ b/PPOCRLabel/resources/icons/done.svg @@ -0,0 +1,400 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + begin='' id='W5M0MpCehiHzreSzNTczkc9d' + + + + +Adobe PDF library 5.00 + + + + + +2003-12-22T22:34:35+02:00 + +2004-04-17T21:25:50Z + +Adobe Illustrator 10.0 + +2004-01-19T17:51:02+01:00 + + + + +JPEG + +256 + +256 + +/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWGefPzS8v+ +U4mhdhe6uR+70+JhUVGxlbf0x+PtmFqtdDDtzl3Ou1vaWPAK5z7v1vD9U/OP8w9SuWli1A2cQPJb +e1RVRR8yGc/7Js0OTtLNI3de55nL2vqJm+KvczD8u/z0v3v4tM81OssM5CRakqhGRj0EqoApU/zA +bd69s7RdpyMhHJ16uy7O7YlKQhl69f1vcIZopo1kicPG26spqM3r0q/FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqo3l5aWVtJdXcyW9tCvKWaRgqKo7ljsMEp +ACzyYymIiyaDw/8AMD8+Zrj1NO8ploYTVZNUYUkYd/RU/YH+Ud/ADrmi1fahPpx/P9Tzeu7aJ9OL +b+l+p5jYaLe6jKbq7dgkjF3lclpJCTUnfffxOaUl52Rs2Wb2vlaWy0Z770xbWw4iIPs8rMQNgdzt +U1P0ZV4gunI/KzGM5DsOnmwHzBEkOqyenRQ3F6DsSN/65aHHD6D/ACn1ue40+3ilflyBjavio5Kf +u2ztoG4gvouOVxB7w9IyTN2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux +V2KuxVivnf8AMjy55Rtz9dl9fUGWsGnREGVvAt/Iv+U30VzF1GrhiG/PucLV67HgG+8u587ebfPn +mjzrfBblitqprb6dDURJ/lN/M3+U30UzntTqp5T6uXc8nrNdkzn1HbuRHl/yfJJPGvpG6vG3WJRV +F9z8vE7ZgymA4kISmeGIsvT9O8r6XodqdR1h1llj3CdUU9goP22/z98w5ZTI1F3eHQ48EePLuR+P +iwnzn5xe4lNxMaAVFna12A8T/E5k4sVB1Wq1Ms8rPLoGBWsFzqd8ZJCWDMGmf28B+oZsdJpTllX8 +PVu0OiOaYH8I5vffyv06aMQVFPjMjewUf12zq3uHqWKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV +2KuxV2KuxV2KuxV2KuxV2KrJpoYIXmnkWKGMFpJHIVVUbkknYAYCaQSALLxf8wfz7jj9XTfKdHk3 +WTVnFVH/ABgQ/a/1m28AeuanU9o9Mfz/AFOg1vbFenF8/wBTyO103VNZuXvbyV29VuUt1MS7ue5q +27fPNJknvZ3LzmSZJs7l6H5T8hy3EatEn1ayP27hhV3p/L4/qzDy5wPe5Wl0E8252j3/AKno1tZ6 +RoGnuyAQQoKyzNu7H3PUnwH3ZhkymXoIY8WnhtsO95j5085tcsZpSVt0JFpa1oSf5m9/E9szsOGn +nNXqpZ5f0RyedKLzVr4sxqzfbb9lFzY6fTHJLhDLSaSWaXDH4nuem+SfJjzPEqRnjXYdyT3/ANb9 +WdNhwxxx4YvZ6fTxww4Yvc9E0aDTLVY0A9QgB2HQU/ZHtlremOKuxV2KuxV2KuxV2KuxV2KuxV2K +uxV2KuxV2KuxV2KuxV2KuxV2KuxVj3nHz35d8p2Yn1Sf9/ICbezjo00tP5V7D/KO2U5tRHGN3G1O +rhhFyPwfOnnb8zPM/nO5+rGtvpvL9xpkBPE0OxlbrI3z2HYDNFqdXLJz2j3PLazXzzc9o9yhoXlB +5JoxNGbi5c/BbJ8QHzp1/VmtyZXXDimaiLL1ny95EgtwlxqYWWUUK2w3jX/W/m/V881+TPewd3pO +yhH1ZNz3MqnngtoGllYRQxCrMdgAMxwLdvKQiLOwDyjzt50F1WR6pZREi3g/adv5j7/qzYYMNe95 +bWauWeVD6Q80d7zV7+p3ZvnxRR/DNpg05meGKdNpZZZCMXo/krya0rRoqEioNabknv8APwGdHgwx +xxoPY6bTRww4Y/2vdtA0G30q2VQB6xFGPgPAfxy5yE1xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 +KuxV2KuxV2KuxV2KuxVpmVFLMQqqKsx2AA7nFXkH5hfnzY6f6mneVil7eCqyaifigjPT92P92N7/ +AGf9bNdqNcBtDc97ptZ2qI+nHue/p+14qsGteYb6S+vZ5JpJWrNeTEsSfAV607AbDNLly72dy83l +ykm5Gyzzyn5HlnH+jJ6UHSW8kFSfZelfkNswM2eubPT6TJnPdHven6Poun6VDwtk/eMKSTNu7fM+ +HsM185mXN6HT6WGIVEfFHSzxxRtLIwSNAWdjsAB1ORAciUgBZ5PLvO3nRLoE8jHp8J/dp+1K3Ykf +qHbNhgwV73mdbrDnlwx+kPLp573V77YVJ+wn7KL/AJ9c2uDAZHhix0+mlOQjHm9B8meTjKURUqCQ +WYjdiehp+oZ0GDAMcaD1+k0scMaHPqXvPlzy9BpVstVHrkb9+Pjv4nucvcpOcVdirsVdirsVdirs +VeFfmV+eupwancaR5XZIY7ZjFPqTKJHeRTRhEGqgUHbkQa9s1mo1hBqLotZ2nISMcfTqw3S/zp/M +XTbpZZtQN5ETye2uo0ZWHsQFdf8AYnMeGryA87cHH2lmibu3v3kT8w9D836cs1q4gv0AF3YOfjjb +2O3JT2Yfgc2uHMMgsPRaXVRzRsc+oZTlzkuxV2KuxV2KuxV2KuxV2KuxV2KpL5q84aB5X083ur3I +iU1EMC/FNKw/ZjTqfn0Hc5XkyxgLLTn1EMQuRfOnn782/MXm6VrG2DWOkMaJYxEl5fAzMN2/1Rt8 ++uajUaqU/KLzer7Qnl2+mP45pPo3lR5JEN0hkkYj07ZNyT706/IZrMmbudUZkmovVfL3kWONUm1J +R8NPTtF+yAOnMj9QzWZNRe0XZ6Xsz+LJ8v1syUJGgRAFVRRVAoAB2AGYpDuQABQaeZERndgqKCWY +mgAHUk4KUyA3Lzfzp5yjuFeOOQx6bF1PQysOm3h4D6flsNPp697z2t1hynhj9P3vK7y8vNWvAqgm +ppFEOijxP8Tm3w4DyHNrwacyIjEWSzvyb5PaRkCpyLEc3p9o/wBPAd832DAMY83rdJpI4Y0Pq6l7 +15Z8tQaXbq7oPXI2B341/wCNsvctPsVdirsVdirsVdirsVQuqzSwaZeTxf3sUEjx/wCsqEj8cEjs +xmaiS+OPL0ccuqp6tGoGcBt6sB/mc5rNtF4bLyZrqnl83OkxXMoD201Qsq9Y5ASKHwO305gwy1Ku +rDwpRiJjkWHWl5rHlfWY7u0kMVxEaxyCvGRa7gjuD3GbPDlIPFFytPnMDxR5vpr8uPzH03zbpy/E +ItSiAFxbk718R4g9jm8w5hMWHq9Lqo5o2OfUMzy1yXYq7FXYq7FXYq7FXYq7FXlf5h/nnpOiepp/ +l/hqWqiqvPWttCe9SP7xh4KaeJ7Zh5tWI7R3Lq9X2lGG0N5fY8JuZ/MHmjU5L/ULh7meQ/vbmU/C +o/lUCgAHZVGanLl3uR3edzZzI3I2WX+VvJkkzUtE26S3kg2HsP6D6c1ufUVz+TXiwTzHbk9P0Ty7 +Y6ZHWJecxFHuH+0fl4DNfKUp8+TvdNpIYhtz702qB0wVTlqbyAAkmgG5JyosSXnnnLzgkqSQQS8L +CL+9lH+7COw/yfDxzP0+n6nm6LW6w5DwQ+n73lOoahdardqiKeNaQxD9Z982+LDWw5tOHASaG5LN +PJ3lB3dfh5s394/Y07D/ACR+ObzBgGMeb1ej0Ywx/pHm988qeV4NNt0lkT99SqqR09z7/qzIcxke +KuxV2KuxV2KuxV2KuxVxAYEEVB2IPQjFXx/5w0K48oedLuwAPp28vqWrH9u3k+JN/wDVPE+9c0mf +DRMXkdXp+CZi9D8j6lbziXTpqSWt6nqRq3Qmm4+lf1Zz+qgR6hzDDQTFnHLkUs84eUFgUggyWUh/ +dS/tRt4H/PfLdNqL97VqdMcMrH0sBs7zWfK+sx3dpIYriI1jkFeMi13BHcHuM3OHL/FFs0+cxPFH +m+mvy4/MjTPNunKOQi1OIAXFsSOVfEeIPj/tZuMWUTD1Om1McsbHPuZplrkuxV2KuxV2KuxVLPMP +mXRPLunNqGr3SWtuuy8t3dv5Y0HxM3sMjOYiLLXlyxxi5Gnzt+YX50655mMmnaUH03R2JUxof384 +O37xl6A/yL9JOa3NqTLYbB0Gq7Qlk2HpixXSfLMkrLJdgjl9m3X7R+dP1ZrMmcDk6eWToHp/l7yP +VY3vk9OID93aJsaf5RHT5ZqsupJNR3Lm6bs8nefyZ3b2sMESxooREFERRRQPllQxdTzdzGAiKCqz +4SyJUXkplMixJYD5w83I6S2lvIFtE/3onB+3T9lafs/rzL02nPM83S63V8fojyeT6pqc+p3KxxA+ +kDSKLuSe5983WHDXvaMWE3Q3JZd5P8oyO61XlI/237U/lB8B3ObnBgEB5vUaLRjELP1F775Q8qQ6 +dbxzSr+8oCikUp4Ej9Q7ZkOcyjFXYq7FXYq7FXYq7FXYq7FXYq8e/wCcivKX1zRrXzJbJWfTj6F4 +QNzbyH4WP+pIf+GOYmqx2LdV2pguImOjybyfqskYVVak1qwkiJ/lrX8Dmj1WL5F5vJcZCQe32CW+ +tWHwqJEnj5iFt+Q/aX/WGaXFgkZED6x9rv8AGBlj7w8483eUxbhkZTJZSH93J+1G3gff9eZum1F/ +1nSajTnFKx9LAbe41jyzq8V5ZymKeI8oZlrxda7gjw8Rm5w5eobcGcxPFHm+mPy1/MzT/N1gEciH +VYQBcW5PU/zL4g5tsWUTD0+m1McsbHPqGcZa5LsVdirsVeb/AJifnVofln1dP03jqWtrVTGp/cQt +/wAWuOpH8i7+JGY+XOI7Dm4Gq18cew3k+fdV1bzL5v1V73UZ2upztyb4Yol6hUUbKPYZrc2XrIvP +59QZHikWR+WvKDySAW0fqSjaS5fZV+Xh+vNXqNTXNxoQnlNDk9P0Dyta2KiQD1J/2rhx+CDtmuJn +l8ou402jjDfr3shVUjFFHzPfLowERs5oFLWfIlVGWUKPftlE5UxJYL5u81rwls7aTjGtRdXFaCg6 +qD4eOX6bTkniLp9Zq79Efi8l1bVZdQnEMIPoA0jQdWPiR+rN5hw173HxYfmyjyf5SkkkVmXlM32i +P2R/KD+s5t8GDh3PN6bRaMYhZ+r7nvvk3yjDY28c8yDlQFFp18D8vD78yHPZdirsVdirsVdirsVd +irsVdirsVdiqG1PTbTU9OudOvE9S1u4mhmTxVxQ08D4HARYpjOIkCDyL471DT7zyt5pudOuv7yxm +aGU0IDx9nA8GUhhmozYrBi8nqMBBMT0es/l/rbRMbblUxn1oPdT9pc0Ge8cxkHRn2dmr09z0LWdI +t9StTNEgcSrWSI9HB/42zL1WlGQeLj+rn7/2u6zYRMX3vHPNnlQW4ZGUyWUh/dyftRt4H3/XlOm1 +N/1nnM+A4pWOTAre41fy1q8V3aSmKeI8opV+y69wR4eIzdYct7huwZyDxR5vpr8s/wAzNP8ANunh +HIh1WEAXFuTuT/MviDm0x5BIPS6bUjLGxzZxljkoHWdb0nRbCTUNVuktLSL7UshpU9lUdWY9gN8B +kBuWE8kYCyaD58/MT89dW1v1dN8vc9O0pqo9z0uZl+Y/u1PgN/E9sw8ucnYcnS6nXyntHYMD0zy7 +NORLd1SM7iP9tvn4ZrcucDYOmnlrYPSPLvkpnWM3EfoW/wCxbqKO3z8P15p82qs1HeTdg0Rmbm9C +sNKt7WFUCKiL9mJeg+fjkIaezc9y7nHhERSNLU27ZeW1SZ8qLFQlmCCp69hlM5UxJYV5r81emJLS +1lowqLicGgUd1B/Wcnp9OZHik6rV6r+GPN5JrOsPeyfV4K/VwaADq58f6DN9hwcO55uNiw172Q+U +fKcssqO6Ezt/wgPYf5Xie2bXDh4dzzej0WjEBxS+r7nvnkvydDaQJcXEYpQcFPf/AJt/XmQ7FmuK +uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvCP+ckPKXF7LzTbJs1LO/p4irQufo5KT/q5jZ4dXU9pYeU +x7mA+TtaeIQyg1ltGAYdyh/5tqM0eswXY73QS/dzEg9+8s6kk9r6YbkoAkiPijb5j9m5tjA84vRa +bJYb13RYb2KRlQMWFJYj0cf1w6zScR44fV9658IkHjnmvysIAyMpezc/u5P2kbwPv+vK9Lqb/rPP +ZsJxGxyYLb3Or+WtXivLOUxTxHlFKv2XXuCPDxGbzDlvcOTgzkHijze2xf8AORmkReWEnktHm14j +h9UHwx8gPtvJ/L8tz7Zm+OK83dHtGPBderuePeYPM/mnzpqn1jUZ2nYV9KFfhghU9kXovz6nvXMT +Ll6ydPqNQZG5FNPL3lR2mUQx+vcjdpDsif0/Xmq1Gqob7BwrlkNReneXfKMNuVlYCWcdZmHwqf8A +IH8c1hlPNsNouy02jEd+ZZZDBFAtEFWPVj1OZGPFGA2diIgNs+ElbUmfKyWNqE06otT9AymcwAxJ +phvmjzQYeVrauPXIpLKD/djwHv8Aqx0+AzPFLk6zVaqvTHm8k1vWmumNtAf3APxMP2yP4Z0GDBw7 +nm42LDW55p15S8qzSypNIhMzU4rT7Ff+NjmzxYq3L0Oi0fD6pfV9z3zyT5Mht4VuJ0+Gmy/ze3y8 +fHMh2TO8VdirsVdirsVdirsVdirsVdirsVdirsVdiqV+adAtfMHl6/0a52jvIigb+VxvG/8AsXAb +BIWKa8uMTiYnq+PrUXWja7LZXimKWGV7a6Q/ssrcT9zDNZnxXHzDy+fEaI6h7H5D1sogiY/FbHp4 +xN/T+mc7l/dZRMci2aDNQruemCUEAg1B3Bzb8Vu7tJ9c0eG8idlQMWFJYj0cf1zX6rTWeOH1OPmw +iQeReafKwhRgymSzc/A/7Ubdq/1w6XVWf6TocuE4jY5MLt/LUxuGE7gQKdmX7TD28M2stSK25pln +Fbc2eeXvJ7yInJDb2v7KAfvH+/8AWc0+o1m9D1STi00pm5PR9K0G3tYVX0xHGNxEvf3Y5TDTGR4p +u3xYBEJryVVooAA6AZl8m9TZ8gSi1NnyslFqE06ovJvuymcgAwMqYh5m8zG35W8DVuWHxMOkYP8A +xtgwYDkPFLk67VamthzeSa7rZnLW9uxMVf3sn858Pl+vOh0+nrcuPhw1ueaZ+VPK808yTypWQ0Ma +EV4g9GI/m8Bmyx463LvtHpK9UufR755G8lRwxrcTrRB27se4r+s/QMvdm9BACgACgGwA6AYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXzj/wA5FeUvqHmC38xW6UttVX07kjoLmJaV/wBnGB9I +OU5I726jX4qlxDqx7ydrhja3uWbdD6Vx7r0r92+aDXae7HxDpP7vJfR7hol8JrQRk1aLYHxU9Mxd +FluFHmHeYZ2EwMmZlt1pTq+kxXaOyKCzikkZ6OP65g6jT2eKP1OPlxCTGtP8lQQXXqLCxYGqmYgq +nyFN/wAcpJzT2Ozh49GAbplVraQWwqvxSd3PX6PDL8WCMOXNzoxAVmky0llam0mVkotSaTIEsbUJ +p1RSzHYZVOQAtiZUxTzJ5lFuDDCa3TDYdRGD3PvkMOE5TxH6XA1GorYc3k+va40rPbwSFuRPry1q +WJ6gH9edHptNW5cfDh/iKK8q+WZbqZJ5kqTQxIR0/wAph+oZsYQ6l3uj0n8Uvg978i+SVRFnnWiL +1J6k9wPfxOXOzejoiIgRAFVRRVGwAGKt4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWN/mJ +5UTzR5Qv9KoDcsnq2THtcR/FHuenI/CfYnARYac+PjgQ+S9CuXtdQa3lBT1D6bqdiHU7V+nbMDVY +rjfc81qMdx9z2byTrVYY1dvii/dS/wCofsn/AD8M5qY8LLfSTbo82zOTJmdbs7aMmRtFrDJgJRaw +yZElFqbSZAlFqbSZAlFqMs6opZjQDK5SpiZMX8xeYxbIUjINww/dp1Cj+Zsrw4TllZ+lws+or3vK +vMGvSO8kEUnOR6+vNWpqeoB/XnSaXSgCzy6OPhw36pLvK/luS8lSeZKqd4oz0P8AlN7frzZRi7vS +6W/VLk968i+SBRZp1IRd2Y9a/wDNX6ssdo9NiijijWONQqKKKo6AYquxV2KuxV2KuxV2KuxV2Kux +V2KuxV2KuxV2KuxV2KuxV2Kvlv8APjyk2g+dG1C3ThZayDdREbATgj11+fIh/wDZZEh1GrxVK+hU +fKGsgSwTMaJMPTmHYN0r9/4ZzfaGm2I7tw6aP7uddHrunXnrWq1Pxp8LfR0zDwZOKLtsc7CIMuW2 +ztaZcFotYZMiSi1NpMiSi1KSZVUsxoB1OVylTEyY35g8wrbR0WjSt/dRf8bNleLEc0v6IcTNnp5b +5g16QySRI5a4kP76Xwr2Hv8AqzpdJpBQJ5dGjDhMjxSUfLPl2W/lSeVaxVrGh/ap3P8Ak5swHdab +TcXqPJ7z5E8kcys0q8VWhZiP89/Adsk7R6nBBFBEsUS8Y0FFGKr8VdirsVdirsVdirsVdirsVdir +sVdirsVdirsVdirsVdirsVYN+cnlH/Enkm6SFOWoaf8A6ZZ0FWLRg80H+ulRTxpi0ajHxRfMHly8 +4TtbMfhl3T/WH9RmHrMVji7nntVjsX3PY/Kmr+tBGWPxH93L/rDofpzlJR8LKR0LLT5GSmXLrcu1 +hlwWi1plyJKLU3mABJNAOpyJKCWPa7r8dtFXqx/uo/E+J9srx4zmlX8IcbLlp5j5g1+T1HVX53Un +23/lH9c6XR6MUNvSGnDhMzxS5ITy75fm1GdZpVJgr8K95D/TxObWnc6fT8W55PdvInkgyMkjqFRQ +CWpsB22/UMXaPWba3ht4VhhXiijYfxOKqmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku +xV2KuxV2KvkX82fKj+U/PV1FbJ6djct9d08gUUJISSg/4xuCtPCmS4RIUXU6jFUiOhTPypqq+qlD +SK6UU9nHT+mct2lpzR74umiDCVPRre69WFWrv0b5jNfCdhzoysLjLhtNrGmAFSdsiSi0l1nW4reL +kTWv93H3Y/0yOPHLNKhyaMmR5r5g8wSh2+PndydT2Qf59BnTaLRCuXpH2teHCZmzyS3QNDn1O5Ek +oYwctz3dvAH9ZzbnZ3GDT8XP6XunkTyO0rIzRgIAO3whR028PAd/lkHZgU9etLSC0gWGFeKL95Pi +cUq2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV5h/wA5AeUP015OOqW6 +cr7RSZxQVZrdqCZf9iAH/wBicnA7uPqYXG+588+W70qWtyaMD6kR/X/XMPX4f4vgXQ6vHyk9X0TU +hPbo9f7wfEPBxsc46cPDmYsMc0yM3vjbbaV6rrEVvCWY7fsr3Y4MeOWWXCOTTObzvzB5gkDlmYNc +uPgXsi/LOn0OhFUPpH2ow4TkNnkk+iaNcatdc35ejy+N+7Mf2R75uTURQdxgwcXue4eRPI5maMem +AigAbfCFH8B+OVOyArZ7JY2NvZW6wwigH2m7k+JxSiMVdirsVdirsVdirsVdirsVdirsVdirsVdi +rsVdirsVdirsVdirsVdirsVWTQxTQvDMgkilUpIjCoZWFCCPAjFXxp538uz+T/Ot7ptD6VvL6lox +r8dvJ8Ue/f4TxPvXL5QE4V3uqz4ecWUeWdRXn6Yb4JQJIj70r+Izj+08BA4usdi6UXE0yC/1SOCA +yOaL4dyfAZrMcJZJcIZymwLX9fYMZHo0zCkUfZR751Gg0Aqhy6lOHCch8ki0jSrrV7ssxPp1Hqyd +SSf2V983hqAoO5w4b2HJ7b5E8jmZolWIKi7KvYAdd/1nMcl2IAAoPadN06CwthDEP9dqUJP+fTFK +KxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV4z/zkl5Q+u6Ha ++ZbZK3GmEQXZHU28rfCf9hIf+GOX4Zb04+ohYt4l5b1FlUR8qSwtyjr3Fa/gcwO0dNe/SXN0esxU +eIJjr2vEEySbuRSGGuw98w9B2fQocupacOE5D5Me03TrzV7wkk8agzS+A8B7+AzfnhxxoO5w4eg5 +PaPInkcyNCkcXFF2Vf11P6zmKTbsIxAFB7dpWlW+nWywxAcqDm4FK0/gMCUbirsVdirsVdirsVdi +rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVQ+o6faajYXFheRia0uo2hniPRkcc +WH3HCDSCLfKX5gfk/wCYfK+pymzRr3SWJa1ulpzCH9mQbfEvQkbd9sy45okbuLPCfexez8savdTA +SoYkJozuat9C1qcJyxiNkRwn3PW/Ivkcs0UUcRCA7DuT3JP836sxJSJNlyoxAFB7lo2j2+mWqxxq +PUoA7D9Q9siyTDFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYqpXNrb3MRiuIxJGexxVIG/L3yuZfUFsUJ6qjFR+GKp1YaVYWEfC0hWMUpUbmnzOKorFXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq//Z + + + + + + +uuid:4b4d592f-95b8-4bcd-a892-74a536c5e52f + + + +image/svg+xml + + + +test.ai + + + + + + end='w' + + + + + + + + + + diff --git a/PPOCRLabel/resources/icons/edit.png b/PPOCRLabel/resources/icons/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..36775390f1e8e89e7007e4978a003751acab855d Binary files /dev/null and b/PPOCRLabel/resources/icons/edit.png differ diff --git a/PPOCRLabel/resources/icons/expert1.png b/PPOCRLabel/resources/icons/expert1.png new file mode 100644 index 0000000000000000000000000000000000000000..281364540cb28396ff70aa411ef806842695d18e Binary files /dev/null and b/PPOCRLabel/resources/icons/expert1.png differ diff --git a/PPOCRLabel/resources/icons/expert2.png b/PPOCRLabel/resources/icons/expert2.png new file mode 100644 index 0000000000000000000000000000000000000000..7c470b6a564bcfbe423e6ff0aa4a055485cf5d0c Binary files /dev/null and b/PPOCRLabel/resources/icons/expert2.png differ diff --git a/PPOCRLabel/resources/icons/eye.png b/PPOCRLabel/resources/icons/eye.png new file mode 100644 index 0000000000000000000000000000000000000000..c4b65505acc1538d6a2fcc79604702f563fa16b8 Binary files /dev/null and b/PPOCRLabel/resources/icons/eye.png differ diff --git a/PPOCRLabel/resources/icons/feBlend-icon.png b/PPOCRLabel/resources/icons/feBlend-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1c1aca8497817ec07f2ab55216df32cb74d138af Binary files /dev/null and b/PPOCRLabel/resources/icons/feBlend-icon.png differ diff --git a/PPOCRLabel/resources/icons/file.png b/PPOCRLabel/resources/icons/file.png new file mode 100644 index 0000000000000000000000000000000000000000..1ec0515a25dc982de92c4f84105c32c5b8e38d01 Binary files /dev/null and b/PPOCRLabel/resources/icons/file.png differ diff --git a/PPOCRLabel/resources/icons/fit-width.png b/PPOCRLabel/resources/icons/fit-width.png new file mode 100644 index 0000000000000000000000000000000000000000..0a5490748b44ed1ab49cfc355bf853cd9837e492 Binary files /dev/null and b/PPOCRLabel/resources/icons/fit-width.png differ diff --git a/PPOCRLabel/resources/icons/fit-window.png b/PPOCRLabel/resources/icons/fit-window.png new file mode 100644 index 0000000000000000000000000000000000000000..585e970773e3fcd327874e6b1c95f194e25db04b Binary files /dev/null and b/PPOCRLabel/resources/icons/fit-window.png differ diff --git a/PPOCRLabel/resources/icons/fit.png b/PPOCRLabel/resources/icons/fit.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0e817be2ac2e29799aeb5f0752224c1996e73a Binary files /dev/null and b/PPOCRLabel/resources/icons/fit.png differ diff --git a/PPOCRLabel/resources/icons/format_createml.png b/PPOCRLabel/resources/icons/format_createml.png new file mode 100644 index 0000000000000000000000000000000000000000..c08af9426e7888aa05f57c58c6f680442b80339b Binary files /dev/null and b/PPOCRLabel/resources/icons/format_createml.png differ diff --git a/PPOCRLabel/resources/icons/format_voc.png b/PPOCRLabel/resources/icons/format_voc.png new file mode 100644 index 0000000000000000000000000000000000000000..cb15e43974b065d73b7776b8e11559b2a0baf995 Binary files /dev/null and b/PPOCRLabel/resources/icons/format_voc.png differ diff --git a/PPOCRLabel/resources/icons/format_yolo.png b/PPOCRLabel/resources/icons/format_yolo.png new file mode 100644 index 0000000000000000000000000000000000000000..ca9acc71c97f8cded4b8111b87f09b29e6276e3b Binary files /dev/null and b/PPOCRLabel/resources/icons/format_yolo.png differ diff --git a/PPOCRLabel/resources/icons/help.png b/PPOCRLabel/resources/icons/help.png new file mode 100644 index 0000000000000000000000000000000000000000..93bf094a114d46d3f2c0236badc2914c04fd2e89 Binary files /dev/null and b/PPOCRLabel/resources/icons/help.png differ diff --git a/PPOCRLabel/resources/icons/labels.png b/PPOCRLabel/resources/icons/labels.png new file mode 100644 index 0000000000000000000000000000000000000000..c82ffb7b6fa64c44f97559c8ac954eae1e73da85 Binary files /dev/null and b/PPOCRLabel/resources/icons/labels.png differ diff --git a/PPOCRLabel/resources/icons/labels.svg b/PPOCRLabel/resources/icons/labels.svg new file mode 100644 index 0000000000000000000000000000000000000000..652cef3f4676512d174665884059e031e75d0fc6 --- /dev/null +++ b/PPOCRLabel/resources/icons/labels.svg @@ -0,0 +1,819 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + begin='' id='W5M0MpCehiHzreSzNTczkc9d' + + + + + +Adobe PDF library 5.00 + + + + + +2004-01-26T11:58:28+02:00 + +2004-03-28T20:41:40Z + +Adobe Illustrator 10.0 + +2004-02-16T23:58:32+01:00 + + + + +JPEG + +256 + +256 + +/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqlvmDzFo +3l7TJdT1e5W1tItuTbszHoiKN2Y+AxV4j5g/5ydvTcMnl/SYlgU0Se/LOzDxMcTIF/4M4qk//QzP +nv8A5YNL/wCRVx/2UYq7/oZnz3/ywaX/AMirj/soxV3/AEMz57/5YNL/AORVx/2UYq7/AKGZ89/8 +sGl/8irj/soxV3/QzPnv/lg0v/kVcf8AZRirv+hmfPf/ACwaX/yKuP8AsoxV3/QzPnv/AJYNL/5F +XH/ZRirv+hmfPf8AywaX/wAirj/soxV3/QzPnv8A5YNL/wCRVx/2UYq7/oZnz3/ywaX/AMirj/so +xV3/AEMz57/5YNL/AORVx/2UYq7/AKGZ89/8sGl/8irj/soxV3/QzPnv/lg0v/kVcf8AZRirv+hm +fPf/ACwaX/yKuP8AsoxV3/QzPnv/AJYNL/5FXH/ZRirv+hmfPf8AywaX/wAirj/soxV3/QzPnv8A +5YNL/wCRVx/2UYq7/oZnz3/ywaX/AMirj/soxV3/AEMz57/5YNL/AORVx/2UYq7/AKGZ89/8sGl/ +8irj/soxV3/QzPnv/lg0v/kVcf8AZRirv+hmfPf/ACwaX/yKuP8AsoxVFad/zk75oS4B1HSbG4t+ +6W/qwP8A8E7zj/hcVeyeRfzJ8tec7Vn0yUx3kQBuLCaizJ25AAkMlf2l+mmKsqxV2KuxV2KuxV2K +vm/XDqf5ufmk+j287Q+XtJLqJF3VIY2CSzAHYvM9AvtTwOKvePLfk/y35bs0tdHsYrZVFGlCgyuf +GSQ/Ex+ZxVOK4q6oxVrkMVdyGKu5jFWvUGKu9RffFWvVX3xV3rL74q71l8DirXrp4HFXfWE8DirX +1hPA4q76yngcVd9Zj8D+GKtfWo/A/hirvrcfgfw/rirvrcfgfw/rirX1yLwb8P64q765F4N+H9cV +d9di8G/D+uKtfXovBvw/riqVa/5X8r+abR7TV7GO55CiyMoWZP8AKjkHxKR7HFXzB5n0XXfys8/R +NZXBJgIudOujsJYGJUpIB8ijj+oxV9VeWtfs/MGhWWsWf9xexLKErUoxHxI3up2OKplirsVdirsV +Q+oMy2Fyy/aWJyvzCnFXhP8AziwqvL5nmYcpQLIBz1oxuC2/uVGKvficVaxVrFWicVaJxVrFWsVa +JxVonFWsVaxVrFWicVaxVrFWicVaJxVrFWsVaJxVonFWsVaxVdCSJkp/MP14q8V/5ypRBJ5ZkCjm +wvVZu5CmAgfRyOKsn/5x3vJX8lwWzElQZmSvbjMR/wAbYq9XxV2KuxV2KofUv+Oddf8AGGT/AIic +VeE/84pn/lKP+jD/ALGcVe+nFWsVaJxVonFWsVaxVonFWicVaxVrFWsVaJxVrFWsVaJxVonFWsVa +xVonFWicVaxVrFWicVXQ/wB9H/rD9eKvFv8AnKw/8ov/ANH/AP2LYqn/APzjn/yisHyuP+T4xV6/ +irsVdirsVQ+pf8c66/4wyf8AETirwf8A5xRNf8U/9GH/AGM4q9+PXFWicVaJxVrFWsVaJxVonFWs +VaxVrFWicVaxVrFWicVaJxVrFWsVaJxVonFWsVaxVonFWicVXQ/30f8ArD9eKvFf+crjT/C3/R// +ANi2Ksg/5xy/5RS3+Vx/yfGKvYMVdirsVdiqH1L/AI511/xhk/4icVeDf84nmv8Ain/ow/7GcVe/ +HrirROKtYq1irROKtE4q1irWKtYq0TirWKtYq0TirROKtYq1irROKtE4q1irWKtE4q0TirWKroP7 ++P8A1h+vFXiv/OWBp/hb/o//AOxbFWQf844f8onb/K4/5PjFXsOKuxV2KuxVD6l/xzrr/jDJ/wAR +OKvBP+cTD/ylX/Rh/wBjOKvf2O5xVrFWsVaJxVonFXln5ofnxoPk9pNM05V1XX1qrwK1IYD/AMXO +v7X+Qu/iRmNm1IhsNy7vs7sWef1S9MPtPu/W+fdS81/mp5+uWaS6urm3ZivoQH6vZoaV4mhSKtP5 +zXNXn1dbzlT1uDQ6fAPTEX8z+tX8r+Z/Pf5Xa5azXMUo0+evrac8oe3njGz8GQugkWoNRuNq7GhO +m1Q5xNhhrNHh1cDH+Ideo/Y+q/KfnXRfM+nw3umyVinXkgPXbZlPgynqM3UJiQsPAajTzwzMJiiE ++yTS1irROKtE4q1irWKtE4q0TirWKtYq0TirROKtYq1iq6A/v4/9Zf14q8U/5yzP/KK/9H//AGLY +qyH/AJxv/wCUSt/lcf8AJ/FXsWKuxV2KuxVD6l/xzrr/AIwyf8ROKvAv+cSj/wApV/0Yf9jOKvoB +upxVrFWicVaJxV4h+fH50yaCJPK/l2amsSLTUL1DvbI4qET/AItYGtf2R79MPU6jh9I5vSdi9keL ++9yD0dB3/s+95B5J/L5tQC6rrQZ4JgJLe2JPKXlv6krdeJ6qK1br0+1zGu7S8P0w3l937Xryeg5P +W7GwRESONFSNAFjjQBVVR0CqKAD2GaCUpTNyNlxpzA5Jlr3ky01XQTYapDytrj4gw2kikH2HQkfC +wH8QdiRncdk9ncOmqW0pG/c8jqe1JQ1PHjO0dvIvF/L+u6/+Vvm19PvuUmnyMryqlaPGTRLiCtPi +FKHxoVPTaeHMcciO40XoNTpsfaGATjtLp+o/jzfVXlnzJY67psN3bSrKJUEiOvR1P7Q/iOxzbRkC +LDw2XHKEjGQqQTgnCwaJxVrFWsVaJxVonFWsVaxVonFWicVaxVrFWicVXwf38f8ArL+vFXiX/OWp +/wCUV/6P/wDsWxVkX/ONv/KI23yuf+T+KvY8VdirsVdiqH1L/jnXX/GGT/iJxV4D/wA4kGv+K/8A +t3/9jOKvoFvtH54qtJxVonFWMfmT5vXyj5M1LWwA1xDGEs4z0aeUhI6juAzcm9gcryz4YkuZ2fpf +HzRh0PP3PkvyBob+ZPMFzqWpt9aS3YT3Pq0czTzMSvME7glWZutaUPXOY7R1RxQ2+qX4t9GkBECI +2H6HtlraEmp3J3JOcsBbjZMjItDtrU3a+oQWT4lQ9GI7Z1HY/YxmRlyD0dB3/s+/3PM9p9p1cIHf +qe5mUsMV5CSAC1KMh751s5iIsvOAW87/ADA8gadr+mtY3i8WXk1hegVkglI/FTQc16MPAgEeXajX +ZtNq5ZpbwyHcfo946PXdn5/DiBHp073j/kXzlrX5ceZZNB1rktgJfiZakRM2wnjJA5RuPtDw361B +7fQ62MoiUTcJOX2n2fHVw8SH94Pt8i+qNH1i11SzS4gdW5KGPA8lIYVDKR1U9jm5BeHlEg0eaOxQ +1irROKtE4q1irWKtE4q0TirWKtYq0TirROKr4P7+P/XX9eKvEv8AnLc0/wAKf9vD/sWxVkf/ADjX +/wAofbfK5/5P4q9jxV2KuxV2KofUv+Oddf8AGGT/AIicVfP/APziMa/4r/7d/wD2M4q+gm+0fniq +0nFWsVedfn15Y1LzF+Xlzb6chlurOaO8WAbtIsQZWVffi5I+WUamBlDZ2vYupjh1AMuRFPn78qPM +lrYm40e4iIuJpDNCxNAxChWjpTZhxqPHfw35/P2fHUyAMuCvK/1PXdpZp4o+JEcUevf7/c9Xt9Qk +moFURr4Dc/fm30Xs/gwnil65efL5frt43Vdq5cuw9I8v1ptbB6rwryG4I7ZstXq8WngZ5JCMR3/j +d1+PHKZqIssu0fUGZQrn9+o+LwYZwp9pBq8hEPTGPIHr5/s6O1/I+HHfcpndWsN3CSBWv2l/z75b +qtNDUQJq+8fjqxx5DAvKfzN/LO08x2fAkQapbqTp98QeJHUxTUqSh+9TuO6tzej1U+z8vBPfDL8X +7+96HR6wjccuoed/lX+Y+p+TtZPlrzCWtoIpDHE02wt3O5R/GJ67GtB16bj0PSaoUN7ieRYdr9mD +PHxsX1df6X7Q+oLC/hvbdZoj7MvcHwzaPGognFWicVaxVrFWicVaJxVrFWsVaJxVonFWsVX2/wDv +RF/rr+vFXiP/ADlyaf4U/wC3h/2LYqyT/nGr/lDrb5XP/URir2TFXYq7FXYqh9S/4511/wAYZP8A +iJxV8+/84hn/AJSz/t3/APYzir6Dc/Efniq3FWsVWnf5Yq+d/wA+PydeGWTzf5ahKnl6mpWkIPIP +Wvrx07/zU+fXrg6nT/xB6rsTtblhynb+E/o/V8kF+VXnTStfC6bqf7rW0X4BXilyqipZAOjgCrL9 +K7VC6HtjtPXYcXFhIqPPaz79/wBSdb2Ljxz4gPQfs8vd3fLuvqaRJGKIoUe2ebavX5tRLiyzMz5/ +o7lx44wFRFLlLIwZTRhuCMx4TMSCNiGZF7FP9M1H1BXpIPtr4+4zs+yu0+Mf0hzH6XW6jBXuRd9Z +Q3UJIFVO5p1B8R75s9do4ajGSOR/FtGHKYF41+bP5W/p+3N3Yqkeu2y/umPwrcxiv7pmNArfyMfk +djVdJ2br5aLJ4OX+7PI937O/uei0WsEf6v3Md/Jr81b3S75PLGvM0c0bfV7V56q3JW4/VpeW6sDs +len2fDPQ9LqOh+Dhds9lgjxsXvIH3j9PzfSFtdQ3MCzRGqt94Pgcz3lVTFWsVaJxVonFWsVaxVon +FWicVaxVrFV9uf8ASIv9df14q8Q/5y8P/KJ/9vD/ALFsVZL/AM40f8oba/K5/wCojFXsuKuxV2Ku +xVD6l/xzrr/jDJ/xE4q+fP8AnEE/8pZ/27/+xnFX0G/2j8ziq3FWsVaJxVZIiOjI6hkYEMp3BB6g +4q+Yvzr/ACku/K+of4r8sq8enGQSzRw1DWsla81p+wT93yzXanT16hyex7H7UGWPg5dz0vr5Hz+9 +l35Z/mFaeatMEM7LHrVqg+t2/Tmo29aPxUnr/Kdj1Unzbt3sbwScuMfuzzHd+z7vcy1OnOGVfwnk +f0Hz+/5s0IzmGm243eNw6GjL0OW4ssschKPMLIAiiyDTtQWReQ6/7sTw9xnb9l9piYsfEOrz4KVd +R0+K5hLDodwR2PjmV2l2fDPCxy+78dWGDMYF4X+cX5Wzamr61pMBOs261ubeMfFdRrQBkp1kQDYd +WGw3AB13ZHaUsE/y+fl/Cf0e7u7uT0mi1YGx+k/Yu/JL83pLgx6Hq8pa+ReMMjH/AHoRR3J/3ao/ +4Ie+eg6fPfpPN0/bPZXhk5cY9HUd37Pue+xTRzRrLGwZGFVYZlvOricVaJxVrFWsVaJxVonFWsVa +xVonFV9v/vRF/rr+vFXiH/OXx/5RP/t4f9i2Ksl/5xn/AOUMtflc/wDURir2bFXYq7FXYqh9S/45 +11/xhk/4icVfPX/OH5r/AIt/7d//AGNYq+hH+23zOKrcVaJxVrFWsVUbq2t7u3ktrmNZYJlKSxuK +qynqCMUgkGw+VPzW/LbV/wAvNfj8xeXnkj0ppfUt7iPrbSMT+6bqCjVoK7EfCffVarTAXtcS9r2X +2jHVQ8LL9f8AuvP3/wBoeofl/wCeLHzboy3KFY9QgAS/tQd0c9CK78XpVfu6g55j232OdNLjh/dH +7PL3d32+dObFLFPhPwPf+3vZORmga7XQyyQyB0NCPxHgcvwZ5YpCUeaJREhRZDYXySIGH2T9te4O +d32b2jGcbHLqO51ebCQWtT02OePkvzVvD+zB2r2ZHLGx8D3fsTp85iXz3+cn5aTQyzea9EjMN3A3 +ranBF8P2fiN0lKUYUq9Ov2v5iYdi9rSEvy+baY+k9/l+rvek0epBHAd4nl+r8e5lP5L/AJuLrFuN +M1RwupQj96NgJVH+7Y18R+2o+Y8B3eDPxCjzed7W7MOCXHD+7P2fjo9oV1ZQykFWFQR0IOZLpXYq +1irROKtE4q1irWKtE4q1iq+2/wB6Iv8AXX9eKvD/APnMA0/wl/28P+xXFWTf84y/8oXafK5/6iMV +ez4q7FXYq7FUPqX/ABzrr/jDJ/xE4q+eP+cPTX/Fv/bu/wCxrFX0K/22+ZxVaTirWKtYq0TirROK +oPVdLsNV0+fT7+Fbi0uFKSxOAQQfngIvYsoTMSJRNEPlHzr5S8yflN5ui1TSJGbTJWItJ2+JHQ7t +bzgEV6fxBBFc0+r0kSDGQuEnuNFrIa3Fwz+sc/8Aih+PseyeTvOOneaNFi1K0+BvsXNsTVopQAWQ +mgqN9jTcfdnmHa/ZEtLOxvjPI/oP43+biZMRhLhlz+8d/wCOSfBlOaWmFK1vO8EgdOn7Q7EZk6XV +Swz4o/HzYTgJCiyGyvI5Iwa1jbqD2Pvne9n6+M4f0D9jq8uIg+ahqmmCQB02cfYb+BzF7W7L4xxR ++ocj+j9TZp9RWxfNv5qfl1deWb//ABb5YBtIYZBJd28VB9WlJp6kQ6ekxNCnRe3wmi5XYnbByfus +m2aP21+nv+b0mnzxyx8Oe4P2/j8bvTfyh/Naz8xaeLe6ZYb+EAXNvX7J6eqlf91sf+BP3ntsOYTH +m8r2n2dLTz23geR/Q9TrXfLnWNE4q0TirWKtYq0TirWKtYqvtv8AemL/AF1/Xirw7/nMI0/wl/28 +f+xXFWUf84x/8oVafK5/6iMVez4q7FXYq7FUPqX/ABzrr/jDJ/xE4q+d/wDnDo/8pd/27v8AsaxV +9CyH42+ZxVbirWKtE4q0TirWKtYqlXmXy5pXmPR7jSdThE1rcLxNeqnsynsR45GURIUW3DmlimJx +NEPlbU9P80flB5zPEG4024+yGNI7q3B6EgfDInZqbHxBIOk1uijOJhMXEvb6fPj12K+U4/Yf1F7Z +5e8yabrulQ6np0hktph0YUdHH2o5F3oy9/vFQQc8x7T7MnpcnCd4nke/9rimBBMZfUPx8k2SfNWY +sTBF2d8YJOQ3U/aXxzK0erlgnY5dQ0ZcPEGSWl1HLGBXlG3Q+Htne6LWRyQA5wLqcuMg+aB1nSI5 +43BRXDqVZGAKupFCrA7GozWdrdmSvxMe0xyP469zkabUVsXzJ598j6r+XutxeZfLbOulep9glmNs +7HeCWpq8T9FY7/stvRm2/YnbH5gVL05o8x3+f63ooThqIHHk3v7fP3vbPyu/MnT/ADPpMZDenMlE +mgY7xSU+yT3U/sN/mOwxZRMW8frtFLTz4Ty6HvegE5Y4TWKtYq0TirWKtYq1iq+2P+kxf66/rxV4 +d/zmKf8AlEf+3j/2K4qyj/nGL/lCbT5XX/URir2jFXYq7FXYqh9S/wCOddf8YZP+InFXzr/zhwf+ +Uv8A+3d/2NYq+hpPtt8ziq3FWicVaJxVrFWsVaJxVonFWP8AnbyZpHm7QptK1JNm+KCcfbikH2WU +5CcBIUXI0upngmJw5vmCxuvMX5T+b59M1SJptOmI+sInSWIfZnhJ25rXpX2PY5oNfoI5YnHMbfjc +PbRnDV4xOG0x9nkfL+17fp2q2V/Zw31jOtxZ3C84Jk6MvTvuCCKEHcHY755rrtDPT5DCXwPeGiO/ +MURzCNSf3zBMUGCP0/U2t3od4m+0v8RmZodYcEv6B5/rcXNp+IebKbW6jmjCkhkYfA2d1pdRHJHh +O4PIumyYzE2lXmLQLW+tZ7e4hWaC4Ro54W6SIwoRt3pmk7T7PniyDNi2nHf3/j7XK02or8cnzF5l +8va/+VvmmPVtKLTaJcMVgkapVlO7W1xTo4pVT+0ByG4YL0fY3a8dRDiG0x9Q/HR38hDVYzCfP8bh +9C/l9580zzPpENxby8uXw0enNXHWOQfzD8RvnUwmJCw8ZqtLPBMwl/ay7JuM0TirWKtYq1irROKq +lt/vTF/rr+vFXhn/ADmOf+UQ/wC3j/2K4qyn/nGD/lB7P5XX/UTir2nFXYq7FXYqh9S/4511/wAY +ZP8AiJxV85/84bGv+L/+3d/2NYq+iJP7xvmcVWE4q0TirWKtYq0TirROKtYq1irEPzJ/LzS/Ouhv +Z3AEV9EC1jd03jkp38VPcZXlxiYouZodbPTz4o8uo73zh5W17Vvy68y3Pl7zDG8envJ/pCgEiNzR +VuYtqspAo1Oo9xTOd7R7OjngYT59D3PZkxzwGXFz+/8Aon8be57ZFco6JJG6yRSKHilQhkdGFVZW +GxBG4Oec6nSzwzMJjcMIESFhXSf3zFMUGCaaXqxt34SGsLf8KfHNhoNacJ4ZfQfscPUabiFjmy23 +uUnjEbmtRVG8c7fDljljwy+BdJPGYmwx7zZ5asdU0+5sr2AT2lyvG4hP7QrUMpHRlIrUdDnPa3SZ +NNl8fD9Q5+Y/HP8AW52l1HL7HzS6+Yfym83ru1zpF38SOPhS4hU9uoWaLluO1f5WFet7K7TjngJw ++I7vx0dxqMENXjo7SH2fsL6X8n+btO8xaXBdWswlWVOSOOrAdQR2dejDOhjISFh4rNhlikYyFEMg +yTU1irWKtE4q1iqpa/70xf66/rxV4X/zmSaf4Q/7eP8A2K4qyr/nF/8A5Qaz+V1/1E4q9qxV2Kux +V2KofUv+Oddf8YZP+InFXzl/zhoa/wCMP+3d/wBjWKvoiT+8b5n9eKrCcVaxVrFWicVaJxVrFWsV +aJxVonFWAfm1+V1j510gtEFh1u1UmzuSOvcxvTs2U5sQmPN2PZ3aEtPO+cDzDwbyD5vv/K2qyeVv +MnK2s1kKIZtvqkxJJ3/31ITv2B+IftV5rtPs2OojR2mOR/HR6+dSAy4975+Y/WP2e7sPqMjFW2Iz +gM2CWORjIVIMokSFjkqpP75QYoME40fWfQYQzN+6J+Fv5T/TNp2drvDPBL6fucDVaXi3HNmEMyXM +fpuaOPsnxzsYSGaPDLm6KUDA2OTCfzD8nWes6Df2VzErRtG8kZYf3M6IxjmSm/wnw6io6EjNHDSZ +NNqRPH9Mj6h5d7tdFqLIHX8bPA/yY8z3eh+Y59HuGeOK4LERmtY7mHqQOx4g8vGgzuNLOjXe2du6 +cTxDIOcfuL6k0fU0v7USbeotA9Ohr0I+ebB5FHYq0TirWKtYqqWv+9UP+uv68VeF/wDOZZp/g/8A +7eP/AGK4qyr/AJxd/wCUFs/ldf8AUTir2vFXYq7FXYqh9S/4511/xhk/4icVfOH/ADhia/4w/wC3 +b/2NYq+iZT+8b5n9eKrMVaxVonFWicVaxVrFWicVaJxVrFWsVeWfnR+Ulv5ssG1XTI1j1+1QlSBT +6wij+7b3/lOY+fDxCxzdt2X2kcEuGX92fs83kv5c+e7m1nTyr5hYxGFvQ0+5m2eJwaC2lr+xXZCf +s9Ps048x2p2YM8bG2SP2+RerkBH95DeJ5/8AFD9Pf7+fT+boxVgQymhB6gjOGnjMSQRRDkCpCxyK +qk+VmLEwT/Q9c9Nlt5noP91SE9D4H2zb9na4xIhI+4us1mkv1D4ppqdy+tXUGiwL3EmoTDokSmvH +5tnWwHjECveXCwQGnic0vdEd5/Y+b/zp0N/J/wCa0moWqFLW9dNTtlGwJdv3yV95Fb6DmzPplYc7 +QZBqNNwy84l7d+Xmrxy8FR+UMyj02HQq45Ic2gNi3jJwMZGJ5hn5OFi1irWKtYqqWp/0qH/XX9Yx +V4V/zmcaf4P/AO3l/wBiuKsr/wCcXP8AlBLL5XX/AFE4q9sxV2KuxV2KofUv+Oddf8YZP+InFXzf +/wA4Xmv+Mf8At2/9jWKvomX+8f5n9eKrMVaJxVonFWsVaxVonFWicVaxVrFWicVaJxV4t+eP5PLr +UMnmPQYQNWiWt5bIAPrCj9r/AFwPvzFz4OLcc3edk9p+EfDmfQfs/Ywv8tvzA/SSxeXtaYrq0Q9O +xu3/AN3hf90yk9JV/ZY/a6H4qcuU7W7L8YccP7wfb+3u+Xc9IR4J4h/dnn/R8x5d/dz72frG7EhQ +aru3sPE+GcfHHKRoCy5RkEdpunXd7MI7YBiDR5m/uk+n9o/575vdB2OSbn8unxcXU6mGIXL5dT+p +6JoOmWmmWxiiq8kh5Tzt9uRvE/wzstPjjAUHkdZqp5pWeQ5DueX/APOT3lb9I+TbbXYUrcaNMPVY +Df6vcEI3Twk4H78syDZzexM/DkMDyl94Yb+TmvPLpFoC/wC9tHNsxP8Ak0eL8CBmVppXH3ON21g4 +M5PSW76DhmWaFJV+y6hh9IzIdSuxVrFWicVVLX/eqH/XX9YxV4V/zmgaf4O/7eX/AGK4qyz/AJxa +/wCUDsvldf8AUScVe2Yq7FXYq7FUPqX/ABzrr/jDJ/xE4q+bf+cLTX/GP/bt/wCxrFX0VL/ev/rH +9eKrCcVaJxVrFWsVaJxVonFWsVaxVonFWicVaxVo74q8F/Or8k5by5fzF5ZhUTSVa/sRRQTSvqJ2 +BP7Vdu+YmfT3vF6DsvtcYxwZPp6Hu/Y8z078w/O3lu9S31pJNQiiP+8uoF2ald/Tlrypttuy+2az +Jpo3uKL0UTHJD93Kr6int3kj85vJmuCO09UaTemgW0ueKKT4RyD4G9gaE+GARMXn9XoMsSZH1eb0 +yC498thN1UosQ/OLz35a0DyZfWWrD61catby21rpyMBJJzUqXrvwVK15U69N8zcOM5Nujjz1XgET +/iB2fOf5VambLX7jTy443KcomFfikhPJSvzQscGnPDMxL0na4GbTxyx8j8JfgPqjytei50xd907e +zbj8a5nPLJvirROKtYqqWv8AvVD/AK6/rGKvCf8AnNI0/wAHf9vL/sVxVlv/ADix/wAoFY/K6/6i +Tir23FXYq7FXYqh9S/4511/xhk/4icVfNf8AzhWf+Uy/7dv/AGN4q+i5T+9f/WP68VWE4q1irWKt +E4q0TirWKtYq0TirROKtYq1irROKtHFWGeavy30fW0k9S3jkVqt6bAAhj3Unb78jKIPNtw554zcC +QXiHm38h720keTSXIpU/Vpq9P8k7n/iWYs9L/Nd/pe3jyyj4j9SRaL+Yv5leRD9RmZ3tACkdregy +xrtt6T1qvH+UNTxGYksfCdw7GeDBqomUCL7x+kMO1rVNX1/UpdS1C8e/vpz8bSbP2oqoPhCitFVP +uGbXBqMdUPS8V2j2JqcRMj+8j3j9I6fc1peoyWGoWGpLXnbSKJAD8TCMio9gYzx+/MbVR4MgkOrv +/Z/MM+klhPOO3wPL7bfV/wCX+pKzCIMGRxRSOhDfEp/XmWC6GUSDRZ2TihrFWsVVLT/euH/jIv6x +irwj/nNQ/wDKG/8Aby/7FMVZd/ziv/ygNj8rr/qKOKvbsVdirsVdiqH1L/jnXX/GGT/iJxV80/8A +OFBr/jL/ALdv/Y3ir6MmP71/9Y/rxVZirWKtE4q0TirWKtYq0TirROKtYq1irROKtYq1irWKqc0M +MyGOVA6HsRXFWMa/5B0jVIXR4kdXFDHKKinhy6/fXAQDzZwySgbiaLxjzh+QZiZ5tKZrdzUiB94y +dzsf6H6Mxp6UHk7vS9uTjtkHEO/q8r1vy75k0ovb39rII0IZpgvJaLVVJelQKdA2Y8xMCjydxpZ6 +aczkx0Jy59D8R+l7H+T2vNNo9i3KsttW2fsAYqGP/hOOZmnlcXnO18PBnPdLf8fF73HIskayL9lw +GX5EVy51jeKtYqqWh/0uH/jIv6xirwf/AJzXNP8ABv8A28v+xTFWX/8AOKv/AJL+x+V3/wBRRxV7 +firsVdirsVQ+pf8AHOuv+MMn/ETir5o/5wmNf8Z/9u3/ALG8VfRs396/+sf14qp4q0TirROKtYq1 +irROKtE4q1irWKtE4q1irWKtYq0TirWKtYqskRJFKuoZT1UioxVI9V8o6ZfIQEUH+VxyX6O6/Rir +EW8gNpk0k1lEYjI4kbiOalhtUkfF274AAGc8kpVZJpnukpLHYRLIQSBVSO6ncdfnhYIvFWicVVbT +/euD/jIv/Ehirwb/AJzZNP8ABn/by/7FMVZf/wA4qf8AkvrD5Xf/AFFHFXuGKuxV2KuxVD6l/wAc +66/4wyf8ROKvmb/nCQ/8pn/27P8AsbxV9HTf3z/6x/XiqmTirROKtYq1irROKtE4q1irWKtE4q1i +rWKtYq0TirWKtYq1irROKtYq1irWKtE4q1iqrZ/71wf8ZF/4kMVeC/8AObZ/5Qz/ALef/YpirMP+ +cUv/ACXth8rv/qKOKvccVdirsVdiqH1L/jnXX/GGT/iJxV8y/wDOER/5TT/t2f8AY3ir6OnP75/9 +Y/rxVTJxVrFWsVaJxVonFWsVaxVonFWsVaxVrFWicVaxVrFWsVaJxVrFWsVaxVonFWsVaxVVs/8A +eyD/AIyL/wASGKvBf+c3T/yhf/bz/wCxTFWY/wDOKH/kvLD5Xf8A1FHFXuOKuxV2KuxVD6l/xzrr +/jDJ/wAROKvmP/nB81/xp/27P+xvFX0fOf30n+sf14qp4q1irROKtE4q1irWKtE4q1irWKtYq0Ti +rWKtYq1irROKtYq1irWKtE4q1irWKtYqq2Z/0yD/AIyJ/wASGKvBP+c4DT/Bf/bz/wCxTFWZf84n +/wDku9P+V3/1FHFXuWKuxV2KuxVD6l/xzrr/AIwyf8ROKvmD/nCCRUn86W7njORpzCM7NRDdBtvY +sK4q+kbiomkr/Mf14qp4q0TirROKtYq1irROKtYq1irWKtE4q1irWKtYq0TirWKtYq1irROKtYq1 +irWKtE4qrWIJvIABU81P3GuKvAP+c4ZozL5MiDAyIupOydwrG1Cn6eJxVm3/ADieGH5dafUEHjdn +fwN0SMVe5Yq7FXYq7FVskayRtG32XBVvkRTFXxjrN7rf5Efnjca1FbNP5e1ZpDLAtFWW2mcPLGld +g8MlGT2p2JxV9U+U/PHknzvp8d/5f1SG8DrV4UcLcRnussJ+NCPcfLbFU8/R0X8zfhirv0bF/M34 +Yq1+jIv52/DFXfoyL+dvwxV36Lh/nb8MVa/RUP8AO34Yq79FQ/zt+H9MVa/RMP8AO34Yq79Ew/zt ++GKu/REH87fh/TFWv0PB/O34f0xV36Hg/nb8P6Yq79DQfzt+H9MVa/QsH87fh/TFXfoWD/fj/h/T +FWv0Jb/78f8AD+mKu/Qdv/vx/wAP6Yq1+g7f/fj/AIf0xV36Ct/9+P8Ah/TFXfoK3/34/wCH9MVa +/QNv/vx/w/pirv0Bbf78f8P6Yqk3mfzh5E8iWEuoa9qcNpxUlIpHDXEngsUK/G5PsPntir4i/MXz +tr35wfmQtxa27Rxy8bTSbImvo2yEtykI2qas7n6OgGKvsf8AJ7y5HoWhW1jAP3NpbpEGIoWJp8R9 +24VPzxV6FirsVdirsVdirE/zG/Lfy/560OTTNViUvSsE9KsjjoR3+7FXyP5v/wCcW/Nuk3rpYTLL +ASfTMwYrx9pIw1fpQYqx3/oXzz942v8AwU//AFSxV3/Qvnn7xtf+Cn/6pYq7/oXzz942v/BT/wDV +LFXf9C+efvG1/wCCn/6pYq7/AKF88/eNr/wU/wD1SxV3/Qvnn7xtf+Cn/wCqWKu/6F88/eNr/wAF +P/1SxV3/AEL55+8bX/gp/wDqlirv+hfPP3ja/wDBT/8AVLFXf9C+efvG1/4Kf/qlirv+hfPP3ja/ +8FP/ANUsVd/0L55+8bX/AIKf/qlirv8AoXzz942v/BT/APVLFXf9C+efvG1/4Kf/AKpYq7/oXzz9 +42v/AAU//VLFXf8AQvnn7xtf+Cn/AOqWKu/6F88/eNr/AMFP/wBUsVd/0L55+8bX/gp/+qWKu/6F +88/eNr/wU/8A1SxV3/Qvnn7xtf8Agp/+qWKu/wChfPP3ja/8FP8A9UsVd/0L55+8bX/gp/8Aqliq +L0z/AJxz85XFwEu54IIu7xiWRv8AgWWP9eKvevys/JPTPLg/0WEz3sgHr3UtC5HWjECiJ/kjr3xV +7vpthHY2qwpuert4se+KorFXYq7FXYq7FXYqtkijlUpIgdD1VgCPxxVCnRtLJ/3mT7sVd+htL/5Z +k/HFXfobS/8AlmT8cVd+htL/AOWZPxxV36G0v/lmT8cVd+htL/5Zk/HFXfobS/8AlmT8cVd+htL/ +AOWZPxxV36G0v/lmT8cVd+htL/5Zk/HFXfobS/8AlmT8cVd+htL/AOWZPxxV36G0v/lmT8cVd+ht +L/5Zk/HFXfobS/8AlmT8cVd+htL/AOWZPxxV36G0v/lmT8cVd+htL/5Zk/HFXfobS/8AlmT8cVd+ +htL/AOWZPxxV36G0v/lmT8cVd+htL/5Zk/HFXDRtLB/3mT7sVRUcUcShI0CIOiqAB+GKrsVdirsV +f//Z + + + + + + +uuid:4ee3f24b-6ed2-4a2e-8f7a-50b762c8da8b + + + +image/svg+xml + + + +mime.ai + + + + image/svg+xml + end='w' + + +Labels + \ No newline at end of file diff --git a/PPOCRLabel/resources/icons/new.png b/PPOCRLabel/resources/icons/new.png new file mode 100644 index 0000000000000000000000000000000000000000..dd795cfffc5c1ce273b3afedb5ed01da3fc5668c Binary files /dev/null and b/PPOCRLabel/resources/icons/new.png differ diff --git a/PPOCRLabel/resources/icons/next.png b/PPOCRLabel/resources/icons/next.png new file mode 100644 index 0000000000000000000000000000000000000000..163a343cb44010ea43ae8216396e8db82080ce04 Binary files /dev/null and b/PPOCRLabel/resources/icons/next.png differ diff --git a/PPOCRLabel/resources/icons/objects.png b/PPOCRLabel/resources/icons/objects.png new file mode 100644 index 0000000000000000000000000000000000000000..593bb6d8a63ad8dbde0ec664d3fbae9e2ceb18cb Binary files /dev/null and b/PPOCRLabel/resources/icons/objects.png differ diff --git a/PPOCRLabel/resources/icons/open.png b/PPOCRLabel/resources/icons/open.png new file mode 100644 index 0000000000000000000000000000000000000000..45fa2883a71fcb891f1ef7c0c217d71eeae284bc Binary files /dev/null and b/PPOCRLabel/resources/icons/open.png differ diff --git a/PPOCRLabel/resources/icons/open.svg b/PPOCRLabel/resources/icons/open.svg new file mode 100644 index 0000000000000000000000000000000000000000..48e7a34376746d3a18326cdaf80889eea61a9e18 --- /dev/null +++ b/PPOCRLabel/resources/icons/open.svg @@ -0,0 +1,577 @@ + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PPOCRLabel/resources/icons/prev.png b/PPOCRLabel/resources/icons/prev.png new file mode 100644 index 0000000000000000000000000000000000000000..31b454519354679289cd809d42e052c024908e6c Binary files /dev/null and b/PPOCRLabel/resources/icons/prev.png differ diff --git a/PPOCRLabel/resources/icons/quit.png b/PPOCRLabel/resources/icons/quit.png new file mode 100644 index 0000000000000000000000000000000000000000..7445887949c3b817d3fd5a223747264e7a5d2ac9 Binary files /dev/null and b/PPOCRLabel/resources/icons/quit.png differ diff --git a/PPOCRLabel/resources/icons/reRec.png b/PPOCRLabel/resources/icons/reRec.png new file mode 100644 index 0000000000000000000000000000000000000000..e3d0d5c0c021735b0ae8f6ff034c107e045f2855 Binary files /dev/null and b/PPOCRLabel/resources/icons/reRec.png differ diff --git a/PPOCRLabel/resources/icons/resetall.png b/PPOCRLabel/resources/icons/resetall.png new file mode 100644 index 0000000000000000000000000000000000000000..acc12c332879ad5eeeb54c7b8a3d5df8244123ec Binary files /dev/null and b/PPOCRLabel/resources/icons/resetall.png differ diff --git a/PPOCRLabel/resources/icons/save-as.png b/PPOCRLabel/resources/icons/save-as.png new file mode 100644 index 0000000000000000000000000000000000000000..1b5d900064c79dac15ee24d0a33b22f3245aa222 Binary files /dev/null and b/PPOCRLabel/resources/icons/save-as.png differ diff --git a/PPOCRLabel/resources/icons/save-as.svg b/PPOCRLabel/resources/icons/save-as.svg new file mode 100644 index 0000000000000000000000000000000000000000..c8441a1f5491f8f0fd0ca6f54bd31c04be65d514 --- /dev/null +++ b/PPOCRLabel/resources/icons/save-as.svg @@ -0,0 +1,1358 @@ + + + + + + + + + + + + + + + + + + + + +begin='' id='W5M0MpCehiHzreSzNTczkc9d' + + + + +Adobe PDF library 5.00 + + + + + +2004-01-26T11:58:28+02:00 + +2004-03-28T20:41:40Z + +Adobe Illustrator 10.0 + +2004-02-16T23:58:32+01:00 + + + + +JPEG + +256 + +256 + +/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqlvmDzFo +3l7TJdT1e5W1tItuTbszHoiKN2Y+AxV4j5g/5ydvTcMnl/SYlgU0Se/LOzDxMcTIF/4M4qk//QzP +nv8A5YNL/wCRVx/2UYq7/oZnz3/ywaX/AMirj/soxV3/AEMz57/5YNL/AORVx/2UYq7/AKGZ89/8 +sGl/8irj/soxV3/QzPnv/lg0v/kVcf8AZRirv+hmfPf/ACwaX/yKuP8AsoxV3/QzPnv/AJYNL/5F +XH/ZRirv+hmfPf8AywaX/wAirj/soxV3/QzPnv8A5YNL/wCRVx/2UYq7/oZnz3/ywaX/AMirj/so +xV3/AEMz57/5YNL/AORVx/2UYq7/AKGZ89/8sGl/8irj/soxV3/QzPnv/lg0v/kVcf8AZRirv+hm +fPf/ACwaX/yKuP8AsoxV3/QzPnv/AJYNL/5FXH/ZRirv+hmfPf8AywaX/wAirj/soxV3/QzPnv8A +5YNL/wCRVx/2UYq7/oZnz3/ywaX/AMirj/soxV3/AEMz57/5YNL/AORVx/2UYq7/AKGZ89/8sGl/ +8irj/soxV3/QzPnv/lg0v/kVcf8AZRirv+hmfPf/ACwaX/yKuP8AsoxVFad/zk75oS4B1HSbG4t+ +6W/qwP8A8E7zj/hcVeyeRfzJ8tec7Vn0yUx3kQBuLCaizJ25AAkMlf2l+mmKsqxV2KuxV2KuxV2K +vm/XDqf5ufmk+j287Q+XtJLqJF3VIY2CSzAHYvM9AvtTwOKvePLfk/y35bs0tdHsYrZVFGlCgyuf +GSQ/Ex+ZxVOK4q6oxVrkMVdyGKu5jFWvUGKu9RffFWvVX3xV3rL74q71l8DirXrp4HFXfWE8DirX +1hPA4q76yngcVd9Zj8D+GKtfWo/A/hirvrcfgfw/rirvrcfgfw/rirX1yLwb8P64q765F4N+H9cV +d9di8G/D+uKtfXovBvw/riqVa/5X8r+abR7TV7GO55CiyMoWZP8AKjkHxKR7HFXzB5n0XXfys8/R +NZXBJgIudOujsJYGJUpIB8ijj+oxV9VeWtfs/MGhWWsWf9xexLKErUoxHxI3up2OKplirsVdirsV +Q+oMy2Fyy/aWJyvzCnFXhP8AziwqvL5nmYcpQLIBz1oxuC2/uVGKvficVaxVrFWicVaJxVrFWsVa +JxVonFWsVaxVrFWicVaxVrFWicVaJxVrFWsVaJxVonFWsVaxVdCSJkp/MP14q8V/5ypRBJ5ZkCjm +wvVZu5CmAgfRyOKsn/5x3vJX8lwWzElQZmSvbjMR/wAbYq9XxV2KuxV2KofUv+Oddf8AGGT/AIic +VeE/84pn/lKP+jD/ALGcVe+nFWsVaJxVonFWsVaxVonFWicVaxVrFWsVaJxVrFWsVaJxVonFWsVa +xVonFWicVaxVrFWicVXQ/wB9H/rD9eKvFv8AnKw/8ov/ANH/AP2LYqn/APzjn/yisHyuP+T4xV6/ +irsVdirsVQ+pf8c66/4wyf8AETirwf8A5xRNf8U/9GH/AGM4q9+PXFWicVaJxVrFWsVaJxVonFWs +VaxVrFWicVaxVrFWicVaJxVrFWsVaJxVonFWsVaxVonFWicVXQ/30f8ArD9eKvFf+crjT/C3/R// +ANi2Ksg/5xy/5RS3+Vx/yfGKvYMVdirsVdiqH1L/AI511/xhk/4icVeDf84nmv8Ain/ow/7GcVe/ +HrirROKtYq1irROKtE4q1irWKtYq0TirWKtYq0TirROKtYq1irROKtE4q1irWKtE4q0TirWKroP7 ++P8A1h+vFXiv/OWBp/hb/o//AOxbFWQf844f8onb/K4/5PjFXsOKuxV2KuxVD6l/xzrr/jDJ/wAR +OKvBP+cTD/ylX/Rh/wBjOKvf2O5xVrFWsVaJxVonFXln5ofnxoPk9pNM05V1XX1qrwK1IYD/AMXO +v7X+Qu/iRmNm1IhsNy7vs7sWef1S9MPtPu/W+fdS81/mp5+uWaS6urm3ZivoQH6vZoaV4mhSKtP5 +zXNXn1dbzlT1uDQ6fAPTEX8z+tX8r+Z/Pf5Xa5azXMUo0+evrac8oe3njGz8GQugkWoNRuNq7GhO +m1Q5xNhhrNHh1cDH+Ideo/Y+q/KfnXRfM+nw3umyVinXkgPXbZlPgynqM3UJiQsPAajTzwzMJiiE ++yTS1irROKtE4q1irWKtE4q0TirWKtYq0TirROKtYq1iq6A/v4/9Zf14q8U/5yzP/KK/9H//AGLY +qyH/AJxv/wCUSt/lcf8AJ/FXsWKuxV2KuxVD6l/xzrr/AIwyf8ROKvAv+cSj/wApV/0Yf9jOKvoB +upxVrFWicVaJxV4h+fH50yaCJPK/l2amsSLTUL1DvbI4qET/AItYGtf2R79MPU6jh9I5vSdi9keL ++9yD0dB3/s+95B5J/L5tQC6rrQZ4JgJLe2JPKXlv6krdeJ6qK1br0+1zGu7S8P0w3l937Xryeg5P +W7GwRESONFSNAFjjQBVVR0CqKAD2GaCUpTNyNlxpzA5Jlr3ky01XQTYapDytrj4gw2kikH2HQkfC +wH8QdiRncdk9ncOmqW0pG/c8jqe1JQ1PHjO0dvIvF/L+u6/+Vvm19PvuUmnyMryqlaPGTRLiCtPi +FKHxoVPTaeHMcciO40XoNTpsfaGATjtLp+o/jzfVXlnzJY67psN3bSrKJUEiOvR1P7Q/iOxzbRkC +LDw2XHKEjGQqQTgnCwaJxVrFWsVaJxVonFWsVaxVonFWicVaxVrFWicVXwf38f8ArL+vFXiX/OWp +/wCUV/6P/wDsWxVkX/ONv/KI23yuf+T+KvY8VdirsVdiqH1L/jnXX/GGT/iJxV4D/wA4kGv+K/8A +t3/9jOKvoFvtH54qtJxVonFWMfmT5vXyj5M1LWwA1xDGEs4z0aeUhI6juAzcm9gcryz4YkuZ2fpf +HzRh0PP3PkvyBob+ZPMFzqWpt9aS3YT3Pq0czTzMSvME7glWZutaUPXOY7R1RxQ2+qX4t9GkBECI +2H6HtlraEmp3J3JOcsBbjZMjItDtrU3a+oQWT4lQ9GI7Z1HY/YxmRlyD0dB3/s+/3PM9p9p1cIHf +qe5mUsMV5CSAC1KMh751s5iIsvOAW87/ADA8gadr+mtY3i8WXk1hegVkglI/FTQc16MPAgEeXajX +ZtNq5ZpbwyHcfo946PXdn5/DiBHp073j/kXzlrX5ceZZNB1rktgJfiZakRM2wnjJA5RuPtDw361B +7fQ62MoiUTcJOX2n2fHVw8SH94Pt8i+qNH1i11SzS4gdW5KGPA8lIYVDKR1U9jm5BeHlEg0eaOxQ +1irROKtE4q1irWKtE4q0TirWKtYq0TirROKr4P7+P/XX9eKvEv8AnLc0/wAKf9vD/sWxVkf/ADjX +/wAofbfK5/5P4q9jxV2KuxV2KofUv+Oddf8AGGT/AIicVfP/APziMa/4r/7d/wD2M4q+gm+0fniq +0nFWsVedfn15Y1LzF+Xlzb6chlurOaO8WAbtIsQZWVffi5I+WUamBlDZ2vYupjh1AMuRFPn78qPM +lrYm40e4iIuJpDNCxNAxChWjpTZhxqPHfw35/P2fHUyAMuCvK/1PXdpZp4o+JEcUevf7/c9Xt9Qk +moFURr4Dc/fm30Xs/gwnil65efL5frt43Vdq5cuw9I8v1ptbB6rwryG4I7ZstXq8WngZ5JCMR3/j +d1+PHKZqIssu0fUGZQrn9+o+LwYZwp9pBq8hEPTGPIHr5/s6O1/I+HHfcpndWsN3CSBWv2l/z75b +qtNDUQJq+8fjqxx5DAvKfzN/LO08x2fAkQapbqTp98QeJHUxTUqSh+9TuO6tzej1U+z8vBPfDL8X +7+96HR6wjccuoed/lX+Y+p+TtZPlrzCWtoIpDHE02wt3O5R/GJ67GtB16bj0PSaoUN7ieRYdr9mD +PHxsX1df6X7Q+oLC/hvbdZoj7MvcHwzaPGognFWicVaxVrFWicVaJxVrFWsVaJxVonFWsVX2/wDv +RF/rr+vFXiP/ADlyaf4U/wC3h/2LYqyT/nGr/lDrb5XP/URir2TFXYq7FXYqh9S/4511/wAYZP8A +iJxV8+/84hn/AJSz/t3/APYzir6Dc/Efniq3FWsVWnf5Yq+d/wA+PydeGWTzf5ahKnl6mpWkIPIP +Wvrx07/zU+fXrg6nT/xB6rsTtblhynb+E/o/V8kF+VXnTStfC6bqf7rW0X4BXilyqipZAOjgCrL9 +K7VC6HtjtPXYcXFhIqPPaz79/wBSdb2Ljxz4gPQfs8vd3fLuvqaRJGKIoUe2ebavX5tRLiyzMz5/ +o7lx44wFRFLlLIwZTRhuCMx4TMSCNiGZF7FP9M1H1BXpIPtr4+4zs+yu0+Mf0hzH6XW6jBXuRd9Z +Q3UJIFVO5p1B8R75s9do4ajGSOR/FtGHKYF41+bP5W/p+3N3Yqkeu2y/umPwrcxiv7pmNArfyMfk +djVdJ2br5aLJ4OX+7PI937O/uei0WsEf6v3Md/Jr81b3S75PLGvM0c0bfV7V56q3JW4/VpeW6sDs +len2fDPQ9LqOh+Dhds9lgjxsXvIH3j9PzfSFtdQ3MCzRGqt94Pgcz3lVTFWsVaJxVonFWsVaxVon +FWicVaxVrFV9uf8ASIv9df14q8Q/5y8P/KJ/9vD/ALFsVZL/AM40f8oba/K5/wCojFXsuKuxV2Ku +xVD6l/xzrr/jDJ/xE4q+fP8AnEE/8pZ/27/+xnFX0G/2j8ziq3FWsVaJxVZIiOjI6hkYEMp3BB6g +4q+Yvzr/ACku/K+of4r8sq8enGQSzRw1DWsla81p+wT93yzXanT16hyex7H7UGWPg5dz0vr5Hz+9 +l35Z/mFaeatMEM7LHrVqg+t2/Tmo29aPxUnr/Kdj1Unzbt3sbwScuMfuzzHd+z7vcy1OnOGVfwnk +f0Hz+/5s0IzmGm243eNw6GjL0OW4ssschKPMLIAiiyDTtQWReQ6/7sTw9xnb9l9piYsfEOrz4KVd +R0+K5hLDodwR2PjmV2l2fDPCxy+78dWGDMYF4X+cX5Wzamr61pMBOs261ubeMfFdRrQBkp1kQDYd +WGw3AB13ZHaUsE/y+fl/Cf0e7u7uT0mi1YGx+k/Yu/JL83pLgx6Hq8pa+ReMMjH/AHoRR3J/3ao/ +4Ie+eg6fPfpPN0/bPZXhk5cY9HUd37Pue+xTRzRrLGwZGFVYZlvOricVaJxVrFWsVaJxVonFWsVa +xVonFV9v/vRF/rr+vFXiH/OXx/5RP/t4f9i2Ksl/5xn/AOUMtflc/wDURir2bFXYq7FXYqh9S/45 +11/xhk/4icVfPX/OH5r/AIt/7d//AGNYq+hH+23zOKrcVaJxVrFWsVUbq2t7u3ktrmNZYJlKSxuK +qynqCMUgkGw+VPzW/LbV/wAvNfj8xeXnkj0ppfUt7iPrbSMT+6bqCjVoK7EfCffVarTAXtcS9r2X +2jHVQ8LL9f8AuvP3/wBoeofl/wCeLHzboy3KFY9QgAS/tQd0c9CK78XpVfu6g55j232OdNLjh/dH +7PL3d32+dObFLFPhPwPf+3vZORmga7XQyyQyB0NCPxHgcvwZ5YpCUeaJREhRZDYXySIGH2T9te4O +d32b2jGcbHLqO51ebCQWtT02OePkvzVvD+zB2r2ZHLGx8D3fsTp85iXz3+cn5aTQyzea9EjMN3A3 +ranBF8P2fiN0lKUYUq9Ov2v5iYdi9rSEvy+baY+k9/l+rvek0epBHAd4nl+r8e5lP5L/AJuLrFuN +M1RwupQj96NgJVH+7Y18R+2o+Y8B3eDPxCjzed7W7MOCXHD+7P2fjo9oV1ZQykFWFQR0IOZLpXYq +1irROKtE4q1irWKtE4q1iq+2/wB6Iv8AXX9eKvD/APnMA0/wl/28P+xXFWTf84y/8oXafK5/6iMV +ez4q7FXYq7FUPqX/ABzrr/jDJ/xE4q+eP+cPTX/Fv/bu/wCxrFX0K/22+ZxVaTirWKtYq0TirROK +oPVdLsNV0+fT7+Fbi0uFKSxOAQQfngIvYsoTMSJRNEPlHzr5S8yflN5ui1TSJGbTJWItJ2+JHQ7t +bzgEV6fxBBFc0+r0kSDGQuEnuNFrIa3Fwz+sc/8Aih+PseyeTvOOneaNFi1K0+BvsXNsTVopQAWQ +mgqN9jTcfdnmHa/ZEtLOxvjPI/oP43+biZMRhLhlz+8d/wCOSfBlOaWmFK1vO8EgdOn7Q7EZk6XV +Swz4o/HzYTgJCiyGyvI5Iwa1jbqD2Pvne9n6+M4f0D9jq8uIg+ahqmmCQB02cfYb+BzF7W7L4xxR ++ocj+j9TZp9RWxfNv5qfl1deWb//ABb5YBtIYZBJd28VB9WlJp6kQ6ekxNCnRe3wmi5XYnbByfus +m2aP21+nv+b0mnzxyx8Oe4P2/j8bvTfyh/Naz8xaeLe6ZYb+EAXNvX7J6eqlf91sf+BP3ntsOYTH +m8r2n2dLTz23geR/Q9TrXfLnWNE4q0TirWKtYq0TirWKtYqvtv8AemL/AF1/Xirw7/nMI0/wl/28 +f+xXFWUf84x/8oVafK5/6iMVez4q7FXYq7FUPqX/ABzrr/jDJ/xE4q+d/wDnDo/8pd/27v8AsaxV +9CyH42+ZxVbirWKtE4q0TirWKtYqlXmXy5pXmPR7jSdThE1rcLxNeqnsynsR45GURIUW3DmlimJx +NEPlbU9P80flB5zPEG4024+yGNI7q3B6EgfDInZqbHxBIOk1uijOJhMXEvb6fPj12K+U4/Yf1F7Z +5e8yabrulQ6np0hktph0YUdHH2o5F3oy9/vFQQc8x7T7MnpcnCd4nke/9rimBBMZfUPx8k2SfNWY +sTBF2d8YJOQ3U/aXxzK0erlgnY5dQ0ZcPEGSWl1HLGBXlG3Q+Htne6LWRyQA5wLqcuMg+aB1nSI5 +43BRXDqVZGAKupFCrA7GozWdrdmSvxMe0xyP469zkabUVsXzJ598j6r+XutxeZfLbOulep9glmNs +7HeCWpq8T9FY7/stvRm2/YnbH5gVL05o8x3+f63ooThqIHHk3v7fP3vbPyu/MnT/ADPpMZDenMlE +mgY7xSU+yT3U/sN/mOwxZRMW8frtFLTz4Ty6HvegE5Y4TWKtYq0TirWKtYq1iq+2P+kxf66/rxV4 +d/zmKf8AlEf+3j/2K4qyj/nGL/lCbT5XX/URir2jFXYq7FXYqh9S/wCOddf8YZP+InFXzr/zhwf+ +Uv8A+3d/2NYq+hpPtt8ziq3FWicVaJxVrFWsVaJxVonFWP8AnbyZpHm7QptK1JNm+KCcfbikH2WU +5CcBIUXI0upngmJw5vmCxuvMX5T+b59M1SJptOmI+sInSWIfZnhJ25rXpX2PY5oNfoI5YnHMbfjc +PbRnDV4xOG0x9nkfL+17fp2q2V/Zw31jOtxZ3C84Jk6MvTvuCCKEHcHY755rrtDPT5DCXwPeGiO/ +MURzCNSf3zBMUGCP0/U2t3od4m+0v8RmZodYcEv6B5/rcXNp+IebKbW6jmjCkhkYfA2d1pdRHJHh +O4PIumyYzE2lXmLQLW+tZ7e4hWaC4Ro54W6SIwoRt3pmk7T7PniyDNi2nHf3/j7XK02or8cnzF5l +8va/+VvmmPVtKLTaJcMVgkapVlO7W1xTo4pVT+0ByG4YL0fY3a8dRDiG0x9Q/HR38hDVYzCfP8bh +9C/l9580zzPpENxby8uXw0enNXHWOQfzD8RvnUwmJCw8ZqtLPBMwl/ay7JuM0TirWKtYq1irROKq +lt/vTF/rr+vFXhn/ADmOf+UQ/wC3j/2K4qyn/nGD/lB7P5XX/UTir2nFXYq7FXYqh9S/4511/wAY +ZP8AiJxV85/84bGv+L/+3d/2NYq+iJP7xvmcVWE4q0TirWKtYq0TirROKtYq1irEPzJ/LzS/Ouhv +Z3AEV9EC1jd03jkp38VPcZXlxiYouZodbPTz4o8uo73zh5W17Vvy68y3Pl7zDG8envJ/pCgEiNzR +VuYtqspAo1Oo9xTOd7R7OjngYT59D3PZkxzwGXFz+/8Aon8be57ZFco6JJG6yRSKHilQhkdGFVZW +GxBG4Oec6nSzwzMJjcMIESFhXSf3zFMUGCaaXqxt34SGsLf8KfHNhoNacJ4ZfQfscPUabiFjmy23 +uUnjEbmtRVG8c7fDljljwy+BdJPGYmwx7zZ5asdU0+5sr2AT2lyvG4hP7QrUMpHRlIrUdDnPa3SZ +NNl8fD9Q5+Y/HP8AW52l1HL7HzS6+Yfym83ru1zpF38SOPhS4hU9uoWaLluO1f5WFet7K7TjngJw ++I7vx0dxqMENXjo7SH2fsL6X8n+btO8xaXBdWswlWVOSOOrAdQR2dejDOhjISFh4rNhlikYyFEMg +yTU1irWKtE4q1iqpa/70xf66/rxV4X/zmSaf4Q/7eP8A2K4qyr/nF/8A5Qaz+V1/1E4q9qxV2Kux +V2KofUv+Oddf8YZP+InFXzl/zhoa/wCMP+3d/wBjWKvoiT+8b5n9eKrCcVaxVrFWicVaJxVrFWsV +aJxVonFWAfm1+V1j510gtEFh1u1UmzuSOvcxvTs2U5sQmPN2PZ3aEtPO+cDzDwbyD5vv/K2qyeVv +MnK2s1kKIZtvqkxJJ3/31ITv2B+IftV5rtPs2OojR2mOR/HR6+dSAy4975+Y/WP2e7sPqMjFW2Iz +gM2CWORjIVIMokSFjkqpP75QYoME40fWfQYQzN+6J+Fv5T/TNp2drvDPBL6fucDVaXi3HNmEMyXM +fpuaOPsnxzsYSGaPDLm6KUDA2OTCfzD8nWes6Df2VzErRtG8kZYf3M6IxjmSm/wnw6io6EjNHDSZ +NNqRPH9Mj6h5d7tdFqLIHX8bPA/yY8z3eh+Y59HuGeOK4LERmtY7mHqQOx4g8vGgzuNLOjXe2du6 +cTxDIOcfuL6k0fU0v7USbeotA9Ohr0I+ebB5FHYq0TirWKtYqqWv+9UP+uv68VeF/wDOZZp/g/8A +7eP/AGK4qyr/AJxd/wCUFs/ldf8AUTir2vFXYq7FXYqh9S/4511/xhk/4icVfOH/ADhia/4w/wC3 +b/2NYq+iZT+8b5n9eKrMVaxVonFWicVaxVrFWicVaJxVrFWsVeWfnR+Ulv5ssG1XTI1j1+1QlSBT +6wij+7b3/lOY+fDxCxzdt2X2kcEuGX92fs83kv5c+e7m1nTyr5hYxGFvQ0+5m2eJwaC2lr+xXZCf +s9Ps048x2p2YM8bG2SP2+RerkBH95DeJ5/8AFD9Pf7+fT+boxVgQymhB6gjOGnjMSQRRDkCpCxyK +qk+VmLEwT/Q9c9Nlt5noP91SE9D4H2zb9na4xIhI+4us1mkv1D4ppqdy+tXUGiwL3EmoTDokSmvH +5tnWwHjECveXCwQGnic0vdEd5/Y+b/zp0N/J/wCa0moWqFLW9dNTtlGwJdv3yV95Fb6DmzPplYc7 +QZBqNNwy84l7d+Xmrxy8FR+UMyj02HQq45Ic2gNi3jJwMZGJ5hn5OFi1irWKtYqqWp/0qH/XX9Yx +V4V/zmcaf4P/AO3l/wBiuKsr/wCcXP8AlBLL5XX/AFE4q9sxV2KuxV2KofUv+Oddf8YZP+InFXzf +/wA4Xmv+Mf8At2/9jWKvomX+8f5n9eKrMVaJxVonFWsVaxVonFWicVaxVrFWicVaJxV4t+eP5PLr +UMnmPQYQNWiWt5bIAPrCj9r/AFwPvzFz4OLcc3edk9p+EfDmfQfs/Ywv8tvzA/SSxeXtaYrq0Q9O +xu3/AN3hf90yk9JV/ZY/a6H4qcuU7W7L8YccP7wfb+3u+Xc9IR4J4h/dnn/R8x5d/dz72frG7EhQ +aru3sPE+GcfHHKRoCy5RkEdpunXd7MI7YBiDR5m/uk+n9o/575vdB2OSbn8unxcXU6mGIXL5dT+p +6JoOmWmmWxiiq8kh5Tzt9uRvE/wzstPjjAUHkdZqp5pWeQ5DueX/APOT3lb9I+TbbXYUrcaNMPVY +Df6vcEI3Twk4H78syDZzexM/DkMDyl94Yb+TmvPLpFoC/wC9tHNsxP8Ak0eL8CBmVppXH3ON21g4 +M5PSW76DhmWaFJV+y6hh9IzIdSuxVrFWicVVLX/eqH/XX9YxV4V/zmgaf4O/7eX/AGK4qyz/AJxa +/wCUDsvldf8AUScVe2Yq7FXYq7FUPqX/ABzrr/jDJ/xE4q+bf+cLTX/GP/bt/wCxrFX0VL/ev/rH +9eKrCcVaJxVrFWsVaJxVonFWsVaxVonFWicVaxVo74q8F/Or8k5by5fzF5ZhUTSVa/sRRQTSvqJ2 +BP7Vdu+YmfT3vF6DsvtcYxwZPp6Hu/Y8z078w/O3lu9S31pJNQiiP+8uoF2ald/Tlrypttuy+2az +Jpo3uKL0UTHJD93Kr6int3kj85vJmuCO09UaTemgW0ueKKT4RyD4G9gaE+GARMXn9XoMsSZH1eb0 +yC498thN1UosQ/OLz35a0DyZfWWrD61catby21rpyMBJJzUqXrvwVK15U69N8zcOM5Nujjz1XgET +/iB2fOf5VambLX7jTy443KcomFfikhPJSvzQscGnPDMxL0na4GbTxyx8j8JfgPqjytei50xd907e +zbj8a5nPLJvirROKtYqqWv8AvVD/AK6/rGKvCf8AnNI0/wAHf9vL/sVxVlv/ADix/wAoFY/K6/6i +Tir23FXYq7FXYqh9S/4511/xhk/4icVfNf8AzhWf+Uy/7dv/AGN4q+i5T+9f/WP68VWE4q1irWKt +E4q0TirWKtYq0TirROKtYq1irROKtHFWGeavy30fW0k9S3jkVqt6bAAhj3Unb78jKIPNtw554zcC +QXiHm38h720keTSXIpU/Vpq9P8k7n/iWYs9L/Nd/pe3jyyj4j9SRaL+Yv5leRD9RmZ3tACkdregy +xrtt6T1qvH+UNTxGYksfCdw7GeDBqomUCL7x+kMO1rVNX1/UpdS1C8e/vpz8bSbP2oqoPhCitFVP +uGbXBqMdUPS8V2j2JqcRMj+8j3j9I6fc1peoyWGoWGpLXnbSKJAD8TCMio9gYzx+/MbVR4MgkOrv +/Z/MM+klhPOO3wPL7bfV/wCX+pKzCIMGRxRSOhDfEp/XmWC6GUSDRZ2TihrFWsVVLT/euH/jIv6x +irwj/nNQ/wDKG/8Aby/7FMVZd/ziv/ygNj8rr/qKOKvbsVdirsVdiqH1L/jnXX/GGT/iJxV80/8A +OFBr/jL/ALdv/Y3ir6MmP71/9Y/rxVZirWKtE4q0TirWKtYq0TirROKtYq1irROKtYq1irWKqc0M +MyGOVA6HsRXFWMa/5B0jVIXR4kdXFDHKKinhy6/fXAQDzZwySgbiaLxjzh+QZiZ5tKZrdzUiB94y +dzsf6H6Mxp6UHk7vS9uTjtkHEO/q8r1vy75k0ovb39rII0IZpgvJaLVVJelQKdA2Y8xMCjydxpZ6 +aczkx0Jy59D8R+l7H+T2vNNo9i3KsttW2fsAYqGP/hOOZmnlcXnO18PBnPdLf8fF73HIskayL9lw +GX5EVy51jeKtYqqWh/0uH/jIv6xirwf/AJzXNP8ABv8A28v+xTFWX/8AOKv/AJL+x+V3/wBRRxV7 +firsVdirsVQ+pf8AHOuv+MMn/ETir5o/5wmNf8Z/9u3/ALG8VfRs396/+sf14qp4q0TirROKtYq1 +irROKtE4q1irWKtE4q1irWKtYq0TirWKtYqskRJFKuoZT1UioxVI9V8o6ZfIQEUH+VxyX6O6/Rir +EW8gNpk0k1lEYjI4kbiOalhtUkfF274AAGc8kpVZJpnukpLHYRLIQSBVSO6ncdfnhYIvFWicVVbT +/euD/jIv/Ehirwb/AJzZNP8ABn/by/7FMVZf/wA4qf8AkvrD5Xf/AFFHFXuGKuxV2KuxVD6l/wAc +66/4wyf8ROKvmb/nCQ/8pn/27P8AsbxV9HTf3z/6x/XiqmTirROKtYq1irROKtE4q1irWKtE4q1i +rWKtYq0TirWKtYq1irROKtYq1irWKtE4q1iqrZ/71wf8ZF/4kMVeC/8AObZ/5Qz/ALef/YpirMP+ +cUv/ACXth8rv/qKOKvccVdirsVdiqH1L/jnXX/GGT/iJxV8y/wDOER/5TT/t2f8AY3ir6OnP75/9 +Y/rxVTJxVrFWsVaJxVonFWsVaxVonFWsVaxVrFWicVaxVrFWsVaJxVrFWsVaxVonFWsVaxVVs/8A +eyD/AIyL/wASGKvBf+c3T/yhf/bz/wCxTFWY/wDOKH/kvLD5Xf8A1FHFXuOKuxV2KuxVD6l/xzrr +/jDJ/wAROKvmP/nB81/xp/27P+xvFX0fOf30n+sf14qp4q1irROKtE4q1irWKtE4q1irWKtYq0Ti +rWKtYq1irROKtYq1irWKtE4q1irWKtYqq2Z/0yD/AIyJ/wASGKvBP+c4DT/Bf/bz/wCxTFWZf84n +/wDku9P+V3/1FHFXuWKuxV2KuxVD6l/xzrr/AIwyf8ROKvmD/nCCRUn86W7njORpzCM7NRDdBtvY +sK4q+kbiomkr/Mf14qp4q0TirROKtYq1irROKtYq1irWKtE4q1irWKtYq0TirWKtYq1irROKtYq1 +irWKtE4qrWIJvIABU81P3GuKvAP+c4ZozL5MiDAyIupOydwrG1Cn6eJxVm3/ADieGH5dafUEHjdn +fwN0SMVe5Yq7FXYq7FVskayRtG32XBVvkRTFXxjrN7rf5Efnjca1FbNP5e1ZpDLAtFWW2mcPLGld +g8MlGT2p2JxV9U+U/PHknzvp8d/5f1SG8DrV4UcLcRnussJ+NCPcfLbFU8/R0X8zfhirv0bF/M34 +Yq1+jIv52/DFXfoyL+dvwxV36Lh/nb8MVa/RUP8AO34Yq79FQ/zt+H9MVa/RMP8AO34Yq79Ew/zt ++GKu/REH87fh/TFWv0PB/O34f0xV36Hg/nb8P6Yq79DQfzt+H9MVa/QsH87fh/TFXfoWD/fj/h/T +FWv0Jb/78f8AD+mKu/Qdv/vx/wAP6Yq1+g7f/fj/AIf0xV36Ct/9+P8Ah/TFXfoK3/34/wCH9MVa +/QNv/vx/w/pirv0Bbf78f8P6Yqk3mfzh5E8iWEuoa9qcNpxUlIpHDXEngsUK/G5PsPntir4i/MXz +tr35wfmQtxa27Rxy8bTSbImvo2yEtykI2qas7n6OgGKvsf8AJ7y5HoWhW1jAP3NpbpEGIoWJp8R9 +24VPzxV6FirsVdirsVdirE/zG/Lfy/560OTTNViUvSsE9KsjjoR3+7FXyP5v/wCcW/Nuk3rpYTLL +ASfTMwYrx9pIw1fpQYqx3/oXzz942v8AwU//AFSxV3/Qvnn7xtf+Cn/6pYq7/oXzz942v/BT/wDV +LFXf9C+efvG1/wCCn/6pYq7/AKF88/eNr/wU/wD1SxV3/Qvnn7xtf+Cn/wCqWKu/6F88/eNr/wAF +P/1SxV3/AEL55+8bX/gp/wDqlirv+hfPP3ja/wDBT/8AVLFXf9C+efvG1/4Kf/qlirv+hfPP3ja/ +8FP/ANUsVd/0L55+8bX/AIKf/qlirv8AoXzz942v/BT/APVLFXf9C+efvG1/4Kf/AKpYq7/oXzz9 +42v/AAU//VLFXf8AQvnn7xtf+Cn/AOqWKu/6F88/eNr/AMFP/wBUsVd/0L55+8bX/gp/+qWKu/6F +88/eNr/wU/8A1SxV3/Qvnn7xtf8Agp/+qWKu/wChfPP3ja/8FP8A9UsVd/0L55+8bX/gp/8Aqliq +L0z/AJxz85XFwEu54IIu7xiWRv8AgWWP9eKvevys/JPTPLg/0WEz3sgHr3UtC5HWjECiJ/kjr3xV +7vpthHY2qwpuert4se+KorFXYq7FXYq7FXYqtkijlUpIgdD1VgCPxxVCnRtLJ/3mT7sVd+htL/5Z +k/HFXfobS/8AlmT8cVd+htL/AOWZPxxV36G0v/lmT8cVd+htL/5Zk/HFXfobS/8AlmT8cVd+htL/ +AOWZPxxV36G0v/lmT8cVd+htL/5Zk/HFXfobS/8AlmT8cVd+htL/AOWZPxxV36G0v/lmT8cVd+ht +L/5Zk/HFXfobS/8AlmT8cVd+htL/AOWZPxxV36G0v/lmT8cVd+htL/5Zk/HFXfobS/8AlmT8cVd+ +htL/AOWZPxxV36G0v/lmT8cVd+htL/5Zk/HFXDRtLB/3mT7sVRUcUcShI0CIOiqAB+GKrsVdirsV +f//Z + + + + + + +uuid:4ee3f24b-6ed2-4a2e-8f7a-50b762c8da8b + + + +image/svg+xml + + + +mime.ai + + + + + + +end='w' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +begin='' id='W5M0MpCehiHzreSzNTczkc9d' + + + + +Adobe PDF library 5.00 + + + + + +2004-02-04T02:08:51+02:00 + +2004-03-29T09:20:16Z + +Adobe Illustrator 10.0 + +2004-02-29T14:54:28+01:00 + + + + +JPEG + +256 + +256 + +/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXzd+b/wDzlWum3k+h+QxFc3EJMdzrkoEkKuNiLZPsyU/nb4fAEb50vZ/YXEBPLsP5v62meXue +A3v5mfmprl080vmLVriXdjHBcTIi17rFCVRfoXOghocEBQhH5NJmepUf8Tfmj/1dtb/6SLv/AJqy +f5fD/Nj8gjxPN3+JvzR/6u2t/wDSRd/81Y/l8P8ANj8gviebv8Tfmj/1dtb/AOki7/5qx/L4f5sf +kF8Tzd/ib80f+rtrf/SRd/8ANWP5fD/Nj8gviebv8Tfmj/1dtb/6SLv/AJqx/L4f5sfkF8Tzd/ib +80f+rtrf/SRd/wDNWP5fD/Nj8gviebv8Tfmj/wBXbW/+ki7/AOasfy+H+bH5BfE83f4m/NH/AKu2 +t/8ASRd/81Y/l8P82PyC+J5u/wATfmj/ANXbW/8ApIu/+asfy+H+bH5BfE83f4m/NH/q7a3/ANJF +3/zVj+Xw/wA2PyC+J5u/xN+aP/V21v8A6SLv/mrH8vh/mx+QXxPN3+JvzR/6u2t/9JF3/wA1Y/l8 +P82PyC+J5u/xN+aP/V21v/pIu/8AmrH8vh/mx+QXxPN3+JvzR/6u2t/9JF3/AM1Y/l8P82PyC+J5 +u/xN+aP/AFdtb/6SLv8A5qx/L4f5sfkF8Tzd/ib80f8Aq7a3/wBJF3/zVj+Xw/zY/IL4nm7/ABN+ +aP8A1dtb/wCki7/5qx/L4f5sfkF8Tzd/ib80f+rtrf8A0kXf/NWP5fD/ADY/IL4nm7/E35o/9XbW +/wDpIu/+asfy+H+bH5BfE82j5t/M+Aes2ta3EI/i9U3N2vGnfly2x/LYT/DH5BePzZ15C/5yh/Mb +y7cxRaxcHzDpQIEsF2f9IC9zHc058v8AX5D9ea/VdiYcg9I4JeXL5NkchD688jeefLvnby/DrmhT ++rayEpLE4CywygAtFKtTxYV+RG4qDnH6nTTwT4JjdyIytkGY6XYq7FXYq7FXYq7FXjX/ADlH+YV1 +5W8hppunymHU/MMj2qSqaMltGoNwynxPNE/2WbrsPSDLl4pfTDf49GvJKg+VPy+8lP5ivecqM9rG +4jWFaqZpTvw57cVUULGvcfMdtYFk7Ac3Ua3VHGAI/XLk+jNK/LfSLS0SK4JYqDSGCkUCV3PBVAPX +vtXwzWT7TlfoAA+11f5Xi3mTIo608meV/wBL2lnLbSSLcc/92sB8Kk70IOU5+0s4xSmCPT5NuDRY +pZBEjmyu2/KnydcFgliF4ip5TT/wY5ov5f1f877B+p2/8kaf+b9pVv8AlT3lL/lkT/kdcf1w/wAv +az+d9kf1I/kjTfzftLR/J/yl/wAsif8AI65/rj/L2s/nfZH9S/yRpv5v2lafyg8p/wDLKn/I65/r +h/l3Wfzvsj+pf5J03837S0fyh8p/8sqf8jrn+uP8u6z+d9kf1L/JOm/m/aWj+UXlP/llj/5HXP8A +XH+XdZ/O+yP6l/knTfzftLX/ACqPyn/yzR/8jrn+uH+XNb/O+yP6l/knTd32lr/lUflX/lmj/wCR +1z/XB/Lmt/nfZH9S/wAk6bu+0u/5VD5W/wCWaP8A5HXP9cf5d1n877I/qX+SdN/N+0u/5VB5Y/5Z +ov8Akdc/1x/l3Wfzvsj+pf5J03837S7/AJU/5a/5Zov+R1z/AFx/l3Wfzvsj+pf5J03837S7/lT3 +lv8A5Zov+R1z/XB/L2s/nfZH9S/yRpv5v2l3/KnfLv8AyzRf8jrn+uP8vaz+d9kf1L/JGm/m/aXf +8qc8v/8ALNF/yOuf64/y9rP532R/Uv8AJGm/m/aXf8qb0H/lmh/5HXP9cf5f1n877I/qX+SNN/N+ +0u/5U1oP/LND/wAjrn+uD+X9Z/O+wfqT/JGn/m/aVk/5P6BDBJM1rEVjUswE1xWg8KnH/RBq/wCd +9g/Uv8kaf+b9pYp5i8oeXLOGBoLQo0j8SRJIe3+Uxza9ldq6jNKQnLkO4Ov1/Z2HGAYj7SkreXdK +IoEZD/Mrmo+Vaj8M3I1eR1fgRee/mD+W8NxE91ZIPrhq0UygL6rbt6ctNubfssevy6XwmJjbYjo5 +ml1csUhGRuB+xJP+cfvzGvfJvny1T1T+iNXdLTUbcn4SWNIpPZkduvgTmq7Z0gy4Sf4obj9L0WOV +F93xSJLGsiGqOAyn2O+cK5K7FXYq7FXYq7FXYq+R/wDnM65lbzjoFsT+6i05pEG/2pJ2VvbpGM6/ +2cH7uR/pfocfNzb/ACCs7caXZzBAJPQuJS3fn9ZMXL/gNs2uvkRirvl+h0GffUm+kfx972EnNKyU +LXfzNpZ/4y/8QOOo/wAWn8PvbdN/fRei6SPjl/1R+vOWDvyjyMsQsIwoWkYVWEYULSMKFhGSVrFV +wOBVwOBVwOBK4HFVwOBK4HAq4HAlcDgVQ1I/7jrn/jE36siUh5X5uH+j23tL/DN52F9U/c6vtX6Q +x0nOidEgNZodNmBAP2aE9jzG4+jL9P8AWGrL9JfNGuSmDzPqEsICGK9maNRsF4ykgCnhmRKArhel +08iccT5B+iHk+4afQbcsalBx+8Bv+Ns8wdknWKuxV2KuxV2KuxV8hf8AOZn/ACneif8AbLH/AFES +52Hs7/dS/rfoDj5uaO/IUf7gbI/8ulx/1GnNlr/7v/O/Q6DN/jEv6v6nqxOahksshXzJpv8Az0/4 +gcjqf8Xn8PvbdL/exei6SPjk/wBUfrzlw9AmBGTYrSMKrCMKFpGFVhGFC0jChYRklaxVcDgVcDgV +cDgSuBxVcDgSuBwKuBwJUdRP+4+5/wCMTfqyJSHlvmwf6Lb+0n8M3XYX1S9zq+1fpDwzzXoX1nzD +eT8a82U1/wBgBm1y6fikS6qGfhFJt5T076lomoJSnOSM/dTMzQYuCTj6rJxh4h5k/wCUi1T/AJjJ +/wDk62bM83fab+6j/VH3P0N8jf8AHBj+Y/5NpnlztGQYq7FXYq7FXYq7FXyF/wA5mf8AKd6J/wBs +sf8AURLnYezv91L+t+gOPm5ph+Q4/wCddsj/AMutx/1Gtmx1/wBH+d+h0Gb/ABiX9X9T1InNUl2n +b+Y9P/56f8QOQ1X+Lz+H3t+l/vYvRtJH7yT/AFR+vOWDv0xIySFhGSQtIwqsIwoWkYVWEYULSMKF +hGSVrFVwOBVwOBVwOBK4HFVwOBK4HAqjf/8AHPuf+MTfqyEkh5j5rH+iQ/65/Uc3XYf1y9zre1Pp +DDpbGzkcu8QZ26k50weeMQoXVvDDZyrEgQNQkD5jLMX1BhMbPmrzN/ykmrf8xlx/ydbMp6XTf3cf +6o+5+hnkb/jgx/Mf8m0zy52bIMVdirsVdirsVdir5C/5zM/5TvRP+2WP+oiXOw9nf7qX9b9AcfNz +TL8iR/zrFif+Xa4/6jWzYa76f879Doc/9/L3fqenE5rEL9KFfMNh85P+IHK9X/cT+H3uRpP72L0f +SR+8k/1f45yzv0xIwqtIwoWEZJC0jCqwjChaRhVYRhQtIwoWEZJWsVXA4FXA4FXA4ErgcVXA4EqV +9/vBc/8AGJv1ZCXJIea+ah/ocfsx/wCInNx2H9cvcHW9qfQGIE507z6HvN7dx8v1jLMfNhPk+Z/N +H/KTav8A8xtx/wAnWzJek0/93H+qPufoX5G/44MfzH/JtM8vdmyDFXYq7FXYq7FXYq+Qv+czP+U7 +0T/tlj/qIlzsPZ3+6l/W/QHHzc0z/Isf86nYH/l3uP8AqNbM/W8v879Doc/9/L3fqelk5rkK2j76 +/ZfN/wDiBynWf3Evx1cjSf3oej6UP3r/AOr/ABzl3fpliq0jCq0jChYRkkLSMKrCMKFpGFVhGFC0 +jChYRklaxVcDgVcDgVcDgSuBxVTvP94rn/jE36shPkyDzjzUP9BX5n/iJzbdifXL4Ou7U+gfFhhO +dS86pXG8TD5frycebGXJ8z+av+Un1j/mNuf+TrZkh6TT/wB3H+qPufoV5G/44MfzH/JtM8vdmyDF +XYq7FXYq7FXYq+Qv+czP+U70T/tlj/qIlzsPZ3+6l/W/QHHzc01/I0f86fp5/wCKLj/qNbM7W8v8 +79Dos/8AfH3fqejE5gMEVoe+u2fzf/iByjW/3Evx1cnR/wB4Ho+l/wB4/wAv45y7v0xxV2KrSMKr +SMKFhGSQtIwqsIwoWkYVWEYULSMKFhGSVrFVwOBVwOBVwOBKy6P+h3H/ABib9WQnySHnnmkf6APY +t/xE5texPrPwdf2n9A+LByc6t5xTfcEZIIL5p82f8pTrP/Mdc/8AJ5syRyek0/8Adx9w+5+hPkb/ +AI4MfzH/ACbTPL3ZsgxV2KuxV2KuxV2KvkL/AJzM/wCU70T/ALZY/wCoiXOw9nf7qX9b9AcfNzTf +8jx/zpWnH/im4/6jHzO1n6f0Oi1H98fd+p6ETmE1o3y/vrdr82/4gcxtd/cycrR/3gej6b/eP8v4 +5y7v0wxV2KuxVaRhVaRhQsIySFpGFVhGFC0jCqwjChaRhQsIyStYquBwKuBwKtuT/olx/wAYm/Vk +J8mUXn/mkf7jj/sv+InNp2L/AHh+Dr+0/oHxYGTnWvONDdgMUPmnzb/yletf8x9z/wAnmzIjyelw +f3cfcH6EeRv+ODH8x/ybTPMHZMgxV2KuxV2KuxV2KvkL/nMz/lO9E/7ZY/6iJc7D2d/upf1v0Bx8 +3NOPyRH/ADo2mn/im4/6jHzN1fP4/odHqP70+5n5OYjUmHlzfWrb5t/xA5ia7+5k5Wi/vA9H07+8 +f5fxzmHfo/FXYq7FXYqtIwqtIwoWEZJC0jCqwjChaRhVYRhQtIwoWEZJWsVXA4Fan/3luP8AjE36 +shk5MosD80D/AHGt8m/4gc2XY394fg4Haf0fN56TnXvNLod5VHz/AFYJclD5p83/APKWa3/zH3X/ +ACebMiPIPS4P7uPuD9CPI3/HBj+Y/wCTaZ5g7JkGKuxV2KuxV2KuxV8hf85mf8p3on/bLH/URLnY +ezv91L+t+gOPm5p1+SYp5B0w/wDFVx/1GPmZq/q+P6HR6n+9PuZ0TmM0pr5Y31iD5t/xA5h6/wDu +i5mi/vA9G0/7b/LOYd8jsVdirsVdirsVWkYVWkYULCMkhaRhVYRhQtIwqsIwoWkYULCMkrWKul/3 +mn/4xt+rK8nJMebB/NA/3Fyf6r/8QObHsb+8Pw+9we0/o+bzgnOxeZVLXe4QfP8AUcjPkmPN81ec +f+Uu1z/toXX/ACebL4fSHpcH0R9wfoP5G/44MfzH/JtM8xdkyDFXYq7FXYq7FXYq+Qv+czP+U70T +/tlj/qIlzsPZ3+6l/W/QHHzc08/JUf8AIPNLP/Fdx/1GSZl6r6z7/wBDpNT/AHh9zNicocdOPKu+ +rQ/M/wDEGzB7Q/ui5uh+sPRbEhXappt3zmXfI3mn8w+/FXeon8w+/FWvUj/mH3jFXepH/MPvGKu9 +WP8AnH3jFXepF/Ov3jFVpeP+dfvGG1Wl4/51+8YbQtLJ/Mv3jDa0tJT+ZfvGHiCKWnj/ADL/AMEP +64eILS08f5l/4If1w8QRS0qP5l/4If1w8YWlpUfzL/wS/wBceMIorCn+Uv8AwS/1w8YXhKyai289 +WXeNgPiB3I+eRnIEJiGFeZx/uKm/1H/4gc2PY/8AefL73B7S+j5vNCc7N5dWsN7uMfP/AIichl+k +so83zX5z/wCUw13/ALaF1/yffL8f0j3PS4foj7g/QbyN/wAcGP5j/k2meYuyZBirsVdirsVdirsV +fIX/ADmZ/wAp3on/AGyx/wBREudh7O/3Uv636A4+bmnv5Lj/AJBxpZ/yLj/qMkzK1X1n3/odJqv7 +w+5mZOVOOmvly5jtrwTyAlIzuFpXdSO9Mw9bjM4cI6uVpJiMrLK/8T2H++5fuX/mrNL/ACdk7x+P +g7b85DuLX+JbD/fcv3L/AM1Y/wAnZO8fj4L+ch3Fr/Elj/vuX7l/5qx/k7J3j8fBfzkO4tf4jsf9 +9y/cv/NWP8nZO8fj4L+ch3Fo+YrH/fcv3L/zVj/J2TvH4+C/nIdxW/4hsv5JPuX/AJqx/k7J3j8f +BfzkO4tfp+y/kk+5f+asf5Oyd4/HwX85DuLX6es/5JPuX/mrH+TsnePx8F/OQ7i1+nbP+ST7l/5q +x/k7J3j8fBfzkO4tfpy0/kk+5f64/wAnZO8fj4L+ch3Fr9N2n8kn3L/XH+TsnePx8F/OQ7i0datf +5JPuX+uP8nZO8fj4L+ch3Fb+mLX+R/uH9cf5Oyd4/HwX85DuLX6Xtv5H+4f1x/k7J3j8fBfzkO4t +fpa2/lf7h/XH+TsnePx8F/OQ7i0dVt/5X+4f1x/k7J3j8fBfzkO4tHVLf+V/uH9cf5Oyd4/HwX85 +DuKW6/dxz6XcKgYFY5DvT+Q++bDs7TSx5Bdbkfe4etzicNvN5sTnWPOojTN7+If63/ETleb6Cyhz +fNnnX/lMte/7aN3/AMn3y/H9I9z02H6B7g/QXyN/xwY/mP8Ak2meYuxZBirsVdirsVdirsVfIX/O +Zn/Kd6J/2yx/1ES52Hs7/dS/rfoDj5uaf/kyP+QZ6Uf8m4/6jJMytT/eH8dHS6r6z7mXk5W4rSyy +JXgxWvWhIxMQVEiOTjdXH+/X/wCCOPAO5eM9603Vz/v1/wDgjh4I9y8Z71pu7n/fz/8ABHDwR7kc +Z71pu7r/AH8//BH+uHw49y8cu9aby6/39J/wR/rh8OPcEccu9ab27/3/ACf8E39cPhx7gjjl3rTe +3f8Av+T/AINv64fDj3BfEl3rTfXn+/5P+Db+uHw49wR4ku8rTfXv/LRJ/wAG39cPhR7gviS7ytN/ +e/8ALRJ/wbf1w+FHuCPEl3ladQvv+WiX/g2/rh8KPcEeJLvK06hff8tMv/Bt/XD4Ue4L4ku8rTqN +/wD8tMv/AAbf1w+FDuCPEl3ladRv/wDlpl/4Nv64fBh3D5L4ku8rTqWof8tUv/Bt/XD4MO4fJHiy +7ytOp6h/y1Tf8jG/rh8GHcPkjxZd5aOp6j/y1Tf8jG/rh8GHcPkviy7ypvqN+6lWuZWVhRlLsQQe +xFcIwwHQfJByS7yhScta0Xo++pQj/W/4icq1H0Fnj+p82+d/+Uz1/wD7aN3/AMn3y7F9I9z02H6B +7g/QTyN/xwY/mP8Ak2meZOxZBirsVdirsVdirsVfIX/OZn/Kd6J/2yx/1ES52Hs7/dS/rfoDj5ub +IfybH/ILtJPtcf8AUZLmTqP70/jo6XVfWWVE5FxFpOFVpOFDCLz82fLtrdz2slteGSCRonKpFQlC +VNKyDbbLRjLLgKgfzh8tf8s17/wEX/VXD4ZXwytP5weWv+Wa9/4CL/qrjwFHhlo/m95b/wCWa8/4 +CL/qrh4Cvhlo/m75b/5Zrz/gIv8Aqrh4V8Mrf+Vt+XD/AMe15/wEX/VXCIFHhF3/ACtjy6f+Pa8/ +4CL/AKqZMYijwy1/ytXy8f8Aj3u/+Ai/6qZYNPJHhl3/ACtPy+f+Pe7/AOAj/wCqmTGll5I8Mtf8 +rQ0A/wDHvd/8BH/1UywaKfkjwy7/AJWboR/497r/AICP/qpkx2fPvCOAtf8AKytDP+6Lr/gI/wDq +pkx2bk7x+PgjgLY/MXRT0guf+Bj/AOa8P8nZO8fj4LwFseftIPSG4/4FP+a8f5Pn3j8fBHAUTY+b +dOvbqO2iimWSQkKXVQNhXejHwyGTSSiLNIMSE4JzGYLCcKFpOFCN0PfVYB/rf8QOU6n+7LZi+oPm +7zx/ymvmD/tpXn/J98uxfQPcHpsX0D3B+gfkb/jgx/Mf8m0zzJ2LIMVdirsVdirsVdir5C/5zM/5 +TvRP+2WP+oiXOw9nf7qX9b9AcfNzZF+To/5BVpB9rj/qMlzI1H98fx0dNq/qLJycXDWk4ULScKEq +/IbT7OTVvMty0S/Wm1BoRPQcxHVmKqT0BPXNL25M3EdKd52bEUS9s/RNv/O/3j+maC3Zu/RNv/O/ +3j+mNq79E2/87/eP6Y2rv0Tb/wA7/eP6Y2rv0Tb/AM7/AHj+mNq79E2/87/eP6Y2rv0Tb/zv94/p +jau/RNv/ADv94/pjau/RNv8Azv8AeP6Y2rv0Tb/zv94/pjau/RNv/O/3j+mNq80/PXTbMeUJmaMP +LbyQvBKwBZC8gRqEU6qc6L2YyyjqwAdpA38nA7RiDiJ7nzykeekEvOpz5cSmsWx9z/xE5jak+gsZ +cmeE5qWhaThQtJwqj/L2+sW4/wBf/iDZRq/7s/jq2YfqD5v89f8AKb+Yf+2nef8AUQ+W4foHuD02 +L6R7n6BeRv8Ajgx/Mf8AJtM8zdiyDFXYq7FXYq7FXYq+Qv8AnMz/AJTvRP8Atlj/AKiJc7D2d/up +f1v0Bx83Nkn5Pj/kEujn/mI/6jJcvz/35/HR02r+osjJyThLScKFhOSQgvyCamo+YR46o3/G2aHt +z6o+533Zv0l7pmhdk7FXYq7FXYq7FXYq7FXYq7FXYq8w/PPfytdr7wf8nRm/9m/8bj7pfc4PaP8A +cn4PntI89IJebTXQUpqlufc/8ROY+c+gsZcmZk5rWhaThVaThQmPlrfW7Yf6/wDybbMfWf3R/HVt +wfWHzh58/wCU58xf9tO8/wCoh8twfRH3B6fH9I9z9AfI3/HBj+Y/5NpnmbsGQYq7FXYq7FXYq7FX +yF/zmZ/yneif9ssf9REudh7O/wB1L+t+gOPm5sm/KEf8gh0Y+9x/1GTZdm/vz+OgdPrOZT8nLHAW +E5JC0nCqX/kO9NT8wf8AbUb/AI2zQ9ufVH3O+7N+kvdPUzQ07Jg/5n+a7ny3o9zq0CGY20cREHMx +hvUnEfUA9OVemZmh03jZRC6u/utpz5eCBl3PIv8AoY3V/wDq1j/pKf8A5ozoR7NxP8f2ftdf/KR/ +m/ay/wDLf81dQ826lcW0tsbQWypJyWZpOXJuNKELmu7U7JGliJCXFZ7nJ0ur8UkVVPZvUzR05rvU +xpXepjSu9TGld6mNK71MaV3qY0rzP8625eXrlf8AjB/ydGb32c/xuPul9zg9o/3J+DwdI89FJebT +PRkpqEJ9z+o5RmPpLCXJlJOYLStJwoWE4UJp5V31+1H/ABk/5NtmNrf7o/D727T/AFh84efv+U68 +x/8AbUvf+oh8swf3cfcHp8f0j3P0B8jf8cGP5j/k2meaOwZBirsVdirsVdirsVfIX/OZn/Kd6J/2 +yx/1ES52Hs7/AHUv636A4+bmyf8AKMf8gc0U/wCVcf8AUZNl2b/GD+OgdPrOZTsnLnXrScKrScKE +s/I1qanr3/bTb/jbND22PVH3O/7N+kvb/UzROyeYfny9fJmoj/iu2/6i0zbdiD/CofH/AHJcTW/3 +R+H3vmQDPQ4wefep/kEeOuah/wAYov8Ak5nOe1Eaxw/rH7nZdmfUfc+l/UziXcu9TFXepirvUxV3 +qYq71MVd6mKvOPzhblolwPaH/k5m79nv8aj7j9zgdo/3J+DxdI89BJebTDTEpeRH3P6jlOQ7MZck +/JzFaFhOFC0nCqbeUd/MVoP+Mn/Jpsxdf/cy+H3hu031h84/mB/ynnmT/tqXv/UQ+Waf+7j/AFR9 +z0+P6R7n6AeRv+ODH8x/ybTPNHYMgxV2KuxV2KuxV2KvkL/nMz/lO9E/7ZY/6iJc7D2d/upf1v0B +x83NlP5TD/kC+iH/AC7n/qMmy3L/AIzL8dA6jWcym5OZDrlpOFC0nChKfyUbjqmue+pN/wAbZpO3 +h6of1Xf9m/SXtXqZz9Oyeafnm9fKOoD/AIrt/wDqKXNz2CP8Lh/nf7kuJrv7o/D73zaFz0mMHnre +nfkWeOt33/GKP/k5nMe1kaxQ/rH7nZ9l/Ufc+j/UzhKdy71MaV3qY0rvUxpXepjSu9TGld6mNK8/ +/NduWlzL7Rf8nM3XYH+NR+P3OD2l/cn4PJEjzvSXmkbYpS4Q/wCfTKpnZjLkmpOUtC0nCq0nJITj +ybv5lsx/xk/5NPmH2h/cy+H3hv0394Hzl+YP/KfeZf8Atq3v/US+Waf+7j/VH3PTw+kPv/yN/wAc +GP5j/k2meaOwZBirsVdirsVdirsVfIX/ADmZ/wAp3on/AGyx/wBREudh7O/3Uv636A4+bmyv8qB/ +yBPRD/xZc/8AUZNlmT/GpfjoHUa1MycynWrScKFhOFUn/JxuOqa1/wBtJv8AjbNR7QD1Q/qu+7M+ +kvZfUznKdm83/Ox+XlW/H/Fdv/1Erm69nh/hkP8AO/3JcTXf3J+H3vncLnp8YvOPSvyUHDWL0+Mc +f/E85P2u/uof1j9ztOy/qPufQ3qZwVO6d6mNK71MaV3qY0rvUxpXepjSu9TGlYJ+ZjcrGUe0X/E8 +3HYX+Mx+P3OB2l/cn4PNEjzuSXmkVbpSRTlZLGXJFk5FpWk5JC0nChOvJG/miyH/ABl/5MvmF2l/ +cS+H3hyNL/eD8dHzn+Yf/Kf+Zv8AtrX3/US+T0391H+qPueoh9Iff3kb/jgx/Mf8m0zzVz2QYq7F +XYq7FXYq7FXyF/zmZ/yneif9ssf9REudh7O/3Uv636A4+bmyz8qv/JHaGf8Aiy5/6jJ8nk/xuXu/ +QHUa1MCczHWLCcKrScKEk/KN+Gqaz/20W/42zV+0Y3x/1Xfdl/SXr31gZzVO0Yv520E+YLSSwbms +EyIHkjKhgUk9Tbl8hmXodXLTZRliATG+fmKas2IZImJ6sFH5J2Q/3ddffF/TOh/0W5/5kPt/W4P8 +lw7ynvlX8v18vXbz25mkMoVX9QpQBWrtxAzV9pdsZNXERkAOHutyNPpI4iSDzei/WBmnpy3fWBjS +u+sDGld9YGNK76wMaV31gY0rvrAxpWGfmA4kt5B/kx/8Tzbdi/4wPj9zgdpf3J+DAkjztCXmldEp +vkbYy5Licm0LScKFhOFU98ib+a7H/nr/AMmXzB7T/wAXl8PvDkaT+8H46PnT8xf/ACYPmf8A7a19 +/wBRL5PTf3Uf6o+56iHIPv3yN/xwY/mP+TaZ5q57IMVdirsVdirsVdir5C/5zMB/x1oh7fosf9RE +udh7O/3Uv636A4+bmyz8qv8AyRuh07S3Ffb/AEyfJz/xuXu/QHUa3kjSczXWLScKFpOFDH/ywfhq +OsH/AJf2/W2a72lG+P8AqO+7L+kvT/rXvnMU7R31r3xpXfWvfGld9a98aV31r3xpXfWvfGld9a98 +aV31r3xpXfWvfGld9a98aV31r3xpWM+bpPUiYeyf8Szadj/4wPj9zg9pf3J+DFUjzsCXmVVkpGTg +id2MuSHJy9oWE4VWk4UJ95CqfNljQbD1a/8AIl8wO1P8Xl8PvDkaP+8H46PnX8xf/Jg+Z/8AtrX3 +/US+T0v91H+qPuephyD798jf8cGP5j/k2meaueyDFXYq7FXYq7FXYq+b/wDnMvyrcXGj6F5ngQtH +YSSWV6QK8VuOLxMfBQ8bLXxYZ0vs7nAlLGeu4+DTmHVif/OOXm+xvdGvfImoTiO5LvdaSXbZlIDS +RINt0ZfUp1ILeGbPtDGYTGUfF12pxcQZ/fafeWUhjuIytDQPT4W+Ry3FljMWC6acDHmhCcta1hOF +Uo/KW39fzBf2/X1dQYU/4LNf7UHfH/Ud92V9Je4/4U/yPwzkuN2tO/wp/kfhjxrTv8Kf5H4Y8a07 +/Cn+R+GPGtO/wp/kfhjxrTv8Kf5H4Y8a07/Cn+R+GPGtO/wp/kfhjxrTv8Kf5H4Y8a07/Cn+R+GP +GtO/wp/kfhjxrTz78wrH6lf/AFelKxI1Pmx/pm27GN5x8fucDtP+5PwYmkedcS8wuuEpbufb+OMD +6mMuSWE5ltK0nChyJJK4jjUu7bKqgkk+wGJIAsqBfJldi1p5F0G982+Yf3BjjMdlZsQsskjbqig/ +tvxoB2FSds0Wu1H5iQxY9+8u20OlINl82eV7HUPNvny1WWs1zqF4bm8cDqC5lmb2rvT3zK1mUYMB +PdGh9wd/AWafoD5TtzBo6L2LEj5ABf8AjXPPHLTjFXYq7FXYq7FXYql/mDQdL8waLeaLqsIuNPv4 +mhuIj3Vu4PZlO6nsd8sxZZY5CUeYQRb4V/NL8oPNv5a656pEs2kiX1NL1uDko+FqpzZf7qVdtvHd +Sc7vQ9o49TGuUusfxzDjTgQmOjf85K/mRp1klrMbLUymy3F5C5loBQAtDJCG+ZFfE4z7KxSN7j3O +OcUSj/8Aoaf8wf8Aq36T/wAibn/soyH8kYu+X2fqR4Ad/wBDT/mD/wBW/Sf+RNz/ANlGP8kYu+X2 +fqXwAoN/zkl5puryK6v9OtRJACIHsXmtXUk9SzvcfgBlObsSEuUiPfv+puxejkjP+hnPMn++bz/u +JS/9U8xv9Dw/n/7H9rd4rv8AoZzzJ/vm8/7iUv8A1Tx/0PD+f/sf2r4rv+hnPMn++bz/ALiUv/VP +H/Q8P5/+x/aviu/6Gc8yf75vP+4lL/1Tx/0PD+f/ALH9q+K7/oZzzJ/vm8/7iUv/AFTx/wBDw/n/ +AOx/aviu/wChnPMn++bz/uJS/wDVPH/Q8P5/+x/aviu/6Gc8yf75vP8AuJS/9U8f9Dw/n/7H9q+K +7/oZzzJ/vm8/7iUv/VPH/Q8P5/8Asf2r4rv+hnPMn++bz/uJS/8AVPH/AEPD+f8A7H9q+K7/AKGc +8yf75vP+4lL/ANU8f9Dw/n/7H9q+K7/oZzzJ/vm8/wC4lL/1Tx/0PD+f/sf2r4qEm/5yR8yi8jvr +awikvEBQyahNLdjgRSg4mBh1/mPyy7D2FCJ3kT7hX62vJLjFK3/Q0/5g/wDVv0n/AJE3P/ZRmT/J +GLvl9n6nH8AO/wChp/zB/wCrfpP/ACJuf+yjH+SMXfL7P1L4Ad/0NP8AmD/1b9J/5E3P/ZRj/JGL +vl9n6l8AO/6Gn/MH/q36T/yJuf8Asox/kjF3y+z9S+AGj/zlP+YJH/HP0ke/o3P/AGUY/wAkYu+X +2fqXwQwPXvM/nfz/AKxF9emm1O7qRa2cS0jiDHf040AVR0qx32+I5lxhi08L2iO9tjCtg+ifyJ/J +ubQF+u36q+tXajmRusEXXiD+vxNPAE8f2r2l+YlUfoH2+f6nKhCn0XBCkEKQxiiRgKv0ZqGxfirs +VdirsVdirsVdiqhfWFlf2slpewpcW0o4yQyKGVh7g4QSNwryzXP+cZ/yy1G4a4i0xIGY1McTyQrX +5RMo/wCFzYY+1tTAUJn40fvYHGEp/wChVPy+/wCWAf8ASXdf1yf8tar+f9kf1L4cXf8AQqn5ff8A +LAP+ku6/rj/LWq/n/ZH9S+HF3/Qqn5ff8sA/6S7r+uP8tar+f9kf1L4cXf8AQqn5ff8ALAP+ku6/ +rj/LWq/n/ZH9S+HF3/Qqn5ff8sA/6S7r+uP8tar+f9kf1L4cXf8AQqn5ff8ALAP+ku6/rj/LWq/n +/ZH9S+HF3/Qqn5ff8sA/6S7r+uP8tar+f9kf1L4cXf8AQqn5ff8ALAP+ku6/rj/LWq/n/ZH9S+HF +3/Qqn5ff8sA/6S7r+uP8tar+f9kf1L4cXf8AQqn5ff8ALAP+ku6/rj/LWq/n/ZH9S+HF3/Qqn5ff +8sA/6S7r+uP8tar+f9kf1L4cXf8AQqn5ff8ALAP+ku6/rj/LWq/n/ZH9S+HF3/Qqn5ff8sA/6S7r ++uP8tar+f9kf1L4cXf8AQqn5ff8ALAP+ku6/rj/LWq/n/ZH9S+HF3/Qqn5ff8sA/6S7r+uP8tar+ +f9kf1L4cXf8AQqn5ff8ALAP+ku6/rj/LWq/n/ZH9S+HF3/Qqn5ff8sA/6S7r+uP8tar+f9kf1L4c +Xf8AQqn5ff8ALAP+ku6/rj/LWq/n/ZH9S+HF3/Qqn5ff8sA/6S7r+uP8tar+f9kf1L4cW1/5xW/L +9WDCwWo33urkj7icT2zqv5/2R/UvhxZl5Z/KLy9oKcLG1t7RduRgT42p4sQN/c5g5tRkym5yMmQA +DNrOytrSL04E4j9o9ST7nKUq+KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K +uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku +xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux +V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//2Q== + + + + + + +uuid:f3c53255-be8a-4b04-817b-695bf2c54c8b + + + +image/svg+xml + + + +filesave.ai + + + + + + +end='w' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PPOCRLabel/resources/icons/save.png b/PPOCRLabel/resources/icons/save.png new file mode 100644 index 0000000000000000000000000000000000000000..daba865fafd22fa18e7c0488eb699b79d3554170 Binary files /dev/null and b/PPOCRLabel/resources/icons/save.png differ diff --git a/PPOCRLabel/resources/icons/save.svg b/PPOCRLabel/resources/icons/save.svg new file mode 100644 index 0000000000000000000000000000000000000000..5533e489925c35102834a23074cad3c36ad1c8a5 --- /dev/null +++ b/PPOCRLabel/resources/icons/save.svg @@ -0,0 +1,679 @@ + + + + + + + + begin='' id='W5M0MpCehiHzreSzNTczkc9d' + + + + +Adobe PDF library 5.00 + + + + + +2004-02-04T02:08:51+02:00 + +2004-03-29T09:20:16Z + +Adobe Illustrator 10.0 + +2004-02-29T14:54:28+01:00 + + + + +JPEG + +256 + +256 + +/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXzd+b/wDzlWum3k+h+QxFc3EJMdzrkoEkKuNiLZPsyU/nb4fAEb50vZ/YXEBPLsP5v62meXue +A3v5mfmprl080vmLVriXdjHBcTIi17rFCVRfoXOghocEBQhH5NJmepUf8Tfmj/1dtb/6SLv/AJqy +f5fD/Nj8gjxPN3+JvzR/6u2t/wDSRd/81Y/l8P8ANj8gviebv8Tfmj/1dtb/AOki7/5qx/L4f5sf +kF8Tzd/ib80f+rtrf/SRd/8ANWP5fD/Nj8gviebv8Tfmj/1dtb/6SLv/AJqx/L4f5sfkF8Tzd/ib +80f+rtrf/SRd/wDNWP5fD/Nj8gviebv8Tfmj/wBXbW/+ki7/AOasfy+H+bH5BfE83f4m/NH/AKu2 +t/8ASRd/81Y/l8P82PyC+J5u/wATfmj/ANXbW/8ApIu/+asfy+H+bH5BfE83f4m/NH/q7a3/ANJF +3/zVj+Xw/wA2PyC+J5u/xN+aP/V21v8A6SLv/mrH8vh/mx+QXxPN3+JvzR/6u2t/9JF3/wA1Y/l8 +P82PyC+J5u/xN+aP/V21v/pIu/8AmrH8vh/mx+QXxPN3+JvzR/6u2t/9JF3/AM1Y/l8P82PyC+J5 +u/xN+aP/AFdtb/6SLv8A5qx/L4f5sfkF8Tzd/ib80f8Aq7a3/wBJF3/zVj+Xw/zY/IL4nm7/ABN+ +aP8A1dtb/wCki7/5qx/L4f5sfkF8Tzd/ib80f+rtrf8A0kXf/NWP5fD/ADY/IL4nm7/E35o/9XbW +/wDpIu/+asfy+H+bH5BfE82j5t/M+Aes2ta3EI/i9U3N2vGnfly2x/LYT/DH5BePzZ15C/5yh/Mb +y7cxRaxcHzDpQIEsF2f9IC9zHc058v8AX5D9ea/VdiYcg9I4JeXL5NkchD688jeefLvnby/DrmhT ++rayEpLE4CywygAtFKtTxYV+RG4qDnH6nTTwT4JjdyIytkGY6XYq7FXYq7FXYq7FXjX/ADlH+YV1 +5W8hppunymHU/MMj2qSqaMltGoNwynxPNE/2WbrsPSDLl4pfTDf49GvJKg+VPy+8lP5ivecqM9rG +4jWFaqZpTvw57cVUULGvcfMdtYFk7Ac3Ua3VHGAI/XLk+jNK/LfSLS0SK4JYqDSGCkUCV3PBVAPX +vtXwzWT7TlfoAA+11f5Xi3mTIo608meV/wBL2lnLbSSLcc/92sB8Kk70IOU5+0s4xSmCPT5NuDRY +pZBEjmyu2/KnydcFgliF4ip5TT/wY5ov5f1f877B+p2/8kaf+b9pVv8AlT3lL/lkT/kdcf1w/wAv +az+d9kf1I/kjTfzftLR/J/yl/wAsif8AI65/rj/L2s/nfZH9S/yRpv5v2lafyg8p/wDLKn/I65/r +h/l3Wfzvsj+pf5J03837S0fyh8p/8sqf8jrn+uP8u6z+d9kf1L/JOm/m/aWj+UXlP/llj/5HXP8A +XH+XdZ/O+yP6l/knTfzftLX/ACqPyn/yzR/8jrn+uH+XNb/O+yP6l/knTd32lr/lUflX/lmj/wCR +1z/XB/Lmt/nfZH9S/wAk6bu+0u/5VD5W/wCWaP8A5HXP9cf5d1n877I/qX+SdN/N+0u/5VB5Y/5Z +ov8Akdc/1x/l3Wfzvsj+pf5J03837S7/AJU/5a/5Zov+R1z/AFx/l3Wfzvsj+pf5J03837S7/lT3 +lv8A5Zov+R1z/XB/L2s/nfZH9S/yRpv5v2l3/KnfLv8AyzRf8jrn+uP8vaz+d9kf1L/JGm/m/aXf +8qc8v/8ALNF/yOuf64/y9rP532R/Uv8AJGm/m/aXf8qb0H/lmh/5HXP9cf5f1n877I/qX+SNN/N+ +0u/5U1oP/LND/wAjrn+uD+X9Z/O+wfqT/JGn/m/aVk/5P6BDBJM1rEVjUswE1xWg8KnH/RBq/wCd +9g/Uv8kaf+b9pYp5i8oeXLOGBoLQo0j8SRJIe3+Uxza9ldq6jNKQnLkO4Ov1/Z2HGAYj7SkreXdK +IoEZD/Mrmo+Vaj8M3I1eR1fgRee/mD+W8NxE91ZIPrhq0UygL6rbt6ctNubfssevy6XwmJjbYjo5 +ml1csUhGRuB+xJP+cfvzGvfJvny1T1T+iNXdLTUbcn4SWNIpPZkduvgTmq7Z0gy4Sf4obj9L0WOV +F93xSJLGsiGqOAyn2O+cK5K7FXYq7FXYq7FXYq+R/wDnM65lbzjoFsT+6i05pEG/2pJ2VvbpGM6/ +2cH7uR/pfocfNzb/ACCs7caXZzBAJPQuJS3fn9ZMXL/gNs2uvkRirvl+h0GffUm+kfx972EnNKyU +LXfzNpZ/4y/8QOOo/wAWn8PvbdN/fRei6SPjl/1R+vOWDvyjyMsQsIwoWkYVWEYULSMKFhGSVrFV +wOBVwOBVwOBK4HFVwOBK4HAq4HAlcDgVQ1I/7jrn/jE36siUh5X5uH+j23tL/DN52F9U/c6vtX6Q +x0nOidEgNZodNmBAP2aE9jzG4+jL9P8AWGrL9JfNGuSmDzPqEsICGK9maNRsF4ykgCnhmRKArhel +08iccT5B+iHk+4afQbcsalBx+8Bv+Ns8wdknWKuxV2KuxV2KuxV8hf8AOZn/ACneif8AbLH/AFES +52Hs7/dS/rfoDj5uaO/IUf7gbI/8ulx/1GnNlr/7v/O/Q6DN/jEv6v6nqxOahksshXzJpv8Az0/4 +gcjqf8Xn8PvbdL/exei6SPjk/wBUfrzlw9AmBGTYrSMKrCMKFpGFVhGFC0jChYRklaxVcDgVcDgV +cDgSuBxVcDgSuBwKuBwJUdRP+4+5/wCMTfqyJSHlvmwf6Lb+0n8M3XYX1S9zq+1fpDwzzXoX1nzD +eT8a82U1/wBgBm1y6fikS6qGfhFJt5T076lomoJSnOSM/dTMzQYuCTj6rJxh4h5k/wCUi1T/AJjJ +/wDk62bM83fab+6j/VH3P0N8jf8AHBj+Y/5NpnlztGQYq7FXYq7FXYq7FXyF/wA5mf8AKd6J/wBs +sf8AURLnYezv91L+t+gOPm5ph+Q4/wCddsj/AMutx/1Gtmx1/wBH+d+h0Gb/ABiX9X9T1InNUl2n +b+Y9P/56f8QOQ1X+Lz+H3t+l/vYvRtJH7yT/AFR+vOWDv0xIySFhGSQtIwqsIwoWkYVWEYULSMKF +hGSVrFVwOBVwOBVwOBK4HFVwOBK4HAqjf/8AHPuf+MTfqyEkh5j5rH+iQ/65/Uc3XYf1y9zre1Pp +DDpbGzkcu8QZ26k50weeMQoXVvDDZyrEgQNQkD5jLMX1BhMbPmrzN/ykmrf8xlx/ydbMp6XTf3cf +6o+5+hnkb/jgx/Mf8m0zy52bIMVdirsVdirsVdir5C/5zM/5TvRP+2WP+oiXOw9nf7qX9b9AcfNz +TL8iR/zrFif+Xa4/6jWzYa76f879Doc/9/L3fqenE5rEL9KFfMNh85P+IHK9X/cT+H3uRpP72L0f +SR+8k/1f45yzv0xIwqtIwoWEZJC0jCqwjChaRhVYRhQtIwoWEZJWsVXA4FXA4FXA4ErgcVXA4EqV +9/vBc/8AGJv1ZCXJIea+ah/ocfsx/wCInNx2H9cvcHW9qfQGIE507z6HvN7dx8v1jLMfNhPk+Z/N +H/KTav8A8xtx/wAnWzJek0/93H+qPufoX5G/44MfzH/JtM8vdmyDFXYq7FXYq7FXYq+Qv+czP+U7 +0T/tlj/qIlzsPZ3+6l/W/QHHzc0z/Isf86nYH/l3uP8AqNbM/W8v879Doc/9/L3fqelk5rkK2j76 +/ZfN/wDiBynWf3Evx1cjSf3oej6UP3r/AOr/ABzl3fpliq0jCq0jChYRkkLSMKrCMKFpGFVhGFC0 +jChYRklaxVcDgVcDgVcDgSuBxVTvP94rn/jE36shPkyDzjzUP9BX5n/iJzbdifXL4Ou7U+gfFhhO +dS86pXG8TD5frycebGXJ8z+av+Un1j/mNuf+TrZkh6TT/wB3H+qPufoV5G/44MfzH/JtM8vdmyDF +XYq7FXYq7FXYq+Qv+czP+U70T/tlj/qIlzsPZ3+6l/W/QHHzc01/I0f86fp5/wCKLj/qNbM7W8v8 +79Dos/8AfH3fqejE5gMEVoe+u2fzf/iByjW/3Evx1cnR/wB4Ho+l/wB4/wAv45y7v0xxV2KrSMKr +SMKFhGSQtIwqsIwoWkYVWEYULSMKFhGSVrFVwOBVwOBVwOBKy6P+h3H/ABib9WQnySHnnmkf6APY +t/xE5texPrPwdf2n9A+LByc6t5xTfcEZIIL5p82f8pTrP/Mdc/8AJ5syRyek0/8Adx9w+5+hPkb/ +AI4MfzH/ACbTPL3ZsgxV2KuxV2KuxV2KvkL/AJzM/wCU70T/ALZY/wCoiXOw9nf7qX9b9AcfNzTf +8jx/zpWnH/im4/6jHzO1n6f0Oi1H98fd+p6ETmE1o3y/vrdr82/4gcxtd/cycrR/3gej6b/eP8v4 +5y7v0wxV2KuxVaRhVaRhQsIySFpGFVhGFC0jCqwjChaRhQsIyStYquBwKuBwKtuT/olx/wAYm/Vk +J8mUXn/mkf7jj/sv+InNp2L/AHh+Dr+0/oHxYGTnWvONDdgMUPmnzb/yletf8x9z/wAnmzIjyelw +f3cfcH6EeRv+ODH8x/ybTPMHZMgxV2KuxV2KuxV2KvkL/nMz/lO9E/7ZY/6iJc7D2d/upf1v0Bx8 +3NOPyRH/ADo2mn/im4/6jHzN1fP4/odHqP70+5n5OYjUmHlzfWrb5t/xA5ia7+5k5Wi/vA9H07+8 +f5fxzmHfo/FXYq7FXYqtIwqtIwoWEZJC0jCqwjChaRhVYRhQtIwoWEZJWsVXA4Fan/3luP8AjE36 +shk5MosD80D/AHGt8m/4gc2XY394fg4Haf0fN56TnXvNLod5VHz/AFYJclD5p83/APKWa3/zH3X/ +ACebMiPIPS4P7uPuD9CPI3/HBj+Y/wCTaZ5g7JkGKuxV2KuxV2KuxV8hf85mf8p3on/bLH/URLnY +ezv91L+t+gOPm5p1+SYp5B0w/wDFVx/1GPmZq/q+P6HR6n+9PuZ0TmM0pr5Y31iD5t/xA5h6/wDu +i5mi/vA9G0/7b/LOYd8jsVdirsVdirsVWkYVWkYULCMkhaRhVYRhQtIwqsIwoWkYULCMkrWKul/3 +mn/4xt+rK8nJMebB/NA/3Fyf6r/8QObHsb+8Pw+9we0/o+bzgnOxeZVLXe4QfP8AUcjPkmPN81ec +f+Uu1z/toXX/ACebL4fSHpcH0R9wfoP5G/44MfzH/JtM8xdkyDFXYq7FXYq7FXYq+Qv+czP+U70T +/tlj/qIlzsPZ3+6l/W/QHHzc08/JUf8AIPNLP/Fdx/1GSZl6r6z7/wBDpNT/AHh9zNicocdOPKu+ +rQ/M/wDEGzB7Q/ui5uh+sPRbEhXappt3zmXfI3mn8w+/FXeon8w+/FWvUj/mH3jFXepH/MPvGKu9 +WP8AnH3jFXepF/Ov3jFVpeP+dfvGG1Wl4/51+8YbQtLJ/Mv3jDa0tJT+ZfvGHiCKWnj/ADL/AMEP +64eILS08f5l/4If1w8QRS0qP5l/4If1w8YWlpUfzL/wS/wBceMIorCn+Uv8AwS/1w8YXhKyai289 +WXeNgPiB3I+eRnIEJiGFeZx/uKm/1H/4gc2PY/8AefL73B7S+j5vNCc7N5dWsN7uMfP/AIichl+k +so83zX5z/wCUw13/ALaF1/yffL8f0j3PS4foj7g/QbyN/wAcGP5j/k2meYuyZBirsVdirsVdirsV +fIX/ADmZ/wAp3on/AGyx/wBREudh7O/3Uv636A4+bmnv5Lj/AJBxpZ/yLj/qMkzK1X1n3/odJqv7 +w+5mZOVOOmvly5jtrwTyAlIzuFpXdSO9Mw9bjM4cI6uVpJiMrLK/8T2H++5fuX/mrNL/ACdk7x+P +g7b85DuLX+JbD/fcv3L/AM1Y/wAnZO8fj4L+ch3Fr/Elj/vuX7l/5qx/k7J3j8fBfzkO4tf4jsf9 +9y/cv/NWP8nZO8fj4L+ch3Fo+YrH/fcv3L/zVj/J2TvH4+C/nIdxW/4hsv5JPuX/AJqx/k7J3j8f +BfzkO4tfp+y/kk+5f+asf5Oyd4/HwX85DuLX6es/5JPuX/mrH+TsnePx8F/OQ7i1+nbP+ST7l/5q +x/k7J3j8fBfzkO4tfpy0/kk+5f64/wAnZO8fj4L+ch3Fr9N2n8kn3L/XH+TsnePx8F/OQ7i0datf +5JPuX+uP8nZO8fj4L+ch3Fb+mLX+R/uH9cf5Oyd4/HwX85DuLX6Xtv5H+4f1x/k7J3j8fBfzkO4t +fpa2/lf7h/XH+TsnePx8F/OQ7i0dVt/5X+4f1x/k7J3j8fBfzkO4tHVLf+V/uH9cf5Oyd4/HwX85 +DuKW6/dxz6XcKgYFY5DvT+Q++bDs7TSx5Bdbkfe4etzicNvN5sTnWPOojTN7+If63/ETleb6Cyhz +fNnnX/lMte/7aN3/AMn3y/H9I9z02H6B7g/QXyN/xwY/mP8Ak2meYuxZBirsVdirsVdirsVfIX/O +Zn/Kd6J/2yx/1ES52Hs7/dS/rfoDj5uaf/kyP+QZ6Uf8m4/6jJMytT/eH8dHS6r6z7mXk5W4rSyy +JXgxWvWhIxMQVEiOTjdXH+/X/wCCOPAO5eM9603Vz/v1/wDgjh4I9y8Z71pu7n/fz/8ABHDwR7kc +Z71pu7r/AH8//BH+uHw49y8cu9aby6/39J/wR/rh8OPcEccu9ab27/3/ACf8E39cPhx7gjjl3rTe +3f8Av+T/AINv64fDj3BfEl3rTfXn+/5P+Db+uHw49wR4ku8rTfXv/LRJ/wAG39cPhR7gviS7ytN/ +e/8ALRJ/wbf1w+FHuCPEl3ladQvv+WiX/g2/rh8KPcEeJLvK06hff8tMv/Bt/XD4Ue4L4ku8rTqN +/wD8tMv/AAbf1w+FDuCPEl3ladRv/wDlpl/4Nv64fBh3D5L4ku8rTqWof8tUv/Bt/XD4MO4fJHiy +7ytOp6h/y1Tf8jG/rh8GHcPkjxZd5aOp6j/y1Tf8jG/rh8GHcPkviy7ypvqN+6lWuZWVhRlLsQQe +xFcIwwHQfJByS7yhScta0Xo++pQj/W/4icq1H0Fnj+p82+d/+Uz1/wD7aN3/AMn3y7F9I9z02H6B +7g/QTyN/xwY/mP8Ak2meZOxZBirsVdirsVdirsVfIX/OZn/Kd6J/2yx/1ES52Hs7/dS/rfoDj5ub +IfybH/ILtJPtcf8AUZLmTqP70/jo6XVfWWVE5FxFpOFVpOFDCLz82fLtrdz2slteGSCRonKpFQlC +VNKyDbbLRjLLgKgfzh8tf8s17/wEX/VXD4ZXwytP5weWv+Wa9/4CL/qrjwFHhlo/m95b/wCWa8/4 +CL/qrh4Cvhlo/m75b/5Zrz/gIv8Aqrh4V8Mrf+Vt+XD/AMe15/wEX/VXCIFHhF3/ACtjy6f+Pa8/ +4CL/AKqZMYijwy1/ytXy8f8Aj3u/+Ai/6qZYNPJHhl3/ACtPy+f+Pe7/AOAj/wCqmTGll5I8Mtf8 +rQ0A/wDHvd/8BH/1UywaKfkjwy7/AJWboR/497r/AICP/qpkx2fPvCOAtf8AKytDP+6Lr/gI/wDq +pkx2bk7x+PgjgLY/MXRT0guf+Bj/AOa8P8nZO8fj4LwFseftIPSG4/4FP+a8f5Pn3j8fBHAUTY+b +dOvbqO2iimWSQkKXVQNhXejHwyGTSSiLNIMSE4JzGYLCcKFpOFCN0PfVYB/rf8QOU6n+7LZi+oPm +7zx/ymvmD/tpXn/J98uxfQPcHpsX0D3B+gfkb/jgx/Mf8m0zzJ2LIMVdirsVdirsVdir5C/5zM/5 +TvRP+2WP+oiXOw9nf7qX9b9AcfNzZF+To/5BVpB9rj/qMlzI1H98fx0dNq/qLJycXDWk4ULScKEq +/IbT7OTVvMty0S/Wm1BoRPQcxHVmKqT0BPXNL25M3EdKd52bEUS9s/RNv/O/3j+maC3Zu/RNv/O/ +3j+mNq79E2/87/eP6Y2rv0Tb/wA7/eP6Y2rv0Tb/AM7/AHj+mNq79E2/87/eP6Y2rv0Tb/zv94/p +jau/RNv/ADv94/pjau/RNv8Azv8AeP6Y2rv0Tb/zv94/pjau/RNv/O/3j+mNq80/PXTbMeUJmaMP +LbyQvBKwBZC8gRqEU6qc6L2YyyjqwAdpA38nA7RiDiJ7nzykeekEvOpz5cSmsWx9z/xE5jak+gsZ +cmeE5qWhaThQtJwqj/L2+sW4/wBf/iDZRq/7s/jq2YfqD5v89f8AKb+Yf+2nef8AUQ+W4foHuD02 +L6R7n6BeRv8Ajgx/Mf8AJtM8zdiyDFXYq7FXYq7FXYq+Qv8AnMz/AJTvRP8Atlj/AKiJc7D2d/up +f1v0Bx83Nkn5Pj/kEujn/mI/6jJcvz/35/HR02r+osjJyThLScKFhOSQgvyCamo+YR46o3/G2aHt +z6o+533Zv0l7pmhdk7FXYq7FXYq7FXYq7FXYq7FXYq8w/PPfytdr7wf8nRm/9m/8bj7pfc4PaP8A +cn4PntI89IJebTXQUpqlufc/8ROY+c+gsZcmZk5rWhaThVaThQmPlrfW7Yf6/wDybbMfWf3R/HVt +wfWHzh58/wCU58xf9tO8/wCoh8twfRH3B6fH9I9z9AfI3/HBj+Y/5NpnmbsGQYq7FXYq7FXYq7FX +yF/zmZ/yneif9ssf9REudh7O/wB1L+t+gOPm5sm/KEf8gh0Y+9x/1GTZdm/vz+OgdPrOZT8nLHAW +E5JC0nCqX/kO9NT8wf8AbUb/AI2zQ9ufVH3O+7N+kvdPUzQ07Jg/5n+a7ny3o9zq0CGY20cREHMx +hvUnEfUA9OVemZmh03jZRC6u/utpz5eCBl3PIv8AoY3V/wDq1j/pKf8A5ozoR7NxP8f2ftdf/KR/ +m/ay/wDLf81dQ826lcW0tsbQWypJyWZpOXJuNKELmu7U7JGliJCXFZ7nJ0ur8UkVVPZvUzR05rvU +xpXepjSu9TGld6mNK71MaV3qY0rzP8625eXrlf8AjB/ydGb32c/xuPul9zg9o/3J+DwdI89FJebT +PRkpqEJ9z+o5RmPpLCXJlJOYLStJwoWE4UJp5V31+1H/ABk/5NtmNrf7o/D727T/AFh84efv+U68 +x/8AbUvf+oh8swf3cfcHp8f0j3P0B8jf8cGP5j/k2meaOwZBirsVdirsVdirsVfIX/OZn/Kd6J/2 +yx/1ES52Hs7/AHUv636A4+bmyf8AKMf8gc0U/wCVcf8AUZNl2b/GD+OgdPrOZTsnLnXrScKrScKE +s/I1qanr3/bTb/jbND22PVH3O/7N+kvb/UzROyeYfny9fJmoj/iu2/6i0zbdiD/CofH/AHJcTW/3 +R+H3vmQDPQ4wefep/kEeOuah/wAYov8Ak5nOe1Eaxw/rH7nZdmfUfc+l/UziXcu9TFXepirvUxV3 +qYq71MVd6mKvOPzhblolwPaH/k5m79nv8aj7j9zgdo/3J+DxdI89BJebTDTEpeRH3P6jlOQ7MZck +/JzFaFhOFC0nCqbeUd/MVoP+Mn/Jpsxdf/cy+H3hu031h84/mB/ynnmT/tqXv/UQ+Waf+7j/AFR9 +z0+P6R7n6AeRv+ODH8x/ybTPNHYMgxV2KuxV2KuxV2KvkL/nMz/lO9E/7ZY/6iJc7D2d/upf1v0B +x83NlP5TD/kC+iH/AC7n/qMmy3L/AIzL8dA6jWcym5OZDrlpOFC0nChKfyUbjqmue+pN/wAbZpO3 +h6of1Xf9m/SXtXqZz9Oyeafnm9fKOoD/AIrt/wDqKXNz2CP8Lh/nf7kuJrv7o/D73zaFz0mMHnre +nfkWeOt33/GKP/k5nMe1kaxQ/rH7nZ9l/Ufc+j/UzhKdy71MaV3qY0rvUxpXepjSu9TGld6mNK8/ +/NduWlzL7Rf8nM3XYH+NR+P3OD2l/cn4PJEjzvSXmkbYpS4Q/wCfTKpnZjLkmpOUtC0nCq0nJITj +ybv5lsx/xk/5NPmH2h/cy+H3hv0394Hzl+YP/KfeZf8Atq3v/US+Waf+7j/VH3PTw+kPv/yN/wAc +GP5j/k2meaOwZBirsVdirsVdirsVfIX/ADmZ/wAp3on/AGyx/wBREudh7O/3Uv636A4+bmyv8qB/ +yBPRD/xZc/8AUZNlmT/GpfjoHUa1MycynWrScKFhOFUn/JxuOqa1/wBtJv8AjbNR7QD1Q/qu+7M+ +kvZfUznKdm83/Ox+XlW/H/Fdv/1Erm69nh/hkP8AO/3JcTXf3J+H3vncLnp8YvOPSvyUHDWL0+Mc +f/E85P2u/uof1j9ztOy/qPufQ3qZwVO6d6mNK71MaV3qY0rvUxpXepjSu9TGlYJ+ZjcrGUe0X/E8 +3HYX+Mx+P3OB2l/cn4PNEjzuSXmkVbpSRTlZLGXJFk5FpWk5JC0nChOvJG/miyH/ABl/5MvmF2l/ +cS+H3hyNL/eD8dHzn+Yf/Kf+Zv8AtrX3/US+T0391H+qPueoh9Iff3kb/jgx/Mf8m0zzVz2QYq7F +XYq7FXYq7FXyF/zmZ/yneif9ssf9REudh7O/3Uv636A4+bmyz8qv/JHaGf8Aiy5/6jJ8nk/xuXu/ +QHUa1MCczHWLCcKrScKEk/KN+Gqaz/20W/42zV+0Y3x/1Xfdl/SXr31gZzVO0Yv520E+YLSSwbms +EyIHkjKhgUk9Tbl8hmXodXLTZRliATG+fmKas2IZImJ6sFH5J2Q/3ddffF/TOh/0W5/5kPt/W4P8 +lw7ynvlX8v18vXbz25mkMoVX9QpQBWrtxAzV9pdsZNXERkAOHutyNPpI4iSDzei/WBmnpy3fWBjS +u+sDGld9YGNK76wMaV31gY0rvrAxpWGfmA4kt5B/kx/8Tzbdi/4wPj9zgdpf3J+DAkjztCXmldEp +vkbYy5Licm0LScKFhOFU98ib+a7H/nr/AMmXzB7T/wAXl8PvDkaT+8H46PnT8xf/ACYPmf8A7a19 +/wBRL5PTf3Uf6o+56iHIPv3yN/xwY/mP+TaZ5q57IMVdirsVdirsVdir5C/5zMB/x1oh7fosf9RE +udh7O/3Uv636A4+bmyz8qv8AyRuh07S3Ffb/AEyfJz/xuXu/QHUa3kjSczXWLScKFpOFDH/ywfhq +OsH/AJf2/W2a72lG+P8AqO+7L+kvT/rXvnMU7R31r3xpXfWvfGld9a98aV31r3xpXfWvfGld9a98 +aV31r3xpXfWvfGld9a98aV31r3xpWM+bpPUiYeyf8Szadj/4wPj9zg9pf3J+DFUjzsCXmVVkpGTg +id2MuSHJy9oWE4VWk4UJ95CqfNljQbD1a/8AIl8wO1P8Xl8PvDkaP+8H46PnX8xf/Jg+Z/8AtrX3 +/US+T0v91H+qPuephyD798jf8cGP5j/k2meaueyDFXYq7FXYq7FXYq+b/wDnMvyrcXGj6F5ngQtH +YSSWV6QK8VuOLxMfBQ8bLXxYZ0vs7nAlLGeu4+DTmHVif/OOXm+xvdGvfImoTiO5LvdaSXbZlIDS +RINt0ZfUp1ILeGbPtDGYTGUfF12pxcQZ/fafeWUhjuIytDQPT4W+Ry3FljMWC6acDHmhCcta1hOF +Uo/KW39fzBf2/X1dQYU/4LNf7UHfH/Ud92V9Je4/4U/yPwzkuN2tO/wp/kfhjxrTv8Kf5H4Y8a07 +/Cn+R+GPGtO/wp/kfhjxrTv8Kf5H4Y8a07/Cn+R+GPGtO/wp/kfhjxrTv8Kf5H4Y8a07/Cn+R+GP +GtO/wp/kfhjxrTz78wrH6lf/AFelKxI1Pmx/pm27GN5x8fucDtP+5PwYmkedcS8wuuEpbufb+OMD +6mMuSWE5ltK0nChyJJK4jjUu7bKqgkk+wGJIAsqBfJldi1p5F0G982+Yf3BjjMdlZsQsskjbqig/ +tvxoB2FSds0Wu1H5iQxY9+8u20OlINl82eV7HUPNvny1WWs1zqF4bm8cDqC5lmb2rvT3zK1mUYMB +PdGh9wd/AWafoD5TtzBo6L2LEj5ABf8AjXPPHLTjFXYq7FXYq7FXYql/mDQdL8waLeaLqsIuNPv4 +mhuIj3Vu4PZlO6nsd8sxZZY5CUeYQRb4V/NL8oPNv5a656pEs2kiX1NL1uDko+FqpzZf7qVdtvHd +Sc7vQ9o49TGuUusfxzDjTgQmOjf85K/mRp1klrMbLUymy3F5C5loBQAtDJCG+ZFfE4z7KxSN7j3O +OcUSj/8Aoaf8wf8Aq36T/wAibn/soyH8kYu+X2fqR4Ad/wBDT/mD/wBW/Sf+RNz/ANlGP8kYu+X2 +fqXwAoN/zkl5puryK6v9OtRJACIHsXmtXUk9SzvcfgBlObsSEuUiPfv+puxejkjP+hnPMn++bz/u +JS/9U8xv9Dw/n/7H9rd4rv8AoZzzJ/vm8/7iUv8A1Tx/0PD+f/sf2r4rv+hnPMn++bz/ALiUv/VP +H/Q8P5/+x/aviu/6Gc8yf75vP+4lL/1Tx/0PD+f/ALH9q+K7/oZzzJ/vm8/7iUv/AFTx/wBDw/n/ +AOx/aviu/wChnPMn++bz/uJS/wDVPH/Q8P5/+x/aviu/6Gc8yf75vP8AuJS/9U8f9Dw/n/7H9q+K +7/oZzzJ/vm8/7iUv/VPH/Q8P5/8Asf2r4rv+hnPMn++bz/uJS/8AVPH/AEPD+f8A7H9q+K7/AKGc +8yf75vP+4lL/ANU8f9Dw/n/7H9q+K7/oZzzJ/vm8/wC4lL/1Tx/0PD+f/sf2r4qEm/5yR8yi8jvr +awikvEBQyahNLdjgRSg4mBh1/mPyy7D2FCJ3kT7hX62vJLjFK3/Q0/5g/wDVv0n/AJE3P/ZRmT/J +GLvl9n6nH8AO/wChp/zB/wCrfpP/ACJuf+yjH+SMXfL7P1L4Ad/0NP8AmD/1b9J/5E3P/ZRj/JGL +vl9n6l8AO/6Gn/MH/q36T/yJuf8Asox/kjF3y+z9S+AGj/zlP+YJH/HP0ke/o3P/AGUY/wAkYu+X +2fqXwQwPXvM/nfz/AKxF9emm1O7qRa2cS0jiDHf040AVR0qx32+I5lxhi08L2iO9tjCtg+ifyJ/J +ubQF+u36q+tXajmRusEXXiD+vxNPAE8f2r2l+YlUfoH2+f6nKhCn0XBCkEKQxiiRgKv0ZqGxfirs +VdirsVdirsVdiqhfWFlf2slpewpcW0o4yQyKGVh7g4QSNwryzXP+cZ/yy1G4a4i0xIGY1McTyQrX +5RMo/wCFzYY+1tTAUJn40fvYHGEp/wChVPy+/wCWAf8ASXdf1yf8tar+f9kf1L4cXf8AQqn5ff8A +LAP+ku6/rj/LWq/n/ZH9S+HF3/Qqn5ff8sA/6S7r+uP8tar+f9kf1L4cXf8AQqn5ff8ALAP+ku6/ +rj/LWq/n/ZH9S+HF3/Qqn5ff8sA/6S7r+uP8tar+f9kf1L4cXf8AQqn5ff8ALAP+ku6/rj/LWq/n +/ZH9S+HF3/Qqn5ff8sA/6S7r+uP8tar+f9kf1L4cXf8AQqn5ff8ALAP+ku6/rj/LWq/n/ZH9S+HF +3/Qqn5ff8sA/6S7r+uP8tar+f9kf1L4cXf8AQqn5ff8ALAP+ku6/rj/LWq/n/ZH9S+HF3/Qqn5ff +8sA/6S7r+uP8tar+f9kf1L4cXf8AQqn5ff8ALAP+ku6/rj/LWq/n/ZH9S+HF3/Qqn5ff8sA/6S7r ++uP8tar+f9kf1L4cXf8AQqn5ff8ALAP+ku6/rj/LWq/n/ZH9S+HF3/Qqn5ff8sA/6S7r+uP8tar+ +f9kf1L4cXf8AQqn5ff8ALAP+ku6/rj/LWq/n/ZH9S+HF3/Qqn5ff8sA/6S7r+uP8tar+f9kf1L4c +Xf8AQqn5ff8ALAP+ku6/rj/LWq/n/ZH9S+HF3/Qqn5ff8sA/6S7r+uP8tar+f9kf1L4cW1/5xW/L +9WDCwWo33urkj7icT2zqv5/2R/UvhxZl5Z/KLy9oKcLG1t7RduRgT42p4sQN/c5g5tRkym5yMmQA +DNrOytrSL04E4j9o9ST7nKUq+KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K +uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku +xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux +V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//2Q== + + + + + + +uuid:f3c53255-be8a-4b04-817b-695bf2c54c8b + + + +image/svg+xml + + + +filesave.ai + + + + + + end='w' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PPOCRLabel/resources/icons/undo-cross.png b/PPOCRLabel/resources/icons/undo-cross.png new file mode 100644 index 0000000000000000000000000000000000000000..7d57dcbd0f63427cd0de28a6108660e366b984e5 Binary files /dev/null and b/PPOCRLabel/resources/icons/undo-cross.png differ diff --git a/PPOCRLabel/resources/icons/undo.png b/PPOCRLabel/resources/icons/undo.png new file mode 100644 index 0000000000000000000000000000000000000000..b2ac62bc03f106a5c6bac3a43d51e45c9a1402f4 Binary files /dev/null and b/PPOCRLabel/resources/icons/undo.png differ diff --git a/PPOCRLabel/resources/icons/verify.png b/PPOCRLabel/resources/icons/verify.png new file mode 100644 index 0000000000000000000000000000000000000000..3f4a3b5fd827e4211c8f471aa04834301c71f141 Binary files /dev/null and b/PPOCRLabel/resources/icons/verify.png differ diff --git a/PPOCRLabel/resources/icons/zoom-in.png b/PPOCRLabel/resources/icons/zoom-in.png new file mode 100644 index 0000000000000000000000000000000000000000..1ac4864d4a0c95a022e19ef38b4544711de39f1e Binary files /dev/null and b/PPOCRLabel/resources/icons/zoom-in.png differ diff --git a/PPOCRLabel/resources/icons/zoom-out.png b/PPOCRLabel/resources/icons/zoom-out.png new file mode 100644 index 0000000000000000000000000000000000000000..d67a87de533e307cb0e95ab2623259d98eb1adae Binary files /dev/null and b/PPOCRLabel/resources/icons/zoom-out.png differ diff --git a/PPOCRLabel/resources/icons/zoom.png b/PPOCRLabel/resources/icons/zoom.png new file mode 100644 index 0000000000000000000000000000000000000000..8265f27840a14b4b275086df67af01c73a3a8420 Binary files /dev/null and b/PPOCRLabel/resources/icons/zoom.png differ diff --git a/PPOCRLabel/resources/strings/strings-zh-CN.properties b/PPOCRLabel/resources/strings/strings-zh-CN.properties new file mode 100644 index 0000000000000000000000000000000000000000..e462fbf1582f6617452e8b896b404197df5d53cb --- /dev/null +++ b/PPOCRLabel/resources/strings/strings-zh-CN.properties @@ -0,0 +1,90 @@ +saveAsDetail=將标签保存到其他文件 +changeSaveDir=改变存放目录 +openFile=打开文件 +shapeLineColorDetail=更改线条颜色 +resetAll=重置界面与保存地址 +crtBox=矩形标注 +crtBoxDetail=创建一个新的区块 +dupBoxDetail=复制区块 +verifyImg=验证图像 +zoominDetail=放大 +verifyImgDetail=验证图像 +saveDetail=保存标签文件 +openFileDetail=打开图像文件 +fitWidthDetail=调整宽度适应到窗口宽度 +tutorial=PaddleOCR地址 +editLabel=编辑标签 +openAnnotationDetail=打开标签文件 +quit=退出 +shapeFillColorDetail=更改填充颜色 +closeCurDetail=关闭当前文件 +closeCur=关闭文件 +deleteImg=删除图像 +deleteImgDetail=删除当前图像 +fitWin=调整到窗口大小 +delBox=删除选择的区块 +boxLineColorDetail=选择线框颜色 +originalsize=原始大小 +resetAllDetail=重置所有设定 +zoomoutDetail=放大画面 +save=保存 +saveAs=另存为 +fitWinDetail=缩放到当前窗口大小 +openDir=打开目录 +copyPrevBounding=复制当前图像中的上一个边界框 +showHide=显示/隐藏标签 +changeSaveFormat=更改存储格式 +shapeFillColor=填充颜色 +quitApp=退出程序 +dupBox=复制区块 +delBoxDetail=删除区块 +zoomin=放大画面 +info=信息 +openAnnotation=开启标签 +prevImgDetail=上一个图像 +fitWidth=缩放到跟当前画面一样宽 +zoomout=缩小画面 +changeSavedAnnotationDir=更改保存标签文件的预设目录 +nextImgDetail=下一个图像 +originalsizeDetail=放大到原始大小 +prevImg=上一张 +tutorialDetail=显示示范内容 +shapeLineColor=形状线条颜色 +boxLineColor=区块线条颜色 +editLabelDetail=修改当前所选的区块颜色 +nextImg=下一张 +useDefaultLabel=使用预设标签 +useDifficult=有难度的 +boxLabelText=区块的标签 +labels=标签 +autoSaveMode=自动保存模式 +singleClsMode=单一类别模式 +displayLabel=显示类别 +fileList=文件列表 +files=文件 +advancedMode=专家模式 +advancedModeDetail=切换到专家模式 +showAllBoxDetail=显示所有区块 +hideAllBoxDetail=隐藏所有区块 +annoPanel=标注面板 +anno=标注 +addNewBbox=新框 +reLabel=重标注 +choosemodel=选择模型 +tipchoosemodel=选择OCR模型 +ImageResize=图片缩放 +IR=图片缩放 +autoRecognition=自动标注 +reRecognition=重新识别 +mfile=文件 +medit=编辑 +mview=视图 +mhelp=帮助 +iconList=缩略图 +detectionBoxposition=检测框位置 +recognitionResult=识别结果 +creatPolygon=四点标注 +drawSquares=正方形标注 +saveRec=保存识别结果 +tempLabel=待识别 +steps=操作步骤 \ No newline at end of file diff --git a/PPOCRLabel/resources/strings/strings-zh-TW.properties b/PPOCRLabel/resources/strings/strings-zh-TW.properties new file mode 100644 index 0000000000000000000000000000000000000000..c14eeb9b22b25adfd6a163a520f29410834e3a4d --- /dev/null +++ b/PPOCRLabel/resources/strings/strings-zh-TW.properties @@ -0,0 +1,70 @@ +saveAsDetail=將標籤保存到其他文件 +changeSaveDir=改變存放目錄 +openFile=開啟檔案 +shapeLineColorDetail=更改線條顏色 +resetAll=重置 +crtBox=創建區塊 +crtBoxDetail=畫一個區塊 +dupBoxDetail=複製區塊 +verifyImg=驗證圖像 +zoominDetail=放大 +verifyImgDetail=驗證圖像 +saveDetail=將標籤存到 +openFileDetail=打開圖像 +fitWidthDetail=調整到窗口寬度 +tutorial=YouTube教學 +editLabel=編輯標籤 +openAnnotationDetail=打開標籤文件 +quit=結束 +shapeFillColorDetail=更改填充顏色 +closeCurDetail=關閉目前檔案 +closeCur=關閉 +deleteImg=刪除圖像 +deleteImgDetail=刪除目前圖像 +fitWin=調整到跟窗口一樣大小 +delBox=刪除選取區塊 +boxLineColorDetail=選擇框線顏色 +originalsize=原始大小 +resetAllDetail=重設所有設定 +zoomoutDetail=畫面放大 +save=儲存 +saveAs=另存為 +fitWinDetail=縮放到窗口一樣 +openDir=開啟目錄 +copyPrevBounding=複製當前圖像中的上一個邊界框 +showHide=顯示/隱藏標籤 +changeSaveFormat=更改儲存格式 +shapeFillColor=填充顏色 +quitApp=離開本程式 +dupBox=複製區塊 +delBoxDetail=刪除區塊 +zoomin=放大畫面 +info=資訊 +openAnnotation=開啟標籤 +prevImgDetail=上一個圖像 +fitWidth=縮放到跟畫面一樣寬 +zoomout=縮小畫面 +changeSavedAnnotationDir=更改預設標籤存的目錄 +nextImgDetail=下一個圖像 +originalsizeDetail=放大到原始大小 +prevImg=上一個圖像 +tutorialDetail=顯示示範內容 +shapeLineColor=形狀線條顏色 +boxLineColor=日期分隔線顏色 +editLabelDetail=修改所選區塊的標籤 +nextImg=下一張圖片 +useDefaultLabel=使用預設標籤 +useDifficult=有難度的 +boxLabelText=區塊的標籤 +labels=標籤 +autoSaveMode=自動儲存模式 +singleClsMode=單一類別模式 +displayLabel=顯示類別 +fileList=檔案清單 +files=檔案 +iconList=XX +icon=XX +advancedMode=進階模式 +advancedModeDetail=切到進階模式 +showAllBoxDetail=顯示所有區塊 +hideAllBoxDetail=隱藏所有區塊 diff --git a/PPOCRLabel/resources/strings/strings.properties b/PPOCRLabel/resources/strings/strings.properties new file mode 100644 index 0000000000000000000000000000000000000000..c1f505153794f385adc0e4c7a63069baff5934b3 --- /dev/null +++ b/PPOCRLabel/resources/strings/strings.properties @@ -0,0 +1,90 @@ +openFile=Open +openFileDetail=Open image or label file +quit=Quit +quitApp=Quit application +openDir=Open Dir +copyPrevBounding=Copy previous Bounding Boxes in the current image +changeSavedAnnotationDir=Change default saved Annotation dir +openAnnotation=Open Annotation +openAnnotationDetail=Open an annotation file +changeSaveDir=Change Save Dir +nextImg=Next Image +nextImgDetail=Open the next Image +prevImg=Prev Image +prevImgDetail=Open the previous Image +verifyImg=Verify Image +verifyImgDetail=Verify Image +save=Save +saveDetail=Save the labels to a file +changeSaveFormat=Change save format +saveAs=Save As +saveAsDetail=Save the labels to a different file +closeCur=Close +closeCurDetail=Close the current file +deleteImg=Delete current image +deleteImgDetail=Delete the current image +resetAll=Reset Interface and Save Dir +resetAllDetail=Reset All +boxLineColor=Box Line Color +boxLineColorDetail=Choose Box line color +crtBox=Create RectBox +crtBoxDetail=Draw a new box +delBox=Delete RectBox +delBoxDetail=Remove the box +dupBox=Duplicate RectBox +dupBoxDetail=Create a duplicate of the selected box +tutorial=PaddleOCR url +tutorialDetail=Show demo +info=Information +zoomin=Zoom In +zoominDetail=Increase zoom level +zoomout=Zoom Out +zoomoutDetail=Decrease zoom level +originalsize=Original size +originalsizeDetail=Zoom to original size +fitWin=Fit Window +fitWinDetail=Zoom follows window size +fitWidth=Fit Width +fitWidthDetail=Zoom follows window width +editLabel=Edit Label +editLabelDetail=Modify the label of the selected Box +shapeLineColor=Shape Line Color +shapeLineColorDetail=Change the line color for this specific shape +shapeFillColor=Shape Fill Color +shapeFillColorDetail=Change the fill color for this specific shape +showHide=Show/Hide Label Panel +useDefaultLabel=Use default label +useDifficult=Difficult +boxLabelText=Box Labels +labels=Labels +autoSaveMode=Auto Save mode +singleClsMode=Single Class Mode +displayLabel=Display Labels +fileList=File List +files=Files +advancedMode=Advanced Mode +advancedModeDetail=Swtich to advanced mode +showAllBoxDetail=Show all bounding boxes +hideAllBoxDetail=Hide all bounding boxes +annoPanel=anno Panel +anno=anno +addNewBbox=new bbox +reLabel=reLabel +choosemodel=Choose OCR model +tipchoosemodel=Choose OCR model from dir +ImageResize=Image Resize +IR=Image Resize +autoRecognition=Auto Recognition +reRecognition=Re-recognition +mfile=file +medit=eidt +mview=view +mhelp=help +iconList=Icon List +detectionBoxposition=Detection box position +recognitionResult=Recognition result +creatPolygon=Create Quadrilateral +drawSquares=Draw Squares +saveRec=Save Recognition Result +tempLabel=TEMPORARY +setps=Steps \ No newline at end of file diff --git a/PPOCRLabel/setup.cfg b/PPOCRLabel/setup.cfg new file mode 100644 index 0000000000000000000000000000000000000000..3b273b63db2b4485f8a0c33df53004f0d960b87b --- /dev/null +++ b/PPOCRLabel/setup.cfg @@ -0,0 +1,8 @@ +[bumpversion] +commit = True +tag = True + +[bumpversion:file:setup.py] + +[bdist_wheel] +universal = 1 diff --git a/PPOCRLabel/setup.py b/PPOCRLabel/setup.py new file mode 100644 index 0000000000000000000000000000000000000000..008514fd7777713eb76f900f5ea15a4366517dd8 --- /dev/null +++ b/PPOCRLabel/setup.py @@ -0,0 +1,139 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from setuptools import setup, find_packages, Command +from sys import platform as _platform +from shutil import rmtree +import sys +import os + +here = os.path.abspath(os.path.dirname(__file__)) +NAME = 'labelImg' +REQUIRES_PYTHON = '>=3.0.0' +REQUIRED_DEP = ['pyqt5', 'lxml'] +about = {} + +with open(os.path.join(here, 'libs', '__init__.py')) as f: + exec(f.read(), about) + +with open('README.rst') as readme_file: + readme = readme_file.read() + +with open('HISTORY.rst') as history_file: + history = history_file.read() + + +# OS specific settings +SET_REQUIRES = [] +if _platform == "linux" or _platform == "linux2": + # linux + print('linux') +elif _platform == "darwin": + # MAC OS X + SET_REQUIRES.append('py2app') + +required_packages = find_packages() +required_packages.append('labelImg') + +APP = [NAME + '.py'] +OPTIONS = { + 'argv_emulation': True, + 'iconfile': 'resources/icons/app.icns' +} + +class UploadCommand(Command): + """Support setup.py upload.""" + + description=readme + '\n\n' + history, + + user_options = [] + + @staticmethod + def status(s): + """Prints things in bold.""" + print('\033[1m{0}\033[0m'.format(s)) + + def initialize_options(self): + pass + + def finalize_options(self): + pass + + def run(self): + try: + self.status('Removing previous builds…') + rmtree(os.path.join(here, 'dist')) + except OSError: + self.status('Fail to remove previous builds..') + pass + + self.status('Building Source and Wheel (universal) distribution…') + os.system( + '{0} setup.py sdist bdist_wheel --universal'.format(sys.executable)) + + self.status('Uploading the package to PyPI via Twine…') + os.system('twine upload dist/*') + + self.status('Pushing git tags…') + os.system('git tag -d v{0}'.format(about['__version__'])) + os.system('git tag v{0}'.format(about['__version__'])) + # os.system('git push --tags') + + sys.exit() + + +setup( + app=APP, + name=NAME, + version=about['__version__'], + description="LabelImg is a graphical image annotation tool and label object bounding boxes in images", + long_description=readme + '\n\n' + history, + author="TzuTa Lin", + author_email='tzu.ta.lin@gmail.com', + url='https://github.com/tzutalin/labelImg', + python_requires=REQUIRES_PYTHON, + package_dir={'labelImg': '.'}, + packages=required_packages, + entry_points={ + 'console_scripts': [ + 'labelImg=labelImg.labelImg:main' + ] + }, + include_package_data=True, + install_requires=REQUIRED_DEP, + license="MIT license", + zip_safe=False, + keywords='labelImg labelTool development annotation deeplearning', + classifiers=[ + 'Development Status :: 5 - Production/Stable', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: MIT License', + 'Natural Language :: English', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + ], + package_data={'data/predefined_classes.txt': ['data/predefined_classes.txt']}, + options={'py2app': OPTIONS}, + setup_requires=SET_REQUIRES, + # $ setup.py publish support. + cmdclass={ + 'upload': UploadCommand, + } +) diff --git a/README.md b/README.md index 1d0320f6d3e8053238cd20d6e9962308c5125f06..6c0d0828e4c7f6ea442696769b758020b3378cf8 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,14 @@ English | [简体中文](README_ch.md) ## Introduction -PaddleOCR aims to create rich, leading, and practical OCR tools that help users train better models and apply them into practice. +PaddleOCR aims to create multilingual, awesome, leading, and practical OCR tools that help users train better models and apply them into practice. **Recent updates** - -- 2020.9.19 Update the ultra lightweight compressed ppocr_mobile_slim series models, the overall model size is 3.5M (see [PP-OCR Pipline](#PP-OCR)), suitable for mobile deployment. [Model Downloads](#Supported-Chinese-model-list) +- 2020.9.22 Update the PP-OCR technical article, https://arxiv.org/abs/2009.09941 +- 2020.9.19 Update the ultra lightweight compressed ppocr_mobile_slim series models, the overall model size is 3.5M (see [PP-OCR Pipeline](#PP-OCR-Pipeline)), suitable for mobile deployment. [Model Downloads](#Supported-Chinese-model-list) - 2020.9.17 Update the ultra lightweight ppocr_mobile series and general ppocr_server series Chinese and English ocr models, which are comparable to commercial effects. [Model Downloads](#Supported-Chinese-model-list) -- 2020.8.24 Support the use of PaddleOCR through whl package installation,pelease refer [PaddleOCR Package](./doc/doc_en/whl_en.md) +- 2020.9.17 update [English recognition model](./doc/doc_en/models_list_en.md#english-recognition-model) and [Multilingual recognition model](doc/doc_en/models_list_en.md#english-recognition-model), `English`, `Chinese`, `German`, `French`, `Japanese` and `Korean` have been supported. Models for more languages will continue to be updated. +- 2020.8.24 Support the use of PaddleOCR through whl package installation,please refer [PaddleOCR Package](./doc/doc_en/whl_en.md) - 2020.8.21 Update the replay and PPT of the live lesson at Bilibili on August 18, lesson 2, easy to learn and use OCR tool spree. [Get Address](https://aistudio.baidu.com/aistudio/education/group/info/1519) - [more](./doc/doc_en/update_en.md) @@ -29,7 +30,16 @@ PaddleOCR aims to create rich, leading, and practical OCR tools that help users -The above picture is the effect display of the general ppocr_server model. For more effect pictures, please see [More visualization](./doc/doc_en/visualization_en.md). +The above pictures are the visualizations of the general ppocr_server model. For more effect pictures, please see [More visualizations](./doc/doc_en/visualization_en.md). + + +## Community +- Scan the QR code below with your Wechat, you can access to official technical exchange group. Look forward to your participation. + +
+ +
+ ## Quick Experience @@ -49,14 +59,19 @@ Mobile DEMO experience (based on EasyEdge and Paddle-Lite, supports iOS and Andr ## PP-OCR 1.1 series model list(Update on Sep 17) -| Model introduction | Model name | Recommended scene | Detection model | Direction classifier | Recognition model | | -| ------------------------------------------------------------ | ---------------------------- | ----------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ---- | -| Chinese and English ultra-lightweight OCR model (8.1M) | ch_ppocr_mobile_v1.1_xx | Mobile & server | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_pre.tar) | | -| Chinese and English general OCR model (155.1M) | ch_ppocr_server_v1.1_xx | Server | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_pre.tar) | | -| Chinese and English ultra-lightweight compressed OCR model (3.5M) | ch_ppocr_mobile_slim_v1.1_xx | Mobile | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/det/ch_ppocr_mobile_v1.1_det_prune_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/det/ch_ppocr_mobile_v1.1_det_prune_opt.nb) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/rec/ch_ppocr_mobile_v1.1_rec_quant_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/rec/ch_ppocr_mobile_v1.1_rec_quant_opt.nb) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_quant_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_cls_quant_opt.nb) | | +| Model introduction | Model name | Recommended scene | Detection model | Direction classifier | Recognition model | +| ------------------------------------------------------------ | ---------------------------- | ----------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | +| Chinese and English ultra-lightweight OCR model (8.1M) | ch_ppocr_mobile_v1.1_xx | Mobile & server | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_pre.tar) | +| Chinese and English general OCR model (155.1M) | ch_ppocr_server_v1.1_xx | Server | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_pre.tar) | +| Chinese and English ultra-lightweight compressed OCR model (3.5M) | ch_ppocr_mobile_slim_v1.1_xx | Mobile | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/det/ch_ppocr_mobile_v1.1_det_prune_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_det_prune_opt.nb) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_quant_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_cls_quant_opt.nb) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/rec/ch_ppocr_mobile_v1.1_rec_quant_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_rec_quant_opt.nb) | +| French ultra-lightweight OCR model (4.6M) | french_ppocr_mobile_v1.1_xx | Mobile & server | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar) | - | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/fr/french_ppocr_mobile_v1.1_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/fr/french_ppocr_mobile_v1.1_rec_train.tar) | +| German ultra-lightweight OCR model (4.6M) | german_ppocr_mobile_v1.1_xx | Mobile & server | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar) | - |[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/ge/german_ppocr_mobile_v1.1_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/ge/german_ppocr_mobile_v1.1_rec_train.tar) | +| Korean ultra-lightweight OCR model (5.9M) | korean_ppocr_mobile_v1.1_xx | Mobile & server | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar) | - |[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/kr/korean_ppocr_mobile_v1.1_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/kr/korean_ppocr_mobile_v1.1_rec_train.tar)| +| Japan ultra-lightweight OCR model (6.2M) | japan_ppocr_mobile_v1.1_xx | Mobile & server | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar) | - |[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/jp/japan_ppocr_mobile_v1.1_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/jp/japan_ppocr_mobile_v1.1_rec_train.tar) | -For more model downloads (including multiple languages), please refer to [PP-OCR v1.1 series model downloads](./doc/doc_en/models_list_en.md) +For more model downloads (including multiple languages), please refer to [PP-OCR v1.1 series model downloads](./doc/doc_en/models_list_en.md). +For a new language request, please refer to [Guideline for new language_requests](#language_requests). ## Tutorials - [Installation](./doc/doc_en/installation_en.md) @@ -65,10 +80,11 @@ For more model downloads (including multiple languages), please refer to [PP-OCR - Algorithm introduction - [Text Detection Algorithm](./doc/doc_en/algorithm_overview_en.md) - [Text Recognition Algorithm](./doc/doc_en/algorithm_overview_en.md) - - [PP-OCR Pipline](#PP-OCR-Pipline) + - [PP-OCR Pipeline](#PP-OCR-Pipeline) - Model training/evaluation - [Text Detection](./doc/doc_en/detection_en.md) - [Text Recognition](./doc/doc_en/recognition_en.md) + - [Direction Classification](./doc/doc_en/angle_class_en.md) - [Yml Configuration](./doc/doc_en/config_en.md) - Inference and Deployment - [Quick inference based on pip](./doc/doc_en/whl_en.md) @@ -86,41 +102,64 @@ For more model downloads (including multiple languages), please refer to [PP-OCR - [Data Annotation Tools](./doc/doc_en/data_annotation_en.md) - [Data Synthesis Tools](./doc/doc_en/data_synthesis_en.md) - [Visualization](#Visualization) +- [New language requests](#language_requests) - [FAQ](./doc/doc_en/FAQ_en.md) - [Community](#Community) - [References](./doc/doc_en/reference_en.md) - [License](#LICENSE) - [Contribution](#CONTRIBUTION) - + -## PP-OCR Pipline +## PP-OCR Pipeline
-PP-OCR is a practical ultra-lightweight OCR system. It is mainly composed of three parts: DB text detection, detection frame correction and CRNN text recognition. The system adopts 19 effective strategies from 8 aspects including backbone network selection and adjustment, prediction head design, data augmentation, learning rate transformation strategy, regularization parameter selection, pre-training model use, and automatic model tailoring and quantization to optimize and slim down the models of each module. The final results are an ultra-lightweight Chinese and English OCR model with an overall size of 3.5M and a 2.8M English digital OCR model. For more details, please refer to the PP-OCR technical article (Arxiv article link is being generated). +PP-OCR is a practical ultra-lightweight OCR system. It is mainly composed of three parts: DB text detection, detection frame correction and CRNN text recognition. The system adopts 19 effective strategies from 8 aspects including backbone network selection and adjustment, prediction head design, data augmentation, learning rate transformation strategy, regularization parameter selection, pre-training model use, and automatic model tailoring and quantization to optimize and slim down the models of each module. The final results are an ultra-lightweight Chinese and English OCR model with an overall size of 3.5M and a 2.8M English digital OCR model. For more details, please refer to the PP-OCR technical article (https://arxiv.org/abs/2009.09941). Besides, The implementation of the FPGM Pruner and PACT quantization is based on [PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim). -## Visualization [more](./doc/doc_en/visualization_en.md) + +## Visualization [more](./doc/doc_en/visualization_en.md) +- Chinese OCR model
- -
- -## Community -Scan the QR code below with your Wechat and completing the questionnaire, you can access to offical technical exchange group. +- English OCR model +
+ +
+- Multilingual OCR model
- + +
+ + +## Guideline for new language requests + +If you want to request a new language support, a PR with 2 following files are needed: + +1. In folder [ppocr/utils/dict](https://github.com/PaddlePaddle/PaddleOCR/tree/develop/ppocr/utils/dict), +it is necessary to submit the dict text to this path and name it with `{language}_dict.txt` that contains a list of all characters. Please see the format example from other files in that folder. + +2. In folder [ppocr/utils/corpus](https://github.com/PaddlePaddle/PaddleOCR/tree/develop/ppocr/utils/corpus), +it is necessary to submit the corpus to this path and name it with `{language}_corpus.txt` that contains a list of words in your language. +Maybe, 50000 words per language is necessary at least. +Of course, the more, the better. + +If your language has unique elements, please tell me in advance within any way, such as useful links, wikipedia and so on. + +More details, please refer to [Multilingual OCR Development Plan](https://github.com/PaddlePaddle/PaddleOCR/issues/1048). + + ## License This project is released under Apache 2.0 license @@ -136,3 +175,5 @@ We welcome all the contributions to PaddleOCR and appreciate for your feedback v - Thanks [authorfu](https://github.com/authorfu) for contributing Android demo and [xiadeye](https://github.com/xiadeye) contributing iOS demo, respectively. - Thanks [BeyondYourself](https://github.com/BeyondYourself) for contributing many great suggestions and simplifying part of the code style. - Thanks [tangmq](https://gitee.com/tangmq) for contributing Dockerized deployment services to PaddleOCR and supporting the rapid release of callable Restful API services. +- Thanks [lijinhan](https://github.com/lijinhan) for contributing a new way, i.e., java SpringBoot, to achieve the request for the Hubserving deployment. +- Thanks [Mejans](https://github.com/Mejans) for contributing the Occitan corpus and character set. diff --git a/README_ch.md b/README_ch.md index 27d5da04bbc6d7ef71240a62c4cafeb0c3d0e2b9..6806ab6662ef8e9bb195cf97f7fe3bd87f3d7e73 100644 --- a/README_ch.md +++ b/README_ch.md @@ -4,17 +4,19 @@ PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力使用者训练出更好的模型,并应用落地。 **近期更新** -- 2020.9.19 更新超轻量压缩ppocr_mobile_slim系列模型,整体模型3.5M(详见[PP-OCR Pipline](#PP-OCR)),适合在移动端部署使用。[模型下载](#模型下载) +- 2020.11.25 更新半自动标注工具[PPOCRLabel](./PPOCRLabel/README.md),辅助开发者高效完成标注任务,输出格式与PP-OCR训练任务完美衔接。 +- 2020.11.16 [FAQ](./doc/doc_ch/FAQ.md)新增5个高频问题,共计109个常见问题及解答,并且计划以后每周一都会更新,欢迎大家持续关注。 +- 2020.9.22 更新PP-OCR技术文章,https://arxiv.org/abs/2009.09941 +- 2020.9.19 更新超轻量压缩ppocr_mobile_slim系列模型,整体模型3.5M(详见[PP-OCR Pipeline](#PP-OCR)),适合在移动端部署使用。[模型下载](#模型下载) - 2020.9.17 更新超轻量ppocr_mobile系列和通用ppocr_server系列中英文ocr模型,媲美商业效果。[模型下载](#模型下载) -- 2020.8.26 更新OCR相关的84个常见问题及解答,具体参考[FAQ](./doc/doc_ch/FAQ.md) +- 2020.9.17 更新[英文识别模型](./doc/doc_ch/models_list.md#英文识别模型)和[多语言识别模型](doc/doc_ch/models_list.md#多语言识别模型),已支持`德语、法语、日语、韩语`,更多语种识别模型将持续更新。 - 2020.8.24 支持通过whl包安装使用PaddleOCR,具体参考[Paddleocr Package使用说明](./doc/doc_ch/whl.md) - 2020.8.21 更新8月18日B站直播课回放和PPT,课节2,易学易用的OCR工具大礼包,[获取地址](https://aistudio.baidu.com/aistudio/education/group/info/1519) - [More](./doc/doc_ch/update.md) - ## 特性 -- PPOCR系列高质量预训练模型,媲美商业效果 +- PPOCR系列高质量预训练模型,准确的识别效果 - 超轻量ppocr_mobile移动端系列:检测(2.6M)+方向分类器(0.9M)+ 识别(4.6M)= 8.1M - 通用ppocr_server系列:检测(47.2M)+方向分类器(0.9M)+ 识别(107M)= 155.1M - 超轻量压缩ppocr_mobile_slim系列:检测(1.4M)+方向分类器(0.5M)+ 识别(1.6M)= 3.5M @@ -33,6 +35,15 @@ PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力 上图是通用ppocr_server模型效果展示,更多效果图请见[效果展示页面](./doc/doc_ch/visualization.md)。 + +## 欢迎加入PaddleOCR技术交流群 +- 微信扫描二维码加入官方交流群,获得更高效的问题答疑,与各行各业开发者充分交流,期待您的加入。 + +
+ +
+ + ## 快速体验 - PC端:超轻量级中文OCR在线体验地址:https://www.paddlepaddle.org.cn/hub/scene/ocr @@ -43,16 +54,16 @@ PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力 -- 代码体验:从[快速安装](./doc/doc_ch/installation.md) 开始 +- 代码体验:[中文OCR模型快速使用](./doc/doc_ch/quickstart.md) ## PP-OCR 1.1系列模型列表(9月17日更新) -| 模型简介 | 模型名称 |推荐场景 | 检测模型 | 方向分类器 | 识别模型 | | -| ------------ | --------------- | ----------------|---- | ---------- | -------- | ---- | -| 中英文超轻量OCR模型(8.1M) | ch_ppocr_mobile_v1.1_xx |移动端&服务器端|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar)|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar) |[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_pre.tar) | | -| 中英文通用OCR模型(155.1M) |ch_ppocr_server_v1.1_xx|服务器端 |[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_train.tar) |[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar) |[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_pre.tar) | | -| 中英文超轻量压缩OCR模型(3.5M) | ch_ppocr_mobile_slim_v1.1_xx| 移动端 |[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/det/ch_ppocr_mobile_v1.1_det_prune_infer.tar) / [slim模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/det/ch_ppocr_mobile_v1.1_det_prune_opt.nb) |[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/rec/ch_ppocr_mobile_v1.1_rec_quant_infer.tar) / [slim模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/rec/ch_ppocr_mobile_v1.1_rec_quant_opt.nb)|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_quant_infer.tar) / [slim模型](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_cls_quant_opt.nb)| | || +| 模型简介 | 模型名称 |推荐场景 | 检测模型 | 方向分类器 | 识别模型 | +| ------------ | --------------- | ----------------|---- | ---------- | -------- | +| 中英文超轻量OCR模型(8.1M) | ch_ppocr_mobile_v1.1_xx |移动端&服务器端|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar)|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar) |[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_pre.tar) | +| 中英文通用OCR模型(155.1M) |ch_ppocr_server_v1.1_xx|服务器端 |[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_train.tar) |[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar) |[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_pre.tar) | +| 中英文超轻量压缩OCR模型(3.5M) | ch_ppocr_mobile_slim_v1.1_xx| 移动端 |[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/det/ch_ppocr_mobile_v1.1_det_prune_infer.tar) / [slim模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_det_prune_opt.nb) |[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_quant_infer.tar) / [slim模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_cls_quant_opt.nb)| [推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/rec/ch_ppocr_mobile_v1.1_rec_quant_infer.tar) / [slim模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_rec_quant_opt.nb)| 更多模型下载(包括多语言),可以参考[PP-OCR v1.1 系列模型下载](./doc/doc_ch/models_list.md) @@ -63,10 +74,11 @@ PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力 - 算法介绍 - [文本检测](./doc/doc_ch/algorithm_overview.md) - [文本识别](./doc/doc_ch/algorithm_overview.md) - - [PP-OCR Pipline](#PP-OCR) + - [PP-OCR Pipeline](#PP-OCR) - 模型训练/评估 - [文本检测](./doc/doc_ch/detection.md) - [文本识别](./doc/doc_ch/recognition.md) + - [方向分类器](./doc/doc_ch/angle_class.md) - [yml参数配置文件介绍](./doc/doc_ch/config.md) - 预测部署 - [基于pip安装whl包快速推理](./doc/doc_ch/whl.md) @@ -75,54 +87,57 @@ PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力 - [服务化部署](./deploy/hubserving/readme.md) - [端侧部署](./deploy/lite/readme.md) - [模型量化](./deploy/slim/quantization/README.md) - - [模型裁剪](./deploy/slim/prune/README_ch.md) + - [模型裁剪](./deploy/slim/prune/README.md) - [Benchmark](./doc/doc_ch/benchmark.md) +- 数据标注与合成 + - [半自动标注工具 PPOCRLabel](./PPOCRLabel/README.md) + - [常用数据标注工具](./doc/doc_ch/data_annotation.md) + - [常用数据合成工具](./doc/doc_ch/data_synthesis.md) - 数据集 - [通用中英文OCR数据集](./doc/doc_ch/datasets.md) - [手写中文OCR数据集](./doc/doc_ch/handwritten_datasets.md) - - [垂类多语言OCR数据集](./doc/doc_ch/vertical_and_multilingual_datasets.md) - - [常用数据标注工具](./doc/doc_ch/data_annotation.md) - - [常用数据合成工具](./doc/doc_ch/data_synthesis.md) + - [垂类多语言OCR数据集](./doc/doc_ch/vertical_and_multilingual_datasets.md) - [效果展示](#效果展示) - FAQ - [【精选】OCR精选10个问题](./doc/doc_ch/FAQ.md) - - [【理论篇】OCR通用21个问题](./doc/doc_ch/FAQ.md) - - [【实战篇】PaddleOCR实战53个问题](./doc/doc_ch/FAQ.md) + - [【理论篇】OCR通用27个问题](./doc/doc_ch/FAQ.md) + - [【实战篇】PaddleOCR实战72个问题](./doc/doc_ch/FAQ.md) - [技术交流群](#欢迎加入PaddleOCR技术交流群) - [参考文献](./doc/doc_ch/reference.md) - [许可证书](#许可证书) - [贡献代码](#贡献代码) -## PP-OCR Pipline +## PP-OCR Pipeline
-PP-OCR是一个实用的超轻量OCR系统。主要由DB文本检测、检测框矫正和CRNN文本识别三部分组成。该系统从骨干网络选择和调整、预测头部的设计、数据增强、学习率变换策略、正则化参数选择、预训练模型使用以及模型自动裁剪量化8个方面,采用19个有效策略,对各个模块的模型进行效果调优和瘦身,最终得到整体大小为3.5M的超轻量中英文OCR和2.8M的英文数字OCR。更多细节请参考PP-OCR技术文章(Arxiv文章链接生成中)。 - +PP-OCR是一个实用的超轻量OCR系统。主要由DB文本检测、检测框矫正和CRNN文本识别三部分组成。该系统从骨干网络选择和调整、预测头部的设计、数据增强、学习率变换策略、正则化参数选择、预训练模型使用以及模型自动裁剪量化8个方面,采用19个有效策略,对各个模块的模型进行效果调优和瘦身,最终得到整体大小为3.5M的超轻量中英文OCR和2.8M的英文数字OCR。更多细节请参考PP-OCR技术方案 https://arxiv.org/abs/2009.09941 。其中FPGM裁剪器和PACT量化的实现可以参考[PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim)。 ## 效果展示 [more](./doc/doc_ch/visualization.md) - +- 中文模型
- -
+- 英文模型 +
+ +
- -## 欢迎加入PaddleOCR技术交流群 -请扫描下面二维码,完成问卷填写,获取加群二维码和OCR方向的炼丹秘籍 - +- 其他语言模型
- + +
+ + ## 许可证书 本项目的发布受Apache 2.0 license许可认证。 @@ -138,3 +153,6 @@ PP-OCR是一个实用的超轻量OCR系统。主要由DB文本检测、检测框 - 非常感谢 [authorfu](https://github.com/authorfu) 贡献Android和[xiadeye](https://github.com/xiadeye) 贡献IOS的demo代码 - 非常感谢 [BeyondYourself](https://github.com/BeyondYourself) 给PaddleOCR提了很多非常棒的建议,并简化了PaddleOCR的部分代码风格。 - 非常感谢 [tangmq](https://gitee.com/tangmq) 给PaddleOCR增加Docker化部署服务,支持快速发布可调用的Restful API服务。 +- 非常感谢 [lijinhan](https://github.com/lijinhan) 给PaddleOCR增加java SpringBoot 调用OCR Hubserving接口完成对OCR服务化部署的使用。 +- 非常感谢 [Mejans](https://github.com/Mejans) 给PaddleOCR增加新语言奥克西坦语Occitan的字典和语料。 +- 非常感谢 [Evezerest](https://github.com/Evezerest), [ninetailskim](https://github.com/ninetailskim), [edencfc](https://github.com/edencfc), [BeyondYourself](https://github.com/BeyondYourself), [1084667371](https://github.com/1084667371) 贡献了PPOCRLabel的完整代码。 diff --git a/configs/det/det_db_icdar15_reader.yml b/configs/det/det_db_icdar15_reader.yml index 0f99257b53a366ccdb2521ca742198adfe3ff556..6c6833612ae3d56fbe1a23d80da24b00ab13ef3a 100755 --- a/configs/det/det_db_icdar15_reader.yml +++ b/configs/det/det_db_icdar15_reader.yml @@ -15,8 +15,6 @@ EvalReader: TestReader: reader_function: ppocr.data.det.dataset_traversal,EvalTestReader process_function: ppocr.data.det.db_process,DBProcessTest - infer_img: img_set_dir: ./train_data/icdar2015/text_localization/ label_file_path: ./train_data/icdar2015/text_localization/test_icdar2015_label.txt - test_image_shape: [736, 1280] do_eval: True diff --git a/configs/det/det_east_icdar15_reader.yml b/configs/det/det_east_icdar15_reader.yml index 060ed4dd380d0457574c1d20be3225c7fd188108..f2df30ca29115035bc6acb7c3d8d6b33498fa6c2 100755 --- a/configs/det/det_east_icdar15_reader.yml +++ b/configs/det/det_east_icdar15_reader.yml @@ -17,7 +17,6 @@ EvalReader: TestReader: reader_function: ppocr.data.det.dataset_traversal,EvalTestReader process_function: ppocr.data.det.east_process,EASTProcessTest - infer_img: img_set_dir: ./train_data/icdar2015/text_localization/ label_file_path: ./train_data/icdar2015/text_localization/test_icdar2015_label.txt do_eval: True diff --git a/configs/det/det_mv3_db.yml b/configs/det/det_mv3_db.yml index 5f67ca1db758069bb6d19276339895302604fd62..24443a8f2adfff29a17fa9ae527852ba7abc8143 100755 --- a/configs/det/det_mv3_db.yml +++ b/configs/det/det_mv3_db.yml @@ -16,6 +16,7 @@ Global: checkpoints: save_res_path: ./output/det_db/predicts_db.txt save_inference_dir: + infer_img: Architecture: function: ppocr.modeling.architectures.det_model,DetModel @@ -24,7 +25,6 @@ Backbone: function: ppocr.modeling.backbones.det_mobilenet_v3,MobileNetV3 scale: 0.5 model_name: large - disable_se: true Head: function: ppocr.modeling.heads.det_db_head,DBHead diff --git a/configs/det/det_mv3_db_v1.1.yml b/configs/det/det_mv3_db_v1.1.yml new file mode 100755 index 0000000000000000000000000000000000000000..3cd7e34e5aade2e91910164ba71a6a792c1b0e70 --- /dev/null +++ b/configs/det/det_mv3_db_v1.1.yml @@ -0,0 +1,60 @@ +Global: + algorithm: DB + use_gpu: true + epoch_num: 1200 + log_smooth_window: 20 + print_batch_step: 2 + save_model_dir: ./output/det_db/ + save_epoch_step: 200 + # evaluation is run every 5000 iterations after the 4000th iteration + eval_batch_step: [4000, 5000] + train_batch_size_per_card: 16 + test_batch_size_per_card: 16 + image_shape: [3, 640, 640] + reader_yml: ./configs/det/det_db_icdar15_reader.yml + pretrain_weights: ./pretrain_models/MobileNetV3_large_x0_5_pretrained/ + checkpoints: + save_res_path: ./output/det_db/predicts_db.txt + save_inference_dir: + infer_img: + +Architecture: + function: ppocr.modeling.architectures.det_model,DetModel + +Backbone: + function: ppocr.modeling.backbones.det_mobilenet_v3,MobileNetV3 + scale: 0.5 + model_name: large + disable_se: true + +Head: + function: ppocr.modeling.heads.det_db_head,DBHead + model_name: large + k: 50 + inner_channels: 96 + out_channels: 2 + +Loss: + function: ppocr.modeling.losses.det_db_loss,DBLoss + balance_loss: true + main_loss_type: DiceLoss + alpha: 5 + beta: 10 + ohem_ratio: 3 + +Optimizer: + function: ppocr.optimizer,AdamDecay + base_lr: 0.001 + beta1: 0.9 + beta2: 0.999 + decay: + function: cosine_decay_warmup + step_each_epoch: 16 + total_epoch: 1200 + +PostProcess: + function: ppocr.postprocess.db_postprocess,DBPostProcess + thresh: 0.3 + box_thresh: 0.6 + max_candidates: 1000 + unclip_ratio: 1.5 diff --git a/configs/det/det_mv3_east.yml b/configs/det/det_mv3_east.yml index 67b82fffff8c47e5ee5866ad22f238ece3822776..14f453c705e43076b6f27cb7127bb44d3f628587 100755 --- a/configs/det/det_mv3_east.yml +++ b/configs/det/det_mv3_east.yml @@ -15,6 +15,7 @@ Global: checkpoints: save_res_path: ./output/det_east/predicts_east.txt save_inference_dir: + infer_img: Architecture: function: ppocr.modeling.architectures.det_model,DetModel diff --git a/configs/det/det_r18_vd_db_v1.1.yml b/configs/det/det_r18_vd_db_v1.1.yml new file mode 100755 index 0000000000000000000000000000000000000000..c850599b0cd324fb078ab6e433cd0fb819733aba --- /dev/null +++ b/configs/det/det_r18_vd_db_v1.1.yml @@ -0,0 +1,58 @@ +Global: + algorithm: DB + use_gpu: true + epoch_num: 1200 + log_smooth_window: 20 + print_batch_step: 2 + save_model_dir: ./output/det_r_18_vd_db/ + save_epoch_step: 200 + eval_batch_step: [3000, 2000] + train_batch_size_per_card: 8 + test_batch_size_per_card: 1 + image_shape: [3, 640, 640] + reader_yml: ./configs/det/det_db_icdar15_reader.yml + pretrain_weights: ./pretrain_models/ResNet18_vd_pretrained/ + save_res_path: ./output/det_r18_vd_db/predicts_db.txt + checkpoints: + save_inference_dir: + infer_img: + +Architecture: + function: ppocr.modeling.architectures.det_model,DetModel + +Backbone: + function: ppocr.modeling.backbones.det_resnet_vd,ResNet + layers: 18 + +Head: + function: ppocr.modeling.heads.det_db_head,DBHead + model_name: large + k: 50 + inner_channels: 256 + out_channels: 2 + +Loss: + function: ppocr.modeling.losses.det_db_loss,DBLoss + balance_loss: true + main_loss_type: DiceLoss + alpha: 5 + beta: 10 + ohem_ratio: 3 + +Optimizer: + function: ppocr.optimizer,AdamDecay + base_lr: 0.001 + beta1: 0.9 + beta2: 0.999 + decay: + function: cosine_decay_warmup + step_each_epoch: 32 + total_epoch: 1200 + +PostProcess: + function: ppocr.postprocess.db_postprocess,DBPostProcess + thresh: 0.3 + box_thresh: 0.5 + max_candidates: 1000 + unclip_ratio: 1.6 + diff --git a/configs/det/det_r50_vd_db.yml b/configs/det/det_r50_vd_db.yml index 9a3b77e7cebce99f669d0b1be89ee56c84f41034..726ecd8ea012a42f4e82690aeb06250a35520b89 100755 --- a/configs/det/det_r50_vd_db.yml +++ b/configs/det/det_r50_vd_db.yml @@ -15,6 +15,7 @@ Global: save_res_path: ./output/det_db/predicts_db.txt checkpoints: save_inference_dir: + infer_img: Architecture: function: ppocr.modeling.architectures.det_model,DetModel diff --git a/configs/det/det_r50_vd_east.yml b/configs/det/det_r50_vd_east.yml index 8d86819937c902e47dded38ae0238fb8254d8ff0..2fb8e5cf024fac1f5e5e056965d96f3173b35c0c 100755 --- a/configs/det/det_r50_vd_east.yml +++ b/configs/det/det_r50_vd_east.yml @@ -15,6 +15,7 @@ Global: save_res_path: ./output/det_east/predicts_east.txt checkpoints: save_inference_dir: + infer_img: Architecture: function: ppocr.modeling.architectures.det_model,DetModel diff --git a/configs/det/det_r50_vd_sast_icdar15.yml b/configs/det/det_r50_vd_sast_icdar15.yml index f1ecd61dc8ccb14fde98c2fc55cb2c9e630b5c44..02593293bd0bb83cdb73a99370af6c1820f131f3 100644 --- a/configs/det/det_r50_vd_sast_icdar15.yml +++ b/configs/det/det_r50_vd_sast_icdar15.yml @@ -15,6 +15,7 @@ Global: save_res_path: ./output/det_sast/predicts_sast.txt checkpoints: save_inference_dir: + infer_img: Architecture: function: ppocr.modeling.architectures.det_model,DetModel diff --git a/configs/det/det_r50_vd_sast_totaltext.yml b/configs/det/det_r50_vd_sast_totaltext.yml index ec42ce6d4bafd0c5d4360a255f35d07e83f90787..96522852836b70a8995ae54f1e56765b58240e2d 100644 --- a/configs/det/det_r50_vd_sast_totaltext.yml +++ b/configs/det/det_r50_vd_sast_totaltext.yml @@ -15,6 +15,7 @@ Global: save_res_path: ./output/det_sast/predicts_sast.txt checkpoints: save_inference_dir: + infer_img: Architecture: function: ppocr.modeling.architectures.det_model,DetModel diff --git a/configs/det/det_sast_icdar15_reader.yml b/configs/det/det_sast_icdar15_reader.yml index ee45a85da7452e2069b0d7467b1ccfc44dd656b7..db5c6ac64e84eed4ade19a6bdaa92103aad030fb 100644 --- a/configs/det/det_sast_icdar15_reader.yml +++ b/configs/det/det_sast_icdar15_reader.yml @@ -20,5 +20,4 @@ EvalReader: TestReader: reader_function: ppocr.data.det.dataset_traversal,EvalTestReader process_function: ppocr.data.det.sast_process,SASTProcessTest - infer_img: ./train_data/icdar2015/text_localization/ch4_test_images/img_11.jpg max_side_len: 1536 diff --git a/configs/det/det_sast_totaltext_reader.yml b/configs/det/det_sast_totaltext_reader.yml index 92503d9f0e2b57f0d22b15591c5400185daf2afa..d303d176d5cee89827255ddddea4d5d771f19ddb 100644 --- a/configs/det/det_sast_totaltext_reader.yml +++ b/configs/det/det_sast_totaltext_reader.yml @@ -20,5 +20,4 @@ EvalReader: TestReader: reader_function: ppocr.data.det.dataset_traversal,EvalTestReader process_function: ppocr.data.det.sast_process,SASTProcessTest - infer_img: ./train_data/afs/total_text/Images/Test/img623.jpg max_side_len: 768 diff --git a/configs/rec/ch_ppocr_v1.1/rec_chinese_common_train_v1.1.yml b/configs/rec/ch_ppocr_v1.1/rec_chinese_common_train_v1.1.yml new file mode 100644 index 0000000000000000000000000000000000000000..8a84c635d32cce44daf405a8d48bcb0547b13acd --- /dev/null +++ b/configs/rec/ch_ppocr_v1.1/rec_chinese_common_train_v1.1.yml @@ -0,0 +1,52 @@ +Global: + algorithm: CRNN + use_gpu: true + epoch_num: 500 + log_smooth_window: 20 + print_batch_step: 10 + save_model_dir: ./output/rec_CRNN + save_epoch_step: 3 + eval_batch_step: 2000 + train_batch_size_per_card: 128 + test_batch_size_per_card: 128 + image_shape: [3, 32, 320] + max_text_length: 25 + character_type: ch + character_dict_path: ./ppocr/utils/ppocr_keys_v1.txt + loss_type: ctc + distort: true + use_space_char: true + reader_yml: ./configs/rec/rec_chinese_reader.yml + pretrain_weights: + checkpoints: + save_inference_dir: + infer_img: + +Architecture: + function: ppocr.modeling.architectures.rec_model,RecModel + +Backbone: + function: ppocr.modeling.backbones.rec_resnet_vd,ResNet + layers: 34 + +Head: + function: ppocr.modeling.heads.rec_ctc_head,CTCPredict + encoder_type: rnn + fc_decay: 0.00004 + SeqRNN: + hidden_size: 256 + +Loss: + function: ppocr.modeling.losses.rec_ctc_loss,CTCLoss + +Optimizer: + function: ppocr.optimizer,AdamDecay + base_lr: 0.0005 + l2_decay: 0.00004 + beta1: 0.9 + beta2: 0.999 + decay: + function: cosine_decay_warmup + step_each_epoch: 254 + total_epoch: 500 + warmup_minibatch: 1000 diff --git a/configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml b/configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml new file mode 100755 index 0000000000000000000000000000000000000000..89333f89ad9a6af4dd744daa8972ce35f805113a --- /dev/null +++ b/configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml @@ -0,0 +1,54 @@ +Global: + algorithm: CRNN + use_gpu: true + epoch_num: 500 + log_smooth_window: 20 + print_batch_step: 10 + save_model_dir: ./output/rec_CRNN + save_epoch_step: 3 + eval_batch_step: 2000 + train_batch_size_per_card: 256 + test_batch_size_per_card: 256 + image_shape: [3, 32, 320] + max_text_length: 25 + character_type: ch + character_dict_path: ./ppocr/utils/ppocr_keys_v1.txt + loss_type: ctc + distort: true + use_space_char: true + reader_yml: ./configs/rec/rec_chinese_reader.yml + pretrain_weights: + checkpoints: + save_inference_dir: + infer_img: + +Architecture: + function: ppocr.modeling.architectures.rec_model,RecModel + +Backbone: + function: ppocr.modeling.backbones.rec_mobilenet_v3,MobileNetV3 + scale: 0.5 + model_name: small + small_stride: [1, 2, 2, 2] + +Head: + function: ppocr.modeling.heads.rec_ctc_head,CTCPredict + encoder_type: rnn + fc_decay: 0.00001 + SeqRNN: + hidden_size: 48 + +Loss: + function: ppocr.modeling.losses.rec_ctc_loss,CTCLoss + +Optimizer: + function: ppocr.optimizer,AdamDecay + base_lr: 0.0005 + l2_decay: 0.00001 + beta1: 0.9 + beta2: 0.999 + decay: + function: cosine_decay_warmup + step_each_epoch: 254 + total_epoch: 500 + warmup_minibatch: 1000 diff --git a/configs/rec/multi_languages/rec_french_lite_train.yml b/configs/rec/multi_languages/rec_french_lite_train.yml index 2cf54c427eb6a7c64f4b54b021c44013a1dc1d6a..b4347bcd3a353fe65bddc2e96dc11b97f3eb0a08 100755 --- a/configs/rec/multi_languages/rec_french_lite_train.yml +++ b/configs/rec/multi_languages/rec_french_lite_train.yml @@ -12,7 +12,7 @@ Global: image_shape: [3, 32, 320] max_text_length: 25 character_type: french - character_dict_path: ./ppocr/utils/french_dict.txt + character_dict_path: ./ppocr/utils/dict/french_dict.txt loss_type: ctc distort: true use_space_char: false diff --git a/configs/rec/multi_languages/rec_ger_lite_train.yml b/configs/rec/multi_languages/rec_ger_lite_train.yml index beb1755b105fea9cbade9f35ceac15d380651f37..4e3b6c9ed21aa54e13dbf8d9fa5cea6bebf0c1d3 100755 --- a/configs/rec/multi_languages/rec_ger_lite_train.yml +++ b/configs/rec/multi_languages/rec_ger_lite_train.yml @@ -12,7 +12,7 @@ Global: image_shape: [3, 32, 320] max_text_length: 25 character_type: german - character_dict_path: ./ppocr/utils/german_dict.txt + character_dict_path: ./ppocr/utils/dict/german_dict.txt loss_type: ctc distort: true use_space_char: false diff --git a/configs/rec/multi_languages/rec_japan_lite_train.yml b/configs/rec/multi_languages/rec_japan_lite_train.yml index fbbab33eadd2901d9eac93f49e737e92d9441270..ddfb7e2fe7c56cfff02ac9a1fc6a7da35c989a45 100755 --- a/configs/rec/multi_languages/rec_japan_lite_train.yml +++ b/configs/rec/multi_languages/rec_japan_lite_train.yml @@ -12,7 +12,7 @@ Global: image_shape: [3, 32, 320] max_text_length: 25 character_type: japan - character_dict_path: ./ppocr/utils/japan_dict.txt + character_dict_path: ./ppocr/utils/dict/japan_dict.txt loss_type: ctc distort: true use_space_char: false diff --git a/configs/rec/multi_languages/rec_korean_lite_train.yml b/configs/rec/multi_languages/rec_korean_lite_train.yml index 29cc08aaefb017c690551e030a57e85ebb21e2dd..2dba08854426535e849809a5d39b7329442e6304 100755 --- a/configs/rec/multi_languages/rec_korean_lite_train.yml +++ b/configs/rec/multi_languages/rec_korean_lite_train.yml @@ -12,7 +12,7 @@ Global: image_shape: [3, 32, 320] max_text_length: 25 character_type: korean - character_dict_path: ./ppocr/utils/korean_dict.txt + character_dict_path: ./ppocr/utils/dict/korean_dict.txt loss_type: ctc distort: true use_space_char: false diff --git a/configs/rec/rec_mv3_none_bilstm_ctc.yml b/configs/rec/rec_mv3_none_bilstm_ctc.yml index d2e096fb1c51588a6bd2c7ca8321cf817d435f23..55feaaf883e18791bc76430a7afaaacb7f5812b6 100755 --- a/configs/rec/rec_mv3_none_bilstm_ctc.yml +++ b/configs/rec/rec_mv3_none_bilstm_ctc.yml @@ -12,6 +12,7 @@ Global: image_shape: [3, 32, 100] max_text_length: 25 character_type: en + character_dict_path: loss_type: ctc reader_yml: ./configs/rec/rec_benchmark_reader.yml pretrain_weights: diff --git a/configs/rec/rec_mv3_none_none_ctc.yml b/configs/rec/rec_mv3_none_none_ctc.yml index ceec09ce6f3b6cb2238d6fb2e15f510cb31e0fd8..0cf377834e733756b356525896ba57a242fa3f62 100755 --- a/configs/rec/rec_mv3_none_none_ctc.yml +++ b/configs/rec/rec_mv3_none_none_ctc.yml @@ -12,6 +12,7 @@ Global: image_shape: [3, 32, 100] max_text_length: 25 character_type: en + character_dict_path: loss_type: ctc reader_yml: ./configs/rec/rec_benchmark_reader.yml pretrain_weights: diff --git a/configs/rec/rec_mv3_tps_bilstm_attn.yml b/configs/rec/rec_mv3_tps_bilstm_attn.yml index 7fc4f6799459bf9fbcd25e1609aeca5e3fd12a74..d02edaba238af701a8b81b240ee9a89cbc1ed995 100755 --- a/configs/rec/rec_mv3_tps_bilstm_attn.yml +++ b/configs/rec/rec_mv3_tps_bilstm_attn.yml @@ -12,6 +12,7 @@ Global: image_shape: [3, 32, 100] max_text_length: 25 character_type: en + character_dict_path: loss_type: attention tps: true reader_yml: ./configs/rec/rec_benchmark_reader.yml diff --git a/configs/rec/rec_mv3_tps_bilstm_ctc.yml b/configs/rec/rec_mv3_tps_bilstm_ctc.yml index 4b9660bcdec60989a6d9b9926c40814a83db6f39..509d616bc0e9456c1fb86c94e5eef1c2f9515aad 100755 --- a/configs/rec/rec_mv3_tps_bilstm_ctc.yml +++ b/configs/rec/rec_mv3_tps_bilstm_ctc.yml @@ -12,6 +12,7 @@ Global: image_shape: [3, 32, 100] max_text_length: 25 character_type: en + character_dict_path: loss_type: ctc tps: true reader_yml: ./configs/rec/rec_benchmark_reader.yml diff --git a/configs/rec/rec_r34_vd_none_bilstm_ctc.yml b/configs/rec/rec_r34_vd_none_bilstm_ctc.yml index b71e8feae7ac8f235bf471101efd4383c61bfab2..7332f0f8679c32afd4435dbddef29f651c994b26 100755 --- a/configs/rec/rec_r34_vd_none_bilstm_ctc.yml +++ b/configs/rec/rec_r34_vd_none_bilstm_ctc.yml @@ -12,6 +12,7 @@ Global: image_shape: [3, 32, 100] max_text_length: 25 character_type: en + character_dict_path: loss_type: ctc reader_yml: ./configs/rec/rec_benchmark_reader.yml pretrain_weights: diff --git a/configs/rec/rec_r34_vd_none_none_ctc.yml b/configs/rec/rec_r34_vd_none_none_ctc.yml index d9c9458d6d8fcdb9df590b0093d54b71e3e53fcc..b42b5535471f078b79002b8ea930a7c846207a86 100755 --- a/configs/rec/rec_r34_vd_none_none_ctc.yml +++ b/configs/rec/rec_r34_vd_none_none_ctc.yml @@ -12,6 +12,7 @@ Global: image_shape: [3, 32, 100] max_text_length: 25 character_type: en + character_dict_path: loss_type: ctc reader_yml: ./configs/rec/rec_benchmark_reader.yml pretrain_weights: diff --git a/configs/rec/rec_r34_vd_tps_bilstm_attn.yml b/configs/rec/rec_r34_vd_tps_bilstm_attn.yml index dfcd97fad67081a7ed04ad1d67ff298c9f553b0c..73ed68481f8ca189491375321c3848998b74410f 100755 --- a/configs/rec/rec_r34_vd_tps_bilstm_attn.yml +++ b/configs/rec/rec_r34_vd_tps_bilstm_attn.yml @@ -12,6 +12,7 @@ Global: image_shape: [3, 32, 100] max_text_length: 25 character_type: en + character_dict_path: loss_type: attention tps: true reader_yml: ./configs/rec/rec_benchmark_reader.yml diff --git a/configs/rec/rec_r34_vd_tps_bilstm_ctc.yml b/configs/rec/rec_r34_vd_tps_bilstm_ctc.yml index 574a088cc024541e086bedc0bc0a52082e9e7eb2..9a621a1462df156272938740ceddef1aa850f95a 100755 --- a/configs/rec/rec_r34_vd_tps_bilstm_ctc.yml +++ b/configs/rec/rec_r34_vd_tps_bilstm_ctc.yml @@ -12,6 +12,7 @@ Global: image_shape: [3, 32, 100] max_text_length: 25 character_type: en + character_dict_path: loss_type: ctc tps: true reader_yml: ./configs/rec/rec_benchmark_reader.yml diff --git a/configs/rec/rec_r50fpn_vd_none_srn.yml b/configs/rec/rec_r50fpn_vd_none_srn.yml index 30709e479f8da56b6bd7fe9ebf817a27bff9cc38..e7040d9a1d6a311d61fe3f8b6396ccfdfd8c0b95 100755 --- a/configs/rec/rec_r50fpn_vd_none_srn.yml +++ b/configs/rec/rec_r50fpn_vd_none_srn.yml @@ -12,6 +12,7 @@ Global: image_shape: [1, 64, 256] max_text_length: 25 character_type: en + character_dict_path: loss_type: srn num_heads: 8 average_window: 0.15 diff --git a/deploy/android_demo/README.md b/deploy/android_demo/README.md index e35e757914aa355c97293662652b1e02676e32eb..285f7a84387e5f50ac3286cee10b0c4bea0deb31 100644 --- a/deploy/android_demo/README.md +++ b/deploy/android_demo/README.md @@ -2,7 +2,7 @@ ### 1. 安装最新版本的Android Studio 可以从https://developer.android.com/studio 下载。本Demo使用是4.0版本Android Studio编写。 -### 2. 按照NDK 20 以上版本 +### 2. 按照NDK 20 以上版本 Demo测试的时候使用的是NDK 20b版本,20版本以上均可以支持编译成功。 如果您是初学者,可以用以下方式安装和测试NDK编译环境。 @@ -17,3 +17,10 @@ Demo测试的时候使用的是NDK 20b版本,20版本以上均可以支持编 - Demo APP:可使用手机扫码安装,方便手机端快速体验文字识别 - SDK:模型被封装为适配不同芯片硬件和操作系统SDK,包括完善的接口,方便进行二次开发 + + +# FAQ: +Q1: 更新1.1版本的模型后,demo报错? + + +A1. 如果要更换V1.1 版本的模型,请更新模型的同时,更新预测库文件,建议使用[PaddleLite 2.6.3](https://github.com/PaddlePaddle/Paddle-Lite/releases/tag/v2.6.3)版本的预测库文件,OCR移动端部署参考[教程](../lite/readme.md)。 diff --git a/deploy/android_demo/app/build.gradle b/deploy/android_demo/app/build.gradle index 5ecb11692c2a66f941dc41425761519607bad39e..494247a3792814ab8373f150c5f7b35b1b821971 100644 --- a/deploy/android_demo/app/build.gradle +++ b/deploy/android_demo/app/build.gradle @@ -57,7 +57,7 @@ def archives = [ ], [ 'src' : 'https://paddleocr.bj.bcebos.com/deploy/lite/ocr_v1_for_cpu.tar.gz', - 'dest' : 'src/main/assets/models/ocr_v1_for_cpu' + 'dest' : 'src/main/assets/models' ] ] diff --git a/deploy/android_demo/app/src/main/cpp/ocr_cls_process.cpp b/deploy/android_demo/app/src/main/cpp/ocr_cls_process.cpp index d720066667b60ee87bc1a1227ad720074254074e..e7de9b0b1c7c228ba7e00ad912cdfedcce7812a1 100644 --- a/deploy/android_demo/app/src/main/cpp/ocr_cls_process.cpp +++ b/deploy/android_demo/app/src/main/cpp/ocr_cls_process.cpp @@ -20,7 +20,7 @@ #include #include -const std::vector CLS_IMAGE_SHAPE = {3, 32, 100}; +const std::vector CLS_IMAGE_SHAPE = {3, 48, 192}; cv::Mat cls_resize_img(const cv::Mat &img) { int imgC = CLS_IMAGE_SHAPE[0]; diff --git a/deploy/android_demo/app/src/main/cpp/ocr_ppredictor.h b/deploy/android_demo/app/src/main/cpp/ocr_ppredictor.h index 0ec458a4952cbc605e9979ce7850bdeab36c4629..588f25cb0662b6cc5c8677549e7eb3527d74fa9b 100644 --- a/deploy/android_demo/app/src/main/cpp/ocr_ppredictor.h +++ b/deploy/android_demo/app/src/main/cpp/ocr_ppredictor.h @@ -98,7 +98,7 @@ private: * @param origin * @return */ - cv::Mat infer_cls(const cv::Mat &origin, float thresh = 0.5); + cv::Mat infer_cls(const cv::Mat &origin, float thresh = 0.9); /** * Postprocess or sencod model to extract text diff --git a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OCRPredictorNative.java b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OCRPredictorNative.java index 7499d4b92689645c0b1009256884733d392ff68d..1fa419e32a4cbefc27fc687b376ecc7e6a1e8a2f 100644 --- a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OCRPredictorNative.java +++ b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OCRPredictorNative.java @@ -35,12 +35,6 @@ public class OCRPredictorNative { } - public void release() { - if (nativePointer != 0) { - nativePointer = 0; -// destory(nativePointer); - } - } public ArrayList runImage(float[] inputData, int width, int height, int channels, Bitmap originalImage) { Log.i("OCRPredictorNative", "begin to run image " + inputData.length + " " + width + " " + height); @@ -59,11 +53,18 @@ public class OCRPredictorNative { } + public void destory(){ + if (nativePointer > 0) { + release(nativePointer); + nativePointer = 0; + } + } + protected native long init(String detModelPath, String recModelPath,String clsModelPath, int threadNum, String cpuMode); protected native float[] forward(long pointer, float[] buf, float[] ddims, Bitmap originalImage); - protected native void destory(long pointer); + protected native void release(long pointer); private ArrayList postprocess(float[] raw) { ArrayList results = new ArrayList(); diff --git a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java index ddf69ab481618696189a7d0d45264791267e5631..572d0b22deada648d1291091d05130d5ecf270a8 100644 --- a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java +++ b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java @@ -135,7 +135,7 @@ public class Predictor { public void releaseModel() { if (paddlePredictor != null) { - paddlePredictor.release(); + paddlePredictor.destory(); paddlePredictor = null; } isLoaded = false; diff --git a/deploy/cpp_infer/CMakeLists.txt b/deploy/cpp_infer/CMakeLists.txt index 466c2be8f79c11a9e6cf39631ef2dc5a2a213321..0f751a22ce7f848b2d7e268fb92059f9d5170cb5 100644 --- a/deploy/cpp_infer/CMakeLists.txt +++ b/deploy/cpp_infer/CMakeLists.txt @@ -52,20 +52,29 @@ include_directories(${OpenCV_INCLUDE_DIRS}) if (WIN32) add_definitions("/DGOOGLE_GLOG_DLL_DECL=") - set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /bigobj /MTd") - set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /bigobj /MT") - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /bigobj /MTd") - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /bigobj /MT") + if(WITH_MKL) + set(FLAG_OPENMP "/openmp") + endif() + set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /bigobj /MTd ${FLAG_OPENMP}") + set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /bigobj /MT ${FLAG_OPENMP}") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /bigobj /MTd ${FLAG_OPENMP}") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /bigobj /MT ${FLAG_OPENMP}") if (WITH_STATIC_LIB) safe_set_static_flag() add_definitions(-DSTATIC_LIB) endif() + message("cmake c debug flags " ${CMAKE_C_FLAGS_DEBUG}) + message("cmake c release flags " ${CMAKE_C_FLAGS_RELEASE}) + message("cmake cxx debug flags " ${CMAKE_CXX_FLAGS_DEBUG}) + message("cmake cxx release flags " ${CMAKE_CXX_FLAGS_RELEASE}) else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -o3 -std=c++11") + if(WITH_MKL) + set(FLAG_OPENMP "-fopenmp") + endif() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -o3 ${FLAG_OPENMP} -std=c++11") set(CMAKE_STATIC_LIBRARY_PREFIX "") + message("cmake cxx flags" ${CMAKE_CXX_FLAGS}) endif() -message("flags" ${CMAKE_CXX_FLAGS}) - if (WITH_GPU) if (NOT DEFINED CUDA_LIB OR ${CUDA_LIB} STREQUAL "") @@ -198,4 +207,4 @@ if (WIN32 AND WITH_MKL) COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_LIB}/third_party/install/mklml/lib/libiomp5md.dll ./release/libiomp5md.dll COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_LIB}/third_party/install/mkldnn/lib/mkldnn.dll ./release/mkldnn.dll ) -endif() \ No newline at end of file +endif() diff --git a/deploy/cpp_infer/include/preprocess_op.h b/deploy/cpp_infer/include/preprocess_op.h index 5cbc5cd7134238c4f09f536ca6b1153d2d703023..bda7d1230fdc11c3b1a7d99130df755d26895de8 100644 --- a/deploy/cpp_infer/include/preprocess_op.h +++ b/deploy/cpp_infer/include/preprocess_op.h @@ -59,7 +59,7 @@ public: class ClsResizeImg { public: virtual void Run(const cv::Mat &img, cv::Mat &resize_img, - const std::vector &rec_image_shape = {3, 32, 320}); + const std::vector &rec_image_shape = {3, 48, 192}); }; } // namespace PaddleOCR \ No newline at end of file diff --git a/deploy/cpp_infer/readme.md b/deploy/cpp_infer/readme.md index 571ed2eb2b071574aec3cabdff01b6c9d7f17440..7296936643af87817da40592753550fed9a7c8b5 100644 --- a/deploy/cpp_infer/readme.md +++ b/deploy/cpp_infer/readme.md @@ -194,7 +194,37 @@ sh tools/run.sh ``` * 若需要使用方向分类器,则需要将`tools/config.txt`中的`use_angle_cls`参数修改为1,表示开启方向分类器的预测。 +* 更多地,tools/config.txt中的参数及解释如下。 +``` +use_gpu 0 # 是否使用GPU,1表示使用,0表示不使用 +gpu_id 0 # GPU id,使用GPU时有效 +gpu_mem 4000 # 申请的GPU内存 +cpu_math_library_num_threads 10 # CPU预测时的线程数,在机器核数充足的情况下,该值越大,预测速度越快 +use_mkldnn 1 # 是否使用mkldnn库 +use_zero_copy_run 1 # 是否使用use_zero_copy_run进行预测 + +# det config +max_side_len 960 # 输入图像长宽大于960时,等比例缩放图像,使得图像最长边为960 +det_db_thresh 0.3 # 用于过滤DB预测的二值化图像,设置为0.-0.3对结果影响不明显 +det_db_box_thresh 0.5 # DB后处理过滤box的阈值,如果检测存在漏框情况,可酌情减小 +det_db_unclip_ratio 1.6 # 表示文本框的紧致程度,越小则文本框更靠近文本 +det_model_dir ./inference/det_db # 检测模型inference model地址 + +# cls config +use_angle_cls 0 # 是否使用方向分类器,0表示不使用,1表示使用 +cls_model_dir ./inference/cls # 方向分类器inference model地址 +cls_thresh 0.9 # 方向分类器的得分阈值 + +# rec config +rec_model_dir ./inference/rec_crnn # 识别模型inference model地址 +char_list_file ../../ppocr/utils/ppocr_keys_v1.txt # 字典文件 + +# show the detection results +visualize 1 # 是否对结果进行可视化,为1时,会在当前文件夹下保存文件名为`ocr_vis.png`的预测结果。 +``` + +* PaddleOCR也支持多语言的预测,更多细节可以参考[识别文档](../../doc/doc_ch/recognition.md)中的多语言字典与模型部分。 最终屏幕上会输出检测结果如下。 @@ -205,4 +235,4 @@ sh tools/run.sh ### 2.3 注意 -* C++预测默认未开启MKLDNN(`tools/config.txt`中的`use_mkldnn`设置为0),如果需要使用MKLDNN进行预测加速,则需要将`use_mkldnn`修改为1,同时使用最新版本的Paddle源码编译预测库。在使用MKLDNN进行CPU预测时,如果同时预测多张图像,则会出现内存泄露的问题(不打开MKLDNN则没有该问题),目前该问题正在修复中,临时解决方案为:预测多张图片时,每隔30张图片左右对识别(`CRNNRecognizer`)和检测类(`DBDetector`)重新初始化一次。 +* 在使用Paddle预测库时,推荐使用2.0.0-beta0版本的预测库。 diff --git a/deploy/cpp_infer/readme_en.md b/deploy/cpp_infer/readme_en.md index a545b8606cda0b476b439543382d997065721892..30a6912eb919101b59dacb46127577988ca89388 100644 --- a/deploy/cpp_infer/readme_en.md +++ b/deploy/cpp_infer/readme_en.md @@ -202,6 +202,38 @@ sh tools/run.sh ``` * If you want to orientation classifier to correct the detected boxes, you can set `use_angle_cls` in the file `tools/config.txt` as 1 to enable the function. +* What's more, Parameters and their meanings in `tools/config.txt` are as follows. + + +``` +use_gpu 0 # Whether to use GPU, 0 means not to use, 1 means to use +gpu_id 0 # GPU id when use_gpu is 1 +gpu_mem 4000 # GPU memory requested +cpu_math_library_num_threads 10 # Number of threads when using CPU inference. When machine cores is enough, the large the value, the faster the inference speed +use_mkldnn 1 # Whether to use mkdlnn library +use_zero_copy_run 1 # Whether to use use_zero_copy_run for inference + +max_side_len 960 # Limit the maximum image height and width to 960 +det_db_thresh 0.3 # Used to filter the binarized image of DB prediction, setting 0.-0.3 has no obvious effect on the result +det_db_box_thresh 0.5 # DDB post-processing filter box threshold, if there is a missing box detected, it can be reduced as appropriate +det_db_unclip_ratio 1.6 # Indicates the compactness of the text box, the smaller the value, the closer the text box to the text +det_model_dir ./inference/det_db # Address of detection inference model + +# cls config +use_angle_cls 0 # Whether to use the direction classifier, 0 means not to use, 1 means to use +cls_model_dir ./inference/cls # Address of direction classifier inference model +cls_thresh 0.9 # Score threshold of the direction classifier + +# rec config +rec_model_dir ./inference/rec_crnn # Address of recognition inference model +char_list_file ../../ppocr/utils/ppocr_keys_v1.txt # dictionary file + +# show the detection results +visualize 1 # Whether to visualize the results,when it is set as 1, The prediction result will be save in the image file `./ocr_vis.png`. +``` + +* Multi-language inference is also supported in PaddleOCR, for more details, please refer to part of multi-language dictionaries and models in [recognition tutorial](../../doc/doc_en/recognition_en.md). + The detection results will be shown on the screen, which is as follows. @@ -210,6 +242,6 @@ The detection results will be shown on the screen, which is as follows. -### 2.3 Note +### 2.3 Notes -* `MKLDNN` is disabled by default for C++ inference (`use_mkldnn` in `tools/config.txt` is set to 0), if you need to use MKLDNN for inference acceleration, you need to modify `use_mkldnn` to 1, and use the latest version of the Paddle source code to compile the inference library. When using MKLDNN for CPU prediction, if multiple images are predicted at the same time, there will be a memory leak problem (the problem is not present if MKLDNN is disabled). The problem is currently being fixed, and the temporary solution is: when predicting multiple pictures, Re-initialize the recognition (`CRNNRecognizer`) and detection class (`DBDetector`) every 30 pictures or so. +* Paddle2.0.0-beta0 inference model library is recommanded for this tuturial. diff --git a/deploy/cpp_infer/src/main.cpp b/deploy/cpp_infer/src/main.cpp index e708a6e341e6dd5ba66abe46456e2d74a89e0cb5..4b84dbd0903b4290c8d3b2b4feeb95c3bd234fe8 100644 --- a/deploy/cpp_infer/src/main.cpp +++ b/deploy/cpp_infer/src/main.cpp @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +#include "glog/logging.h" +#include "omp.h" #include "opencv2/core.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/imgproc.hpp" @@ -67,6 +69,19 @@ int main(int argc, char **argv) { config.use_mkldnn, config.use_zero_copy_run, config.char_list_file); +#ifdef USE_MKL +#pragma omp parallel + for (auto i = 0; i < 10; i++) { + LOG_IF(WARNING, + config.cpu_math_library_num_threads != omp_get_num_threads()) + << "WARNING! MKL is running on " << omp_get_num_threads() + << " threads while cpu_math_library_num_threads is set to " + << config.cpu_math_library_num_threads + << ". Possible reason could be 1. You have set omp_set_num_threads() " + "somewhere; 2. MKL is not linked properly"; + } +#endif + auto start = std::chrono::system_clock::now(); std::vector>> boxes; det.Run(srcimg, boxes); diff --git a/deploy/cpp_infer/src/ocr_cls.cpp b/deploy/cpp_infer/src/ocr_cls.cpp index 7cdaaab40108026edffe5cb1ca53ac3972768cc6..0e92fbe54963e4257e92cf529bd8dc5882c1f5dd 100644 --- a/deploy/cpp_infer/src/ocr_cls.cpp +++ b/deploy/cpp_infer/src/ocr_cls.cpp @@ -21,7 +21,7 @@ cv::Mat Classifier::Run(cv::Mat &img) { img.copyTo(src_img); cv::Mat resize_img; - std::vector rec_image_shape = {3, 32, 100}; + std::vector rec_image_shape = {3, 48, 192}; int index = 0; float wh_ratio = float(img.cols) / float(img.rows); diff --git a/deploy/cpp_infer/src/preprocess_op.cpp b/deploy/cpp_infer/src/preprocess_op.cpp index b44e9d022f2dcfb390cb28a7f34e0ba4b031832d..1d3e31a14888969b0b56398bdcb9925d03e91cfe 100644 --- a/deploy/cpp_infer/src/preprocess_op.cpp +++ b/deploy/cpp_infer/src/preprocess_op.cpp @@ -85,10 +85,10 @@ void ResizeImgType0::Run(const cv::Mat &img, cv::Mat &resize_img, if (resize_w % 32 == 0) resize_w = resize_w; - else if (resize_w / 32 < 1) + else if (resize_w / 32 < 1 + 1e-5) resize_w = 32; else - resize_w = (resize_w / 32 - 1) * 32; + resize_w = resize_w / 32 * 32; cv::resize(img, resize_img, cv::Size(resize_w, resize_h)); @@ -138,4 +138,4 @@ void ClsResizeImg::Run(const cv::Mat &img, cv::Mat &resize_img, } } -} // namespace PaddleOCR \ No newline at end of file +} // namespace PaddleOCR diff --git a/deploy/docker/hubserving/README.md b/deploy/docker/hubserving/README.md index 62381073d4c7448f9a238ca4dda4b294ce864f7a..c4bb1413db42ff40c9c99d76b86364e73a71e561 100644 --- a/deploy/docker/hubserving/README.md +++ b/deploy/docker/hubserving/README.md @@ -20,7 +20,7 @@ git clone https://github.com/PaddlePaddle/PaddleOCR.git ``` b. Goto Dockerfile directory(ps:Need to distinguish between cpu and gpu version, the following takes cpu as an example, gpu version needs to replace the keyword) ``` -cd deploy/docker/cpu +cd deploy/docker/hubserving/cpu ``` c. Build image ``` diff --git a/deploy/docker/hubserving/README_cn.md b/deploy/docker/hubserving/README_cn.md index f117a0ab4186fea0cb94881c65b2b353bee37ff7..d13dab6b15ec283a328b67c6cbe716d75b42ce8d 100644 --- a/deploy/docker/hubserving/README_cn.md +++ b/deploy/docker/hubserving/README_cn.md @@ -20,7 +20,7 @@ git clone https://github.com/PaddlePaddle/PaddleOCR.git ``` b.切换至Dockerfile目录(注:需要区分cpu或gpu版本,下文以cpu为例,gpu版本需要替换一下关键字即可) ``` -cd deploy/docker/cpu +cd deploy/docker/hubserving/cpu ``` c.生成镜像 ``` diff --git a/deploy/docker/hubserving/cpu/Dockerfile b/deploy/docker/hubserving/cpu/Dockerfile index 8404b4c007731fa02816aecfefc2fe3cd7da7c73..21bb41d38f2ddc60da85ee2ad39e8a500334ec6f 100755 --- a/deploy/docker/hubserving/cpu/Dockerfile +++ b/deploy/docker/hubserving/cpu/Dockerfile @@ -8,21 +8,25 @@ RUN python3.7 -m pip install paddlepaddle==1.7.2 -i https://pypi.tuna.tsinghua.e RUN pip3.7 install paddlehub --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple -RUN git clone https://gitee.com/PaddlePaddle/PaddleOCR +RUN git clone https://gitee.com/paddlepaddle/PaddleOCR.git /PaddleOCR WORKDIR /PaddleOCR -RUN pip3.7 install -r requirments.txt -i https://pypi.tuna.tsinghua.edu.cn/simple +RUN pip3.7 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple -RUN mkdir -p /PaddleOCR/inference -# Download orc detect model(light version). if you want to change normal version, you can change ch_det_mv3_db_infer to ch_det_r50_vd_db_infer, also remember change det_model_dir in deploy/hubserving/ocr_system/params.py) -ADD https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db_infer.tar /PaddleOCR/inference -RUN tar xf /PaddleOCR/inference/ch_det_mv3_db_infer.tar -C /PaddleOCR/inference +RUN mkdir -p /PaddleOCR/inference/ +# Download orc detect model(light version). if you want to change normal version, you can change ch_ppocr_mobile_v1.1_det_infer to ch_ppocr_server_v1.1_det_infer, also remember change det_model_dir in deploy/hubserving/ocr_system/params.py) +ADD https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar /PaddleOCR/inference/ +RUN tar xf /PaddleOCR/inference/ch_ppocr_mobile_v1.1_det_infer.tar -C /PaddleOCR/inference/ -# Download orc recognition model(light version). If you want to change normal version, you can change ch_rec_mv3_crnn_infer to ch_rec_r34_vd_crnn_enhance_infer, also remember change rec_model_dir in deploy/hubserving/ocr_system/params.py) -ADD https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar /PaddleOCR/inference -RUN tar xf /PaddleOCR/inference/ch_rec_mv3_crnn_infer.tar -C /PaddleOCR/inference +# Download direction classifier(light version). If you want to change normal version, you can change ch_ppocr_mobile_v1.1_cls_infer to ch_ppocr_mobile_v1.1_cls_infer, also remember change cls_model_dir in deploy/hubserving/ocr_system/params.py) +ADD https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar /PaddleOCR/inference/ +RUN tar xf /PaddleOCR/inference/ch_ppocr_mobile_v1.1_cls_infer.tar -C /PaddleOCR/inference/ + +# Download orc recognition model(light version). If you want to change normal version, you can change ch_ppocr_mobile_v1.1_rec_infer to ch_ppocr_server_v1.1_rec_infer, also remember change rec_model_dir in deploy/hubserving/ocr_system/params.py) +ADD https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar /PaddleOCR/inference/ +RUN tar xf /PaddleOCR/inference/ch_ppocr_mobile_v1.1_rec_infer.tar -C /PaddleOCR/inference/ EXPOSE 8866 -CMD ["/bin/bash","-c","export PYTHONPATH=. && hub install deploy/hubserving/ocr_system/ && hub serving start -m ocr_system"] \ No newline at end of file +CMD ["/bin/bash","-c","hub install deploy/hubserving/ocr_system/ && hub serving start -m ocr_system"] \ No newline at end of file diff --git a/deploy/docker/hubserving/gpu/Dockerfile b/deploy/docker/hubserving/gpu/Dockerfile index 1320a7f34b05ee470fa2bcf30548295f11427237..f0c81140732145d371dc638a7b00ee22d38b59f7 100755 --- a/deploy/docker/hubserving/gpu/Dockerfile +++ b/deploy/docker/hubserving/gpu/Dockerfile @@ -8,21 +8,25 @@ RUN python3.7 -m pip install paddlepaddle-gpu==1.7.2.post107 -i https://pypi.tun RUN pip3.7 install paddlehub --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple -RUN git clone https://gitee.com/PaddlePaddle/PaddleOCR +RUN git clone https://gitee.com/paddlepaddle/PaddleOCR.git /PaddleOCR -WORKDIR /home/PaddleOCR +WORKDIR /PaddleOCR -RUN pip3.7 install -r requirments.txt -i https://pypi.tuna.tsinghua.edu.cn/simple +RUN pip3.7 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple -RUN mkdir -p /PaddleOCR/inference -# Download orc detect model(light version). if you want to change normal version, you can change ch_det_mv3_db_infer to ch_det_r50_vd_db_infer, also remember change det_model_dir in deploy/hubserving/ocr_system/params.py) -ADD https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db_infer.tar /PaddleOCR/inference -RUN tar xf /PaddleOCR/inference/ch_det_mv3_db_infer.tar -C /PaddleOCR/inference +RUN mkdir -p /PaddleOCR/inference/ +# Download orc detect model(light version). if you want to change normal version, you can change ch_ppocr_mobile_v1.1_det_infer to ch_ppocr_server_v1.1_det_infer, also remember change det_model_dir in deploy/hubserving/ocr_system/params.py) +ADD https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar /PaddleOCR/inference/ +RUN tar xf /PaddleOCR/inference/ch_ppocr_mobile_v1.1_det_infer.tar -C /PaddleOCR/inference/ -# Download orc recognition model(light version). If you want to change normal version, you can change ch_rec_mv3_crnn_infer to ch_rec_r34_vd_crnn_enhance_infer, also remember change rec_model_dir in deploy/hubserving/ocr_system/params.py) -ADD https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar /PaddleOCR/inference -RUN tar xf /PaddleOCR/inference/ch_rec_mv3_crnn_infer.tar -C /PaddleOCR/inference +# Download direction classifier(light version). If you want to change normal version, you can change ch_ppocr_mobile_v1.1_cls_infer to ch_ppocr_mobile_v1.1_cls_infer, also remember change cls_model_dir in deploy/hubserving/ocr_system/params.py) +ADD https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar /PaddleOCR/inference/ +RUN tar xf /PaddleOCR/inference/ch_ppocr_mobile_v1.1_cls_infer.tar -C /PaddleOCR/inference/ + +# Download orc recognition model(light version). If you want to change normal version, you can change ch_ppocr_mobile_v1.1_rec_infer to ch_ppocr_server_v1.1_rec_infer, also remember change rec_model_dir in deploy/hubserving/ocr_system/params.py) +ADD https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar /PaddleOCR/inference/ +RUN tar xf /PaddleOCR/inference/ch_ppocr_mobile_v1.1_rec_infer.tar -C /PaddleOCR/inference/ EXPOSE 8866 -CMD ["/bin/bash","-c","export PYTHONPATH=. && hub install deploy/hubserving/ocr_system/ && hub serving start -m ocr_system"] \ No newline at end of file +CMD ["/bin/bash","-c","hub install deploy/hubserving/ocr_system/ && hub serving start -m ocr_system"] \ No newline at end of file diff --git a/deploy/hubserving/ocr_det/module.py b/deploy/hubserving/ocr_det/module.py index be74306dacf4a3648e3227f11227e6399e6ed2eb..d2cecaa475961e273b7dfcf68e9a0a991b21a69e 100644 --- a/deploy/hubserving/ocr_det/module.py +++ b/deploy/hubserving/ocr_det/module.py @@ -3,11 +3,14 @@ from __future__ import absolute_import from __future__ import division from __future__ import print_function +import os +import sys +sys.path.insert(0, ".") + import argparse import ast import copy import math -import os import time from paddle.fluid.core import AnalysisConfig, create_paddle_predictor, PaddleTensor @@ -67,9 +70,7 @@ class OCRDet(hub.Module): images.append(img) return images - def predict(self, - images=[], - paths=[]): + def predict(self, images=[], paths=[]): """ Get the text box in the predicted images. Args: @@ -87,7 +88,7 @@ class OCRDet(hub.Module): raise TypeError("The input data is inconsistent with expectations.") assert predicted_data != [], "There is not any image to be predicted. Please check the input data." - + all_results = [] for img in predicted_data: if img is None: @@ -99,11 +100,9 @@ class OCRDet(hub.Module): rec_res_final = [] for dno in range(len(dt_boxes)): - rec_res_final.append( - { - 'text_region': dt_boxes[dno].astype(np.int).tolist() - } - ) + rec_res_final.append({ + 'text_region': dt_boxes[dno].astype(np.int).tolist() + }) all_results.append(rec_res_final) return all_results @@ -116,7 +115,7 @@ class OCRDet(hub.Module): results = self.predict(images_decode, **kwargs) return results - + if __name__ == '__main__': ocr = OCRDet() image_path = [ @@ -124,4 +123,4 @@ if __name__ == '__main__': './doc/imgs/12.jpg', ] res = ocr.predict(paths=image_path) - print(res) \ No newline at end of file + print(res) diff --git a/deploy/hubserving/ocr_det/params.py b/deploy/hubserving/ocr_det/params.py index f37993a10b85097b11e38bbb2efe25c649bec8d0..865c5288305435d94f66f744f67504b57189ac6e 100644 --- a/deploy/hubserving/ocr_det/params.py +++ b/deploy/hubserving/ocr_det/params.py @@ -37,5 +37,6 @@ def read_params(): # cfg.use_space_char = True cfg.use_zero_copy_run = False + cfg.use_pdserving = False return cfg diff --git a/deploy/hubserving/ocr_rec/module.py b/deploy/hubserving/ocr_rec/module.py index 846f5437fe3b0a5136bff6c902481f888558d594..e2d0bfdda3cf10dd425b09eaf41f48b43592d921 100644 --- a/deploy/hubserving/ocr_rec/module.py +++ b/deploy/hubserving/ocr_rec/module.py @@ -3,11 +3,14 @@ from __future__ import absolute_import from __future__ import division from __future__ import print_function +import os +import sys +sys.path.insert(0, ".") + import argparse import ast import copy import math -import os import time from paddle.fluid.core import AnalysisConfig, create_paddle_predictor, PaddleTensor @@ -67,9 +70,7 @@ class OCRRec(hub.Module): images.append(img) return images - def predict(self, - images=[], - paths=[]): + def predict(self, images=[], paths=[]): """ Get the text box in the predicted images. Args: @@ -87,31 +88,28 @@ class OCRRec(hub.Module): raise TypeError("The input data is inconsistent with expectations.") assert predicted_data != [], "There is not any image to be predicted. Please check the input data." - + img_list = [] for img in predicted_data: if img is None: continue img_list.append(img) - + rec_res_final = [] try: rec_res, predict_time = self.text_recognizer(img_list) for dno in range(len(rec_res)): text, score = rec_res[dno] - rec_res_final.append( - { - 'text': text, - 'confidence': float(score), - } - ) + rec_res_final.append({ + 'text': text, + 'confidence': float(score), + }) except Exception as e: print(e) return [[]] return [rec_res_final] - @serving def serving_method(self, images, **kwargs): """ @@ -121,7 +119,7 @@ class OCRRec(hub.Module): results = self.predict(images_decode, **kwargs) return results - + if __name__ == '__main__': ocr = OCRRec() image_path = [ @@ -130,4 +128,4 @@ if __name__ == '__main__': './doc/imgs_words/ch/word_3.jpg', ] res = ocr.predict(paths=image_path) - print(res) \ No newline at end of file + print(res) diff --git a/deploy/hubserving/ocr_rec/params.py b/deploy/hubserving/ocr_rec/params.py index 58a8bc119e2a54ad78446bd616eeb7a9089a6084..284ca640f2ddddadd69767c46654050097981b75 100644 --- a/deploy/hubserving/ocr_rec/params.py +++ b/deploy/hubserving/ocr_rec/params.py @@ -38,6 +38,15 @@ def read_params(): cfg.rec_char_dict_path = "./ppocr/utils/ppocr_keys_v1.txt" cfg.use_space_char = True + #params for text classifier + cfg.use_angle_cls = True + cfg.cls_model_dir = "./inference/ch_ppocr_mobile_v1.1_cls_infer/" + cfg.cls_image_shape = "3, 48, 192" + cfg.label_list = ['0', '180'] + cfg.cls_batch_num = 30 + cfg.cls_thresh = 0.9 + cfg.use_zero_copy_run = False + cfg.use_pdserving = False return cfg diff --git a/deploy/hubserving/ocr_system/module.py b/deploy/hubserving/ocr_system/module.py index cb526e1185d8eb623af84ba2451ff38523bbf642..a959fc0e063597acda3d6a6f0d5828b73db0be2e 100644 --- a/deploy/hubserving/ocr_system/module.py +++ b/deploy/hubserving/ocr_system/module.py @@ -3,11 +3,14 @@ from __future__ import absolute_import from __future__ import division from __future__ import print_function +import os +import sys +sys.path.insert(0, ".") + import argparse import ast import copy import math -import os import time from paddle.fluid.core import AnalysisConfig, create_paddle_predictor, PaddleTensor @@ -52,7 +55,7 @@ class OCRSystem(hub.Module): ) cfg.ir_optim = True cfg.enable_mkldnn = enable_mkldnn - + self.text_sys = TextSystem(cfg) def read_images(self, paths=[]): @@ -67,9 +70,7 @@ class OCRSystem(hub.Module): images.append(img) return images - def predict(self, - images=[], - paths=[]): + def predict(self, images=[], paths=[]): """ Get the chinese texts in the predicted images. Args: @@ -104,13 +105,11 @@ class OCRSystem(hub.Module): for dno in range(dt_num): text, score = rec_res[dno] - rec_res_final.append( - { - 'text': text, - 'confidence': float(score), - 'text_region': dt_boxes[dno].astype(np.int).tolist() - } - ) + rec_res_final.append({ + 'text': text, + 'confidence': float(score), + 'text_region': dt_boxes[dno].astype(np.int).tolist() + }) all_results.append(rec_res_final) return all_results @@ -123,7 +122,7 @@ class OCRSystem(hub.Module): results = self.predict(images_decode, **kwargs) return results - + if __name__ == '__main__': ocr = OCRSystem() image_path = [ @@ -131,4 +130,4 @@ if __name__ == '__main__': './doc/imgs/12.jpg', ] res = ocr.predict(paths=image_path) - print(res) \ No newline at end of file + print(res) diff --git a/deploy/hubserving/ocr_system/params.py b/deploy/hubserving/ocr_system/params.py index d83fe692dca7c94c7225a1aa26e782765e665bdd..434a49ff4077df550037a711050e9f6b6501dfa1 100644 --- a/deploy/hubserving/ocr_system/params.py +++ b/deploy/hubserving/ocr_system/params.py @@ -39,12 +39,14 @@ def read_params(): cfg.use_space_char = True #params for text classifier - cfg.use_angle_cls = False - cfg.cls_model_dir = "./inference/ch_ppocr_mobile-v1.1.cls_infer/" + cfg.use_angle_cls = True + cfg.cls_model_dir = "./inference/ch_ppocr_mobile_v1.1_cls_infer/" cfg.cls_image_shape = "3, 48, 192" cfg.label_list = ['0', '180'] cfg.cls_batch_num = 30 + cfg.cls_thresh = 0.9 cfg.use_zero_copy_run = False + cfg.use_pdserving = False return cfg diff --git a/deploy/hubserving/readme.md b/deploy/hubserving/readme.md index 5d29b432ba3d4c098872431c9b5fde13f553eee0..9e87dd135256546f223492cbc7ab7ab8cde83d58 100644 --- a/deploy/hubserving/readme.md +++ b/deploy/hubserving/readme.md @@ -1,8 +1,8 @@ [English](readme_en.md) | 简体中文 PaddleOCR提供2种服务部署方式: -- 基于PaddleHub Serving的部署:代码路径为"`./deploy/hubserving`",按照本教程使用; -- 基于PaddleServing的部署:代码路径为"`./deploy/pdserving`",使用方法参考[文档](../pdserving/readme.md)。 +- 基于PaddleHub Serving的部署:代码路径为"`./deploy/hubserving`",按照本教程使用; +- 基于PaddleServing的部署:代码路径为"`./deploy/pdserving`",使用方法参考[文档](../../deploy/pdserving/readme.md)。 # 基于PaddleHub Serving的服务部署 @@ -29,17 +29,15 @@ deploy/hubserving/ocr_system/ ```shell # 安装paddlehub pip3 install paddlehub --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple - -# 在Linux下设置环境变量 -export PYTHONPATH=. - -# 或者,在Windows下设置环境变量 -SET PYTHONPATH=. ``` ### 2. 下载推理模型 -安装服务模块前,需要准备推理模型并放到正确路径。默认使用的是v1.1版的超轻量模型,默认检测模型路径为: -`./inference/ch_ppocr_mobile_v1.1_det_infer/`,识别模型路径为:`./inference/ch_ppocr_mobile_v1.1_rec_infer/`。 +安装服务模块前,需要准备推理模型并放到正确路径。默认使用的是v1.1版的超轻量模型,默认模型路径为: +``` +检测模型:./inference/ch_ppocr_mobile_v1.1_det_infer/ +识别模型:./inference/ch_ppocr_mobile_v1.1_rec_infer/ +方向分类器:./inference/ch_ppocr_mobile_v1.1_cls_infer/ +``` **模型路径可在`params.py`中查看和修改。** 更多模型可以从PaddleOCR提供的[模型库](../../doc/doc_ch/models_list.md)下载,也可以替换成自己训练转换好的模型。 @@ -173,7 +171,7 @@ hub serving start -c deploy/hubserving/ocr_system/config.json ```hub serving stop --port/-p XXXX``` - 2、 到相应的`module.py`和`params.py`等文件中根据实际需求修改代码。 -例如,如果需要替换部署服务所用模型,则需要到`params.py`中修改模型路径参数`det_model_dir`和`rec_model_dir`,当然,同时可能还需要修改其他相关参数,请根据实际情况修改调试。 **强烈建议修改后先直接运行`module.py`调试,能正确运行预测后再启动服务测试。** +例如,如果需要替换部署服务所用模型,则需要到`params.py`中修改模型路径参数`det_model_dir`和`rec_model_dir`,如果需要关闭文本方向分类器,则将参数`use_angle_cls`置为`False`,当然,同时可能还需要修改其他相关参数,请根据实际情况修改调试。 **强烈建议修改后先直接运行`module.py`调试,能正确运行预测后再启动服务测试。** - 3、 卸载旧服务包 ```hub uninstall ocr_system``` diff --git a/deploy/hubserving/readme_en.md b/deploy/hubserving/readme_en.md index efef1cda6dd5a91d6ad2f7db27061418fa24e105..6a8da865a1bcb5564a4a8694bbbff0f4a4f75850 100644 --- a/deploy/hubserving/readme_en.md +++ b/deploy/hubserving/readme_en.md @@ -1,8 +1,8 @@ English | [简体中文](readme.md) -PaddleOCR provides 2 service deployment methods: -- Based on **PaddleHub Serving**: Code path is "`./deploy/hubserving`". Please follow this tutorial. -- Based on **PaddleServing**: Code path is "`./deploy/pdserving`". Please refer to the [tutorial](../pdserving/readme_en.md) for usage. +PaddleOCR provides 2 service deployment methods: +- Based on **PaddleHub Serving**: Code path is "`./deploy/hubserving`". Please follow this tutorial. +- Based on **PaddleServing**: Code path is "`./deploy/pdserving`". Please refer to the [tutorial](../../deploy/pdserving/readme.md) for usage. # Service deployment based on PaddleHub Serving @@ -30,16 +30,15 @@ The following steps take the 2-stage series service as an example. If only the d ```shell # Install paddlehub pip3 install paddlehub --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple - -# Set environment variables on Linux -export PYTHONPATH=. - -# Set environment variables on Windows -SET PYTHONPATH=. ``` ### 2. Download inference model -Before installing the service module, you need to prepare the inference model and put it in the correct path. By default, the ultra lightweight model of v1.1 is used, and the default detection model path is: `./inference/ch_ppocr_mobile_v1.1_det_infer/`, the default recognition model path is: `./inference/ch_ppocr_mobile_v1.1_rec_infer/`. +Before installing the service module, you need to prepare the inference model and put it in the correct path. By default, the ultra lightweight model of v1.1 is used, and the default model path is: +``` +detection model: ./inference/ch_ppocr_mobile_v1.1_det_infer/ +recognition model: ./inference/ch_ppocr_mobile_v1.1_rec_infer/ +text direction classifier: ./inference/ch_ppocr_mobile_v1.1_cls_infer/ +``` **The model path can be found and modified in `params.py`.** More models provided by PaddleOCR can be obtained from the [model library](../../doc/doc_en/models_list_en.md). You can also use models trained by yourself. @@ -180,7 +179,7 @@ If you need to modify the service logic, the following steps are generally requi hub serving stop --port/-p XXXX ``` - 2. Modify the code in the corresponding files, like `module.py` and `params.py`, according to the actual needs. -For example, if you need to replace the model used by the deployed service, you need to modify model path parameters `det_model_dir` and `rec_model_dir` in `params.py`. Of course, other related parameters may need to be modified at the same time. Please modify and debug according to the actual situation. It is suggested to run `module.py` directly for debugging after modification before starting the service test. +For example, if you need to replace the model used by the deployed service, you need to modify model path parameters `det_model_dir` and `rec_model_dir` in `params.py`. If you want to turn off the text direction classifier, set the parameter `use_angle_cls` to `False`. Of course, other related parameters may need to be modified at the same time. Please modify and debug according to the actual situation. It is suggested to run `module.py` directly for debugging after modification before starting the service test. - 3. Uninstall old service module ```shell hub uninstall ocr_system diff --git a/deploy/lite/cls_process.cc b/deploy/lite/cls_process.cc index f522e4bc5a9050c981a91bcbd8dfefd719f034c2..9f5c3e9406cfe82fd1ded523d88890b6448ad5f1 100644 --- a/deploy/lite/cls_process.cc +++ b/deploy/lite/cls_process.cc @@ -17,7 +17,7 @@ #include #include -const std::vector rec_image_shape{3, 32, 100}; +const std::vector rec_image_shape{3, 48, 192}; cv::Mat ClsResizeImg(cv::Mat img) { int imgC, imgH, imgW; diff --git a/deploy/lite/config.txt b/deploy/lite/config.txt index f08f8e49dfe45ab0f4e47c994d471e0515771df6..670b2ff00efd7bd289c34c460df4582dd72a2df6 100644 --- a/deploy/lite/config.txt +++ b/deploy/lite/config.txt @@ -1,4 +1,5 @@ max_side_len 960 det_db_thresh 0.3 det_db_box_thresh 0.5 -det_db_unclip_ratio 1.6 \ No newline at end of file +det_db_unclip_ratio 1.6 +use_direction_classify 0 \ No newline at end of file diff --git a/deploy/lite/db_post_process.cc b/deploy/lite/db_post_process.cc index 495016bc7df5e2a901983fa8d78aecbc471f1166..0c1c8b9278a1f74857a8848a1ad6d7606e8d6415 100644 --- a/deploy/lite/db_post_process.cc +++ b/deploy/lite/db_post_process.cc @@ -112,7 +112,7 @@ OrderPointsClockwise(std::vector> pts) { } std::vector> GetMiniBoxes(cv::RotatedRect box, float &ssid) { - ssid = std::max(box.size.width, box.size.height); + ssid = std::min(box.size.width, box.size.height); cv::Mat points; cv::boxPoints(box, points); diff --git a/deploy/lite/ocr_db_crnn.cc b/deploy/lite/ocr_db_crnn.cc index 07bec2c6f8fc02936b6c69d472984735c7b541cb..cc06ce86b896699444b08869a1b2303d5494f4b2 100644 --- a/deploy/lite/ocr_db_crnn.cc +++ b/deploy/lite/ocr_db_crnn.cc @@ -107,13 +107,14 @@ cv::Mat DetResizeImg(const cv::Mat img, int max_size_len, } cv::Mat RunClsModel(cv::Mat img, std::shared_ptr predictor_cls, - const float thresh = 0.5) { + const float thresh = 0.9) { std::vector mean = {0.5f, 0.5f, 0.5f}; std::vector scale = {1 / 0.5f, 1 / 0.5f, 1 / 0.5f}; cv::Mat srcimg; img.copyTo(srcimg); cv::Mat crop_img; + img.copyTo(crop_img); cv::Mat resize_img; int index = 0; @@ -154,7 +155,8 @@ void RunRecModel(std::vector>> boxes, cv::Mat img, std::vector &rec_text, std::vector &rec_text_score, std::vector charactor_dict, - std::shared_ptr predictor_cls) { + std::shared_ptr predictor_cls, + int use_direction_classify) { std::vector mean = {0.5f, 0.5f, 0.5f}; std::vector scale = {1 / 0.5f, 1 / 0.5f, 1 / 0.5f}; @@ -166,7 +168,9 @@ void RunRecModel(std::vector>> boxes, cv::Mat img, int index = 0; for (int i = boxes.size() - 1; i >= 0; i--) { crop_img = GetRotateCropImage(srcimg, boxes[i]); - crop_img = RunClsModel(crop_img, predictor_cls); + if (use_direction_classify >= 1) { + crop_img = RunClsModel(crop_img, predictor_cls); + } float wh_ratio = static_cast(crop_img.cols) / static_cast(crop_img.rows); @@ -290,7 +294,7 @@ RunDetModel(std::shared_ptr predictor, cv::Mat img, cv::Mat bit_map; cv::threshold(cbuf_map, bit_map, threshold, maxvalue, cv::THRESH_BINARY); cv::Mat dilation_map; - cv::Mat dila_ele = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(2,2)); + cv::Mat dila_ele = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(2, 2)); cv::dilate(bit_map, dilation_map, dila_ele); auto boxes = BoxesFromBitmap(pred_map, dilation_map, Config); @@ -366,7 +370,8 @@ std::map LoadConfigTxt(std::string config_path) { int main(int argc, char **argv) { if (argc < 5) { std::cerr << "[ERROR] usage: " << argv[0] - << " det_model_file rec_model_file image_path\n"; + << " det_model_file cls_model_file rec_model_file image_path " + "charactor_dict\n"; exit(1); } std::string det_model_file = argv[1]; @@ -377,6 +382,7 @@ int main(int argc, char **argv) { //// load config from txt file auto Config = LoadConfigTxt("./config.txt"); + int use_direction_classify = int(Config["use_direction_classify"]); auto start = std::chrono::system_clock::now(); @@ -392,8 +398,9 @@ int main(int argc, char **argv) { std::vector rec_text; std::vector rec_text_score; + RunRecModel(boxes, srcimg, rec_predictor, rec_text, rec_text_score, - charactor_dict, cls_predictor); + charactor_dict, cls_predictor, use_direction_classify); auto end = std::chrono::system_clock::now(); auto duration = diff --git a/deploy/lite/readme.md b/deploy/lite/readme.md index 219cc83fe4487400e886e47e46cb30275ba72c14..3bc6f2866ce63dc8103815cf6c9ebc772ee671af 100644 --- a/deploy/lite/readme.md +++ b/deploy/lite/readme.md @@ -15,10 +15,9 @@ Paddle Lite是飞桨轻量化推理引擎,为手机、IOT端提供高效推理 交叉编译环境用于编译 Paddle Lite 和 PaddleOCR 的C++ demo。 支持多种开发环境,不同开发环境的编译流程请参考对应文档。 -1. [Docker](https://paddle-lite.readthedocs.io/zh/latest/user_guides/source_compile.html#docker) -2. [Linux](https://paddle-lite.readthedocs.io/zh/latest/user_guides/source_compile.html#android) -3. [MAC OS](https://paddle-lite.readthedocs.io/zh/latest/user_guides/source_compile.html#id13) -4. [Windows](https://paddle-lite.readthedocs.io/zh/latest/demo_guides/x86.html#id4) +1. [Docker](https://paddle-lite.readthedocs.io/zh/latest/source_compile/compile_env.html#docker) +2. [Linux](https://paddle-lite.readthedocs.io/zh/latest/source_compile/compile_env.html#linux) +3. [MAC OS](https://paddle-lite.readthedocs.io/zh/latest/source_compile/compile_env.html#mac-os) ### 1.2 准备预测库 @@ -26,18 +25,17 @@ Paddle Lite是飞桨轻量化推理引擎,为手机、IOT端提供高效推理 - 1. 直接下载,预测库下载链接如下: |平台|预测库下载链接| |-|-| - |Android|[arm7](https://paddlelite-data.bj.bcebos.com/Release/2.6.1/Android/inference_lite_lib.android.armv7.gcc.c++_static.with_extra.CV_ON.tar.gz) / [arm8](https://paddlelite-data.bj.bcebos.com/Release/2.6.1/Android/inference_lite_lib.android.armv8.gcc.c++_static.with_extra.CV_ON.tar.gz)| - |IOS|[arm7](https://paddlelite-data.bj.bcebos.com/Release/2.6.1/iOS/inference_lite_lib.ios.armv7.with_extra.CV_ON.tar.gz) / [arm8](https://paddlelite-data.bj.bcebos.com/Release/2.6.1/iOS/inference_lite_lib.ios64.armv8.with_extra.CV_ON.tar.gz)| - |x86(Linux)|[预测库](https://paddlelite-data.bj.bcebos.com/Release/2.6.1/X86/Linux/inference_lite_lib.x86.linux.tar.gz)| + |Android|[arm7](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.6.3/inference_lite_lib.android.armv7.gcc.c++_shared.with_extra.with_cv.tar.gz) / [arm8](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.6.3/inference_lite_lib.android.armv8.gcc.c++_shared.with_extra.with_cv.tar.gz)| + |IOS|[arm7](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.6.3/inference_lite_lib.ios.armv7.with_cv.with_extra.with_log.tiny_publish.tar.gz) / [arm8](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.6.3/inference_lite_lib.ios.armv8.with_cv.with_extra.with_log.tiny_publish.tar.gz)| - 注:如果是从下Paddle-Lite[官网文档](https://paddle-lite.readthedocs.io/zh/latest/user_guides/release_lib.html#android-toolchain-gcc)下载的预测库, - 注意选择`with_extra=ON,with_cv=ON`的下载链接。 + 注:1. 上述预测库为PaddleLite 2.6.3分支编译得到,有关PaddleLite 2.6.3 详细信息可参考[链接](https://github.com/PaddlePaddle/Paddle-Lite/releases/tag/v2.6.3)。 -- 2. 编译Paddle-Lite得到预测库,Paddle-Lite的编译方式如下: +- 2. [推荐]编译Paddle-Lite得到预测库,Paddle-Lite的编译方式如下: ``` git clone https://github.com/PaddlePaddle/Paddle-Lite.git cd Paddle-Lite -git checkout develop +# 切换到Paddle-Lite release/v2.7 稳定分支 +git checkout release/v2.7 ./lite/tools/build_android.sh --arch=armv8 --with_cv=ON --with_extra=ON ``` @@ -80,11 +78,17 @@ inference_lite_lib.android.armv8/ Paddle-Lite 提供了多种策略来自动优化原始的模型,其中包括量化、子图融合、混合调度、Kernel优选等方法,使用Paddle-lite的opt工具可以自动 对inference模型进行优化,优化后的模型更轻量,模型运行速度更快。 -下述表格中提供了优化好的超轻量中文模型: +如果已经准备好了 `.nb` 结尾的模型文件,可以跳过此步骤。 -|模型简介|检测模型|识别模型|Paddle-Lite版本| -|-|-|-|-| -|超轻量级中文OCR opt优化模型|[下载地址](https://paddleocr.bj.bcebos.com/deploy/lite/ch_det_mv3_db_opt.nb)|[下载地址](https://paddleocr.bj.bcebos.com/deploy/lite/ch_rec_mv3_crnn_opt.nb)|develop| +下述表格中也提供了一系列中文移动端模型: + +|模型版本|模型简介|模型大小|检测模型|文本方向分类模型|识别模型|Paddle-Lite版本| +|-|-|-|-|-|-|-| +|V1.1|超轻量中文OCR 移动端模型|8.1M|[下载地址](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_det_opt.nb)|[下载地址](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_cls_opt.nb)|[下载地址](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_rec_opt.nb)|v2.7| +|【slim】V1.1|超轻量中文OCR 移动端模型|3.5M|[下载地址](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_det_prune_opt.nb)|[下载地址](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_cls_quant_opt.nb)|[下载地址](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_rec_quant_opt.nb)|v2.7| +|V1.0|轻量级中文OCR 移动端模型|8.6M|[下载地址](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.0_det_opt.nb)|---|[下载地址](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.0_rec_opt.nb)|v2.7| + +注意:V1.1 3.0M 轻量模型是使用PaddleSlim优化后的,需要配合Paddle-Lite最新预测库使用。 如果直接使用上述表格中的模型进行部署,可略过下述步骤,直接阅读 [2.2节](#2.2与手机联调)。 @@ -95,7 +99,7 @@ Paddle-Lite 提供了多种策略来自动优化原始的模型,其中包括 # 如果准备环境时已经clone了Paddle-Lite,则不用重新clone Paddle-Lite git clone https://github.com/PaddlePaddle/Paddle-Lite.git cd Paddle-Lite -git checkout develop +git checkout release/v2.7 # 启动编译 ./lite/tools/build.sh build_optimize_tool ``` @@ -121,20 +125,27 @@ cd build.opt/lite/api/ 下面以PaddleOCR的超轻量中文模型为例,介绍使用编译好的opt文件完成inference模型到Paddle-Lite优化模型的转换。 ``` -# 下载PaddleOCR的超轻量文inference模型,并解压 +# 【推荐】 下载PaddleOCR V1.1版本的中英文 inference模型,V1.1比1.0效果更好,模型更小 +wget https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/det/ch_ppocr_mobile_v1.1_det_prune_infer.tar && tar xf ch_ppocr_mobile_v1.1_det_prune_infer.tar +wget https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/rec/ch_ppocr_mobile_v1.1_rec_quant_infer.tar && tar xf ch_ppocr_mobile_v1.1_rec_quant_infer.tar +# 转换V1.1检测模型 +./opt --model_file=./ch_ppocr_mobile_v1.1_det_prune_infer/model --param_file=./ch_ppocr_mobile_v1.1_det_prune_infer/params --optimize_out=./ch_ppocr_mobile_v1.1_det_prune_opt --valid_targets=arm +# 转换V1.1识别模型 +./opt --model_file=./ch_ppocr_mobile_v1.1_rec_quant_infer/model --param_file=./ch_ppocr_mobile_v1.1_rec_quant_infer/params --optimize_out=./ch_ppocr_mobile_v1.1_rec_quant_opt --valid_targets=arm + + +# 或下载使用PaddleOCR的V1.0超轻量中英文 inference模型,解压并转换为移动端支持的模型 wget https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db_infer.tar && tar xf ch_det_mv3_db_infer.tar wget https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar && tar xf ch_rec_mv3_crnn_infer.tar - -# 转换检测模型 +# 转换V1.0检测模型 ./opt --model_file=./ch_det_mv3_db/model --param_file=./ch_det_mv3_db/params --optimize_out_type=naive_buffer --optimize_out=./ch_det_mv3_db_opt --valid_targets=arm - -# 转换识别模型 +# 转换V1.0识别模型 ./opt --model_file=./ch_rec_mv3_crnn/model --param_file=./ch_rec_mv3_crnn/params --optimize_out_type=naive_buffer --optimize_out=./ch_rec_mv3_crnn_opt --valid_targets=arm ``` -转换成功后,当前目录下会多出`ch_det_mv3_db_opt.nb`, `ch_rec_mv3_crnn_opt.nb`结尾的文件,即是转换成功的模型文件。 +转换成功后,当前目录下会多出`.nb`结尾的文件,即是转换成功的模型文件。 -注意:使用paddle-lite部署时,需要使用opt工具优化后的模型。 opt 转换的输入模型是paddle保存的inference模型 +注意:使用paddle-lite部署时,需要使用opt工具优化后的模型。 opt 工具的输入模型是paddle保存的inference模型 ### 2.2 与手机联调 @@ -182,17 +193,18 @@ wget https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar && tar ``` 准备测试图像,以`PaddleOCR/doc/imgs/11.jpg`为例,将测试的图像复制到`demo/cxx/ocr/debug/`文件夹下。 - 准备lite opt工具优化后的模型文件,`ch_det_mv3_db_opt.nb,ch_rec_mv3_crnn_opt.nb`,放置在`demo/cxx/ocr/debug/`文件夹下。 + 准备lite opt工具优化后的模型文件,比如使用`ch_ppocr_mobile_v1.1_det_prune_opt.nb,ch_ppocr_mobile_v1.1_rec_quant_opt.nb, ch_ppocr_mobile_cls_quant_opt.nb`,模型文件放置在`demo/cxx/ocr/debug/`文件夹下。 执行完成后,ocr文件夹下将有如下文件格式: ``` demo/cxx/ocr/ |-- debug/ -| |--ch_det_mv3_db_opt.nb 优化后的检测模型文件 -| |--ch_rec_mv3_crnn_opt.nb 优化后的识别模型文件 +| |--ch_ppocr_mobile_v1.1_det_prune_opt.nb 优化后的检测模型文件 +| |--ch_ppocr_mobile_v1.1_rec_quant_opt.nb 优化后的识别模型文件 +| |--ch_ppocr_mobile_cls_quant_opt.nb 优化后的文字方向分类器模型文件 | |--11.jpg 待测试图像 -| |--ppocr_keys_v1.txt 字典文件 +| |--ppocr_keys_v1.txt 中文字典文件 | |--libpaddle_light_api_shared.so C++预测库文件 | |--config.txt DB-CRNN超参数配置 |-- config.txt DB-CRNN超参数配置 @@ -202,7 +214,27 @@ demo/cxx/ocr/ |-- db_post_process.h |-- Makefile 编译文件 |-- ocr_db_crnn.cc C++预测源文件 +``` +#### 注意: +1. ppocr_keys_v1.txt是中文字典文件,如果使用的 nb 模型是英文数字或其他语言的模型,需要更换为对应语言的字典。 +PaddleOCR 在ppocr/utils/下存放了多种字典,包括: +``` +dict/french_dict.txt # 法语字典 +dict/german_dict.txt # 德语字典 +ic15_dict.txt # 英文字典 +dict/japan_dict.txt # 日语字典 +dict/korean_dict.txt # 韩语字典 +ppocr_keys_v1.txt # 中文字典 +``` + +2. `config.txt` 包含了检测器、分类器的超参数,如下: +``` +max_side_len 960 # 输入图像长宽大于960时,等比例缩放图像,使得图像最长边为960 +det_db_thresh 0.3 # 用于过滤DB预测的二值化图像,设置为0.-0.3对结果影响不明显 +det_db_box_thresh 0.5 # DB后处理过滤box的阈值,如果检测存在漏框情况,可酌情减小 +det_db_unclip_ratio 1.6 # 表示文本框的紧致程度,越小则文本框更靠近文本 +use_direction_classify 0 # 是否使用方向分类器,0表示不使用,1表示使用 ``` 5. 启动调试 @@ -212,7 +244,7 @@ demo/cxx/ocr/ ``` # 执行编译,得到可执行文件ocr_db_crnn # ocr_db_crnn可执行文件的使用方式为: - # ./ocr_db_crnn 检测模型文件 识别模型文件 测试图像路径 + # ./ocr_db_crnn 检测模型文件 方向分类器模型文件 识别模型文件 测试图像路径 字典文件路径 make -j # 将编译的可执行文件移动到debug文件夹中 mv ocr_db_crnn ./debug/ @@ -220,8 +252,8 @@ demo/cxx/ocr/ adb push debug /data/local/tmp/ adb shell cd /data/local/tmp/debug - export LD_LIBRARY_PATH=/data/local/tmp/debug:$LD_LIBRARY_PATH - ./ocr_db_crnn ch_det_mv3_db_opt.nb ch_rec_mv3_crnn_opt.nb ./11.jpg ppocr_keys_v1.txt + export LD_LIBRARY_PATH=${PWD}:$LD_LIBRARY_PATH + ./ocr_db_crnn ch_ppocr_mobile_v1.1_det_prune_opt.nb ch_ppocr_mobile_v1.1_rec_quant_opt.nb ch_ppocr_mobile_cls_quant_opt.nb ./11.jpg ppocr_keys_v1.txt ``` 如果对代码做了修改,则需要重新编译并push到手机上。 @@ -231,3 +263,14 @@ demo/cxx/ocr/
+ + +## FAQ +Q1:如果想更换模型怎么办,需要重新按照流程走一遍吗? +A1:如果已经走通了上述步骤,更换模型只需要替换 .nb 模型文件即可,同时要注意字典更新 + +Q2:换一个图测试怎么做? +A2:替换debug下的.jpg测试图像为你想要测试的图像,adb push 到手机上即可 + +Q3:如何封装到手机APP中? +A3:此demo旨在提供能在手机上运行OCR的核心算法部分,PaddleOCR/deploy/android_demo是将这个demo封装到手机app的示例,供参考 diff --git a/deploy/lite/readme_en.md b/deploy/lite/readme_en.md index bf2f4b2212bf4d362fe2127da66127ab05766668..d72e0b9ce9c71fab72e8cc7042cc0338a5fabcde 100644 --- a/deploy/lite/readme_en.md +++ b/deploy/lite/readme_en.md @@ -1,10 +1,10 @@ # Tutorial of PaddleOCR Mobile deployment -This tutorial will introduce how to use paddle-lite to deploy paddleOCR ultra-lightweight Chinese and English detection models on mobile phones. +This tutorial will introduce how to use [paddle-lite](https://github.com/PaddlePaddle/Paddle-Lite) to deploy paddleOCR ultra-lightweight Chinese and English detection models on mobile phones. paddle-lite is a lightweight inference engine for PaddlePaddle. -It provides efficient inference capabilities for mobile phones and IOTs, +It provides efficient inference capabilities for mobile phones and IoTs, and extensively integrates cross-platform hardware to provide lightweight deployment solutions for end-side deployment issues. @@ -14,19 +14,28 @@ deployment solutions for end-side deployment issues. - Mobile phone (arm7 or arm8) ## 2. Build PaddleLite library -[build for Docker](https://paddle-lite.readthedocs.io/zh/latest/user_guides/source_compile.html#docker) -[build for Linux](https://paddle-lite.readthedocs.io/zh/latest/user_guides/source_compile.html#android) -[build for MAC OS](https://paddle-lite.readthedocs.io/zh/latest/user_guides/source_compile.html#id13) -[build for windows](https://paddle-lite.readthedocs.io/zh/latest/demo_guides/x86.html#id4) +1. [Docker](https://paddle-lite.readthedocs.io/zh/latest/source_compile/compile_env.html#docker) +2. [Linux](https://paddle-lite.readthedocs.io/zh/latest/source_compile/compile_env.html#linux) +3. [MAC OS](https://paddle-lite.readthedocs.io/zh/latest/source_compile/compile_env.html#mac-os) -## 3. Download prebuild library for android and ios +## 3. Prepare prebuild library for android and ios +### 3.1 Download prebuild library |Platform|Prebuild library Download Link| |-|-| -|Android|[arm7](https://paddlelite-data.bj.bcebos.com/Release/2.6.1/Android/inference_lite_lib.android.armv7.gcc.c++_static.with_extra.CV_ON.tar.gz) / [arm8](https://paddlelite-data.bj.bcebos.com/Release/2.6.1/Android/inference_lite_lib.android.armv8.gcc.c++_static.with_extra.CV_ON.tar.gz)| -|IOS|[arm7](https://paddlelite-data.bj.bcebos.com/Release/2.6.1/iOS/inference_lite_lib.ios.armv7.with_extra.CV_ON.tar.gz) / [arm8](https://paddlelite-data.bj.bcebos.com/Release/2.6.1/iOS/inference_lite_lib.ios64.armv8.with_extra.CV_ON.tar.gz)| -|x86(Linux)|[预测库](https://paddlelite-data.bj.bcebos.com/Release/2.6.1/X86/Linux/inference_lite_lib.x86.linux.tar.gz)| +|Android|[arm7](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.6.3/inference_lite_lib.android.armv7.gcc.c++_shared.with_extra.with_cv.tar.gz) / [arm8](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.6.3/inference_lite_lib.android.armv8.gcc.c++_shared.with_extra.with_cv.tar.gz)| +|IOS|[arm7](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.6.3/inference_lite_lib.ios.armv7.with_cv.with_extra.with_log.tiny_publish.tar.gz) / [arm8](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.6.3/inference_lite_lib.ios.armv8.with_cv.with_extra.with_log.tiny_publish.tar.gz)| +note: The above pre-build inference library is compiled from the PaddleLite `release/v2.7` branch. For more information about PaddleLite 2.6.3, please refer to [link](https://github.com/PaddlePaddle/Paddle-Lite/releases/tag/v2.6.3). + +### 3.2 Compile prebuild library (Recommended) +``` +git clone https://github.com/PaddlePaddle/Paddle-Lite.git +cd Paddle-Lite +# checkout to Paddle-Lite release/v2.7 branch +git checkout release/v2.7 +./lite/tools/build_android.sh --arch=armv8 --with_cv=ON --with_extra=ON +``` The structure of the prediction library is as follows: @@ -56,24 +65,27 @@ inference_lite_lib.android.armv8/ ``` - ## 4. Inference Model Optimization Paddle Lite provides a variety of strategies to automatically optimize the original training model, including quantization, sub-graph fusion, hybrid scheduling, Kernel optimization and so on. In order to make the optimization process more convenient and easy to use, Paddle Lite provide opt tools to automatically complete the optimization steps and output a lightweight, optimal executable model. -If you use PaddleOCR 8.6M OCR model to deploy, you can directly download the optimized model. +If you have prepared the model file ending in `.nb`, you can skip this step. +The following table also provides a series of models that can be deployed on mobile phones to recognize Chinese. +You can directly download the optimized model. -|Introduction|Detection model|Recognition model|Paddle Lite branch | -|-|-|-|-| -|lightweight Chinese OCR optimized model|[Download](https://paddleocr.bj.bcebos.com/deploy/lite/ch_det_mv3_db_opt.nb)|[Download](https://paddleocr.bj.bcebos.com/deploy/lite/ch_rec_mv3_crnn_opt.nb)|develop| +| Version | Introduction | Model size | Detection model | Text Direction model | Recognition model | Paddle Lite branch | +| - | - | - | - | - | - | - | +| V1.1 | extra-lightweight chinese OCR optimized model | 8.1M | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_det_opt.nb) | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_cls_opt.nb) | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_rec_opt.nb) | develop | +| [slim] V1.1 | extra-lightweight chinese OCR optimized model | 3.5M | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_det_prune_opt.nb) | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_cls_quant_opt.nb) | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_rec_quant_opt.nb) | develop | +| V1.0 | lightweight Chinese OCR optimized model | 8.6M | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.0_det_opt.nb) | - | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.0_rec_opt.nb) | develop | If the model to be deployed is not in the above table, you need to follow the steps below to obtain the optimized model. ``` git clone https://github.com/PaddlePaddle/Paddle-Lite.git cd Paddle-Lite -git checkout develop +git checkout release/v2.7 ./lite/tools/build.sh build_optimize_tool ``` @@ -85,6 +97,14 @@ The `opt` can optimize the inference model saved by paddle.io.save_inference_mod The usage of opt is as follows: ``` +# 【Recommend】V1.1 is better than V1.0. steps for convert V1.1 model to nb file are as follows +wget https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/det/ch_ppocr_mobile_v1.1_det_prune_infer.tar && tar xf ch_ppocr_mobile_v1.1_det_prune_infer.tar +wget https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/rec/ch_ppocr_mobile_v1.1_rec_quant_infer.tar && tar xf ch_ppocr_mobile_v1.1_rec_quant_infer.tar + +./opt --model_file=./ch_ppocr_mobile_v1.1_det_prune_infer/model --param_file=./ch_ppocr_mobile_v1.1_det_prune_infer/params --optimize_out=./ch_ppocr_mobile_v1.1_det_prune_opt --valid_targets=arm +./opt --model_file=./ch_ppocr_mobile_v1.1_rec_quant_infer/model --param_file=./ch_ppocr_mobile_v1.1_rec_quant_infer/params --optimize_out=./ch_ppocr_mobile_v1.1_rec_quant_opt --valid_targets=arm + +# or use V1.0 model wget https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db_infer.tar && tar xf ch_det_mv3_db_infer.tar wget https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar && tar xf ch_rec_mv3_crnn_infer.tar @@ -93,8 +113,7 @@ wget https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar && tar ``` -When the above code command is completed, there will be two more files `ch_det_mv3_db_opt.nb`, -`ch_rec_mv3_crnn_opt.nb` in the current directory, which is the converted model file. +When the above code command is completed, there will be two more files `.nb` in the current directory, which is the converted model file. ## 5. Run optimized model on Phone @@ -153,8 +172,9 @@ The structure of the OCR demo is as follows after the above command is executed: ``` demo/cxx/ocr/ |-- debug/ -| |--ch_det_mv3_db_opt.nb Detection model -| |--ch_rec_mv3_crnn_opt.nb Recognition model +| |--ch_ppocr_mobile_v1.1_det_prune_opt.nb Detection model +| |--ch_ppocr_mobile_v1.1_rec_quant_opt.nb Recognition model +| |--ch_ppocr_mobile_cls_quant_opt.nb Text direction classification model | |--11.jpg Image for OCR | |--ppocr_keys_v1.txt Dictionary file | |--libpaddle_light_api_shared.so C++ .so file @@ -169,6 +189,28 @@ demo/cxx/ocr/ ``` +#### Note: +1. ppocr_keys_v1.txt is a Chinese dictionary file. +If the nb model is used for English recognition or other language recognition, dictionary file should be replaced with a dictionary of the corresponding language. +PaddleOCR provides a variety of dictionaries under ppocr/utils/, including: +``` +dict/french_dict.txt # french +dict/german_dict.txt # german +ic15_dict.txt # english +dict/japan_dict.txt # japan +dict/korean_dict.txt # korean +ppocr_keys_v1.txt # chinese +``` + +2. `config.txt` of the detector and classifier, as shown below: +``` +max_side_len 960 # Limit the maximum image height and width to 960 +det_db_thresh 0.3 # Used to filter the binarized image of DB prediction, setting 0.-0.3 has no obvious effect on the result +det_db_box_thresh 0.5 # DDB post-processing filter box threshold, if there is a missing box detected, it can be reduced as appropriate +det_db_unclip_ratio 1.6 # Indicates the compactness of the text box, the smaller the value, the closer the text box to the text +use_direction_classify 0 # Whether to use the direction classifier, 0 means not to use, 1 means to use +``` + 5. Run Model on phone ``` @@ -180,7 +222,7 @@ adb shell cd /data/local/tmp/debug export LD_LIBRARY_PATH=/data/local/tmp/debug:$LD_LIBRARY_PATH # run model -./ocr_db_crnn ch_det_mv3_db_opt.nb ch_rec_mv3_crnn_opt.nb ./11.jpg ppocr_keys_v1.txt + ./ocr_db_crnn ch_ppocr_mobile_v1.1_det_prune_opt.nb ch_ppocr_mobile_v1.1_rec_quant_opt.nb ch_ppocr_mobile_cls_quant_opt.nb ./11.jpg ppocr_keys_v1.txt ``` The outputs are as follows: @@ -188,3 +230,15 @@ The outputs are as follows:
+ +## FAQ + +Q1: What if I want to change the model, do I need to run it again according to the process? +A1: If you have performed the above steps, you only need to replace the .nb model file to complete the model replacement. + +Q2: How to test with another picture? +A2: Replace the .jpg test image under `./debug` with the image you want to test, and run `adb push` to push new image to the phone. + +Q3: How to package it into the mobile APP? +A3: This demo aims to provide the core algorithm part that can run OCR on mobile phones. Further, +PaddleOCR/deploy/android_demo is an example of encapsulating this demo into a mobile app for reference. diff --git a/deploy/pdserving/clas_local_server.py b/deploy/pdserving/clas_local_server.py new file mode 100644 index 0000000000000000000000000000000000000000..f823ae5a1f1a2e0afd5d10a94e55ee34292089f6 --- /dev/null +++ b/deploy/pdserving/clas_local_server.py @@ -0,0 +1,129 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from paddle_serving_client import Client +import cv2 +import sys +import numpy as np +import os +import time +import re +import base64 +from tools.infer.predict_cls import TextClassifier +from params import read_params + +global_args = read_params() +if global_args.use_gpu: + from paddle_serving_server_gpu.web_service import WebService +else: + from paddle_serving_server.web_service import WebService + + +class TextClassifierHelper(TextClassifier): + def __init__(self, args): + self.cls_image_shape = [int(v) for v in args.cls_image_shape.split(",")] + self.cls_batch_num = args.rec_batch_num + self.label_list = args.label_list + self.cls_thresh = args.cls_thresh + self.fetch = [ + "save_infer_model/scale_0.tmp_0", "save_infer_model/scale_1.tmp_0" + ] + + def preprocess(self, img_list): + args = {} + img_num = len(img_list) + args["img_list"] = img_list + # Calculate the aspect ratio of all text bars + width_list = [] + for img in img_list: + width_list.append(img.shape[1] / float(img.shape[0])) + # Sorting can speed up the cls process + indices = np.argsort(np.array(width_list)) + args["indices"] = indices + cls_res = [['', 0.0]] * img_num + batch_num = self.cls_batch_num + predict_time = 0 + beg_img_no, end_img_no = 0, img_num + norm_img_batch = [] + max_wh_ratio = 0 + for ino in range(beg_img_no, end_img_no): + h, w = img_list[indices[ino]].shape[0:2] + wh_ratio = w * 1.0 / h + max_wh_ratio = max(max_wh_ratio, wh_ratio) + for ino in range(beg_img_no, end_img_no): + norm_img = self.resize_norm_img(img_list[indices[ino]]) + norm_img = norm_img[np.newaxis, :] + norm_img_batch.append(norm_img) + norm_img_batch = np.concatenate(norm_img_batch) + feed = {"image": norm_img_batch.copy()} + return feed, self.fetch, args + + def postprocess(self, outputs, args): + prob_out = outputs[0] + label_out = outputs[1] + indices = args["indices"] + img_list = args["img_list"] + cls_res = [['', 0.0]] * len(label_out) + if len(label_out.shape) != 1: + prob_out, label_out = label_out, prob_out + for rno in range(len(label_out)): + label_idx = label_out[rno] + score = prob_out[rno][label_idx] + label = self.label_list[label_idx] + cls_res[indices[rno]] = [label, score] + if '180' in label and score > self.cls_thresh: + img_list[indices[rno]] = cv2.rotate(img_list[indices[rno]], 1) + return img_list, cls_res + + +class OCRService(WebService): + def init_rec(self): + self.text_classifier = TextClassifierHelper(global_args) + + def preprocess(self, feed=[], fetch=[]): + img_list = [] + for feed_data in feed: + data = base64.b64decode(feed_data["image"].encode('utf8')) + data = np.fromstring(data, np.uint8) + im = cv2.imdecode(data, cv2.IMREAD_COLOR) + img_list.append(im) + feed, fetch, self.tmp_args = self.text_classifier.preprocess(img_list) + return feed, fetch + + def postprocess(self, feed={}, fetch=[], fetch_map=None): + outputs = [fetch_map[x] for x in self.text_classifier.fetch] + for x in fetch_map.keys(): + if ".lod" in x: + self.tmp_args[x] = fetch_map[x] + _, rec_res = self.text_classifier.postprocess(outputs, self.tmp_args) + res = [] + for i in range(len(rec_res)): + res.append({ + "direction": rec_res[i][0], + "confidence": float(rec_res[i][1]) + }) + return res + + +if __name__ == "__main__": + ocr_service = OCRService(name="ocr") + ocr_service.load_model_config(global_args.cls_server_dir) + ocr_service.init_rec() + if global_args.use_gpu: + ocr_service.prepare_server( + workdir="workdir", port=9292, device="gpu", gpuid=0) + else: + ocr_service.prepare_server(workdir="workdir", port=9292, device="cpu") + ocr_service.run_debugger_service() + ocr_service.run_web_service() diff --git a/deploy/pdserving/clas_rpc_server.py b/deploy/pdserving/clas_rpc_server.py new file mode 100644 index 0000000000000000000000000000000000000000..cd480031a893d50ee795937533467ca1eba026e7 --- /dev/null +++ b/deploy/pdserving/clas_rpc_server.py @@ -0,0 +1,135 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from paddle_serving_client import Client +import cv2 +import sys +import numpy as np +import os +import time +import re +import base64 +from tools.infer.predict_cls import TextClassifier +from params import read_params + +global_args = read_params() +if global_args.use_gpu: + from paddle_serving_server_gpu.web_service import WebService +else: + from paddle_serving_server.web_service import WebService + + +class TextClassifierHelper(TextClassifier): + def __init__(self, args): + self.cls_image_shape = [int(v) for v in args.cls_image_shape.split(",")] + self.cls_batch_num = args.rec_batch_num + self.label_list = args.label_list + self.cls_thresh = args.cls_thresh + self.fetch = [ + "save_infer_model/scale_0.tmp_0", "save_infer_model/scale_1.tmp_0" + ] + + def preprocess(self, img_list): + args = {} + img_num = len(img_list) + args["img_list"] = img_list + # Calculate the aspect ratio of all text bars + width_list = [] + for img in img_list: + width_list.append(img.shape[1] / float(img.shape[0])) + # Sorting can speed up the cls process + indices = np.argsort(np.array(width_list)) + args["indices"] = indices + cls_res = [['', 0.0]] * img_num + batch_num = self.cls_batch_num + predict_time = 0 + beg_img_no, end_img_no = 0, img_num + norm_img_batch = [] + max_wh_ratio = 0 + for ino in range(beg_img_no, end_img_no): + h, w = img_list[indices[ino]].shape[0:2] + wh_ratio = w * 1.0 / h + max_wh_ratio = max(max_wh_ratio, wh_ratio) + for ino in range(beg_img_no, end_img_no): + norm_img = self.resize_norm_img(img_list[indices[ino]]) + norm_img = norm_img[np.newaxis, :] + norm_img_batch.append(norm_img) + norm_img_batch = np.concatenate(norm_img_batch) + if img_num > 1: + feed = [{ + "image": norm_img_batch[x] + } for x in range(norm_img_batch.shape[0])] + else: + feed = {"image": norm_img_batch[0]} + return feed, self.fetch, args + + def postprocess(self, outputs, args): + prob_out = outputs[0] + label_out = outputs[1] + indices = args["indices"] + img_list = args["img_list"] + cls_res = [['', 0.0]] * len(label_out) + if len(label_out.shape) != 1: + prob_out, label_out = label_out, prob_out + for rno in range(len(label_out)): + label_idx = label_out[rno] + score = prob_out[rno][label_idx] + label = self.label_list[label_idx] + cls_res[indices[rno]] = [label, score] + if '180' in label and score > self.cls_thresh: + img_list[indices[rno]] = cv2.rotate(img_list[indices[rno]], 1) + return img_list, cls_res + + +class OCRService(WebService): + def init_rec(self): + self.text_classifier = TextClassifierHelper(global_args) + + def preprocess(self, feed=[], fetch=[]): + # TODO: to handle batch rec images + img_list = [] + for feed_data in feed: + data = base64.b64decode(feed_data["image"].encode('utf8')) + data = np.fromstring(data, np.uint8) + im = cv2.imdecode(data, cv2.IMREAD_COLOR) + img_list.append(im) + feed, fetch, self.tmp_args = self.text_classifier.preprocess(img_list) + return feed, fetch + + def postprocess(self, feed={}, fetch=[], fetch_map=None): + outputs = [fetch_map[x] for x in self.text_classifier.fetch] + for x in fetch_map.keys(): + if ".lod" in x: + self.tmp_args[x] = fetch_map[x] + _, rec_res = self.text_classifier.postprocess(outputs, self.tmp_args) + res = [] + for i in range(len(rec_res)): + res.append({ + "direction": rec_res[i][0], + "confidence": float(rec_res[i][1]) + }) + return res + + +if __name__ == "__main__": + ocr_service = OCRService(name="ocr") + ocr_service.load_model_config(global_args.cls_server_dir) + ocr_service.init_rec() + if global_args.use_gpu: + ocr_service.prepare_server( + workdir="workdir", port=9292, device="gpu", gpuid=0) + else: + ocr_service.prepare_server(workdir="workdir", port=9292, device="cpu") + ocr_service.run_rpc_service() + ocr_service.run_web_service() diff --git a/deploy/pdserving/det_local_server.py b/deploy/pdserving/det_local_server.py index eb7948daadd018810997bba78367e86aa3398e31..1ddb2d9a70f1304d2c3eaf047f7de986b730c86d 100644 --- a/deploy/pdserving/det_local_server.py +++ b/deploy/pdserving/det_local_server.py @@ -17,63 +17,93 @@ import cv2 import sys import numpy as np import os -from paddle_serving_client import Client -from paddle_serving_app.reader import Sequential, ResizeByFactor -from paddle_serving_app.reader import Div, Normalize, Transpose -from paddle_serving_app.reader import DBPostProcess, FilterBoxes -if sys.argv[1] == 'gpu': - from paddle_serving_server_gpu.web_service import WebService -elif sys.argv[1] == 'cpu': - from paddle_serving_server.web_service import WebService import time import re import base64 +from tools.infer.predict_det import TextDetector +from params import read_params + +global_args = read_params() +if global_args.use_gpu: + from paddle_serving_server_gpu.web_service import WebService +else: + from paddle_serving_server.web_service import WebService -class OCRService(WebService): +class TextDetectorHelper(TextDetector): + def __init__(self, args): + super(TextDetectorHelper, self).__init__(args) + if self.det_algorithm == "SAST": + self.fetch = [ + "bn_f_border4.output.tmp_2", "bn_f_tco4.output.tmp_2", + "bn_f_tvo4.output.tmp_2", "sigmoid_0.tmp_0" + ] + elif self.det_algorithm == "EAST": + self.fetch = ["sigmoid_0.tmp_0", "tmp_2"] + elif self.det_algorithm == "DB": + self.fetch = ["save_infer_model/scale_0.tmp_0"] + + def preprocess(self, img): + img = img.copy() + im, ratio_list = self.preprocess_op(img) + if im is None: + return None, 0 + return { + "image": im.copy() + }, self.fetch, { + "ratio_list": [ratio_list], + "ori_im": img + } + + def postprocess(self, outputs, args): + outs_dict = {} + if self.det_algorithm == "EAST": + outs_dict['f_geo'] = outputs[0] + outs_dict['f_score'] = outputs[1] + elif self.det_algorithm == 'SAST': + outs_dict['f_border'] = outputs[0] + outs_dict['f_score'] = outputs[1] + outs_dict['f_tco'] = outputs[2] + outs_dict['f_tvo'] = outputs[3] + else: + outs_dict['maps'] = outputs[0] + dt_boxes_list = self.postprocess_op(outs_dict, args["ratio_list"]) + dt_boxes = dt_boxes_list[0] + if self.det_algorithm == "SAST" and self.det_sast_polygon: + dt_boxes = self.filter_tag_det_res_only_clip(dt_boxes, + args["ori_im"].shape) + else: + dt_boxes = self.filter_tag_det_res(dt_boxes, args["ori_im"].shape) + return dt_boxes + + +class DetService(WebService): def init_det(self): - self.det_preprocess = Sequential([ - ResizeByFactor(32, 960), Div(255), - Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]), Transpose( - (2, 0, 1)) - ]) - self.filter_func = FilterBoxes(10, 10) - self.post_func = DBPostProcess({ - "thresh": 0.3, - "box_thresh": 0.5, - "max_candidates": 1000, - "unclip_ratio": 1.5, - "min_size": 3 - }) + self.text_detector = TextDetectorHelper(global_args) def preprocess(self, feed=[], fetch=[]): data = base64.b64decode(feed[0]["image"].encode('utf8')) data = np.fromstring(data, np.uint8) im = cv2.imdecode(data, cv2.IMREAD_COLOR) - self.ori_h, self.ori_w, _ = im.shape - det_img = self.det_preprocess(im) - _, self.new_h, self.new_w = det_img.shape - return {"image": det_img[np.newaxis, :].copy()}, ["concat_1.tmp_0"] + feed, fetch, self.tmp_args = self.text_detector.preprocess(im) + return feed, fetch def postprocess(self, feed={}, fetch=[], fetch_map=None): - det_out = fetch_map["concat_1.tmp_0"] - ratio_list = [ - float(self.new_h) / self.ori_h, float(self.new_w) / self.ori_w - ] - dt_boxes_list = self.post_func(det_out, [ratio_list]) - dt_boxes = self.filter_func(dt_boxes_list[0], [self.ori_h, self.ori_w]) - return {"dt_boxes": dt_boxes.tolist()} - + outputs = [fetch_map[x] for x in fetch] + det_res = self.text_detector.postprocess(outputs, self.tmp_args) + res = [] + for i in range(len(det_res)): + res.append({"text_region": det_res[i].tolist()}) + return res -ocr_service = OCRService(name="ocr") -ocr_service.load_model_config("ocr_det_model") -ocr_service.init_det() -if sys.argv[1] == 'gpu': - ocr_service.set_gpus("0") - ocr_service.prepare_server(workdir="workdir", port=9292, device="gpu", gpuid=0) - ocr_service.run_debugger_service(gpu=True) -elif sys.argv[1] == 'cpu': - ocr_service.prepare_server(workdir="workdir", port=9292) +if __name__ == "__main__": + ocr_service = DetService(name="ocr") + ocr_service.load_model_config(global_args.det_server_dir) + ocr_service.init_det() + if global_args.use_gpu: + ocr_service.prepare_server( + workdir="workdir", port=9292, device="gpu", gpuid=0) + else: + ocr_service.prepare_server(workdir="workdir", port=9292, device="cpu") ocr_service.run_debugger_service() -ocr_service.init_det() -ocr_service.run_web_service() + ocr_service.run_web_service() diff --git a/deploy/pdserving/det_rpc_server.py b/deploy/pdserving/det_rpc_server.py new file mode 100644 index 0000000000000000000000000000000000000000..96b9493eaad7417172b84af60a6b8fe6deb7c5e2 --- /dev/null +++ b/deploy/pdserving/det_rpc_server.py @@ -0,0 +1,108 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from paddle_serving_client import Client +import cv2 +import sys +import numpy as np +import os +import time +import re +import base64 +from tools.infer.predict_det import TextDetector +from params import read_params + +global_args = read_params() +if global_args.use_gpu: + from paddle_serving_server_gpu.web_service import WebService +else: + from paddle_serving_server.web_service import WebService + + +class TextDetectorHelper(TextDetector): + def __init__(self, args): + super(TextDetectorHelper, self).__init__(args) + if self.det_algorithm == "SAST": + self.fetch = [ + "bn_f_border4.output.tmp_2", "bn_f_tco4.output.tmp_2", + "bn_f_tvo4.output.tmp_2", "sigmoid_0.tmp_0" + ] + elif self.det_algorithm == "EAST": + self.fetch = ["sigmoid_0.tmp_0", "tmp_2"] + elif self.det_algorithm == "DB": + self.fetch = ["save_infer_model/scale_0.tmp_0"] + + def preprocess(self, img): + im, ratio_list = self.preprocess_op(img) + if im is None: + return None, 0 + return { + "image": im[0] + }, self.fetch, { + "ratio_list": [ratio_list], + "ori_im": img + } + + def postprocess(self, outputs, args): + outs_dict = {} + if self.det_algorithm == "EAST": + outs_dict['f_geo'] = outputs[0] + outs_dict['f_score'] = outputs[1] + elif self.det_algorithm == 'SAST': + outs_dict['f_border'] = outputs[0] + outs_dict['f_score'] = outputs[1] + outs_dict['f_tco'] = outputs[2] + outs_dict['f_tvo'] = outputs[3] + else: + outs_dict['maps'] = outputs[0] + dt_boxes_list = self.postprocess_op(outs_dict, args["ratio_list"]) + dt_boxes = dt_boxes_list[0] + if self.det_algorithm == "SAST" and self.det_sast_polygon: + dt_boxes = self.filter_tag_det_res_only_clip(dt_boxes, + args["ori_im"].shape) + else: + dt_boxes = self.filter_tag_det_res(dt_boxes, args["ori_im"].shape) + return dt_boxes + + +class DetService(WebService): + def init_det(self): + self.text_detector = TextDetectorHelper(global_args) + + def preprocess(self, feed=[], fetch=[]): + data = base64.b64decode(feed[0]["image"].encode('utf8')) + data = np.fromstring(data, np.uint8) + im = cv2.imdecode(data, cv2.IMREAD_COLOR) + feed, fetch, self.tmp_args = self.text_detector.preprocess(im) + return feed, fetch + + def postprocess(self, feed={}, fetch=[], fetch_map=None): + outputs = [fetch_map[x] for x in fetch] + det_res = self.text_detector.postprocess(outputs, self.tmp_args) + res = [] + for i in range(len(det_res)): + res.append({"text_region": det_res[i].tolist()}) + return res + +if __name__ == "__main__": + ocr_service = DetService(name="ocr") + ocr_service.load_model_config(global_args.det_server_dir) + ocr_service.init_det() + if global_args.use_gpu: + ocr_service.prepare_server( + workdir="workdir", port=9292, device="gpu", gpuid=0) + else: + ocr_service.prepare_server(workdir="workdir", port=9292, device="cpu") + ocr_service.run_rpc_service() + ocr_service.run_web_service() diff --git a/deploy/pdserving/det_web_server.py b/deploy/pdserving/det_web_server.py deleted file mode 100644 index 14be74130dcb413c31a3e76c150d74f65575f451..0000000000000000000000000000000000000000 --- a/deploy/pdserving/det_web_server.py +++ /dev/null @@ -1,78 +0,0 @@ -# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from paddle_serving_client import Client -import cv2 -import sys -import numpy as np -import os -from paddle_serving_client import Client -from paddle_serving_app.reader import Sequential, ResizeByFactor -from paddle_serving_app.reader import Div, Normalize, Transpose -from paddle_serving_app.reader import DBPostProcess, FilterBoxes -if sys.argv[1] == 'gpu': - from paddle_serving_server_gpu.web_service import WebService -elif sys.argv[1] == 'cpu': - from paddle_serving_server.web_service import WebService -import time -import re -import base64 - - -class OCRService(WebService): - def init_det(self): - self.det_preprocess = Sequential([ - ResizeByFactor(32, 960), Div(255), - Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]), Transpose( - (2, 0, 1)) - ]) - self.filter_func = FilterBoxes(10, 10) - self.post_func = DBPostProcess({ - "thresh": 0.3, - "box_thresh": 0.5, - "max_candidates": 1000, - "unclip_ratio": 1.5, - "min_size": 3 - }) - - def preprocess(self, feed=[], fetch=[]): - data = base64.b64decode(feed[0]["image"].encode('utf8')) - data = np.fromstring(data, np.uint8) - im = cv2.imdecode(data, cv2.IMREAD_COLOR) - self.ori_h, self.ori_w, _ = im.shape - det_img = self.det_preprocess(im) - _, self.new_h, self.new_w = det_img.shape - print(det_img) - return {"image": det_img}, ["concat_1.tmp_0"] - - def postprocess(self, feed={}, fetch=[], fetch_map=None): - det_out = fetch_map["concat_1.tmp_0"] - ratio_list = [ - float(self.new_h) / self.ori_h, float(self.new_w) / self.ori_w - ] - dt_boxes_list = self.post_func(det_out, [ratio_list]) - dt_boxes = self.filter_func(dt_boxes_list[0], [self.ori_h, self.ori_w]) - return {"dt_boxes": dt_boxes.tolist()} - - -ocr_service = OCRService(name="ocr") -ocr_service.load_model_config("ocr_det_model") -if sys.argv[1] == 'gpu': - ocr_service.set_gpus("0") - ocr_service.prepare_server(workdir="workdir", port=9292, device="gpu", gpuid=0) -elif sys.argv[1] == 'cpu': - ocr_service.prepare_server(workdir="workdir", port=9292, device="cpu") -ocr_service.init_det() -ocr_service.run_rpc_service() -ocr_service.run_web_service() diff --git a/deploy/pdserving/inference_to_serving.py b/deploy/pdserving/inference_to_serving.py new file mode 100644 index 0000000000000000000000000000000000000000..76efca14d4320336b0ee6060af98ed4a1acfb5d8 --- /dev/null +++ b/deploy/pdserving/inference_to_serving.py @@ -0,0 +1,32 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import argparse +from paddle_serving_client.io import inference_model_to_serving +def parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument("--model_dir", type=str) + parser.add_argument("--server_dir", type=str, default="serving_server_dir") + parser.add_argument("--client_dir", type=str, default="serving_client_dir") + return parser.parse_args() + +args = parse_args() +inference_model_dir = args.model_dir +serving_server_dir = os.path.join(args.model_dir, args.server_dir) +serving_client_dir = os.path.join(args.model_dir, args.client_dir) +feed_var_names, fetch_var_names = inference_model_to_serving( + inference_model_dir, serving_server_dir, serving_client_dir, model_filename="model", params_filename="params") + +print("success!") diff --git a/deploy/pdserving/ocr_local_server.py b/deploy/pdserving/ocr_local_server.py index de5b3d13f12afd4a84c5d46625682c42f418d6bb..e838f71a6bb5470678b6d4a4839105698cab5d1b 100644 --- a/deploy/pdserving/ocr_local_server.py +++ b/deploy/pdserving/ocr_local_server.py @@ -13,102 +13,113 @@ # limitations under the License. from paddle_serving_client import Client -from paddle_serving_app.reader import OCRReader import cv2 import sys import numpy as np import os -from paddle_serving_client import Client -from paddle_serving_app.reader import Sequential, URL2Image, ResizeByFactor -from paddle_serving_app.reader import Div, Normalize, Transpose -from paddle_serving_app.reader import DBPostProcess, FilterBoxes, GetRotateCropImage, SortedBoxes -if sys.argv[1] == 'gpu': - from paddle_serving_server_gpu.web_service import WebService -elif sys.argv[1] == 'cpu': - from paddle_serving_server.web_service import WebService -from paddle_serving_app.local_predict import Debugger import time import re import base64 +from clas_local_server import TextClassifierHelper +from det_local_server import TextDetectorHelper +from rec_local_server import TextRecognizerHelper +from tools.infer.predict_system import TextSystem, sorted_boxes +from paddle_serving_app.local_predict import Debugger +import copy +from params import read_params +global_args = read_params() -class OCRService(WebService): - def init_det_debugger(self, det_model_config): - self.det_preprocess = Sequential([ - ResizeByFactor(32, 960), Div(255), - Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]), Transpose( - (2, 0, 1)) - ]) +if global_args.use_gpu: + from paddle_serving_server_gpu.web_service import WebService +else: + from paddle_serving_server.web_service import WebService + + +class TextSystemHelper(TextSystem): + def __init__(self, args): + self.text_detector = TextDetectorHelper(args) + self.text_recognizer = TextRecognizerHelper(args) + self.use_angle_cls = args.use_angle_cls + if self.use_angle_cls: + self.clas_client = Debugger() + self.clas_client.load_model_config( + global_args.cls_server_dir, gpu=True, profile=False) + self.text_classifier = TextClassifierHelper(args) self.det_client = Debugger() - if sys.argv[1] == 'gpu': - self.det_client.load_model_config( - det_model_config, gpu=True, profile=False) - elif sys.argv[1] == 'cpu': - self.det_client.load_model_config( - det_model_config, gpu=False, profile=False) - self.ocr_reader = OCRReader() + self.det_client.load_model_config( + global_args.det_server_dir, gpu=True, profile=False) + self.fetch = ["save_infer_model/scale_0.tmp_0", "save_infer_model/scale_1.tmp_0"] + + def preprocess(self, img): + feed, fetch, self.tmp_args = self.text_detector.preprocess(img) + fetch_map = self.det_client.predict(feed, fetch) + outputs = [fetch_map[x] for x in fetch] + dt_boxes = self.text_detector.postprocess(outputs, self.tmp_args) + if dt_boxes is None: + return None, None + img_crop_list = [] + dt_boxes = sorted_boxes(dt_boxes) + self.dt_boxes = dt_boxes + for bno in range(len(dt_boxes)): + tmp_box = copy.deepcopy(dt_boxes[bno]) + img_crop = self.get_rotate_crop_image(img, tmp_box) + img_crop_list.append(img_crop) + if self.use_angle_cls: + feed, fetch, self.tmp_args = self.text_classifier.preprocess( + img_crop_list) + fetch_map = self.clas_client.predict(feed, fetch) + outputs = [fetch_map[x] for x in self.text_classifier.fetch] + for x in fetch_map.keys(): + if ".lod" in x: + self.tmp_args[x] = fetch_map[x] + img_crop_list, _ = self.text_classifier.postprocess(outputs, + self.tmp_args) + feed, fetch, self.tmp_args = self.text_recognizer.preprocess( + img_crop_list) + return feed, self.fetch, self.tmp_args + + def postprocess(self, outputs, args): + return self.text_recognizer.postprocess(outputs, args) + + +class OCRService(WebService): + def init_rec(self): + self.text_system = TextSystemHelper(global_args) def preprocess(self, feed=[], fetch=[]): + # TODO: to handle batch rec images data = base64.b64decode(feed[0]["image"].encode('utf8')) data = np.fromstring(data, np.uint8) im = cv2.imdecode(data, cv2.IMREAD_COLOR) - ori_h, ori_w, _ = im.shape - det_img = self.det_preprocess(im) - _, new_h, new_w = det_img.shape - det_img = det_img[np.newaxis, :] - det_img = det_img.copy() - det_out = self.det_client.predict( - feed={"image": det_img}, fetch=["concat_1.tmp_0"]) - filter_func = FilterBoxes(10, 10) - post_func = DBPostProcess({ - "thresh": 0.3, - "box_thresh": 0.5, - "max_candidates": 1000, - "unclip_ratio": 1.5, - "min_size": 3 - }) - sorted_boxes = SortedBoxes() - ratio_list = [float(new_h) / ori_h, float(new_w) / ori_w] - dt_boxes_list = post_func(det_out["concat_1.tmp_0"], [ratio_list]) - dt_boxes = filter_func(dt_boxes_list[0], [ori_h, ori_w]) - dt_boxes = sorted_boxes(dt_boxes) - get_rotate_crop_image = GetRotateCropImage() - img_list = [] - max_wh_ratio = 0 - for i, dtbox in enumerate(dt_boxes): - boximg = get_rotate_crop_image(im, dt_boxes[i]) - img_list.append(boximg) - h, w = boximg.shape[0:2] - wh_ratio = w * 1.0 / h - max_wh_ratio = max(max_wh_ratio, wh_ratio) - if len(img_list) == 0: - return [], [] - _, w, h = self.ocr_reader.resize_norm_img(img_list[0], - max_wh_ratio).shape - imgs = np.zeros((len(img_list), 3, w, h)).astype('float32') - for id, img in enumerate(img_list): - norm_img = self.ocr_reader.resize_norm_img(img, max_wh_ratio) - imgs[id] = norm_img - feed = {"image": imgs.copy()} - fetch = ["ctc_greedy_decoder_0.tmp_0", "softmax_0.tmp_0"] + feed, fetch, self.tmp_args = self.text_system.preprocess(im) return feed, fetch def postprocess(self, feed={}, fetch=[], fetch_map=None): - rec_res = self.ocr_reader.postprocess(fetch_map, with_score=True) - res_lst = [] - for res in rec_res: - res_lst.append(res[0]) - res = {"res": res_lst} + outputs = [fetch_map[x] for x in self.text_system.fetch] + for x in fetch_map.keys(): + if ".lod" in x: + self.tmp_args[x] = fetch_map[x] + rec_res = self.text_system.postprocess(outputs, self.tmp_args) + res = [] + for i in range(len(rec_res)): + tmp_res = { + "text_region": self.text_system.dt_boxes[i].tolist(), + "text": rec_res[i][0], + "confidence": float(rec_res[i][1]) + } + res.append(tmp_res) return res -ocr_service = OCRService(name="ocr") -ocr_service.load_model_config("ocr_rec_model") -ocr_service.init_det_debugger(det_model_config="ocr_det_model") -if sys.argv[1] == 'gpu': - ocr_service.prepare_server(workdir="workdir", port=9292, device="gpu", gpuid=0) - ocr_service.run_debugger_service(gpu=True) -elif sys.argv[1] == 'cpu': - ocr_service.prepare_server(workdir="workdir", port=9292, device="cpu") +if __name__ == "__main__": + ocr_service = OCRService(name="ocr") + ocr_service.load_model_config(global_args.rec_server_dir) + ocr_service.init_rec() + if global_args.use_gpu: + ocr_service.prepare_server( + workdir="workdir", port=9292, device="gpu", gpuid=0) + else: + ocr_service.prepare_server(workdir="workdir", port=9292, device="cpu") ocr_service.run_debugger_service() -ocr_service.run_web_service() + ocr_service.run_web_service() diff --git a/deploy/pdserving/ocr_rpc_server.py b/deploy/pdserving/ocr_rpc_server.py new file mode 100644 index 0000000000000000000000000000000000000000..8fa60b8e234636b3de1bec0cc7a9e0ec4c3b962f --- /dev/null +++ b/deploy/pdserving/ocr_rpc_server.py @@ -0,0 +1,127 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from paddle_serving_client import Client +import cv2 +import sys +import numpy as np +import os +import time +import re +import base64 +from clas_rpc_server import TextClassifierHelper +from det_rpc_server import TextDetectorHelper +from rec_rpc_server import TextRecognizerHelper +from tools.infer.predict_system import TextSystem, sorted_boxes +import copy +from params import read_params + +global_args = read_params() +if global_args.use_gpu: + from paddle_serving_server_gpu.web_service import WebService +else: + from paddle_serving_server.web_service import WebService + + +class TextSystemHelper(TextSystem): + def __init__(self, args): + self.text_detector = TextDetectorHelper(args) + self.text_recognizer = TextRecognizerHelper(args) + self.use_angle_cls = args.use_angle_cls + if self.use_angle_cls: + self.clas_client = Client() + self.clas_client.load_client_config( + os.path.join(args.cls_client_dir, "serving_client_conf.prototxt") + ) + self.clas_client.connect(["127.0.0.1:9294"]) + self.text_classifier = TextClassifierHelper(args) + self.det_client = Client() + self.det_client.load_client_config( + os.path.join(args.det_client_dir, "serving_client_conf.prototxt") + ) + self.det_client.connect(["127.0.0.1:9293"]) + self.fetch = ["save_infer_model/scale_0.tmp_0", "save_infer_model/scale_1.tmp_0"] + + def preprocess(self, img): + feed, fetch, self.tmp_args = self.text_detector.preprocess(img) + fetch_map = self.det_client.predict(feed, fetch) + outputs = [fetch_map[x] for x in fetch] + dt_boxes = self.text_detector.postprocess(outputs, self.tmp_args) + if dt_boxes is None: + return None, None + img_crop_list = [] + dt_boxes = sorted_boxes(dt_boxes) + self.dt_boxes = dt_boxes + for bno in range(len(dt_boxes)): + tmp_box = copy.deepcopy(dt_boxes[bno]) + img_crop = self.get_rotate_crop_image(img, tmp_box) + img_crop_list.append(img_crop) + if self.use_angle_cls: + feed, fetch, self.tmp_args = self.text_classifier.preprocess( + img_crop_list) + fetch_map = self.clas_client.predict(feed, fetch) + outputs = [fetch_map[x] for x in self.text_classifier.fetch] + for x in fetch_map.keys(): + if ".lod" in x: + self.tmp_args[x] = fetch_map[x] + img_crop_list, _ = self.text_classifier.postprocess(outputs, + self.tmp_args) + feed, fetch, self.tmp_args = self.text_recognizer.preprocess( + img_crop_list) + return feed, self.fetch, self.tmp_args + + def postprocess(self, outputs, args): + return self.text_recognizer.postprocess(outputs, args) + + +class OCRService(WebService): + def init_rec(self): + self.text_system = TextSystemHelper(global_args) + + def preprocess(self, feed=[], fetch=[]): + # TODO: to handle batch rec images + data = base64.b64decode(feed[0]["image"].encode('utf8')) + data = np.fromstring(data, np.uint8) + im = cv2.imdecode(data, cv2.IMREAD_COLOR) + feed, fetch, self.tmp_args = self.text_system.preprocess(im) + return feed, fetch + + def postprocess(self, feed={}, fetch=[], fetch_map=None): + outputs = [fetch_map[x] for x in self.text_system.fetch] + for x in fetch_map.keys(): + if ".lod" in x: + self.tmp_args[x] = fetch_map[x] + rec_res = self.text_system.postprocess(outputs, self.tmp_args) + res = [] + for i in range(len(rec_res)): + tmp_res = { + "text_region": self.text_system.dt_boxes[i].tolist(), + "text": rec_res[i][0], + "confidence": float(rec_res[i][1]) + } + res.append(tmp_res) + return res + + +if __name__ == "__main__": + ocr_service = OCRService(name="ocr") + ocr_service.load_model_config(global_args.rec_server_dir) + ocr_service.init_rec() + if global_args.use_gpu: + ocr_service.prepare_server( + workdir="workdir", port=9292, device="gpu", gpuid=0) + else: + ocr_service.prepare_server(workdir="workdir", port=9292, device="cpu") + ocr_service.run_rpc_service() + ocr_service.run_web_service() diff --git a/deploy/pdserving/ocr_web_client.py b/deploy/pdserving/ocr_web_client.py deleted file mode 100644 index e2a92eb8ee4aa62059be184dd7e67237ed460f13..0000000000000000000000000000000000000000 --- a/deploy/pdserving/ocr_web_client.py +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -*- coding: utf-8 -*- - -import requests -import json -import cv2 -import base64 -import os, sys -import time - -def cv2_to_base64(image): - #data = cv2.imencode('.jpg', image)[1] - return base64.b64encode(image).decode( - 'utf8') #data.tostring()).decode('utf8') - -headers = {"Content-type": "application/json"} -url = "http://127.0.0.1:9292/ocr/prediction" -test_img_dir = "../../doc/imgs/" -for img_file in os.listdir(test_img_dir): - with open(os.path.join(test_img_dir, img_file), 'rb') as file: - image_data1 = file.read() - image = cv2_to_base64(image_data1) - data = {"feed": [{"image": image}], "fetch": ["res"]} - r = requests.post(url=url, headers=headers, data=json.dumps(data)) - print(r.json()) diff --git a/deploy/pdserving/ocr_web_server.py b/deploy/pdserving/ocr_web_server.py deleted file mode 100644 index 6c0de44661958a6425f57039261969551ff552c5..0000000000000000000000000000000000000000 --- a/deploy/pdserving/ocr_web_server.py +++ /dev/null @@ -1,105 +0,0 @@ -# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from paddle_serving_client import Client -from paddle_serving_app.reader import OCRReader -import cv2 -import sys -import numpy as np -import os -from paddle_serving_client import Client -from paddle_serving_app.reader import Sequential, URL2Image, ResizeByFactor -from paddle_serving_app.reader import Div, Normalize, Transpose -from paddle_serving_app.reader import DBPostProcess, FilterBoxes, GetRotateCropImage, SortedBoxes -if sys.argv[1] == 'gpu': - from paddle_serving_server_gpu.web_service import WebService -elif sys.argv[1] == 'cpu': - from paddle_serving_server.web_service import WebService -import time -import re -import base64 - - -class OCRService(WebService): - def init_det_client(self, det_port, det_client_config): - self.det_preprocess = Sequential([ - ResizeByFactor(32, 960), Div(255), - Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]), Transpose( - (2, 0, 1)) - ]) - self.det_client = Client() - self.det_client.load_client_config(det_client_config) - self.det_client.connect(["127.0.0.1:{}".format(det_port)]) - self.ocr_reader = OCRReader() - - def preprocess(self, feed=[], fetch=[]): - data = base64.b64decode(feed[0]["image"].encode('utf8')) - data = np.fromstring(data, np.uint8) - im = cv2.imdecode(data, cv2.IMREAD_COLOR) - ori_h, ori_w, _ = im.shape - det_img = self.det_preprocess(im) - det_out = self.det_client.predict( - feed={"image": det_img}, fetch=["concat_1.tmp_0"]) - _, new_h, new_w = det_img.shape - filter_func = FilterBoxes(10, 10) - post_func = DBPostProcess({ - "thresh": 0.3, - "box_thresh": 0.5, - "max_candidates": 1000, - "unclip_ratio": 1.5, - "min_size": 3 - }) - sorted_boxes = SortedBoxes() - ratio_list = [float(new_h) / ori_h, float(new_w) / ori_w] - dt_boxes_list = post_func(det_out["concat_1.tmp_0"], [ratio_list]) - dt_boxes = filter_func(dt_boxes_list[0], [ori_h, ori_w]) - dt_boxes = sorted_boxes(dt_boxes) - get_rotate_crop_image = GetRotateCropImage() - feed_list = [] - img_list = [] - max_wh_ratio = 0 - for i, dtbox in enumerate(dt_boxes): - boximg = get_rotate_crop_image(im, dt_boxes[i]) - img_list.append(boximg) - h, w = boximg.shape[0:2] - wh_ratio = w * 1.0 / h - max_wh_ratio = max(max_wh_ratio, wh_ratio) - for img in img_list: - norm_img = self.ocr_reader.resize_norm_img(img, max_wh_ratio) - feed = {"image": norm_img} - feed_list.append(feed) - fetch = ["ctc_greedy_decoder_0.tmp_0", "softmax_0.tmp_0"] - return feed_list, fetch - - def postprocess(self, feed={}, fetch=[], fetch_map=None): - rec_res = self.ocr_reader.postprocess(fetch_map, with_score=True) - res_lst = [] - for res in rec_res: - res_lst.append(res[0]) - res = {"res": res_lst} - return res - - -ocr_service = OCRService(name="ocr") -ocr_service.load_model_config("ocr_rec_model") -if sys.argv[1] == 'gpu': - ocr_service.set_gpus("0") - ocr_service.prepare_server(workdir="workdir", port=9292, device="gpu", gpuid=0) -elif sys.argv[1] == 'cpu': - ocr_service.prepare_server(workdir="workdir", port=9292) -ocr_service.init_det_client( - det_port=9293, - det_client_config="ocr_det_client/serving_client_conf.prototxt") -ocr_service.run_rpc_service() -ocr_service.run_web_service() diff --git a/deploy/pdserving/params.py b/deploy/pdserving/params.py new file mode 100644 index 0000000000000000000000000000000000000000..60273ba6ca579391f0521256af11b33a39fdd6d6 --- /dev/null +++ b/deploy/pdserving/params.py @@ -0,0 +1,53 @@ +# -*- coding:utf-8 -*- +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +class Config(object): + pass + +def read_params(): + cfg = Config() + #use gpu + cfg.use_gpu = False + cfg.use_pdserving = True + + #params for text detector + cfg.det_algorithm = "DB" + cfg.det_server_dir = "../../inference/ch_ppocr_mobile_v1.1_det_infer/serving_server_dir" + cfg.det_client_dir = "../../inference/ch_ppocr_mobile_v1.1_det_infer/serving_client_dir" + cfg.det_max_side_len = 960 + + #DB parmas + cfg.det_db_thresh =0.3 + cfg.det_db_box_thresh =0.5 + cfg.det_db_unclip_ratio =2.0 + + #EAST parmas + cfg.det_east_score_thresh = 0.8 + cfg.det_east_cover_thresh = 0.1 + cfg.det_east_nms_thresh = 0.2 + + #params for text recognizer + cfg.rec_algorithm = "CRNN" + cfg.rec_server_dir = "../../inference/ch_ppocr_mobile_v1.1_rec_infer/serving_server_dir" + cfg.rec_client_dir = "../../inference/ch_ppocr_mobile_v1.1_rec_infer/serving_client_dir" + + cfg.rec_image_shape = "3, 32, 320" + cfg.rec_char_type = 'ch' + cfg.rec_batch_num = 30 + cfg.max_text_length = 25 + + cfg.rec_char_dict_path = "../../ppocr/utils/ppocr_keys_v1.txt" + cfg.use_space_char = True + + #params for text classifier + cfg.use_angle_cls = True + cfg.cls_server_dir = "../../inference/ch_ppocr_mobile_v1.1_cls_infer/serving_server_dir" + cfg.cls_client_dir = "../../inference/ch_ppocr_mobile_v1.1_cls_infer/serving_client_dir" + cfg.cls_image_shape = "3, 48, 192" + cfg.label_list = ['0', '180'] + cfg.cls_batch_num = 30 + cfg.cls_thresh = 0.9 + + return cfg diff --git a/deploy/pdserving/pdserving_client.py b/deploy/pdserving/pdserving_client.py new file mode 100644 index 0000000000000000000000000000000000000000..f3effb950255c1e71b5ccc8063811733d7679ab6 --- /dev/null +++ b/deploy/pdserving/pdserving_client.py @@ -0,0 +1,117 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import sys +__dir__ = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(__dir__) +sys.path.append(os.path.abspath(os.path.join(__dir__, '..'))) +sys.path.append(os.path.abspath(os.path.join(__dir__, '../../'))) + +from ppocr.utils.utility import initial_logger +logger = initial_logger() +import cv2 +import numpy as np +import time +from PIL import Image +from ppocr.utils.utility import get_image_file_list +from tools.infer.utility import draw_ocr, draw_boxes + +import requests +import json +import base64 + + +def cv2_to_base64(image): + return base64.b64encode(image).decode('utf8') + + +def draw_server_result(image_file, res): + img = cv2.imread(image_file) + image = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) + if len(res) == 0: + return np.array(image) + keys = res[0].keys() + if 'text_region' not in keys: # for rec or clas, draw function is invalid + logger.info("draw function is invalid for rec or clas!") + return None + elif 'text' not in keys: # for ocr_det + logger.info("draw text boxes only!") + boxes = [] + for dno in range(len(res)): + boxes.append(res[dno]['text_region']) + boxes = np.array(boxes) + draw_img = draw_boxes(image, boxes) + return draw_img + else: # for ocr_system + logger.info("draw boxes and texts!") + boxes = [] + texts = [] + scores = [] + for dno in range(len(res)): + boxes.append(res[dno]['text_region']) + texts.append(res[dno]['text']) + scores.append(res[dno]['confidence']) + boxes = np.array(boxes) + scores = np.array(scores) + draw_img = draw_ocr(image, boxes, texts, scores, drop_score=0.5, font_path="../../doc/simfang.ttf") + return draw_img + + +def main(image_path): + image_file_list = get_image_file_list(image_path) + is_visualize = True + headers = {"Content-type": "application/json"} + url = "http://127.0.0.1:9292/ocr/prediction" + cnt = 0 + total_time = 0 + for image_file in image_file_list: + img = open(image_file, 'rb').read() + if img is None: + logger.info("error in loading image:{}".format(image_file)) + continue + + # 发送HTTP请求 + starttime = time.time() + data = {"feed": [{"image": cv2_to_base64(img)}], "fetch": ["res"]} + r = requests.post(url=url, headers=headers, data=json.dumps(data)) + elapse = time.time() - starttime + total_time += elapse + logger.info("Predict time of %s: %.3fs" % (image_file, elapse)) + res = r.json()['result'] + logger.info(res) + + if is_visualize: + draw_img = draw_server_result(image_file, res) + if draw_img is not None: + draw_img_save = "./server_results/" + if not os.path.exists(draw_img_save): + os.makedirs(draw_img_save) + cv2.imwrite( + os.path.join(draw_img_save, os.path.basename(image_file)), + draw_img[:, :, ::-1]) + logger.info("The visualized image saved in {}".format( + os.path.join(draw_img_save, os.path.basename(image_file)))) + cnt += 1 + if cnt % 100 == 0: + logger.info("{} processed".format(cnt)) + logger.info("avg time cost: {}".format(float(total_time) / cnt)) + + +if __name__ == '__main__': + if len(sys.argv) != 2: + logger.info("Usage: %s image_path" % sys.argv[0]) + else: + image_path = sys.argv[1] + main(image_path) diff --git a/deploy/pdserving/readme.md b/deploy/pdserving/readme.md index af12d508ba9c04e6032f2a392701e72b41462395..b488a9df055a8687c7360a03c5eb75bb83beb404 100644 --- a/deploy/pdserving/readme.md +++ b/deploy/pdserving/readme.md @@ -1,120 +1,197 @@ -[English](readme_en.md) | 简体中文 +[English](readme_en.md) | 简体中文 -PaddleOCR提供2种服务部署方式: -- 基于PaddleHub Serving的部署:代码路径为"`./deploy/hubserving`",使用方法参考[文档](../hubserving/readme.md)。 -- 基于PaddleServing的部署:代码路径为"`./deploy/pdserving`",按照本教程使用。 +PaddleOCR提供2种服务部署方式: +- 基于PaddleHub Serving的部署:代码路径为"`./deploy/hubserving`",使用方法参考[文档](../hubserving/readme.md)。 +- 基于PaddleServing的部署:代码路径为"`./deploy/pdserving`",按照本教程使用。 -# Paddle Serving 服务部署 +# Paddle Serving 服务部署 本教程将介绍基于[Paddle Serving](https://github.com/PaddlePaddle/Serving)部署PaddleOCR在线预测服务的详细步骤。 - +- [快速启动服务](#快速启动服务) + - [1. 准备环境](#准备环境) + - [2. 转换模型](#转换模型) + - [3. 启动服务](#启动服务) +- [发送预测请求](#发送预测请求) + +pdserving服务部署目录下包括`检测`、`方向分类器`、`识别`、`串联`四种服务部署工具,请根据需求选择相应的服务。目录结构如下: +``` +deploy/pdserving/ + └─ det_local_server.py 快速版 检测 服务端 + └─ det_rpc_server.py 标准版 检测 服务端 + └─ clas_local_server.py 快速版 方向分类器 服务端 + └─ clas_rpc_server.py 标准版 方向分类器 服务端 + └─ rec_local_server.py 快速版 识别 服务端 + └─ rec_rpc_server.py 标准版 识别 服务端 + └─ ocr_local_server.py 快速版 串联 服务端 + └─ ocr_rpc_server.py 标准版 串联 服务端 + └─ pdserving_client.py 客户端 + └─ params.py 配置文件 +``` + + ## 快速启动服务 + ### 1. 准备环境 -我们先安装Paddle Serving相关组件 -我们推荐用户使用GPU来做Paddle Serving的OCR服务部署 - -**CUDA版本:9.0** +环境版本要求: +- **CUDA版本:9.X/10.X** +- **CUDNN版本:7.X** +- **操作系统版本:Linux/Windows** +- **Python版本: 2.7/3.5/3.6/3.7** -**CUDNN版本:7.0** +**Python操作指南:** -**操作系统版本:CentOS 6以上** +目前Serving用于OCR的部分功能还在测试当中,因此在这里我们给出[Servnig latest package](https://github.com/PaddlePaddle/Serving/blob/develop/doc/LATEST_PACKAGES.md) +大家根据自己的环境选择需要安装的whl包即可,例如以Python 3.5为例,执行下列命令: +``` +# 安装服务端,CPU/GPU版本选择一个 +# GPU版本服务端 +# CUDA 9 +python -m pip install -U https://paddle-serving.bj.bcebos.com/whl/paddle_serving_server_gpu-0.0.0.post9-py3-none-any.whl +# CUDA 10 +python -m pip install -U https://paddle-serving.bj.bcebos.com/whl/paddle_serving_server_gpu-0.0.0.post10-py3-none-any.whl +# CPU版本服务端 +python -m pip install -U https://paddle-serving.bj.bcebos.com/whl/paddle_serving_server-0.0.0-py3-none-any.whl -**Python版本: 2.7/3.6/3.7** +# 安装客户端和App包,CPU、GPU通用 +python -m pip install -U https://paddle-serving.bj.bcebos.com/whl/paddle_serving_client-0.0.0-cp35-none-any.whl https://paddle-serving.bj.bcebos.com/whl/paddle_serving_app-0.0.0-py3-none-any.whl -**Python操作指南:** -``` -#CPU/GPU版本选择一个 -#GPU版本服务端 -python -m pip install paddle_serving_server_gpu -#CPU版本服务端 -python -m pip install paddle_serving_server -#客户端和App包使用以下链接(CPU,GPU通用) -python -m pip install paddle_serving_app paddle_serving_client +# 安装其他依赖 +pip3.5 install func-timeout ``` + +## 2. 转换模型 -### 2. 模型转换 -可以使用`paddle_serving_app`提供的模型,执行下列命令 -``` -python -m paddle_serving_app.package --get_model ocr_rec -tar -xzvf ocr_rec.tar.gz -python -m paddle_serving_app.package --get_model ocr_det -tar -xzvf ocr_det.tar.gz -``` -执行上述命令会下载`db_crnn_mobile`的模型,如果想要下载规模更大的`db_crnn_server`模型,可以在下载预测模型并解压之后。参考[如何从Paddle保存的预测模型转为Paddle Serving格式可部署的模型](https://github.com/PaddlePaddle/Serving/blob/develop/doc/INFERENCE_TO_SERVING_CN.md)。 +Paddle Serving无法直接用训练模型(checkpoints 模型)或推理模型(inference 模型)进行部署。Serving模型由两个文件夹构成,用于存放客户端和服务端的配置。本节介绍如何将推理模型转换为Paddle Serving可部署的模型。 -我们以`ch_rec_r34_vd_crnn`模型作为例子,下载链接在: +**以文本检测模型`ch_ppocr_mobile_v1.1_det_infer`为例,文本识别模型和方向分类器的转换同理。** +首先下载推理模型: +```shell +wget -P ./inference/ https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar && tar xf ./inference/ch_ppocr_mobile_v1.1_det_infer.tar -C ./inference/ ``` -wget --no-check-certificate https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_infer.tar -tar xf ch_rec_r34_vd_crnn_infer.tar +然后运行如下python脚本进行转换,其中,使用参数`model_dir`指定待转换的推理模型路径: ``` -因此我们按照Serving模型转换教程,运行下列python文件。 +python deploy/pdserving/inference_to_serving.py --model_dir ./inference/ch_ppocr_mobile_v1.1_det_infer ``` -from paddle_serving_client.io import inference_model_to_serving -inference_model_dir = "ch_rec_r34_vd_crnn" -serving_client_dir = "serving_client_dir" -serving_server_dir = "serving_server_dir" -feed_var_names, fetch_var_names = inference_model_to_serving( - inference_model_dir, serving_client_dir, serving_server_dir, model_filename="model", params_filename="params") +最终会在`ch_ppocr_mobile_v1.1_det_infer`目录下生成客户端和服务端的模型配置,结构如下: ``` -最终会在`serving_client_dir`和`serving_server_dir`生成客户端和服务端的模型配置。 +/ch_ppocr_mobile_v1.1_det_infer/ +├── serving_client_dir # 客户端配置文件夹 +└── serving_server_dir # 服务端配置文件夹 +``` + + +## 3. 启动服务 -### 3. 启动服务 启动服务可以根据实际需求选择启动`标准版`或者`快速版`,两种方式的对比如下表: |版本|特点|适用场景| |-|-|-| -|标准版|稳定性高,分布式部署|适用于吞吐量大,需要跨机房部署的情况| -|快速版|部署方便,预测速度快|适用于对预测速度要求高,迭代速度快的场景| +|标准版|稳定性高,分布式部署|适用于吞吐量大,需要跨机房部署的情况,只能用于Linux平台| +|快速版|部署方便,预测速度快|适用于对预测速度要求高,迭代速度快的场景,可以支持Linux/Windows| -#### 方式1. 启动标准版服务 + +**step 1. 配置环境变量** ``` -# cpu,gpu启动二选一,以下是cpu启动 -python -m paddle_serving_server.serve --model ocr_det_model --port 9293 -python ocr_web_server.py cpu -# gpu启动 -python -m paddle_serving_server_gpu.serve --model ocr_det_model --port 9293 --gpu_id 0 -python ocr_web_server.py gpu +# 以下两步的顺序不能反 +export PYTHONPATH=$PWD:$PYTHONPATH +cd deploy/pdserving ``` -#### 方式2. 启动快速版服务 +**step 2. 修改配置参数** + +配置参数在`params.py`中,具体内容如下所示,可根据需要修改相关参数,如修改模型路径、修改后处理参数等。 ``` -# cpu,gpu启动二选一,以下是cpu启动 -python ocr_local_server.py cpu -# gpu启动 -python ocr_local_server.py gpu -``` +def read_params(): + cfg = Config() + #use gpu + cfg.use_gpu = False #是否使用GPU,False代表使用CPU + cfg.use_pdserving = True #使用paddle serving部署时必须为True -## 发送预测请求 + #params for text detector + cfg.det_algorithm = "DB" + cfg.det_server_dir = "../../inference/ch_ppocr_mobile_v1.1_det_infer/serving_server_dir" + cfg.det_client_dir = "../../inference/ch_ppocr_mobile_v1.1_det_infer/serving_client_dir" + cfg.det_max_side_len = 960 -``` -python ocr_web_client.py -``` + #DB parmas + cfg.det_db_thresh =0.3 + cfg.det_db_box_thresh =0.5 + cfg.det_db_unclip_ratio =2.0 -## 返回结果格式说明 + #EAST parmas + cfg.det_east_score_thresh = 0.8 + cfg.det_east_cover_thresh = 0.1 + cfg.det_east_nms_thresh = 0.2 -返回结果是json格式 -``` -{u'result': {u'res': [u'\u571f\u5730\u6574\u6cbb\u4e0e\u571f\u58e4\u4fee\u590d\u7814\u7a76\u4e2d\u5fc3', u'\u534e\u5357\u519c\u4e1a\u5927\u5b661\u7d20\u56fe']}} + #params for text recognizer + cfg.rec_algorithm = "CRNN" + cfg.rec_server_dir = "../../inference/ch_ppocr_mobile_v1.1_rec_infer/serving_server_dir" + cfg.rec_client_dir = "../../inference/ch_ppocr_mobile_v1.1_rec_infer/serving_client_dir" + + cfg.rec_image_shape = "3, 32, 320" + cfg.rec_char_type = 'ch' + cfg.rec_batch_num = 30 + cfg.max_text_length = 25 + + cfg.rec_char_dict_path = "../../ppocr/utils/ppocr_keys_v1.txt" + cfg.use_space_char = True + + #params for text classifier + cfg.use_angle_cls = True + cfg.cls_server_dir = "../../inference/ch_ppocr_mobile_v1.1_cls_infer/serving_server_dir" + cfg.cls_client_dir = "../../inference/ch_ppocr_mobile_v1.1_cls_infer/serving_client_dir" + cfg.cls_image_shape = "3, 48, 192" + cfg.label_list = ['0', '180'] + cfg.cls_batch_num = 30 + cfg.cls_thresh = 0.9 + + return cfg ``` -我们也可以打印结果json串中`res`字段的每一句话 + +**step 3_1. 启动独立的检测服务或识别服务** + +如果只需要搭建检测服务或识别服务,一行命令即可,检测服务的启动方式如下,识别同理。检测+识别的串联服务请直接跳至step 3_2。 + ``` -土地整治与土壤修复研究中心 -华南农业大学1素图 +# 启动文本检测服务,标准版/快速版 二选一 +python det_rpc_server.py #标准版,Linux用户 +python det_local_server.py #快速版,Windows/Linux用户 ``` -## 自定义修改服务逻辑 +**step 3_2. 启动文本检测、识别串联的服务** -在`ocr_web_server.py`或是`ocr_local_server.py`当中的`preprocess`函数里面做了检测服务和识别服务的前处理,`postprocess`函数里面做了识别的后处理服务,可以在相应的函数中做修改。调用了`paddle_serving_app`库提供的常见CV模型的前处理/后处理库。 +如果需要搭建检测+识别的串联服务,快速版与step 3_1中的独立服务启动方式相同,但标准版略有不同,具体步骤如下: -如果想要单独启动Paddle Serving的检测服务和识别服务,参见下列表格, 执行对应的脚本即可,并且在命令行参数注明用的CPU或是GPU来提供服务。 +``` +# 标准版,Linux用户 +# GPU用户 +# 启动检测服务 +python -m paddle_serving_server_gpu.serve --model ../../inference/ch_ppocr_mobile_v1.1_det_infer/serving_server_dir/ --port 9293 --gpu_id 0 +# 启动方向分类器服务 +python -m paddle_serving_server_gpu.serve --model ../../inference/ch_ppocr_mobile_v1.1_cls_infer/serving_server_dir/ --port 9294 --gpu_id 0 +# 启动串联服务 +python ocr_rpc_server.py + +# CPU用户 +# 启动检测服务 +python -m paddle_serving_server.serve --model ../../inference/ch_ppocr_mobile_v1.1_det_infer/serving_server_dir/ --port 9293 +# 启动方向分类器服务 +python -m paddle_serving_server.serve --model ../../inference/ch_ppocr_mobile_v1.1_cls_infer/serving_server_dir/ --port 9294 +# 启动串联服务 +python ocr_rpc_server.py + +# 快速版,Windows/Linux用户 +python ocr_local_server.py +``` -| 模型 | 标准版 | 快速版 | -| ---- | ----------------- | ------------------- | -| 检测 | det_web_server.py | det_local_server.py | -| 识别 | rec_web_server.py | rec_local_server.py | + +## 发送预测请求 +以上所有单独或串联的服务均可使用如下客户端进行访问: +``` +python pdserving_client.py image_path +``` -更多信息参见[Paddle Serving](https://github.com/PaddlePaddle/Serving) diff --git a/deploy/pdserving/readme_en.md b/deploy/pdserving/readme_en.md deleted file mode 100644 index 9a0c684fb6fb4f0eeff2552af70f62053d3351fb..0000000000000000000000000000000000000000 --- a/deploy/pdserving/readme_en.md +++ /dev/null @@ -1,123 +0,0 @@ -English | [简体中文](readme.md) - -PaddleOCR provides 2 service deployment methods: -- Based on **PaddleHub Serving**: Code path is "`./deploy/hubserving`". Please refer to the [tutorial](../hubserving/readme_en.md) for usage. -- Based on **PaddleServing**: Code path is "`./deploy/pdserving`". Please follow this tutorial. - -# Service deployment based on Paddle Serving - -This tutorial will introduce the detail steps of deploying PaddleOCR online prediction service based on [Paddle Serving](https://github.com/PaddlePaddle/Serving). - -## Quick start service - -### 1. Prepare the environment -Let's first install the relevant components of Paddle Serving. GPU is recommended for service deployment with Paddle Serving. - -**Requirements:** -- **CUDA version: 9.0** -- **CUDNN version: 7.0** -- **Operating system version: >= CentOS 6** -- **Python version: 2.7/3.6/3.7** - -**Installation:** -``` -# install GPU server -python -m pip install paddle_serving_server_gpu - -# or, install CPU server -python -m pip install paddle_serving_server - -# install client and App package (CPU/GPU) -python -m pip install paddle_serving_app paddle_serving_client -``` - -### 2. Model transformation -You can directly use converted model provided by `paddle_serving_app` for convenience. Execute the following command to obtain: -``` -python -m paddle_serving_app.package --get_model ocr_rec -tar -xzvf ocr_rec.tar.gz -python -m paddle_serving_app.package --get_model ocr_det -tar -xzvf ocr_det.tar.gz -``` -Executing the above command will download the `db_crnn_mobile` model, which is in different format with inference model. If you want to use other models for deployment, you can refer to the [tutorial](https://github.com/PaddlePaddle/Serving/blob/develop/doc/INFERENCE_TO_SERVING_CN.md) to convert your inference model to a model which is deployable for Paddle Serving. - -We take `ch_rec_r34_vd_crnn` model as example. Download the inference model by executing the following command: -``` -wget --no-check-certificate https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_infer.tar -tar xf ch_rec_r34_vd_crnn_infer.tar -``` - -Convert the downloaded model by executing the following python script: -``` -from paddle_serving_client.io import inference_model_to_serving -inference_model_dir = "ch_rec_r34_vd_crnn" -serving_client_dir = "serving_client_dir" -serving_server_dir = "serving_server_dir" -feed_var_names, fetch_var_names = inference_model_to_serving( - inference_model_dir, serving_client_dir, serving_server_dir, model_filename="model", params_filename="params") -``` - -Finally, model configuration of client and server will be generated in `serving_client_dir` and `serving_server_dir`. - -### 3. Start service -Start the standard version or the fast version service according to your actual needs. The comparison of the two versions is shown in the table below: - -|version|characteristics|recommended scenarios| -|-|-|-| -|standard version|High stability, suitable for distributed deployment|Large throughput and cross regional deployment| -|fast version|Easy to deploy and fast to predict|Suitable for scenarios which requires high prediction speed and fast iteration speed| - -#### Mode 1. Start the standard mode service - -``` -# start with CPU -python -m paddle_serving_server.serve --model ocr_det_model --port 9293 -python ocr_web_server.py cpu - -# or, with GPU -python -m paddle_serving_server_gpu.serve --model ocr_det_model --port 9293 --gpu_id 0 -python ocr_web_server.py gpu -``` - -#### Mode 2. Start the fast mode service - -``` -# start with CPU -python ocr_local_server.py cpu - -# or, with GPU -python ocr_local_server.py gpu -``` - -## Send prediction requests - -``` -python ocr_web_client.py -``` - -## Returned result format - -The returned result is a JSON string, eg. -``` -{u'result': {u'res': [u'\u571f\u5730\u6574\u6cbb\u4e0e\u571f\u58e4\u4fee\u590d\u7814\u7a76\u4e2d\u5fc3', u'\u534e\u5357\u519c\u4e1a\u5927\u5b661\u7d20\u56fe']}} -``` - -You can also print the readable result in `res`: -``` -土地整治与土壤修复研究中心 -华南农业大学1素图 -``` - -## User defined service module modification - -The pre-processing and post-processing process, can be found in the `preprocess` and `postprocess` function in `ocr_web_server.py` or `ocr_local_server.py`. The pre-processing/post-processing library for common CV models provided by `paddle_serving_app` is called. -You can modify the corresponding code as actual needs. - -If you only want to start the detection service or the recognition service, execute the corresponding script reffering to the following table. Indicate the CPU or GPU is used in the start command parameters. - -| task | standard | fast | -| ---- | ----------------- | ------------------- | -| detection | det_web_server.py | det_local_server.py | -| recognition | rec_web_server.py | rec_local_server.py | - -More info can be found in [Paddle Serving](https://github.com/PaddlePaddle/Serving). diff --git a/deploy/pdserving/rec_local_server.py b/deploy/pdserving/rec_local_server.py index ba021c1cd5054071eb115b3e6e9c64cb572ff871..72a40f3aad01d87a2cb173d0fdfaec50cce9a064 100644 --- a/deploy/pdserving/rec_local_server.py +++ b/deploy/pdserving/rec_local_server.py @@ -13,67 +13,163 @@ # limitations under the License. from paddle_serving_client import Client -from paddle_serving_app.reader import OCRReader import cv2 import sys import numpy as np import os -from paddle_serving_client import Client -from paddle_serving_app.reader import Sequential, URL2Image, ResizeByFactor -from paddle_serving_app.reader import Div, Normalize, Transpose -from paddle_serving_app.reader import DBPostProcess, FilterBoxes, GetRotateCropImage, SortedBoxes -if sys.argv[1] == 'gpu': - from paddle_serving_server_gpu.web_service import WebService -elif sys.argv[1] == 'cpu': - from paddle_serving_server.web_service import WebService import time import re import base64 +from tools.infer.predict_rec import TextRecognizer +from params import read_params + +global_args = read_params() + +if global_args.use_gpu: + from paddle_serving_server_gpu.web_service import WebService +else: + from paddle_serving_server.web_service import WebService + + +class TextRecognizerHelper(TextRecognizer): + def __init__(self, args): + super(TextRecognizerHelper, self).__init__(args) + if self.loss_type == "ctc": + self.fetch = ["save_infer_model/scale_0.tmp_0", "save_infer_model/scale_1.tmp_0"] + + def preprocess(self, img_list): + img_num = len(img_list) + args = {} + # Calculate the aspect ratio of all text bars + width_list = [] + for img in img_list: + width_list.append(img.shape[1] / float(img.shape[0])) + indices = np.argsort(np.array(width_list)) + args["indices"] = indices + predict_time = 0 + beg_img_no = 0 + end_img_no = img_num + norm_img_batch = [] + max_wh_ratio = 0 + for ino in range(beg_img_no, end_img_no): + h, w = img_list[indices[ino]].shape[0:2] + wh_ratio = w * 1.0 / h + max_wh_ratio = max(max_wh_ratio, wh_ratio) + for ino in range(beg_img_no, end_img_no): + if self.loss_type != "srn": + norm_img = self.resize_norm_img(img_list[indices[ino]], + max_wh_ratio) + norm_img = norm_img[np.newaxis, :] + norm_img_batch.append(norm_img) + else: + norm_img = self.process_image_srn(img_list[indices[ino]], + self.rec_image_shape, 8, 25, + self.char_ops) + encoder_word_pos_list = [] + gsrm_word_pos_list = [] + gsrm_slf_attn_bias1_list = [] + gsrm_slf_attn_bias2_list = [] + encoder_word_pos_list.append(norm_img[1]) + gsrm_word_pos_list.append(norm_img[2]) + gsrm_slf_attn_bias1_list.append(norm_img[3]) + gsrm_slf_attn_bias2_list.append(norm_img[4]) + norm_img_batch.append(norm_img[0]) + norm_img_batch = np.concatenate(norm_img_batch, axis=0).copy() + feed = {"image": norm_img_batch.copy()} + return feed, self.fetch, args + + def postprocess(self, outputs, args): + if self.loss_type == "ctc": + rec_idx_batch = outputs[0] + predict_batch = outputs[1] + rec_idx_lod = args["save_infer_model/scale_0.tmp_0.lod"] + predict_lod = args["save_infer_model/scale_1.tmp_0.lod"] + indices = args["indices"] + rec_res = [['', 0.0]] * (len(rec_idx_lod) - 1) + for rno in range(len(rec_idx_lod) - 1): + beg = rec_idx_lod[rno] + end = rec_idx_lod[rno + 1] + rec_idx_tmp = rec_idx_batch[beg:end, 0] + preds_text = self.char_ops.decode(rec_idx_tmp) + beg = predict_lod[rno] + end = predict_lod[rno + 1] + probs = predict_batch[beg:end, :] + ind = np.argmax(probs, axis=1) + blank = probs.shape[1] + valid_ind = np.where(ind != (blank - 1))[0] + if len(valid_ind) == 0: + continue + score = np.mean(probs[valid_ind, ind[valid_ind]]) + rec_res[indices[rno]] = [preds_text, score] + elif self.loss_type == 'srn': + char_num = self.char_ops.get_char_num() + preds = rec_idx_batch.reshape(-1) + elapse = time.time() - starttime + predict_time += elapse + total_preds = preds.copy() + for ino in range(int(len(rec_idx_batch) / self.text_len)): + preds = total_preds[ino * self.text_len:(ino + 1) * + self.text_len] + ind = np.argmax(probs, axis=1) + valid_ind = np.where(preds != int(char_num - 1))[0] + if len(valid_ind) == 0: + continue + score = np.mean(probs[valid_ind, ind[valid_ind]]) + preds = preds[:valid_ind[-1] + 1] + preds_text = self.char_ops.decode(preds) + rec_res[indices[ino]] = [preds_text, score] + else: + for rno in range(len(rec_idx_batch)): + end_pos = np.where(rec_idx_batch[rno, :] == 1)[0] + if len(end_pos) <= 1: + preds = rec_idx_batch[rno, 1:] + score = np.mean(predict_batch[rno, 1:]) + else: + preds = rec_idx_batch[rno, 1:end_pos[1]] + score = np.mean(predict_batch[rno, 1:end_pos[1]]) + preds_text = self.char_ops.decode(preds) + rec_res[indices[rno]] = [preds_text, score] + return rec_res class OCRService(WebService): def init_rec(self): - self.ocr_reader = OCRReader() + self.text_recognizer = TextRecognizerHelper(global_args) def preprocess(self, feed=[], fetch=[]): + # TODO: to handle batch rec images img_list = [] for feed_data in feed: data = base64.b64decode(feed_data["image"].encode('utf8')) data = np.fromstring(data, np.uint8) im = cv2.imdecode(data, cv2.IMREAD_COLOR) img_list.append(im) - max_wh_ratio = 0 - for i, boximg in enumerate(img_list): - h, w = boximg.shape[0:2] - wh_ratio = w * 1.0 / h - max_wh_ratio = max(max_wh_ratio, wh_ratio) - _, w, h = self.ocr_reader.resize_norm_img(img_list[0], - max_wh_ratio).shape - imgs = np.zeros((len(img_list), 3, w, h)).astype('float32') - for i, img in enumerate(img_list): - norm_img = self.ocr_reader.resize_norm_img(img, max_wh_ratio) - imgs[i] = norm_img - feed = {"image": imgs.copy()} - fetch = ["ctc_greedy_decoder_0.tmp_0", "softmax_0.tmp_0"] + feed, fetch, self.tmp_args = self.text_recognizer.preprocess(img_list) return feed, fetch def postprocess(self, feed={}, fetch=[], fetch_map=None): - rec_res = self.ocr_reader.postprocess(fetch_map, with_score=True) - res_lst = [] - for res in rec_res: - res_lst.append(res[0]) - res = {"res": res_lst} + outputs = [fetch_map[x] for x in self.text_recognizer.fetch] + for x in fetch_map.keys(): + if ".lod" in x: + self.tmp_args[x] = fetch_map[x] + rec_res = self.text_recognizer.postprocess(outputs, self.tmp_args) + res = [] + for i in range(len(rec_res)): + res.append({ + "text": rec_res[i][0], + "confidence": float(rec_res[i][1]) + }) return res -ocr_service = OCRService(name="ocr") -ocr_service.load_model_config("ocr_rec_model") -ocr_service.init_rec() -if sys.argv[1] == 'gpu': - ocr_service.set_gpus("0") - ocr_service.prepare_server(workdir="workdir", port=9292, device="gpu", gpuid=0) - ocr_service.run_debugger_service(gpu=True) -elif sys.argv[1] == 'cpu': - ocr_service.prepare_server(workdir="workdir", port=9292, device="cpu") +if __name__ == "__main__": + ocr_service = OCRService(name="ocr") + ocr_service.load_model_config(global_args.rec_server_dir) + ocr_service.init_rec() + if global_args.use_gpu: + ocr_service.prepare_server( + workdir="workdir", port=9292, device="gpu", gpuid=0) + else: + ocr_service.prepare_server(workdir="workdir", port=9292, device="cpu") ocr_service.run_debugger_service() -ocr_service.run_web_service() + ocr_service.run_web_service() diff --git a/deploy/pdserving/rec_rpc_server.py b/deploy/pdserving/rec_rpc_server.py new file mode 100644 index 0000000000000000000000000000000000000000..63bbee3ca3a58e4610a97095afc7c13cea9adc5c --- /dev/null +++ b/deploy/pdserving/rec_rpc_server.py @@ -0,0 +1,180 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from paddle_serving_client import Client +import cv2 +import sys +import numpy as np +import os +import time +import re +import base64 +from tools.infer.predict_rec import TextRecognizer +from params import read_params + +global_args = read_params() +if global_args.use_gpu: + from paddle_serving_server_gpu.web_service import WebService +else: + from paddle_serving_server.web_service import WebService + + +class TextRecognizerHelper(TextRecognizer): + def __init__(self, args): + super(TextRecognizerHelper, self).__init__(args) + if self.loss_type == "ctc": + self.fetch = ["save_infer_model/scale_0.tmp_0", "save_infer_model/scale_1.tmp_0"] + + def preprocess(self, img_list): + img_num = len(img_list) + args = {} + # Calculate the aspect ratio of all text bars + width_list = [] + for img in img_list: + width_list.append(img.shape[1] / float(img.shape[0])) + indices = np.argsort(np.array(width_list)) + args["indices"] = indices + predict_time = 0 + beg_img_no = 0 + end_img_no = img_num + norm_img_batch = [] + max_wh_ratio = 0 + for ino in range(beg_img_no, end_img_no): + h, w = img_list[indices[ino]].shape[0:2] + wh_ratio = w * 1.0 / h + max_wh_ratio = max(max_wh_ratio, wh_ratio) + for ino in range(beg_img_no, end_img_no): + if self.loss_type != "srn": + norm_img = self.resize_norm_img(img_list[indices[ino]], + max_wh_ratio) + norm_img = norm_img[np.newaxis, :] + norm_img_batch.append(norm_img) + else: + norm_img = self.process_image_srn(img_list[indices[ino]], + self.rec_image_shape, 8, 25, + self.char_ops) + encoder_word_pos_list = [] + gsrm_word_pos_list = [] + gsrm_slf_attn_bias1_list = [] + gsrm_slf_attn_bias2_list = [] + encoder_word_pos_list.append(norm_img[1]) + gsrm_word_pos_list.append(norm_img[2]) + gsrm_slf_attn_bias1_list.append(norm_img[3]) + gsrm_slf_attn_bias2_list.append(norm_img[4]) + norm_img_batch.append(norm_img[0]) + + norm_img_batch = np.concatenate(norm_img_batch, axis=0) + if img_num > 1: + feed = [{ + "image": norm_img_batch[x] + } for x in range(norm_img_batch.shape[0])] + else: + feed = {"image": norm_img_batch[0]} + return feed, self.fetch, args + + def postprocess(self, outputs, args): + if self.loss_type == "ctc": + rec_idx_batch = outputs[0] + predict_batch = outputs[1] + rec_idx_lod = args["save_infer_model/scale_0.tmp_0.lod"] + predict_lod = args["save_infer_model/scale_1.tmp_0.lod"] + indices = args["indices"] + rec_res = [['', 0.0]] * (len(rec_idx_lod) - 1) + for rno in range(len(rec_idx_lod) - 1): + beg = rec_idx_lod[rno] + end = rec_idx_lod[rno + 1] + rec_idx_tmp = rec_idx_batch[beg:end, 0] + preds_text = self.char_ops.decode(rec_idx_tmp) + beg = predict_lod[rno] + end = predict_lod[rno + 1] + probs = predict_batch[beg:end, :] + ind = np.argmax(probs, axis=1) + blank = probs.shape[1] + valid_ind = np.where(ind != (blank - 1))[0] + if len(valid_ind) == 0: + continue + score = np.mean(probs[valid_ind, ind[valid_ind]]) + rec_res[indices[rno]] = [preds_text, score] + elif self.loss_type == 'srn': + char_num = self.char_ops.get_char_num() + preds = rec_idx_batch.reshape(-1) + elapse = time.time() - starttime + predict_time += elapse + total_preds = preds.copy() + for ino in range(int(len(rec_idx_batch) / self.text_len)): + preds = total_preds[ino * self.text_len:(ino + 1) * + self.text_len] + ind = np.argmax(probs, axis=1) + valid_ind = np.where(preds != int(char_num - 1))[0] + if len(valid_ind) == 0: + continue + score = np.mean(probs[valid_ind, ind[valid_ind]]) + preds = preds[:valid_ind[-1] + 1] + preds_text = self.char_ops.decode(preds) + rec_res[indices[ino]] = [preds_text, score] + else: + for rno in range(len(rec_idx_batch)): + end_pos = np.where(rec_idx_batch[rno, :] == 1)[0] + if len(end_pos) <= 1: + preds = rec_idx_batch[rno, 1:] + score = np.mean(predict_batch[rno, 1:]) + else: + preds = rec_idx_batch[rno, 1:end_pos[1]] + score = np.mean(predict_batch[rno, 1:end_pos[1]]) + preds_text = self.char_ops.decode(preds) + rec_res[indices[rno]] = [preds_text, score] + return rec_res + + +class OCRService(WebService): + def init_rec(self): + self.text_recognizer = TextRecognizerHelper(global_args) + + def preprocess(self, feed=[], fetch=[]): + # TODO: to handle batch rec images + img_list = [] + for feed_data in feed: + data = base64.b64decode(feed_data["image"].encode('utf8')) + data = np.fromstring(data, np.uint8) + im = cv2.imdecode(data, cv2.IMREAD_COLOR) + img_list.append(im) + feed, fetch, self.tmp_args = self.text_recognizer.preprocess(img_list) + return feed, fetch + + def postprocess(self, feed={}, fetch=[], fetch_map=None): + outputs = [fetch_map[x] for x in self.text_recognizer.fetch] + for x in fetch_map.keys(): + if ".lod" in x: + self.tmp_args[x] = fetch_map[x] + rec_res = self.text_recognizer.postprocess(outputs, self.tmp_args) + res = [] + for i in range(len(rec_res)): + res.append({ + "text": rec_res[i][0], + "confidence": float(rec_res[i][1]) + }) + return res + + +if __name__ == "__main__": + ocr_service = OCRService(name="ocr") + ocr_service.load_model_config(global_args.rec_server_dir) + ocr_service.init_rec() + if global_args.use_gpu: + ocr_service.prepare_server( + workdir="workdir", port=9292, device="gpu", gpuid=0) + else: + ocr_service.prepare_server(workdir="workdir", port=9292, device="cpu") + ocr_service.run_rpc_service() + ocr_service.run_web_service() diff --git a/deploy/pdserving/rec_web_server.py b/deploy/pdserving/rec_web_server.py deleted file mode 100644 index 0f4e9f6d264ed602f387bfaf0303cd59af7823fa..0000000000000000000000000000000000000000 --- a/deploy/pdserving/rec_web_server.py +++ /dev/null @@ -1,77 +0,0 @@ -# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from paddle_serving_client import Client -from paddle_serving_app.reader import OCRReader -import cv2 -import sys -import numpy as np -import os -from paddle_serving_client import Client -from paddle_serving_app.reader import Sequential, URL2Image, ResizeByFactor -from paddle_serving_app.reader import Div, Normalize, Transpose -from paddle_serving_app.reader import DBPostProcess, FilterBoxes, GetRotateCropImage, SortedBoxes -if sys.argv[1] == 'gpu': - from paddle_serving_server_gpu.web_service import WebService -elif sys.argv[1] == 'cpu': - from paddle_serving_server.web_service import WebService -import time -import re -import base64 - - -class OCRService(WebService): - def init_rec(self): - self.ocr_reader = OCRReader() - - def preprocess(self, feed=[], fetch=[]): - # TODO: to handle batch rec images - img_list = [] - for feed_data in feed: - data = base64.b64decode(feed_data["image"].encode('utf8')) - data = np.fromstring(data, np.uint8) - im = cv2.imdecode(data, cv2.IMREAD_COLOR) - img_list.append(im) - feed_list = [] - max_wh_ratio = 0 - for i, boximg in enumerate(img_list): - h, w = boximg.shape[0:2] - wh_ratio = w * 1.0 / h - max_wh_ratio = max(max_wh_ratio, wh_ratio) - for img in img_list: - norm_img = self.ocr_reader.resize_norm_img(img, max_wh_ratio) - feed = {"image": norm_img} - feed_list.append(feed) - fetch = ["ctc_greedy_decoder_0.tmp_0", "softmax_0.tmp_0"] - return feed_list, fetch - - def postprocess(self, feed={}, fetch=[], fetch_map=None): - rec_res = self.ocr_reader.postprocess(fetch_map, with_score=True) - res_lst = [] - for res in rec_res: - res_lst.append(res[0]) - res = {"res": res_lst} - return res - - -ocr_service = OCRService(name="ocr") -ocr_service.load_model_config("ocr_rec_model") -ocr_service.init_rec() -if sys.argv[1] == 'gpu': - ocr_service.set_gpus("0") - ocr_service.prepare_server(workdir="workdir", port=9292, device="gpu", gpuid=0) -elif sys.argv[1] == 'cpu': - ocr_service.prepare_server(workdir="workdir", port=9292, device="cpu") -ocr_service.run_rpc_service() -ocr_service.run_web_service() diff --git a/deploy/slim/prune/README.md b/deploy/slim/prune/README.md new file mode 100644 index 0000000000000000000000000000000000000000..9dc53f2cc6bb65925247f7ddc5887b54c5f7e0e5 --- /dev/null +++ b/deploy/slim/prune/README.md @@ -0,0 +1,75 @@ + +## 介绍 + +复杂的模型有利于提高模型的性能,但也导致模型中存在一定冗余,模型裁剪通过移出网络模型中的子模型来减少这种冗余,达到减少模型计算复杂度,提高模型推理性能的目的。 +本教程将介绍如何使用飞桨模型压缩库PaddleSlim做PaddleOCR模型的压缩。 +[PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim)集成了模型剪枝、量化(包括量化训练和离线量化)、蒸馏和神经网络搜索等多种业界常用且领先的模型压缩功能,如果您感兴趣,可以关注并了解。 + + +在开始本教程之前,建议先了解: +1. [PaddleOCR模型的训练方法](../../../doc/doc_ch/quickstart.md) +2. [分类模型裁剪教程](https://paddlepaddle.github.io/PaddleSlim/tutorials/pruning_tutorial/) +3. [PaddleSlim 裁剪压缩API](https://paddlepaddle.github.io/PaddleSlim/api/prune_api/) + + +## 快速开始 + +模型裁剪主要包括五个步骤: +1. 安装 PaddleSlim +2. 准备训练好的模型 +3. 敏感度分析、训练 +4. 模型裁剪训练 +5. 导出模型、预测部署 + +### 1. 安装PaddleSlim + +```bash +git clone https://github.com/PaddlePaddle/PaddleSlim.git +cd Paddleslim +python setup.py install +``` + +### 2. 获取预训练模型 +模型裁剪需要加载事先训练好的模型,PaddleOCR也提供了一系列(模型)[../../../doc/doc_ch/models_list.md],开发者可根据需要自行选择模型或使用自己的模型。 + +### 3. 敏感度分析训练 + +加载预训练模型后,通过对现有模型的每个网络层进行敏感度分析,得到敏感度文件:sensitivities_0.data,可以通过PaddleSlim提供的[接口](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/paddleslim/prune/sensitive.py#L221)加载文件,获得各网络层在不同裁剪比例下的精度损失。从而了解各网络层冗余度,决定每个网络层的裁剪比例。 +敏感度分析的具体细节见:[敏感度分析](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/docs/zh_cn/tutorials/image_classification_sensitivity_analysis_tutorial.md) +敏感度文件内容格式: + sensitivities_0.data(Dict){ + 'layer_weight_name_0': sens_of_each_ratio(Dict){'pruning_ratio_0': acc_loss, 'pruning_ratio_1': acc_loss} + 'layer_weight_name_1': sens_of_each_ratio(Dict){'pruning_ratio_0': acc_loss, 'pruning_ratio_1': acc_loss} + } + + 例子: + { + 'conv10_expand_weights': {0.1: 0.006509952684312718, 0.2: 0.01827734339798862, 0.3: 0.014528405644659832, 0.6: 0.06536008804270439, 0.8: 0.11798612250664964, 0.7: 0.12391408417493704, 0.4: 0.030615754498018757, 0.5: 0.047105205602406594} + 'conv10_linear_weights': {0.1: 0.05113190831455035, 0.2: 0.07705573833558801, 0.3: 0.12096721757739311, 0.6: 0.5135061352930738, 0.8: 0.7908166677143281, 0.7: 0.7272187676899062, 0.4: 0.1819252083008504, 0.5: 0.3728054727792405} + } +加载敏感度文件后会返回一个字典,字典中的keys为网络模型参数模型的名字,values为一个字典,里面保存了相应网络层的裁剪敏感度信息。例如在例子中,conv10_expand_weights所对应的网络层在裁掉10%的卷积核后模型性能相较原模型会下降0.65%,详细信息可见[PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/docs/zh_cn/algo/algo.md#2-%E5%8D%B7%E7%A7%AF%E6%A0%B8%E5%89%AA%E8%A3%81%E5%8E%9F%E7%90%86) + +进入PaddleOCR根目录,通过以下命令对模型进行敏感度分析训练: +```bash +python deploy/slim/prune/sensitivity_anal.py -c configs/det/det_mv3_db_v1.1.yml -o Global.pretrain_weights="your trained model" Global.test_batch_size_per_card=1 +``` + +### 4. 模型裁剪训练 +裁剪时通过之前的敏感度分析文件决定每个网络层的裁剪比例。在具体实现时,为了尽可能多的保留从图像中提取的低阶特征,我们跳过了backbone中靠近输入的4个卷积层。同样,为了减少由于裁剪导致的模型性能损失,我们通过之前敏感度分析所获得的敏感度表,人工挑选出了一些冗余较少,对裁剪较为敏感的[网络层](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/deploy/slim/prune/pruning_and_finetune.py#L41)(指在较低的裁剪比例下就导致很高性能损失的网络层),并在之后的裁剪过程中选择避开这些网络层。裁剪过后finetune的过程沿用OCR检测模型原始的训练策略。 + +```bash +python deploy/slim/prune/pruning_and_finetune.py -c configs/det/det_mv3_db_v1.1.yml -o Global.pretrain_weights=./deploy/slim/prune/pretrain_models/det_mv3_db/best_accuracy Global.test_batch_size_per_card=1 +``` +通过对比可以发现,经过裁剪训练保存的模型更小。 + +### 5. 导出模型、预测部署 + +在得到裁剪训练保存的模型后,我们可以将其导出为inference_model: +```bash +python deploy/slim/prune/export_prune_model.py -c configs/det/det_mv3_db_v1.1.yml -o Global.pretrain_weights=./output/det_db/best_accuracy Global.test_batch_size_per_card=1 Global.save_inference_dir=inference_model +``` + +inference model的预测和部署参考: +1. [inference model python端预测](../../../doc/doc_ch/inference.md) +2. [inference model C++预测](../../cpp_infer/readme.md) +3. [inference model在移动端部署](../../lite/readme.md) diff --git a/deploy/slim/prune/README_ch.md b/deploy/slim/prune/README_ch.md deleted file mode 100644 index fbd9921da91a61e796e1f35c5dfce6531e83bd45..0000000000000000000000000000000000000000 --- a/deploy/slim/prune/README_ch.md +++ /dev/null @@ -1,180 +0,0 @@ -\> 运行示例前请先安装develop版本PaddleSlim - - - -# 模型裁剪压缩教程 - -压缩结果: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
序号任务模型压缩策略[3][4]精度(自建中文数据集)耗时[1](ms)整体耗时[2](ms)加速比整体模型大小(M)压缩比例下载链接
0检测MobileNetV3_DB61.7224375-8.6-
识别MobileNetV3_CRNN62.09.52
1检测SlimTextDetPACT量化训练62.11953488%2.867.82%
识别SlimTextRecPACT量化训练61.488.6
2检测SlimTextDet_quat_pruning剪裁+PACT量化训练60.8614228830%2.867.82%
识别SlimTextRecPACT量化训练61.488.6
3检测SlimTextDet_pruning剪裁61.5713829527%2.966.28%
识别SlimTextRecPACT量化训练61.488.6
- - -## 概述 - -复杂的模型有利于提高模型的性能,但也导致模型中存在一定冗余,模型裁剪通过移出网络模型中的子模型来减少这种冗余,达到减少模型计算复杂度,提高模型推理性能的目的。 - -该示例使用PaddleSlim提供的[裁剪压缩API](https://paddlepaddle.github.io/PaddleSlim/api/prune_api/)对OCR模型进行压缩。 - -在阅读该示例前,建议您先了解以下内容: - - - -\- [OCR模型的常规训练方法](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_ch/detection.md) - -\- [PaddleSlim使用文档](https://paddlepaddle.github.io/PaddleSlim/) - - - -## 安装PaddleSlim - -```bash - -git clone https://github.com/PaddlePaddle/PaddleSlim.git - -cd Paddleslim - -python setup.py install - -``` - - -## 获取预训练模型 -[检测预训练模型下载地址]() - - -## 敏感度分析训练 - 加载预训练模型后,通过对现有模型的每个网络层进行敏感度分析,了解各网络层冗余度,从而决定每个网络层的裁剪比例。敏感度分析的具体细节见:[敏感度分析](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/docs/zh_cn/tutorials/image_classification_sensitivity_analysis_tutorial.md) - -进入PaddleOCR根目录,通过以下命令对模型进行敏感度分析: - -```bash - -python deploy/slim/prune/sensitivity_anal.py -c configs/det/det_mv3_db.yml -o Global.pretrain_weights=./deploy/slim/prune/pretrain_models/det_mv3_db/best_accuracy Global.test_batch_size_per_card=1 - -``` - - - -## 裁剪模型与fine-tune - 裁剪时通过之前的敏感度分析文件决定每个网络层的裁剪比例。在具体实现时,为了尽可能多的保留从图像中提取的低阶特征,我们跳过了backbone中靠近输入的4个卷积层。同样,为了减少由于裁剪导致的模型性能损失,我们通过之前敏感度分析所获得的敏感度表,挑选出了一些冗余较少,对裁剪较为敏感的[网络层](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/deploy/slim/prune/pruning_and_finetune.py#L41),并在之后的裁剪过程中选择避开这些网络层。裁剪过后finetune的过程沿用OCR检测模型原始的训练策略。 - -```bash - -python deploy/slim/prune/pruning_and_finetune.py -c configs/det/det_mv3_db.yml -o Global.pretrain_weights=./deploy/slim/prune/pretrain_models/det_mv3_db/best_accuracy Global.test_batch_size_per_card=1 - -``` - - - - - -## 导出模型 - -在得到裁剪训练保存的模型后,我们可以将其导出为inference_model,用于预测部署: - -```bash - -python deploy/slim/prune/export_prune_model.py -c configs/det/det_mv3_db.yml -o Global.pretrain_weights=./output/det_db/best_accuracy Global.test_batch_size_per_card=1 Global.save_inference_dir=inference_model - -``` diff --git a/deploy/slim/prune/README_en.md b/deploy/slim/prune/README_en.md index d854c10707bc26d0273a26c335eef68e8633e74b..3136dc8ad4ac66d512003f7133b5c65918415a7f 100644 --- a/deploy/slim/prune/README_en.md +++ b/deploy/slim/prune/README_en.md @@ -1,183 +1,85 @@ -\> PaddleSlim develop version should be installed before runing this example. - - - -# Model compress tutorial (Pruning) - -Compress results: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IDTaskModelCompress Strategy[3][4]Criterion(Chinese dataset)Inference Time[1](ms)Inference Time(Total model)[2](ms)Acceleration RatioModel Size(MB)Commpress RatioDownload Link
0DetectionMobileNetV3_DBNone61.7224375-8.6-
RecognitionMobileNetV3_CRNNNone62.09.52
1DetectionSlimTextDetPACT Quant Aware Training62.11953488%2.867.82%
RecognitionSlimTextRecPACT Quant Aware Training61.488.6
2DetectionSlimTextDet_quat_pruningPruning+PACT Quant Aware Training60.8614228830%2.867.82%
RecognitionSlimTextRecPPACT Quant Aware Training61.488.6
3DetectionSlimTextDet_pruningPruning61.5713829527%2.966.28%
RecognitionSlimTextRecPACT Quant Aware Training61.488.6
- - -## Overview + +## Introduction Generally, a more complex model would achive better performance in the task, but it also leads to some redundancy in the model. Model Pruning is a technique that reduces this redundancy by removing the sub-models in the neural network model, so as to reduce model calculation complexity and improve model inference performance. This example uses PaddleSlim provided[APIs of Pruning](https://paddlepaddle.github.io/PaddleSlim/api/prune_api/) to compress the OCR model. +[PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim), an open source library which integrates model pruning, quantization (including quantization training and offline quantization), distillation, neural network architecture search, and many other commonly used and leading model compression technique in the industry. -It is recommended that you could understand following pages before reading this example,: - - - -\- [The training strategy of OCR model](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_ch/detection.md) - -\- [PaddleSlim Document](https://paddlepaddle.github.io/PaddleSlim/) +It is recommended that you could understand following pages before reading this example: +1. [PaddleOCR training methods](../../../doc/doc_ch/quickstart.md) +2. [The demo of prune](https://paddlepaddle.github.io/PaddleSlim/tutorials/pruning_tutorial/) +3. [PaddleSlim prune API](https://paddlepaddle.github.io/PaddleSlim/api/prune_api/) +## Quick start +Five steps for OCR model prune: +1. Install PaddleSlim +2. Prepare the trained model +3. Sensitivity analysis and training +4. Model tailoring training +5. Export model, predict deployment -## Install PaddleSlim +### 1. Install PaddleSlim ```bash - git clone https://github.com/PaddlePaddle/PaddleSlim.git - cd Paddleslim - python setup.py install - ``` -## Download Pretrain Model +### 2. Download Pretrain Model +Model prune needs to load pre-trained models. +PaddleOCR also provides a series of (models)[../../../doc/doc_en/models_list_en.md]. Developers can choose their own models or use their own models according to their needs. -[Download link of Detection pretrain model]() +### 3. Pruning sensitivity analysis -## Pruning sensitivity analysis + After the pre-training model is loaded, sensitivity analysis is performed on each network layer of the model to understand the redundancy of each network layer, and save a sensitivity file which named: sensitivities_0.data. After that, user could load the sensitivity file via the [methods provided by PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/paddleslim/prune/sensitive.py#L221) and determining the pruning ratio of each network layer automatically. For specific details of sensitivity analysis, see:[Sensitivity analysis](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/docs/zh_cn/tutorials/image_classification_sensitivity_analysis_tutorial.md) + The data format of sensitivity file: + sensitivities_0.data(Dict){ + 'layer_weight_name_0': sens_of_each_ratio(Dict){'pruning_ratio_0': acc_loss, 'pruning_ratio_1': acc_loss} + 'layer_weight_name_1': sens_of_each_ratio(Dict){'pruning_ratio_0': acc_loss, 'pruning_ratio_1': acc_loss} + } + + example: + { + 'conv10_expand_weights': {0.1: 0.006509952684312718, 0.2: 0.01827734339798862, 0.3: 0.014528405644659832, 0.6: 0.06536008804270439, 0.8: 0.11798612250664964, 0.7: 0.12391408417493704, 0.4: 0.030615754498018757, 0.5: 0.047105205602406594} + 'conv10_linear_weights': {0.1: 0.05113190831455035, 0.2: 0.07705573833558801, 0.3: 0.12096721757739311, 0.6: 0.5135061352930738, 0.8: 0.7908166677143281, 0.7: 0.7272187676899062, 0.4: 0.1819252083008504, 0.5: 0.3728054727792405} + } + The function would return a dict after loading the sensitivity file. The keys of the dict are name of parameters in each layer. And the value of key is the information about pruning sensitivity of correspoding layer. In example, pruning 10% filter of the layer corresponding to conv10_expand_weights would lead to 0.65% degradation of model performance. The details could be seen at: [Sensitivity analysis](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/docs/zh_cn/algo/algo.md#2-%E5%8D%B7%E7%A7%AF%E6%A0%B8%E5%89%AA%E8%A3%81%E5%8E%9F%E7%90%86) - After the pre-training model is loaded, sensitivity analysis is performed on each network layer of the model to understand the redundancy of each network layer, thereby determining the pruning ratio of each network layer. For specific details of sensitivity analysis, see:[Sensitivity analysis](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/docs/zh_cn/tutorials/image_classification_sensitivity_analysis_tutorial.md) Enter the PaddleOCR root directory,perform sensitivity analysis on the model with the following command: ```bash -python deploy/slim/prune/sensitivity_anal.py -c configs/det/det_mv3_db.yml -o Global.pretrain_weights=./deploy/slim/prune/pretrain_models/det_mv3_db/best_accuracy Global.test_batch_size_per_card=1 +python deploy/slim/prune/sensitivity_anal.py -c configs/det/det_mv3_db_v1.1.yml -o Global.pretrain_weights=./deploy/slim/prune/pretrain_models/det_mv3_db/best_accuracy Global.test_batch_size_per_card=1 ``` -## Model pruning and Fine-tune +### 4. Model pruning and Fine-tune When pruning, the previous sensitivity analysis file would determines the pruning ratio of each network layer. In the specific implementation, in order to retain as many low-level features extracted from the image as possible, we skipped the 4 convolutional layers close to the input in the backbone. Similarly, in order to reduce the model performance loss caused by pruning, we selected some of the less redundant and more sensitive [network layer](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/deploy/slim/prune/pruning_and_finetune.py#L41) through the sensitivity table obtained from the previous sensitivity analysis.And choose to skip these network layers in the subsequent pruning process. After pruning, the model need a finetune process to recover the performance and the training strategy of finetune is similar to the strategy of training original OCR detection model. ```bash -python deploy/slim/prune/pruning_and_finetune.py -c configs/det/det_mv3_db.yml -o Global.pretrain_weights=./deploy/slim/prune/pretrain_models/det_mv3_db/best_accuracy Global.test_batch_size_per_card=1 +python deploy/slim/prune/pruning_and_finetune.py -c configs/det/det_mv3_db_v1.1.yml -o Global.pretrain_weights=./deploy/slim/prune/pretrain_models/det_mv3_db/best_accuracy Global.test_batch_size_per_card=1 ``` +### 5. Export inference model and deploy it - - -## Export inference model - -After getting the model after pruning and finetuning we, can export it as inference_model for predictive deployment: - +We can export the pruned model as inference_model for deployment: ```bash - -python deploy/slim/prune/export_prune_model.py -c configs/det/det_mv3_db.yml -o Global.pretrain_weights=./output/det_db/best_accuracy Global.test_batch_size_per_card=1 Global.save_inference_dir=inference_model - +python deploy/slim/prune/export_prune_model.py -c configs/det/det_mv3_db_v1.1.yml -o Global.pretrain_weights=./output/det_db/best_accuracy Global.test_batch_size_per_card=1 Global.save_inference_dir=inference_model ``` + +Reference for prediction and deployment of inference model: +1. [inference model python prediction](../../../doc/doc_en/inference_en.md) +2. [inference model C++ prediction](../../cpp_infer/readme_en.md) +3. [Deployment of inference model on mobile](../../lite/readme_en.md) diff --git a/deploy/slim/prune/export_prune_model.py b/deploy/slim/prune/export_prune_model.py index 0603966f8eeb9a59fa8c4494bf47de9cdaf53774..2ffcf1d8fa5a8847a720fde3e500d03c8117314d 100644 --- a/deploy/slim/prune/export_prune_model.py +++ b/deploy/slim/prune/export_prune_model.py @@ -24,6 +24,7 @@ sys.path.append(os.path.join(__dir__, '..', '..', '..')) sys.path.append(os.path.join(__dir__, '..', '..', '..', 'tools')) import program +import paddle from paddle import fluid from ppocr.utils.utility import initial_logger logger = initial_logger() @@ -32,6 +33,12 @@ from paddleslim.prune import load_model def main(): + # Run code with static graph mode. + try: + paddle.enable_static() + except: + pass + startup_prog, eval_program, place, config, _ = program.preprocess() feeded_var_names, target_vars, fetches_var_name = program.build_export( diff --git a/deploy/slim/prune/pruning_and_finetune.py b/deploy/slim/prune/pruning_and_finetune.py index 0a03cb449523232dbeedf1d7066b4ea4ba01f31f..b066b73682f649c58104a93eb46f99a4d610ad2d 100644 --- a/deploy/slim/prune/pruning_and_finetune.py +++ b/deploy/slim/prune/pruning_and_finetune.py @@ -19,6 +19,7 @@ from __future__ import print_function import os import sys import numpy as np +import paddle __dir__ = os.path.dirname(__file__) sys.path.append(__dir__) sys.path.append(os.path.join(__dir__, '..', '..', '..')) @@ -49,6 +50,12 @@ skip_list = [ def main(): + # Run code with static graph mode. + try: + paddle.enable_static() + except: + pass + config = program.load_config(FLAGS.config) program.merge_config(FLAGS.opt) logger.info(config) @@ -92,7 +99,8 @@ def main(): sen = load_sensitivities("sensitivities_0.data") for i in skip_list: - sen.pop(i) + if i in sen.keys(): + sen.pop(i) back_bone_list = ['conv' + str(x) for x in range(1, 5)] for i in back_bone_list: for key in list(sen.keys()): @@ -134,7 +142,7 @@ def main(): if alg in ['EAST', 'DB']: program.train_eval_det_run( - config, exe, train_info_dict, eval_info_dict, is_pruning=True) + config, exe, train_info_dict, eval_info_dict, is_slim="prune") else: program.train_eval_rec_run(config, exe, train_info_dict, eval_info_dict) diff --git a/deploy/slim/prune/sensitivity_anal.py b/deploy/slim/prune/sensitivity_anal.py index b416f09a3a17527eccbd131917ca257b39bc7884..1eebd61408a0890957e2fdf9761eb938fb53d476 100644 --- a/deploy/slim/prune/sensitivity_anal.py +++ b/deploy/slim/prune/sensitivity_anal.py @@ -25,6 +25,7 @@ sys.path.append(os.path.join(__dir__, '..', '..', '..', 'tools')) import json import cv2 +import paddle from paddle import fluid import paddleslim as slim from copy import deepcopy @@ -60,6 +61,12 @@ def eval_function(eval_args, mode='eval'): def main(): + # Run code with static graph mode. + try: + paddle.enable_static() + except: + pass + config = program.load_config(FLAGS.config) program.merge_config(FLAGS.opt) logger.info(config) diff --git a/deploy/slim/quantization/README.md b/deploy/slim/quantization/README.md index d1aa3d71e5254cf6b5b2be7fdf6943903d42fafd..e1844367a02a45b681cdec48893ebcf9e59b1e17 100755 --- a/deploy/slim/quantization/README.md +++ b/deploy/slim/quantization/README.md @@ -1,162 +1,61 @@ -> 运行示例前请先安装1.2.0或更高版本PaddleSlim - - -# 模型量化压缩教程 - -压缩结果: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
序号任务模型压缩策略精度(自建中文数据集)耗时(ms)整体耗时(ms)加速比整体模型大小(M)压缩比例下载链接
0检测MobileNetV3_DB61.7224375-8.6-
识别MobileNetV3_CRNN62.09.52
1检测SlimTextDetPACT量化训练62.11953488%2.867.82%
识别SlimTextRecPACT量化训练61.488.6
2检测SlimTextDet_quat_pruning剪裁+PACT量化训练60.8614228830%2.867.82%
识别SlimTextRecPACT量化训练61.488.6
3检测SlimTextDet_pruning剪裁61.5713829527%2.966.28%
识别SlimTextRecPACT量化训练61.488.6
- - - -## 概述 +## 介绍 复杂的模型有利于提高模型的性能,但也导致模型中存在一定冗余,模型量化将全精度缩减到定点数减少这种冗余,达到减少模型计算复杂度,提高模型推理性能的目的。 +模型量化可以在基本不损失模型的精度的情况下,将FP32精度的模型参数转换为Int8精度,减小模型参数大小并加速计算,使用量化后的模型在移动端等部署时更具备速度优势。 -该示例使用PaddleSlim提供的[量化压缩API](https://paddlepaddle.github.io/PaddleSlim/api/quantization_api/)对OCR模型进行压缩。 -在阅读该示例前,建议您先了解以下内容: +本教程将介绍如何使用飞桨模型压缩库PaddleSlim做PaddleOCR模型的压缩。 +[PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim) 集成了模型剪枝、量化(包括量化训练和离线量化)、蒸馏和神经网络搜索等多种业界常用且领先的模型压缩功能,如果您感兴趣,可以关注并了解。 -- [OCR模型的常规训练方法](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_ch/detection.md) -- [PaddleSlim使用文档](https://paddleslim.readthedocs.io/zh_CN/latest/index.html) +在开始本教程之前,建议先了解[PaddleOCR模型的训练方法](../../../doc/doc_ch/quickstart.md)以及[PaddleSlim](https://paddleslim.readthedocs.io/zh_CN/latest/index.html) +## 快速开始 +量化多适用于轻量模型在移动端的部署,当训练出一个模型后,如果希望进一步的压缩模型大小并加速预测,可使用量化的方法压缩模型。 -## 安装PaddleSlim +模型量化主要包括五个步骤: +1. 安装 PaddleSlim +2. 准备训练好的模型 +3. 量化训练 +4. 导出量化推理模型 +5. 量化模型预测部署 + +### 1. 安装PaddleSlim ```bash git clone https://github.com/PaddlePaddle/PaddleSlim.git - cd Paddleslim - python setup.py install ``` +### 2. 准备训练好的模型 +PaddleOCR提供了一系列训练好的[模型](../../../doc/doc_ch/models_list.md),如果待量化的模型不在列表中,需要按照[常规训练](../../../doc/doc_ch/quickstart.md)方法得到训练好的模型。 -## 获取预训练模型 - -[识别预训练模型下载地址]() - -[检测预训练模型下载地址]() - +### 3. 量化训练 +量化训练包括离线量化训练和在线量化训练,在线量化训练效果更好,需加载预训练模型,在定义好量化策略后即可对模型进行量化。 -## 量化训练 -加载预训练模型后,在定义好量化策略后即可对模型进行量化。量化相关功能的使用具体细节见:[模型量化](https://paddleslim.readthedocs.io/zh_CN/latest/api_cn/quantization_api.html) - -进入PaddleOCR根目录,通过以下命令对模型进行量化: +量化训练的代码位于slim/quantization/quant/py 中,比如训练检测模型,训练指令如下: ```bash -python deploy/slim/quantization/quant.py -c configs/det/det_mv3_db.yml -o Global.pretrain_weights=det_mv3_db/best_accuracy Global.save_model_dir=./output/quant_model -``` - +python deploy/slim/quantization/quant.py -c configs/det/det_mv3_db.yml -o Global.pretrain_weights='your trained model' Global.save_model_dir=./output/quant_model +# 比如下载提供的训练模型 +wget https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar +tar xf ch_ppocr_mobile_v1.1_det_train.tar +python deploy/slim/quantization/quant.py -c configs/det/det_mv3_db.yml -o Global.pretrain_weights=./ch_ppocr_mobile_v1.1_det_train/best_accuracy Global.save_model_dir=./output/quant_model +``` +如果要训练识别模型的量化,修改配置文件和加载的模型参数即可。 -## 导出模型 +### 4. 导出模型 在得到量化训练保存的模型后,我们可以将其导出为inference_model,用于预测部署: ```bash python deploy/slim/quantization/export_model.py -c configs/det/det_mv3_db.yml -o Global.checkpoints=output/quant_model/best_accuracy Global.save_model_dir=./output/quant_inference_model ``` + +### 5. 量化模型部署 + +上述步骤导出的量化模型,参数精度仍然是FP32,但是参数的数值范围是int8,导出的模型可以通过PaddleLite的opt模型转换工具完成模型转换。 +量化模型部署的可参考 [移动端模型部署](../lite/readme.md) diff --git a/deploy/slim/quantization/README_en.md b/deploy/slim/quantization/README_en.md index 4b8a2b23a254b143cd230c81a7e433d251e10ff2..4f28a54245b08a0156a74d3316f9532bf40423fc 100755 --- a/deploy/slim/quantization/README_en.md +++ b/deploy/slim/quantization/README_en.md @@ -1,167 +1,68 @@ -\> PaddleSlim 1.2.0 or higher version should be installed before runing this example. - - - -# Model compress tutorial (Quantization) - -Compress results: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IDTaskModelCompress StrategyCriterion(Chinese dataset)Inference Time(ms)Inference Time(Total model)(ms)Acceleration RatioModel Size(MB)Commpress RatioDownload Link
0DetectionMobileNetV3_DBNone61.7224375-8.6-
RecognitionMobileNetV3_CRNNNone62.09.52
1DetectionSlimTextDetPACT Quant Aware Training62.11953488%2.867.82%
RecognitionSlimTextRecPACT Quant Aware Training61.488.6
2DetectionSlimTextDet_quat_pruningPruning+PACT Quant Aware Training60.8614228830%2.867.82%
RecognitionSlimTextRecPPACT Quant Aware Training61.488.6
3DetectionSlimTextDet_pruningPruning61.5713829527%2.966.28%
RecognitionSlimTextRecPACT Quant Aware Training61.488.6
- - - -## Overview - -Generally, a more complex model would achive better performance in the task, but it also leads to some redundancy in the model. Quantization is a technique that reduces this redundancyby reducing the full precision data to a fixed number, so as to reduce model calculation complexity and improve model inference performance. -This example uses PaddleSlim provided [APIs of Quantization](https://paddlepaddle.github.io/PaddleSlim/api/quantization_api/) to compress the OCR model. - -It is recommended that you could understand following pages before reading this example,: +## Introduction +Generally, a more complex model would achive better performance in the task, but it also leads to some redundancy in the model. +Quantization is a technique that reduces this redundancy by reducing the full precision data to a fixed number, +so as to reduce model calculation complexity and improve model inference performance. +This example uses PaddleSlim provided [APIs of Quantization](https://paddlepaddle.github.io/PaddleSlim/api/quantization_api/) to compress the OCR model. -- [The training strategy of OCR model](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_ch/detection.md) - +It is recommended that you could understand following pages before reading this example: +- [The training strategy of OCR model](../../../doc/doc_en/quickstart_en.md) - [PaddleSlim Document](https://paddlepaddle.github.io/PaddleSlim/api/quantization_api/) +## Quick Start +Quantization is mostly suitable for the deployment of lightweight models on mobile terminals. +After training, if you want to further compress the model size and accelerate the prediction, you can use quantization methods to compress the model according to the following steps. +1. Install PaddleSlim +2. Prepare trained model +3. Quantization-Aware Training +4. Export inference model +5. Deploy quantization inference model -## Install PaddleSlim + +### 1. Install PaddleSlim ```bash git clone https://github.com/PaddlePaddle/PaddleSlim.git - cd Paddleslim - python setup.py install - ``` -## Download Pretrain Model +### 2. Download Pretrain Model +PaddleOCR provides a series of trained [models](../../../doc/doc_en/models_list_en.md). +If the model to be quantified is not in the list, you need to follow the [Regular Training](../../../doc/doc_en/quickstart_en.md) method to get the trained model. -[Download link of Detection pretrain model]() -[Download link of recognization pretrain model]() +### 3. Quant-Aware Training +Quantization training includes offline quantization training and online quantization training. +Online quantization training is more effective. It is necessary to load the pre-training model. +After the quantization strategy is defined, the model can be quantified. +The code for quantization training is located in `slim/quantization/quant/py`. For example, to train a detection model, the training instructions are as follows: +```bash +python deploy/slim/quantization/quant.py -c configs/det/det_mv3_db.yml -o Global.pretrain_weights='your trained model' Global.save_model_dir=./output/quant_model -## Quan-Aware Training - -After loading the pre training model, the model can be quantified after defining the quantization strategy. For specific details of quantization method, see:[Model Quantization](https://paddleslim.readthedocs.io/zh_CN/latest/api_cn/quantization_api.html) - -Enter the PaddleOCR root directory,perform model quantization with the following command: +# download provided model +wget https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar +tar xf ch_ppocr_mobile_v1.1_det_train.tar +python deploy/slim/quantization/quant.py -c configs/det/det_mv3_db.yml -o Global.pretrain_weights=./ch_ppocr_mobile_v1.1_det_train/best_accuracy Global.save_model_dir=./output/quant_model -```bash -python deploy/slim/prune/sensitivity_anal.py -c configs/det/det_mv3_db.yml -o Global.pretrain_weights=./deploy/slim/prune/pretrain_models/det_mv3_db/best_accuracy Global.test_batch_size_per_card=1 ``` - -## Export inference model +### 4. Export inference model After getting the model after pruning and finetuning we, can export it as inference_model for predictive deployment: ```bash python deploy/slim/quantization/export_model.py -c configs/det/det_mv3_db.yml -o Global.checkpoints=output/quant_model/best_accuracy Global.save_model_dir=./output/quant_inference_model ``` + +### 5. Deploy +The numerical range of the quantized model parameters derived from the above steps is still FP32, but the numerical range of the parameters is int8. +The derived model can be converted through the `opt tool` of PaddleLite. + +For quantitative model deployment, please refer to [Mobile terminal model deployment](../lite/readme_en.md) diff --git a/deploy/slim/quantization/export_model.py b/deploy/slim/quantization/export_model.py index d0d08b300066044d3088f669045e0536006c3140..9741f2a2a9a5e42b8c757efbc5b095586f4eb55c 100644 --- a/deploy/slim/quantization/export_model.py +++ b/deploy/slim/quantization/export_model.py @@ -39,6 +39,7 @@ set_paddle_flags( ) import program +import paddle from paddle import fluid from ppocr.utils.utility import initial_logger logger = initial_logger() @@ -51,6 +52,7 @@ from paddleslim.quant import quant_aware, convert from paddle.fluid.layer_helper import LayerHelper from eval_utils.eval_det_utils import eval_det_run from eval_utils.eval_rec_utils import eval_rec_run +from eval_utils.eval_cls_utils import eval_cls_run def main(): @@ -75,6 +77,11 @@ def main(): # The decay coefficient of moving average, default is 0.9 'moving_rate': 0.9, } + # Run code with static graph mode. + try: + paddle.enable_static() + except: + pass startup_prog, eval_program, place, config, alg_type = program.preprocess() @@ -105,6 +112,8 @@ def main(): if alg_type == 'det': final_metrics = eval_det_run(exe, config, quant_info_dict, "eval") + elif alg_type == 'cls': + final_metrics = eval_cls_run(exe, quant_info_dict) else: final_metrics = eval_rec_run(exe, config, quant_info_dict, "eval") print(final_metrics) diff --git a/deploy/slim/quantization/quant.py b/deploy/slim/quantization/quant.py index f54a328d4645910dcb24bd4d597e8d5f8867312a..1af76f1ed8a154f389265294656e8deaa941b052 100755 --- a/deploy/slim/quantization/quant.py +++ b/deploy/slim/quantization/quant.py @@ -85,6 +85,12 @@ def get_optimizer(): def main(): + # Run code with static graph mode. + try: + paddle.enable_static() + except: + pass + train_build_outputs = program.build( config, train_program, startup_program, mode='train') train_loader = train_build_outputs[0] @@ -155,14 +161,13 @@ def main(): act_preprocess_func=act_preprocess_func, optimizer_func=optimizer_func, executor=executor, - for_test=False, - return_program=True) + for_test=False) # compile program for multi-devices train_compile_program = program.create_multi_devices_program( quant_train_program, train_opt_loss_name, for_quant=True) - init_model(config, quant_train_program, exe) + init_model(config, train_program, exe) train_info_dict = {'compile_program':train_compile_program,\ 'train_program':quant_train_program,\ @@ -177,9 +182,14 @@ def main(): 'fetch_varname_list':eval_fetch_varname_list} if train_alg_type == 'det': - program.train_eval_det_run(config, exe, train_info_dict, eval_info_dict) + program.train_eval_det_run( + config, exe, train_info_dict, eval_info_dict, is_slim="quant") + elif train_alg_type == 'rec': + program.train_eval_rec_run( + config, exe, train_info_dict, eval_info_dict, is_slim="quant") else: - program.train_eval_rec_run(config, exe, train_info_dict, eval_info_dict) + program.train_eval_cls_run( + config, exe, train_info_dict, eval_info_dict, is_slim="quant") if __name__ == '__main__': diff --git a/doc/PPOCR.pdf b/doc/PPOCR.pdf new file mode 100644 index 0000000000000000000000000000000000000000..219621ddb58a96b4b85ef4d74f05dd517c2eb630 Binary files /dev/null and b/doc/PPOCR.pdf differ diff --git a/doc/datasets/VoTT.jpg b/doc/datasets/VoTT.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7c5c27ba843432d03935a69ffba2b7c70c88d9e0 Binary files /dev/null and b/doc/datasets/VoTT.jpg differ diff --git a/doc/doc_ch/FAQ.md b/doc/doc_ch/FAQ.md index f782a1643c4f75cb82745000a24a8a17fb0ff4b8..682ee64dbab4504d9311b54cbde2b5248922049c 100644 --- a/doc/doc_ch/FAQ.md +++ b/doc/doc_ch/FAQ.md @@ -9,19 +9,48 @@ ## PaddleOCR常见问题汇总(持续更新) +* [近期更新(2020.11.16)](#近期更新) * [【精选】OCR精选10个问题](#OCR精选10个问题) -* [【理论篇】OCR通用21个问题](#OCR通用问题) - * [基础知识3题](#基础知识) - * [数据集4题](#数据集) - * [模型训练调优6题](#模型训练调优) +* [【理论篇】OCR通用27个问题](#OCR通用问题) + * [基础知识7题](#基础知识) + * [数据集5题](#数据集) + * [模型训练调优7题](#模型训练调优) * [预测部署8题](#预测部署) -* [【实战篇】PaddleOCR实战53个问题](#PaddleOCR实战问题) - * [使用咨询17题](#使用咨询) - * [数据集9题](#数据集) - * [模型训练调优13题](#模型训练调优) - * [预测部署14题](#预测部署) +* [【实战篇】PaddleOCR实战72个问题](#PaddleOCR实战问题) + * [使用咨询20题](#使用咨询) + * [数据集14题](#数据集) + * [模型训练调优21题](#模型训练调优) + * [预测部署21题](#预测部署) + +## 近期更新(2020.11.23) + +#### Q3.2.11:有哪些标注工具可以标注OCR数据集? + +**A**:您可以参考:https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_en/data_annotation_en.md。 +我们计划推出高效标注OCR数据的标注工具,请您持续关注PaddleOCR的近期更新。 + +#### Q3.2.12:一些特殊场景的数据识别效果差,但是数据量很少,不够用来finetune怎么办? + +**A**:您可以合成一些接近使用场景的数据用于训练。 +我们计划推出基于特定场景的文本数据合成工具,请您持续关注PaddleOCR的近期更新。 + +#### Q3.2.13:特殊字符(例如一些标点符号)识别效果不好怎么办? + +**A**:首先请您确认要识别的特殊字符是否在字典中。 +如果字符在已经字典中但效果依然不好,可能是由于识别数据较少导致的,您可以增加相应数据finetune模型。 + +#### Q3.2.14:PaddleOCR可以识别灰度图吗? + +**A**:PaddleOCR的模型均为三通道输入。如果您想使用灰度图作为输入,建议直接用3通道的模式读入灰度图, +或者将单通道图像转换为三通道图像再识别。例如,opencv的cvtColor函数就可以将灰度图转换为RGB三通道模式。 + +#### Q3.1.20:PaddleOCR与百度的其他OCR产品有什么区别? + +**A**:PaddleOCR主要聚焦通用ocr,如果有垂类需求,您可以用PaddleOCR+垂类数据自己训练; +如果缺少带标注的数据,或者不想投入研发成本,建议直接调用开放的API,开放的API覆盖了目前比较常见的一些垂类。 + ## 【精选】OCR精选10个问题 @@ -127,6 +156,18 @@ **A**:端到端在文字分布密集的业务场景,效率会比较有保证,精度的话看自己业务数据积累情况,如果行级别的识别数据积累比较多的话two-stage会比较好。百度的落地场景,比如工业仪表识别、车牌识别都用到端到端解决方案。 +#### Q2.1.4 印章如何识别 +**A**: 1. 使用带tps的识别网络或abcnet,2.使用极坐标变换将图片拉平之后使用crnn + +#### Q2.1.5 多语言的字典里是混合了不同的语种,这个是有什么讲究吗?统一到一个字典里会对精度造成多大的损失? +**A**:统一到一个字典里,会造成最后一层FC过大,增加模型大小。如果有特殊需求的话,可以把需要的几种语言合并字典训练模型,合并字典之后如果引入过多的形近字,可能会造成精度损失,字符平衡的问题可能也需要考虑一下。在PaddleOCR里暂时将语言字典分开。 + +#### Q2.1.6 预处理部分,图片的长和宽为什么要处理成32的倍数? +**A**:以检测中的resnet骨干网络为例,图像输入网络之后,需要经过5次2倍降采样,共32倍,因此建议输入的图像尺寸为32的倍数。 + +#### Q2.1.7:类似泰语这样的小语种,部分字会占用两个字符甚至三个字符,请问如何制作字典。 + +**A**:处理字符的时候,把多字符的当作一个字就行,字典中每行是一个字。 ### 数据集 @@ -146,6 +187,11 @@ **A**:可以根据实际场景做不同的尝试,共享一个类别是可以收敛,效果也还不错。但是如果分开训练,同类样本之间一致性更好,更容易收敛,识别效果会更优。 +#### Q2.2.5: 文本行较紧密的情况下如何准确检测? + +**A**:使用基于分割的方法,如DB,检测密集文本行时,最好收集一批数据进行训练,并且在训练时,并将生成二值图像的shrink_ratio参数调小一些。 + + ### 模型训练调优 #### Q2.3.1:如何更换文本检测/识别的backbone? @@ -179,6 +225,14 @@ **A**:在中文识别模型训练时,并不是采用直接将训练样本缩放到[3,32,320]进行训练,而是先等比例缩放图像,保证图像高度为32,宽度不足320的部分补0,宽高比大于10的样本直接丢弃。预测时,如果是单张图像预测,则按上述操作直接对图像缩放,不做宽度320的限制。如果是多张图预测,则采用batch方式预测,每个batch的宽度动态变换,采用这个batch中最长宽度。 +#### Q2.3.7:识别训练时,训练集精度已经到达90了,但验证集精度一直在70,涨不上去怎么办? + +**A**:训练集精度90,测试集70多的话,应该是过拟合了,有两个可尝试的方法: + +(1)加入更多的增广方式或者调大增广prob的[概率](https://github.com/PaddlePaddle/PaddleOCR/blob/a501603d54ff5513fc4fc760319472e59da25424/ppocr/data/rec/img_tools.py#L307),默认为0.4。 + +(2)调大系统的[l2 dcay值](https://github.com/PaddlePaddle/PaddleOCR/blob/a501603d54ff5513fc4fc760319472e59da25424/configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml#L47) + ### 预测部署 #### Q2.4.1:请问对于图片中的密集文字,有什么好的处理办法吗? @@ -222,6 +276,7 @@ **A**:表格目前学术界比较成熟的解决方案不多 ,可以尝试下分割的论文方案。 + ## 【实战篇】PaddleOCR实战问题 @@ -269,7 +324,7 @@ #### Q3.1.11:PaddleOCR如何做到横排和竖排同时支持的? -**A**:合成了一批竖排文字,逆时针旋转90度后加入训练集与横排一起训练。预测时根据图片长款比判断是否为竖排,若为竖排则将crop出的文本逆时针旋转90度后送入识别网络。 +**A**:合成了一批竖排文字,逆时针旋转90度后加入训练集与横排一起训练。预测时根据图片长宽比判断是否为竖排,若为竖排则将crop出的文本逆时针旋转90度后送入识别网络。 #### Q3.1.12:如何获取检测文本框的坐标? @@ -305,6 +360,23 @@ |8.6M超轻量中文OCR模型|MobileNetV3+MobileNetV3|det_mv3_db.yml|rec_chinese_lite_train.yml| |通用中文OCR模型|Resnet50_vd+Resnet34_vd|det_r50_vd_db.yml|rec_chinese_common_train.yml| +#### Q3.1.18:如何加入自己的检测算法? +**A**:1. 在ppocr/modeling对应目录下分别选择backbone,head。如果没有可用的可以新建文件并添加 + 2. 在ppocr/data下选择对应的数据处理处理方式,如果没有可用的可以新建文件并添加 + 3. 在ppocr/losses下新建文件并编写loss + 4. 在ppocr/postprocess下新建文件并编写后处理算法 + 5. 将上面四个步骤里新添加的类或函数参照yml文件写到配置中 + + +#### Q3.1.19:训练的时候报错`reader raised an exception`,但是具体不知道是啥问题? + +**A**:这个一般是因为标注文件格式有问题或者是标注文件中的图片路径有问题导致的,在[tools/train.py](../../tools/train.py)文件中有一个`test_reader`的函数,基于这个去检查一下数据的格式以及标注,确认没问题之后再进行模型训练。 + +#### Q3.1.20:PaddleOCR与百度的其他OCR产品有什么区别? + +**A**:PaddleOCR主要聚焦通用ocr,如果有垂类需求,您可以用PaddleOCR+垂类数据自己训练; +如果缺少带标注的数据,或者不想投入研发成本,建议直接调用开放的API,开放的API覆盖了目前比较常见的一些垂类。 + ### 数据集 @@ -359,6 +431,32 @@ **A**:可以主要参考可视化效果,通用模型更倾向于检测一整行文字,轻量级可能会有一行文字被分成两段检测的情况,不是数量越多,效果就越好。 + +#### Q3.2.10:crnn+ctc模型训练所用的垂直文本(旋转至水平方向)是如何生成的? + +**A**:方法与合成水平方向文字一致,只是将字体替换成了垂直字体。 + +#### Q3.2.11:有哪些标注工具可以标注OCR数据集? + +**A**:您可以参考:https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_en/data_annotation_en.md。 +我们计划推出高效标注OCR数据的标注工具,请您持续关注PaddleOCR的近期更新。 + +#### Q3.2.12:一些特殊场景的数据识别效果差,但是数据量很少,不够用来finetune怎么办? + +**A**:您可以合成一些接近使用场景的数据用于训练。 +我们计划推出基于特定场景的文本数据合成工具,请您持续关注PaddleOCR的近期更新。 + +#### Q3.2.13:特殊字符(例如一些标点符号)识别效果不好怎么办? + +**A**:首先请您确认要识别的特殊字符是否在字典中。 +如果字符在已经字典中但效果依然不好,可能是由于识别数据较少导致的,您可以增加相应数据finetune模型。 + +#### Q3.2.14:PaddleOCR可以识别灰度图吗? + +**A**:PaddleOCR的模型均为三通道输入。如果您想使用灰度图作为输入,建议直接用3通道的模式读入灰度图, +或者将单通道图像转换为三通道图像再识别。例如,opencv的cvtColor函数就可以将灰度图转换为RGB三通道模式。 + + ### 模型训练调优 #### Q3.3.1:文本长度超过25,应该怎么处理? @@ -383,7 +481,7 @@ unclip_ratio: 文本框扩张的系数,关系到文本框的大小`` **A**:可以通过下面的脚本终止所有包含train.py字段的进程, -``` +```shell ps -axu | grep train.py | awk '{print $2}' | xargs kill -9 ``` @@ -406,7 +504,7 @@ return paddle.reader.multiprocess_reader(readers, False, queue_size=320) #### Q3.3.8:如何进行模型微调? -**A**:注意配置好匹配的数据集合适,然后在finetune训练时,可以加载我们提供的预训练模型,设置配置文件中Global.pretrain_weights 参数为要加载的预训练模型路径。 +**A**:注意配置好合适的数据集,对齐数据格式,然后在finetune训练时,可以加载我们提供的预训练模型,设置配置文件中Global.pretrain_weights 参数为要加载的预训练模型路径。 #### Q3.3.9:文本检测换成自己的数据没法训练,有一些”###”是什么意思? @@ -418,7 +516,7 @@ return paddle.reader.multiprocess_reader(readers, False, queue_size=320) #### Q3.3.11:自己训练出来的未inference转换的模型 可以当作预训练模型吗? -**A**:可以的,但是如果训练数据两量少的话,可能会过拟合到少量数据上,泛化性能不佳。 +**A**:可以的,但是如果训练数据量少的话,可能会过拟合到少量数据上,泛化性能不佳。 #### Q3.3.12:使用带TPS的识别模型预测报错 @@ -428,6 +526,55 @@ return paddle.reader.multiprocess_reader(readers, False, queue_size=320) **A**:TPS模块暂时无法支持变长的输入,请设置 ``--rec_image_shape='3,32,100' --rec_char_type='en' 固定输入shape`` +#### Q3.3.14:使用之前版本的代码加载最新1.1版的通用检测预训练模型,提示在模型文件.pdparams中找不到bn4e_branch2a_variance是什么情况?是网络结构发生了变化吗? + +**A**:1.1版的轻量检测模型去掉了mv3结构中的se模块,可以对比下这两个配置文件:[det_mv3_db.yml](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/configs/det/det_mv3_db.yml),[det_mv3_db_v1.1.yml](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/configs/det/det_mv3_db_v1.1.yml) + +#### Q3.3.15: 训练中使用的字典需要与加载的预训练模型使用的字典一样吗? + +**A**:分情况,1. 不改变识别字符,训练的字典与你使用该模型进行预测的字典需要保持一致的。 + 2. 改变识别的字符,这种情况可以不一样,最后一层会重新训练 + +#### Q3.3.16: 如何对检测模型finetune,比如冻结前面的层或某些层使用小的学习率学习? +**A**: + +**A**:如果是冻结某些层,可以将变量的stop_gradient属性设置为True,这样计算这个变量之前的所有参数都不会更新了,参考:https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/faq/train_cn.html#id4 + +如果对某些层使用更小的学习率学习,静态图里还不是很方便,一个方法是在参数初始化的时候,给权重的属性设置固定的学习率,参考:https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/fluid/param_attr/ParamAttr_cn.html#paramattr + +实际上我们实验发现,直接加载模型去fine-tune,不设置某些层不同学习率,效果也都不错 + +#### Q3.3.17: 使用通用中文模型作为预训练模型,更改了字典文件,出现ctc_fc_b not used的错误 +**A**:修改了字典之后,识别模型的最后一层FC纬度发生了改变,没有办法加载参数。这里是一个警告,可以忽略,正常训练即可。 + +#### Q3.3.18: cpp_infer 在Windows下使用vs2015编译不通过 + +**A**:1. windows上建议使用VS2019工具编译,具体编译细节参考[链接](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/deploy/cpp_infer/docs/windows_vs2019_build.md) + +**A**:2. 在release模式下而不是debug模式下编译,参考[issue](https://github.com/PaddlePaddle/PaddleOCR/issues/1023) + +#### Q3.3.19: No module named 'tools.infer' + +**A**:1. 确保在PaddleOCR/目录下执行的指令,执行'export PYTHONPATH=.' + +**A**:2. 拉取github上最新代码,这个问题在10月底已修复。 + +#### Q3.3.20: 训练模型和测试模型的检测结果差距较大 + +**A**:1. 检查两个模型使用的后处理参数是否是一样的,训练的后处理参数在配置文件中的PostProcess部分,测试模型的后处理参数在tools/infer/utility.py中,最新代码中两个后处理参数已保持一致。 + + +#### Q3.3.21: 使用合成数据精调小模型后,效果可以,但是还没开源的小infer模型效果好,这是为什么呢? + +**A**: + +(1)要保证使用的配置文件和pretrain weights是对应的; + +(2)在微调时,一般都需要真实数据,如果使用合成数据,效果反而可能会有下降,PaddleOCR中放出的识别inference模型也是基于预训练模型在真实数据上微调得到的,效果提升比较明显; + +(3)在训练的时候,文本长度超过25的训练图像都会被丢弃,因此需要看下真正参与训练的图像有多少,太少的话也容易过拟合。 + + ### 预测部署 #### Q3.4.1:如何pip安装opt模型转换工具? @@ -493,3 +640,39 @@ return paddle.reader.multiprocess_reader(readers, False, queue_size=320) #### Q3.4.14:PaddleOCR模型部署方式有哪几种? **A**:目前有Inference部署,serving部署和手机端Paddle Lite部署,可根据不同场景做灵活的选择:Inference部署适用于本地离线部署,serving部署适用于云端部署,Paddle Lite部署适用于手机端集成。 + +#### Q3.4.15: hubserving、pdserving这两种部署方式区别是什么? + +**A**:hubserving原本是paddlehub的配套服务部署工具,可以很方便的将paddlehub内置的模型部署为服务,paddleocr使用了这个功能,并将模型路径等参数暴露出来方便用户自定义修改。paddle serving是面向所有paddle模型的部署工具,文档中可以看到我们提供了快速版和标准版,其中快速版和hubserving的本质是一样的,而标准版基于rpc,更稳定,更适合分布式部署。 + +#### Q3.4.16: hub serving部署服务时如何多gpu同时利用起来,export CUDA_VISIBLE_DEVICES=0,1 方式吗? + +**A**:hubserving的部署方式目前暂不支持多卡预测,除非手动启动多个serving,不同端口对应不同卡。或者可以使用paddleserving进行部署,部署工具已经发布:https://github.com/PaddlePaddle/PaddleOCR/tree/develop/deploy/pdserving ,在启动服务时--gpu_id 0,1 这样就可以 + +#### Q3.4.17: 预测内存泄漏问题 + +**A**:1. 使用hubserving出现内存泄漏,该问题为已知问题,预计在paddle2.0正式版中解决。相关讨论见[issue](https://github.com/PaddlePaddle/PaddleHub/issues/682) + +**A**:2. C++ 预测出现内存泄漏,该问题已经在paddle2.0rc版本中解决,建议安装paddle2.0rc版本,并更新PaddleOCR代码到最新。 + +#### Q3.4.18:对于一些尺寸较大的文档类图片,在检测时会有较多的漏检,怎么避免这种漏检的问题呢? + +**A**:PaddleOCR中在图像最长边大于960时,将图像等比例缩放为长边960的图像再进行预测,对于这种图像,可以通过修改det_max_side_len,增大检测的最长边:[tools/infer/utility.py#L45](../../tools/infer/utility.py#L45) + +#### Q3.4.19:在使用训练好的识别模型进行预测的时候,发现有很多重复的字,这个怎么解决呢? + +**A**:可以看下训练的尺度和预测的尺度是否相同,如果训练的尺度为`[3, 32, 320]`,预测的尺度为`[3, 64, 640]`,则会有比较多的重复识别现象。 + +#### Q3.4.20:文档场景中,使用DB模型会出现整行漏检的情况应该怎么解决? + +**A**:可以在预测时调小 det_db_box_thresh 阈值,默认为0.5, 可调小至0.3观察效果。 + +#### Q3.4.21:自己训练的det模型,在同一张图片上,inference模型与eval模型结果差别很大,为什么? + +**A**:这是由于图片预处理不同造成的。如果训练的det模型图片输入并不是默认的shape[600, 600],eval的程序中图片预处理方式与train时一致 +(由xxx_reader.yml中的test_image_shape参数决定缩放大小,但predict_eval.py中的图片预处理方式由程序里的preprocess_params决定, +最好不要传入max_side_len,而是传入和训练时一样大小的test_image_shape。 + +#### Q3.4.22:训练ccpd车牌数据集,训练集准确率高,测试均是错误的,这是什么原因? + +**A**:这是因为训练时将shape修改为[3, 70, 220], 预测时对图片resize,会把高度压缩至32,影响测试结果。注释掉[resize代码](https://github.com/PaddlePaddle/PaddleOCR/blob/ed4313d611b7708a7763d4612f00cb7f318a0e1f/tools/infer/predict_rec.py#L54-L55)可以解决问题。 diff --git a/doc/doc_ch/algorithm_overview.md b/doc/doc_ch/algorithm_overview.md index 9c2499f3d11a82c5246ace8dc96eef6dcc32e857..c4a3b3255f7367aec672387272d47b64a02658ee 100644 --- a/doc/doc_ch/algorithm_overview.md +++ b/doc/doc_ch/algorithm_overview.md @@ -1,5 +1,7 @@ ## 算法介绍 +本文给出了PaddleOCR已支持的文本检测算法和文本识别算法列表,以及每个算法在**英文公开数据集**上的模型和指标,主要用于算法简介和算法性能对比,更多包括中文在内的其他数据集上的模型请参考[PP-OCR v1.1 系列模型下载](./models_list.md)。 + - [1.文本检测算法](#文本检测算法) - [2.文本识别算法](#文本识别算法) @@ -29,18 +31,9 @@ PaddleOCR开源的文本检测算法列表: **说明:** SAST模型训练额外加入了icdar2013、icdar2017、COCO-Text、ArT等公开数据集进行调优。PaddleOCR用到的经过整理格式的英文公开数据集下载:[百度云地址](https://pan.baidu.com/s/12cPnZcVuV1zn5DOd4mqjVw) (提取码: 2bpi) - -使用[LSVT](./datasets.md#1icdar2019-lsvt)街景数据集共3w张数据,训练中文检测模型的相关配置和预训练文件如下: - -|模型|骨干网络|配置文件|预训练模型| -|-|-|-|-| -|超轻量中文模型|MobileNetV3|det_mv3_db.yml|[下载链接](https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db.tar)| -|通用中文OCR模型|ResNet50_vd|det_r50_vd_db.yml|[下载链接](https://paddleocr.bj.bcebos.com/ch_models/ch_det_r50_vd_db.tar)| - -* 注: 上述DB模型的训练和评估,需设置后处理参数box_thresh=0.6,unclip_ratio=1.5,使用不同数据集、不同模型训练,可调整这两个参数进行优化 - PaddleOCR文本检测算法的训练和使用请参考文档教程中[模型训练/评估中的文本检测部分](./detection.md)。 + ### 2.文本识别算法 @@ -68,11 +61,4 @@ PaddleOCR开源的文本识别算法列表: **说明:** SRN模型使用了数据扰动方法对上述提到对两个训练集进行增广,增广后的数据可以在[百度网盘](https://pan.baidu.com/s/1-HSZ-ZVdqBF2HaBZ5pRAKA)上下载,提取码: y3ry。 原始论文使用两阶段训练平均精度为89.74%,PaddleOCR中使用one-stage训练,平均精度为88.33%。两种预训练权重均在[下载链接](https://paddleocr.bj.bcebos.com/SRN/rec_r50fpn_vd_none_srn.tar)中。 -使用[LSVT](./datasets.md#1icdar2019-lsvt)街景数据集根据真值将图crop出来30w数据,进行位置校准。此外基于LSVT语料生成500w合成数据训练中文模型,相关配置和预训练文件如下: - -|模型|骨干网络|配置文件|预训练模型| -|-|-|-|-| -|超轻量中文模型|MobileNetV3|rec_chinese_lite_train.yml|[下载链接](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn.tar)| -|通用中文OCR模型|Resnet34_vd|rec_chinese_common_train.yml|[下载链接](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn.tar)| - PaddleOCR文本识别算法的训练和使用请参考文档教程中[模型训练/评估中的文本识别部分](./recognition.md)。 diff --git a/doc/doc_ch/config.md b/doc/doc_ch/config.md index fe8db9c893cf0e6190111de5fe7627d2fe52a4fd..f9c664d4ea38e2e52dc76bfb5b63d9a515b106a7 100644 --- a/doc/doc_ch/config.md +++ b/doc/doc_ch/config.md @@ -10,7 +10,7 @@ ## 配置文件 Global 参数介绍 -以 `rec_chinese_lite_train.yml` 为例 +以 `rec_chinese_lite_train_v1.1.yml ` 为例 | 字段 | 用途 | 默认值 | 备注 | @@ -32,6 +32,7 @@ | loss_type | 设置 loss 类型 | ctc | 支持两种loss: ctc / attention | | distort | 设置是否使用数据增强 | false | 设置为true时,将在训练时随机进行扰动,支持的扰动操作可阅读[img_tools.py](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/ppocr/data/rec/img_tools.py) | | use_space_char | 设置是否识别空格 | false | 仅在 character_type=ch 时支持空格 | +| label_list | 设置方向分类器支持的角度 | ['0','180'] | 仅在方向分类器中生效 | | average_window | ModelAverage优化器中的窗口长度计算比例 | 0.15 | 目前仅应用与SRN | | max_average_window | 平均值计算窗口长度的最大值 | 15625 | 推荐设置为一轮训练中mini-batchs的数目| | min_average_window | 平均值计算窗口长度的最小值 | 10000 | \ | diff --git a/doc/doc_ch/data_annotation.md b/doc/doc_ch/data_annotation.md index 056fc73bb5f8dd281cf5e77965870210c21c395b..da14b10d3565c8fa7bb06d189035f18eba262821 100644 --- a/doc/doc_ch/data_annotation.md +++ b/doc/doc_ch/data_annotation.md @@ -19,3 +19,9 @@ - 工具地址:https://github.com/wkentaro/labelme - 示意图: ![](../datasets/labelme.jpg) + +### 4. Vott +- 工具描述:支持矩形,多边形等图片标注.支持视频标注.方便使用的快捷键以及比较好看的界面.同时支持导出多种标签格式. +- 工具地址:https://github.com/microsoft/VoTT +- 示意图: + ![](../datasets/VoTT.jpg) diff --git a/doc/doc_ch/detection.md b/doc/doc_ch/detection.md index c2b62edbee7ae855cd32b03cc0019027fb05f669..5796114d69195d8fbac313f1b021fda46a870d4c 100644 --- a/doc/doc_ch/detection.md +++ b/doc/doc_ch/detection.md @@ -17,7 +17,7 @@ wget -P ./train_data/ https://paddleocr.bj.bcebos.com/dataset/test_icdar2015_la PaddleOCR 也提供了数据格式转换脚本,可以将官网 label 转换支持的数据格式。 数据转换工具在 `train_data/gen_label.py`, 这里以训练集为例: ``` -# 将官网下载的标签文件转换为 train_icdar2015_label.txt +# 将官网下载的标签文件转换为 train_icdar2015_label.txt python gen_label.py --mode="det" --root_path="icdar_c4_train_imgs/" \ --input_path="ch4_training_localization_transcription_gt" \ --output_label="train_icdar2015_label.txt" @@ -44,13 +44,15 @@ json.dumps编码前的图像标注信息是包含多个字典的list,字典中 ## 快速启动训练 -首先下载模型backbone的pretrain model,PaddleOCR的检测模型目前支持两种backbone,分别是MobileNetV3、ResNet50_vd, +首先下载模型backbone的pretrain model,PaddleOCR的检测模型目前支持两种backbone,分别是MobileNetV3、ResNet_vd系列, 您可以根据需求使用[PaddleClas](https://github.com/PaddlePaddle/PaddleClas/tree/master/ppcls/modeling/architectures)中的模型更换backbone。 ```shell cd PaddleOCR/ # 下载MobileNetV3的预训练模型 wget -P ./pretrain_models/ https://paddle-imagenet-models-name.bj.bcebos.com/MobileNetV3_large_x0_5_pretrained.tar -# 下载ResNet50的预训练模型 +# 或,下载ResNet18_vd的预训练模型 +wget -P ./pretrain_models/ https://paddle-imagenet-models-name.bj.bcebos.com/ResNet18_vd_pretrained.tar +# 或,下载ResNet50_vd的预训练模型 wget -P ./pretrain_models/ https://paddle-imagenet-models-name.bj.bcebos.com/ResNet50_vd_ssld_pretrained.tar # 解压预训练模型文件,以MobileNetV3为例 @@ -72,24 +74,24 @@ tar -xf ./pretrain_models/MobileNetV3_large_x0_5_pretrained.tar ./pretrain_model ```shell # 训练 mv3_db 模型,并将训练日志保存为 tain_det.log -python3 tools/train.py -c configs/det/det_mv3_db.yml \ +python3 tools/train.py -c configs/det/det_mv3_db_v1.1.yml \ -o Global.pretrain_weights=./pretrain_models/MobileNetV3_large_x0_5_pretrained/ \ 2>&1 | tee train_det.log ``` -上述指令中,通过-c 选择训练使用configs/det/det_db_mv3.yml配置文件。 +上述指令中,通过-c 选择训练使用configs/det/det_db_mv3_v1.1.yml配置文件。 有关配置文件的详细解释,请参考[链接](./config.md)。 您也可以通过-o参数在不需要修改yml文件的情况下,改变训练的参数,比如,调整训练的学习率为0.0001 ```shell -python3 tools/train.py -c configs/det/det_mv3_db.yml -o Optimizer.base_lr=0.0001 +python3 tools/train.py -c configs/det/det_mv3_db_v1.1.yml -o Optimizer.base_lr=0.0001 ``` #### 断点训练 如果训练程序中断,如果希望加载训练中断的模型从而恢复训练,可以通过指定Global.checkpoints指定要加载的模型路径: ```shell -python3 tools/train.py -c configs/det/det_mv3_db.yml -o Global.checkpoints=./your/trained/model +python3 tools/train.py -c configs/det/det_mv3_db_v1.1.yml -o Global.checkpoints=./your/trained/model ``` **注意**:`Global.checkpoints`的优先级高于`Global.pretrain_weights`的优先级,即同时指定两个参数时,优先加载`Global.checkpoints`指定的模型,如果`Global.checkpoints`指定的模型路径有误,会加载`Global.pretrain_weights`指定的模型。 @@ -98,17 +100,17 @@ python3 tools/train.py -c configs/det/det_mv3_db.yml -o Global.checkpoints=./you PaddleOCR计算三个OCR检测相关的指标,分别是:Precision、Recall、Hmean。 -运行如下代码,根据配置文件`det_db_mv3.yml`中`save_res_path`指定的测试集检测结果文件,计算评估指标。 +运行如下代码,根据配置文件`det_db_mv3_v1.1.yml`中`save_res_path`指定的测试集检测结果文件,计算评估指标。 评估时设置后处理参数`box_thresh=0.6`,`unclip_ratio=1.5`,使用不同数据集、不同模型训练,可调整这两个参数进行优化 ```shell -python3 tools/eval.py -c configs/det/det_mv3_db.yml -o Global.checkpoints="{path/to/weights}/best_accuracy" PostProcess.box_thresh=0.6 PostProcess.unclip_ratio=1.5 +python3 tools/eval.py -c configs/det/det_mv3_db_v1.1.yml -o Global.checkpoints="{path/to/weights}/best_accuracy" PostProcess.box_thresh=0.6 PostProcess.unclip_ratio=1.5 ``` 训练中模型参数默认保存在`Global.save_model_dir`目录下。在评估指标时,需要设置`Global.checkpoints`指向保存的参数文件。 比如: ```shell -python3 tools/eval.py -c configs/det/det_mv3_db.yml -o Global.checkpoints="./output/det_db/best_accuracy" PostProcess.box_thresh=0.6 PostProcess.unclip_ratio=1.5 +python3 tools/eval.py -c configs/det/det_mv3_db_v1.1.yml -o Global.checkpoints="./output/det_db/best_accuracy" PostProcess.box_thresh=0.6 PostProcess.unclip_ratio=1.5 ``` * 注:`box_thresh`、`unclip_ratio`是DB后处理所需要的参数,在评估EAST模型时不需要设置 @@ -117,16 +119,16 @@ python3 tools/eval.py -c configs/det/det_mv3_db.yml -o Global.checkpoints="./ou 测试单张图像的检测效果 ```shell -python3 tools/infer_det.py -c configs/det/det_mv3_db.yml -o TestReader.infer_img="./doc/imgs_en/img_10.jpg" Global.checkpoints="./output/det_db/best_accuracy" +python3 tools/infer_det.py -c configs/det/det_mv3_db_v1.1.yml -o Global.infer_img="./doc/imgs_en/img_10.jpg" Global.checkpoints="./output/det_db/best_accuracy" ``` 测试DB模型时,调整后处理阈值, ```shell -python3 tools/infer_det.py -c configs/det/det_mv3_db.yml -o TestReader.infer_img="./doc/imgs_en/img_10.jpg" Global.checkpoints="./output/det_db/best_accuracy" PostProcess.box_thresh=0.6 PostProcess.unclip_ratio=1.5 +python3 tools/infer_det.py -c configs/det/det_mv3_db_v1.1.yml -o Global.infer_img="./doc/imgs_en/img_10.jpg" Global.checkpoints="./output/det_db/best_accuracy" PostProcess.box_thresh=0.6 PostProcess.unclip_ratio=1.5 ``` 测试文件夹下所有图像的检测效果 ```shell -python3 tools/infer_det.py -c configs/det/det_mv3_db.yml -o TestReader.infer_img="./doc/imgs_en/" Global.checkpoints="./output/det_db/best_accuracy" +python3 tools/infer_det.py -c configs/det/det_mv3_db_v1.1.yml -o Global.infer_img="./doc/imgs_en/" Global.checkpoints="./output/det_db/best_accuracy" ``` diff --git a/doc/doc_ch/inference.md b/doc/doc_ch/inference.md index 709a07515c316cdfd60b74f0b090d4baeeb290a7..0432695a3fbb31f04122c4134490ff465e445b4c 100644 --- a/doc/doc_ch/inference.md +++ b/doc/doc_ch/inference.md @@ -3,7 +3,7 @@ inference 模型(`fluid.io.save_inference_model`保存的模型) 一般是模型训练完成后保存的固化模型,多用于预测部署。训练过程中保存的模型是checkpoints模型,保存的是模型的参数,多用于恢复训练等。 -与checkpoints模型相比,inference 模型会额外保存模型的结构信息,在预测部署、加速推理上性能优越,灵活方便,适合与实际系统集成。更详细的介绍请参考文档[分类预测框架](https://paddleclas.readthedocs.io/zh_CN/latest/extension/paddle_inference.html). +与checkpoints模型相比,inference 模型会额外保存模型的结构信息,在预测部署、加速推理上性能优越,灵活方便,适合与实际系统集成。更详细的介绍请参考文档[分类预测框架](https://github.com/PaddlePaddle/PaddleClas/blob/master/docs/zh_CN/extension/paddle_inference.md). 接下来首先介绍如何将训练的模型转换成inference模型,然后将依次介绍文本检测、文本识别以及两者串联基于预测引擎推理。 @@ -23,8 +23,9 @@ inference 模型(`fluid.io.save_inference_model`保存的模型) - [1. 超轻量中文识别模型推理](#超轻量中文识别模型推理) - [2. 基于CTC损失的识别模型推理](#基于CTC损失的识别模型推理) - [3. 基于Attention损失的识别模型推理](#基于Attention损失的识别模型推理) - - [4. 自定义文本识别字典的推理](#自定义文本识别字典的推理) - - [5. 多语言模型的推理](#多语言模型的推理) + - [4. 基于SRN损失的识别模型推理](#基于SRN损失的识别模型推理) + - [5. 自定义文本识别字典的推理](#自定义文本识别字典的推理) + - [6. 多语言模型的推理](#多语言模型的推理) - [四、方向分类模型推理](#方向识别模型推理) - [1. 方向分类模型推理](#方向分类模型推理) @@ -41,7 +42,7 @@ inference 模型(`fluid.io.save_inference_model`保存的模型) 下载超轻量级中文检测模型: ``` -wget -P ./ch_lite/ https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db.tar && tar xf ./ch_lite/ch_det_mv3_db.tar -C ./ch_lite/ +wget -P ./ch_lite/ https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar && tar xf ./ch_lite/ch_ppocr_mobile_v1.1_det_train.tar -C ./ch_lite/ ``` 上述模型是以MobileNetV3为backbone训练的DB算法,将训练好的模型转换成inference模型只需要运行如下命令: ``` @@ -50,7 +51,7 @@ wget -P ./ch_lite/ https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db.tar & # Global.checkpoints参数设置待转换的训练模型地址,不用添加文件后缀.pdmodel,.pdopt或.pdparams。 # Global.save_inference_dir参数设置转换的模型将保存的地址。 -python3 tools/export_model.py -c configs/det/det_mv3_db.yml -o Global.checkpoints=./ch_lite/det_mv3_db/best_accuracy Global.save_inference_dir=./inference/det_db/ +python3 tools/export_model.py -c configs/det/det_mv3_db_v1.1.yml -o Global.checkpoints=./ch_lite/ch_ppocr_mobile_v1.1_det_train/best_accuracy Global.save_inference_dir=./inference/det_db/ ``` 转inference模型时,使用的配置文件和训练时使用的配置文件相同。另外,还需要设置配置文件中的`Global.checkpoints`、`Global.save_inference_dir`参数。 其中`Global.checkpoints`指向训练中保存的模型参数文件,`Global.save_inference_dir`是生成的inference模型要保存的目录。 @@ -66,7 +67,7 @@ inference/det_db/ 下载超轻量中文识别模型: ``` -wget -P ./ch_lite/ https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn.tar && tar xf ./ch_lite/ch_rec_mv3_crnn.tar -C ./ch_lite/ +wget -P ./ch_lite/ https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_train.tar && tar xf ./ch_lite/ch_ppocr_mobile_v1.1_rec_train.tar -C ./ch_lite/ ``` 识别模型转inference模型与检测的方式相同,如下: @@ -76,7 +77,7 @@ wget -P ./ch_lite/ https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn.tar # Global.checkpoints参数设置待转换的训练模型地址,不用添加文件后缀.pdmodel,.pdopt或.pdparams。 # Global.save_inference_dir参数设置转换的模型将保存的地址。 -python3 tools/export_model.py -c configs/rec/rec_chinese_lite_train.yml -o Global.checkpoints=./ch_lite/rec_mv3_crnn/best_accuracy \ +python3 tools/export_model.py -c configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml -o Global.checkpoints=./ch_lite/ch_ppocr_mobile_v1.1_rec_train/best_accuracy \ Global.save_inference_dir=./inference/rec_crnn/ ``` @@ -94,7 +95,7 @@ python3 tools/export_model.py -c configs/rec/rec_chinese_lite_train.yml -o Globa 下载方向分类模型: ``` -wget -P ./ch_lite/ https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile-v1.1.cls_pre.tar && tar xf ./ch_lite/ch_ppocr_mobile-v1.1.cls_pre.tar -C ./ch_lite/ +wget -P ./ch_lite/ https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar && tar xf ./ch_lite/ch_ppocr_mobile_v1.1_cls_train.tar -C ./ch_lite/ ``` 方向分类模型转inference模型与检测的方式相同,如下: @@ -104,7 +105,7 @@ wget -P ./ch_lite/ https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile- # Global.checkpoints参数设置待转换的训练模型地址,不用添加文件后缀.pdmodel,.pdopt或.pdparams。 # Global.save_inference_dir参数设置转换的模型将保存的地址。 -python3 tools/export_model.py -c configs/cls/cls_mv3.yml -o Global.checkpoints=./ch_lite/cls_model/best_accuracy \ +python3 tools/export_model.py -c configs/cls/cls_mv3.yml -o Global.checkpoints=./ch_lite/ch_ppocr_mobile_v1.1_cls_train/best_accuracy \ Global.save_inference_dir=./inference/cls/ ``` @@ -297,9 +298,21 @@ Predicts of ./doc/imgs_words_en/word_336.png:['super', 0.9999555] self.character_str = "0123456789abcdefghijklmnopqrstuvwxyz" dict_character = list(self.character_str) ``` + +### 4. 基于SRN损失的识别模型推理 + +基于SRN损失的识别模型,需要额外设置识别算法参数 --rec_algorithm="SRN"。 同时需要保证预测shape与训练时一致,如: --rec_image_shape="1, 64, 256" + +``` +python3 tools/infer/predict_rec.py --image_dir="./doc/imgs_words_en/word_336.png" \ + --rec_model_dir="./inference/srn/" \ + --rec_image_shape="1, 64, 256" \ + --rec_char_type="en" \ + --rec_algorithm="SRN" +``` -### 4. 自定义文本识别字典的推理 +### 5. 自定义文本识别字典的推理 如果训练时修改了文本的字典,在使用inference模型预测时,需要通过`--rec_char_dict_path`指定使用的字典路径 ``` @@ -307,12 +320,12 @@ python3 tools/infer/predict_rec.py --image_dir="./doc/imgs_words_en/word_336.png ``` -### 5. 多语言模型的推理 +### 6. 多语言模型的推理 如果您需要预测的是其他语言模型,在使用inference模型预测时,需要通过`--rec_char_dict_path`指定使用的字典路径, 同时为了得到正确的可视化结果, 需要通过 `--vis_font_path` 指定可视化的字体路径,`doc/` 路径下有默认提供的小语种字体,例如韩文识别: ``` -python3 tools/infer/predict_rec.py --image_dir="./doc/imgs_words/korean/1.jpg" --rec_model_dir="./your inference model" --rec_char_type="korean" --rec_char_dict_path="ppocr/utils/korean_dict.txt" --vis_font_path="doc/korean.ttf" +python3 tools/infer/predict_rec.py --image_dir="./doc/imgs_words/korean/1.jpg" --rec_model_dir="./your inference model" --rec_char_type="korean" --rec_char_dict_path="ppocr/utils/dict/korean_dict.txt" --vis_font_path="doc/korean.ttf" ``` ![](../imgs_words/korean/1.jpg) @@ -351,9 +364,17 @@ Predicts of ./doc/imgs_words/ch/word_4.jpg:['0', 0.9999963] 在执行预测时,需要通过参数`image_dir`指定单张图像或者图像集合的路径、参数`det_model_dir`,`cls_model_dir`和`rec_model_dir`分别指定检测,方向分类和识别的inference模型路径。参数`use_angle_cls`用于控制是否启用方向分类模型。可视化识别结果默认保存到 ./inference_results 文件夹里面。 ``` -python3 tools/infer/predict_system.py --image_dir="./doc/imgs/2.jpg" --det_model_dir="./inference/det_db/" --cls_model_dir="./inference/cls/" --rec_model_dir="./inference/rec_crnn/" --use_angle_cls true +# 使用方向分类器 +python3 tools/infer/predict_system.py --image_dir="./doc/imgs/2.jpg" --det_model_dir="./inference/det_db/" --cls_model_dir="./inference/cls/" --rec_model_dir="./inference/rec_crnn/" --use_angle_cls=true + +# 不使用方向分类器 +python3 tools/infer/predict_system.py --image_dir="./doc/imgs/2.jpg" --det_model_dir="./inference/det_db/" --rec_model_dir="./inference/rec_crnn/" --use_angle_cls=false ``` + + + + 执行命令后,识别结果图像如下: ![](../imgs_results/2.jpg) diff --git a/doc/doc_ch/installation.md b/doc/doc_ch/installation.md index 381d1a9e8522c40fc4a2784024ee20537e6f11ba..5d8e5db0b19a6c8169b141f00c98291d0aec9f93 100644 --- a/doc/doc_ch/installation.md +++ b/doc/doc_ch/installation.md @@ -2,7 +2,7 @@ 经测试PaddleOCR可在glibc 2.23上运行,您也可以测试其他glibc版本或安装glic 2.23 PaddleOCR 工作环境 -- PaddlePaddle 1.7+ +- PaddlePaddle 1.8+ ,推荐使用 PaddlePaddle 2.0.0.beta - python3.7 - glibc 2.23 - cuDNN 7.6+ (GPU) @@ -47,19 +47,16 @@ docker images hub.baidubce.com/paddlepaddle/paddle latest-gpu-cuda9.0-cudnn7-dev f56310dcc829 ``` -**2. 安装PaddlePaddle Fluid v1.7** +**2. 安装PaddlePaddle v2.0** ``` -pip3 install --upgrade pip +python3 -m pip install --upgrade pip -如果您的机器安装的是CUDA9,请运行以下命令安装 -python3 -m pip install paddlepaddle-gpu==1.7.2.post97 -i https://pypi.tuna.tsinghua.edu.cn/simple - -如果您的机器安装的是CUDA10,请运行以下命令安装 -python3 -m pip install paddlepaddle-gpu==1.7.2.post107 -i https://pypi.tuna.tsinghua.edu.cn/simple +如果您的机器安装的是CUDA9或CUDA10,请运行以下命令安装 +python3 -m pip install paddlepaddle-gpu==2.0.0b0 -i https://mirror.baidu.com/pypi/simple 如果您的机器是CPU,请运行以下命令安装 -python3 -m pip install paddlepaddle==1.7.2 -i https://pypi.tuna.tsinghua.edu.cn/simple +python3 -m pip install paddlepaddle==2.0.0b0 -i https://mirror.baidu.com/pypi/simple 更多的版本需求,请参照[安装文档](https://www.paddlepaddle.org.cn/install/quick)中的说明进行操作。 ``` @@ -78,7 +75,7 @@ git clone https://gitee.com/paddlepaddle/PaddleOCR **4. 安装第三方库** ``` cd PaddleOCR -pip3 install -r requirments.txt +python3 -m pip install -r requirements.txt ``` 注意,windows环境下,建议从[这里](https://www.lfd.uci.edu/~gohlke/pythonlibs/#shapely)下载shapely安装包完成安装, diff --git a/doc/doc_ch/models_list.md b/doc/doc_ch/models_list.md index cf389bdc48cdf976abe0302cb9de09776d34e4ed..c85def4efbc8abdd5eeadbd7a4641b5776694491 100644 --- a/doc/doc_ch/models_list.md +++ b/doc/doc_ch/models_list.md @@ -18,11 +18,11 @@ PaddleOCR提供的可下载模型包括`推理模型`、`训练模型`、`预训 ### 一、文本检测模型 -|模型名称|模型简介|推理模型大小|下载地址| -|-|-|-|-| -|ch_ppocr_mobile_slim_v1.1_det|slim裁剪版超轻量模型,支持中英文、多语种文本检测|1.4M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/det/ch_ppocr_mobile_v1.1_det_prune_infer.tar) / [slim模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/det/ch_ppocr_mobile_v1.1_det_prune_opt.nb)| -|ch_ppocr_mobile_v1.1_det|原始超轻量模型,支持中英文、多语种文本检测|2.6M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar)| -|ch_ppocr_server_v1.1_det|通用模型,支持中英文、多语种文本检测,比超轻量模型更大,但效果更好|47.2M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_train.tar)| +|模型名称|模型简介|配置文件|推理模型大小|下载地址| +|-|-|-|-|-| +|ch_ppocr_mobile_slim_v1.1_det|slim裁剪版超轻量模型,支持中英文、多语种文本检测|[det_mv3_db_v1.1.yml](../../configs/det/det_mv3_db_v1.1.yml)|1.4M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/det/ch_ppocr_mobile_v1.1_det_prune_infer.tar) / [slim模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_det_prune_opt.nb)| +|ch_ppocr_mobile_v1.1_det|原始超轻量模型,支持中英文、多语种文本检测|[det_mv3_db_v1.1.yml](../../configs/det/det_mv3_db_v1.1.yml)|2.6M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar)| +|ch_ppocr_server_v1.1_det|通用模型,支持中英文、多语种文本检测,比超轻量模型更大,但效果更好|[det_r18_vd_db_v1.1.yml](../../configs/det/det_r18_vd_db_v1.1.yml)|47.2M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_train.tar)| @@ -30,42 +30,42 @@ PaddleOCR提供的可下载模型包括`推理模型`、`训练模型`、`预训 #### 1. 中文识别模型 -|模型名称|模型简介|推理模型大小|下载地址| -|-|-|-|-| -|ch_ppocr_mobile_slim_v1.1_rec|slim裁剪量化版超轻量模型,支持中英文、数字识别|1.6M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/rec/ch_ppocr_mobile_v1.1_rec_quant_infer.tar) / [slim模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/rec/ch_ppocr_mobile_v1.1_rec_quant_opt.nb)| -|ch_ppocr_mobile_v1.1_rec|原始超轻量模型,支持中英文、数字识别|4.6M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_train.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_pre.tar)| -|ch_ppocr_server_v1.1_rec|通用模型,支持中英文、数字识别|105M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_train.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_pre.tar)| +|模型名称|模型简介|配置文件|推理模型大小|下载地址| +|-|-|-|-|-| +|ch_ppocr_mobile_slim_v1.1_rec|slim裁剪量化版超轻量模型,支持中英文、数字识别|[rec_chinese_lite_train_v1.1.yml](../../configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml)|1.6M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/rec/ch_ppocr_mobile_v1.1_rec_quant_infer.tar) / [slim模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_rec_quant_opt.nb) | +|ch_ppocr_mobile_v1.1_rec|原始超轻量模型,支持中英文、数字识别|[rec_chinese_lite_train_v1.1.yml](../../configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml)|4.6M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_train.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_pre.tar) | +|ch_ppocr_server_v1.1_rec|通用模型,支持中英文、数字识别|[rec_chinese_common_train_v1.1.yml](../../configs/rec/ch_ppocr_v1.1/rec_chinese_common_train_v1.1.yml)|105M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_train.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_pre.tar) | **说明:** `训练模型`是基于预训练模型在真实数据与竖排合成文本数据上finetune得到的模型,在真实应用场景中有着更好的表现,`预训练模型`则是直接基于全量真实数据与合成数据训练得到,更适合用于在自己的数据集上finetune。 #### 2. 英文识别模型 -|模型名称|模型简介|推理模型大小|下载地址| -|-|-|-|-| -|en_ppocr_mobile_slim_v1.1_rec|slim裁剪量化版超轻量模型,支持英文、数字识别|0.9M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/en/en_ppocr_mobile_v1.1_rec_quant_infer.tar) / [slim模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/en/en_ppocr_mobile_v1.1_rec_quant_opt.nb)| -|en_ppocr_mobile_v1.1_rec|原始超轻量模型,支持英文、数字识别|2.0M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/en/en_ppocr_mobile_v1.1_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/en/en_ppocr_mobile_v1.1_rec_train.tar)| +|模型名称|模型简介|配置文件|推理模型大小|下载地址| +|-|-|-|-|-| +|en_ppocr_mobile_slim_v1.1_rec|slim裁剪量化版超轻量模型,支持英文、数字识别|[rec_en_lite_train.yml](../../configs/rec/multi_languages/rec_en_lite_train.yml)|0.9M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/en/en_ppocr_mobile_v1.1_rec_quant_infer.tar) / [slim模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/en/en_ppocr_mobile_v1.1_rec_quant_opt.nb) | +|en_ppocr_mobile_v1.1_rec|原始超轻量模型,支持英文、数字识别|[rec_en_lite_train.yml](../../configs/rec/multi_languages/rec_en_lite_train.yml)|2.0M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/en/en_ppocr_mobile_v1.1_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/en/en_ppocr_mobile_v1.1_rec_train.tar) | #### 3. 多语言识别模型(更多语言持续更新中...) -|模型名称|模型简介|推理模型大小|下载地址| -|-|-|-|-| -| french_ppocr_mobile_v1.1_rec |法文识别|2.1M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/fr/french_ppocr_mobile_v1.1_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/fr/french_ppocr_mobile_v1.1_rec_train.tar)| -| german_ppocr_mobile_v1.1_rec |德文识别|2.1M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/ge/german_ppocr_mobile_v1.1_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/ge/german_ppocr_mobile_v1.1_rec_train.tar)| -| korean_ppocr_mobile_v1.1_rec |韩文识别|3.4M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/kr/korean_ppocr_mobile_v1.1_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/kr/korean_ppocr_mobile_v1.1_rec_train.tar)| -| japan_ppocr_mobile_v1.1_rec |日文识别|3.7M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/jp/japan_ppocr_mobile_v1.1_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/jp/japan_ppocr_mobile_v1.1_rec_train.tar)| +|模型名称|模型简介|配置文件|推理模型大小|下载地址| +|-|-|-|-|-| +| french_ppocr_mobile_v1.1_rec |法文识别|[rec_french_lite_train.yml](../../configs/rec/multi_languages/rec_french_lite_train.yml)|2.1M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/fr/french_ppocr_mobile_v1.1_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/fr/french_ppocr_mobile_v1.1_rec_train.tar) | +| german_ppocr_mobile_v1.1_rec |德文识别|[rec_ger_lite_train.yml](../../configs/rec/multi_languages/rec_ger_lite_train.yml)|2.1M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/ge/german_ppocr_mobile_v1.1_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/ge/german_ppocr_mobile_v1.1_rec_train.tar) | +| korean_ppocr_mobile_v1.1_rec |韩文识别|[rec_korean_lite_train.yml](../../configs/rec/multi_languages/rec_korean_lite_train.yml)|3.4M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/kr/korean_ppocr_mobile_v1.1_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/kr/korean_ppocr_mobile_v1.1_rec_train.tar) | +| japan_ppocr_mobile_v1.1_rec |日文识别|[rec_japan_lite_train.yml](../../configs/rec/multi_languages/rec_japan_lite_train.yml)|3.7M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/jp/japan_ppocr_mobile_v1.1_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/jp/japan_ppocr_mobile_v1.1_rec_train.tar) | ### 三、文本方向分类模型 -|模型名称|模型简介|推理模型大小|下载地址| -|-|-|-|-| -|ch_ppocr_mobile_v1.1_cls_quant|slim量化版模型|0.5M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_quant_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_quant_train.tar) / [slim模型]()| -|ch_ppocr_mobile_v1.1_cls|原始模型|850kb|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar)| +|模型名称|模型简介|配置文件|推理模型大小|下载地址| +|-|-|-|-|-| +|ch_ppocr_mobile_v1.1_cls_quant|slim量化版模型|[cls_mv3.yml](../../configs/cls/cls_mv3.yml)|0.5M|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_quant_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_quant_train.tar) / [slim模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_cls_quant_opt.nb) | +|ch_ppocr_mobile_v1.1_cls|原始模型|[cls_mv3.yml](../../configs/cls/cls_mv3.yml)|850kb|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar) | ## OCR模型列表(V1.0,7月16日更新) |模型名称|模型简介|检测模型地址|识别模型地址|支持空格的识别模型地址| |-|-|-|-|-| -|chinese_db_crnn_mobile|8.6M超轻量级中文OCR模型|[推理模型](https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db.tar)|[推理模型](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn.tar)|[推理模型](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_enhance_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_enhance.tar) -|chinese_db_crnn_server|通用中文OCR模型|[推理模型](https://paddleocr.bj.bcebos.com/ch_models/ch_det_r50_vd_db_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/ch_models/ch_det_r50_vd_db.tar)|[推理模型](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn.tar)|[推理模型](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_enhance_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_enhance.tar) +|chinese_db_crnn_mobile|8.6M超轻量级中文OCR模型|[推理模型](https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db.tar) |[推理模型](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn.tar) |[推理模型](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_enhance_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_enhance.tar) +|chinese_db_crnn_server|通用中文OCR模型|[推理模型](https://paddleocr.bj.bcebos.com/ch_models/ch_det_r50_vd_db_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/ch_models/ch_det_r50_vd_db.tar) |[推理模型](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn.tar) |[推理模型](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_enhance_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_enhance.tar) diff --git a/doc/doc_ch/quickstart.md b/doc/doc_ch/quickstart.md index 701b50ed36fc69a6285550e6f53f6f3a09a1a63d..ea3e2e6d73a1811d4f0c63d3f7d2b5f03a28e5a2 100644 --- a/doc/doc_ch/quickstart.md +++ b/doc/doc_ch/quickstart.md @@ -9,12 +9,15 @@ ## 2.inference模型下载 -|模型名称|模型简介|检测模型地址|识别模型地址|支持空格的识别模型地址| -|-|-|-|-|-| -|chinese_db_crnn_mobile|超轻量级中文OCR模型|[inference模型](https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db.tar)|[inference模型](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn.tar)|[inference模型](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_enhance_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_enhance.tar) -|chinese_db_crnn_server|通用中文OCR模型|[inference模型](https://paddleocr.bj.bcebos.com/ch_models/ch_det_r50_vd_db_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/ch_models/ch_det_r50_vd_db.tar)|[inference模型](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn.tar)|[inference模型](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_enhance_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_enhance.tar) +* 移动端和服务器端的检测与识别模型如下,更多模型下载(包括多语言),可以参考[PP-OCR v1.1 系列模型下载](../doc_ch/models_list.md) -*windows 环境下如果没有安装wget,下载模型时可将链接复制到浏览器中下载,并解压放置在相应目录下* +| 模型简介 | 模型名称 |推荐场景 | 检测模型 | 方向分类器 | 识别模型 | +| ------------ | --------------- | ----------------|---- | ---------- | -------- | +| 中英文超轻量OCR模型(8.1M) | ch_ppocr_mobile_v1.1_xx |移动端&服务器端|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar)|[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar) |[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_pre.tar) | +| 中英文通用OCR模型(155.1M) |ch_ppocr_server_v1.1_xx|服务器端 |[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_train.tar) |[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar) |[推理模型](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_pre.tar) | + + +* windows 环境下如果没有安装wget,下载模型时可将链接复制到浏览器中下载,并解压放置在相应目录下 复制上表中的检测和识别的`inference模型`下载地址,并解压 @@ -24,6 +27,8 @@ mkdir inference && cd inference wget {url/of/detection/inference_model} && tar xf {name/of/detection/inference_model/package} # 下载识别模型并解压 wget {url/of/recognition/inference_model} && tar xf {name/of/recognition/inference_model/package} +# 下载方向分类器模型并解压 +wget {url/of/classification/inference_model} && tar xf {name/of/classification/inference_model/package} cd .. ``` @@ -32,9 +37,11 @@ cd .. ``` mkdir inference && cd inference # 下载超轻量级中文OCR模型的检测模型并解压 -wget https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db_infer.tar && tar xf ch_det_mv3_db_infer.tar +wget https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar && tar xf ch_ppocr_mobile_v1.1_det_infer.tar # 下载超轻量级中文OCR模型的识别模型并解压 -wget https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar && tar xf ch_rec_mv3_crnn_infer.tar +wget https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar && tar xf ch_ppocr_mobile_v1.1_rec_infer.tar +# 下载超轻量级中文OCR模型的文本方向分类器模型并解压 +wget https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar && tar xf ch_ppocr_mobile_v1.1_cls_infer.tar cd .. ``` @@ -42,10 +49,13 @@ cd .. ``` |-inference - |-ch_rec_mv3_crnn + |-ch_ppocr_mobile_v1.1_det_infer + |- model + |- params + |-ch_ppocr_mobile_v1.1_rec_infer |- model |- params - |-ch_det_mv3_db + |-ch_ppocr_mobile-v1.1_cls_infer |- model |- params ... @@ -53,42 +63,37 @@ cd .. ## 3.单张图像或者图像集合预测 -以下代码实现了文本检测、识别串联推理,在执行预测时,需要通过参数image_dir指定单张图像或者图像集合的路径、参数det_model_dir指定检测inference模型的路径和参数rec_model_dir指定识别inference模型的路径。可视化识别结果默认保存到 ./inference_results 文件夹里面。 +以下代码实现了文本检测、识别串联推理,在执行预测时,需要通过参数image_dir指定单张图像或者图像集合的路径、参数`det_model_dir`指定检测inference模型的路径、参数`rec_model_dir`指定识别inference模型的路径、参数`use_angle_cls`指定是否使用方向分类器、参数`cls_model_dir`指定方向分类器inference模型的路径、参数`use_space_char`指定是否预测空格字符。可视化识别结果默认保存到`./inference_results`文件夹里面。 ```bash # 预测image_dir指定的单张图像 -python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_det_mv3_db/" --rec_model_dir="./inference/ch_rec_mv3_crnn/" +python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_ppocr_mobile_v1.1_det_infer/" --rec_model_dir="./inference/ch_ppocr_mobile_v1.1_rec_infer/" --cls_model_dir="./inference/ch_ppocr_mobile_v1.1_cls_infer/" --use_angle_cls=True --use_space_char=True # 预测image_dir指定的图像集合 -python3 tools/infer/predict_system.py --image_dir="./doc/imgs/" --det_model_dir="./inference/ch_det_mv3_db/" --rec_model_dir="./inference/ch_rec_mv3_crnn/" +python3 tools/infer/predict_system.py --image_dir="./doc/imgs/" --det_model_dir="./inference/ch_ppocr_mobile_v1.1_det_infer/" --rec_model_dir="./inference/ch_ppocr_mobile_v1.1_rec_infer/" --cls_model_dir="./inference/ch_ppocr_mobile_v1.1_cls_infer/" --use_angle_cls=True --use_space_char=True # 如果想使用CPU进行预测,需设置use_gpu参数为False -python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_det_mv3_db/" --rec_model_dir="./inference/ch_rec_mv3_crnn/" --use_gpu=False +python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_ppocr_mobile_v1.1_det_infer/" --rec_model_dir="./inference/ch_ppocr_mobile_v1.1_rec_infer/" --cls_model_dir="./inference/ch_ppocr_mobile_v1.1_cls_infer/" --use_angle_cls=True --use_space_char=True --use_gpu=False ``` - 通用中文OCR模型 请按照上述步骤下载相应的模型,并且更新相关的参数,示例如下: -``` + +```bash # 预测image_dir指定的单张图像 -python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_det_r50_vd_db/" --rec_model_dir="./inference/ch_rec_r34_vd_crnn/" +python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_ppocr_server_v1.1_det_infer/" --rec_model_dir="./inference/ch_ppocr_server_v1.1_rec_infer/" --cls_model_dir="./inference/ch_ppocr_mobile_v1.1_cls_infer/" --use_angle_cls=True --use_space_char=True ``` -- 支持空格的通用中文OCR模型 +* 注意: + - 如果希望使用不支持空格的识别模型,在预测的时候需要注意:请将代码更新到最新版本,并添加参数 `--use_space_char=False`。 + - 如果不希望使用方向分类器,在预测的时候需要注意:请将代码更新到最新版本,并添加参数 `--use_angle_cls=False`。 -请按照上述步骤下载相应的模型,并且更新相关的参数,示例如下: - -*注意:请将代码更新到最新版本,并添加参数 `--use_space_char=True` * - -``` -# 预测image_dir指定的单张图像 -python3 tools/infer/predict_system.py --image_dir="./doc/imgs_en/img_12.jpg" --det_model_dir="./inference/ch_det_r50_vd_db/" --rec_model_dir="./inference/ch_rec_r34_vd_crnn_enhance/" --use_space_char=True -``` 更多的文本检测、识别串联推理使用方式请参考文档教程中[基于Python预测引擎推理](./inference.md)。 此外,文档教程中也提供了中文OCR模型的其他预测部署方式: - [基于C++预测引擎推理](../../deploy/cpp_infer/readme.md) -- [服务部署](./serving.md) +- [服务部署](../../deploy/hubserving/readme.md) - [端侧部署](../../deploy/lite/readme.md) diff --git a/doc/doc_ch/recognition.md b/doc/doc_ch/recognition.md index c8955f7fe1c7022cf68155be330fad307c68fe43..84c6f0e304983e4130bc21c7c425e0e83338a8db 100644 --- a/doc/doc_ch/recognition.md +++ b/doc/doc_ch/recognition.md @@ -1,5 +1,24 @@ ## 文字识别 + +- [一、数据准备](#数据准备) + - [数据下载](#数据下载) + - [自定义数据集](#自定义数据集) + - [字典](#字典) + - [支持空格](#支持空格) + +- [二、启动训练](#文本检测模型推理) + - [1. 数据增强](#数据增强) + - [2. 训练](#训练) + - [3. 小语种](#小语种) + +- [三、评估](#评估) + +- [四、预测](#预测) + - [1. 训练引擎预测](#训练引擎预测) + + + ### 数据准备 @@ -13,16 +32,18 @@ PaddleOCR 支持两种数据格式: `lmdb` 用于训练公开数据,调试算 ln -sf /train_data/dataset ``` - + * 数据下载 若您本地没有数据集,可以在官网下载 [icdar2015](http://rrc.cvc.uab.es/?ch=4&com=downloads) 数据,用于快速验证。也可以参考[DTRB](https://github.com/clovaai/deep-text-recognition-benchmark#download-lmdb-dataset-for-traininig-and-evaluation-from-here),下载 benchmark 所需的lmdb格式数据集。 如果希望复现SRN的论文指标,需要下载离线[增广数据](https://pan.baidu.com/s/1-HSZ-ZVdqBF2HaBZ5pRAKA),提取码: y3ry。增广数据是由MJSynth和SynthText做旋转和扰动得到的。数据下载完成后请解压到 {your_path}/PaddleOCR/train_data/data_lmdb_release/training/ 路径下。 -* 使用自己数据集: + +* 使用自己数据集 若您希望使用自己的数据进行训练,请参考下文组织您的数据。 + - 训练集 首先请将训练图片放入同一个文件夹(train_images),并用一个txt文件(rec_gt_train.txt)记录图片路径和标签。 @@ -77,7 +98,7 @@ python gen_label.py --mode="rec" --input_path="{path/of/origin/label}" --output_ |- word_003.jpg | ... ``` - + - 字典 最后需要提供一个字典({word_dict_name}.txt),使模型在训练时,可以将所有出现的字符映射为字典的索引。 @@ -96,21 +117,36 @@ n word_dict.txt 每行有一个单字,将字符与数字索引映射在一起,“and” 将被映射成 [2 5 1] `ppocr/utils/ppocr_keys_v1.txt` 是一个包含6623个字符的中文字典, + `ppocr/utils/ic15_dict.txt` 是一个包含36个字符的英文字典, + +`ppocr/utils/dict/french_dict.txt` 是一个包含118个字符的法文字典 + +`ppocr/utils/dict/japan_dict.txt` 是一个包含4399个字符的日文字典 + +`ppocr/utils/dict/korean_dict.txt` 是一个包含3636个字符的韩文字典 + +`ppocr/utils/dict/german_dict.txt` 是一个包含131个字符的德文字典 + + 您可以按需使用。 +目前的多语言模型仍处在demo阶段,会持续优化模型并补充语种,**非常欢迎您为我们提供其他语言的字典和字体**, +如您愿意可将字典文件提交至 [dict](../../ppocr/utils/dict) 将语料文件提交至[corpus](../../ppocr/utils/corpus),我们会在Repo中感谢您。 + - 自定义字典 如需自定义dic文件,请在 `configs/rec/rec_icdar15_train.yml` 中添加 `character_dict_path` 字段, 指向您的字典路径。 并将 `character_type` 设置为 `ch`。 + - 添加空格类别 如果希望支持识别"空格"类别, 请将yml文件中的 `use_space_char` 字段设置为 `true`。 **注意:`use_space_char` 仅在 `character_type=ch` 时生效** - + ### 启动训练 PaddleOCR提供了训练脚本、评估脚本和预测脚本,本节将以 CRNN 识别模型为例: @@ -131,14 +167,12 @@ tar -xf rec_mv3_none_bilstm_ctc.tar && rm -rf rec_mv3_none_bilstm_ctc.tar *如果您安装的是cpu版本,请将配置文件中的 `use_gpu` 字段修改为false* ``` -# 设置PYTHONPATH路径 -export PYTHONPATH=$PYTHONPATH:. # GPU训练 支持单卡,多卡训练,通过CUDA_VISIBLE_DEVICES指定卡号 export CUDA_VISIBLE_DEVICES=0,1,2,3 # 训练icdar15英文数据 并将训练日志保存为 tain_rec.log python3 tools/train.py -c configs/rec/rec_icdar15_train.yml 2>&1 | tee train_rec.log ``` - + - 数据增强 PaddleOCR提供了多种数据增强方式,如果您希望在训练时加入扰动,请在配置文件中设置 `distort: true`。 @@ -149,6 +183,7 @@ PaddleOCR提供了多种数据增强方式,如果您希望在训练时加入 *由于OpenCV的兼容性问题,扰动操作暂时只支持Linux* + - 训练 PaddleOCR支持训练和评估交替进行, 可以在 `configs/rec/rec_icdar15_train.yml` 中修改 `eval_batch_step` 设置评估频率,默认每500个iter评估一次。评估过程中默认将最佳acc模型,保存为 `output/rec_CRNN/best_accuracy` 。 @@ -160,7 +195,10 @@ PaddleOCR支持训练和评估交替进行, 可以在 `configs/rec/rec_icdar15_t | 配置文件 | 算法名称 | backbone | trans | seq | pred | | :--------: | :-------: | :-------: | :-------: | :-----: | :-----: | +| [rec_chinese_lite_train_v1.1.yml](../../configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml) | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | +| [rec_chinese_common_train_v1.1.yml](../../configs/rec/ch_ppocr_v1.1/rec_chinese_common_train_v1.1.yml) | CRNN | ResNet34_vd | None | BiLSTM | ctc | | rec_chinese_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | +| rec_chinese_common_train.yml | CRNN | ResNet34_vd | None | BiLSTM | ctc | | rec_icdar15_train.yml | CRNN | Mobilenet_v3 large 0.5 | None | BiLSTM | ctc | | rec_mv3_none_bilstm_ctc.yml | CRNN | Mobilenet_v3 large 0.5 | None | BiLSTM | ctc | | rec_mv3_none_none_ctc.yml | Rosetta | Mobilenet_v3 large 0.5 | None | None | ctc | @@ -172,7 +210,7 @@ PaddleOCR支持训练和评估交替进行, 可以在 `configs/rec/rec_icdar15_t | rec_r34_vd_tps_bilstm_ctc.yml | STARNet | Resnet34_vd | tps | BiLSTM | ctc | | rec_r50fpn_vd_none_srn.yml | SRN | Resnet50_fpn_vd | None | rnn | srn | -训练中文数据,推荐使用`rec_chinese_lite_train.yml`,如您希望尝试其他算法在中文数据集上的效果,请参考下列说明修改配置文件: +训练中文数据,推荐使用[rec_chinese_lite_train_v1.1.yml](../../configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml),如您希望尝试其他算法在中文数据集上的效果,请参考下列说明修改配置文件: 以 `rec_mv3_none_none_ctc.yml` 为例: ``` @@ -208,20 +246,54 @@ Optimizer: ``` **注意,预测/评估时的配置文件请务必与训练一致。** + - 小语种 PaddleOCR也提供了多语言的, `configs/rec/multi_languages` 路径下的提供了多语言的配置文件,目前PaddleOCR支持的多语言算法有: -| 配置文件 | 算法名称 | backbone | trans | seq | pred | language | -| :--------: | :-------: | :-------: | :-------: | :-----: | :-----: | :-----: | -| rec_en_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 英语 | -| rec_french_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 法语 | -| rec_ger_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 德语 | -| rec_japan_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 日语 | -| rec_korean_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 韩语 | +| 配置文件 | 算法名称 | backbone | trans | seq | pred | language | +| :--------: | :-------: | :-------: | :-------: | :-----: | :-----: | :-----: | +| rec_en_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 英语 | +| rec_french_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 法语 | +| rec_ger_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 德语 | +| rec_japan_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 日语 | +| rec_korean_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 韩语 | + + +多语言模型训练方式与中文模型一致,训练数据集均为100w的合成数据,少量的字体可以在 [百度网盘](https://pan.baidu.com/s/1bS_u207Rm7YbY33wOECKDA) 上下载,提取码:frgi。 -多语言模型训练方式与中文模型一致,训练数据集均为100w的合成数据,少量的字体和测试数据可以在[百度网盘]()上下载。 +如您希望在现有模型效果的基础上调优,请参考下列说明修改配置文件: +以 `rec_french_lite_train` 为例: +``` +Global: + ... + # 添加自定义字典,如修改字典请将路径指向新字典 + character_dict_path: ./ppocr/utils/dict/french_dict.txt + # 训练时添加数据增强 + distort: true + # 识别空格 + use_space_char: true + ... + # 修改reader类型 + reader_yml: ./configs/rec/multi_languages/rec_french_reader.yml + ... +... +``` + +同时需要修改数据读取文件 `rec_french_reader.yml`: + +``` +TrainReader: + ... + # 修改训练数据存放的目录名 + img_set_dir: ./train_data + # 修改 label 文件名称 + label_file_path: ./train_data/french_train.txt + +... +``` + ### 评估 评估数据集可以通过 `configs/rec/rec_icdar15_reader.yml` 修改EvalReader中的 `label_file_path` 设置。 @@ -233,8 +305,10 @@ export CUDA_VISIBLE_DEVICES=0 python3 tools/eval.py -c configs/rec/rec_icdar15_train.yml -o Global.checkpoints={path/to/weights}/best_accuracy ``` + ### 预测 + * 训练引擎的预测 使用 PaddleOCR 训练好的模型,可以通过以下脚本进行快速预测。 @@ -258,12 +332,12 @@ infer_img: doc/imgs_words/en/word_1.png word : joint ``` -预测使用的配置文件必须与训练一致,如您通过 `python3 tools/train.py -c configs/rec/rec_chinese_lite_train.yml` 完成了中文模型的训练, +预测使用的配置文件必须与训练一致,如您通过 `python3 tools/train.py -c configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml` 完成了中文模型的训练, 您可以使用如下命令进行中文模型预测。 ``` # 预测中文结果 -python3 tools/infer_rec.py -c configs/rec/rec_chinese_lite_train.yml -o Global.checkpoints={path/to/weights}/best_accuracy Global.infer_img=doc/imgs_words/ch/word_1.jpg +python3 tools/infer_rec.py -c configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml -o Global.checkpoints={path/to/weights}/best_accuracy Global.infer_img=doc/imgs_words/ch/word_1.jpg ``` 预测图片: diff --git a/doc/doc_ch/update.md b/doc/doc_ch/update.md index 017cd9473849fa8a6fbdef434e6876cc835717e9..81a5e68b99f40809d5de4e13c349c974c1dfb28c 100644 --- a/doc/doc_ch/update.md +++ b/doc/doc_ch/update.md @@ -1,7 +1,9 @@ # 更新 -- 2020.9.19 更新超轻量压缩ppocr_mobile_slim系列模型,整体模型3.5M(详见[PP-OCR Pipline](#PP-OCR)),适合在移动端部署使用。[模型下载](#模型下载) -- 2020.9.17 更新超轻量ppocr_mobile系列和通用ppocr_server系列中英文ocr模型,媲美商业效果。[模型下载](#模型下载) -- 2020.8.26 更新OCR相关的84个常见问题及解答,具体参考[FAQ](./doc/doc_ch/FAQ.md) +- 2020.9.22 更新PP-OCR技术文章,https://arxiv.org/abs/2009.09941 +- 2020.9.19 更新超轻量压缩ppocr_mobile_slim系列模型,整体模型3.5M(详见[PP-OCR Pipline](../../README_ch.md#PP-OCR)),适合在移动端部署使用。[模型下载](../../README_ch.md#模型下载) +- 2020.9.17 更新超轻量ppocr_mobile系列和通用ppocr_server系列中英文ocr模型,媲美商业效果。[模型下载](../../README_ch.md#模型下载) +- 2020.9.17 更新[英文识别模型](./models_list.md#english-recognition-model)和[多语种识别模型](./models_list.md#english-recognition-model),已支持`德语、法语、日语、韩语`,更多语种识别模型将持续更新。 +- 2020.8.26 更新OCR相关的84个常见问题及解答,具体参考[FAQ](./FAQ.md) - 2020.8.24 支持通过whl包安装使用PaddleOCR,具体参考[Paddleocr Package使用说明](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_ch/whl.md) - 2020.8.21 更新8月18日B站直播课回放和PPT,课节2,易学易用的OCR工具大礼包,[获取地址](https://aistudio.baidu.com/aistudio/education/group/info/1519) - 2020.8.16 开源文本检测算法[SAST](https://arxiv.org/abs/1908.05498)和文本识别算法[SRN](https://arxiv.org/abs/2003.12294) @@ -10,8 +12,8 @@ - 2020.7.15 完善预测部署,添加基于C++预测引擎推理、服务化部署和端侧部署方案,以及超轻量级中文OCR模型预测耗时Benchmark - 2020.7.15 整理OCR相关数据集、常用数据标注以及合成工具 - 2020.7.9 添加支持空格的识别模型,识别效果,预测及训练方式请参考快速开始和文本识别训练相关文档 -- 2020.7.9 添加数据增强、学习率衰减策略,具体参考[配置文件](./doc/doc_ch/config.md) -- 2020.6.8 添加[数据集](./doc/doc_ch/datasets.md),并保持持续更新 +- 2020.7.9 添加数据增强、学习率衰减策略,具体参考[配置文件](./config.md) +- 2020.6.8 添加[数据集](./datasets.md),并保持持续更新 - 2020.6.5 支持 `attetnion` 模型导出 `inference_model` - 2020.6.5 支持单独预测识别时,输出结果得分 - 2020.5.30 提供超轻量级中文OCR在线体验 diff --git a/doc/doc_ch/visualization.md b/doc/doc_ch/visualization.md index fca075914feb6afd159c5ea6355d3c7bb6842233..dc7b0b9cdcf8ac1abea8163b40ef99bfbf9d7d94 100644 --- a/doc/doc_ch/visualization.md +++ b/doc/doc_ch/visualization.md @@ -1,41 +1,40 @@ # 效果展示 -- PP-OCR 1.1系列模型效果 - - [通用ppocr_server_1.1效果展示](#通用ppocr_server_1.1效果展示) - - [通用ppocr_mobile_1.1效果展示(待补充)]() -- PP-OCR 1.0系列模型效果 - - [超轻量ppocr_mobile_1.0效果展示](#超轻量ppocr_mobile_1.0效果展示) - - [通用ppocr_server_1.0效果展示](#通用ppocr_server_1.0效果展示) ## 通用ppocr_server_1.1效果展示
+ + +
+ + + +## 英文识别模型效果展示 +
+ +
+ + + +## 多语言识别模型效果展示 +
- ## 超轻量ppocr_mobile_1.0效果展示
-
- -
-
- -
-
- -
@@ -45,12 +44,6 @@
-
- -
-
- -
diff --git a/doc/doc_ch/whl.md b/doc/doc_ch/whl.md index 46796ce64a60f12db9bbfbdd7b16ff77238c1831..1b04a9a8a967f39516db0c0f1be3e3842a87278b 100644 --- a/doc/doc_ch/whl.md +++ b/doc/doc_ch/whl.md @@ -11,8 +11,8 @@ pip install paddleocr 本地构建并安装 ```bash -python setup.py bdist_wheel -pip install dist/paddleocr-x.x.x-py3-none-any.whl # x.x.x是paddleocr的版本号 +python3 setup.py bdist_wheel +pip3 install dist/paddleocr-x.x.x-py3-none-any.whl # x.x.x是paddleocr的版本号 ``` ### 1. 代码使用 @@ -20,7 +20,7 @@ pip install dist/paddleocr-x.x.x-py3-none-any.whl # x.x.x是paddleocr的版本 ```python from paddleocr import PaddleOCR, draw_ocr # Paddleocr目前支持中英文、英文、法语、德语、韩语、日语,可以通过修改lang参数进行切换 -# 参数依次为`zh`, `en`, `french`, `german`, `korean`, `japan`。 +# 参数依次为`ch`, `en`, `french`, `german`, `korean`, `japan`。 ocr = PaddleOCR(use_angle_cls=True, lang="ch") # need to run only once to download and load model into memory img_path = 'PaddleOCR/doc/imgs/11.jpg' result = ocr.ocr(img_path, cls=True) @@ -280,7 +280,7 @@ paddleocr --image_dir PaddleOCR/doc/imgs/11.jpg --det_model_dir {your_det_model_ | rec_algorithm | 使用的识别算法类型 | CRNN | | rec_model_dir | 识别模型所在文件夹。传参方式有两种,1. None: 自动下载内置模型到 `~/.paddleocr/rec`;2.自己转换好的inference模型路径,模型路径下必须包含model和params文件 | None | | rec_image_shape | 识别算法的输入图片尺寸 | "3,32,320" | -| rec_char_type | 识别算法的字符类型,中文(ch)或英文(en) | ch | +| rec_char_type | 识别算法的字符类型,中英文(ch)、英文(en)、法语(french)、德语(german)、韩语(korean)、日语(japan) | ch | | rec_batch_num | 进行识别时,同时前向的图片数 | 30 | | max_text_length | 识别算法能识别的最大文字长度 | 25 | | rec_char_dict_path | 识别模型字典路径,当rec_model_dir使用方式2传参时需要修改为自己的字典路径 | ./ppocr/utils/ppocr_keys_v1.txt | diff --git a/doc/doc_en/algorithm_overview_en.md b/doc/doc_en/algorithm_overview_en.md index 3b0f77841aedf7e2c3e4aad1d8856844ee8d0172..2e21fd621971e062384a9323e79a8cf4498d7495 100644 --- a/doc/doc_en/algorithm_overview_en.md +++ b/doc/doc_en/algorithm_overview_en.md @@ -1,9 +1,13 @@ + ## Algorithm introduction -[TOC] +This tutorial lists the text detection algorithms and text recognition algorithms supported by PaddleOCR, as well as the models and metrics of each algorithm on **English public datasets**. It is mainly used for algorithm introduction and algorithm performance comparison. For more models on other datasets including Chinese, please refer to [PP-OCR v1.1 models list](./models_list_en.md). - +- [1. Text Detection Algorithm](#TEXTDETECTIONALGORITHM) +- [2. Text Recognition Algorithm](#TEXTRECOGNITIONALGORITHM) + + ### 1. Text Detection Algorithm PaddleOCR open source text detection algorithms list: @@ -29,14 +33,6 @@ On Total-Text dataset, the text detection result is as follows: **Note:** Additional data, like icdar2013, icdar2017, COCO-Text, ArT, was added to the model training of SAST. Download English public dataset in organized format used by PaddleOCR from [Baidu Drive](https://pan.baidu.com/s/12cPnZcVuV1zn5DOd4mqjVw) (download code: 2bpi). -For use of [LSVT](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_en/datasets_en.md#1-icdar2019-lsvt) street view dataset with a total of 3w training data,the related configuration and pre-trained models for text detection task are as follows: -|Model|Backbone|Configuration file|Pre-trained model| -|-|-|-|-| -|ultra-lightweight OCR model|MobileNetV3|det_mv3_db.yml|[Download link](https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db.tar)| -|General OCR model|ResNet50_vd|det_r50_vd_db.yml|[Download link](https://paddleocr.bj.bcebos.com/ch_models/ch_det_r50_vd_db.tar)| - -* Note: For the training and evaluation of the above DB model, post-processing parameters box_thresh=0.6 and unclip_ratio=1.5 need to be set. If using different datasets and different models for training, these two parameters can be adjusted for better result. - For the training guide and use of PaddleOCR text detection algorithms, please refer to the document [Text detection model training/evaluation/prediction](./doc/doc_en/detection_en.md) @@ -67,11 +63,4 @@ Refer to [DTRB](https://arxiv.org/abs/1904.01906), the training and evaluation r The average accuracy of the two-stage training in the original paper is 89.74%, and that of one stage training in paddleocr is 88.33%. Both pre-trained weights can be downloaded [here](https://paddleocr.bj.bcebos.com/SRN/rec_r50fpn_vd_none_srn.tar). -We use [LSVT](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_en/datasets_en.md#1-icdar2019-lsvt) dataset and cropout 30w training data from original photos by using position groundtruth and make some calibration needed. In addition, based on the LSVT corpus, 500w synthetic data is generated to train the model. The related configuration and pre-trained models are as follows: - -|Model|Backbone|Configuration file|Pre-trained model| -|-|-|-|-| -|ultra-lightweight OCR model|MobileNetV3|rec_chinese_lite_train.yml|[Download link](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn.tar)|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_enhance_infer.tar) & [pre-trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_enhance.tar)| -|General OCR model|Resnet34_vd|rec_chinese_common_train.yml|[Download link](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn.tar)|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_enhance_infer.tar) & [pre-trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_enhance.tar)| - Please refer to the document for training guide and use of PaddleOCR text recognition algorithms [Text recognition model training/evaluation/prediction](./doc/doc_en/recognition_en.md) diff --git a/doc/doc_en/angle_class_en.md b/doc/doc_en/angle_class_en.md index c7fff3a1833570cda7687b87efb7c3af2ec49120..c8c99c10a52fbc55caa6f796a0843e8ab9028949 100644 --- a/doc/doc_en/angle_class_en.md +++ b/doc/doc_en/angle_class_en.md @@ -110,7 +110,7 @@ The default prediction picture is stored in `infer_img`, and the weight is speci ``` # Predict English results -python3 tools/infer_rec.py -c configs/cls/cls_mv3.yml -o Global.checkpoints={path/to/weights}/best_accuracy TestReader.infer_img=doc/imgs_words/en/word_1.jpg +python3 tools/infer_cls.py -c configs/cls/cls_mv3.yml -o Global.checkpoints={path/to/weights}/best_accuracy Global.infer_img=doc/imgs_words/en/word_1.png ``` Input image: diff --git a/doc/doc_en/config_en.md b/doc/doc_en/config_en.md index b54def895f0758df7cdbd089253d6acd712d2b8e..722da6620fd03912c48a47679e7c13a23f15752e 100644 --- a/doc/doc_en/config_en.md +++ b/doc/doc_en/config_en.md @@ -10,7 +10,7 @@ The following list can be viewed via `--help` ## INTRODUCTION TO GLOBAL PARAMETERS OF CONFIGURATION FILE -Take `rec_chinese_lite_train.yml` as an example +Take `rec_chinese_lite_train_v1.1.yml` as an example | Parameter | Use | Default | Note | @@ -32,6 +32,7 @@ Take `rec_chinese_lite_train.yml` as an example | loss_type | Set loss type | ctc | Supports two types of loss: ctc / attention | | distort | Set use distort | false | Support distort type ,read [img_tools.py](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/ppocr/data/rec/img_tools.py) | | use_space_char | Wether to recognize space | false | Only support in character_type=ch mode | + label_list | Set the angle supported by the direction classifier | ['0','180'] | Only valid in the direction classifier | | reader_yml | Set the reader configuration file | ./configs/rec/rec_icdar15_reader.yml | \ | | pretrain_weights | Load pre-trained model path | ./pretrain_models/CRNN/best_accuracy | \ | | checkpoints | Load saved model path | None | Used to load saved parameters to continue training after interruption | diff --git a/doc/doc_en/detection_en.md b/doc/doc_en/detection_en.md index 401d7a9ad479716a6d6694ca1f432a2c934def88..2d9983be7892b1e93a762b337c0c8bd26d79cc5b 100644 --- a/doc/doc_en/detection_en.md +++ b/doc/doc_en/detection_en.md @@ -27,7 +27,7 @@ The provided annotation file format is as follow, seperated by "\t": " Image file name Image annotation information encoded by json.dumps" ch4_test_images/img_61.jpg [{"transcription": "MASA", "points": [[310, 104], [416, 141], [418, 216], [312, 179]]}, {...}] ``` -The image annotation after **json.dumps()** encoding is a list containing multiple dictionaries. +The image annotation after **json.dumps()** encoding is a list containing multiple dictionaries. The `points` in the dictionary represent the coordinates (x, y) of the four points of the text box, arranged clockwise from the point at the upper left corner. @@ -38,12 +38,14 @@ If you want to train PaddleOCR on other datasets, please build the annotation fi ## TRAINING -First download the pretrained model. The detection model of PaddleOCR currently supports two backbones, namely MobileNetV3 and ResNet50_vd. You can use the model in [PaddleClas](https://github.com/PaddlePaddle/PaddleClas/tree/master/ppcls/modeling/architectures) to replace backbone according to your needs. +First download the pretrained model. The detection model of PaddleOCR currently supports 3 backbones, namely MobileNetV3, ResNet18_vd and ResNet50_vd. You can use the model in [PaddleClas](https://github.com/PaddlePaddle/PaddleClas/tree/master/ppcls/modeling/architectures) to replace backbone according to your needs. ```shell cd PaddleOCR/ # Download the pre-trained model of MobileNetV3 wget -P ./pretrain_models/ https://paddle-imagenet-models-name.bj.bcebos.com/MobileNetV3_large_x0_5_pretrained.tar -# Download the pre-trained model of ResNet50 +# or, download the pre-trained model of ResNet18_vd +wget -P ./pretrain_models/ https://paddle-imagenet-models-name.bj.bcebos.com/ResNet18_vd_pretrained.tar +# or, download the pre-trained model of ResNet50_vd wget -P ./pretrain_models/ https://paddle-imagenet-models-name.bj.bcebos.com/ResNet50_vd_ssld_pretrained.tar # decompressing the pre-training model file, take MobileNetV3 as an example @@ -62,7 +64,7 @@ tar -xf ./pretrain_models/MobileNetV3_large_x0_5_pretrained.tar ./pretrain_model #### START TRAINING *If CPU version installed, please set the parameter `use_gpu` to `false` in the configuration.* ```shell -python3 tools/train.py -c configs/det/det_mv3_db.yml 2>&1 | tee train_det.log +python3 tools/train.py -c configs/det/det_mv3_db_v1.1.yml 2>&1 | tee train_det.log ``` In the above instruction, use `-c` to select the training to use the `configs/det/det_db_mv3.yml` configuration file. @@ -70,7 +72,7 @@ For a detailed explanation of the configuration file, please refer to [config](. You can also use `-o` to change the training parameters without modifying the yml file. For example, adjust the training learning rate to 0.0001 ```shell -python3 tools/train.py -c configs/det/det_mv3_db.yml -o Optimizer.base_lr=0.0001 +python3 tools/train.py -c configs/det/det_mv3_db_v1.1.yml -o Optimizer.base_lr=0.0001 ``` #### load trained model and continue training @@ -78,7 +80,7 @@ If you expect to load trained model and continue the training again, you can spe For example: ```shell -python3 tools/train.py -c configs/det/det_mv3_db.yml -o Global.checkpoints=./your/trained/model +python3 tools/train.py -c configs/det/det_mv3_db_v1.1.yml -o Global.checkpoints=./your/trained/model ``` **Note**: The priority of `Global.checkpoints` is higher than that of `Global.pretrain_weights`, that is, when two parameters are specified at the same time, the model specified by `Global.checkpoints` will be loaded first. If the model path specified by `Global.checkpoints` is wrong, the one specified by `Global.pretrain_weights` will be loaded. @@ -88,18 +90,18 @@ python3 tools/train.py -c configs/det/det_mv3_db.yml -o Global.checkpoints=./you PaddleOCR calculates three indicators for evaluating performance of OCR detection task: Precision, Recall, and Hmean. -Run the following code to calculate the evaluation indicators. The result will be saved in the test result file specified by `save_res_path` in the configuration file `det_db_mv3.yml` +Run the following code to calculate the evaluation indicators. The result will be saved in the test result file specified by `save_res_path` in the configuration file `det_db_mv3_v1.1.yml` When evaluating, set post-processing parameters `box_thresh=0.6`, `unclip_ratio=1.5`. If you use different datasets, different models for training, these two parameters should be adjusted for better result. ```shell -python3 tools/eval.py -c configs/det/det_mv3_db.yml -o Global.checkpoints="{path/to/weights}/best_accuracy" PostProcess.box_thresh=0.6 PostProcess.unclip_ratio=1.5 +python3 tools/eval.py -c configs/det/det_mv3_db_v1.1.yml -o Global.checkpoints="{path/to/weights}/best_accuracy" PostProcess.box_thresh=0.6 PostProcess.unclip_ratio=1.5 ``` The model parameters during training are saved in the `Global.save_model_dir` directory by default. When evaluating indicators, you need to set `Global.checkpoints` to point to the saved parameter file. Such as: ```shell -python3 tools/eval.py -c configs/det/det_mv3_db.yml -o Global.checkpoints="./output/det_db/best_accuracy" PostProcess.box_thresh=0.6 PostProcess.unclip_ratio=1.5 +python3 tools/eval.py -c configs/det/det_mv3_db_v1.1.yml -o Global.checkpoints="./output/det_db/best_accuracy" PostProcess.box_thresh=0.6 PostProcess.unclip_ratio=1.5 ``` * Note: `box_thresh` and `unclip_ratio` are parameters required for DB post-processing, and not need to be set when evaluating the EAST model. @@ -108,16 +110,16 @@ python3 tools/eval.py -c configs/det/det_mv3_db.yml -o Global.checkpoints="./ou Test the detection result on a single image: ```shell -python3 tools/infer_det.py -c configs/det/det_mv3_db.yml -o TestReader.infer_img="./doc/imgs_en/img_10.jpg" Global.checkpoints="./output/det_db/best_accuracy" +python3 tools/infer_det.py -c configs/det/det_mv3_db_v1.1.yml -o Global.infer_img="./doc/imgs_en/img_10.jpg" Global.checkpoints="./output/det_db/best_accuracy" ``` When testing the DB model, adjust the post-processing threshold: ```shell -python3 tools/infer_det.py -c configs/det/det_mv3_db.yml -o TestReader.infer_img="./doc/imgs_en/img_10.jpg" Global.checkpoints="./output/det_db/best_accuracy" PostProcess.box_thresh=0.6 PostProcess.unclip_ratio=1.5 +python3 tools/infer_det.py -c configs/det/det_mv3_db_v1.1.yml -o Global.infer_img="./doc/imgs_en/img_10.jpg" Global.checkpoints="./output/det_db/best_accuracy" PostProcess.box_thresh=0.6 PostProcess.unclip_ratio=1.5 ``` Test the detection result on all images in the folder: ```shell -python3 tools/infer_det.py -c configs/det/det_mv3_db.yml -o TestReader.infer_img="./doc/imgs_en/" Global.checkpoints="./output/det_db/best_accuracy" +python3 tools/infer_det.py -c configs/det/det_mv3_db_v1.1.yml -o Global.infer_img="./doc/imgs_en/" Global.checkpoints="./output/det_db/best_accuracy" ``` diff --git a/doc/doc_en/inference_en.md b/doc/doc_en/inference_en.md index 1cdad899af727f645dd6cb6001229be464f46bef..609b65fa55a743acd72407a34288afc793885d3c 100644 --- a/doc/doc_en/inference_en.md +++ b/doc/doc_en/inference_en.md @@ -5,7 +5,7 @@ The inference model (the model saved by `fluid.io.save_inference_model`) is gene The model saved during the training process is the checkpoints model, which saves the parameters of the model and is mostly used to resume training. -Compared with the checkpoints model, the inference model will additionally save the structural information of the model. It has superior performance in predicting in deployment and accelerating inferencing, is flexible and convenient, and is suitable for integration with actual systems. For more details, please refer to the document [Classification Framework](https://paddleclas.readthedocs.io/zh_CN/latest/extension/paddle_inference.html). +Compared with the checkpoints model, the inference model will additionally save the structural information of the model. It has superior performance in predicting in deployment and accelerating inferencing, is flexible and convenient, and is suitable for integration with actual systems. For more details, please refer to the document [Classification Framework](https://github.com/PaddlePaddle/PaddleClas/blob/master/docs/zh_CN/extension/paddle_inference.md). Next, we first introduce how to convert a trained model into an inference model, and then we will introduce text detection, text recognition, and the concatenation of them based on inference model. @@ -26,7 +26,9 @@ Next, we first introduce how to convert a trained model into an inference model, - [1. LIGHTWEIGHT CHINESE MODEL](#LIGHTWEIGHT_RECOGNITION) - [2. CTC-BASED TEXT RECOGNITION MODEL INFERENCE](#CTC-BASED_RECOGNITION) - [3. ATTENTION-BASED TEXT RECOGNITION MODEL INFERENCE](#ATTENTION-BASED_RECOGNITION) - - [4. TEXT RECOGNITION MODEL INFERENCE USING CUSTOM CHARACTERS DICTIONARY](#USING_CUSTOM_CHARACTERS) + - [4. SRN-BASED TEXT RECOGNITION MODEL INFERENCE](#SRN-BASED_RECOGNITION) + - [5. TEXT RECOGNITION MODEL INFERENCE USING CUSTOM CHARACTERS DICTIONARY](#USING_CUSTOM_CHARACTERS) + - [6. MULTILINGUAL MODEL INFERENCE](MULTILINGUAL_MODEL_INFERENCE) - [ANGLE CLASSIFICATION MODEL INFERENCE](#ANGLE_CLASS_MODEL_INFERENCE) - [1. ANGLE CLASSIFICATION MODEL INFERENCE](#ANGLE_CLASS_MODEL_INFERENCE) @@ -42,8 +44,9 @@ Next, we first introduce how to convert a trained model into an inference model, Download the lightweight Chinese detection model: ``` -wget -P ./ch_lite/ https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db.tar && tar xf ./ch_lite/ch_det_mv3_db.tar -C ./ch_lite/ +wget -P ./ch_lite/ https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar && tar xf ./ch_lite/ch_ppocr_mobile_v1.1_det_train.tar -C ./ch_lite/ ``` + The above model is a DB algorithm trained with MobileNetV3 as the backbone. To convert the trained model into an inference model, just run the following command: ``` # -c Set the training algorithm yml configuration file @@ -51,9 +54,9 @@ The above model is a DB algorithm trained with MobileNetV3 as the backbone. To c # Global.checkpoints parameter Set the training model address to be converted without adding the file suffix .pdmodel, .pdopt or .pdparams. # Global.save_inference_dir Set the address where the converted model will be saved. -python3 tools/export_model.py -c configs/det/det_mv3_db.yml -o Global.checkpoints=./ch_lite/det_mv3_db/best_accuracy \ - Global.save_inference_dir=./inference/det_db/ +python3 tools/export_model.py -c configs/det/det_mv3_db_v1.1.yml -o Global.checkpoints=./ch_lite/ch_ppocr_mobile_v1.1_det_train/best_accuracy Global.save_inference_dir=./inference/det_db/ ``` + When converting to an inference model, the configuration file used is the same as the configuration file used during training. In addition, you also need to set the `Global.checkpoints` and `Global.save_inference_dir` parameters in the configuration file. `Global.checkpoints` points to the model parameter file saved during training, and `Global.save_inference_dir` is the directory where the generated inference model is saved. After the conversion is successful, there are two files in the `save_inference_dir` directory: @@ -68,7 +71,7 @@ inference/det_db/ Download the lightweight Chinese recognition model: ``` -wget -P ./ch_lite/ https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn.tar && tar xf ./ch_lite/ch_rec_mv3_crnn.tar -C ./ch_lite/ +wget -P ./ch_lite/ https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_train.tar && tar xf ch_ppocr_mobile_v1.1_rec_train.tar -C ./ch_lite/ ``` The recognition model is converted to the inference model in the same way as the detection, as follows: @@ -78,8 +81,7 @@ The recognition model is converted to the inference model in the same way as the # Global.checkpoints parameter Set the training model address to be converted without adding the file suffix .pdmodel, .pdopt or .pdparams. # Global.save_inference_dir Set the address where the converted model will be saved. -python3 tools/export_model.py -c configs/rec/rec_chinese_lite_train.yml -o Global.checkpoints=./ch_lite/rec_mv3_crnn/best_accuracy \ - Global.save_inference_dir=./inference/rec_crnn/ +python3 tools/export_model.py -c configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml -o Global.checkpoints=./ch_lite/ch_ppocr_mobile_v1.1_rec_train/best_accuracy \ ``` If you have a model trained on your own dataset with a different dictionary file, please make sure that you modify the `character_dict_path` in the configuration file to your dictionary file path. @@ -96,7 +98,7 @@ After the conversion is successful, there are two files in the directory: Download the angle classification model: ``` -wget -P ./ch_lite/ https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile-v1.1.cls_pre.tar && tar xf ./ch_lite/ch_ppocr_mobile-v1.1.cls_pre.tar -C ./ch_lite/ +wget -P ./ch_lite/ https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar && tar xf ./ch_lite/ch_ppocr_mobile_v1.1_cls_train.tar -C ./ch_lite/ ``` The angle classification model is converted to the inference model in the same way as the detection, as follows: @@ -106,7 +108,7 @@ The angle classification model is converted to the inference model in the same w # Global.checkpoints parameter Set the training model address to be converted without adding the file suffix .pdmodel, .pdopt or .pdparams. # Global.save_inference_dir Set the address where the converted model will be saved. -python3 tools/export_model.py -c configs/cls/cls_mv3.yml -o Global.checkpoints=./ch_lite/cls_model/best_accuracy \ +python3 tools/export_model.py -c configs/cls/cls_mv3.yml -o Global.checkpoints=./ch_lite/ch_ppocr_mobile_v1.1_cls_train/best_accuracy \ Global.save_inference_dir=./inference/cls/ ``` @@ -299,31 +301,45 @@ self.character_str = "0123456789abcdefghijklmnopqrstuvwxyz" dict_character = list(self.character_str) ``` + +### 4. SRN-BASED TEXT RECOGNITION MODEL INFERENCE + +The recognition model based on SRN requires additional setting of the recognition algorithm parameter --rec_algorithm="SRN". +At the same time, it is necessary to ensure that the predicted shape is consistent with the training, such as: --rec_image_shape="1, 64, 256" + +``` +python3 tools/infer/predict_rec.py --image_dir="./doc/imgs_words_en/word_336.png" \ + --rec_model_dir="./inference/srn/" \ + --rec_image_shape="1, 64, 256" \ + --rec_char_type="en" \ + --rec_algorithm="SRN" +``` + + -### 4. TEXT RECOGNITION MODEL INFERENCE USING CUSTOM CHARACTERS DICTIONARY +### 5. TEXT RECOGNITION MODEL INFERENCE USING CUSTOM CHARACTERS DICTIONARY If the chars dictionary is modified during training, you need to specify the new dictionary path by setting the parameter `rec_char_dict_path` when using your inference model to predict. ``` python3 tools/infer/predict_rec.py --image_dir="./doc/imgs_words_en/word_336.png" --rec_model_dir="./your inference model" --rec_image_shape="3, 32, 100" --rec_char_type="en" --rec_char_dict_path="your text dict path" ``` - - -### 5. Multilingual Model Reasoning + +### 6. MULTILINGAUL MODEL INFERENCE If you need to predict other language models, when using inference model prediction, you need to specify the dictionary path used by `--rec_char_dict_path`. At the same time, in order to get the correct visualization results, You need to specify the visual font path through `--vis_font_path`. There are small language fonts provided by default under the `doc/` path, such as Korean recognition: ``` -python3 tools/infer/predict_rec.py --image_dir="./doc/imgs_words/korean/1.jpg" --rec_model_dir="./your inference model" --rec_char_type="korean" --rec_char_dict_path="ppocr/ utils/korean_dict.txt" --vis_font_path="doc/korean.ttf" +python3 tools/infer/predict_rec.py --image_dir="./doc/imgs_words/korean/1.jpg" --rec_model_dir="./your inference model" --rec_char_type="korean" --rec_char_dict_path="ppocr/utils/dict/korean_dict.txt" --vis_font_path="doc/korean.ttf" ``` ![](../imgs_words/korean/1.jpg) After executing the command, the prediction result of the above figure is: ``` text -2020-09-19 16:15:05,076-INFO: index: [205 206 38 39] -2020-09-19 16:15:05,077-INFO: word : 바탕으로 -2020-09-19 16:15:05,077-INFO: score: 0.9171358942985535 +2020-09-19 16:15:05,076-INFO: index: [205 206 38 39] +2020-09-19 16:15:05,077-INFO: word : 바탕으로 +2020-09-19 16:15:05,077-INFO: score: 0.9171358942985535 ``` @@ -357,7 +373,11 @@ Predicts of ./doc/imgs_words/ch/word_4.jpg:['0', 0.9999963] When performing prediction, you need to specify the path of a single image or a folder of images through the parameter `image_dir`, the parameter `det_model_dir` specifies the path to detect the inference model, the parameter `cls_model_dir` specifies the path to angle classification inference model and the parameter `rec_model_dir` specifies the path to identify the inference model. The parameter `use_angle_cls` is used to control whether to enable the angle classification model.The visualized recognition results are saved to the `./inference_results` folder by default. ``` -python3 tools/infer/predict_system.py --image_dir="./doc/imgs/2.jpg" --det_model_dir="./inference/det_db/" --cls_model_dir="./inference/cls/" --rec_model_dir="./inference/rec_crnn/" --use_angle_cls true +# use direction classifier +python3 tools/infer/predict_system.py --image_dir="./doc/imgs/2.jpg" --det_model_dir="./inference/det_db/" --cls_model_dir="./inference/cls/" --rec_model_dir="./inference/rec_crnn/" --use_angle_cls=true + +# not use use direction classifier +python3 tools/infer/predict_system.py --image_dir="./doc/imgs/2.jpg" --det_model_dir="./inference/det_db/" --rec_model_dir="./inference/rec_crnn/" ``` After executing the command, the recognition result image is as follows: diff --git a/doc/doc_en/installation_en.md b/doc/doc_en/installation_en.md index b62d9b298dcb6f1757cb1a522565fb4c19484d6d..12af13c0b33e72f9cfd412e1990ebcddb167c54c 100644 --- a/doc/doc_en/installation_en.md +++ b/doc/doc_en/installation_en.md @@ -3,7 +3,7 @@ After testing, paddleocr can run on glibc 2.23. You can also test other glibc versions or install glic 2.23 for the best compatibility. PaddleOCR working environment: -- PaddlePaddle1.7 +- PaddlePaddle1.8+, Recommend PaddlePaddle 2.0.0.beta - python3.7 - glibc 2.23 @@ -18,7 +18,7 @@ cd /home/Projects # You need to create a docker container for the first run, and do not need to run the current command when you run it again # Create a docker container named ppocr and map the current directory to the /paddle directory of the container -#If using CPU, use docker instead of nvidia-docker to create docker +# If using CPU, use docker instead of nvidia-docker to create docker sudo docker run --name ppocr -v $PWD:/paddle --network=host -it hub.baidubce.com/paddlepaddle/paddle:latest-gpu-cuda9.0-cudnn7-dev /bin/bash ``` If using CUDA9, please run the following command to create a container: @@ -49,18 +49,15 @@ docker images hub.baidubce.com/paddlepaddle/paddle latest-gpu-cuda9.0-cudnn7-dev f56310dcc829 ``` -**2. Install PaddlePaddle Fluid v1.7 (the higher version is not supported yet, the adaptation work is in progress)** +**2. Install PaddlePaddle v2.0** ``` -pip3 install --upgrade pip +python3 -m pip install --upgrade pip -# If you have cuda9 installed on your machine, please run the following command to install -python3 -m pip install paddlepaddle-gpu==1.7.2.post97 -i https://pypi.tuna.tsinghua.edu.cn/simple - -# If you have cuda10 installed on your machine, please run the following command to install -python3 -m pip install paddlepaddle-gpu==1.7.2.post107 -i https://pypi.tuna.tsinghua.edu.cn/simple +# If you have cuda9 or cuda10 installed on your machine, please run the following command to install +python3 -m pip install paddlepaddle-gpu==2.0.0b0 -i https://mirror.baidu.com/pypi/simple # If you only have cpu on your machine, please run the following command to install -python3 -m pip install paddlepaddle==1.7.2 -i https://pypi.tuna.tsinghua.edu.cn/simple +python3 -m pip install paddlepaddle==2.0.0b0 -i https://mirror.baidu.com/pypi/simple ``` For more software version requirements, please refer to the instructions in [Installation Document](https://www.paddlepaddle.org.cn/install/quick) for operation. @@ -80,7 +77,7 @@ git clone https://gitee.com/paddlepaddle/PaddleOCR **4. Install third-party libraries** ``` cd PaddleOCR -pip3 install -r requirments.txt +python3 -m pip install -r requirements.txt ``` If you getting this error `OSError: [WinError 126] The specified module could not be found` when you install shapely on windows. diff --git a/doc/doc_en/models_list_en.md b/doc/doc_en/models_list_en.md index 71878ac32bc116448de6d74888bbce59dbb0bb05..3d3cdc1d6c2e2a52c64f6ed0fd502456271173b6 100644 --- a/doc/doc_en/models_list_en.md +++ b/doc/doc_en/models_list_en.md @@ -18,11 +18,11 @@ The downloadable models provided by PaddleOCR include `inference model`, `traine ### 1. Text Detection Model -|model name|description|model size|download| -|-|-|-|-| -|ch_ppocr_mobile_slim_v1.1_det|Slim pruned lightweight model, supporting Chinese, English, multilingual text detection|1.4M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/det/ch_ppocr_mobile_v1.1_det_prune_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/det/ch_ppocr_mobile_v1.1_det_prune_opt.nb)| -|ch_ppocr_mobile_v1.1_det|Original lightweight model, supporting Chinese, English, multilingual text detection|2.6M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar)| -|ch_ppocr_server_v1.1_det|General model, which is larger than the lightweight model, but achieved better performance|47.2M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_train.tar)| +|model name|description|config|model size|download| +|-|-|-|-|-| +|ch_ppocr_mobile_slim_v1.1_det|Slim pruned lightweight model, supporting Chinese, English, multilingual text detection|[det_mv3_db_v1.1.yml](../../configs/det/det_mv3_db_v1.1.yml)|1.4M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/det/ch_ppocr_mobile_v1.1_det_prune_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_det_prune_opt.nb)| +|ch_ppocr_mobile_v1.1_det|Original lightweight model, supporting Chinese, English, multilingual text detection|[det_mv3_db_v1.1.yml](../../configs/det/det_mv3_db_v1.1.yml)|2.6M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar)| +|ch_ppocr_server_v1.1_det|General model, which is larger than the lightweight model, but achieved better performance|[det_r18_vd_db_v1.1.yml](../../configs/det/det_r18_vd_db_v1.1.yml)|47.2M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_train.tar)| @@ -30,41 +30,41 @@ The downloadable models provided by PaddleOCR include `inference model`, `traine #### Chinese Recognition Model -|model name|description|model size|download| -|-|-|-|-| -|ch_ppocr_mobile_slim_v1.1_rec|Slim pruned and quantized lightweight model, supporting Chinese, English and number recognition|1.6M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/rec/ch_ppocr_mobile_v1.1_rec_quant_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/rec/ch_ppocr_mobile_v1.1_rec_quant_opt.nb)| -|ch_ppocr_mobile_v1.1_rec|Original lightweight model, supporting Chinese, English and number recognition|4.6M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_train.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_pre.tar)| -|ch_ppocr_server_v1.1_rec|General model, supporting Chinese, English and number recognition|105M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_train.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_pre.tar)| +|model name|description|config|model size|download| +|-|-|-|-|-| +|ch_ppocr_mobile_slim_v1.1_rec|Slim pruned and quantized lightweight model, supporting Chinese, English and number recognition|[rec_chinese_lite_train_v1.1.yml](../../configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml)|1.6M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/rec/ch_ppocr_mobile_v1.1_rec_quant_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_rec_quant_opt.nb) | +|ch_ppocr_mobile_v1.1_rec|Original lightweight model, supporting Chinese, English and number recognition|[rec_chinese_lite_train_v1.1.yml](../../configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml)|4.6M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_train.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_pre.tar) | +|ch_ppocr_server_v1.1_rec|General model, supporting Chinese, English and number recognition|[rec_chinese_common_train_v1.1.yml](../../configs/rec/ch_ppocr_v1.1/rec_chinese_common_train_v1.1.yml)|105M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_train.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_pre.tar) | **Note:** The `trained model` is finetuned on the `pre-trained model` with real data and synthsized vertical text data, which achieved better performance in real scene. The `pre-trained model` is directly trained on the full amount of real data and synthsized data, which is more suitable for finetune on your own dataset. #### English Recognition Model -|model name|description|model size|download| -|-|-|-|-| -|en_ppocr_mobile_slim_v1.1_rec|Slim pruned and quantized lightweight model, supporting English and number recognition|0.9M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/en/en_ppocr_mobile_v1.1_rec_quant_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/en/en_ppocr_mobile_v1.1_rec_quant_opt.nb)| -|en_ppocr_mobile_v1.1_rec|Original lightweight model, supporting English and number recognition|2.0M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/en/en_ppocr_mobile_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/en/en_ppocr_mobile_v1.1_rec_train.tar)| +|model name|description|config|model size|download| +|-|-|-|-|-| +|en_ppocr_mobile_slim_v1.1_rec|Slim pruned and quantized lightweight model, supporting English and number recognition|[rec_en_lite_train.yml](../../configs/rec/multi_languages/rec_en_lite_train.yml)|0.9M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/en/en_ppocr_mobile_v1.1_rec_quant_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/en/en_ppocr_mobile_v1.1_rec_quant_opt.nb) | +|en_ppocr_mobile_v1.1_rec|Original lightweight model, supporting English and number recognition|[rec_en_lite_train.yml](../../configs/rec/multi_languages/rec_en_lite_train.yml)|2.0M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/en/en_ppocr_mobile_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/en/en_ppocr_mobile_v1.1_rec_train.tar) | #### Multilingual Recognition Model(Updating...) -|model name|description|model size|download| -|-|-|-|-| -| french_ppocr_mobile_v1.1_rec |Lightweight model for French recognition|2.1M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/fr/french_ppocr_mobile_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/fr/french_ppocr_mobile_v1.1_rec_train.tar)| -| german_ppocr_mobile_v1.1_rec |German model for French recognition|2.1M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/ge/german_ppocr_mobile_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/ge/german_ppocr_mobile_v1.1_rec_train.tar)| -| korean_ppocr_mobile_v1.1_rec |Lightweight model for Korean recognition|3.4M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/kr/korean_ppocr_mobile_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/kr/korean_ppocr_mobile_v1.1_rec_train.tar)| -| japan_ppocr_mobile_v1.1_rec |Lightweight model for Japanese recognition|3.7M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/jp/japan_ppocr_mobile_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/jp/japan_ppocr_mobile_v1.1_rec_train.tar)| +|model name|description|config|model size|download| +|-|-|-|-|-| +| french_ppocr_mobile_v1.1_rec |Lightweight model for French recognition|[rec_french_lite_train.yml](../../configs/rec/multi_languages/rec_french_lite_train.yml)|2.1M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/fr/french_ppocr_mobile_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/fr/french_ppocr_mobile_v1.1_rec_train.tar) | +| german_ppocr_mobile_v1.1_rec |German model for French recognition|[rec_ger_lite_train.yml](../../configs/rec/multi_languages/rec_ger_lite_train.yml)|2.1M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/ge/german_ppocr_mobile_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/ge/german_ppocr_mobile_v1.1_rec_train.tar) | +| korean_ppocr_mobile_v1.1_rec |Lightweight model for Korean recognition|[rec_korean_lite_train.yml](../../configs/rec/multi_languages/rec_korean_lite_train.yml)|3.4M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/kr/korean_ppocr_mobile_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/kr/korean_ppocr_mobile_v1.1_rec_train.tar) | +| japan_ppocr_mobile_v1.1_rec |Lightweight model for Japanese recognition|[rec_japan_lite_train.yml](../../configs/rec/multi_languages/rec_japan_lite_train.yml)|3.7M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/jp/japan_ppocr_mobile_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/jp/japan_ppocr_mobile_v1.1_rec_train.tar) | ### 3. Text Angle Classification Model -|model name|description|model size|download| -|-|-|-|-| -|ch_ppocr_mobile_v1.1_cls_quant|Slim quantized model|0.5M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_quant_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_quant_train.tar) / [slim model]()| -|ch_ppocr_mobile_v1.1_cls|Original model|850kb|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar)| +|model name|description|config|model size|download| +|-|-|-|-|-| +|ch_ppocr_mobile_v1.1_cls_quant|Slim quantized model|[cls_mv3.yml](../../configs/cls/cls_mv3.yml)|0.5M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_quant_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_quant_train.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_cls_quant_opt.nb) | +|ch_ppocr_mobile_v1.1_cls|Original model|[cls_mv3.yml](../../configs/cls/cls_mv3.yml)|850kb|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar) | ## OCR model list(V1.0, updated on 7.16) |model name|description|detection model|recognition model|recognition model supporting space recognition| |-|-|-|-|-| -|chinese_db_crnn_mobile|8.6M lightweight OCR model|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db.tar)|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn.tar)|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_enhance_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_enhance.tar) -|chinese_db_crnn_server|General OCR model|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_det_r50_vd_db_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_det_r50_vd_db.tar)|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn.tar)|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_enhance_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_enhance.tar) +|chinese_db_crnn_mobile|8.6M lightweight OCR model|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db.tar) | [inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn.tar) |[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_enhance_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_enhance.tar) +|chinese_db_crnn_server|General OCR model|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_det_r50_vd_db_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_det_r50_vd_db.tar) | [inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn.tar) |[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_enhance_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_enhance.tar) diff --git a/doc/doc_en/quickstart_en.md b/doc/doc_en/quickstart_en.md index d1fa1683fcfea14be477c910fb2a8dc7709c5d36..bc5700e77bbb03e79216e9af4594e3c862b13a4e 100644 --- a/doc/doc_en/quickstart_en.md +++ b/doc/doc_en/quickstart_en.md @@ -5,16 +5,19 @@ Please refer to [quick installation](./installation_en.md) to configure the PaddleOCR operating environment. -*Note: Support the use of PaddleOCR through whl package installation,pelease refer [PaddleOCR Package](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_en/whl_en.md)。* +* Note: Support the use of PaddleOCR through whl package installation,pelease refer [PaddleOCR Package](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_en/whl_en.md). ## 2.inference models -| Name | Introduction | Detection model | Recognition model | Recognition model with space support | -|-|-|-|-|-| -|chinese_db_crnn_mobile| Ultra-lightweight Chinese OCR model |[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db_infer.tar) / [pretrained model](https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db.tar)|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar) / [pretrained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn.tar)|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_enhance_infer.tar) / [pretrained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_enhance.tar) -|chinese_db_crnn_server| Universal Chinese OCR model |[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_det_r50_vd_db_infer.tar) / [pretrained model](https://paddleocr.bj.bcebos.com/ch_models/ch_det_r50_vd_db.tar)|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_infer.tar) / [pretrained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn.tar)|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_enhance_infer.tar) / [pretrained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_enhance.tar) +The detection and recognition models on the mobile and server sides are as follows. For more models (including multiple languages), please refer to [PP-OCR v1.1 series model list](../doc_ch/models_list.md) -* If wget is not installed in the windows environment, you can copy the link to the browser to download when downloading the model, and uncompress it and place it in the corresponding directory. + +| Model introduction | Model name | Recommended scene | Detection model | Direction Classifier | Recognition model | +| ------------ | --------------- | ----------------|---- | ---------- | -------- | +| Ultra-lightweight Chinese OCR model(8.1M) | ch_ppocr_mobile_v1.1_xx |Mobile-side/Server-side|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [pretrained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar)|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [pretrained model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar) |[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar) / [pretrained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_pre.tar) | +| Universal Chinese OCR model(155.1M) |ch_ppocr_server_v1.1_xx|Server-side |[inference model](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_infer.tar) / [pretrained model](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_train.tar) |[inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [pretrained model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar) |[inference model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_infer.tar) / [pretrained model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_pre.tar) | + +* If `wget` is not installed in the windows environment, you can copy the link to the browser to download when downloading the model, then uncompress it and place it in the corresponding directory. Copy the download address of the `inference model` for detection and recognition in the table above, and uncompress them. @@ -24,6 +27,8 @@ mkdir inference && cd inference wget {url/of/detection/inference_model} && tar xf {name/of/detection/inference_model/package} # Download the recognition model and unzip wget {url/of/recognition/inference_model} && tar xf {name/of/recognition/inference_model/package} +# Download the direction classifier model and unzip +wget {url/of/classification/inference_model} && tar xf {name/of/classification/inference_model/package} cd .. ``` @@ -32,9 +37,11 @@ Take the ultra-lightweight model as an example: ``` mkdir inference && cd inference # Download the detection model of the ultra-lightweight Chinese OCR model and uncompress it -wget https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db_infer.tar && tar xf ch_det_mv3_db_infer.tar +wget https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar && tar xf ch_ppocr_mobile_v1.1_det_infer.tar # Download the recognition model of the ultra-lightweight Chinese OCR model and uncompress it -wget https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar && tar xf ch_rec_mv3_crnn_infer.tar +wget https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar && tar xf ch_ppocr_mobile_v1.1_rec_infer.tar +# Download the direction classifier model of the ultra-lightweight Chinese OCR model and uncompress it +wget https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar && tar xf ch_ppocr_mobile_v1.1_cls_infer.tar cd .. ``` @@ -42,10 +49,13 @@ After decompression, the file structure should be as follows: ``` |-inference - |-ch_rec_mv3_crnn + |-ch_ppocr_mobile_v1.1_det_infer + |- model + |- params + |-ch_ppocr_mobile_v1.1_rec_infer |- model |- params - |-ch_det_mv3_db + |-ch_ppocr_mobile_v1.1_cls_infer |- model |- params ... @@ -53,20 +63,20 @@ After decompression, the file structure should be as follows: ## 3. Single image or image set prediction -* The following code implements text detection and recognition process. When performing prediction, you need to specify the path of a single image or image set through the parameter `image_dir`, the parameter `det_model_dir` specifies the path to detect the inference model, and the parameter `rec_model_dir` specifies the path to identify the inference model. The visual results are saved to the `./inference_results` folder by default. +* The following code implements text detection and recognition process. When performing prediction, you need to specify the path of a single image or image set through the parameter `image_dir`, the parameter `det_model_dir` specifies the path to detect the inference model, the parameter `rec_model_dir` specifies the path to identify the inference model, the parameter `use_angle_cls` specifies whether to use the direction classifier, the parameter `cls_model_dir` specifies the path to identify the direction classifier model, the parameter `use_space_char` specifies whether to predict the space char. The visual results are saved to the `./inference_results` folder by default. ```bash # Predict a single image specified by image_dir -python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_det_mv3_db/" --rec_model_dir="./inference/ch_rec_mv3_crnn/" +python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_ppocr_mobile_v1.1_det_infer/" --rec_model_dir="./inference/ch_ppocr_mobile_v1.1_rec_infer/" --cls_model_dir="./inference/ch_ppocr_mobile_v1.1_cls_infer/" --use_angle_cls=True --use_space_char=True # Predict imageset specified by image_dir -python3 tools/infer/predict_system.py --image_dir="./doc/imgs/" --det_model_dir="./inference/ch_det_mv3_db/" --rec_model_dir="./inference/ch_rec_mv3_crnn/" +python3 tools/infer/predict_system.py --image_dir="./doc/imgs/" --det_model_dir="./inference/ch_ppocr_mobile_v1.1_det_infer/" --rec_model_dir="./inference/ch_ppocr_mobile_v1.1_rec_infer/" --cls_model_dir="./inference/ch_ppocr_mobile_v1.1_cls_infer/" --use_angle_cls=True --use_space_char=True # If you want to use the CPU for prediction, you need to set the use_gpu parameter to False -python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_det_mv3_db/" --rec_model_dir="./inference/ch_rec_mv3_crnn/" --use_gpu=False +python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_ppocr_mobile_v1.1_det_infer/" --rec_model_dir="./inference/ch_ppocr_mobile_v1.1_rec_infer/" --cls_model_dir="./inference/ch_ppocr_mobile_v1.1_cls_infer/" --use_angle_cls=True --use_space_char=True --use_gpu=False ``` - Universal Chinese OCR model @@ -75,25 +85,18 @@ Please follow the above steps to download the corresponding models and update th ``` # Predict a single image specified by image_dir -python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_det_r50_vd_db/" --rec_model_dir="./inference/ch_rec_r34_vd_crnn/" +python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_ppocr_server_v1.1_det_infer/" --rec_model_dir="./inference/ch_ppocr_server_v1.1_rec_infer/" --cls_model_dir="./inference/ch_ppocr_mobile_v1.1_cls_infer/" --use_angle_cls=True --use_space_char=True ``` -- Universal Chinese OCR model with the support of space - -Please follow the above steps to download the corresponding models and update the relevant parameters, The example is as follows. +* Note + - If you want to use the recognition model which does not support space char recognition, please update the source code to the latest version and add parameters `--use_space_char=False`. + - If you do not want to use direction classifier, please update the source code to the latest version and add parameters `--use_angle_cls=False`. -* Note: Please update the source code to the latest version and add parameters `--use_space_char=True` - -``` -# Predict a single image specified by image_dir -python3 tools/infer/predict_system.py --image_dir="./doc/imgs_en/img_12.jpg" --det_model_dir="./inference/ch_det_r50_vd_db/" --rec_model_dir="./inference/ch_rec_r34_vd_crnn_enhance/" --use_space_char=True -``` - For more text detection and recognition tandem reasoning, please refer to the document tutorial : [Inference with Python inference engine](./inference_en.md)。 In addition, the tutorial also provides other deployment methods for the Chinese OCR model: - [Server-side C++ inference](../../deploy/cpp_infer/readme_en.md) -- [Service deployment](./serving_en.md) +- [Service deployment](../../deploy/hubserving/readme_en.md) - [End-to-end deployment](../../deploy/lite/readme_en.md) diff --git a/doc/doc_en/recognition_en.md b/doc/doc_en/recognition_en.md index c9d69b3dae0587177c5cef2e075cc8beff85710b..f162b377e0ed226490279735b20f5a78f74ba8fb 100644 --- a/doc/doc_en/recognition_en.md +++ b/doc/doc_en/recognition_en.md @@ -1,5 +1,22 @@ ## TEXT RECOGNITION +- [DATA PREPARATION](#DATA_PREPARATION) + - [Dataset Download](#Dataset_download) + - [Costom Dataset](#Costom_Dataset) + - [Dictionary](#Dictionary) + - [Add Space Category](#Add_space_category) + +- [TRAINING](#TRAINING) + - [Data Augmentation](#Data_Augmentation) + - [Training](#Training) + - [Multi-language](#Multi_language) + +- [EVALUATION](#EVALUATION) + +- [PREDICTION](#PREDICTION) + - [Training engine prediction](#Training_engine_prediction) + + ### DATA PREPARATION @@ -13,13 +30,14 @@ The default storage path for training data is `PaddleOCR/train_data`, if you alr ln -sf /train_data/dataset ``` - + * Dataset download If you do not have a dataset locally, you can download it on the official website [icdar2015](http://rrc.cvc.uab.es/?ch=4&com=downloads). Also refer to [DTRB](https://github.com/clovaai/deep-text-recognition-benchmark#download-lmdb-dataset-for-traininig-and-evaluation-from-here),download the lmdb format dataset required for benchmark If you want to reproduce the paper indicators of SRN, you need to download offline [augmented data](https://pan.baidu.com/s/1-HSZ-ZVdqBF2HaBZ5pRAKA), extraction code: y3ry. The augmented data is obtained by rotation and perturbation of mjsynth and synthtext. Please unzip the data to {your_path}/PaddleOCR/train_data/data_lmdb_Release/training/path. + * Use your own dataset: If you want to use your own data for training, please refer to the following to organize your data. @@ -72,7 +90,7 @@ Similar to the training set, the test set also needs to be provided a folder con |- word_003.jpg | ... ``` - + - Dictionary Finally, a dictionary ({word_dict_name}.txt) needs to be provided so that when the model is trained, all the characters that appear can be mapped to the dictionary index. @@ -92,9 +110,21 @@ In `word_dict.txt`, there is a single word in each line, which maps characters a `ppocr/utils/ppocr_keys_v1.txt` is a Chinese dictionary with 6623 characters. -`ppocr/utils/ic15_dict.txt` is an English dictionary with 36 characters. +`ppocr/utils/ic15_dict.txt` is an English dictionary with 63 characters + +`ppocr/utils/dict/french_dict.txt` is a French dictionary with 118 characters + +`ppocr/utils/dict/japan_dict.txt` is a Japan dictionary with 4399 characters + +`ppocr/utils/dict/korean_dict.txt` is a Korean dictionary with 3636 characters + +`ppocr/utils/dict/german_dict.txt` is a German dictionary with 131 characters + +You can use it on demand. + +The current multi-language model is still in the demo stage and will continue to optimize the model and add languages. **You are very welcome to provide us with dictionaries and fonts in other languages**, +If you like, you can submit the dictionary file to [dict](../../ppocr/utils/dict) or corpus file to [corpus](../../ppocr/utils/corpus) and we will thank you in the Repo. -You can use them if needed. To customize the dict file, please modify the `character_dict_path` field in `configs/rec/rec_icdar15_train.yml` and set `character_type` to `ch`. @@ -102,12 +132,14 @@ To customize the dict file, please modify the `character_dict_path` field in `co If you need to customize dic file, please add character_dict_path field in configs/rec/rec_icdar15_train.yml to point to your dictionary path. And set character_type to ch. + - Add space category If you want to support the recognition of the `space` category, please set the `use_space_char` field in the yml file to `true`. **Note: use_space_char only takes effect when character_type=ch** + ### TRAINING PaddleOCR provides training scripts, evaluation scripts, and prediction scripts. In this section, the CRNN recognition model will be used as an example: @@ -126,14 +158,12 @@ tar -xf rec_mv3_none_bilstm_ctc.tar && rm -rf rec_mv3_none_bilstm_ctc.tar Start training: ``` -# Set PYTHONPATH path -export PYTHONPATH=$PYTHONPATH:. # GPU training Support single card and multi-card training, specify the card number through CUDA_VISIBLE_DEVICES export CUDA_VISIBLE_DEVICES=0,1,2,3 # Training icdar15 English data and saving the log as train_rec.log python3 tools/train.py -c configs/rec/rec_icdar15_train.yml 2>&1 | tee train_rec.log ``` - + - Data Augmentation PaddleOCR provides a variety of data augmentation methods. If you want to add disturbance during training, please set `distort: true` in the configuration file. @@ -142,7 +172,7 @@ The default perturbation methods are: cvtColor, blur, jitter, Gasuss noise, rand Each disturbance method is selected with a 50% probability during the training process. For specific code implementation, please refer to: [img_tools.py](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/ppocr/data/rec/img_tools.py) - + - Training PaddleOCR supports alternating training and evaluation. You can modify `eval_batch_step` in `configs/rec/rec_icdar15_train.yml` to set the evaluation frequency. By default, it is evaluated every 500 iter and the best acc model is saved under `output/rec_CRNN/best_accuracy` during the evaluation process. @@ -154,7 +184,10 @@ If the evaluation set is large, the test will be time-consuming. It is recommend | Configuration file | Algorithm | backbone | trans | seq | pred | | :--------: | :-------: | :-------: | :-------: | :-----: | :-----: | +| [rec_chinese_lite_train_v1.1.yml](../../configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml) | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | +| [rec_chinese_common_train_v1.1.yml](../../configs/rec/ch_ppocr_v1.1/rec_chinese_common_train_v1.1.yml) | CRNN | ResNet34_vd | None | BiLSTM | ctc | | rec_chinese_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | +| rec_chinese_common_train.yml | CRNN | ResNet34_vd | None | BiLSTM | ctc | | rec_icdar15_train.yml | CRNN | Mobilenet_v3 large 0.5 | None | BiLSTM | ctc | | rec_mv3_none_bilstm_ctc.yml | CRNN | Mobilenet_v3 large 0.5 | None | BiLSTM | ctc | | rec_mv3_none_none_ctc.yml | Rosetta | Mobilenet_v3 large 0.5 | None | None | ctc | @@ -165,7 +198,8 @@ If the evaluation set is large, the test will be time-consuming. It is recommend | rec_r34_vd_tps_bilstm_attn.yml | RARE | Resnet34_vd | tps | BiLSTM | attention | | rec_r34_vd_tps_bilstm_ctc.yml | STARNet | Resnet34_vd | tps | BiLSTM | ctc | -For training Chinese data, it is recommended to use `rec_chinese_lite_train.yml`. If you want to try the result of other algorithms on the Chinese data set, please refer to the following instructions to modify the configuration file: +For training Chinese data, it is recommended to use +训练中文数据,推荐使用[rec_chinese_lite_train_v1.1.yml](../../configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml). If you want to try the result of other algorithms on the Chinese data set, please refer to the following instructions to modify the configuration file: co Take `rec_mv3_none_none_ctc.yml` as an example: ``` @@ -201,7 +235,8 @@ Optimizer: ``` **Note that the configuration file for prediction/evaluation must be consistent with the training.** --Minor language + +- Multi-language PaddleOCR also provides multi-language. The configuration file in `configs/rec/multi_languages` provides multi-language configuration files. Currently, the multi-language algorithms supported by PaddleOCR are: @@ -213,8 +248,30 @@ PaddleOCR also provides multi-language. The configuration file in `configs/rec/m | rec_japan_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Japanese | | rec_korean_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Korean | -The multi-language model training method is the same as the Chinese model. The training data set is 100w synthetic data. A small amount of fonts and test data can be downloaded on [Baidu Netdisk](). +The multi-language model training method is the same as the Chinese model. The training data set is 100w synthetic data. A small amount of fonts and test data can be downloaded on [Baidu Netdisk](https://pan.baidu.com/s/1bS_u207Rm7YbY33wOECKDA),Extraction code:frgi. + +If you want to finetune on the basis of the existing model effect, please refer to the following instructions to modify the configuration file: + +Take `rec_french_lite_train` as an example: + +``` +Global: + ... + # Add a custom dictionary, if you modify the dictionary + # please point the path to the new dictionary + character_dict_path: ./ppocr/utils/dict/french_dict.txt + # Add data augmentation during training + distort: true + # Identify spaces + use_space_char: true + ... + # Modify reader type + reader_yml: ./configs/rec/multi_languages/rec_french_reader.yml + ... +... +``` + ### EVALUATION The evaluation data set can be modified via `configs/rec/rec_icdar15_reader.yml` setting of `label_file_path` in EvalReader. @@ -222,11 +279,13 @@ The evaluation data set can be modified via `configs/rec/rec_icdar15_reader.yml` ``` export CUDA_VISIBLE_DEVICES=0 # GPU evaluation, Global.checkpoints is the weight to be tested -python3 tools/eval.py -c configs/rec/rec_chinese_lite_train.yml -o Global.checkpoints={path/to/weights}/best_accuracy +python3 tools/eval.py -c configs/rec/rec_icdar15_reader.yml -o Global.checkpoints={path/to/weights}/best_accuracy ``` + ### PREDICTION + * Training engine prediction Using the model trained by paddleocr, you can quickly get prediction through the following script. @@ -235,7 +294,7 @@ The default prediction picture is stored in `infer_img`, and the weight is speci ``` # Predict English results -python3 tools/infer_rec.py -c configs/rec/rec_chinese_lite_train.yml -o Global.checkpoints={path/to/weights}/best_accuracy TestReader.infer_img=doc/imgs_words/en/word_1.jpg +python3 tools/infer_rec.py -c configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml -o Global.checkpoints={path/to/weights}/best_accuracy Global.infer_img=doc/imgs_words/en/word_1.jpg ``` Input image: @@ -250,11 +309,11 @@ infer_img: doc/imgs_words/en/word_1.png word : joint ``` -The configuration file used for prediction must be consistent with the training. For example, you completed the training of the Chinese model with `python3 tools/train.py -c configs/rec/rec_chinese_lite_train.yml`, you can use the following command to predict the Chinese model: +The configuration file used for prediction must be consistent with the training. For example, you completed the training of the Chinese model with `python3 tools/train.py -c configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml`, you can use the following command to predict the Chinese model: ``` # Predict Chinese results -python3 tools/infer_rec.py -c configs/rec/rec_chinese_lite_train.yml -o Global.checkpoints={path/to/weights}/best_accuracy TestReader.infer_img=doc/imgs_words/ch/word_1.jpg +python3 tools/infer_rec.py -c configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml -o Global.checkpoints={path/to/weights}/best_accuracy Global.infer_img=doc/imgs_words/ch/word_1.jpg ``` Input image: diff --git a/doc/doc_en/update_en.md b/doc/doc_en/update_en.md index ca050370989ba3cded8c7211b7ab297ebe239c5f..71f784812bcac9ff55aa0523831ba9b1a5849403 100644 --- a/doc/doc_en/update_en.md +++ b/doc/doc_en/update_en.md @@ -1,4 +1,8 @@ # RECENT UPDATES +- 2020.9.22 Update the PP-OCR technical article, https://arxiv.org/abs/2009.09941 +- 2020.9.19 Update the ultra lightweight compressed ppocr_mobile_slim series models, the overall model size is 3.5M (see [PP-OCR Pipline](../../README.md#PP-OCR-Pipline)), suitable for mobile deployment. [Model Downloads](../../README.md#Supported-Chinese-model-list) +- 2020.9.17 Update the ultra lightweight ppocr_mobile series and general ppocr_server series Chinese and English ocr models, which are comparable to commercial effects. [Model Downloads](../../README.md#Supported-Chinese-model-list) +- 2020.9.17 update [English recognition model](./models_list_en.md#english-recognition-model) and [Multilingual recognition model](./models_list_en.md#english-recognition-model), `German`, `French`, `Japanese` and `Korean` have been supported. Models for more languages will continue to be updated. - 2020.8.24 Support the use of PaddleOCR through whl package installation,pelease refer [PaddleOCR Package](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_en/whl_en.md) - 2020.8.16 Release text detection algorithm [SAST](https://arxiv.org/abs/1908.05498) and text recognition algorithm [SRN](https://arxiv.org/abs/2003.12294) - 2020.7.23, Release the playback and PPT of live class on BiliBili station, PaddleOCR Introduction, [address](https://aistudio.baidu.com/aistudio/course/introduce/1519) @@ -7,7 +11,7 @@ - 2020.7.15, Add several related datasets, data annotation and synthesis tools. - 2020.7.9 Add a new model to support recognize the character "space". - 2020.7.9 Add the data augument and learning rate decay strategies during training. -- 2020.6.8 Add [datasets](./doc/doc_en/datasets_en.md) and keep updating +- 2020.6.8 Add [datasets](./datasets_en.md) and keep updating - 2020.6.5 Support exporting `attention` model to `inference_model` - 2020.6.5 Support separate prediction and recognition, output result score - 2020.6.5 Support exporting `attention` model to `inference_model` diff --git a/doc/doc_en/visualization_en.md b/doc/doc_en/visualization_en.md index 698db3f2d8ae31dd14829f7a1dfbd13f174f3e23..853987645e6046d9a6e87b4eb1acb2d9c7328c6d 100644 --- a/doc/doc_en/visualization_en.md +++ b/doc/doc_en/visualization_en.md @@ -1,71 +1,50 @@ # Visualization -- [Chinese/English OCR Visualization (Space_support )](#Space_support) -- [Ultra-lightweight Chinese/English OCR Visualization](#Ultra-lightweight) -- [General Chinese/English OCR Visualization](#General) + +## ch_ppocr_server_1.1 - - -## Chinese/English OCR Visualization (Space_support ) - -### Ultra-lightweight Model -
- -
- -### General OCR Model
- + + + + + +
- -## Ultra-lightweight Chinese/English OCR Visualization + +## en_ppocr_mobile_1.1
- +
-
- -
+ +## (multilingual)_ppocr_mobile_1.1
- + +
-
- -
-
- -
- -
- -
+ +## ppocr_mobile_1.0
+ + +
-
- -
- -## General Chinese/English OCR Visualization + +## ppocr_server_1.0
-
- -
-
- -
- diff --git a/doc/doc_en/whl_en.md b/doc/doc_en/whl_en.md index 4049d9dcb2d52eb5f610d5f02017a9d2d4f14f47..ffbced346f7a3f661f382b5f2d826c20fef2c012 100644 --- a/doc/doc_en/whl_en.md +++ b/doc/doc_en/whl_en.md @@ -9,8 +9,8 @@ pip install paddleocr build own whl package and install ```bash -python setup.py bdist_wheel -pip install dist/paddleocr-x.x.x-py3-none-any.whl # x.x.x is the version of paddleocr +python3 setup.py bdist_wheel +pip3 install dist/paddleocr-x.x.x-py3-none-any.whl # x.x.x is the version of paddleocr ``` ### 1. Use by code @@ -18,7 +18,7 @@ pip install dist/paddleocr-x.x.x-py3-none-any.whl # x.x.x is the version of padd ```python from paddleocr import PaddleOCR,draw_ocr # Paddleocr supports Chinese, English, French, German, Korean and Japanese. -# You can set the parameter `lang` as `zh`, `en`, `french`, `german`, `korean`, `japan` +# You can set the parameter `lang` as `ch`, `en`, `french`, `german`, `korean`, `japan` # to switch the language model in order. ocr = PaddleOCR(use_angle_cls=True, lang='en') # need to run only once to download and load model into memory img_path = 'PaddleOCR/doc/imgs_en/img_12.jpg' @@ -302,7 +302,7 @@ paddleocr --image_dir PaddleOCR/doc/imgs/11.jpg --det_model_dir {your_det_model_ | cls_batch_num | When performing classification, the batchsize of forward images | 30 | | enable_mkldnn | Whether to enable mkldnn | FALSE | | use_zero_copy_run | Whether to forward by zero_copy_run | FALSE | -| lang | The support language, now only chinese(ch) and english(en) are supported | ch | +| lang | The support language, now only Chinese(ch)、English(en)、French(french)、German(german)、Korean(korean)、Japanese(japan) are supported | ch | | det | Enable detction when `ppocr.ocr` func exec | TRUE | | rec | Enable recognition when `ppocr.ocr` func exec | TRUE | | cls | Enable classification when `ppocr.ocr` func exec | FALSE | diff --git a/doc/imgs/french_0.jpg b/doc/imgs/french_0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0c3cc4de545dc932926632d296f5ba50e2cc5f6d Binary files /dev/null and b/doc/imgs/french_0.jpg differ diff --git a/doc/imgs/ger_1.jpg b/doc/imgs/ger_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..050bf7c7b7ea23343f0c0e0bb6197c55f2f915be Binary files /dev/null and b/doc/imgs/ger_1.jpg differ diff --git a/doc/imgs/ger_2.jpg b/doc/imgs/ger_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b922702bfcbd7496901ff63e6279ec80499f79b0 Binary files /dev/null and b/doc/imgs/ger_2.jpg differ diff --git a/doc/imgs/japan_1.jpg b/doc/imgs/japan_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ffcb2e4a801ddb443ecf113d9110b43308893822 Binary files /dev/null and b/doc/imgs/japan_1.jpg differ diff --git a/doc/imgs/japan_2.jpg b/doc/imgs/japan_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0353874860a7bb275a4c4f61662d827a8351c2ff Binary files /dev/null and b/doc/imgs/japan_2.jpg differ diff --git a/doc/imgs/korean_1.jpg b/doc/imgs/korean_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f1614e9f286a82261312731e13e8256410b160e3 Binary files /dev/null and b/doc/imgs/korean_1.jpg differ diff --git a/doc/imgs_results/img_12.jpg b/doc/imgs_results/img_12.jpg new file mode 100644 index 0000000000000000000000000000000000000000..11ac4ed6cee4ad97650e6107c944bad96bc1a590 Binary files /dev/null and b/doc/imgs_results/img_12.jpg differ diff --git a/doc/joinus.PNG b/doc/joinus.PNG index fa11f286d7d2d56d18d94e9034c3be77c974d42f..cd36ba393259bdebd5e1ba251e15df64a8f6896e 100644 Binary files a/doc/joinus.PNG and b/doc/joinus.PNG differ diff --git a/paddleocr.py b/paddleocr.py index 7e9b2402ad792b4d690b1147f042203df46872a5..ff579679184ad950be9b6466b2be209e89d4639a 100644 --- a/paddleocr.py +++ b/paddleocr.py @@ -87,8 +87,8 @@ def download_with_progressbar(url, save_path): progress_bar.update(len(data)) file.write(data) progress_bar.close() - if total_size_in_bytes != 0 and progress_bar.n != total_size_in_bytes: - logger.error("ERROR, something went wrong") + if total_size_in_bytes == 0 or progress_bar.n != total_size_in_bytes: + logger.error("Something went wrong while downloading models") sys.exit(0) @@ -157,7 +157,6 @@ def parse_args(): parser.add_argument("--use_space_char", type=bool, default=True) # params for text classifier - parser.add_argument("--use_angle_cls", type=str2bool, default=False) parser.add_argument("--cls_model_dir", type=str, default=None) parser.add_argument("--cls_image_shape", type=str, default="3, 48, 192") parser.add_argument("--label_list", type=list, default=['0', '180']) @@ -166,11 +165,12 @@ def parse_args(): parser.add_argument("--enable_mkldnn", type=bool, default=False) parser.add_argument("--use_zero_copy_run", type=bool, default=False) + parser.add_argument("--use_pdserving", type=str2bool, default=False) parser.add_argument("--lang", type=str, default='ch') parser.add_argument("--det", type=str2bool, default=True) parser.add_argument("--rec", type=str2bool, default=True) - parser.add_argument("--cls", type=str2bool, default=False) + parser.add_argument("--use_angle_cls", type=str2bool, default=True) return parser.parse_args() @@ -205,8 +205,7 @@ class PaddleOCR(predict_system.TextSystem): maybe_download(postprocess_params.det_model_dir, model_urls['det']) maybe_download(postprocess_params.rec_model_dir, model_urls['rec'][lang]['url']) - if self.use_angle_cls: - maybe_download(postprocess_params.cls_model_dir, model_urls['cls']) + maybe_download(postprocess_params.cls_model_dir, model_urls['cls']) if postprocess_params.det_algorithm not in SUPPORT_DET_MODEL: logger.error('det_algorithm must in {}'.format(SUPPORT_DET_MODEL)) @@ -230,9 +229,6 @@ class PaddleOCR(predict_system.TextSystem): rec: use text recognition or not, if false, only det will be exec. default is True """ assert isinstance(img, (np.ndarray, list, str)) - if cls and not self.use_angle_cls: - print('cls should be false when use_angle_cls is false') - exit(-1) self.use_angle_cls = cls if isinstance(img, str): image_file = img @@ -274,6 +270,7 @@ def main(): result = ocr_engine.ocr(img_path, det=args.det, rec=args.rec, - cls=args.cls) - for line in result: - print(line) + cls=args.use_angle_cls) + if result is not None: + for line in result: + print(line) diff --git a/ppocr/data/cls/dataset_traversal.py b/ppocr/data/cls/dataset_traversal.py index 01f8c89c839f0c8f6d07ca6ad9676947ce25f6ab..ea05b859cf6047fa54ae1f5af154b7443d2d26eb 100755 --- a/ppocr/data/cls/dataset_traversal.py +++ b/ppocr/data/cls/dataset_traversal.py @@ -74,7 +74,7 @@ class SimpleReader(object): def get_device_num(): if self.use_gpu: - gpus = os.environ.get("CUDA_VISIBLE_DEVICES", 1) + gpus = os.environ.get("CUDA_VISIBLE_DEVICES", "1") gpu_num = len(gpus.split(',')) return gpu_num else: diff --git a/ppocr/data/det/__init__.py b/ppocr/data/det/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/ppocr/data/det/db_process.py b/ppocr/data/det/db_process.py index 9534c59ef69d830a8d991f421539c5e4e5bb3d39..41aca6cd47b5d62e8e8064831b3ed653d2b423a5 100644 --- a/ppocr/data/det/db_process.py +++ b/ppocr/data/det/db_process.py @@ -28,14 +28,22 @@ from .make_border_map import MakeBorderMap class DBProcessTrain(object): """ - DB pre-process for Train mode + The pre-process of DB for train mode """ def __init__(self, params): + """ + :param params: dict of params + """ self.img_set_dir = params['img_set_dir'] self.image_shape = params['image_shape'] def order_points_clockwise(self, pts): + """ + Sort the points in the box clockwise + :param pts: points with shape [4, 2] + :return: sorted points + """ rect = np.zeros((4, 2), dtype="float32") s = pts.sum(axis=1) rect[0] = pts[np.argmin(s)] @@ -46,6 +54,12 @@ class DBProcessTrain(object): return rect def make_data_dict(self, imgvalue, entry): + """ + create input dict + :param imgvalue: input image + :param entry: dict of annotations information + :return: created dict of input data information + """ boxes = [] texts = [] ignores = [] @@ -71,6 +85,11 @@ class DBProcessTrain(object): return data def NormalizeImage(self, data): + """ + Normalize input image + :param data: input dict + :return: new dict with normalized image + """ im = data['image'] img_mean = [0.485, 0.456, 0.406] img_std = [0.229, 0.224, 0.225] @@ -84,6 +103,11 @@ class DBProcessTrain(object): return data def FilterKeys(self, data): + """ + Filter keys + :param data: dict + :return: + """ filter_keys = ['polys', 'texts', 'ignore_tags', 'shape'] for key in filter_keys: if key in data: @@ -91,6 +115,11 @@ class DBProcessTrain(object): return data def convert_label_infor(self, label_infor): + """ + encode annotations using json.loads + :param label_infor: string + :return: (image, encoded annotations) + """ label_infor = label_infor.decode() label_infor = label_infor.encode('utf-8').decode('utf-8-sig') substr = label_infor.strip("\n").split("\t") @@ -165,13 +194,13 @@ class DBProcessTest(object): elif resize_h // 32 <= 1: resize_h = 32 else: - resize_h = (resize_h // 32 - 1) * 32 + resize_h = (resize_h // 32) * 32 if resize_w % 32 == 0: resize_w = resize_w elif resize_w // 32 <= 1: resize_w = 32 else: - resize_w = (resize_w // 32 - 1) * 32 + resize_w = (resize_w // 32) * 32 try: if int(resize_w) <= 0 or int(resize_h) <= 0: return None, (None, None) @@ -184,6 +213,11 @@ class DBProcessTest(object): return im, (ratio_h, ratio_w) def resize_image_type1(self, im): + """ + resize image to a size self.image_shape + :param im: input image + :return: normalized image and resize ratio + """ resize_h, resize_w = self.image_shape ori_h, ori_w = im.shape[:2] # (h, w, c) im = cv2.resize(im, (int(resize_w), int(resize_h))) @@ -192,6 +226,11 @@ class DBProcessTest(object): return im, (ratio_h, ratio_w) def normalize(self, im): + """ + Normalize image + :param im: input image + :return: Normalized image + """ img_mean = [0.485, 0.456, 0.406] img_std = [0.229, 0.224, 0.225] im = im.astype(np.float32, copy=False) diff --git a/ppocr/data/det/east_process.py b/ppocr/data/det/east_process.py index e2581caa20bb0e63f67e110d483d3335f51d56b7..71ba4786e2ab510250c1dbac0df36aad53a56eac 100755 --- a/ppocr/data/det/east_process.py +++ b/ppocr/data/det/east_process.py @@ -19,6 +19,7 @@ import json import sys import os + class EASTProcessTrain(object): def __init__(self, params): self.img_set_dir = params['img_set_dir'] @@ -495,13 +496,13 @@ class EASTProcessTest(object): elif resize_h // 32 <= 1: resize_h = 32 else: - resize_h = (resize_h // 32 - 1) * 32 + resize_h = (resize_h // 32) * 32 if resize_w % 32 == 0: resize_w = resize_w elif resize_w // 32 <= 1: resize_w = 32 else: - resize_w = (resize_w // 32 - 1) * 32 + resize_w = (resize_w // 32) * 32 try: if int(resize_w) <= 0 or int(resize_h) <= 0: return None, (None, None) diff --git a/ppocr/data/det/sast_process.py b/ppocr/data/det/sast_process.py index 74a848465f4cedb4a7007f61adc509d80885922c..c2a1a38f5cc1f3b5f10f0069525d13a83cc4415a 100644 --- a/ppocr/data/det/sast_process.py +++ b/ppocr/data/det/sast_process.py @@ -599,7 +599,7 @@ class SASTProcessTrain(object): """ text_polys, txt_tags, txts = [], [], [] - with open(poly_txt_path) as f: + with open(poly_txt_path, 'rb') as f: for line in f.readlines(): poly_str, txt = line.strip().split('\t') poly = map(float, poly_str.split(',')) diff --git a/ppocr/data/rec/dataset_traversal.py b/ppocr/data/rec/dataset_traversal.py index 84f325b9b880d6289a4d60f7ebff39d962fdb5a1..02aa13baa92261ef9dbf888c2d479925aacb0be6 100755 --- a/ppocr/data/rec/dataset_traversal.py +++ b/ppocr/data/rec/dataset_traversal.py @@ -127,6 +127,7 @@ class LMDBReader(object): img=img, image_shape=self.image_shape, num_heads=self.num_heads, + char_ops=self.char_ops, max_text_length=self.max_text_length) else: norm_img = process_image( diff --git a/ppocr/data/rec/img_tools.py b/ppocr/data/rec/img_tools.py index 8b497e6b803ba0fffaefc3e12c366130504b9ce0..9edfff11f5701217d944410ddc25c2d698fd47ab 100755 --- a/ppocr/data/rec/img_tools.py +++ b/ppocr/data/rec/img_tools.py @@ -19,6 +19,8 @@ import random from ppocr.utils.utility import initial_logger logger = initial_logger() +from .text_image_aug.augment import tia_distort, tia_stretch, tia_perspective + def get_bounding_box_rect(pos): left = min(pos[0]) @@ -54,7 +56,7 @@ def resize_norm_img(img, image_shape): def resize_norm_img_chinese(img, image_shape): imgC, imgH, imgW = image_shape # todo: change to 0 and modified image shape - max_wh_ratio = 0 + max_wh_ratio = imgW * 1.0 / imgH h, w = img.shape[0], img.shape[1] ratio = w * 1.0 / h max_wh_ratio = max(max_wh_ratio, ratio) @@ -196,6 +198,9 @@ class Config: self.h = h self.perspective = True + self.stretch = True + self.distort = True + self.crop = True self.affine = False self.reverse = True @@ -299,41 +304,52 @@ def warp(img, ang): config.make(w, h, ang) new_img = img + prob = 0.4 + + if config.distort: + img_height, img_width = img.shape[0:2] + if random.random() <= prob and img_height >= 20 and img_width >= 20: + try: + new_img = tia_distort(new_img, random.randint(3, 6)) + except: + logger.warning( + "Exception occured during tia_distort, pass it...") + + if config.stretch: + img_height, img_width = img.shape[0:2] + if random.random() <= prob and img_height >= 20 and img_width >= 20: + try: + new_img = tia_stretch(new_img, random.randint(3, 6)) + except: + logger.warning( + "Exception occured during tia_stretch, pass it...") + if config.perspective: - tp = random.randint(1, 100) - if tp >= 50: - warpR, (r1, c1), ratio, dst = get_warpR(config) - new_w = int(np.max(dst[:, 0])) - int(np.min(dst[:, 0])) - new_img = cv2.warpPerspective( - new_img, - warpR, (int(new_w * ratio), h), - borderMode=config.borderMode) + if random.random() <= prob: + try: + new_img = tia_perspective(new_img) + except: + logger.warning( + "Exception occured during tia_perspective, pass it...") + if config.crop: img_height, img_width = img.shape[0:2] - tp = random.randint(1, 100) - if tp >= 50 and img_height >= 20 and img_width >= 20: + if random.random() <= prob and img_height >= 20 and img_width >= 20: new_img = get_crop(new_img) - if config.affine: - warpT = get_warpAffine(config) - new_img = cv2.warpAffine( - new_img, warpT, (w, h), borderMode=config.borderMode) + if config.blur: - tp = random.randint(1, 100) - if tp >= 50: + if random.random() <= prob: new_img = blur(new_img) if config.color: - tp = random.randint(1, 100) - if tp >= 50: + if random.random() <= prob: new_img = cvtColor(new_img) if config.jitter: new_img = jitter(new_img) if config.noise: - tp = random.randint(1, 100) - if tp >= 50: + if random.random() <= prob: new_img = add_gasuss_noise(new_img) if config.reverse: - tp = random.randint(1, 100) - if tp >= 50: + if random.random() <= prob: new_img = 255 - new_img return new_img @@ -382,6 +398,7 @@ def process_image(img, % loss_type return (norm_img) + def resize_norm_img_srn(img, image_shape): imgC, imgH, imgW = image_shape @@ -408,30 +425,39 @@ def resize_norm_img_srn(img, image_shape): return np.reshape(img_black, (c, row, col)).astype(np.float32) -def srn_other_inputs(image_shape, - num_heads, - max_text_length, - char_num): + +def srn_other_inputs(image_shape, num_heads, max_text_length, char_num): imgC, imgH, imgW = image_shape feature_dim = int((imgH / 8) * (imgW / 8)) - encoder_word_pos = np.array(range(0, feature_dim)).reshape((feature_dim, 1)).astype('int64') - gsrm_word_pos = np.array(range(0, max_text_length)).reshape((max_text_length, 1)).astype('int64') + encoder_word_pos = np.array(range(0, feature_dim)).reshape( + (feature_dim, 1)).astype('int64') + gsrm_word_pos = np.array(range(0, max_text_length)).reshape( + (max_text_length, 1)).astype('int64') - lbl_weight = np.array([int(char_num-1)] * max_text_length).reshape((-1,1)).astype('int64') + lbl_weight = np.array([int(char_num - 1)] * max_text_length).reshape( + (-1, 1)).astype('int64') - gsrm_attn_bias_data = np.ones((1, max_text_length, max_text_length)) - gsrm_slf_attn_bias1 = np.triu(gsrm_attn_bias_data, 1).reshape([-1, 1, max_text_length, max_text_length]) - gsrm_slf_attn_bias1 = np.tile(gsrm_slf_attn_bias1, [1, num_heads, 1, 1]) * [-1e9] + gsrm_attn_bias_data = np.ones((1, max_text_length, max_text_length)) + gsrm_slf_attn_bias1 = np.triu(gsrm_attn_bias_data, 1).reshape( + [-1, 1, max_text_length, max_text_length]) + gsrm_slf_attn_bias1 = np.tile(gsrm_slf_attn_bias1, + [1, num_heads, 1, 1]) * [-1e9] - gsrm_slf_attn_bias2 = np.tril(gsrm_attn_bias_data, -1).reshape([-1, 1, max_text_length, max_text_length]) - gsrm_slf_attn_bias2 = np.tile(gsrm_slf_attn_bias2, [1, num_heads, 1, 1]) * [-1e9] + gsrm_slf_attn_bias2 = np.tril(gsrm_attn_bias_data, -1).reshape( + [-1, 1, max_text_length, max_text_length]) + gsrm_slf_attn_bias2 = np.tile(gsrm_slf_attn_bias2, + [1, num_heads, 1, 1]) * [-1e9] encoder_word_pos = encoder_word_pos[np.newaxis, :] gsrm_word_pos = gsrm_word_pos[np.newaxis, :] - return [lbl_weight, encoder_word_pos, gsrm_word_pos, gsrm_slf_attn_bias1, gsrm_slf_attn_bias2] + return [ + lbl_weight, encoder_word_pos, gsrm_word_pos, gsrm_slf_attn_bias1, + gsrm_slf_attn_bias2 + ] + def process_image_srn(img, image_shape, @@ -453,14 +479,16 @@ def process_image_srn(img, return None else: if loss_type == "srn": - text_padded = [int(char_num-1)] * max_text_length + text_padded = [int(char_num - 1)] * max_text_length for i in range(len(text)): text_padded[i] = text[i] lbl_weight[i] = [1.0] text_padded = np.array(text_padded) text = text_padded.reshape(-1, 1) - return (norm_img, text,encoder_word_pos, gsrm_word_pos, gsrm_slf_attn_bias1, gsrm_slf_attn_bias2,lbl_weight) + return (norm_img, text, encoder_word_pos, gsrm_word_pos, + gsrm_slf_attn_bias1, gsrm_slf_attn_bias2, lbl_weight) else: assert False, "Unsupport loss_type %s in process_image"\ % loss_type - return (norm_img, encoder_word_pos, gsrm_word_pos, gsrm_slf_attn_bias1, gsrm_slf_attn_bias2) + return (norm_img, encoder_word_pos, gsrm_word_pos, gsrm_slf_attn_bias1, + gsrm_slf_attn_bias2) diff --git a/ppocr/data/rec/text_image_aug/augment.py b/ppocr/data/rec/text_image_aug/augment.py new file mode 100644 index 0000000000000000000000000000000000000000..10ffbbd17fe45dcc2a926469565ff0badf41717b --- /dev/null +++ b/ppocr/data/rec/text_image_aug/augment.py @@ -0,0 +1,107 @@ +# -*- coding:utf-8 -*- +# Author: RubanSeven +# Reference: https://github.com/RubanSeven/Text-Image-Augmentation-python + +# import cv2 +import numpy as np +from .warp_mls import WarpMLS + + +def tia_distort(src, segment=4): + img_h, img_w = src.shape[:2] + + cut = img_w // segment + thresh = cut // 3 + + src_pts = list() + dst_pts = list() + + src_pts.append([0, 0]) + src_pts.append([img_w, 0]) + src_pts.append([img_w, img_h]) + src_pts.append([0, img_h]) + + dst_pts.append([np.random.randint(thresh), np.random.randint(thresh)]) + dst_pts.append( + [img_w - np.random.randint(thresh), np.random.randint(thresh)]) + dst_pts.append( + [img_w - np.random.randint(thresh), img_h - np.random.randint(thresh)]) + dst_pts.append( + [np.random.randint(thresh), img_h - np.random.randint(thresh)]) + + half_thresh = thresh * 0.5 + + for cut_idx in np.arange(1, segment, 1): + src_pts.append([cut * cut_idx, 0]) + src_pts.append([cut * cut_idx, img_h]) + dst_pts.append([ + cut * cut_idx + np.random.randint(thresh) - half_thresh, + np.random.randint(thresh) - half_thresh + ]) + dst_pts.append([ + cut * cut_idx + np.random.randint(thresh) - half_thresh, + img_h + np.random.randint(thresh) - half_thresh + ]) + + trans = WarpMLS(src, src_pts, dst_pts, img_w, img_h) + dst = trans.generate() + + return dst + + +def tia_stretch(src, segment=4): + img_h, img_w = src.shape[:2] + + cut = img_w // segment + thresh = cut * 4 // 5 + + src_pts = list() + dst_pts = list() + + src_pts.append([0, 0]) + src_pts.append([img_w, 0]) + src_pts.append([img_w, img_h]) + src_pts.append([0, img_h]) + + dst_pts.append([0, 0]) + dst_pts.append([img_w, 0]) + dst_pts.append([img_w, img_h]) + dst_pts.append([0, img_h]) + + half_thresh = thresh * 0.5 + + for cut_idx in np.arange(1, segment, 1): + move = np.random.randint(thresh) - half_thresh + src_pts.append([cut * cut_idx, 0]) + src_pts.append([cut * cut_idx, img_h]) + dst_pts.append([cut * cut_idx + move, 0]) + dst_pts.append([cut * cut_idx + move, img_h]) + + trans = WarpMLS(src, src_pts, dst_pts, img_w, img_h) + dst = trans.generate() + + return dst + + +def tia_perspective(src): + img_h, img_w = src.shape[:2] + + thresh = img_h // 2 + + src_pts = list() + dst_pts = list() + + src_pts.append([0, 0]) + src_pts.append([img_w, 0]) + src_pts.append([img_w, img_h]) + src_pts.append([0, img_h]) + + dst_pts.append([0, np.random.randint(thresh)]) + dst_pts.append([img_w, np.random.randint(thresh)]) + dst_pts.append([img_w, img_h - np.random.randint(thresh)]) + dst_pts.append([0, img_h - np.random.randint(thresh)]) + + trans = WarpMLS(src, src_pts, dst_pts, img_w, img_h) + dst = trans.generate() + + return dst diff --git a/ppocr/data/rec/text_image_aug/warp_mls.py b/ppocr/data/rec/text_image_aug/warp_mls.py new file mode 100644 index 0000000000000000000000000000000000000000..8994fac00fa5dfa972b994a83a6a51327a0e18b1 --- /dev/null +++ b/ppocr/data/rec/text_image_aug/warp_mls.py @@ -0,0 +1,154 @@ +# -*- coding:utf-8 -*- +# Author: RubanSeven +# Reference: https://github.com/RubanSeven/Text-Image-Augmentation-python +import math +import numpy as np + + +class WarpMLS: + def __init__(self, src, src_pts, dst_pts, dst_w, dst_h, trans_ratio=1.): + self.src = src + self.src_pts = src_pts + self.dst_pts = dst_pts + self.pt_count = len(self.dst_pts) + self.dst_w = dst_w + self.dst_h = dst_h + self.trans_ratio = trans_ratio + self.grid_size = 100 + self.rdx = np.zeros((self.dst_h, self.dst_w)) + self.rdy = np.zeros((self.dst_h, self.dst_w)) + + @staticmethod + def __bilinear_interp(x, y, v11, v12, v21, v22): + return (v11 * (1 - y) + v12 * y) * (1 - x) + (v21 * + (1 - y) + v22 * y) * x + + def generate(self): + self.calc_delta() + return self.gen_img() + + def calc_delta(self): + w = np.zeros(self.pt_count, dtype=np.float32) + + if self.pt_count < 2: + return + + i = 0 + while 1: + if self.dst_w <= i < self.dst_w + self.grid_size - 1: + i = self.dst_w - 1 + elif i >= self.dst_w: + break + + j = 0 + while 1: + if self.dst_h <= j < self.dst_h + self.grid_size - 1: + j = self.dst_h - 1 + elif j >= self.dst_h: + break + + sw = 0 + swp = np.zeros(2, dtype=np.float32) + swq = np.zeros(2, dtype=np.float32) + new_pt = np.zeros(2, dtype=np.float32) + cur_pt = np.array([i, j], dtype=np.float32) + + k = 0 + for k in range(self.pt_count): + if i == self.dst_pts[k][0] and j == self.dst_pts[k][1]: + break + + w[k] = 1. / ( + (i - self.dst_pts[k][0]) * (i - self.dst_pts[k][0]) + + (j - self.dst_pts[k][1]) * (j - self.dst_pts[k][1])) + + sw += w[k] + swp = swp + w[k] * np.array(self.dst_pts[k]) + swq = swq + w[k] * np.array(self.src_pts[k]) + + if k == self.pt_count - 1: + pstar = 1 / sw * swp + qstar = 1 / sw * swq + + miu_s = 0 + for k in range(self.pt_count): + if i == self.dst_pts[k][0] and j == self.dst_pts[k][1]: + continue + pt_i = self.dst_pts[k] - pstar + miu_s += w[k] * np.sum(pt_i * pt_i) + + cur_pt -= pstar + cur_pt_j = np.array([-cur_pt[1], cur_pt[0]]) + + for k in range(self.pt_count): + if i == self.dst_pts[k][0] and j == self.dst_pts[k][1]: + continue + + pt_i = self.dst_pts[k] - pstar + pt_j = np.array([-pt_i[1], pt_i[0]]) + + tmp_pt = np.zeros(2, dtype=np.float32) + tmp_pt[0] = np.sum(pt_i * cur_pt) * self.src_pts[k][0] - \ + np.sum(pt_j * cur_pt) * self.src_pts[k][1] + tmp_pt[1] = -np.sum(pt_i * cur_pt_j) * self.src_pts[k][0] + \ + np.sum(pt_j * cur_pt_j) * self.src_pts[k][1] + tmp_pt *= (w[k] / miu_s) + new_pt += tmp_pt + + new_pt += qstar + else: + new_pt = self.src_pts[k] + + self.rdx[j, i] = new_pt[0] - i + self.rdy[j, i] = new_pt[1] - j + + j += self.grid_size + i += self.grid_size + + def gen_img(self): + src_h, src_w = self.src.shape[:2] + dst = np.zeros_like(self.src, dtype=np.float32) + + for i in np.arange(0, self.dst_h, self.grid_size): + for j in np.arange(0, self.dst_w, self.grid_size): + ni = i + self.grid_size + nj = j + self.grid_size + w = h = self.grid_size + if ni >= self.dst_h: + ni = self.dst_h - 1 + h = ni - i + 1 + if nj >= self.dst_w: + nj = self.dst_w - 1 + w = nj - j + 1 + + di = np.reshape(np.arange(h), (-1, 1)) + dj = np.reshape(np.arange(w), (1, -1)) + delta_x = self.__bilinear_interp( + di / h, dj / w, self.rdx[i, j], self.rdx[i, nj], + self.rdx[ni, j], self.rdx[ni, nj]) + delta_y = self.__bilinear_interp( + di / h, dj / w, self.rdy[i, j], self.rdy[i, nj], + self.rdy[ni, j], self.rdy[ni, nj]) + nx = j + dj + delta_x * self.trans_ratio + ny = i + di + delta_y * self.trans_ratio + nx = np.clip(nx, 0, src_w - 1) + ny = np.clip(ny, 0, src_h - 1) + nxi = np.array(np.floor(nx), dtype=np.int32) + nyi = np.array(np.floor(ny), dtype=np.int32) + nxi1 = np.array(np.ceil(nx), dtype=np.int32) + nyi1 = np.array(np.ceil(ny), dtype=np.int32) + + if len(self.src.shape) == 3: + x = np.tile(np.expand_dims(ny - nyi, axis=-1), (1, 1, 3)) + y = np.tile(np.expand_dims(nx - nxi, axis=-1), (1, 1, 3)) + else: + x = ny - nyi + y = nx - nxi + dst[i:i + h, j:j + w] = self.__bilinear_interp( + x, y, self.src[nyi, nxi], self.src[nyi, nxi1], + self.src[nyi1, nxi], self.src[nyi1, nxi1]) + + dst = np.clip(dst, 0, 255) + dst = np.array(dst, dtype=np.uint8) + + return dst diff --git a/ppocr/modeling/architectures/cls_model.py b/ppocr/modeling/architectures/cls_model.py index ad3ad0e7cf4010a14c70a700ed02d02ee1f1323b..30f3661b4c5ef4370b542f46dfaee2fdc1fc53e5 100755 --- a/ppocr/modeling/architectures/cls_model.py +++ b/ppocr/modeling/architectures/cls_model.py @@ -65,6 +65,7 @@ class ClsModel(object): labels = None loader = None image = fluid.data(name='image', shape=image_shape, dtype='float32') + image.stop_gradient = False return image, labels, loader def __call__(self, mode): diff --git a/ppocr/modeling/architectures/rec_model.py b/ppocr/modeling/architectures/rec_model.py index 261462044a9000561517c3657f5b5a6090fd107a..9f8c779cf27c71fd230bd70115795ff51ba6f63c 100755 --- a/ppocr/modeling/architectures/rec_model.py +++ b/ppocr/modeling/architectures/rec_model.py @@ -16,6 +16,8 @@ from __future__ import absolute_import from __future__ import division from __future__ import print_function +from collections import OrderedDict + from paddle import fluid from ppocr.utils.utility import create_module @@ -25,6 +27,12 @@ from copy import deepcopy class RecModel(object): + """ + Rec model architecture + Args: + params(object): Params from yaml file and settings from command line + """ + def __init__(self, params): super(RecModel, self).__init__() global_params = params['Global'] @@ -64,6 +72,12 @@ class RecModel(object): self.num_heads = None def create_feed(self, mode): + """ + Create feed dict and DataLoader object + Args: + mode(str): runtime mode, can be "train", "eval" or "test" + Return: image, labels, loader + """ image_shape = deepcopy(self.image_shape) image_shape.insert(0, -1) if mode == "train": @@ -189,9 +203,12 @@ class RecModel(object): inputs = image else: inputs = self.tps(image) + # backbone conv_feas = self.backbone(inputs) + # predict predicts = self.head(conv_feas, labels, mode) decoded_out = predicts['decoded_out'] + # loss if mode == "train": loss = self.loss(predicts, labels) if self.loss_type == "attention": @@ -200,33 +217,32 @@ class RecModel(object): label = labels['label'] if self.loss_type == 'srn': total_loss, img_loss, word_loss = self.loss(predicts, labels) - outputs = { - 'total_loss': total_loss, - 'img_loss': img_loss, - 'word_loss': word_loss, - 'decoded_out': decoded_out, - 'label': label - } + outputs = OrderedDict([('total_loss', total_loss), + ('img_loss', img_loss), + ('word_loss', word_loss), + ('decoded_out', decoded_out), + ('label', label)]) else: - outputs = {'total_loss':loss, 'decoded_out':\ - decoded_out, 'label':label} + outputs = OrderedDict([('total_loss', loss), + ('decoded_out', decoded_out), + ('label', label)]) return loader, outputs - + # export_model elif mode == "export": predict = predicts['predict'] if self.loss_type == "ctc": predict = fluid.layers.softmax(predict) if self.loss_type == "srn": return [ - image, labels, { - 'decoded_out': decoded_out, - 'predicts': predict - } - ] + image, labels, OrderedDict([('decoded_out', decoded_out), + ('predicts', predict)])] - return [image, {'decoded_out': decoded_out, 'predicts': predict}] + return [image, OrderedDict([('decoded_out', decoded_out), + ('predicts', predict)])] + # eval or test else: predict = predicts['predict'] if self.loss_type == "ctc": predict = fluid.layers.softmax(predict) - return loader, {'decoded_out': decoded_out, 'predicts': predict} + return loader, OrderedDict([('decoded_out', decoded_out), + ('predicts', predict)]) \ No newline at end of file diff --git a/ppocr/modeling/backbones/rec_resnet_fpn.py b/ppocr/modeling/backbones/rec_resnet_fpn.py index 0a05b5def8b79943f045d9cc941835cddc82bfdb..fb887ce1b427bd982057f53c88c46d82ac51678a 100755 --- a/ppocr/modeling/backbones/rec_resnet_fpn.py +++ b/ppocr/modeling/backbones/rec_resnet_fpn.py @@ -100,11 +100,10 @@ class ResNet(): conv = self.basic_block( input=conv, num_filters=num_filters[block], - stride=stride, - if_first=block == i == 0, + stride=stride_list[block] if i == 0 else 1, + is_first=block == i == 0, name=conv_name) F.append(conv) - base = F[-1] for i in [-2, -3]: b, c, w, h = F[i].shape diff --git a/ppocr/modeling/heads/cls_head.py b/ppocr/modeling/heads/cls_head.py index 4567adcbaef3ddb14f3b46b27f772e3836db6793..729561f9c486567e7ffd0eb4c4e55d56ce8a74e6 100644 --- a/ppocr/modeling/heads/cls_head.py +++ b/ppocr/modeling/heads/cls_head.py @@ -23,6 +23,14 @@ import paddle.fluid as fluid class ClsHead(object): + """ + Class orientation + + Args: + + params(dict): super parameters for build Class network + """ + def __init__(self, params): super(ClsHead, self).__init__() self.class_dim = params['class_dim'] diff --git a/ppocr/modeling/heads/det_east_head.py b/ppocr/modeling/heads/det_east_head.py index de6ed51db72aee297e5cec7b89b49b9a0f55cd30..e2d9176e9146ee3f4738dcf1cda962ff6bb3f749 100755 --- a/ppocr/modeling/heads/det_east_head.py +++ b/ppocr/modeling/heads/det_east_head.py @@ -109,6 +109,12 @@ class EASTHead(object): return f_score, f_geo def __call__(self, inputs): + """ + Fuse different levels of feature map from backbone and predict results + Args: + inputs(list): feature maps from backbone + Return: predicts + """ f_common = self.unet_fusion(inputs) f_score, f_geo = self.detector_header(f_common) predicts = OrderedDict() diff --git a/ppocr/modeling/heads/det_sast_head.py b/ppocr/modeling/heads/det_sast_head.py index 0097913dd7e08c76c45064940416e7c9ffc32f26..7b9520e57fea76e05b9009c1ca56e77c0e7a6fc4 100644 --- a/ppocr/modeling/heads/det_sast_head.py +++ b/ppocr/modeling/heads/det_sast_head.py @@ -38,35 +38,66 @@ class SASTHead(object): blocks{}: contain block_2, block_3, block_4, block_5, block_6, block_7 with 1/4, 1/8, 1/16, 1/32, 1/64, 1/128 resolution. """ - f = [blocks['block_6'], blocks['block_5'], blocks['block_4'], blocks['block_3'], blocks['block_2']] + f = [ + blocks['block_6'], blocks['block_5'], blocks['block_4'], + blocks['block_3'], blocks['block_2'] + ] num_outputs = [256, 256, 192, 192, 128] g = [None, None, None, None, None] - h = [None, None, None, None, None] + h = [None, None, None, None, None] for i in range(5): - h[i] = conv_bn_layer(input=f[i], num_filters=num_outputs[i], - filter_size=1, stride=1, act=None, name='fpn_up_h'+str(i)) + h[i] = conv_bn_layer( + input=f[i], + num_filters=num_outputs[i], + filter_size=1, + stride=1, + act=None, + name='fpn_up_h' + str(i)) for i in range(4): if i == 0: - g[i] = deconv_bn_layer(input=h[i], num_filters=num_outputs[i + 1], act=None, name='fpn_up_g0') + g[i] = deconv_bn_layer( + input=h[i], + num_filters=num_outputs[i + 1], + act=None, + name='fpn_up_g0') #print("g[{}] shape: {}".format(i, g[i].shape)) else: g[i] = fluid.layers.elementwise_add(x=g[i - 1], y=h[i]) g[i] = fluid.layers.relu(g[i]) #g[i] = conv_bn_layer(input=g[i], num_filters=num_outputs[i], # filter_size=1, stride=1, act='relu') - g[i] = conv_bn_layer(input=g[i], num_filters=num_outputs[i], - filter_size=3, stride=1, act='relu', name='fpn_up_g%d_1'%i) - g[i] = deconv_bn_layer(input=g[i], num_filters=num_outputs[i + 1], act=None, name='fpn_up_g%d_2'%i) + g[i] = conv_bn_layer( + input=g[i], + num_filters=num_outputs[i], + filter_size=3, + stride=1, + act='relu', + name='fpn_up_g%d_1' % i) + g[i] = deconv_bn_layer( + input=g[i], + num_filters=num_outputs[i + 1], + act=None, + name='fpn_up_g%d_2' % i) #print("g[{}] shape: {}".format(i, g[i].shape)) g[4] = fluid.layers.elementwise_add(x=g[3], y=h[4]) g[4] = fluid.layers.relu(g[4]) - g[4] = conv_bn_layer(input=g[4], num_filters=num_outputs[4], - filter_size=3, stride=1, act='relu', name='fpn_up_fusion_1') - g[4] = conv_bn_layer(input=g[4], num_filters=num_outputs[4], - filter_size=1, stride=1, act=None, name='fpn_up_fusion_2') - + g[4] = conv_bn_layer( + input=g[4], + num_filters=num_outputs[4], + filter_size=3, + stride=1, + act='relu', + name='fpn_up_fusion_1') + g[4] = conv_bn_layer( + input=g[4], + num_filters=num_outputs[4], + filter_size=1, + stride=1, + act=None, + name='fpn_up_fusion_2') + return g[4] def FPN_Down_Fusion(self, blocks): @@ -77,95 +108,245 @@ class SASTHead(object): f = [blocks['block_0'], blocks['block_1'], blocks['block_2']] num_outputs = [32, 64, 128] g = [None, None, None] - h = [None, None, None] + h = [None, None, None] for i in range(3): - h[i] = conv_bn_layer(input=f[i], num_filters=num_outputs[i], - filter_size=3, stride=1, act=None, name='fpn_down_h'+str(i)) + h[i] = conv_bn_layer( + input=f[i], + num_filters=num_outputs[i], + filter_size=3, + stride=1, + act=None, + name='fpn_down_h' + str(i)) for i in range(2): if i == 0: - g[i] = conv_bn_layer(input=h[i], num_filters=num_outputs[i+1], filter_size=3, stride=2, act=None, name='fpn_down_g0') + g[i] = conv_bn_layer( + input=h[i], + num_filters=num_outputs[i + 1], + filter_size=3, + stride=2, + act=None, + name='fpn_down_g0') else: g[i] = fluid.layers.elementwise_add(x=g[i - 1], y=h[i]) g[i] = fluid.layers.relu(g[i]) - g[i] = conv_bn_layer(input=g[i], num_filters=num_outputs[i], filter_size=3, stride=1, act='relu', name='fpn_down_g%d_1'%i) - g[i] = conv_bn_layer(input=g[i], num_filters=num_outputs[i+1], filter_size=3, stride=2, act=None, name='fpn_down_g%d_2'%i) + g[i] = conv_bn_layer( + input=g[i], + num_filters=num_outputs[i], + filter_size=3, + stride=1, + act='relu', + name='fpn_down_g%d_1' % i) + g[i] = conv_bn_layer( + input=g[i], + num_filters=num_outputs[i + 1], + filter_size=3, + stride=2, + act=None, + name='fpn_down_g%d_2' % i) # print("g[{}] shape: {}".format(i, g[i].shape)) g[2] = fluid.layers.elementwise_add(x=g[1], y=h[2]) g[2] = fluid.layers.relu(g[2]) - g[2] = conv_bn_layer(input=g[2], num_filters=num_outputs[2], - filter_size=3, stride=1, act='relu', name='fpn_down_fusion_1') - g[2] = conv_bn_layer(input=g[2], num_filters=num_outputs[2], - filter_size=1, stride=1, act=None, name='fpn_down_fusion_2') + g[2] = conv_bn_layer( + input=g[2], + num_filters=num_outputs[2], + filter_size=3, + stride=1, + act='relu', + name='fpn_down_fusion_1') + g[2] = conv_bn_layer( + input=g[2], + num_filters=num_outputs[2], + filter_size=1, + stride=1, + act=None, + name='fpn_down_fusion_2') return g[2] def SAST_Header1(self, f_common): """Detector header.""" #f_score - f_score = conv_bn_layer(input=f_common, num_filters=64, filter_size=1, stride=1, act='relu', name='f_score1') - f_score = conv_bn_layer(input=f_score, num_filters=64, filter_size=3, stride=1, act='relu', name='f_score2') - f_score = conv_bn_layer(input=f_score, num_filters=128, filter_size=1, stride=1, act='relu', name='f_score3') - f_score = conv_bn_layer(input=f_score, num_filters=1, filter_size=3, stride=1, name='f_score4') + f_score = conv_bn_layer( + input=f_common, + num_filters=64, + filter_size=1, + stride=1, + act='relu', + name='f_score1') + f_score = conv_bn_layer( + input=f_score, + num_filters=64, + filter_size=3, + stride=1, + act='relu', + name='f_score2') + f_score = conv_bn_layer( + input=f_score, + num_filters=128, + filter_size=1, + stride=1, + act='relu', + name='f_score3') + f_score = conv_bn_layer( + input=f_score, + num_filters=1, + filter_size=3, + stride=1, + name='f_score4') f_score = fluid.layers.sigmoid(f_score) # print("f_score shape: {}".format(f_score.shape)) #f_boder - f_border = conv_bn_layer(input=f_common, num_filters=64, filter_size=1, stride=1, act='relu', name='f_border1') - f_border = conv_bn_layer(input=f_border, num_filters=64, filter_size=3, stride=1, act='relu', name='f_border2') - f_border = conv_bn_layer(input=f_border, num_filters=128, filter_size=1, stride=1, act='relu', name='f_border3') - f_border = conv_bn_layer(input=f_border, num_filters=4, filter_size=3, stride=1, name='f_border4') + f_border = conv_bn_layer( + input=f_common, + num_filters=64, + filter_size=1, + stride=1, + act='relu', + name='f_border1') + f_border = conv_bn_layer( + input=f_border, + num_filters=64, + filter_size=3, + stride=1, + act='relu', + name='f_border2') + f_border = conv_bn_layer( + input=f_border, + num_filters=128, + filter_size=1, + stride=1, + act='relu', + name='f_border3') + f_border = conv_bn_layer( + input=f_border, + num_filters=4, + filter_size=3, + stride=1, + name='f_border4') # print("f_border shape: {}".format(f_border.shape)) - + return f_score, f_border def SAST_Header2(self, f_common): - """Detector header.""" + """Detector header.""" #f_tvo - f_tvo = conv_bn_layer(input=f_common, num_filters=64, filter_size=1, stride=1, act='relu', name='f_tvo1') - f_tvo = conv_bn_layer(input=f_tvo, num_filters=64, filter_size=3, stride=1, act='relu', name='f_tvo2') - f_tvo = conv_bn_layer(input=f_tvo, num_filters=128, filter_size=1, stride=1, act='relu', name='f_tvo3') - f_tvo = conv_bn_layer(input=f_tvo, num_filters=8, filter_size=3, stride=1, name='f_tvo4') + f_tvo = conv_bn_layer( + input=f_common, + num_filters=64, + filter_size=1, + stride=1, + act='relu', + name='f_tvo1') + f_tvo = conv_bn_layer( + input=f_tvo, + num_filters=64, + filter_size=3, + stride=1, + act='relu', + name='f_tvo2') + f_tvo = conv_bn_layer( + input=f_tvo, + num_filters=128, + filter_size=1, + stride=1, + act='relu', + name='f_tvo3') + f_tvo = conv_bn_layer( + input=f_tvo, num_filters=8, filter_size=3, stride=1, name='f_tvo4') # print("f_tvo shape: {}".format(f_tvo.shape)) #f_tco - f_tco = conv_bn_layer(input=f_common, num_filters=64, filter_size=1, stride=1, act='relu', name='f_tco1') - f_tco = conv_bn_layer(input=f_tco, num_filters=64, filter_size=3, stride=1, act='relu', name='f_tco2') - f_tco = conv_bn_layer(input=f_tco, num_filters=128, filter_size=1, stride=1, act='relu', name='f_tco3') - f_tco = conv_bn_layer(input=f_tco, num_filters=2, filter_size=3, stride=1, name='f_tco4') + f_tco = conv_bn_layer( + input=f_common, + num_filters=64, + filter_size=1, + stride=1, + act='relu', + name='f_tco1') + f_tco = conv_bn_layer( + input=f_tco, + num_filters=64, + filter_size=3, + stride=1, + act='relu', + name='f_tco2') + f_tco = conv_bn_layer( + input=f_tco, + num_filters=128, + filter_size=1, + stride=1, + act='relu', + name='f_tco3') + f_tco = conv_bn_layer( + input=f_tco, num_filters=2, filter_size=3, stride=1, name='f_tco4') # print("f_tco shape: {}".format(f_tco.shape)) - + return f_tvo, f_tco def cross_attention(self, f_common): """ """ f_shape = fluid.layers.shape(f_common) - f_theta = conv_bn_layer(input=f_common, num_filters=128, filter_size=1, stride=1, act='relu', name='f_theta') - f_phi = conv_bn_layer(input=f_common, num_filters=128, filter_size=1, stride=1, act='relu', name='f_phi') - f_g = conv_bn_layer(input=f_common, num_filters=128, filter_size=1, stride=1, act='relu', name='f_g') + f_theta = conv_bn_layer( + input=f_common, + num_filters=128, + filter_size=1, + stride=1, + act='relu', + name='f_theta') + f_phi = conv_bn_layer( + input=f_common, + num_filters=128, + filter_size=1, + stride=1, + act='relu', + name='f_phi') + f_g = conv_bn_layer( + input=f_common, + num_filters=128, + filter_size=1, + stride=1, + act='relu', + name='f_g') ### horizon fh_theta = f_theta fh_phi = f_phi fh_g = f_g #flatten fh_theta = fluid.layers.transpose(fh_theta, [0, 2, 3, 1]) - fh_theta = fluid.layers.reshape(fh_theta, [f_shape[0] * f_shape[2], f_shape[3], 128]) + fh_theta = fluid.layers.reshape( + fh_theta, [f_shape[0] * f_shape[2], f_shape[3], 128]) fh_phi = fluid.layers.transpose(fh_phi, [0, 2, 3, 1]) - fh_phi = fluid.layers.reshape(fh_phi, [f_shape[0] * f_shape[2], f_shape[3], 128]) + fh_phi = fluid.layers.reshape( + fh_phi, [f_shape[0] * f_shape[2], f_shape[3], 128]) fh_g = fluid.layers.transpose(fh_g, [0, 2, 3, 1]) - fh_g = fluid.layers.reshape(fh_g, [f_shape[0] * f_shape[2], f_shape[3], 128]) + fh_g = fluid.layers.reshape(fh_g, + [f_shape[0] * f_shape[2], f_shape[3], 128]) #correlation - fh_attn = fluid.layers.matmul(fh_theta, fluid.layers.transpose(fh_phi, [0, 2, 1])) + fh_attn = fluid.layers.matmul(fh_theta, + fluid.layers.transpose(fh_phi, [0, 2, 1])) #scale - fh_attn = fh_attn / (128 ** 0.5) + fh_attn = fh_attn / (128**0.5) fh_attn = fluid.layers.softmax(fh_attn) #weighted sum fh_weight = fluid.layers.matmul(fh_attn, fh_g) - fh_weight = fluid.layers.reshape(fh_weight, [f_shape[0], f_shape[2], f_shape[3], 128]) + fh_weight = fluid.layers.reshape( + fh_weight, [f_shape[0], f_shape[2], f_shape[3], 128]) # print("fh_weight: {}".format(fh_weight.shape)) fh_weight = fluid.layers.transpose(fh_weight, [0, 3, 1, 2]) - fh_weight = conv_bn_layer(input=fh_weight, num_filters=128, filter_size=1, stride=1, name='fh_weight') + fh_weight = conv_bn_layer( + input=fh_weight, + num_filters=128, + filter_size=1, + stride=1, + name='fh_weight') #short cut - fh_sc = conv_bn_layer(input=f_common, num_filters=128, filter_size=1, stride=1, name='fh_sc') + fh_sc = conv_bn_layer( + input=f_common, + num_filters=128, + filter_size=1, + stride=1, + name='fh_sc') f_h = fluid.layers.relu(fh_weight + fh_sc) ###### #vertical @@ -174,31 +355,60 @@ class SASTHead(object): fv_g = fluid.layers.transpose(f_g, [0, 1, 3, 2]) #flatten fv_theta = fluid.layers.transpose(fv_theta, [0, 2, 3, 1]) - fv_theta = fluid.layers.reshape(fv_theta, [f_shape[0] * f_shape[3], f_shape[2], 128]) + fv_theta = fluid.layers.reshape( + fv_theta, [f_shape[0] * f_shape[3], f_shape[2], 128]) fv_phi = fluid.layers.transpose(fv_phi, [0, 2, 3, 1]) - fv_phi = fluid.layers.reshape(fv_phi, [f_shape[0] * f_shape[3], f_shape[2], 128]) + fv_phi = fluid.layers.reshape( + fv_phi, [f_shape[0] * f_shape[3], f_shape[2], 128]) fv_g = fluid.layers.transpose(fv_g, [0, 2, 3, 1]) - fv_g = fluid.layers.reshape(fv_g, [f_shape[0] * f_shape[3], f_shape[2], 128]) + fv_g = fluid.layers.reshape(fv_g, + [f_shape[0] * f_shape[3], f_shape[2], 128]) #correlation - fv_attn = fluid.layers.matmul(fv_theta, fluid.layers.transpose(fv_phi, [0, 2, 1])) + fv_attn = fluid.layers.matmul(fv_theta, + fluid.layers.transpose(fv_phi, [0, 2, 1])) #scale - fv_attn = fv_attn / (128 ** 0.5) + fv_attn = fv_attn / (128**0.5) fv_attn = fluid.layers.softmax(fv_attn) #weighted sum fv_weight = fluid.layers.matmul(fv_attn, fv_g) - fv_weight = fluid.layers.reshape(fv_weight, [f_shape[0], f_shape[3], f_shape[2], 128]) + fv_weight = fluid.layers.reshape( + fv_weight, [f_shape[0], f_shape[3], f_shape[2], 128]) # print("fv_weight: {}".format(fv_weight.shape)) fv_weight = fluid.layers.transpose(fv_weight, [0, 3, 2, 1]) - fv_weight = conv_bn_layer(input=fv_weight, num_filters=128, filter_size=1, stride=1, name='fv_weight') + fv_weight = conv_bn_layer( + input=fv_weight, + num_filters=128, + filter_size=1, + stride=1, + name='fv_weight') #short cut - fv_sc = conv_bn_layer(input=f_common, num_filters=128, filter_size=1, stride=1, name='fv_sc') + fv_sc = conv_bn_layer( + input=f_common, + num_filters=128, + filter_size=1, + stride=1, + name='fv_sc') f_v = fluid.layers.relu(fv_weight + fv_sc) ###### f_attn = fluid.layers.concat([f_h, f_v], axis=1) - f_attn = conv_bn_layer(input=f_attn, num_filters=128, filter_size=1, stride=1, act='relu', name='f_attn') + f_attn = conv_bn_layer( + input=f_attn, + num_filters=128, + filter_size=1, + stride=1, + act='relu', + name='f_attn') return f_attn - + def __call__(self, blocks, with_cab=False): + """ + Fuse different levels of feature map from backbone and predict results + Args: + blocks(list): feature maps from backbone + with_cab(bool): whether use cross_attention + Return: predicts + """ + # for k, v in blocks.items(): # print(k, v.shape) @@ -212,12 +422,12 @@ class SASTHead(object): f_common = fluid.layers.elementwise_add(x=f_down, y=f_up) f_common = fluid.layers.relu(f_common) # print("f_common: {}".format(f_common.shape)) - + if self.with_cab: # print('enhence f_common with CAB.') f_common = self.cross_attention(f_common) - - f_score, f_border= self.SAST_Header1(f_common) + + f_score, f_border = self.SAST_Header1(f_common) f_tvo, f_tco = self.SAST_Header2(f_common) predicts = OrderedDict() @@ -225,4 +435,4 @@ class SASTHead(object): predicts['f_border'] = f_border predicts['f_tvo'] = f_tvo predicts['f_tco'] = f_tco - return predicts \ No newline at end of file + return predicts diff --git a/ppocr/modeling/heads/rec_ctc_head.py b/ppocr/modeling/heads/rec_ctc_head.py index 84948c2b20933d0f2086a42442a420d1b6b1eeee..67adcce0fd0e0ad4bef92d2f04e5de1a9e0193b0 100755 --- a/ppocr/modeling/heads/rec_ctc_head.py +++ b/ppocr/modeling/heads/rec_ctc_head.py @@ -27,6 +27,12 @@ import numpy as np class CTCPredict(object): + """ + CTC predict + Args: + params(object): Params from yaml file and settings from command line + """ + def __init__(self, params): super(CTCPredict, self).__init__() self.char_num = params['char_num'] diff --git a/ppocr/modeling/heads/rec_srn_all_head.py b/ppocr/modeling/heads/rec_srn_all_head.py index e1bb955d437faca243e3768e24b47f4328218624..c2a701159aae3e1238b2de698ddf11ede661d09e 100755 --- a/ppocr/modeling/heads/rec_srn_all_head.py +++ b/ppocr/modeling/heads/rec_srn_all_head.py @@ -28,6 +28,13 @@ gradient_clip = 10 class SRNPredict(object): + """ + SRN: + see arxiv: https://arxiv.org/abs/2003.12294 + args: + params(dict): the super parameters for network build + """ + def __init__(self, params): super(SRNPredict, self).__init__() self.char_num = params['char_num'] @@ -39,7 +46,15 @@ class SRNPredict(object): self.hidden_dims = params['hidden_dims'] def pvam(self, inputs, others): + """ + Parallel visual attention module model + + args: + inputs(variable): Feature map extracted from backbone network + others(list): Other location information variables + return: pvam_features + """ b, c, h, w = inputs.shape conv_features = fluid.layers.reshape(x=inputs, shape=[-1, c, h * w]) conv_features = fluid.layers.transpose(x=conv_features, perm=[0, 2, 1]) @@ -98,6 +113,15 @@ class SRNPredict(object): return pvam_features def gsrm(self, pvam_features, others): + """ + Global Semantic Reasonging Module + + args: + pvam_features(variable): Feature map extracted from pvam + others(list): Other location information variables + + return: gsrm_features, word_out, gsrm_out + """ #===== GSRM Visual-to-semantic embedding block ===== b, t, c = pvam_features.shape @@ -190,7 +214,15 @@ class SRNPredict(object): return gsrm_features, word_out, gsrm_out def vsfd(self, pvam_features, gsrm_features): + """ + Visual-Semantic Fusion Decoder Module + args: + pvam_features(variable): Feature map extracted from pvam + gsrm_features(list): Feature map extracted from gsrm + + return: fc_out + """ #===== Visual-Semantic Fusion Decoder Module ===== b, t, c1 = pvam_features.shape b, t, c2 = gsrm_features.shape diff --git a/ppocr/modeling/losses/rec_attention_loss.py b/ppocr/modeling/losses/rec_attention_loss.py index 8d8d7c1359f5f5edf79aed39092fa637a6cbde03..c8d8055627f9e364f0342a5740d7bf9b0297de59 100755 --- a/ppocr/modeling/losses/rec_attention_loss.py +++ b/ppocr/modeling/losses/rec_attention_loss.py @@ -33,6 +33,7 @@ class AttentionLoss(object): predict = predicts['predict'] label_out = labels['label_out'] label_out = fluid.layers.cast(x=label_out, dtype='int64') + # calculate attention loss cost = fluid.layers.cross_entropy(input=predict, label=label_out) sum_cost = fluid.layers.reduce_sum(cost) return sum_cost diff --git a/ppocr/modeling/losses/rec_ctc_loss.py b/ppocr/modeling/losses/rec_ctc_loss.py index 3552d320978f33ec3eb032c96654eb3b7886d8c0..d443b8d50f842ea738ec8448af17667bb6bea193 100755 --- a/ppocr/modeling/losses/rec_ctc_loss.py +++ b/ppocr/modeling/losses/rec_ctc_loss.py @@ -30,6 +30,7 @@ class CTCLoss(object): def __call__(self, predicts, labels): predict = predicts['predict'] label = labels['label'] + # calculate ctc loss cost = fluid.layers.warpctc( input=predict, label=label, blank=self.char_num, norm_by_times=True) sum_cost = fluid.layers.reduce_sum(cost) diff --git a/ppocr/modeling/stns/tps.py b/ppocr/modeling/stns/tps.py old mode 100755 new mode 100644 index 24c6448d2dc85442e85aff977727ecd4af6a439e..18d0225d119800bbbf05c6b24bebd40de5bd5ca2 --- a/ppocr/modeling/stns/tps.py +++ b/ppocr/modeling/stns/tps.py @@ -70,6 +70,13 @@ class LocalizationNetwork(object): return initial_bias def __call__(self, image): + """ + Estimating parameters of geometric transformation + Args: + image: input + Return: + batch_C_prime: the matrix of the geometric transformation + """ F = self.F loc_lr = self.loc_lr if self.model_name == "large": @@ -215,6 +222,14 @@ class GridGenerator(object): return batch_C_ex_part_tensor def __call__(self, batch_C_prime, I_r_size): + """ + Generate the grid for the grid_sampler. + Args: + batch_C_prime: the matrix of the geometric transformation + I_r_size: the shape of the input image + Return: + batch_P_prime: the grid for the grid_sampler + """ C = self.build_C() P = self.build_P(I_r_size) inv_delta_C = self.build_inv_delta_C(C).astype('float32') diff --git a/ppocr/optimizer.py b/ppocr/optimizer.py index fd315cd1319d4925e893705957a42f931a39076e..90d402a6da9bc3942f1c0118f43ed7d8dd1e3597 100644 --- a/ppocr/optimizer.py +++ b/ppocr/optimizer.py @@ -29,9 +29,17 @@ def cosine_decay_with_warmup(learning_rate, step_each_epoch, epochs=500, warmup_minibatch=1000): - """Applies cosine decay to the learning rate. + """ + Applies cosine decay to the learning rate. lr = 0.05 * (math.cos(epoch * (math.pi / 120)) + 1) decrease lr for every mini-batch and start with warmup. + args: + learning_rate(float): initial learning rate + step_each_epoch (int): number of step for each epoch in training process + epochs(int): number of training epochs + warmup_minibatch(int): number of minibatch for warmup + return: + lr(tensor): learning rate tensor """ global_step = _decay_step_counter() lr = fluid.layers.tensor.create_global_var( @@ -65,6 +73,7 @@ def AdamDecay(params, parameter_list=None): params(dict): the super parameters parameter_list (list): list of Variable names to update to minimize loss return: + optimizer: a Adam optimizer instance """ base_lr = params['base_lr'] beta1 = params['beta1'] @@ -121,6 +130,7 @@ def RMSProp(params, parameter_list=None): params(dict): the super parameters parameter_list (list): list of Variable names to update to minimize loss return: + optimizer: a RMSProp optimizer instance """ base_lr = params.get("base_lr", 0.001) l2_decay = params.get("l2_decay", 0.00005) diff --git a/ppocr/postprocess/__init__.py b/ppocr/postprocess/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/ppocr/postprocess/db_postprocess.py b/ppocr/postprocess/db_postprocess.py index 0792cde0a46c6d3441d84ebd1e804083a04fb302..b04c8bc3389134bd588bc89af2d6f5d8ca061d41 100644 --- a/ppocr/postprocess/db_postprocess.py +++ b/ppocr/postprocess/db_postprocess.py @@ -24,6 +24,7 @@ import string import cv2 from shapely.geometry import Polygon import pyclipper +from copy import deepcopy class DBPostProcess(object): @@ -39,13 +40,15 @@ class DBPostProcess(object): self.min_size = 3 self.dilation_kernel = np.array([[1, 1], [1, 1]]) - def boxes_from_bitmap(self, pred, _bitmap, dest_width, dest_height): - ''' - _bitmap: single map with shape (1, H, W), - whose values are binarized as {0, 1} - ''' - - bitmap = _bitmap + def boxes_from_bitmap(self, pred, mask): + """ + Get boxes from the binarized image predicted by DB. + :param pred: the binarized image predicted by DB. + :param mask: new 'pred' after threshold filtering. + :return: (boxes, the score of each boxes) + """ + dest_height, dest_width = pred.shape[-2:] + bitmap = deepcopy(mask) height, width = bitmap.shape outs = cv2.findContours((bitmap * 255).astype(np.uint8), cv2.RETR_LIST, @@ -87,6 +90,11 @@ class DBPostProcess(object): return boxes, scores def unclip(self, box): + """ + Shrink or expand the boxaccording to 'unclip_ratio' + :param box: The predicted box. + :return: uncliped box + """ unclip_ratio = self.unclip_ratio poly = Polygon(box) distance = poly.area * unclip_ratio / poly.length @@ -96,6 +104,11 @@ class DBPostProcess(object): return expanded def get_mini_boxes(self, contour): + """ + Get boxes from the contour or box. + :param contour: The predicted contour. + :return: The predicted box. + """ bounding_box = cv2.minAreaRect(contour) points = sorted(list(cv2.boxPoints(bounding_box)), key=lambda x: x[0]) @@ -119,6 +132,12 @@ class DBPostProcess(object): return box, min(bounding_box[1]) def box_score_fast(self, bitmap, _box): + """ + Calculate the score of box. + :param bitmap: The binarized image predicted by DB. + :param _box: The predicted box + :return: score + """ h, w = bitmap.shape[:2] box = _box.copy() xmin = np.clip(np.floor(box[:, 0].min()).astype(np.int), 0, w - 1) @@ -137,13 +156,14 @@ class DBPostProcess(object): pred = pred[:, 0, :, :] segmentation = pred > self.thresh - boxes_batch = [] for batch_index in range(pred.shape[0]): - height, width = pred.shape[-2:] - mask = cv2.dilate(np.array(segmentation[batch_index]).astype(np.uint8), self.dilation_kernel) - tmp_boxes, tmp_scores = self.boxes_from_bitmap(pred[batch_index], mask, width, height) + mask = cv2.dilate( + np.array(segmentation[batch_index]).astype(np.uint8), + self.dilation_kernel) + tmp_boxes, tmp_scores = self.boxes_from_bitmap(pred[batch_index], + mask) boxes = [] for k in range(len(tmp_boxes)): diff --git a/ppocr/utils/character.py b/ppocr/utils/character.py index 97237cfa71a3d3ae0684ecbefbb2511f09bcd3a2..34067f82cb04b211224f916192da4de7bb15c9a2 100755 --- a/ppocr/utils/character.py +++ b/ppocr/utils/character.py @@ -20,15 +20,21 @@ import sys class CharacterOps(object): - """ Convert between text-label and text-index """ + """ + Convert between text-label and text-index + Args: + config: config from yaml file + """ def __init__(self, config): self.character_type = config['character_type'] self.loss_type = config['loss_type'] self.max_text_len = config['max_text_length'] + # use the default dictionary(36 char) if self.character_type == "en": self.character_str = "0123456789abcdefghijklmnopqrstuvwxyz" dict_character = list(self.character_str) + # use the custom dictionary elif self.character_type in [ "ch", 'japan', 'korean', 'french', 'german' ]: @@ -55,25 +61,27 @@ class CharacterOps(object): "Nonsupport type of the character: {}".format(self.character_str) self.beg_str = "sos" self.end_str = "eos" + # add start and end str for attention if self.loss_type == "attention": dict_character = [self.beg_str, self.end_str] + dict_character elif self.loss_type == "srn": dict_character = dict_character + [self.beg_str, self.end_str] + # create char dict self.dict = {} for i, char in enumerate(dict_character): self.dict[char] = i self.character = dict_character def encode(self, text): - """convert text-label into text-index. - input: + """ + convert text-label into text-index. + Args: text: text labels of each image. [batch_size] - - output: + Return: text: concatenated text index for CTCLoss. [sum(text_lengths)] = [text_index_0 + text_index_1 + ... + text_index_(n - 1)] - length: length of each text. [batch_size] """ + # Ignore capital if self.character_type == "en": text = text.lower() @@ -86,7 +94,15 @@ class CharacterOps(object): return text def decode(self, text_index, is_remove_duplicate=False): - """ convert text-index into text-label. """ + """ + convert text-index into text-label. + Args: + text_index: text index for each image + is_remove_duplicate: Whether to remove duplicate characters, + The default is False + Return: + text: text label + """ char_list = [] char_num = self.get_char_num() @@ -108,6 +124,9 @@ class CharacterOps(object): return text def get_char_num(self): + """ + Get character num + """ return len(self.character) def get_beg_end_flag_idx(self, beg_or_end): @@ -132,6 +151,21 @@ def cal_predicts_accuracy(char_ops, labels, labels_lod, is_remove_duplicate=False): + """ + Calculate prediction accuracy + Args: + char_ops: CharacterOps + preds: preds result,text index + preds_lod: lod tensor of preds + labels: label of input image, text index + labels_lod: lod tensor of label + is_remove_duplicate: Whether to remove duplicate characters, + The default is False + Return: + acc: The accuracy of test set + acc_num: The correct number of samples predicted + img_num: The total sample number of the test set + """ acc_num = 0 img_num = 0 for ino in range(len(labels_lod) - 1): @@ -189,6 +223,14 @@ def cal_predicts_accuracy_srn(char_ops, def convert_rec_attention_infer_res(preds): + """ + Convert recognition attention predict result with lod information + Args: + preds: the output of the model + Return: + convert_ids: A 1-D Tensor represents all the predicted results. + target_lod: The lod information of the predicted results + """ img_num = preds.shape[0] target_lod = [0] convert_ids = [] diff --git a/ppocr/utils/corpus/occitan_corpus.txt b/ppocr/utils/corpus/occitan_corpus.txt new file mode 100644 index 0000000000000000000000000000000000000000..89baf76c9505a08593b1c3d4af4b41f0facbff01 --- /dev/null +++ b/ppocr/utils/corpus/occitan_corpus.txt @@ -0,0 +1,57559 @@ +abac +abadalhara +abadalhat +abadessa +abadiá +abadial +abadòt +abagièra +abaiant +abairara +abairat +abaissada +abaissaira +abaissaire +abaissament +abaissara +abaissatl +abaissatge +abajaniri +abajanit +abalandrara +abalandrat +abalausida +abalausiment +abalausiri +abalausit +abalç +abalçarg +abalçat +abalhara +abalhat +abaliment +abaliri +abalit +abandara +abandat +abandeirar +abandeirat +abandiera +abandierat +abandierèri +abandièric +abandon +abandonadament +abandonaira +abandonaire +abandonament +abandonara +abandonat +abans +abaranhara +abaranhat +abarbador +abarbara +abarbassiri +abarbat +abarbelarb +abarbelat +abarbelèri +abarbèlic +abarca +abarcorit +abardal +abarrara +abarrat +abarreja +abarrejadís +abarrejament +abarrejarg +abarrejat +abarronara +abarronat +abartassiment +abartassiri +abartassit +abasaclara +abasaclat +abasaniment +abasaniri +abasanit +abasara +abasat +abasimara +abasimat +abasoirara +abasoirat +abastament +abastara +abastardiment +abastardiri +abastardit +abastat +abat +abatalhara +abatalhat +abatatge +abateira +abateire +abatelara +abatement +abatent +abatret +abaucament +abaucarg +abauçarg +abaucat +abauçat +abaudiment +abaudiri +abaudit +abaumara +abaumat +abauquiment +abauquiri +abauquit +abaus +abausament +abausara +abausat +abausidor +abausiment +abausiri +abausissent +abausit +abausonadura +abausonaira +abausonaire +abausonara +abausonat +abautiment +abautiri +abautit +abdicarg +abdicat +abdomèn +abduccion +abèca +abecada +abecadara +abecadat +abècan +abecar +abecarb +abecaraix +abècas +abecat +abecat +abecatge +abecavif +abecé +abecedari +abelan +abelana +abelarb +abelat +abelèrid +abelh +abelha +abelhaire +abelhana +abelhara +abelhard +abelhat +abelhièr +abelhòla +abèlic +abelida +abelièr +abeliment +abeliri +abelit +abelit +abelitriri +abelitrit +abeluc +abelugarg +abelugat +abenadura +abenaira +abenaire +abenal +abenara +abenat +abenatge +abencarg +abencat +abèque +abequem +abèquen +abequèrid +abequèriw +abèques +abequetz +abèquie +aberara +aberat +abernós +aberoniri +aberracion +abesalara +abesalat +abeson +abespiaraz +abessiment +abessiri +abessit +abestialara +abestialat +abestiassara +abestiassat +abestiment +abestiri +abestit +àbets +abeurada +abeurador +abeurara +abeurat +abeuratge +abeure +abiaissara +abiaissat +Abidjan +abil +abila +abilament +abilesa +abiletat +abilhada +abilhament +abilhara +abilhat +abilhatge +abilitacion +abilitara +abilitat +abís +abismara +abismat +abisme +abispara +abispat +abissara +abissat +abit +abitabla +abitable +abitacion +abitacle +abitador +abitanta +abitara +abitarèla +abitat +abitatge +abitual +abituala +abitualament +abituaraz +abituat +abitud +abjècta +abjècte +abjurara +abjurat +abla +ablacada +ablacadís +ablacarg +ablacat +ablacion +abladada +abladara +abladat +abladatge +abladívol +abladivola +ablanquesiri +ablanquesit +ablanquiri +ablanquit +ablasadura +ablasaira +ablasaire +ablasidura +ablasigarg +ablasigat +ablasiment +ablasiri +ablasit +ablatiri +ablatugarg +ablotar +ablotat +ablotèri +ablòti +aboalhara +abobar +abocament +aboçar +abocar +aboçaraix +abocat +aboçatge +aboçavif +abocem +abocèriw +abocetz +abòcie +abocinar +aboconar +abochardiri +abochardit +abochelar +abochinar +abodriment +abodriri +abodrit +abogriment +abogriri +abogrit +aboiarz +aboissoniment +aboissoniri +aboissonit +abolaira +abolaire +abolament +abolar +abolat +abolegarg +abolèri +abòli +abolicionisme +abolicionista +aboliment +aboliri +abonaçar +abonada +abonaira +abonaire +abonament +abonara +abonat +abonatge +abondància +abondantl +abondantal +abondara +abondatl +abondi +abondiri +abondit +abondiul +abondival +abondívoll +abondivolal +abondós +abondosa +abondosament +abonhara +abonicarg +aboniment +aboniri +abonit +aboquiri +aboquit +aboquiu +aboquiva +abòrd +abordaira +abordaire +abordar +abordatge +abordelar +abordelat +abordelèri +abordèli +abordèri +abòrdi +abordicar +abordiment +abordiri +abordit +abordonar +aborgaliment +aborgaliri +aborgalit +aboriar +aboriarai +aboriavi +aboriem +aborièri +aborietz +abòrii +aboriri +aborit +aboriu +aborlharb +aborlhat +aborlhèrid +abòrlhic +abornarb +abornat +abornèrid +abòrnic +aborniar +abornièri +abòrnii +aborrelarb +aborrelat +aborrelèrid +aborrèlic +aborriment +aborriri +aborrit +abortada +aboscar +aboscarg +aboscaraix +aboscassiment +aboscassiri +aboscassit +aboscat +aboscavif +abosidal +abosigarg +abosigat +abositl +abosquem +abosquèriw +abosquetz +abòsquie +abosquiri +abosquit +abotara +abotat +abotiment +abotiri +abotit +abotolida +abotolit +abòudriment +aboudriri +aboudrit +abòut +abovarb +abovat +abovèrid +abòvic +aboviar +abovièri +abòvii +abracarg +abracat +abracelarb +abracelat +abracelèrid +abracèlic +abraguidura +abraguiri +abraguit +abralhara +abralhat +abramada +abramadura +abramara +abramat +abramat +abrandament +abrandara +abrandat +abrara +abrasadura +abrasaira +abrasaire +abrasament +abrasara +abrasat +abrascl +abrascal +abrascairas +abrascaire +abrascament +abrascarg +abrascat +abrascatge +abrasugarg +abrasugat +abrat +abreçar +abreçarai +abreçavi +abrecem +abrecèri +abrecetz +abrèci +abregandiri +abregandit +abrenara +abrenat +abrenoncèrid +abrenonciarb +abrenonciat +abrenónciic +abreugèriw +abrèugie +abreujaira +abreujaire +abreujament +abreujar +abreujaraix +abreujat +abreujavif +abreviacion +abrial +abric +abridolara +abridolat +abrièl +abrièla +abriga +abrigada +abrigaira +abrigaire +abrigarg +abrigat +abrigatge +abril +abrilós +abrilosa +abrinara +abrinat +abrís +abriva +abrivada +abrivaira +abrivaire +abrivament +abrivara +abrivat +abroalara +abroalat +abroarza +abroat +abrocar +abrocaraix +abrocat +abrocavif +abrodament +abrodiment +abrodiri +abrodit +abrogacion +abrogar +abrogarai +abrogat +abrogatiu +abrogativa +abrogavi +abrogem +abrogetz +abroguèm +abroguèri +abroguètz +abrògui +abroncarg +abroncat +abrondara +abroquem +abroquèriw +abroquetz +abròquie +abroquidura +abroquiment +abroquiri +abroquit +abrotara +abrotat +abrotidura +abrotiment +abrotiri +abrotit +Abruç +Abruces +abrucés +abrucesa +abrupte +abscès +abscissa +abséncia +absent +absenta +absentisme +absida +absidal +absidala +absidiòla +absinta +absolguèriw +absolgut +absolucion +absoluda +absoludament +absolut +absolutisme +absolutista +absolveraix +absòlviu +absolviáiv +absòlvre +absorbiri +absorbit +absorcion +absorpcion +absouda +absout +absòuta +abstencion +abstendraix +absténer +abstenguda +abstenguèriw +abstengut +absteniu +absteniáiv +abstergiri +abstergit +abstraccion +abstrach +abstracha +abstraguèriw +abstraire +abstraraix +abstrasiu +abstrasiáiv +absurd +absurda +absurditat +abugadara +abugadat +abugadiri +abugadit +aburrelarb +aburrelat +aburrelèrid +aburrèlic +abús +abuses +ac +açà +acabada +acabadoira +acabador +acabadura +acabaira +acabaire +acabalara +acabalat +acabalhas +acabament +acabara +açabàs +acabassiri +acabassit +acabat +acabiri +acabrara +acabrat +acaçarg +acaçat +acacida +acacit +acachara +acachat +acacholara +acacholat +acacholiri +acacholit +acadèmia +acaduquiri +acaduquit +acairara +acairat +acaissalara +acaissalat +acaissara +acaissat +acajó +acalara +acalat +acalhaudara +acalhaudat +acalinara +acalinat +acalmiri +acalonjarg +acalonjat +acalorara +acalorat +acaloriri +acalorit +acalvagat +acambara +acambat +acaminaira +acaminaire +acaminament +acaminara +acaminat +açamont +acamp +acampada +acampadura +acampaira +acampaire +acampament +acampara +acampat +acampatge +acampejarg +acampejat +acampestriri +açana +acanadal +acanadoira +acanaira +acanaire +acanal +acanalara +acanalat +acanara +acanat +acanatgel +açanaut +acandesiri +acandiri +acandit +acandolarb +acandolat +acandolèrid +acandòlic +acanelarb +acanelat +acanelèrid +acanèlic +acanhara +acanhardara +acanhardat +acanhardiri +acanhardit +acanhat +acant +acantairidal +acantairitl +acantelarb +acantelat +acantelèrid +acantèlic +acanteliri +acantelit +acantiri +acantit +acantonara +acantonat +acapara +acaparara +acaparat +acaparraira +acaparraire +acaparrament +acaparrara +acaparrat +acapat +acapçadament +acapçadura +acapçarg +acapçat +acapialara +acapialat +acaponir +acaponit +acapriciarb +acapriciat +acapricièrid +acapriciic +acapta +acaptador +acaptage +acaptaira +acaptaire +acaptament +acaptara +acaptat +acapte +acaptolara +acarament +acarara +acarat +acarcanara +acarcanat +acarcaveliri +acarcavelit +acarelarb +acarelèrid +acarèlic +acarnament +acarnara +acarnassiri +acarnassit +acarnat +acarniment +acarniri +acarnit +acarpara +acarpat +acarpiri +acarpit +acarraliri +acarralit +acarreirarbr +acarreirat +acarrierarb +acarrierat +acarrierèrid +acarrièric +acarronhadiri +acarronhadit +acasara +acasat +acaselarb +acaselat +acaselèrid +acasèlic +acaseliri +acaselit +acasiri +acasit +acassit +acastelarb +acastelat +acastelèrid +acastèlic +acastilhara +acatara +acatsara +acauçarg +acauçat +acaucinara +acaumara +acaumiri +acaumit +acauradal +acauratl +açaval +acavalara +acavalgarg +accediri +accedit +accelerarb +accelerat +accelerèrid +accelèric +accent +accentuacion +accentuaraz +accentuat +accentuï +accepcion +acceptable +acceptacion +acceptar +accès +accèsses +accessibla +accession +accident +accidental +accidentala +accion +accumulara +aceirarbr +aceirat +acelarb +acelat +acelèrid +acèlic +acensaira +acensaire +acensament +acensara +acèrb +acèrba +acèrca +acercarg +acercat +acermara +acermatge +acermièr +acertament +acertanament +acertanara +acertarb +acertat +acertèrid +acèrtic +acertiri +acertit +acès +acetat +acetificarg +acetificat +acetilèn +acetona +acialara +acialat +aciatara +aciatat +acid +acide +acide +acidificat +aciditat +acidofil +acieirarbr +acieirat +acièr +acierarb +acierat +acierenc +acierèrid +acièric +acimara +acimat +acimatara +acimatat +acimelarb +acimelat +acimelèrid +acimèlic +acina +acinièr +acinsara +acinsat +acip +acipada +acipador +acipamentl +acipara +acipat +aciselarb +aciselat +aciselèrid +acisèlic +aciutl +aciutal +aciutament +acivadara +acivadat +aclafara +aclafat +aclamara +aclamat +aclancat +aclap +aclapadís +aclapadura +aclapaira +aclapaire +aclapament +aclapara +aclapassara +aclapassat +aclapat +aclapatge +aclapiri +aclapit +aclarara +aclarat +aclaresiri +aclaresit +aclenara +aclenat +aclencarg +aclimatar +aclinl +aclinal +aclinament +aclinant +aclinara +aclinat +aclon +aclonara +aclonat +aclucarg +aclucat +acne +acoassara +acoassat +acoatara +acoatat +acoblaira +acoblaire +acoblament +acoblara +acoblat +acocarrara +acocarrat +acocarriri +acocarrit +acocolador +acocolara +acocolat +acocolidal +acocoliri +acocolit +acocolitl +acoconara +acoconat +acochara +acochat +acocholara +acocholat +acodara +acodat +acodeniri +acodenit +acodesiri +acodesit +acodesitl +acodesital +acodiri +acodit +acodolara +acodolat +acogonchara +acogonchat +acoidador +acoidament +acoidara +acoidat +acoïri +acoirara +acoirat +acoissar +acoissaraix +acoissat +acoissavif +acoissèriw +acoit +acoitara +acoitat +acòl +acolada +acolament +acolara +acolarb +acolat +acolatl +acolcarg +acolcat +acolèrid +acoletriri +acolhiri +acolhit +acòlic +acolit +acolitrara +acolitrat +acolobrarb +acolobrèrid +acolòbric +acolobriment +acolonjarg +acolonjat +acoloriri +acolorit +acombliri +acomblit +acomençament +acomençança +acomençarg +acomés +acomesa +acometre +acomodaira +acomodaire +acomodament +acomodant +acomodarb +acomodat +acomodatge +acomodèrid +acomòdic +acomolaira +acomolaire +acomolara +acomolat +acomoluda +acomolut +acompanhada +acompanhaira +acompanhaire +acompanhament +acompanhara +acompanhat +acompanhejarg +acompanhejat +acompelat +acompeliri +acompelit +acompesiri +acompesit +acomplidor +acompliment +acompliri +acomplit +acomplit +aconfessidal +aconfessitl +aconfinhara +aconfinhat +aconflara +aconflat +aconsegrai +aconsègre +aconseguèri +aconsègui +aconseguiái +aconseguida +aconseguiri +aconseguit +aconselhara +aconselhat +aconsomiment +aconsomiri +aconsomit +acontentara +acontentat +acopelarb +acopelèrid +acopèlic +acoquelarb +acoquelat +acoquelèrid +acoquèlic +acoqueliri +acoquelit +acoquinara +acoquinat +acorara +acorarb +acorat +acoratjarg +acoratjat +acorbaissara +acorbaissat +acorbara +acorbat +acorcossoniment +acorcossoniri +acorcossonit +acorcha +acorchament +acorchara +acorchat +acorchil +acorchi +acorchidura +acorchièra +acorchiment +acorchinara +acorchinat +acorchiri +acorchit +acòrd +acordable +acordaira +acordaire +acordalhas +acordament +acordança +acordarb +acordat +acordatge +acordelarb +acordelat +acordelèrid +acordèlic +acordeon +acordeonista +acordèrid +acordic +acòrdil +acoreguda +acorèrid +acòric +acorreguèri +acorregut +acorrent +acórrer +acorrerai +acorri +acorriái +acorriri +acorrit +acorrocarg +acorrocat +acorsara +acorsat +acorsejarg +acorsejat +acostable +acostairara +acostairat +acostament +acostarb +acostat +acostèrid +acòstic +acostica +acostumada +acostumança +acostumara +acostumat +acotador +acotara +acotarb +acotat +acotèrid +acòtic +acotiri +acotit +acotolara +acotolat +acotradura +acotrament +acotrara +acotrat +acotrissara +acotrissat +acquisicion +acrancarg +acrancat +acrapara +acrapat +acrapuliment +acrapuliri +acrapulit +acrassimara +acrassimat +acrassiri +acrassit +acraumiri +acraumit +acreditara +acreditat +acreguda +acreguèri +acregut +acreirai +acreire +acreissement +acréisser +acreisseraix +acreissiu +acreissiáiv +acrescuda +acrescut +acresi +acresiái +acresquèriw +acrin +acrinal +acrist +acrobacia +acrobat +acrobate +acrobatic +acròc +acrocament +acrocar +acrocar +acrocaraix +acrocat +acrocavif +acrochoniri +acrochonit +acropòli +acroquem +acroquèriw +acroquetz +acròquie +acrostiri +acrostit +actara +actat +acte +actitud +actiu +activacion +activar +activisme +activista +activitat +actor +actritz +actual +actuala +actualament +actualitat +actualizacion +actualizar +acturial +acturiala +acuèissie +acuèlh +aculada +aculaira +aculaire +aculament +acularb +aculat +aculèrid +aculh +aculheira +aculheire +aculhença +aculhensa +aculhent +aculhenta +aculhida +aculhiment +aculhiri +aculhit +aculpara +aculpat +acumulacion +acumulat +acumulator +acumulats +acuòlic +acupontura +acupuntura +acusable +acusacion +acusador +acusaira +acusaire +acusament +acusara +acusat +acusat +acutorbarb +acutorbat +acutorbèrid +acutòrbic +acha +achafara +achalginara +achara +achaurara +achicarg +achorrara +achorrat +achorrida +achorriri +achorrit +achorrit +adagi +adàgio +adaliri +adalit +adamenc +adamenca +adanciri +adancit +adaptacion +adaptara +adaptat +adara +adara +adareirrat +adarieirèrid +adarièiric +adarreirarbr +adarreiratge +adarrieirarb +adarrieirat +adarrierarb +adarrierat +adarrierèrid +adarrièric +addicion +addicionar +additiu +additiva +adechal +adelida +adeliment +adeliri +adelit +adelit +adematin +adenolhara +adenolhat +adenòma +adent +aderença +aderent +aderenta +aderiri +aderit +adés +adesara +adesara +adesat +adesion +adesion +adessiatz +adestradal +adestratl +adich +adicha +adieu +adieu-siatz +adieusiatz +adiguèriw +adiraix +adire +adís +adisent +adisiu +adisiáiv +adjacent +adjacenta +adjectiu +adjunt +adjutòri +admés +admesa +admetret +administracion +administrança +administrara +administrat +administratiu +administrativa +administrator +administratritz +admiracion +admirara +admirat +admonestarb +admonestat +admonestèrid +admonèstic +adòb +adobador +adobadura +adobaira +adobaire +adobament +adobara +adobarb +adobat +adobèrid +adòbic +adobièr +adobum +adociment +adociri +adocissent +adocit +adol +adola +adolentiment +adolentiri +adolentit +adolescéncia +adolesiri +adolesit +adoloriri +adolorit +adomaiseliri +adomaiselit +adomdara +adomdat +adomergiment +adomergiri +adomergit +adomesticarg +adomesticat +adometgiri +adometgit +adompliment +adompliri +adomplit +adonara +adonat +adonc +adondara +adondat +adoniri +adonit +adopcion +adoptara +adoptat +adorarb +adorat +adorèrid +adòric +adormiri +adormit +adornarb +adornat +adorsarc +adorsat +adorsèrid +adòrsid +adosilhara +adosilhat +adossarb +adossat +adossèrid +adòssic +adracarg +adracat +adraiaraz +adraiat +adralhada +adralhara +adralhat +adralhaul +adrapiri +adrapit +adreça +adreçament +adreçarg +adreçat +adrech +adrechament +adrechara +adrechat +adrechós +adrechosa +adreiça +adreiçarg +adreiçat +adreit +adreita +adreitament +adreitara +adreitat +adreitós +adreitosa +Adriatica +aduch +aducha +aduèch +aduècha +aduguèri +aduirai +aduire +aduit +aduita +adult +adulta +adulte +adultèr +adultèra +adultèri +adulterin +adulterina +adunc +aduraciri +aduracit +aduseira +aduseire +adusi +adusiái +adusiri +adusit +adventís +advèrbi +advèrsa +adversari +adversària +advèrse +adversitat +aeracion +aerarb +aerat +aerèrid +aèric +aerian +aeriana +aerobí +aeròbi +aerobia +aeròbia +aerodinamic +aerodinamica +aerodròm +aerodròme +aeronautic +aeropòrt +aerosòl +afach +afachadal +afachador +afachaira +afachaire +afachament +afachara +afachat +afadiment +afadiri +afadit +afagotarb +afagotat +afagotèrid +afagòtic +afairament +afairara +afairat +afaissament +afaissara +afaissat +afaisselarb +afaisselat +afaisselèrid +afaissèlic +afaisseliri +afaisselit +afalandrara +afalandrat +afalara +afalat +afalcarg +afalcat +afalegarg +afalegat +afalenara +afalenat +afalhocarg +afalhocat +afalhoquiri +afalhoquit +afalida +afalit +afalquejarg +afalquejat +afalucarg +afalucat +afamaira +afamaire +afamara +afamat +afamatara +afamatat +afanador +afanaira +afanaire +afanament +afanantl +afanantal +afanara +afanat +afanatge +afangalada +afangalat +afangarg +afangat +afar +afarandara +afarandat +afardolhara +afardolhat +afardoliri +afardolit +afariri +afarit +afarnèl +afart +afartara +afartat +afartèra +afascarg +afascat +afascós +afasendara +afasendat +afastara +afastat +afastigantl +afastigantal +afastigarg +afastigat +afastigósl +afatigarg +afatigat +afatigosal +afatonimentl +afatoniri +afatonit +afatrassiri +afatrassit +afeblara +afeblat +afeblimentl +afebliri +afeblissentl +afeblissental +afeblit +afebrimentl +afebriri +afebrit +afeccionara +afeccionat +afectacion +afectat +afectuós +afemeliment +afemeliri +afemelit +afemorara +afemorat +afenador +afenairara +afenairat +afenara +afenat +afenatge +aferarb +aferat +aferèrid +afèric +aferlecada +aferlecat +afermara +afermat +afermiri +afermit +afernarb +afernat +afernèrid +afèrnic +aferonament +aferonara +aferonat +aferoniment +aferoniri +aferonit +aferrarb +aferrat +aferratjarg +aferratjat +aferrèrid +afèrric +afetgiment +afetgiri +afetgit +afetias +afeutrimentl +afeutriri +afeutrit +afevament +afevarb +afevat +afevèrid +afèvic +afgan +Afganistan +afiantara +afiantat +afiatara +afiatat +afiblament +afiblara +afiblat +aficarg +aficat +aficha +afichaira +afichaire +afichara +afichat +afichatge +afièch +afiècha +afigorida +afigorit +afilada +afiladoira +afilaira +afilaire +afilandat +afilara +afilat +afilatara +afilatat +afilhament +afilhara +afilhat +afilhatge +afin +afinador +afinaira +afinaire +afinara +afinariá +afinat +afinatge +afinfara +afinfat +afinfolara +afinfolat +afinforlara +afinforlat +afinolara +afinolat +afirmacion +afirmara +afirmat +afisant +afisara +afisat +afiscl +afiscal +afiscador +afiscalhara +afiscalhat +afiscament +afiscarg +afiscat +afistolara +afistolat +afistoliri +afistolit +afiu +afixe +aflacairiri +aflacairit +aflacament +aflacarg +aflacat +aflambairat +aflambara +aflambat +aflancarg +aflancat +aflaquesiri +aflaquesit +aflaquiment +aflaquiri +aflaquissent +aflaquit +aflat +aflatósl +aflatosal +afligent +afligiri +afligit +aflocar +aflocar +aflocaraix +aflocavif +afloquejarg +afloquejat +afloquem +afloquèriw +afloquetz +aflòquie +aflorament +aflorara +aflorat +afloriri +aflorit +afloroncada +afloroncarg +afloroncat +afloroncat +afluéncia +afluent +afluiri +afluit +afocarg +afocat +afogada +afogadura +afogaira +afogaire +afogament +afogar +afogar +afogarai +afogasset +afogat +afogavi +afoguem +afoguèri +afoguetz +afògui +afoladura +afolaira +afolaire +afolamentl +afolarb +afolastriri +afolastrit +afolat +afolatgel +afolcarg +afolcat +afolèrid +afolesiri +afolesit +afòlic +afoliment +afoliri +afoliscada +afoliscat +afolit +afomerara +afomerat +afòna +afondament +afondara +afondat +afondrament +afondrara +afondrat +afòne +afonsament +afonsara +afonsat +aforarb +aforat +aforcarg +aforcat +aforèrid +afòric +afornelarb +afornelat +afornelèrid +afornèlic +afortiment +afortiri +afortit +afortunara +afortunat +afrabara +afrabat +afrabelarb +afrabelat +afrabelèrid +afrabèlic +afrabitara +afrabitat +afrairament +afrairara +afrairat +afrairiment +afrairiri +afrairit +aframida +aframit +afranara +afranat +afrancarg +afrancat +afranhar +afranhara +afranhent +afranquiment +afranquiri +afranquit +afre +afrediri +afredit +afrégiri +afrégit +afrejoliri +afrejolit +afrescairiri +afrescairit +afrescarg +afrescat +afrescoliri +afrescolit +afresquiri +afresquit +afrèst +afretaira +afretaire +afretament +afretara +afretat +afreulidal +afreuliment +afreuliri +afreulit +afreulitl +afrevolidal +afrevolitl +africl +africal +Africa +african +african +africana +africana +afriscarg +afriscat +afrodisiac +afrodisiaca +afront +afrontadament +afrontador +afrontaira +afrontaire +afrontament +afrontara +afrontariá +afrontat +afrontós +afrontosa +afrós +afrosa +afrosament +afulhièr +afumara +afumat +afumatara +afumatat +afusolada +afusolarb +afusolat +afusolat +afusolèrid +afusòlic +afust +afustament +afustara +afustat +afustatge +agaça +agaçada +agaçament +agaçantl +agaçantal +agaçarg +agaçariá +agaçat +agaçat +agaçaton +agacejarg +agacejat +agacida +agacièr +agacin +agacit +agach +agacha +agachadoiras +agachador +agachaire +agachara +agachat +agachòlal +agachon +agachonara +agachonat +agadèus +agadeussièra +agafada +agafaire +agafall +agafara +agafaròt +agafat +agafet +agafetat +agafiara +agairara +agairat +agait +agaitada +agaitara +agaitat +agalara +agalat +agalaupara +agalaupat +agalavardiment +agalavardiri +agalavardit +agalencièr +agalhada +agalhara +agalhardiment +agalhardiri +agalhardit +agalhat +agalís +agalissara +agalissat +agalons +agambada +agambat +agamotiri +agamotit +aganchara +aganchat +agandiment +agandiri +agandit +agandonira +agandonit +aganèl +aganiment +aganiri +aganit +agansara +agansat +agantablel +agantaire +agantara +agantat +agapiri +agapit +agarachara +agarachat +agaraitara +agaraitat +agarara +agarat +agarbara +agarbat +agaric +agarlandiri +agarlandit +agarrejarg +agarrejat +agarrida +agarriment +agarriri +agarrit +agarrussiment +agarrussiri +agarrussit +agast +agata +agatenc +agatiri +agatit +agautara +agautat +agavelarb +agavelat +agavelèrid +agavèlic +agavon +agençaira +agençaire +agençament +agençarg +agençat +agéncia +agendà +agendrara +agendrat +agenolhada +agenolhador +agenolhament +agenolhara +agenolhat +agent +agerbassiri +agerbassit +agibassiri +agibassit +agibiri +agibit +agimbaira +agimbaire +agimbara +agimbat +agiment +aginara +aginat +agipida +agipit +agiri +agissent +agit +agitacion +agitara +agitat +agla +aglabiri +aglabit +agladiri +agladit +aglan +aglanara +aglanat +agland +aglandara +aglandat +aglandièr +aglandièra +aglanièr +aglanièra +aglàs +aglatiri +aglatit +aglebiri +aglebit +aglenara +aglenat +agleviri +aglevit +aglomerarb +aglomerat +aglomerèrid +aglomèric +aglotonir +aglotoniri +agoissat +agolardiri +agolardit +agolopara +agolopat +agoludara +agoludat +agoludiri +agoludit +agoluvara +agoluvat +agonisara +agonisat +agonizara +agonizat +agorara +agorat +agorbarb +agorbat +agorbèric +agòrbic +agordiri +agordit +agornirMTLQNi +agornit +agorrinara +agorrinat +agorriniri +agorrinit +agorrudara +agorrudat +agorrufara +agorrufat +agorrufiri +agorrufit +agossiri +agossit +agost +agostara +agostat +agostejarg +agostejat +agostenc +agostin +agostina +agota +agotablal +agotablel +agotada +agotara +agotat +agra +agradabla +agradablament +agradable +agradaira +agradaire +agradament +agradança +agradant +agradanta +agradara +agradat +agradatge +agradèl +agradièr +agradièra +agradièrs +agradiu +agradiva +agradivament +agradívol +agradívola +agradoça +agradós +agradosa +agrafa +agrafadoira +agralhara +agralhat +agralhon +agram +agramenassiri +agramenassit +agranada +agranaira +agranaire +agranal +agranara +agranat +agranatge +agrandiment +agrandiri +agrandit +agranhon +agranhonièr +agrapara +agrapat +agrapiment +agrapinhara +agrapinhat +agrapiri +agrapit +agrari +agrària +agrasament +agrasant +agrasara +agrasat +agrassòl +agrassolièr +agrat +agratoniri +agratonit +agraupiri +agraupit +agrautoniri +agrautonit +agravament +agravant +agravanta +agravara +agravat +agre +agredoç +agredoça +agregacion +agregar +agregar +agregarai +agregavi +agreguem +agreguèri +agreguetz +agrègui +agrejarg +agrejat +agrelha +agreloniri +agrelonit +agremoliri +agremolit +agrempiri +agrempit +agrenièr +agrepesiri +agrepesit +agrepiarb +agrepiat +agrepièrid +agrépiic +agrepiment +agrepiri +agrepit +agressiu +agressiva +agressivitat +agreu +agreujarg +agreujat +agreuliment +agreuliri +agreulit +agrèvol +agrialau +agricòla +agricultor +agricultritz +agricultura +agrifal +agrifara +agrifat +agrifol +agrimena +agrimònia +agriòta +agripara +agripat +agriri +agrit +agró +agroaraz +agroat +agroliment +agroliri +agrolit +agrolósl +agrolosal +agromelarb +agromelat +agromelèrid +agromèlic +agromeliri +agromelit +agromilhara +agromilhat +agromoliri +agromolit +agron +agronòm +agronòma +agronòme +agronomia +agropament +agropara +agropat +agropelarb +agropelat +agropelèrid +agropèlic +agror +agrosolarb +agrosolat +agrosolèrid +agrosòlic +agrotlament +agrotlarb +agrotlat +agrotlèrid +agròtlic +agrotoniri +agrotonit +agrovara +agrovassara +agrovassat +agrovat +agrum +agrumara +agrumat +agrumèl +agrumelarb +agrumelat +agrumelèrid +agrumèlic +agrumeliri +agrumelit +agrums +agrupesiri +agrupesit +agrupiri +agrupit +agrutara +agrutat +agudal +agudament +agudara +agudas +agudat +agudesa +aguer +aguèremLQN +aguères +aguèretz +aguèri +aguerlharb +aguerlhat +aguerlhèrid +aguèrlhic +aguerlhiri +aguerlhit +aguèron +aguerriri +aguerrit +aguèsse +aguèssemLQN +aguèsses +aguèssetz +aguèsson +aguèt +aguialent +aguièr +aguièra +aguinchaira +aguinchaire +aguinchament +agulha +agulhada +agulhaonat +agulhariá +agulhat +agulheirarbr +agulheirat +agulhetas +agulhièr +agulhièra +agulhon +agulhonara +agulhós +agulhosa +agur +aguraira +aguraire +agurament +agurara +agurat +agusadoira +agusadura +agusaira +agusaire +agusament +agusara +agusardiri +agusardit +agusat +aguset +agusiri +agusit +agut +agutl +aguts +ai +Aiacciu +aiça +aiçabàs +aiçai +aiçalin +aiçamont +aiçanaut +aiçaval +aice +aiceste +aicí +aicital +aicitge +aiçò +aidificarg +aiga-ròs +aiga-sal +aiga-senadièr +aiga-senhada +aiga +aigabegudal +aigabegutl +aigabolhentl +aigabolidal +aigaci +aigacorrent +aigada +aigadièrl +aigadièral +aigadina +aigador +aigadós +aigadosa +aigafòrt +aigairòl +aigal +aigalada +aigalara +aigalat +aigalós +aigalosa +aigamarina +aigamòrta +aiganafa +aiganaissent +aiganas +aiganegar +aiganegar +aiganegarai +aiganegarem +aiganegaretz +aiganegat +aiganegavi +aiganeguèri +aiganègui +aiganèu +aiganha +aiganhal +aiganhara +aiganhat +aiganhejarg +aiganhejat +aiganhós +aiganhosa +aigapendent +aigapetarèla +aigarg +aigardent +aigardentaira +aigardentaire +aigardentara +aigardentat +aigarèl +aigarèla +aigasenhadièr +aigasenhal +aigassa +aigassada +aigassara +aigassat +aigassejarg +aigassejat +aigassièr +aigat +aigat +aigatolara +aigatolat +aigatolís +aigatrebolara +aigatrebolat +aigatussara +aigatussat +aigavèrs +aigaviva +aiglentina +aigós +aigosa +aiguejarg +aiguejat +aiguièra +ailà +ailabàs +ailai +ailamont +ailanaut +ailàs +ailaval +ailí +ailò +aimabla +aimablament +aimable +aimadísl +aimadissal +aimador +aimant +aimantal +aimantara +aimantat +aimara +aimat +ainada +ainat +aira +airal +aire +airejarg +airejat +aireta +airièra +airòl +ais +aisadament +aisança +aisara +aisat +aisat +aise +aisença +aisidament +aisidença +aisina +aisinada +aisinament +aisinara +aisinat +aisinat +aisiri +aisit +aisit +aissa +aissabla +aissable +aissada +aissadèl +aissadèla +aissadon +aisse +aissejarg +aissejat +aissèl +aissèla +aisselada +aissent +aissent +aisseta +aissí +aissós +aissosa +ait +aitaben +aital +aitala +aitalas +aitales +aitanben +aitanlèu +aitanpauc +aitanplan +aitant +aitanta +aitantes +aitantis +aja +ajaçarg +ajaçat +Ajaccio +ajaguèri +ajagut +ajaire +ajamLQN +ajan +ajantiri +ajantit +ajarg +ajaraix +ajas +ajasiu +ajasiáiv +ajat +ajatz +ajavelarb +ajavelat +ajavelèrid +ajavèlic +ajoatara +ajoatat +ajoc +ajocadoiral +ajocadorl +ajocarg +ajocat +ajoguiment +ajoguiri +ajoguit +ajonch +ajoncha +ajonguèriw +ajónher +ajonheraix +ajonhiu +ajonhiáiv +ajordiu +ajornament +ajornara +ajornat +ajuda +ajudada +ajudaira +ajudaire +ajudament +ajudant +ajudarSa +ajudat +ajudi +ajulhara +ajust +ajustador +ajustaira +ajustaire +ajustamentl +ajustara +ajustat +ajustatge +ajuston +ajustòri +al +alà +ala +alabaissada +alabaissat +alabardièr +alabardiri +alabardit +alabàs +alabastre +alabatret +alabatuda +alabatut +alabatut +alabra +alabre +alabrena +Alacant +alacantin +alacantina +alacarg +alacat +alacha +alachada +alachairel +alachament +alachara +alachàs +alachat +aladal +aladara +aladat +aladonc +alagarg +alagat +alaguiarb +alaguiat +alaguièrid +alàguiic +alaiaraz +alaiat +alairara +alairat +alairon +alaitada +alaitara +alaitat +alalonga +alaluènh +alambí +alambic +alambicarg +alambicat +alambrara +alambrat +alamèla +alamont +alan +alanaut +alanç +aland +alandada +alandaira +alandaire +alandament +alandara +alandat +alandiment +alandraments +alandrara +alandrat +alandriment +alandriri +alandrit +alangoriri +alangorit +alanguiri +alanguit +alant +alantaire +alantara +alantariá +alantat +alantiri +alantit +alapeda +alapens +alara +alara +alarassara +alarassat +alargaira +alargaire +alargamentl +alargant +alarganta +alargarg +alargat +alargue +alarguiment +alarguiri +alarguit +alarí +alaricarg +alaricat +alarma +alarmament +alarmantl +alarmantal +alarmara +alarmat +alasanl +Alaska +alassairal +alassairel +alassament +alassant +alassara +alassat +alastrara +alastrat +alastrejarg +alastrejat +alat +alat +alatara +alatat +alatejarg +alatejat +alatrara +alatrat +alausa +alausaira +alausaire +alauseta +alausièr +alausièra +alaval +alavetz +alavora +alba +albada +albairada +albairara +albairat +albairat +albaironl +albalada +albanl +albanal +albanadal +albanatl +albanèl +albanés +albanesa +Albania +albar +albaran +albarda +albareda +albatròç +albavit +albeirarbr +albeirat +albenc +albenca +albèrga +albergador +albergament +albergar +albergar +albergarai +albergavi +albergièr +alberguem +alberguèri +alberguetz +albèrgui +albespin +albetal +Albi +albièira +albieirada +albieirarb +albieirat +albieirèrid +albièiric +albierarb +albierat +albierèrid +albièric +albigés +albigesa +albigòt +albigòta +albirara +albirat +albire +albom +alborara +alborat +albricòt +albricotièr +albuga +album +albumina +alcachòfa +alcalí +alcalin +alcalinisara +alcalinizara +alcaloïde +alcanilisat +alcanilizat +alçarg +alçat +alcòl +alcolemia +alcolic +alcolica +alcolisara +alcolisat +alcolizara +alcolizat +alcoòl +alcoolic +alcoolica +alcoolizar +alcotest +alcòva +alcun +alcuna +alèa +aleatòri +aleatòria +alebraudida +alebraudit +alecharb +alechat +alechèrid +alegant +aleganta +alegar +alegat +alegorada +alegorat +alègra +alegrament +alegrança +alegrarb +alegrat +alègre +alegrèrid +alegresa +alegretat +alègric +alegriri +alegrit +alèia +aleialara +aleialat +aleiçonament +aleiçonara +aleiçonat +aleitarb +aleitat +aleitèrid +alèitic +alemand +alemand +alemanda +alemanda +Alemanha +Alemanha +alen +alena +alenada +alenador +alenamentl +alenara +alenat +alendara +alendat +alende +alengadal +alengarg +alengat +alengatl +alenheirarbr +alenheirat +alenhieirarb +alenhieirat +alenhieirèrid +alenhièiric +alenhierarb +alenhierat +alenhierèrid +alenhièric +alenós +alenosa +alenpudent +alenpudenta +alenquiment +alenquiri +alenquit +alentament +alentara +alentat +alentiment +alentiri +alentit +alentornl +alerara +alerat +alèrta +alertarb +alertat +alertèrid +alèrtic +alesenc +alesenca +aleserara +aleserat +alesorara +alesorat +alestiment +alestiri +alestit +aleta +aletrara +aletrat +aleugeirarbr +aleugeirat +aleugem +aleugèri +aleugeriment +aleugeriri +aleugerit +aleugetz +alèugi +aleugieirarb +aleugieirat +aleugieirèrid +aleugièiric +aleugierarb +aleugierat +aleugierèrid +aleugièric +aleujaira +aleujaire +aleujament +aleujar +aleujarai +aleujavi +aleulatge +alevadara +alevadat +alevarb +alevat +alevèrid +alèvic +Alexàndria +alexandrin +alexandrin +alexandrina +alfà +alfa +alfabet +alfabetic +alfaiçòs +alfaiçosa +alfasega +alga +algarada +algèbra +algebric +algebrica +algoritme +alguel +alh +alhadal +alhant +alhatl +alhet +alhors +aliament +aliança +aliaraz +aliat +aliatge +aliblanc +alièchic +alienara +alienat +alifara +alifat +alifrara +alifrat +aligament +aligança +aligarg +aligàs +aligat +aligatge +aligòt +aliguièr +alimenara +alimenat +aliment +alimentara +alimentari +alimentària +alimentat +alinbara +alinbat +alincarg +alincat +alindara +alindat +alinèa +alinhament +alinjarg +alinjat +aliòs +aliron +alisa +alisador +alisaira +alisaire +alisara +alisat +alisatge +aliscarg +aliscat +alispada +alispara +alispat +aliurara +aliurat +almanac +almanacaira +almanacaire +almens +almòina +almoinièr +almoinósl +almoinosa +alobat +alobatiri +alobatit +alobiri +alogaira +alogaire +alogar +alogar +alogarai +alogatge +alogavi +aloguem +aloguèri +aloguetz +alògui +along +alongada +alongament +alongarg +alongat +alongatge +alongui +alòngui +alonhar +alonharaix +alonhat +alonhavif +alonhem +alonhèriw +alonhetz +alonzara +alonzat +alordiri +alordit +alosarb +alosat +alosèrid +alòsic +alosta +alotgem +alotgèriw +alotgetz +alòtgie +alotjar +alotjar +alotjaraix +alotjavif +alpenc +alpenca +alpin +alpina +alpinista +Alps +Alps +alquimia +alquimista +alquitran +als +Alsàcia +alsacian +alsacian +alsaciana +alt +alta +altermondialiste +alternança +alternància +alternat +alternatiu +alternatiu +alternativa +alternativa +altitud +altretant +altruïsme +aluc +alucada +alucaira +alucaire +alucalh +alucalhara +alucalhat +alucarg +alucarèl +alucat +alucriri +alucrit +aluchara +aluda +aludara +aludat +aluènhie +alugorant +alugoranta +alugorara +alugorat +alum +alumaira +alumaire +alumara +alumat +alumenament +alumenara +alumenat +alumeta +alumetaira +alumetaire +alumini +alunara +alunat +alunhament +alunhara +alunhat +aluniri +alunit +alupadís +alupadissa +alupaira +alupaire +alupara +alupat +aluquet +aluqueta +alurara +alurat +alús +alusentiment +alusentiri +alusentit +aluserpit +alusiri +alusit +alussara +alussat +alut +alutrara +alutrat +alveolada +alveolat +alvet +alzena +alzenara +alzenat +allartara +allartat +allegar +allegar +allegarai +allegat +allegavi +alleguem +alleguèri +alleguetz +allègui +allèle +allergia +allòc +allocacion +allocucion +allucinacion +allucinara +allucinat +allucinatòri +alludiri +alludit +allusion +alluvion +am +amabilitat +amac +amaçarg +amaçat +amaçolarb +amaçolat +amaçolèrid +amaçòlic +amachotida +amachotit +amadeirarbr +amadeirat +amadieirarb +amadieirat +amadieirèrid +amadièiric +amadièr +amadièra +amadierarb +amadierat +amadierèrid +amadièric +amadrara +amadrat +amadurada +amaduraira +amaduraire +amadurança +amadurara +amadurat +amadurum +amagadament +amagador +amagaira +amagaire +amagament +amagarg +amagat +amagatada +amagatal +amagatòri +amagençarg +amagençat +amagestrarb +amagestrat +amagestrèrid +amagèstric +amagriment +amagriri +amagrit +amainadada +amainadat +amainara +amainat +amainatjarg +amainatjat +amairara +amairat +amairidal +amairitl +amaisament +amaisara +amaisat +amaitinara +amaitinat +amalara +amalat +amalautiri +amalautit +amalenca +amalenquièr +amalgama +amalgamara +amalgamat +amalhara +amalhat +amaliciarb +amaliciat +amalicièrid +amalíciic +amalignara +amalignat +amaliment +amaliri +amalit +amalonara +amalonat +amaluc +amalugadís +amalugadissa +amalugadura +amalugarg +amalugat +amalugatge +amanadada +amanadara +amanadat +amanadat +amanara +amanat +amanèl +amanelarb +amanelat +amanelèrid +amanèlic +amanhagada +amanhagarg +amanhagat +amanida +amanit +amanjarg +amanjat +amanlèu +amansiment +amansiri +amansit +amantara +amantastara +amantastat +amantat +amantelarb +amantelat +amantelèrid +amantèlic +amantelida +amanteliri +amantelit +amantelit +amantoliri +amantolit +amar +amara +amarament +amaran +amarana +amarant +amarara +amarari +amarat +amarciri +amarcit +amarejarg +amarejat +amarenc +amarenca +amaresa +amaretat +amargant +amarganta +amargantara +amargantat +amargantor +amargarg +amargasson +amargat +amargenara +amargenat +amargotejarg +amargotejat +amarguejarg +amarguejat +amarguiri +amarguit +amarican +amaricana +amaridida +amaridit +amarina +amarinara +amarinàs +amarinat +amarinatge +amarinièr +amarinièra +amarinós +amarinosa +amarmiri +amarmit +amaror +amarós +amarosa +amarovièr +amarra +amarraire +amarrara +amarrat +amarratge +amarrocarg +amarrocat +amarsiri +amarsit +amarum +amarvida +amarvidament +amarviri +amarvitl +amarvit +amarziri +amarzit +amàs +amaselarb +amaselat +amaselèrid +amasèlic +amaserarb +amaserat +amaserèrid +amasèric +amassa +amassada +amassadís +amassadissa +amassador +amassaira +amassaire +amassament +amassara +amassat +amassolara +amassolat +amataira +amataire +amatara +amatarrara +amatarrat +amatat +amatida +amatigarg +amatigat +amatinara +amatinat +amatiri +amatit +amatit +amator +amatorisme +amatorisme +amautara +amautat +Amazonas +Amazonia +amazonian +amazoniana +amb +ambaissada +ambaissador +ambanara +ambanat +ambe +ambedoas +ambedós +ambicionara +ambicionat +ambiciós +ambient +ambla +ambladura +amblaira +amblaire +amblara +amblat +amblejarg +amblejat +ambola +ambrara +ambrat +ambre +ambrenc +ambrenca +ambrosia +amèba +ameboïde +ameissonara +ameissonat +ameitadara +ameitadat +amejairara +amejairat +amelada +amelaire +amelarb +amelat +amelèrid +amelhorament +amelhorara +amelhorat +amèlic +amelioracion +amèn +amenaçarg +amenacit +amenara +amenat +amendriment +amendriri +amendrit +ameniment +ameniri +amenit +amens +amenudara +amenudat +amenusament +amenusara +amenusat +amercadament +amercadara +amercadat +amercadiment +amercadiri +amercadit +America +America +american +american +americana +americana +amerindi +amerindi +ameríndia +ameríndia +ameritara +ameritat +amermament +amermara +amermat +ametist +ametista +amètla +ametlaireda +ametlièr +ametlièra +amfibi +amfibia +amfíbia +amfibiu +amiadara +amiadat +Amians +amiant +amic +amic +amical +amicala +amicalament +amicalhara +amicalhat +amidonara +amidonat +amiga +amigablament +amigable +amigadara +amigadat +amigança +amigarg +amigàs +amigat +aminçarg +aminçat +aminhardara +aminhardat +aminhardiri +aminhardit +aminhotarb +aminhotat +aminhotèrid +aminhòtic +amintadara +amintadat +amiraclara +amiraclat +amiral +amistadós +amistadosa +amistadosament +amistànça +amistançarg +amistançat +amistat +amistejarg +amistejat +amistosara +amistosat +amistraira +amistraire +amitadara +amitadat +amoblament +amoblarb +amoblat +amoblèrid +amòblic +amoçarg +amoçat +amochelarb +amochelat +amochelèrid +amochèlic +amochonament +amochonara +amochonat +amodarb +amodat +amodèrid +amòdic +amodolarb +amodolat +amodòlic +amodolonara +amodolonat +amodomèrid +amodorrara +amodorrat +amoflara +amoflat +amofliri +amoflit +amoguèriw +amogut +amoissara +amoissat +amoissiri +amoissit +amolaira +amolaire +amolarb +amolat +amolatge +amolegarg +amolegat +amolencarg +amolencat +amolèrid +amolherarb +amolherat +amolherèrid +amolhèric +amòlic +amoliment +amoliri +amolit +amolonara +amolonat +amondaut +amonedara +amonedat +amoniac +amoninara +amoninat +amonsuriri +amonsurit +amont +amontairara +amontairat +amontanhara +amontanhat +amontara +amontat +amontelarb +amontelat +amontelèrid +amontèlic +amor +amora +amoral +amorala +amorara +amorat +amorçaira +amorçaire +amorçarg +amorçat +amorçatge +amorciri +amorcit +amorejarg +amorejat +amoreta +amorèu +amorièr +amorièra +amoriscarg +amoriscat +amorós +amorosa +amorosament +amorosara +amorosat +amorosiri +amorosit +amorralhara +amorralhat +amorrara +amorrat +amorretat +amòrri +amòrria +amorrialara +amorrialat +amòrsa +amorsador +amorsarb +amorsat +amorsatge +amorsèrid +amòrsic +amortament +amortarb +amortat +amorteirarbr +amorteirat +amortèrid +amortesiment +amortesiri +amortesit +amòrtic +amortieirarb +amortieirat +amortieirèrid +amortièiric +amortierarb +amortierat +amortierèrid +amortièric +amortiment +amortiri +amortisara +amortisat +amortit +amossara +amossat +amossuriri +amossurit +amosteliri +amostelit +amotairara +amotairat +amotara +amotassara +amotassat +amotassiri +amotassit +amotat +amoteliri +amotelit +amotida +amotiri +amotit +amotit +amotoflara +amotoflat +amouraix +amòure +amòviu +amoviáiv +ampla +amplament +amplan +ample +ampliarb +ampliat +amplièrid +amplificacion +amplificarg +amplificat +àmpliic +amplitud +amplor +ampola +ampolara +ampolat +ampoleta +ampolós +ampolosa +ampon +amporièr +amputara +amputat +Amsterdam +amudiment +amudiri +amudit +amuralhada +amuralhat +amurara +amurat +amusada +amusaira +amusaire +amusament +amusant +amusanta +amusara +amusarèl +amusarèla +amusat +amusatge +ans +an +anada +anaeròbi +anaeròbia +anaerobiòsi +anafasa +anafilaxi +anaira +anairara +anairat +anaire +analgesica +analisara +analisat +analisi +analitic +analitica +anam +anament +anant +ananta +anantiri +anantit +anap +anar +anarquia +anat +anatgonisme +anatomia +anatz +anauçament +anauçarg +anauçat +anautara +anautat +anca +ancada +ancal +ancalhara +ancalhat +ancarg +ancassièr +ancat +ancau +ancessor +ancian +anciana +ancianament +ancianetat +ancola +ancolara +ancolat +ancora +ancorara +ancorat +ancoratge +anchòia +anchoiada +andalhara +andalhat +andalós +andalosa +Andalosia +andara +andat +andelièra +andèr +andèrre +andèrri +anderrièras +Andes +andin +andina +andonilha +Andòrra +andorran +andorrana +andralh +andralhós +andralhosa +andron +androna +anduèlh +ane +Anecí +aneda +anegresiment +anegresiri +anegresit +anèl +anèla +anelada +aneladura +anelatge +anelièr +anemona +anen +anequeliment +anequeliri +anequelit +anèri +anes +anestesiar +anestesièri +anestèsii +anet +anexarb +anexat +anexèrid +anèxic +àngel +angèl +angelejarg +angelejat +angelenc +angelenca +Angeles +angelic +angelica +angèlus +angevin +angevin +angevina +angeviva +Angièrs +Angieus +anglada +Anglatèrra +Anglatèrra +angle +anglés +anglés +anglesa +anglesa +anglican +anglicana +anglicanisme +anglòra +angoissa +angoissara +angoissós +angoissosa +Angòla +angolés +angolesa +angost +angròla +anguiala +anguila +anguilada +anguilat +anguilenc +anguilenca +angular +angulara +anhada +anhat +anhèl +anhèla +anhelarb +anhelat +anhelat +anhelèrid +anhèlic +anhelièr +anhelum +anhon +anicarg +anicat +anida +anièla +anientament +anientara +anientat +anilhada +anilhara +anilhat +animacion +animal +animala +animara +animat +animator +animatritz +animós +animosa +animositat +aninara +aninat +anipara +anipat +aniquiri +aniquit +anís +anisara +anisat +aniseta +anit +aniulara +aniulat +anivelament +anivelarb +anivelat +anivelèrid +anivèlic +aniversari +anivolara +anivolat +Anjau +anjavin +anjavina +Anjó +anjovin +anjovina +Ankara +anma +annadas +annadal +annada +annadida +annadièrl +annadièral +annadit +annal +annala +annalament +annatl +anneta +annèxa +annèxe +annexion +annuari +annuitat +anoaraz +anoat +anobliment +anobliri +anoblit +anocat +anocavif +anochar +anocharaix +anochat +anochavif +anochejarg +anochejat +anochèriw +anogem +anogèriw +anogetz +anojar +anojaraix +anojat +anojavif +anol +anolièr +anomalia +anonara +anonat +anonci +anóncia +anonciarb +anonciat +anoncièrid +anònciic +anonim +anonima +anonimament +anonime +anoniri +anonit +anorac +anormal +anormala +anorrida +anorrit +anosida +anosiment +anosiri +anosit +anosit +anquilòsi +ans +ansa +ànsia +ansin +ansiós +ansiosa +ansiosament +anta +antagonisme +antagonista +antagonista +antara +antarada +antartic +Antartica +antartica +Antartida +antat +antecedent +antecedenta +antecrist +antena +anterior +antibaissa +antibiotic +antibiotic +antibiotica +antic +antica +anticalha +anticambra +anticament +anticari +anticipacion +anticipara +anticipat +anticòrs +antidatara +antidatat +antidòt +antifa +antifèri +antifòna +antigène +Antilhas +antilhés +antilhesa +antiliberal +antimòni +antipalais +antipatia +antipiucèl +antipiucèla +antipòda +antipòde +antipòdi +antiquari +antiquària +antiquitat +antiquitat +antiseptic +antiseptica +antitèsi +antologia +antropofaga +antropofagia +antropofague +antropogogia +antropogogic +antropogogica +antropològ +antropològa +antropologia +antrufèl +antrun +anuèch +anuecharb +anuechat +anuechèrid +anuèchic +anuèchie +anuèg +anuègie +anuèit +anueitarb +anueitat +anueitejarg +anueitejat +anueitèrid +anuèitic +anugièr +anugiu +anugiva +anujament +anujança +anujant +anujanta +anujarg +anujat +anujor +anujós +anujosa +anular +anulara +anullacion +anullara +anullat +anús +Anvèrs +anversés +anversesa +apachonara +apachonat +apadoïr +apadoïri +apadoït +apadoït +apadoïta +apagabla +apagable +apagament +apagança +apagarg +apagat +apagelarb +apagelat +apagelèrid +apagèlic +apais +apaïsandiri +apaïsandit +apaïsaniri +apaïsanit +apaisara +apaïsara +apaisat +apaïsat +apaissara +apaissat +apaissonara +apaissonat +apalara +apalhada +apalhaira +apalhaire +apalhara +apalhassara +apalhassat +apalhat +apalhat +apalhatge +apalhum +apalmara +apalmat +apalliment +apalliri +apallit +apanaira +apanaire +apanament +apanara +apanat +apanatge +apançarg +apançat +apanochada +apanochara +apanochat +apanochiment +apanochiri +apanochit +apanolhara +apanolhat +apantiri +apantit +apapaissonara +apapaissonat +apapesiri +apapesit +apaplat +apapquetat +apaquetara +aparada +aparaira +aparaire +aparament +aparara +aparassara +aparassat +aparat +aparat +aparatge +aparcelarb +aparcelat +aparcelèrid +aparcèlic +apareguèriw +aparegut +apareissentl +aparéisser +apareisseraix +apareissiu +apareissiáiv +aparelh +aparelhaira +aparelhaire +aparelhament +aparelhara +aparelhatge +aparéncia +aparent +aparenta +aparentament +aparentament +aparentara +apàrer +apareraix +apariu +apariada +apariáiv +apariaira +apariaire +apariament +apariarb +apariatge +aparicion +aparièrih +apàriic +apariri +aparitor +aparroquiar +aparroquiar +aparroquièri +aparròquii +apartament +apartara +apartendraix +apartenguèriw +aparteniu +aparteniáiv +apartenir +apartesiri +apaselarb +apaselèrid +apasèlic +apasimarah +apasiment +apassionara +apassionat +apastara +apastatge +apastelada +apastelarb +apastelat +apastelèrid +apastèlic +apastencarg +apastrassiri +apasturara +apasturgarg +apatacarg +apatafiolarb +apatafiolèrid +apatafiòlic +apatia +apatiarb +apatièrid +apàtiic +apatiri +apatocar +apatocar +apatocaraix +apatocavif +apatoquem +apatoquèriw +apatoquetz +apatòquie +apatrassara +apatrida +apatrissara +apatuaraz +apatugarg +apauquiri +apaureiriri +apaurieriri +apauriment +apauriri +apausara +apautara +apcha +apèch +apechalara +apedaçarg +apedanhara +apegant +apeganta +apegarg +apegat +apegoniri +apeirassara +apeissonara +apeitara +apejar +apèl +apelada +apelaira +apelaire +apelament +apelant +apelanta +apelara +apelaudiri +apelenquiri +apelosiri +apellacion +apenara +apencarg +apend +apendici +apendiciti +apendrís +Apenins +apensamentiri +apensara +apensida +apensit +aperaicí +aperamont +aperaquí +aperçaupre +apercebement +apercebèriw +apercebiu +apercebiáiv +apercebraix +apercebre +apercebut +aperceure +aperdesiri +aperesiment +aperesiri +aperitiu +aperitiva +apèrt +apèrta +apèrtament +apertegada +apertegarg +apertendraix +apertenéncia +aperténer +apertenguèriw +apertengut +aperteniu +aperteniáiv +apertesiri +apès +apesanti +apesantiment +apesantiri +apesarb +apesat +apesèrid +apèsic +apetaçarg +apetaçat +apetagat +apetara +apetat +apetegarg +apetís +apetissadís +apetissara +apetissat +apetissent +apetitara +apetitat +apetitiri +apetitit +apetoïri +apetoït +apetoniri +apetonit +apetrissara +apetrissat +apetrussara +apetrussat +apevarb +apevat +apevèrid +apèvic +api +àpia +àpia +apiadaira +apiadaire +apiadara +apiadat +apiàs +apiasonara +apiasonat +apicarg +apicat +apicultor +apicultritz +apicultura +apichonesiri +apichonesit +apichoniri +apichonit +apichotiri +apichotit +apieja +apièja +apiejador +apiejar +apièr +apigresiri +apigresit +apigriment +apigriri +apigrit +apijarg +apijat +apilaira +apilaire +apilament +apilara +apilat +apilatge +apilocar +apilocaraix +apilocavif +apilonara +apilonat +apiloquem +apiloquèriw +apiloquetz +apilòquie +apilotarb +apilotèrid +apilòtic +apimpara +apimpat +apincarg +apincat +apinhara +apinhastrara +apinhastrat +apinhat +apinhelarb +apinhelat +apinhelèrid +apinhèlic +apiscarg +apiscat +àpit +apitançarg +apitançat +apitançós +apitançosa +apitarrara +apitarrat +apitonara +apitonat +apitrassara +apitrassat +aplaçarg +aplaçat +aplaissara +aplaissat +aplanadís +aplanadissa +aplanadura +aplanaira +aplanaire +aplanament +aplanara +aplanat +aplanatge +aplaneirarbr +aplaneirat +aplanhara +aplanhat +aplanhòl +aplanieirarb +aplanieirat +aplanieirèrid +aplanièiric +aplanierarb +aplanierat +aplanierèrid +aplanièric +aplanieriri +aplanierit +aplaniri +aplanit +aplanponhara +aplanponhat +aplant +aplantara +aplantat +aplasentiri +aplasentit +aplatament +aplatara +aplatat +aplatiment +aplatiri +aplatit +aplatussara +aplatussat +aplaudiment +aplaudiri +aplaudit +aplecarg +aplecat +aplech +aplecha +aplechaire +aplechara +aplechat +apleit +aplejonara +aplejonat +aplicable +aplicacion +aplicadoira +aplicador +aplicant +aplicanta +aplicarg +aplicat +aplogidal +aplogiri +aplogit +aplogitl +aplojassiri +aplojassit +aplomb +aplombara +aplombat +aplugiri +aplugit +apnèa +apocalipsi +apocòpa +apocrifa +apocrife +apoderament +apoderara +apoderat +apodessara +apodessat +apogem +apogèriw +apogetz +apogèu +apoiridiri +apoiridit +apojar +apojaraix +apojavif +apolacriri +apolacrit +apolicarg +apolicat +apolidiri +apolidit +apolinara +apolinat +apolitic +apolitica +apomacelarb +apomacelat +apomacelèrid +apomacèlic +apomelarb +apomelat +apomelèrid +apomèlic +aponch +aponchaira +aponchaire +aponchara +aponchat +aponchugarg +aponchugat +apondalha +apondeire +apondi +apondís +apondret +apondut +apontanara +apontara +apontat +apontatnat +apontelarb +apontelat +apontelèrid +apontèlic +apoparriri +apoparrit +apoplexia +apoponiri +apoponit +apòrt +aportaira +aportaire +aportarb +aportat +aportèrid +apòrtic +aposicion +apossesida +apossesiri +apossesit +apossesit +apostarb +apostat +apostèma +apostemidura +apostemiri +apostemit +apostèrid +apòstic +apostís +apostissa +apostissara +apostissat +apòstol +apostolarb +apostolat +apostolat +apostolèrid +apostòlic +apostolic +apostolica +apostròf +apostròfe +apoteòsi +apoticari +appreissental +approximativa +apracticarg +apracticat +apradara +apradat +apradiri +apradit +apraticarg +apraticat +apreciacion +apreciar +apreciar +aprecièri +aprècii +aprehendret +aprehendut +apreissament +apreissant +apreissanta +apreissarb +apreissat +apreissèrid +aprèissic +aprendís +aprendissa +aprendissatge +aprendrai +aprendre +aprene +apreneira +apreneire +aprenguèri +apreni +apreniái +aprension +aprèp +aprés +après +après-dejunar +après-miègjorn +après-sopada +apresa +aprèst +aprestaira +aprestaire +aprestarb +aprestat +aprestatge +aprestèrid +aprèstic +aprigondara +aprigondat +aprigondiment +aprigondiri +aprigondit +aprimara +aprimat +aprimatge +aprivadaira +aprivadaire +aprivadament +aprivadara +aprivadat +aprivara +aprivasara +aprivasat +aprivat +aprobatiu +aprobativa +aprocat +aprochablel +aprochada +aprochadís +aprochadissa +aprochaira +aprochaire +aprochament +aprochant +aprochanta +aprocharb +aprochèrid +apròchic +apròchi +aprodelarb +aprodelat +aprodelèrid +aprodèlic +aprodolara +aprodolat +aprofechament +aprofecharb +aprofechat +aprofechèrid +aprofeitarb +aprofeitat +aprofeitèrid +aprofèitic +aprofiaraz +aprofiat +aprofièchic +apropriament +apropriar +aproprièri +apròprii +aprovacion +aprovaira +aprovaire +aprovarb +aprovat +aprovèrid +aprovesiment +aprovesiri +aprovesit +apròvic +aproximatiu +apta +apte +aptitud +apudiri +apudit +apuègie +apuèi +apujarg +apujat +apuntara +apuntat +apurara +apurat +aquacultura +aqüacultura +aquaduc +aqüaduc +aquaducte +aqüaducte +aquaferèrid +aqüarela +aqüarèla +aquari +aqüarium +aqüatic +aquèa +aqueferarb +aqueferat +aquefèric +aquelQ +aquela +aqueles +aquereguèriw +aqueriái +aqueriri +aquerit +aquerraix +aquèrre +aquesament +aquesara +aquesat +aquesiment +aquesiri +aquesit +aquesta +aqueste +aquetara +aquetat +aquèu +aquí +aquièriu +aquilin +aquilina +aquintelarb +aquintelat +aquintelèrid +aquintèlic +aquisicion +aquissara +aquissat +aquist +aquistara +aquistat +aquit +aquitable +aquitaira +aquitaire +aquital +aquitament +aquitan +aquitana +Aquitània +Aquitània +aquitara +aquitat +aquitiarb +aquitiat +aquitièrid +aquitiic +aquiulara +aquiulat +aquò's +aquò +ar-delà-ser +ara +arab +araba +arabesc +arabi +arabi +aràbia +Arabia +aràbia +arabicada +arabicat +arabisara +arabisat +arabizara +arabizat +arada +Aragon +aragonés +aragonés +aragonesa +aragonésa +araire +aram +aramon +aramósl +aramosal +aranés +aranesa +aranha +aranhada +aranhara +aranhàs +aranhat +aranhósl +aranhosal +arbal +arbari +arbitrara +arbitrari +arbitrària +arbitrat +arbitratge +arbitratge +arboç +arboça +arbocet +arbocièra +arboradura +arboraire +arborara +arborat +arboratge +arbradas +arbralha +arbram +arbrara +arbrariá +arbrat +arbrat +arbratèl +arbre +arbrejarg +arbrejat +arbricèl +arbrilhon +arbrum +arc +arca +arcabusa +arcabusada +arcabusièr +arcada +arcaïc +arcaïca +arcaïsanta +arcaïsara +arcaïsat +arcaïsme +arcaïzara +arcaïzat +arcamina +arcana +arcanèl +arcangèl +arcarg +arcat +arcbalesta +arcbalestièr +arcbalestièra +arcèl +arcelarb +arcelat +arcelèrid +arcèlic +arcemisa +arcielons +arcolan +arçon +arçonaire +arçonara +arçonat +arctangenta +arcticle +archavescal +archavescala +archavescat +archavesque +archicancelièr +archidiague +archiduc +archiducal +archiducala +archiduquessa +archipèl +archipòt +archiprèire +architècte +archiu +archius +archivaira +archivaire +archivara +archivat +archivista +archivòlt +arda +ardada +ardal +ardalhon +ardat +ardécia +ardent +ardenta +arderécia +arderós +arderosa +ardeson +ardida +ardidament +ardidesa +ardidetat +ardièja +ardimand +ardimanda +ardiment +ardiòl +ardit +arditejarg +arditejat +ardor +ardret +ardre +are +arena +arenara +arenassa +arenat +arenc +arencada +arencarg +arencat +arencat +arenga +arengarg +arengat +arengièr +arenièr +arenièra +arenós +arenosa +arescarg +arescat +aresta +aret +argal +argalièr +argaud +argela +argelabre +argelàs +argelassièra +argelat +argelatièra +argent +argentadura +argental +argentala +argentara +argentariá +argentat +argential +argentièr +argentin +argentin +Argentina +argentina +argentiu +argentiva +argentós +argentosa +argentviu +Argeria +argerian +argeriana +argerin +argerina +Argièr +argila +argilàs +argilenc +argilenca +argilièra +argilós +argilosa +argue +argüiri +argüit +argument +argumentara +argumentat +argusin +arida +aride +ariditat +ariège +ariòla +ariscla +aristocracia +aristocrata +aritmetic +aritmetica +arjòl +arland +arlandièr +arlatenc +arlatenca +arlempada +arlempaira +arlempaire +arlempara +arlempat +arlèri +arlòt +arma +armada +armadura +armadurièr +armalhàs +armament +armanhac +armanhòl +armanhòla +armara +armari +armariás +armassièr +armassièra +armassiri +armassit +armat +armatièr +armatièra +armator +armeg +armejadura +armejaire +armejarg +armejat +armèl +armèla +armelarb +armelat +armelèrid +armèlic +armèni +armèni +Armenia +armènia +armènia +armentèla +armièr +arminàs +arminassa +armistici +armòlh +armonia +armoniós +armorican +armoricana +arna +arnadura +arnara +arnat +arnau +arnés +arnesc +arnescaire +arnescament +arnescarg +arnescat +arnescatge +arnicarg +arnicat +arnièr +arniga +arnós +arnosa +arò +arolziri +arolzit +aromatic +aromatica +aromatisara +aromatisat +aromatizara +aromatizat +aronda +arondelat +arondeta +arpa +arpada +arpalhand +arpara +arpat +arpatejarg +arpatejat +arpegador +arpegarg +arpegat +arpejarg +arpejat +arpent +arpentaire +arpentara +arpentat +arpentatge +àrpia +arpian +arpièr +arpilhon +arpinada +arpinara +arpinat +arpion +arpionara +arpionat +arpiòt +arpiri +arpissara +arpissat +arpit +arpon +arponara +arponat +arpuda +arput +arqueologia +arqueologic +arqueologica +arquet +arquetara +arquetat +arquevesque +arquièr +arquitècta +arquitècte +arquitectura +arra +arrabanada +arrabanara +arrabanat +arrabanat +arrabara +arrabat +arracacòr +arracada +arracapesiri +arracapesit +arracarg +arracat +arracat +arraflaire +arraflara +arraflat +arrajarg +arrajat +arrambaire +arrambara +arrambat +arrambatge +arrampiri +arrampit +arran +arrancador +arrancament +arrancarg +arrancat +arrancatge +arrans +arrapada +arrapador +arrapaira +arrapaire +arrapant +arrapanta +arrapara +arrapat +arrapatge +arrapent +arrapidal +arrapinara +arrapinat +arrapinhara +arrapinhat +arrapitl +arrara +arrariment +arrariri +arrarit +arras +arrasa +arrasada +arrasaire +arrasament +arrasara +arrasat +arrascassiment +arrascassiri +arrascassit +arrasolèrid +arrasòlic +arrasonaire +arrasonament +arrasonara +arrasonat +arrassara +arrassat +arrassolarb +arrassolat +arrat +arratge +arratja +arraulida +arrauliment +arrauliri +arraulit +arraulit +arrauquesiment +arrauquesiri +arrauquesit +arraus +arrè +arre +arreddesiri +arreddesit +arreddiment +arreddiri +arredèriw +arrediu +arrediáiv +arredit +arredondiment +arredondiri +arredondit +arredraix +arredre +arredut +arregandiri +arregandit +arregarg +arregardara +arregardat +arregat +arregonara +arregonat +arreirarbr +arreirat +arreiratge +arrèire +arreirotge +arreirotja +arremassiri +arremassit +arremausadís +arremausant +arremausanta +arremausara +arremausiri +arremausit +arremaussat +arremicolara +arremicolat +arremolida +arremolit +arremolitge +arremós +arremosa +arremosar +arremosara +arremosida +arremosiri +arremosit +arremosit +arrenament +arrenara +arrenat +arrendabla +arrendable +arrendaira +arrendaire +arrendament +arrendara +arrendat +arrendatge +arrendièr +arrendret +arrendut +arrengadís +arrengaire +arrengament +arrengarg +arrengat +arrengatge +arrengueirarbr +arrengueirat +arrenguieirada +arrenguieirarb +arrenguieirat +arrenguieiratge +arrenguieirèrid +arrenguièiric +arrenguierarb +arrenguierat +arrenguierèrid +arrenguièric +arrenosara +arrenosat +arrèr +arrèst +arrestacion +arrestada +arrestador +arrestaire +arrestament +arrestarb +arrestat +arrestat +arrestèrid +arrèstic +arretiri +arretit +arretnador +arretnara +arretnat +arreu +arrèu +arri +arriaire +arrialara +arrialat +arriat +arriatge +arriba +arribada +arribaire +arribal +arribament +arribara +arribat +arribatge +arrieirarb +arrieirat +arrieirèrid +arrièiric +arrièr +arrierarb +arrierat +arrierèrid +arrièric +arrigolara +arrigolat +arrigolat +arrimaire +arrimara +arrimat +arrimatge +arriponchon +arriscarg +arriscat +arrisentara +arrisentat +arrispara +arrispat +arrocar +arrocar +arrocaraix +arrocat +arrocavif +arrodarb +arrodat +arrodèrid +arròdic +arroflara +arroflat +arrogància +arrogant +arroganta +arrogantament +arrogarg +arrogat +arroïnara +arroïnat +arroïri +arroït +arronçarg +arronçat +arrondara +arrondat +arrontara +arrontat +arronzara +arronzat +arropara +arropat +arropiment +arropiri +arropit +arroplegarg +arroplegat +arroquem +arroquèriw +arroquetz +arròquie +arroquiment +arroquiri +arroquit +arrosador +arrosarb +arrosat +arrosegat +arrosentiment +arrosentiri +arrosentit +arrosèrid +arròsic +arrosiment +arrossegarg +arrossiri +arrossit +arrotinara +arrotinat +arrotlara +arrotlarb +arrotlat +arrotlèrid +arròtlic +arruc +arrucada +arrucador +arrucarg +arrucat +arrucat +arrufara +arrufat +arrugarg +arrugat +arruiri +arruit +arsa +arsagaia +arsara +arsat +arsenac +arsenal +arsenic +arser +arsi +arsiarb +arsiat +arsièrid +àrsiic +arsina +arsinada +arsinat +art +artament +artara +artat +artè +artefacte +artelh +artelhada +artelhal +artelhara +artelhat +artelhon +artemisa +artèria +arterial +arteriala +arteriòla +arterioscleròsi +artèro +artesan +artic +artica +article +articulacion +articulara +articulat +artièra +artifalha +artificial +artificiala +artifièches +artiga +artigal +artigarg +artigat +artigòi +artigòla +artilhariá +artilhièr +artimon +artisonara +artisonat +artista +artistic +artistica +arton +artús +arunan +as +as +asagada +asagadoira +asagador +asagal +asagalat +asagament +asagarg +asagat +asagatge +asaigarg +asaigat +asairara +asairat +asalbrara +asalbrat +asarbrara +asarbrat +asaròt +asarpara +asarpat +asatara +asatat +asau +asaubrara +asaubrat +asaurara +asaurat +ascenciada +ascenciarb +ascenciat +ascencièrid +ascénciic +ascençor +ascendret +ascendut +ascèsi +ascèta +ascetic +ascetica +ascetisme +asciençarg +asciençat +asciencèrid +ascienciarb +ascienciat +asciénciic +ascla +ascladoira +ascladura +asclar +asclat +ase +asec +asegada +asegadura +asegaire +asegalara +asegalat +asegarg +asegat +asegatge +aseimaire +aseimarb +aseimat +aseimèrid +asèimic +aselhonara +aselhonat +asemprada +asempraire +asemprara +asemprat +asempre +asempriu +asena +asenada +asenàs +asenenc +asenenca +asenet +asenièr +asenin +asenina +aserau +aserbarb +aserbat +aserbèrid +asèrbic +asermarb +asermat +asermèrid +asèrmic +aseron +asescarg +asescat +asexual +asfalt +asfaltara +asfaltat +asfixiara +asfixiat +asfraudatge +Asia +asiatic +asiatica +asièr +asil +asima +asimantara +asimantat +asimara +asimat +asimbara +asimbat +asimptòta +asimptotic +asimptotica +asir +asirabla +asirable +asirança +asiron +asirós +asirosa +asiròt +asma +asmatic +asmatica +asmòlhas +asolhar +asolharaix +asolhavif +asolhem +asolhèriw +asolhetz +asombralh +asombrament +asombrara +asombrat +asondament +asondara +asondat +asonglada +asonglara +asonglat +asontiment +asontiri +asontit +asora +asoraira +asoraire +asorara +asorat +asorbara +asorbat +asornara +asornat +asortament +asortarb +asortat +asortèrid +asòrtic +asortit +asorton +aspa +aspada +aspara +aspat +aspècte +asperges +aspergiri +aspergit +aspersonara +aspersonat +aspic +aspirara +aspirat +aspra +asprament +aspre +asprejarg +asprejat +aspresa +aspretat +assabentara +assabentat +assaber +assabiu +assabiáiv +assadolada +assadolaira +assadolaire +assadolament +assadolant +assadolanta +assadolara +assadolat +assadolatge +assag +assaget +assailara +assailat +assajaira +assajaire +assajarg +assajarg +assajat +assalada +assalador +assalaire +assalara +assalat +assalatge +assalejarg +assalejat +assalhiri +assalhit +assaliri +assalís +assalit +assalvatgiment +assalvatgiri +assalvatgit +assanament +assanara +assanat +assancada +assancarg +assancat +assaniment +assaniri +assanit +assargarg +assargat +assasant +assasanta +assasonada +assasonament +assasonat +assassin +assassinara +assassinat +assassonara +assassonat +assatara +assatat +assaupèriw +assaupraix +assaupre +assauput +assaut +assautara +assautat +assec +assecarg +assecariri +assecarit +assecarliri +assecarlit +assecat +assedant +assedanta +assedara +assedat +assedegarg +assedegat +assegondara +assegondat +assegraix +assègre +asseguèriw +asseguiu +asseguiáiv +asseguiri +asseguit +asseguradament +asseguraire +assegurament +assegurança +assegurara +assegurat +asseguratge +assegut +assegutara +assegutat +asseiraix +assèire +assèit +assèita +assemblaça +assemblada +assembladís +assemblament +assemblara +assemblat +assemblatge +assenara +assenat +assenhoriri +assenhorit +assentida +assentiment +assentimentada +assentimentat +assentiri +assentit +assentit +asser +assera +asserenara +asserenat +asseriri +asserit +assermarb +assermat +assermèrid +assèrmic +asserviment +asserviri +asservit +assèser +assèsiu +assesiáiv +assetador +assetadura +assetaira +assetaire +assetament +assetarb +assetat +assetegarg +assetegat +assetèrid +assetgem +assetgèriw +assetgetz +assètgie +assètic +assèti +assetiar +assetiar +assetièri +assètii +assetjar +assetjaraix +assetjavif +assètre +assietarb +assietat +assietèrid +assiètic +assignara +assignat +assimament +assimanara +assimanat +assimara +assimat +assimilacion +assimilara +assimilat +assinara +assinat +assinsara +assinsat +assisa +assisara +assisat +assisténcia +assistent +assistenta +assistiri +assistit +assitolarb +assitolat +assitolèrid +assitòlic +assiut +assiuta +assó +assobtara +assobtat +assocarg +assocat +associacion +associada +associar +associar +associat +associatiu +associativitat +associèri +assòcii +assoirara +assoirat +assolaçarg +assolaçat +assolaira +assolairara +assolairat +assolaire +assolament +assolarb +assolat +assolelhara +assolelhat +assolèrid +assòlic +assolidara +assolidat +assolum +assomada +assomadís +assomador +assomaire +assomant +assomanta +assomarb +assomat +assomatge +assomèrid +assòmic +assomiejarg +assomiejat +assomiri +assomit +assonança +assonant +assonanta +assonara +assonat +assopiment +assopiri +assopissent +assopit +assopliment +assopliri +assoplit +assordiment +assordiri +assordissent +assordissenta +assordit +assorrara +assorrat +assorriri +assorrit +assortiri +assoscairara +assoscairrat +assostadís +assostadissa +assostaire +assostara +assostat +assostatge +assostiri +assostit +assostrara +assostrat +assoudarb +assoudat +assoudèrid +assòudic +assuau +assuausara +assuausat +assuausiri +assuausit +assubjectiri +assubjectit +assucada +assucarg +assucat +assucat +assugarg +assugat +assumiri +assumit +assutilhara +assutilhat +ast +asta +astada +astadeta +astara +astat +astejarg +astejat +astèla +astelada +astelièr +astèr +asterisc +asticarg +asticat +asticatge +astièr +astièra +astor +astoret +astoretara +astoretat +astrara +astrat +astre +astrenc +astrenca +astrench +astrencha +astrénger +astrenguèriw +astrénher +astrenheraix +astrenhiu +astrennhiáiv +astrològ +astronomia +astruc +astruga +astrugarg +astrugat +astúcia +astuciós +astuciosa +astuciosament +asturian +asturiana +Astúrias +asucara +asucarg +asucat +asuèlhie +asulhar +asulharaix +asulhat +asulhavif +asulhèriw +asumara +asumat +asunada +asunara +asunat +asunat +asurpara +asurpat +atac +atacabla +atacable +atacada +atacaire +atacant-de-pas +atacant +atacanta +atacarg +atacat +ataïnara +ataïnat +ataisament +ataisara +ataisat +ataisida +ataisiri +ataisit +ataisit +atal +atal +atala +atalas +atalentara +atalentat +atales +atalhonara +atalussara +atalussat +atamarida +atamariri +atamarit +atamarit +atampara +atampat +atanben +atancarg +atancat +atànger +atanguèriw +atangut +atànher +atanhiu +atanhiáiv +atanlèu +atanpauc +atanplan +atant +atanta +atantas +atantes +atapara +atapat +atapiment +atapiri +atapit +atardadoira +atardador +atardara +atardat +atardivara +atardivat +atarir +atariri +atarzara +atarzat +atassada +atassara +atassat +atassat +atat +atatièr +atatlhonat +ataulara +ataulat +ataut +atautassiri +atautassit +atavelarb +atavelat +atavelèrid +atavèlic +atebesiment +atebesiri +atediar +atediar +atedièri +atèdii +atèf +atefiar +atefiar +atefiatge +atefièri +atèfii +ateirarbr +ateirat +ateladoira +atelara +atelat +atelatge +atemarb +atemat +atemèrid +atèmic +atemporament +atemporara +atemporat +atemporiment +atemporir +atemporiri +atemptaire +atemptara +atemptats +atemptat +Atenas +atencion +atencion +atenda +atendara +atendat +atendraix +atendret +atendresiri +atendresit +atendriment +atendriri +atendrissent +atendrissenta +atendrit +atendut +atenenc +atenenc +atenenca +atenenca +atenéncia +atenentl +atenental +aténer +aténger +atenguèriw +atengut +atengut +aténher +atenhiu +atenhiáiv +ateniu +ateniáiv +atenir +atentenaire +atentenara +atentenat +atentius +atentiva +atenuaraz +atenuat +atepiment +atepiri +atepit +atermenaira +atermenaire +atermenament +atermenara +atermenat +atermenatge +aternida +aternit +atèrrac +aterraire +aterrament +aterrarb +aterrat +aterratge +aterrèrid +aterriment +aterriri +aterrit +atesada +atesara +atesat +atessament +atessara +atessat +atestacion +atestarb +atestat +atestèrid +atèstic +atestiri +atestudiri +atestudit +atetonara +atetonat +atetoniri +atetonit +ateunarb +ateunat +ateunèric +ateunharb +ateunhat +ateunhèrid +atèunhic +ateunhiri +ateunhit +atèunib +ateuniri +ateunit +ateuntriri +ateuntrit +atge +atieirarb +atieirat +atieirèri +atièiric +atierarb +atierat +atierèrid +atièric +atilhament +atilhara +atilhat +atimbrada +atimbrat +atimonara +atimonat +atindolara +atindolat +atintara +atintat +atintelarb +atintelat +atintelèrid +atintèlic +atiri +atiralh +atiralhara +atiralhat +atirament +atirança +atirant +atiranta +atirara +atirat +atisara +atisat +atissara +atissat +atissós +atissosa +atit +atitolara +atitolat +Atlantic +Atlantic +atlantic +atlantica +Atlàs +atocament +atocar +atocar +atocar +atocaraix +atocat +atocavif +atoissara +atoissat +atòme +atomic +atomica +atomisara +atomisat +atomizara +atomizat +atopinara +atopinat +atoquem +atoquèri +atoquèriw +atoquetz +atòquic +atòquie +atorarb +atorat +atorèrid +atòric +atornara +atornat +atornelarb +atornelat +atornelèrid +atornèlic +atornhida +atornhit +atortiri +atortit +atostonara +atostonat +atots +atrabalhiri +atrabalhit +atrabalida +atrabalit +atracarg +atraçarg +atracat +atraçat +atraciment +atraciri +atracit +atrach +atrach +atracha +atrachara +atrachat +atrachelarb +atrachelat +atrachelèric +atrachèlic +atraguèriw +atraïnara +atraïnat +atrairaix +atraire +atrait +atransiri +atransit +atrantoliri +atrantolit +atrapa +atrapadissa +atrapadoira +atrapador +atrapaira +atrapaire +atrapara +atrapat +atràs +atrasent +atrasenta +atrasiu +atrasiáiv +atrassara +atrassat +atreflara +atreflat +atremoliri +atremolit +atrempara +atrempat +atrencadura +atrencaire +atrencament +atrencarg +atrencat +atrencatge +atretant +atretant +atretzenara +atretzenat +atreulara +atreulat +atribuiri +atribuit +atribut +atricarg +atricat +atrigarg +atrigat +atripassara +atripassat +atristara +atristat +atrium +atrobaira +atrobaire +atrobament +atrobarb +atrobat +atrobat +atrobèrid +atròbic +atròç +atròça +atroçament +atroçar +atroçarai +atroçat +atroçavi +atrocem +atrocèri +atrocetz +atròci +atrofiaraz +atrofiat +atropadissa +atropamentl +atropara +atropat +atropelarb +atropelat +atropelèrid +atropèlic +atrulhiment +atrulhiri +atrulhit +atrumara +atrumat +atubaire +atubal +atubament +atubara +atubat +atubatge +atucaira +atucaire +atucament +atucarg +atucat +atudador +atudara +atudat +atufegarg +atufegat +atur +aturaire +aturara +aturat +aturrara +aturrat +atusara +atusat +atzebib +au +aubal +aubaladal +aubaliga +aubaliguièr +aubavitl +aubèrga +aubergaira +aubergaire +aubergament +aubergar +aubergariá +aubergina +aubèrja +aubiaga +aubièca +aubilha +aubin +aubirara +aubirat +aubire +aubolara +aubolat +auborara +auborat +aubrespin +aubuga +auc +auca +auça +aucada +auçada +auçaire +auçament +aücarg +auçarg +auçat +aucat +auçatge +aucèl +aucèla +aucelaire +aucelalha +aucelarb +aucelariá +aucelàs +aucelejarg +aucelèrid +aucelet +aucèlic +aucelièr +aucelièra +aucelilha +aucelina +aucelum +aucièra +auciguèriw +aucir +auciraix +aucire +aucisiu +aucisiáiv +aucit +aucon +auçuda +aucun +aucun +aucuna +aucunament +auçura +auçural +auçut +audàcia +audenca +audi +audicionara +audicionat +audiéncia +audolièr +audolièra +aufanada +aufanat +aufanejarg +aufanejat +aufegarg +aufegat +aufi +aufiarb +aufiat +aufièrid +àufiic +augan +augment +augmentacion +augmentara +augmentat +aujam +aujòl +aujòla +aujolet +aujoleta +aula +aule +aulesa +auletl +aulor +aumalha +aumòina +aumòrna +auna +aunara +aunat +auniri +aunit +aupenc +aupenca +aupeta +aupetara +aupetat +auque +auqueta +auquièr +auquièra +aur +aura +aurà +aurada +auragan +auragarg +auragat +aurai +auràn +auràs +aurassa +auratge +auratgejarg +auratgjat +auratjós +auratjosa +aure +aurec +aureirarbr +aureirat +aurejarg +aurejat +aurelarb +aurelat +aurelèrid +aurelha +aurelhada +aurelhal +aurelhara +aurelhat +aurelhau +aurelhejarg +aurelhejat +aurelheta +aurelhièira +aurelhièr +aurelhon +aurelhós +aurelhosa +aurelhuda +aurelhut +aurèlic +auremLQN +aureòla +aureta +auretz +auriá +auriái +auriamLQN +aurián +auriás +auriatz +aurieirarb +aurieirat +aurieirèrid +aurièiric +aurièra +aurierarb +aurierat +aurierèrid +aurièric +aurifiant +aurificarg +aurificat +auriflam +aurifòlh +aurilhagués +aurilhaguesa +aurinhòl +aurinholièr +auriòl +auriolada +auripèl +auripelarb +auripelat +auripelèrid +auripèlic +auristre +auriu +auriva +aurivèl +aurivèla +aurivelaire +aurivelariá +auròra +aurós +aurosa +auruga +aurugarg +aurugat +aus +ausadament +ausador +ausaira +ausaire +ausara +ausard +ausarda +ausardament +ausardariá +ausardièr +ausardièra +ausat +ausbèrg +auseira +auseire +ausèl +ausent +ausenta +ausèrda +ausèri +auserunas +ausibla +ausiblament +ausible +ausida +ausidoira +ausidor +ausiment +ausin +ausina +ausiri +ausit +aussent +aussent +ausserés +ausseressa +Aussèrra +ausserrés +ausserresa +austarda +Austràlia +Australia +australian +australiana +Àustria +austriac +austriaca +austrian +austriana +aut +auta +autan +autanèl +autejarg +autejat +autenc +autenca +autentificacion +autentificarg +autentificat +autesa +autièr +autièra +autinada +autisme +autiu +autiva +autò +autobiografic +autocorreccion +autoctòn +autoctònes +autodeterminacion +autogamia +autòguidada +autòguidat +autolisi +automatica +automaticament +automatizacion +automatizar +automitralhaira +automnal +automnala +automne +automobila +auton +autonada +autonara +autonat +autonejarg +autonejat +autonenc +autonenca +autonièr +autonièra +autonòm +autonòma +autonòme +autonomia +autopista +autopollinisara +autopollinisat +autopollinizara +autopollinizat +autòpropulsada +autòpropulsat +autor +autorisara +autorisat +autoritari +autoritària +autoritat +autorizacion +autorizara +autorizat +autra +autrament +autre +autreg +autrejaire +autrejament +autrejarg +autrejat +autrú +auturós +auturosa +auvari +auvàs +auve +auvèrnha +auvernhat +auvernhata +auxiliar +avacassiri +avacassit +Avairon +avajon +aval +avalada +avaladara +avaladat +avaladoira +avalaira +avalaire +avalancada +avalancament +avalancarb +avalancat +avalanquèrid +avalanquic +avalara +avalat +avalat +avalentara +avalentat +avalida +avaliment +avaliri +avalisca +avaliscarb +avaliscat +avalisquèrid +avalisquic +avalit +avaloracion +avalorara +avalorat +avaluaraz +avaluat +avan +Avana +avana +avanara +avanat +avança +avançada +avançaire +avançament +avançarg +avançat +avancièr +avanciu +avanciva +avanèl +avanela +avanés +avanesa +avaniment +avaniri +avanit +avanit +avant-braç +avant +avantant +avantara +avantat +avantatge +avantatjarg +avantatjat +avantatjós +avantatjosa +avantatjosament +avantcorreire +avantdarrièr +avantdarrièra +avantgarda +avantgost +avantiri +avantit +avantongan +avantportal +avantprepaus +avar +avara +avarament +avarara +avarat +avarécia +avareciós +avareciosa +avareciosament +avarejarg +avarejat +avarent +avarenta +avasara +avasat +avastara +avastat +avaussièr +avedilhara +avedilhat +avedre +aveire +avelana +avelaneda +avelanieirada +avelanièr +avelanièra +avelatièr +avèmLQN +avena +avenara +avenàs +avenat +avenat +avenc +avencarg +avencat +avenciment +avenciri +avencit +avendraix +avenença +avenent +avenent +avenguda +avenguèriw +avengut +avengut +aveniu +aveniáiv +avenidoira +avenidor +avenièra +avenir +avent +aventura +aventuraira +aventuraire +aventurament +aventurara +aventurat +aventurièr +aventurièra +aventurós +aventurosa +aver +averament +averara +averat +avercolida +avercolit +avergonhara +avergonhat +averigarg +averigat +avèrs +avèrsa +aversarb +aversat +aversenca +aversèrid +avèrsic +avertadara +avertadat +avertiment +avertiment +avertiri +avertit +avesara +avesat +avescal +avescala +avescat +avesiadiri +avesiadit +avesinara +avesinat +avesprarb +avesprat +avesprèrid +avèspric +avesque +avet +avetada +avetosa +avètz +aveusara +aveusat +aveusatge +avi +aviá +avia +aviacion +aviada +aviada +aviái +avial +aviam +aviament +avián +aviaraz +aviás +aviat +aviat +aviator +aviatritz +aviatz +avidament +avidara +avidat +avidatge +avigorara +avigorat +aviliment +aviliri +avilit +avinagriri +avinagrit +avinament +avinara +avinassara +avinassat +avinat +avinatara +avinatat +Avinhon +avinhonenc +avinhonenca +avion +avís +avisada +avisaire +avisament +avisara +avisat +avispara +avispat +avistara +avistat +avitalhaire +avitalhament +avitalhara +avitalhat +avitara +avitat +avivada +avivador +avivaira +avivaire +avivara +avivat +avivatge +avoacion +avoaraz +avoat +avoat +avocassara +avocassat +avocat +avocata +avocatalha +avocatejarg +avocatejat +avodarb +avodat +avodèrid +avòdic +avogar +avogar +avogarai +avogavi +avoguem +avoguèri +avoguetz +avògui +avoiandara +avoiandat +àvol +avola +avolesa +avoliment +avoludara +avoludat +avorriri +avorrit +avortarb +avortat +avrsenc +avuda +avudre +avure +axadòi +axadòia +axe +axiòma +azard +azardara +azardat +azardièr +azardièra +azardós +azardosa +azardosament +Azerbaitjan +azòt +azotarb +azotat +azotèrid +azòtic +azur +azurara +azurat +azurejarg +azurejat +azurenc +azurenca +azurin +azurina +b +baba +babarastar +babarauda +babaraudar +babaronha +babaròt +babat +babau +babèca +babilh +babilhadís +babilhaire +babilhar +babilhard +babilhatge +babilhejargh +babina +babinard +babinejargh +babís +babissard +babòia +baboïn +baboïnaire +baboinar +babòrd +babòt +babòta +babotièra +baca +bacada +bacaire +bacaissar +bacalhau +bacargh +bacegargh +bacèiic +bacèl +bacèla +bacelada +bacelaire +bacelar +bacelatge +bacelatge +bacelejargh +bacelèri +bàcia +bacil +bacile +bacin +bacina +bacinar +bacinet +bacinièr +baclar +bacon +baconar +bacós +bacteria +bacha +bachacargh +bachada +bachal +bachalan +bachanar +bachard +bacharina +bachàs +bachassejargh +bachasson +bache +bachelièr +bachelierat +bachenar +bachòca +bachocada +bachochar +bachorlada +bachorlàs +bachucada +bachucaire +bachucargh +bada +badabèc +badada +badadís +badafa +badafièr +badaire +badalh +badalhada +badalhaire +badalhament +badalhant +badalhar +badalhatge +badalhièr +badalhòl +badalhon +badalhonar +badalhum +badaluc +badant +badar +badarèl +badarelar +badarelèri +badarèlic +badas +badasclar +badatge +badau +badavèspre +badèc +badejargh +badèrla +badiana +badièr +badin +badinada +badinaire +badinar +badinariá +badinatge +badiòl +badiu +badòc +badocar +badocar +badocarai +badocavi +badoquem +badoquèri +badoquetz +badòqui +badòrca +baducaire +baducargh +baduscargh +baga +bagada +baganar +baganaud +baganaudar +baganaudièr +bagargh +bagarra +bagas +bagassa +bagassalha +bagassar +bagassariá +bagassejargh +bagassièr +bagatèla +bagatge +Bagdad +bagol +bagolant +bagolar +bagueireda +bagueta +baguetar +baguièr +Bahamas +Bahrayn +bai +baia +baiarazh +baiard +baiardar +baidracargh +bailaire +bailar +bailatge +baile +bailejargh +bailessa +bailiá +Baiona +baioneta +bais +baisada +baisador +baisadura +baisament +baisar +baisarèl +baisat +baisolar +baisolejargh +baisolèri +baisòlic +baissa +baissaire +baissalha +baissar +baissatge +baissièra +baisson +baissura +baita +baiuèrna +baiuernar +baiuèrnic +baiurnar +baiurnèri +bajal +bajan +bajana +bajanada +bajanar +bajanat +bajargh +bajat +bajaula +bajaular +bajòc +bajòca +bajocada +bajocar +bajocar +bajocarai +bajocavi +bajolada +bajolaire +bajolar +bajolatge +bajolèri +bajòlic +bajoquem +bajoquèri +bajoquetz +bajòqui +bajòt +Bakó +bal +bala +balada +balador +balafi +balag +balaire +balaja +balajadís +balajadura +balajargh +balajatge +balajum +balalin-balalan +balanç +balança +balançada +balançador +balançaire +balançament +balançargh +balançariá +balançatge +balancejargh +balancièr +balandra +balandran +balandrana +balandrar +balandrejament +balandrejargh +balar +balarèl +balàs +balassa +balassièra +balatar +balatgièr +balauças +balausta +balaustièr +balbusejargh +balbut +balç +balca +balcanic +Balcans +balcon +baldaquin +baldòca +baldra +baldraca +baldrada +baldrar +baldràs +baldrejargh +baldrós +balear +Balearas +Balearas +Balearas +balejargh +balena +balenar +balenat +balenièr +balèsta +balestada +balestièr +balestrièr +balet +balha +balhaire +balhar +balhatge +balhica-balhaca +balin-balant +balindras +balisa +balma +balmada +balmar +balmassièr +balme +balmejargh +balmèla +balmelut +balmeta +balneari +balneari +balneària +balneària +baloard +balòcha +balòfa +balon +balonar +balora +balòrna +balòta +balotaire +balotament +balotar +balotatge +balotèri +balòtic +balquejargh +balquièra +balquilha +balquina +balsamina +baltic +baltic +Baltica +balum +balusca +balustrada +balustre +bamba +bambanar +bambaròt +bambó +bambolearazh +bambonearazh +bambòrlas +bambualhas +bambuèlhas +ban +bana +banada +banal +banalitat +banana +banar +banard +banarèl +banarut +banasta +banastada +banastar +banastejargh +banastièr +banaston +banatge +banc +banca +bancada +bancairon +bancal +bancari +bancarrota +bancèl +bancor +banchard +banda +bandada +bandament +bandar +bandarèl +bandari +bandarri +bandejargh +bandèla +bandièra +bandiment +bandirh +bandison +bandit +bandol +bandolièra +banejargh +banèl +Bangkòk +Bangladèsh +bangladèshi +banh +banhada +banhadís +banhadoira +banhadura +banhar +banhassuga +banhatge +banheca +banhège +banhèja +banhejargh +banhetja +banhièr +banholejargh +banièr +banilhon +banlèga +banquilhon +banut +bara +barabastar +baragònha +baralh +baralha +baralhada +baralhadís +baralhaire +baralhar +baralhejargh +baranda +barandèla +barandelaire +barandelar +barandelèri +barandèlic +baranejargh +baranha +baranhada +baranhar +baranhau +barassega +barat +barata +barataire +baratar +baratariá +baratejargh +baratièr +barba-ros +barba +barbablanc +barbaboc +barbacana +barbada +barbadieu +Barbados +barbaisson +barbajoan +barbajòl +barbajolet +barbajòu +barbalh +barbalhaire +barbalhar +barbar +barbar +barbarament +barbaresc +barbariá +barbarin +barbarisme +barbasan +barbascle +barbasta +barbastar +barbastejargh +barbat +barbataire +barbatar +barbejargh +barbèl +barbelat +barbetar +barbètic +barbèu +barbièr +barbilhon +barbòla +barbolat +barbolh +barbolha +barbolhar +barbòt +barbòta +barbotar +barbotatge +barbotejaire +barbotejargh +barbotèri +barbotiment +barbotinar +barbotirh +barbut +barca +barcada +barcairòl +barcarés +barcassa +barcatge +barcatièr +Barcelona +barcon +bard +barda +bardada +bardanís +bardar +bardàs +bardassar +bardasson +bardat +bardatge +bardejargh +bardièr +bardinejargh +bardís +bardissar +bardolha +bardolhaire +bardolhar +bardolhatge +bardon +bardonièr +bardós +bardòt +barena +barenc +barga +bargaire +bargalejargh +bargalh +bargalhaire +bargalhar +bargalhièr +bargament +barganhaire +barganhar +barganhatge +bargargh +bargarusta +bargatejargh +bargatièr +bargolh +bargolhar +bargonar +barguilhièr +Bari +baricentre +barjacaire +barjacargh +barjargh +barlac +barlacada +barlacargh +barlambasti +barlan +barlica-barlòca +barlinga-barlanga +baromètre +baron +baronat +baronda +baronejargh +baronenc +baroniá +baronil +barquejaire +barquejargh +barquièr +barquin +barra +barraban +barrabanda +barrabin-barraban +barraca +barracament +barracanar +barracargh +barracatge +barracon +barracon +barrachèu +barradís +barradoira +barrador +barradura +barraganha +barraire +barrairon +barral +barralariá +barralejaire +barralejargh +barralejatge +barralenc +barralet +barralh +barralha +barralhar +barralhon +barralièr +barrambada +barrament +barramenta +barranc +barranca +barrancaire +barrancargh +barrancatge +barranquejargh +barranquina +barraquet +barrar +barrasc +barrascargh +barrasega +barratge +barreja +barrejada +barrejadís +barrejaire +barrejament +barrejargh +barrejatge +barrejós +barrenc +barret +barreta +barri +barrian +barrica +barricada +barricadar +barricaire +barricargh +barricat +barricòt +barrichèl +barrièr +barril +barrilaire +barrilet +barrilha +barrina +barrinada +barrinar +barròc +barrombirh +barron +barrontar +barrulatge +barrutlada +barrutlaire +barrutlar +barrutlejaire +barrutlejargh +barrutleta +bart +barta +bartabelisa +bartacoja +bartairòl +bartalejargh +bartàs +bartassada +bartassanha +bartassàs +bartassejargh +bartasses +bartassièr +bartasson +bartavèl +bartavelar +bartavelatge +bartavelejargh +bartavelèri +bartavèlic +bartigal +bartòla +bartolhar +barufa +baruiar +baruta +barutèl +barutelar +barutelèri +barutèlic +bas +basa +basana +basanar +basanat +basardejargh +basat +basc +Basc +basc +basca +bascalar +bascalhar +bascargh +Basco +basco +Bascoat +bascòja +Bàscol +bàscol +bàscol +bascula +basculament +bascular +basèl +baselic +Basilèa +basilha +basilhar +basiment +basirh +basofila +basofile +basques +basquesa +basrelèu +bassa +bassac +bassacada +bassacaire +bassacament +bassacargh +bassacatge +bassacontra +bassacula +bassaman +bassament +basses +bassesa +basset +bàssia +basson +bassor +bast +bastada +bastalha +bastança +bastant +bastar +bastard +bastardalha +bastardejargh +bastardèl +bastardièra +bastarditge +bastardon +bastarduènha +bastejada +bastejaire +bastejargh +bastejatge +bastenda +bastenga +bastengargh +bastengatge +Bastia +bastida +bastidan +bastidor +bastièr +bastilha +bastiment +bastinar +bastion +bastionar +bastirh +bastison +bastissa +baston +bastonada +bastonaire +bastonar +bastonat +bastonejargh +bastonièr +bata +bataclan +bataclar +batacular +bataculèri +batacuola +batacuolar +batacuòlic +batacuolièr +batada +batalh +batalha +batalhada +batalhador +batalhaire +batalhejargh +batalhièr +batalhòla +batalhon +batalhós +batanaire +batanar +batanpena +batar +batarèl +batariá +batatge +batèc +batedís +batedoira +batedor +bateg +bategant +bategargh +batejada +batejador +batejaire +batejalhas +batejament +batejargh +batejat +batèl +batelada +batelar +batelariá +batelatge +batelèri +batèlic +batelièr +batelon +batement +batent +batesons +batèsta +batèu +baticòr +baticorar +baticorèri +baticòric +batièr +batifòc +batifolar +batifolèri +batifòlic +batifuòc +batilha +batilhon +batiòu +batismal +batisme +batistàs +batistèri +batitge +batiu +batlèva +bàtol +batossa +batracian +batre +batut +bauç +bauca +baucargh +bauçargh +baud +baudament +baudar +baudèlha +baudesa +baudor +baudra +baudraca +baudracargh +baudrada +baudraga +baudrana +baudràs +baudrejargh +baudrièr +baudrirh +baudròi +baudrós +baudufa +baudufejaire +baudufejargh +baug +baugesa +bauget +baugièira +baugièr +baugierada +bauginard +baugitge +bauja +baujaluc +baujariá +baujás +baujum +baula +baulh +bauma +baumada +baumar +baumassièr +baume +baumejargh +baumèla +baumelut +baumeta +bauquejargh +bauquièr +bauquièra +bauruga +bausa +bausigargh +bausinar +bausiòl +baüt +bautugaire +bautugargh +bautugatge +bava +bavada +bavadura +bavaire +bavalejargh +bavar +bavard +bavardar +bavardariá +bavardejargh +bavarditge +bavarèl +bavarèla +bavarilha +bavarilhar +bavarilhejargh +bavarilhós +bavassejargh +bavatge +baveirés +bavejargh +bavèla +bavenc +baveta +Bavièra +bavierés +bavieresa +bavorlejargh +bavós +bavuna +bavunar +bavunejargh +bavut +Bearn +bearnés +beat +beatament +beatificargh +beatitud +bèc +beç +beca +bèca +bècabòsc +becada +beçada +becadura +becaina +becaire +becar +becar +becarai +beçareda +becarèl +beçaròlas +becarut +becassejargh +becat +becatge +becavi +bèccrosat +becilhar +becòla +becon +bècroge +becut +bècha +bechard +bechet +bechic +bechigargh +bechigós +bechut +bedèl +bediga +bedigassa +bedís +bedissièr +bedòs +bedossejargh +bedre +befar +befèri +bèfi +bèfic +bèfia +bèfias +befiàs +bèfis +befre +bega +begaire +begol +begolar +begolaud +begomàs +beguda +beguda +beguèri +beguina +begulejargh +begut +beiòla +bèira +Beirot +beizenar +bèl-bèl +bèl +bèladòna +bèlafilha +belaire +bèlamaire +bèlament +belament +belar +belaròia +belaròia +belàs +bèlasòr +belat +belatge +bèlcòp +belèc +beleg +belegant +belegargh +belejargh +belèri +belesa +bèlestam +bèlestàn +bèlestar +bèlestàs +bèlestatz +bèlestau +bèlèste +bèlèsten +bèlestèri +bèlèstes +belet +bèlfilh +bèlfraire +bèlga +bèlga +Belgica +Belgrad +bèlic +belicòca +belicoquièr +belièra +belin +belitralha +belitrar +belitre +Belize +bèlmal +belòi +belor +belòria +beloriar +belorièri +belòriic +belòt +bèlpaire +bèlparièr +beluc +beluga +belugada +belugament +belugant +belugargh +beluguejaire +beluguejament +beluguejant +beluguejargh +beluguejatge +beluguet +belugueta +beluguièr +belura +bèlvéser +ben +bena +benadrech +benaimat +benaise +benalha +benanança +benanant +Benarès +benàs +benastrar +benastre +benastruc +benastrugargh +benaürança +benaürar +benaürat +benaürós +benc +bencada +bencat +bencut +benda +bendar +bendatge +bendèl +bendich +bendisença +bendisent +bendon +benechièr +benediccion +benefici +beneseire +benesida +benesirh +benestà +benestam +benestàn +benestança +benestant +benestar +benestàs +benestatz +benestau +benèste +benèsten +benestèri +benèstes +benestruch +benestrut +benevòl +benfà +benfach +benfacha +benfachor +benfaga +benfagam +benfagan +benfagas +benfagatz +benfaguèri +benfaire +benfait +benfait +benfaita +benfaitor +benfan +benfarai +benfas +benfasèm +benfasença +benfasent +benfasètz +benfasiá +benfasiái +benfasiam +benfasián +benfasiás +benfasiatz +benfau +benignament +benigne +benignetat +Benin +beninés +benlèu +benorrit +benparlant +benquilhon +bensai +bentic +bentica +benurar +benvenguda +benvist +benvolença +benvolent +benvoler +benvolguda +benvolguèri +benvolgut +benvòli +benvoliái +benvolrai +benvòls +bequèina +bequem +bequèri +bequetz +bèqui +bera +bèra +beral +berbal +berbeluda +berbesina +bèrbia +berbilhar +berbilhinar +bèrc +bèrca +bercada +bercadura +bercalha +bercar +bercar +bercarai +bercavi +berdolha +berenguièra +Bergam +bergamasc +bergamòta +bergamotièr +bergièr +bericle +berigola +beringuièr +bèrla +berland +berlandejargh +berlandièr +bèrle +berlenga +berlet +berlha +berlhièra +Berlin +berlinés +berlong +berluga +Bèrna +bernada +bernadàs +bernat +bernés +beron +berquem +berquèri +berquetz +bèrqui +berquilhós +bèrre +berret +berreta +berretaire +berretièr +Berrí +bèrria +berrigaud +berrinalha +berrinat +bèrsa +bèrta +bertal +bertat +berzenar +bes +besa +besada +besal +besalada +besalar +besalenada +besalenaire +besalenar +besalièra +besalon +Besançon +besançonés +besavi +besàvia +bescairar +bescaire +bescairòla +bescalent +bescambi +bescambiar +bescambièri +bescàmbiic +bescant +bescantaire +bescantar +bescantatge +bescaume +bescle +besclic +bescoa +bescòga +bescògan +bescògas +bescoguèri +bescoirai +bescoire +bescòl +bescomptar +bescompte +bescòr +bescornut +bescòsi +bescosiái +bescuchaire +bescuchar +bescuchèl +bescuchèla +bescuèch +bescuècha +bescuèire +bescuèit +bescuèita +bescutèl +besegonha +besenar +besenha +besierenc +besièrs +besigargh +beslièch +beslièt +besonh +besonh +besonha +besonhar +besonhejargh +besonhós +besonhs +besquilhar +bessa +bessada +bessauta +bessautar +besson +bessonada +bessonar +bessonièra +bessonitge +bestejaire +bèstia +bestial +bestialenc +bestialièr +bestiàs +bestiassada +bestiejargh +bestiesa +bestiòl +bestion +bestiorlada +bestiòta +bestiraire +bestirar +bestiratge +bestitge +bestiut +bestoquet +bestorn +bestornaire +bestornament +bestornar +bestornat +bestorre +bestòrt +bestortièr +bestrach +bestracha +bestraguèri +bestrairai +bestraire +bestrait +bestraita +bestrasi +bestrasiái +besuc +besuca +besucaire +besucargh +besucariá +besucós +besuquejargh +besuquet +besusclada +besusclaire +besusclar +besusclatge +beta +Betelèm +Betleèm +betonica +betòrga +betorguièr +betum +betumar +bèu +beurai +beuratge +beure +beutat +bevable +bevassejaire +bevassejargh +bevedoira +bevedor +bevedora +beveire +bevenda +beveta +bevi +beviái +bevotejaire +bevotejargh +biaça +biacejargh +biais +biaissa +biaissar +biaissejargh +biaissós +biaissut +bialar +bialòt +biardar +biarna +biarnejargh +biauda +biauga +bibí +bíblia +biblic +bibliografia +bibliografic +bibliotèca +bibocarg +bibòtis +bica +bicador +bicargh +bicassa +bicat +biceps +bicicleta +bicicletada +bicocar +bicocar +bicocarai +bicocavi +biçòl +biçolar +biçolat +biçolèri +biçòlic +bicoquem +bicoquèri +bicoquetz +bicòqui +bicorlada +bicòt +bicha +bichada +bichet +bichièr +bichon +bichòt +bidorlet +bidorne +bidòrs +bidorsada +bidorsaire +bidorsar +bidorsejargh +bidorsèri +bidorset +bidòrsic +bidòs +bièissa +bieissar +bieissèri +bièissic +bielorús +bielorusses +Bielorussia +bielorussia +bièrra +bifurcargh +biga +bigal +bigalhar +bigargh +bigaradièr +bigard +bigardar +bigarrada +bigarradura +bigarrar +bigarratge +bigarratièr +bigarrèu +bigatan +bigatana +bigatar +bigatatge +bigolant +bigon +bigòrn +bigornar +bigornau +bigornèri +bigòrnic +bigòs +bigòssa +bigossar +bigossèri +bigòssic +bigòt +bijeccion +bijectiu +bila +bilanç +bilançar +bilateral +bilbaïn +Bilbao +bilha +bilhador +bilhaire +bilhar +bilhard +bilhardar +bilhardèl +bilhardièr +bilhaud +bilhet +bilheta +bilhetar +bilhon +bilhonaire +bilhonar +bilhonatge +bilhòt +bilhòta +bilingüa +bilingüa +bilingüe +bilingüe +bilinguisme +biliós +bimbaròlas +bimplar +binada +binadís +binaire +binar +binari +binària +binatge +binga +bingargh +binòma +binòme +binòmi +binòms +bio +bio-etanòl +biòc +biòch +biografiarazh +biòla +biològ +biològa +biologia +biologica +biològue +biotecnologia +biotecnologic +biquejargh +biquet +biquí +biraga +birba +birbalhas +birband +birbandejargh +birbar +birbilhinar +birman +Birmania +bis +bisa +bisada +bisalar +bisalhar +bisanòt +bisar +bisarada +bisbal +bisca +biscaïn +biscant +bisçanta +biscantar +bisçantena +biscargh +biscariá +biscarlòt +biscausa +biscoalh +biscoalha +biscolon +biscós +biscre +biseccion +bisél +biselar +biselèri +bisèlic +biset +bisontin +bisort +bisquèrla +bissana +Bissau +bissautar +bissectritz +bissegargh +bissèxt +bissextar +bissextèri +bissèxtic +bissextil +bistoquet +bistorlòri +bistrar +bistre +bita +bitsacargh +biulada +biule +bivalva +bivalve +Bizanci +bizantin +blaca +blacairàs +blacargh +blacareda +blacàs +blacassada +blachin +bladada +bladal +bladariá +bladatge +bladejargh +bladièr +bladós +blaga +blagargh +blaguirh +blaimable +blaimaire +blaimar +blaimason +blaime +blaïna +blaïnar +blaïnejargh +blaïrh +blaisan +blaisar +blaisirh +blanc +blancairás +blancament +blancariá +blancàs +blancastre +blancor +blancós +blanda +blandiment +blandirh +blanquejargh +blanquesa +blanqueta +blanquetat +blanquiment +blanquinard +blanquinejargh +blanquinèl +blanquinós +blanquirh +blanquitge +blaquejargh +blaquirh +blar +blarmar +blasar +blasèra +blasfemaire +blasfemar +blasfemèri +blasfèmic +blasfèmi +blasidura +blasin +blasinar +blasinejargh +blasinièr +blasirh +blason +blasonar +blastodèrma +blat +blatimar +blau +blaugetar +blaugetèri +blaugètic +blaugiment +blaugirh +blauguelar +blauguelèri +blauguèlic +blava +blavairòl +blavar +blavarèl +blavejargh +blavenc +blavesa +blavet +blavinèl +blavirh +bleda +bledièra +blegargh +bleimar +bles +blesejadís +blesejaire +blesejargh +bleses +blesirh +blesta +blestut +blet +bletar +bletejargh +bletidura +bletirh +bletonada +bletonar +bletonejargh +bleuge +bleussar +bleusse +bleussirh +blima +blimar +blincargh +blindar +blindatge +blinsar +blinse +blisaud +blòc +bloca +blocaire +blocargh +blocatge +blòda +blond +blonda +blondejargh +blondinèl +blondirh +blonditge +bloquièr +blos +blosa +bloses +blòt +blotar +blotèri +blòtic +blutar +boada +boairat +boal +boalha +boarazh +boariá +boatièr +bòba +bobilicas +bobina +bobinaire +bobinar +boblatge +bobomia +bobosa +bobosar +boc +boca +bòça +bocachon +bocada +bocadents +bocafenduda +bocafin +bocafina +bocal +bocal +bocalar +bocalat +bocalhàs +bocapudent +boçar +bocargh +boçar +boçarai +bocaràs +boçard +bocariá +bocarut +bocassa +boçavi +bocejargh +bocèla +bocelar +bocelèri +bocèlic +bocem +bocenon +bocèri +bocerla +bocerlós +bocetz +bòci +bocichon +bocilha +bocilhut +bocin +bocinar +bocinejargh +bocinet +bocinholar +bocinholèri +bocinhòlic +bocla +boclar +boclièr +boçon +boconar +boçuduènha +boçut +bòch +bòcha +bochal +bochar +bochard +bocharda +bochardar +bochardejargh +bochas +bochelar +bochelèri +bochèlic +bochèri +bochet +bòchic +bòchi +bochinguèla +bochonar +boda +bòda +bodega +bodegaire +bodena +bodenfla +bodenflar +bodenfle +bodenflejargh +bodenflitge +bodic +bodifla +bodiflar +bodigàs +bodin +bodoire +bodoisson +bodoissonar +bodolh +bodoluc +bodon +bodona +bodonhal +bodonhar +bodòs +bodosca +bodoscargh +bodoscatge +bodosquièr +bodre +bodrejada +bodrejaire +bodrejargh +bodrejatge +boèmi +boemiesa +bofa +bofada +bofadís +bofador +bofadura +bofafòc +bofaire +bofal +bofalha +bofalhar +bofalièch +bofalièra +bofanèla +bofaniá +bofanièr +bofar +bofarada +bofarda +bofarèl +bofariá +bofarolada +bofaron +bofaròt +bofe +bofèc +bofecariá +bofegargh +bofejar +bofet +bofetar +bofetàs +bòfia +bofiga +bofigadura +bofigargh +bofigós +bofin +bofinada +bofinar +bofinatge +bofiòla +bofiolar +bofiolèri +bofiòlic +bofís +bofon +bofonada +bofonaire +bofonar +bofonariá +bofre +bofrida +bofritge +boget +bogia +bogiarazh +bogica +Bogotà +bograssejargh +bogre +boicot +boida +boièr +boïn +boira +boiradís +boirador +boiraire +boirar +boiràs +boirat +boiratge +boire +boirèla +boirica +boirilha +boiròt +bois +boissa +boissada +boissador +boissar +boisseda +boisserilha +boisseròla +boisset +boissièra +boisson +boissonada +boissonalha +boissonièr +boissonilha +boissonós +boita +boitada +boitar +boitejargh +boitièr +boitós +boja +bojal +bojarro +bojolar +bojolèri +bojòlic +bol +bòl +bòla +bolacargh +bolada +boladièra +bolaire +bolament +bolar +bolar +bolard +bolaròt +bolatge +bolbena +bolcargh +bolchevic +boldoira +boldoiraire +boldoirar +boldoiràs +boldoiratge +boldonar +boldra +boldracargh +boldrada +boldrar +boldràs +boldrejargh +boldrirh +boldròc +boldròi +boldrós +bolèc +bolèg +bolegada +bolegadís +bolegaire +bolegal +bolegament +bolegargh +bolegatge +boleguet +boleguiu +bolejargh +bolenièr +bolèri +bolet +bolfre +bolh +bolha +bolhabaissa +bolhaca +bolharga +bolhàs +bolhent +bólher +bolhirh +bolhit +bolhon +bolhòt +bolhut +bolica +bolicargh +bolida +bolidor +bolidura +bolièra +boligraf +boligrafe +boliment +bolina +bolinar +bolirh +boliscauda +bolison +Bolivia +Bolívia +bolivian +bolivian +bolnada +bolon +bolonar +Bolonha +bolonhés +bolza +bolzaire +bolzar +bolzes +bolzinar +bolzut +bomb +bomba +bombacul +bombacuol +bombadissa +Bombai +bombaire +bombament +bombança +bombancièr +bombar +bombarda +bombardament +bombardar +bombardièr +bombàs +bombasina +bombassada +bombassal +bombassar +bombe +bombejar +bombet +bombeta +bombilhaire +bombilhar +bombiment +bombirh +bombissa +bombon +bombona +bombonada +bombonaire +bombonament +bombonar +bombonejaire +bombonejargh +bomborinada +bomborinar +bomborinejargh +bombut +bon +bonaça +bonament +bonança +bonància +bonanuèch +bonanuèit +bonàs +bonasèrbas +bonassariá +bonaür +bonaürança +bonaventura +bonavòia +bonbon +bonbonaire +bonbonièra +bond +bond +bonda +bondador +bondaire +bondar +bondejargh +bondicargh +bondieu +bondina +bondinar +bondinejargh +bondirh +bondissent +bondolejargh +bondon +bondonar +bondonèl +bondonièr +bondonièra +bonesa +bonet +boneta +bonetada +bonetaire +bonetar +bonetariá +bonetièr +bonfàcia +bonha +bonhar +bonharut +bonhàs +bonhassa +bonhet +bonheta +bonhetar +bonhetassa +bonhetós +bonhonar +bonic +bonifaci +bonifàcia +bonificacion +bonificargh +boniquet +bonita +bonjorn +bonòme +bonser +bont +bontat +bonteta +bontós +bonur +bonvèspre +bopòla +boquièr +boquil +boquin +bora +boràs +borassau +borat +borata +boratièr +borba +borbada +borbar +borbatge +borboirar +borbolh +borbolhar +borbolhós +borbós +borbotar +borbotge +bord +bòrd +borda +bòrda +bordac +bordada +bordadura +bordaire +bordal +bordalat +bordalés +bordalesa +bordalha +bordalièr +bordar +bordar +bordariá +bordariá +bordàs +bordassa +bordassàs +bordassièr +bordatge +bordegàs +bordejada +bordejaire +bordejargh +bordèl +bordelar +bordelariá +bordelàs +bordelèri +bordèlic +bordelièr +bordequin +bordèri +bordesc +bordescada +bordescós +bordeta +Bordèu +bòrdic +bordièr +bordifalha +bordigalha +bordigàs +bordilh +bordilha +bordilhièr +bordissar +bordiu +bordolaiga +bordolh +bordolhaire +bordolhar +bordon +bordonejargh +bordufalha +boreal +boreala +borg +borgada +borgadenc +borgal +borgalada +borgalament +borgalitge +Borges +borgés +borgesament +borgesiá +borgolhar +Borgonha +borgonhon +borguinhon +borguinhòta +bòria +boriaire +boriassa +borida +borieta +boriòla +borjadoira +borjador +borjaire +borjargh +borjassòta +borjon +borjonaire +borjonar +borla +borlaire +borlar +borle +borlèsc +bòrlhe +borliassada +borlièr +borlís +borlisses +bòrna +bornac +bornaca +bornacargh +bornada +bornaire +bornal +bornar +bornarut +bornasèl +bornat +bornatge +bornèl +bornelar +bornelèri +bornèlic +bornèri +bòrnha +bornhejargh +bornhon +bornhut +bòrnic +bòrni +borniejargh +borniquèl +borniquèl +borniquelejargh +boronada +borra +borrada +borrador +borrage +borraire +borralièr +borramesclar +borraquin +borrar +borràs +borrasca +borrascada +borrason +borrasquejargh +borrassa +borrassièr +borrasut +borrat +borratge +borraud +borraudièr +borre +borrèc +borrega +borrèia +borrejargh +borrèl +borrelar +borrelejargh +borrelèri +borrelet +borrèlic +borrencada +borret +borretaire +borretalha +borretièra +borreton +borrèu +borric +borricada +borricalha +borricargh +borricat +borricòt +borricha +borrida +borrièr +borrigal +borrilh +borrilhar +borrilhon +borrilhós +borrilhut +borrina +borrinada +borrinar +borriquet +borriquièr +borriquiòl +borriu +borrola +borrolada +borroladís +borrolaire +borrolament +borrolar +borrolatge +borrolh +borrolís +borrolisses +borromba +borromba +borrombar +borrombau +borrombilh +borron +borronar +borroncelut +borrós +borrossa +borròt +borrut +borsa +borsada +borsejargh +borsèl +borset +borsicòt +borsièr +borsilhon +borsiu +borsonat +bosa +bòsa +bosaca +bosada +bosanquet +bosar +bosarada +bosard +bosarut +bòsc +boscal +boscalha +boscalhaire +boscalhar +boscalhat +boscalhatge +boscalhon +boscan +boscar +boscargh +boscar +boscarai +boscarassa +boscardièr +boscarèla +boscarenc +boscarida +boscarla +boscàs +boscassièr +boscassilha +boscassina +boscata +boscatge +boscatièr +boscatièra +boscaton +boscavi +boscós +boscut +bosena +boset +bosic +bosièr +bosiga +bosigada +bosigador +bosigaire +bosigargh +bosigatge +bosin +bosinaire +bosinament +bosinar +Bòsnia +bosniac +bosnian +bosoire +bosòla +bosolar +bosolèri +bosòlic +bosolut +boson +bosonar +bosquarèla +bosquejargh +bosquem +bosquèri +bosquet +bosquetièr +bosquetz +bòsqui +bosquilhar +bosquin +bossòla +bosticargh +bostifalha +bostiquejaire +bostiquejargh +bot +bota +bòta +botacloca +botacoire +botacreis +botada +botadís +botadissa +botafòc +botafòra +botaire +Botan +botanèl +botanés +botanic +botar +botar +botard +botarèl +botariá +botariga +botarra +botarrada +botarrar +botarro +botavilha +botejargh +botèl +botelar +botelèri +botelh +botelha +botelhar +botelhat +botelhenc +botelhon +botelhonièr +botèlic +botèri +boterla +botet +bòtic +boticèla +botièr +botifla +botiflar +botiga +botina +botinador +botinaire +botinar +botinhada +botinhador +botinhaire +botinhar +botinhós +botiòla +botiolar +botiolèri +botiòlic +botís +botja +botjargh +boton +botonadura +botonaire +botonar +botonièr +botonièra +Botswana +botswanés +bòufre +boular +boulèri +bòulic +bòupret +bovat +bovetar +bovin +bovina +brac +braç +braça +braçada +braçaire +braçal +braçalet +bracamard +braçargh +braçariá +braçat +bracejaire +bracejargh +bracèla +bracelièra +bracièr +bracomard +bracon +braconar +braconatge +braconièr +brada +bradalar +braga +bragada +bragaire +bragairon +bragaironar +bragalet +bragargh +bragardament +bragarditge +bragèia +bragós +braguejargh +bragueta +braguetar +braguièr +braguilhon +braire +bralhar +brallar +brama +bramada +bramadís +bramador +bramafam +bramafèr +bramaire +bramal +bramar +bramariá +bramavaca +bramèca +bramejargh +bramicargh +branc +brancada +brancargh +brancarut +brancassa +brancassejargh +brancat +brancatge +brançolament +brançolar +brançòlic +brancut +brand +branda +brandacoa +brandacuol +brandada +brandal +brandalar +brandalhar +brandalisa +brandant +brandapinta +brandar +brandejargh +brandet +brandida +brandilhar +brandimard +brandiment +brandin +brandinejargh +brandirh +brandissa +brandol +brandolada +brandolar +brandolejargh +brandolhada +brandolhar +brandolhejargh +brandon +brandonar +brandussa +brandussada +brandussar +brandussariá +brandussatge +brandussejargh +branquejargh +branquet +branquial +branquièr +branquilh +branquilha +branquilhar +branquilhon +branquilhut +brantar +braquet +brasa +brasadura +brasaire +brasar +brasàs +brasatge +brasc +brasejargh +brasèl +brasidura +brasièr +brasièra +brasigada +brasigargh +Brasil +brasilhada +brasilhar +Brasília +brasilièr +braste +brastegaire +brastegargh +brasucada +brasucaire +brasucargh +brasugargh +brasuquejargh +Bratislava +brau +brauda +braudanar +braudejargh +braudenc +braudièr +braudós +braulhaire +braulhament +braulhar +braulhard +braulhariá +brausent +brausi +brausirh +bravada +bravaire +bravairièr +bravament +bravar +bravariá +bravàs +bravassalha +bravassièr +bravatalha +brave +bravejargh +bravenc +bravesa +bravet +bravetat +bravor +Brazzaville +brèç +brèça +breçadissa +breçadoira +breçaire +breçairòla +brecar +breçar +breçarai +breçat +breçavi +brecem +brecèri +brecetz +brèci +brecièra +breçòl +breçòla +breçolaire +breçolar +breçolèri +breçòlic +breçolièra +brega +bregadissa +bregadoira +bregaire +bregalhar +bregargh +bregarut +bregatejargh +bregonar +bregós +Breissa +brèlha +brelhador +brelhar +brellar +brembança +brembar +brembièra +bren +brenada +brenar +brenassa +brenatge +brenós +bres +bresaga +bresairar +bresaire +bresar +bresca +brescada +brescaire +brescargh +brescat +bresega +bresegon +bresenaire +bresenar +bresicarg +bresicat +bresièr +bresilha +bresilhadís +bresilhaire +bresilhament +bresilhar +bresilhatge +bresquet +bresqueta +bresquièira +bresquilhat +Brèst +brestés +bresugargh +bret +Bretanha +Bretanha +bretèla +bretòina +breton +bretonejament +bretonejargh +bretonejatge +brèu +brèva +brèvament +brevet +brevetar +breviari +briaraz +bribandejargh +bribon +bric +brica +bricalha +bricalhar +bricargh +bricolaire +bricolar +bricolejargh +bricolèri +bricòlic +bricon +briconar +briconèl +briconet +brida +bridar +bridèl +bridièr +bridolaire +bridolar +bridolet +bridon +brieu +briga +brigada +brigadièr +brigalh +brigalhar +brigand +brigandalha +brigandatge +brigandejargh +brigargh +brigol +brigolar +brigolejargh +brilha +brilhada +brilhant +brilhantament +brilhantar +brilhar +brilhas +brilhaudar +brillas +brimbalar +brin +brina +brindalha +brindar +brinde +brindolar +bringe +bringolar +bringuièr +brinha +brinhòl +brinsa +brinsièra +briònha +briònia +briòu +briquetar +brisa +brisadís +brisadura +brisaire +brisal +brisalhet +brisament +brisan +brisar +brisarèl +brisaud +brisca +briscargh +brison +brissa +bristoladura +bristolar +britanic +britanic +Britanicas +britlat +briu +briva +brivada +brivent +broa +broal +broàs +broassa +bròc +bròca +brocador +brocadura +brocaire +brocal +brocalha +brocalhar +brocar +brocar +brocarai +brocariá +brocasalha +brocat +brocat +brocavi +bròda +brodadura +brodaire +brodar +brodariá +brodèri +bròdic +brogal +bròia +broina +broînar +broine +bròl +bròla +brolhada +brolhadura +brolhar +brolharai +brolhat +brolhavi +brolhem +brolhèri +brolhetz +brolhon +bromech +bromejargh +bronbron +bronc +broncada +broncaire +broncargh +bronçolèri +broncut +bronda +brondàs +brondasson +bronde +brondejargh +brondèl +brondilha +brondilhar +brondirh +bronguda +bronguèri +brongut +bronha +bronhent +brónher +bronherai +bronhi +bronhiái +bronhon +bronzaire +bronzament +bronzant +bronzar +bronzatge +bronze +bronzelhar +bronzida +bronzidor +bronzidura +bronziment +bronzin +bronzinada +bronzinadís +bronzinaire +bronzinament +bronzinar +bronzinatge +bronzinejargh +bronzinós +bronzirh +bronzissent +bronzor +broquejargh +broquem +broquèri +broquet +broqueta +broquetz +bròqui +broquièr +broquilha +broquilhada +broquilhar +bros +bròs +brosec +brosirh +brossa +bròssa +brossal +brossar +brossàs +brosses +brosseta +brossieiròu +brossièr +brost +brostaire +brostal +brostalha +brostar +brostejargh +brostèl +brostet +brostiar +brostièr +brostièri +bròstiic +brostilha +brostilhar +brot +brota +brotada +brotar +brotejargh +brotenc +brotièra +brotilhar +brotilhon +brotinha +brotonar +bruc +brucada +brucal +brucargh +bruch +brucha +brudèsta +bruèg +bruegem +bruegèri +bruegetz +bruègi +bruèis +bruèissa +brueissam +brueissejargh +brueissòt +bruejar +bruejar +bruejarai +bruejavi +bruèlh +bruèlha +bruèlhi +bruessariá +bruga +brugairàs +brugairòl +brugal +brugalièra +brugàs +brugassièr +brugasson +bruguet +bruguièr +bruina +bruinar +brulhada +brulhadura +brulhar +brulhèc +brulhegargh +brulhon +bruma +brumaca +brumada +brumairòl +brumalh +brumar +brumassejargh +brumatge +brumejargh +brumiu +brumor +brumós +brun +brunàs +bruncargh +Brunei +brunèl +bruneleta +brunesirh +brunetat +brunguda +brunguèri +brungut +brunhent +brúnher +brunherai +brunhi +brunhiái +brunhirh +brunidor +brunirh +brunissòt +bruòg +bruòlh +bruòlha +bruòtja +brusc +bruscament +bruscargh +bruscariá +brusejargh +brusent +brusida +brusidor +brusiment +brusina +brusirh +brusissent +brusor +Brussèlas +brusselés +brústia +brustieta +brut +brutal +brutalejargh +brutalitat +brutalitge +brutar +brutícia +brutirh +brutissa +brutladís +brutlador +brutladura +brutlaire +brutlament +brutlant +brutlar +brutlason +brutlòt +brutlòta +bualhar +buba +bubonic +buc +buca +bucada +bucal +Bucarèst +bucarestian +buçòl +buçolat +Budapèst +budèl +budelada +budelalha +budelièr +budgèt +buèissa +buèlha +Buenos Aires +buèu +buf +bufa +bufada +bufadís +bufador +bufadura +bufaire +bufal +bufana +bufaniá +bufanièr +bufar +bufarada +bufarèl +bufariá +bufarolada +bufaron +bufaròt +bufat +bufèc +bufejargh +bufet +bufetar +bufetàs +bufle +bufre +buga +bugada +bugadar +bugadariá +bugadièr +bugadon +bugador +bugalh +bugalhar +bugàs +buget +bugetar +bulgar +Bulgaria +bulla +bullari +bulletin +buòu +buòunalha +buòunet +bura +burat +burataire +burba +burbalh +burbalha +burca +burcada +burcalha +burcalhar +burcargh +burèl +burèu +burgada +burgalés +burgalha +burgalhar +burgargh +Burgos +burin +burinar +burjargh +burjàs +Burkina +burkinabe +burla +burlar +burnós +burocracia +burocratic +buron +buronièr +burotic +burra +burrada +burrar +burrariá +burre +burrejargh +burrèl +burrelar +burrelèri +burrèlic +burrós +burundés +Burundi +busa +busac +busacaire +busaraca +busard +busaròca +busca +buscada +buscaire +buscalh +buscalha +buscalhaire +buscalhar +buscalhatge +buscargh +buscarèla +buscassejargh +busòl +busquejargh +busquet +busqueta +busquièr +bust +but +buta +butada +butaire +butal +butar +butarèl +butassada +butassal +butassar +butatge +butavant +butida +butin +butinar +butinejargh +butirh +butòr +ça +cabaissòl +cabaissòla +cabal +cabala +cabalaire +cabalar +cabalejargh +cabalha +cabalièr +cabalista +cabalistic +cabalós +cabaltièra +caban +cabana +cabanada +cabanaire +cabanar +cabanariá +cabanàs +cabanat +cabanat +cabanatge +cabanejargh +cabanèla +cabaneta +cabanial +cabanièr +cabanon +cabaret +cabaretejaire +cabaretejargh +cabaretièr +cabàs +cabàs +cabassa +cabassar +cabassat +cabassejargh +cabasset +cabassièr +cabassòl +cabassòla +cabassonar +cabassonèl +cabassons +cabassuda +cabastèl +cabaulha +cabdèl +cabdelar +cabdelèri +cabdèlic +cabèç +cabeça +cabeçada +cabeçal +cabeçala +cabeçana +cabeçargh +cabecejargh +cabecièr +cabecon +cabedèl +cabel +cabeladura +cabelh +cabelha +cabelhar +cabelièr +cabelut +cabença +cabent +caber +cabestèl +cabestraire +cabestrant +cabestrar +cabestratge +cabestre +cabi +cabiái +cabidoleta +cabidorle +cabidorna +cabifòl +cabifolejargh +cabilhonar +cabiment +cabirh +cabiròl +cabiròla +cabirolar +cabirolèri +cabiròlic +cabiron +cabironada +cabironar +cabironatge +cabiscòl +cabiscolat +cabit +cablar +cablat +cable +cabòça +caboçada +caboçar +caboçar +caboçarai +caboçavi +cabocejargh +cabocem +cabocèri +cabocetz +cabòci +cabocilha +cabociòla +caboçòla +caboçonar +caboçuda +caboçut +cabolh +cabolha +cabolhar +cabolhon +cabord +cabordena +cabordenièr +caborna +cabòrna +cabornat +cabornut +cabòs +cabòt +cabotaire +cabotar +cabotatge +cabotèri +cabòtic +cabotièr +cabra +cabrada +cabrafic +cabraire +cabral +cabrar +cabràs +cabrassa +cabrat +cabratge +cabraud +cabraudejargh +cabraudièr +cabrecon +cabreiret +cabreireta +cabrèla +cabrenc +cabreta +cabretaire +cabretar +cabriboc +cabridada +cabridan +cabridar +cabridet +cabridièr +cabridon +cabrièr +cabrifuèlh +cabrilha +cabrilhon +cabriòla +cabriolada +cabriolaire +cabriolar +cabriolatge +cabriolejargh +cabriolèri +cabriòlic +cabrit +cabriu +cabròl +cabròla +cabrolaire +cabrolar +cabrolèri +cabròlic +cabron +cabròt +cabròta +cabrotar +cabrotèri +cabròtic +cabrum +cabucèl +cabucèla +cabucelar +cabucelèri +cabucèlic +cabús +cabussada +cabussaire +cabussal +cabussament +cabussar +cabussejargh +cabusset +cabussièr +cabusson +cabussonar +caca +caça +cacaca +caçacoquins +caçacosins +caçada +caçador +caçafam +caçagosses +cacai +caçaire +caçairòla +caçairolada +caçairòt +cacal +cacalà +cacalacà +cacalada +cacalar +cacalàs +cacalassaire +cacalassar +cacalassejargh +cacalassièr +cacalaus +cacalausa +cacalauseta +cacalejargh +cacaluèch +caçamoscas +caçapessament +caçarg +caçargh +cacarejargh +caçarèla +cacaròca +cacaròt +cacarucha +caçat +caçatalent +cacau +cacet +càcia +cacibralha +cacièr +cacilha +cacitrar +caclucha +caçòla +caçolada +caçolet +caçoleta +caconhar +caçòt +caçòta +cachada +cachador +cachadura +cachafuòc +cachagrapaud +cachaira +cachal +cachamal +cachamalha +cachament +cachamorre +cachaniu +cachar +cachavièlha +cachimbau +cachorrar +cachós +cada +cadafalc +cadais +cadaissar +cadajorn +cadalièch +cadalièt +cadastral +cadastrar +cadastre +cadastrer +cadastrièr +cadaula +cadaular +cadaulàs +cadaulejargh +cade +cadeçargh +cadèl +cadèla +cadelada +cadelar +cadelard +cadelàs +cadelat +cadelèri +cadelet +cadèlic +cadena +cadenada +cadenàs +cadenassa +cadenat +cadéncia +cadeneda +cadenèla +cadeneta +cadenièira +caderçargh +cadièra +cadieraira +cadieraire +cadieral +cadiereta +cadieron +cadierrasa +cadís +cadissar +cadissariá +cadòrna +cadòsca +cadre +cadreçargh +caduc +caduèissa +cadun +cafaròta +cafè +cafetièr +cafetista +cafi +cafinar +cafirh +cafoire +cafolin +caforna +cafornejargh +caforneta +cafornon +cafornut +cafre +cagachin +cagada +cagadenièrs +cagadoira +cagador +cagadur +cagadura +cagafèrre +cagaire +cagal +cagalha +cagalheta +cagalhon +cagalièch +cagamalhas +cagamanja +çaganh +caganha +çaganhar +çaganhejargh +çaganhon +caganís +cagaprim +cagargh +cagaraula +cagaraulada +cagaraulat +cagarauleta +cagaraulièr +cagaraulon +cagaraulum +cagarèl +cagarèla +cagariá +cagarilh +cagaròl +cagarós +cagarossa +cagarosta +cagaròta +cagàs +cagola +çai +çai +çai-sus +cai +caia +caïmar +caïn +caïnada +caïnar +caïnejargh +çaïns +caira +cairadés +cairar +cairat +cairat +cairatge +caire +Caire +caire +caireforc +cairèl +cairèla +cairelaire +cairelar +cairelatge +cairelèri +cairèlic +cairelièra +cairida +cairós +cairosa +cairòta +cairut +cais +caissa +caissada +caissal +caissalàs +caissalat +caissalet +caissar +caissariá +caissejargh +caisseta +caissetin +caissièr +caisson +caitiu +caitivariá +caitivejargh +caitivièr +caitivós +cajaròca +cal +cala +calabrés +Calàbria +calabrinada +calabrinar +calabrun +calada +caladaire +caladar +caladatge +calador +çaladuènha +caladum +calam +calama +calaman +calamandrièr +calamandrin +calamar +calamarina +calamarsa +calamèl +calamèla +calamelaire +calamelar +calamelèri +calamèlic +calamina +calanc +calandra +calandraire +calandrar +calandratge +calandre +calandrejargh +calandrèl +calandreta +calandrina +calandron +calar +calatge +calauma +calç +calçada +calcargh +calçargh +calças +calcavièlha +calce +calcedòni +calcièrs +calcificargh +calcigada +calcigar +calciguèri +calciguic +calcimàs +calcimassa +calcin +calcinaire +calcinar +calcita +calcul +calculador +calcular +calculer +Calcuta +caldrà +caldriá +Caledònia +calelh +calelha +calelhada +calelhar +calelhat +calelhejagh +calelhon +calelhonet +calenda +calendal +calendièr +calent +caler +caletra +calfa +calfada +calfador +calfaire +calfalèit +calfament +calfar +calfejargh +calga +calguèsse +calguèt +calgut +calh +calha +calhada +calhada +calhalach +calhalait +calhalàs +calhament +calhar +calhàs +calhastràs +calhastre +calhastron +calhat +calhatada +calhatge +calhatièra +calhaton +calhau +calhaudièra +calhet +calhetar +calhibòt +calhibotar +calhibotèri +calhibòtic +calhièra +calhiron +calhòfa +calhòl +calholar +calholèric +calhòli +calhon +caliá +caliana +calibrar +calibre +caliçat +calici +calida +califa +Califòrnia +californian +caligòt +calimàs +calimassejargh +calina +calinar +calinàs +calinejargh +calinhada +calinhaire +calinhairitz +calinhar +calinhatge +calinhejargh +calinós +caliòrna +caliu +calivada +calivar +calivari +calivejargh +calivenc +calivent +calm +calma +calmar +calmejargh +calòfa +calomniarazh +calor +calorada +calorassa +calorent +calorentament +calorifugargh +calorinada +calorós +calòs +calòssa +calossada +calossal +calossar +calossèri +calòssic +calossut +calòt +calòta +calotada +calotar +calotèri +calòtic +calotièr +calotut +calpatrepa +calpisar +calprús +calquièr +calquièra +calrà +calriá +cals +caluc +calugariá +caluquitge +calvari +calvet +calvila +camaiarazh +camaièu +camaisadura +camaisar +camaleon +camamilha +camarada +camaradariá +camarar +camarariá +camarièr +camba +cambacrusa +cambada +cambadejargh +cambafin +cambaisar +cambajon +cambal +cambalada +cambalevar +cambalevèri +cambalèvic +cambaliga +cambaligargh +cambalon +cambalong +cambalòta +cambapilhat +cambar +cambarèlas +cambarelejargh +cambareleta +cambaròt +cambaròt +cambarut +cambassa +cambat +cambaterrar +cambaterrèri +cambatèrric +cambatge +cambatorrat +cambatrincat +cambavirar +cambavirotat +cambe +cambeta +cambi +cambiadís +cambiaire +cambiament +cambiant +cambiar +cambiat +cambièra +cambièri +càmbiic +cambilh +cambiotejargh +cambitòrt +cambon +cambòrla +Cambòtja +cambotjan +cambra +cambrada +cambrassa +cambrejargh +cambrèl +cambrièr +cambrilh +cambrilhon +cambròl +cambron +cambròt +cambruèl +cambusa +camedre +camèl +camelada +camelar +camelejargh +camelèri +camèlic +camelièr +camelòt +camèra +Cameron +cameronés +camfrar +camijargh +camin +caminada +caminaire +caminal +caminament +caminar +caminarèl +caminàs +caminatge +caminejargh +caminet +caminièr +caminòl +caminon +camion +camionaire +camionatge +camioneta +camisa +camisada +camisard +camisàs +camisassa +camiseta +camisòla +camisolar +camisolèri +camisòlic +camison +camoç +camomilha +camosirh +camp +campa +campada +campairal +campaire +campairòl +campal +campament +campan +campana +campanada +campanaire +campanal +campanar +campanatge +campanejargh +campanèla +campaneta +campanetge +campanha +campanhard +campanhòl +campanholet +Campània +campanièr +camparòl +campat +campatge +campech +campejaire +campejargh +camper +campèstre +campestrejargh +campet +campièr +campion +campionat +campís +campissada +campisson +camús +camusa +Can +can +cana +canabàs +canabassariá +canabassièr +canac +Canadà +Canadà +canada +canadenc +canadian +canadoira +canaire +canal +canalar +canalet +canalha +canalhariá +canalisar +canalista +canalizar +canalòt +cananilha +Canaquia +canar +canargh +canari +canari +canària +Canàrias +canarina +canas +canasta +canastèl +canastelon +canat +canatge +canatièr +canaton +canaula +canaulièr +canavèra +cança +cancabièlha +cancarinetas +cancarinhòl +cance +cancèl +cancelariá +cancelièira +cancelièr +càncer +cancerós +cancièra +cancilhon +cançon +cançonar +cançonejaire +cançonejargh +cançoneta +cançonièr +càncho +cande +candejargh +candel +candela +candelaire +candelar +candelariá +candelèri +candeleta +candèlic +candelièira +candelièr +candelosa +candetat +candi +candidat +candidatura +candinèl +candirh +candol +candolièr +candor +canejargh +canèl +canèla +caneladura +canelaira +canelat +canelièr +caneliu +canelon +canelut +canet +canfrada +canfrar +canfre +cangrena +cangrenar +cangrenós +canh +canha +canhada +canhar +canhard +canhardar +canhardièr +canharditge +canhassa +canhís +canhós +canhòt +canhòta +canhotada +canhotar +canhotèri +canhòtic +canidar +canident +canièr +canièr +canifre +canigon +canilha +canilhaira +canilhat +canilhon +canilhós +canin +caninièr +caninor +caninós +canipaut +canís +canís +canissa +canissar +canisson +canissós +canissòt +canitge +canivòr +canòi +canòl +canòla +canolat +canon +canona +canonada +canonar +canonge +canonic +canonièr +canorgua +canorgue +canorguiá +canòt +canòta +cansa +cansadèra +cansar +cansièra +cant +canta +cantable +cantabre +Cantàbria +cantacalamèl +cantacigala +cantada +cantadís +cantador +cantagal +cantagrilh +cantaire +cantalés +cantalesa +cantament +cantanha +cantant +cantaperditz +cantaplora +cantar +cantarèla +cantarelejargh +cantariá +cantarida +cantaridièr +cantarilha +cantarilhièr +cantaròt +cantason +cantassejargh +cantat +cantatge +cantaucèl +cantaucelaire +cantaucelar +cantaucelèri +cantaucèlic +cantejargh +cantèl +cantelar +cantelèri +cantèlic +cantic +cantièra +cantilha +cantina +cantinada +cantinièr +Canton +canton +cantonada +cantonar +cantonejargh +cantonés +cantoral +cantorlar +cantorlejargh +cantòt +cantulh +canturla +cantussar +cantussejargh +cantussièr +canut +caochotar +caochotièr +caos +cap +capa +capable +capacitat +capada +capai +capaire +capairon +capaironar +capaironat +capaironet +caparràs +caparrassa +caparrut +capàs +capatge +capbaissada +capbàs +capbatreh +capbilhar +capblanc +capbord +capbordelar +capbordelèri +capbordèlic +capbordon +capbordonar +capbrutlat +capça +capçana +capçanar +capçargh +capcièr +capcoat +capcoissin +capdèl +capdelar +capdelèri +capdèlic +capejaire +capejament +capejargh +capèl +capelada +capelaire +capelan +capelanalha +capelaniá +capelanilha +capelar +capelat +capelatge +capelejargh +capelèri +capelet +capeleta +capeletejargh +capèlic +capelièr +capelina +capelon +capelut +capenjós +capensús +capescodèri +capescodi +capescodiái +capescodrai +capescodre +capescoduda +capescodut +capescós +capescossa +capet +capeta +capetar +capfanilh +capfava +capfinar +capfòc +capfoguièr +capfòra +capforc +capfuèlh +capgirar +capgràs +capgròs +capial +capil +capilar +capilorda +capinhada +capinhaire +capinhar +capinhejargh +capinhièr +capinhós +capiòl +capirh +capiscoa +capiscòl +capisson +capital +capitala +capitalièr +capitalista +capitana +capitanariá +capitanatge +capitanessa +capitani +capitaniá +capitar +capitat +capitèl +capitèla +capítol +capitolat +capitòli +capitulacion +capitular +caplamont +caplaval +caplèu +capleugièr +caplèva +caplevar +caplevèri +capleveta +caplèvic +caplòc +capmaçargh +capmanat +capmàs +capmasada +capmasièr +capmèstre +capmont +capmòri +capnaut +capnegre +capnud +capolada +capoladoira +capolaire +capolar +capolha +capolièr +capolon +capon +caponadoira +caponador +caponar +caponariá +caponejargh +caponitge +caporal +caporna +capòt +capòta +caprici +capriciar +capricièri +capríciic +capriciós +capricòrn +caprodèla +caprodelar +caprodelèri +caprodèlic +caproge +caprós +caprosset +captendrai +captenença +captenent +capténer +captenguda +captenguèri +captengut +capteni +capteniái +captenir +capter +capturar +capucha +capuchat +capuchin +capuchina +capuchon +capuditge +capula +capús +capusador +capusaire +capusar +capusariá +capusatge +capusilhas +capussa +caput +capval +capvalat +capverdian +capvirar +capviròl +capvirolar +capvirolèri +capviròlic +car +car +cara +carabanhada +carabassa +carabaunha +carabin +carabinada +carabinar +carabinariá +carabinejargh +carabinièr +carabiròl +carabrinar +caracalha +Caracas +caraco +caracòl +caracòla +caracolar +caracolèri +caracòlic +caractèr +caracterisar +caracteristic +caracterizar +carafèl +carafelat +caragòl +carajòu +caramanha +carambòla +carambolar +carambolatge +carambolèri +carambòlic +carambolièr +caramèl +caramelar +caramelèri +caramèlic +caramelisar +caramelizar +caramilha +caraoqué +cararacà +carasclet +carassa +carat +caratecà +caratge +caraunha +caraunhada +caravana +caravanièr +caravari +caravèl +caravenc +caravilhar +caravirar +caravirat +carba +carbar +carbassa +carbata +carbatar +carbaton +carbe +carbetas +carbilha +carbon +carbonada +carbonar +carboncke +carbonejargh +carbonelar +carbonelèri +carbonèlic +carbonièr +carbonilha +carbonisar +carbòt +carburant +carburator +carcais +carcalàs +carcalhar +carcan +carcanàs +carcanhaire +carcanhar +carcassèla +carcavèl +carcavelar +carcavelèri +carcavèlic +carcavièlh +carcavielhirh +carcin +carcinar +carcòi +carchòfa +carchòfe +carchoflièr +carda +cardada +cardaire +cardal +cardar +cardatge +cardelin +cardièr +cardin +cardinal +cardinalat +cardinejargh +cardiològ +cardiritz +cardon +careçargh +carèl +carèma +carementrant +carestiá +carestiós +careta +carfuèlh +carga +cargadoiras +cargador +cargaire +cargament +cargapelha +cargargh +cargason +cargòl +cargue +carguet +caricaturar +carincargh +cariogamia +cariotipe +carirh +caritablament +caritable +caritadièr +caritadós +caritadosament +caritat +carlòt +carn +carnacion +carnada +carnadura +carnal +carnal +carnalament +carnalatge +carnalha +carnalitat +carnassa +carnassièr +carnaval +carnavalada +carnavalejargh +carnavalenc +carnejargh +carnenc +carnhar +carnièra +carnifalha +carnifès +carnilha +carnisson +carnivòr +carnivòra +carnmarina +carnmatar +carnon +carnós +carnsalada +carnsaladariá +carnús +carnut +caròbia +carobièr +caròla +Carolina +carp +carpa +carpada +carpaire +carpal +carpan +carpar +carpat +Carpats +carpejargh +carpenar +carpenta +carpentariá +carpentatge +carpentièr +carpièira +carpin +carpinar +carpinhar +carpinhejargh +carpinós +carpirh +carquesa +carquinhar +carquinhejargh +carraca +carrada +carradament +carradura +carraira +carrairar +carrairon +carral +carrar +carràs +carrassar +carrassièr +carrastèl +carrat +carre +carreg +carreja +carrejadís +carrejaire +carrèl +carrèla +carreladura +carrelaire +carrelar +carrelatge +carrelèri +carrelet +carrèlic +carreta +carretada +carretal +carretar +carretat +carretièr +carri +carrièr +carrièra +carrierat +carrieròta +carrieròta +carrincargh +carriòl +carriolar +carriolèri +carriòlic +carriòt +carriotat +carròça +carroçar +carroçar +carroçarai +carroçavi +carrocem +carrocèri +carrocetz +carròci +carrocièr +carrònha +carròt +carròta +carruga +carrugargh +carta +cartabèl +cartaginés +cartaire +cartam +cartat +cartaula +cartejargh +cartèl +cartilha +cartipèl +cartocha +cartochièra +carton +cartonariá +cartonatge +cartonièr +cartulari +carut +carvenda +carvendeire +carvendreh +carvi +carzirh +cas +casa +Casablanca +casaca +casada +casadura +casal +casalatge +casalièr +casalissa +casalon +casamata +casar +casca +cascaire +cascalh +cascalhar +cascalhejargh +cascalhon +cascamèl +cascanhar +cascanhòl +cascant +cascantejargh +cascantissa +cascar +cascargh +cascarèl +cascarelejargh +cascarelet +cascarinet +cascarron +cascavèl +cascavelar +cascavelejargh +cascavelèri +cascavèlic +casco +cascun +caseïficargh +casèl +casèla +càser +casèrna +casièr +casimar +casin +çasins +casirh +Caspiana +casquet +casqueta +casquetièr +cassa +cassadura +cassana +cassanada +cassanèl +cassanelièr +cassanh +cassanharosa +cassanòla +casse +cassèl +cassenat +cassenòla +casses +cassi +càssia +cassida +cassidós +cassièr +cassièra +cassigol +cassilha +cassilhós +cassiòu +cassís +casson +cassonada +cassòu +cassòuda +cast +castanh +castanhada +castanhaire +castanhal +castanhar +castanhareda +castanharós +castanhason +castanheda +castanhenc +castanhièr +castanholenc +castanhon +castanhós +castejaire +castejargh +castejatge +castèl +castelan +castelaniá +castelar +castelàs +castelejargh +castelet +Castelha +castelhan +Castelhon +castelhonenc +castelièr +castèls +castes +castetat +castig +castigada +castigador +castigaire +castigament +castigargh +castigatge +castilhar +caston +castrai +castron +casubla +casuda +casuèlh +cat +catabanhada +catador +catalan +catalanar +catalisar +catalòg +catalogatge +Catalonha +Catalonha +catalonha +Catània +cataplasma +catar +catara +cataracta +cataràs +catarassa +cataraunhar +cataraunhejargh +catarèl +catarina +catarinada +catarinassa +catarinèla +catarineta +catarinòt +catàs +catassa +catastròfa +catastrofic +catechisar +catechisme +catechista +catedrala +categoria +catelar +catelèri +catèlic +catequisar +catequizar +catet +cateta +catfèr +catifèl +catifolar +catifolèri +catifòlic +catifolièr +catilh +catilhaire +catilhar +catilhós +catimèl +catimelejargh +catirh +catla +catolic +caton +catonar +catonejargh +catonèl +catonièr +catòrze +catorzen +catorzena +catorzenament +catucèls +catuènha +catuènha +catulhar +cau +cauç +cauca +caucada +cauçada +caucadís +caucadoira +cauçadura +caucal +caucala +caucalet +caucalós +cauçamenta +caucanha +caucargh +cauçargh +cauças +Caucàs +caucason +cauçason +cauçatariá +caucatge +cauçatge +cauçatièr +caucatrapa +caucatrepa +cauce +caucelar +caucelèri +caucèlic +caucena +cauceta +caucida +caucidar +caucidièra +caucièr +cauciga +cauciganha +caucigargh +caucina +caucinada +caucinar +caucinièr +caucinós +caucionar +cauçon +cauçonièr +cauchó +caud +caudada +caudament +caudejador +caudejargh +caudièr +caudinèl +caudòla +caudorós +caudós +caudura +caufa +caufada +caufador +caufaire +caufalèit +caufament +caufar +caufejargh +caufeta +caul +caula +caulada +caulament +caular +caulat +caulejargh +caulelh +caulet +cauletièr +caulibèla +caulièr +cauligal +cauliha +caulistre +cauma +caumaci +caumador +caumaire +caumanhàs +caumanhièr +caumar +caumàs +caumassejargh +caumatge +caumeta +caumièr +caumós +caumosirh +cauna +caunar +cauneta +caunièra +caunilh +caunilha +caunirh +caunit +caunud +caunut +caupèri +caupilh +caupilhar +caupinar +caupirh +caupisar +cauprai +caupre +caupuda +cauput +cauquèla +cauquilhatge +cauquilhon +cauquilhós +cauquilhum +caurada +caure +caurelhar +caurilhar +caús +caus +causa +causar +causejargh +causelar +causelèri +causèlic +causeta +causida +causidament +causidor +causirh +causòta +caussanèl +causse +caussegòl +caussèla +caussenard +caüsses +caussinard +caussinhòl +cauta +cautèla +cautèri +cauterisar +cauterizar +cautós +cautosament +cauva +cauvet +cava +cavada +caval +cavalan +cavalar +cavalariá +cavaleirós +cavalejargh +cavalet +cavaleta +cavalgador +cavalgadura +cavalgargh +cavalgons +cavalha +cavalhon +cavalièira +cavalièr +cavalin +cavalina +cavanèl +cavar +cavariá +cavatge +cavèca +cavèrna +cavilh +cavilha +cavilhada +cavilhadura +cavilhaire +cavilhar +cavilhariá +cavilhat +cavilhejargh +cavilhièr +cavilhòla +cavilhós +cavilhòt +cavitat +cavòt +cavut +cazac +Cazacstan +ceba +cebaire +cebard +cebat +cebejargh +cebenc +cebencaire +cebencargh +cebencatge +cebencon +cebencum +cebeta +cebièr +cebilh +cebilhon +cebòla +cebolat +ceboleta +cèc +ceda +cedar +cedenèl +cedilha +cedirh +cedrat +cedratièr +cèdre +cedula +cefalizacion +ceguda +ceguinhòla +ceilanés +cèl +cèla +celada +celadament +celaire +celairièr +celament +celar +celariá +celebrar +celèbre +celebrèri +celèbric +celebritat +celèst +celèstial +celidònia +celièr +cella +cellula +cellular +cellularia +cellulita +cementèri +cemetèri +cena +cench +cencha +cencha +cenchada +cenchar +cendrada +cendralha +cendràs +cendrasson +cendrat +cendre +cendrejargh +cendrièr +cendrilha +cendrilhós +cendrolet +cendrolièr +cendrós +cendroseta +cénger +cenguèri +cenhent +cénher +cenherai +cenhi +cenhiái +cenre +cens +censa +censal +censièr +censor +censura +censurar +centanuèja +centaur +centaurèa +centen +centenar +centenari +centenària +centenat +centenièr +central +centrala +centralisar +centralizacion +centralizar +centrar +Centreafrica +centreafrican +centreamerican +centura +centurar +centuron +cep +cepa +cepada +cepadèl +cepar +cepat +cepat +cepièra +cepilhon +cepon +cera +cerairal +ceraireda +ceramica +cerar +cerat +cèrç +cèrca +cèrcabrega +cercadís +cercaire +cercament +cèrcapotz +cercargbh +cèrcaranha +cercatge +cerclar +cercle +cerdan +cereala +cerebral +cereireda +cereisarr +cereiset +ceremonia +ceremònia +ceremonial +ceremoniós +ceremoniosament +cerfuèlh +cerieisar +cerieisèri +cerièisic +cerièr +cerièra +cerierat +ceriesar +ceriesèri +cerièsic +cerisòla +cerisolièr +ceritèra +cermar +cernalh +cernalha +cernent +cèrner +cernerai +cernèri +cèrni +cerniái +cernida +cernilhaire +cernilhar +cernirh +cernuda +cernut +cernut +cerós +cerosa +cerquejargh +cerquèri +cèrquic +cèrt +cèrta +certan +certan +certana +certanament +certanetat +cèrtas +certificargh +certitud +cerulenc +cerusa +cervèl +cervèla +cervelat +cervelet +cerveletas +cervelós +cervesa +cèrvi +cèrvia +cerviat +cervièr +cervin +cervion +cesarenc +cese +cesera +ceseron +cesièr +ceson +cessa +cessament +cessar +cesta +ceste +ceston +cestre +cesura +cetòri +ceuclar +cianur +cibet +cibeta +cibièr +cibièra +cibla +cibola +ciboleta +cibòri +cibòt +cibrar +cibre +cicatritz +cicloïda +cicne +cicorèia +cièja +cigal +cigala +cigalada +cigalar +cigalejargh +cigalet +cigalièr +cigalon +cigalós +cigarreta +cigarro +cigat +cigonha +cigonhada +cigonhaire +cigonhar +cigonhatge +cigonhejargh +cigonhós +ciguda +cilh +cilhar +cili +ciliar +ciliara +cilici +cilindrar +cilindre +cilindric +cim +cima +cimaci +cimada +cimaisa +cimal +cimbala +cimbalar +cimbalièr +cimbèl +cimbelar +cimbelejargh +cimbelèri +cimbèlic +cimbelièira +cimbol +cimbola +cimbolat +cimbolet +címec +cimèl +cimèla +cimen +ciment +cimentar +cimezon +cimossar +cimostar +cinc +cincona +cindrar +cindre +cineasta +cinemà +cingla +cinglada +cingle +cinglon +cinglonar +cinh +cinòbre +cinquanta +cinquantejargh +cinquanten +cinquantena +cinquantenat +cinquantenejargh +cinquen +cinquenar +cinsa +cinsada +cinsaire +cinsar +cinsós +cint +cinta +cintada +cintar +Cipre +ciprès +cipressièr +ciprièr +cipriòta +cira +cirar +circ +circonciguèri +circoncirai +circoncire +circoncis +circoncisi +circoncit +circonferéncia +circonscripcion +circonsisiái +circonstància +circonvenguda +circonvenguèri +circonvengut +circonveni +circonveniái +circonvenir +circuit +circuit +circulacion +circulaire +circulaire +circulatòri +cirgatèl +Cirillic +cirurgia +cirurgian +cirurgical +cisalhar +cisalhas +cisampa +cisampar +ciscle +cisèl +ciseladura +ciselar +ciselèri +cisèlic +cist +cistèrna +cisternèl +cistra +citar +citoplasma +citoplasmic +citoplasmica +citra +citre +citrolha +citron +citronat +citronèla +citronièr +ciutadan +ciutadèla +ciutadin +ciutadin +ciutat +civada +civadar +civadariá +civadat +civadèl +civadeta +civadièr +civadon +civeta +civièra +civil +civilizacion +clacada +clacargh +clacatge +clafada +clafar +clafèl +clafirh +clairana +clam +clamada +clamadissa +clamador +clamaire +clamar +clamatièr +clamor +clantirh +clantorirh +clap +clapa +clapador +clapairar +clapar +claparda +clapareda +clapàs +clapassal +clapassejargh +clapassilha +clapassina +clapejargh +clapet +clapièr +clapirh +clapissa +claput +claquet +claqueta +clar +Clara +clarament +claranda +clarantèina +claras +clarejargh +clarent +clareta +claretat +clària +clariana +clarièr +clarin +clarin +clarinejargh +clarinèl +clarineta +clarinetaire +claror +clarós +clartat +clarvesença +clarvesent +clas +classa +classament +classar +classejargh +classic +classificargh +clastra +clastrar +clastre +clastrejargh +clau +claufelha +claufiment +claufirh +clauguèri +claurai +claure +claus +clausa +clausada +clausar +clausèl +clausi +clausiái +clausidor +clausirh +clausissa +clausissós +clauson +clausonar +clausuda +clausuga +clausura +clausut +clausut +clava +clavacais +clavada +clavadura +clavaire +clavar +clavariá +clavèl +clavelar +clavelèri +clavelet +clavèlic +clavelièr +clavelós +clavenc +claveta +clavetièra +clavicula +clavièr +clavièra +clavís +clavum +clècus +cleda +cledar +cledièr +cledís +cledissa +cledon +cleméncia +clement +clenar +clenc +clencargh +clerc +clergue +clerguejargh +clerjat +clerjon +clèsc +clèsca +clèscadur +clèscdur +clèscmòl +clespa +clespar +clesquejargh +clic +clic +clicargh +clicas +client +clienta +climat +climatisar +climatizar +clin +clinada +clinaire +clinament +clinchar +clinhada +clinhament +clinhar +clinheta +cliquejargh +cliquèlas +clissa +cloc +cloca +clòca +clocada +clocar +clocargh +clocar +clocarai +clocatejargh +clocavi +cloceire +clocejargh +clocida +clocinejargh +clocirh +clogem +clogèri +clogetz +clojada +clojar +clojarai +clojavi +clòn +clonar +clonèri +clònic +clòp +cloquejargh +cloquem +cloquèri +cloquetz +clòqui +cloquièr +clorar +clorèri +clòric +clòsc +clòsca +closcar +closcar +closcarai +closcavi +closquem +closquèri +closquet +closquetz +clòsqui +clòt +clòta +clotaire +clotar +clotat +clotejargh +clotèri +clòtic +clotut +club +clubs +cluca +clucada +clucaire +clucargh +clucatejargh +cluèg +cluègi +clugargh +clujada +clujar +clunhar +cluquejargh +cluquents +cluqueta +clus +clusa +clusar +clusca +cluscapelat +cluscatestut +clutar +co +cò +çò +coa +coabessa +coabitacion +coacha +coada +coadís +coador +coaforcat +coagulacion +coagular +coaire +coal +coalèva +coalevar +coalevèri +coalèvic +coalhar +coalicion +coalong +coalonga +coalongueta +coanís +coarza +coaralha +coard +coardar +coardèla +coardiá +coardilha +coarnar +coaròt +coarra +coarrejargh +coarro +coason +coassar +coasson +coat +coatge +cobejargh +cobèrt +cobertaire +cobertament +cobertar +cobertèri +cobèrtic +cobertoira +cobertòla +cobertor +cobertura +cobés +cobesejargh +cobesença +cobesiá +cobla +coble +coblejargh +coblet +cobrar +còbre +cobrèri +còbric +cobrida +cobriment +cobrirh +cobrisons +còc +còca +cocaïna +cocaire +cocanha +cocar +cocar +cocara +cocarai +cocarda +cocardar +cocardejargh +cocardièr +cocarèla +cocarinàs +cocarralha +cocarralhum +cocarràs +cocarro +cocavi +cocena +cocodesca +cocolon +cocolucha +cocoluchar +cocoluchon +cocombrassa +cocombre +cocomèl +cocomèla +cocomet +cocon +coconar +coconejargh +coconhon +coconièra +coconilha +cocorda +cocorèca +cocorèl +cocorèla +cocoreleta +cocorèu +cocorla +cocorlada +cocorocó +cocrodil +cocut +cocha +cochada +cochaire +cochança +cochar +còche +cochièr +cochimbarba +cochós +cochosament +codar +codar +codascargh +codasquejargh +codatge +còde +codèita +codena +codenar +codenàs +codenós +codèrc +codèri +codèrla +còdic +codièr +codièra +codificargh +codil +codois +codoissada +codoissar +còdol +codolet +codolièra +codolós +codominància +codonh +codonha +codonhada +codonhat +codonhièr +codors +codorses +codra +còdra +codraire +codrar +codria +codriada +codril +codrilha +codrilhada +codrilhar +codrilhon +coëficient +coejargh +coèl +coeréncia +coëréncia +coerent +coërent +coet +coeta +coetardèla +coetejargh +coetièra +coexistirh +cofa +còfa +cofada +cofadura +cofaire +cofal +cofar +cofat +cofatge +cofèl +cofèri +cofessar +cofet +còfic +cofin +cofinat +cofinejargh +cofinet +cofirh +coflar +cofolut +cofrar +còfre +cofrèri +cofret +còfric +cofrièr +cofut +còga +cògan +cògas +cogatin +cogèl +coget +cogièr +cogirh +cogiron +cogoacha +cogòla +cogombre +cogorla +cogorlat +cogorlièr +cogorlitge +cogorluda +cogòt +coguèri +coguol +coguola +coguolar +coguolàs +coguolatge +cohòrt +cohortis +coïc +coidada +coidadura +coidar +coide +coidejada +coidejament +coidejargh +coièra +coifar +coifar +coifèri +còific +còimas +coina +coinar +coincidirh +coinèl +coineta +coira +coirai +coiram +coirar +coirassa +coirassar +coirassièr +coirasson +coirat +còire +coirenc +coireta +coirina +coirona +coissada +coissal +coissatge +coissièra +coissin +coissina +coissinada +coissinar +coissinet +coissinièra +coissòt +coissut +coita +coitada +coitaire +coitança +coitar +coitiu +coitivable +coitivada +coitivar +coitós +coitosament +coitre +coitrejaire +coitrejargh +coitrejat +coitrejatge +coitrièr +coja +cojada +cojanèla +cojaplumat +cojarassa +cojassa +cojat +cojon +còl +col +còla +colac +colada +coladís +coladon +colador +coladura +colaire +colana +colançargh +colant +colantar +colar +colar +colaret +colaretat +colaria +colariva +colassa +colatge +colc +colcada +colcant +colcargh +còlcrebar +còlcrebèri +còlcrèbic +colejaire +colejargh +colent +coleoptèr +coleoptèrs +còler +colèra +colèri +colerós +colerut +colesteròl +colet +coletar +còlgròs +colguda +colguèri +colgut +colha +còlha +colhada +colhamand +colhandre +colhat +colhaud +colhegàs +còlherh +colhet +colhirh +colhon +colhonada +colhonaire +colhonar +colhonatge +colhonejargh +colhonitge +colhut +còlic +còli +còliái +coliandra +colièr +colimpada +colimpar +colina +colinar +colindre +colinejargh +còlis +colisec +colitrar +colòbra +colòbre +colobrenc +colobrina +colobrinièr +colomb +colomba +colombat +colombet +Colómbia +colombian +colombièr +colombin +colomna +colona +colonada +colondra +colondrat +colonel +coloneta +Colonha +colonisar +colonizacion +colonizar +color +coloraire +colorament +colorar +coloratiu +colorent +coloreta +colorís +colorum +colòs +colossal +colpa +colpable +còlportar +còlportèri +còlpòrtic +còlprim +colrai +còlre +còlredde +còlroge +còlrós +còlsa +còlsec +còlses +coltocerai +còltòrç +còltòrcer +coltorcèri +coltòrci +coltorciái +coltorçuda +coltorçut +còltrincat +còlverd +còlza +collaboracion +collaborar +collaborèri +collabòric +colleccion +colleccionar +collecta +collectiu +collectivament +collectivitat +collector +collèga +collègi +collegial +collegiat +colligirh +colliri +colloc +collocar +collocar +collocarai +collocavi +còllong +còllongs +colloquem +colloquèri +colloquetz +collòqui +collòqui +com +coma +còma +comada +comairatge +comaire +comairejargh +comairèla +comaireta +comanda +comandador +comandaire +comandament +comandant +comandar +comandariá +comautar +comba +combada +combaire +combaissa +combal +combar +combat +combatent +combatreh +combèl +combèla +combenc +comberton +combeta +combiat +combilha +combin +combinaire +combinar +combinason +combinatiu +combinejargh +comblar +combor +comborirh +combranc +combustible +comedia +comèdia +comedian +comeditat +començ +començada +començaire +començament +començança +començant +començargh +començon +comenion +comensalisme +coment +comentator +comerçar +comerçarai +comerçavi +comercejargh +comercem +comercèri +comercetz +comèrcis +comercial +comercialisar +comercializar +comerciant +comèrcis +comestible +cometa +cometreh +comica +comís +comissari +comissariat +comission +comissionari +comitat +comitiva +comjat +commemoratiu +commutar +commutatiu +commutativitat +comòde +comol +comolada +comolar +comolatge +comolum +Comòras +comorian +compacte +compairatge +compaire +compaire +compairejargh +companejant +companejargh +companh +companha +companhiá +companhièr +companhon +companhonatge +comparable +comparadís +comparança +comparar +comparason +compareguda +compareguèri +comparegut +comparéisser +compareisserai +compareissi +compareissiái +comparent +comparer +comparerai +compari +compariái +comparirh +compartiment +compartirh +compàs +compassament +compassar +compassejargh +compassion +compastar +compatible +compatiment +compatirh +compatissent +compausar +compausat +compeirar +compèire +compeirèri +compeirés +compèiric +compelirh +compendi +compendiós +compendiosament +compensacion +compensar +compés +compesiar +compesièri +compésiic +competéncia +competent +competicion +competirh +competitivitat +competitor +compilar +compissadura +compissal +compissar +complaguda +complaguèri +complagut +complairai +complaire +complancha +complanguda +complanguèri +complangut +complànher +complanherai +complanhi +complanhiái +complant +complanta +complantar +complasença +complasent +complasentament +complasi +complasiái +complement +complementari +complementària +complet +complèta +completament +completar +completas +compléter +complèxa +complèxe +complicacion +complicargh +complice +complidament +compliment +complimentaire +complimentar +complimentós +complirh +complot +complòt +complotar +complotèri +complòtic +componch +componguèri +compónher +componherai +componhi +componhiái +compòrta +comportament +comportar +comportèri +compòrtic +composicion +compositor +compòst +compòsta +compostar +compostèri +compòstic +compra +compradís +comprador +comprar +comprémer +compremirh +comprenable +comprendrai +comprendre +comprene +comprenèla +comprenença +compreneson +comprenguèri +compreni +compreniái +comprenòri +comprés +compresa +comprimar +comprimirh +compromés +compromessari +comprometent +comprometreh +comptabilitat +comptable +comptadoira +comptador +comptaire +comptant +comptar +comptarèl +comptatge +compte +comptièr +comtadin +comtal +comtat +comte +comtessa +comtor +comtorat +comtoressa +comudable +comudacion +comudar +comun +comuna +comunal +comunalament +comunament +comunautari +comunautari +comunautària +comunautària +comunautat +comunèra +comuniar +comunicacion +comunicargh +comunièri +comúniic +comunion +comunista +comunitarisme +comunitarista +comunitat +con +còn +conaisseire +conassa +conca +concada +concagargh +concau +conçaupre +conçaure +concavar +concebable +concebement +concebèri +concebi +concebiái +concebrai +concebre +concebuda +concebut +concedirh +concentrar +concentric +concepcion +concèpte +concernent +concernirh +concèrt +concertacion +concertar +concertèri +concèrtic +conceure +concili +conciliar +concilièri +conciliic +conciutadan +conclau +concluguèri +conclurai +conclure +conclús +conclusa +conclusent +conclusi +conclusiái +concombre +concònsol +concordança +concordant +concordar +concordèri +concòrdic +concòrdia +concorreguda +concorreguèri +concorregut +concorrent +concórrer +concorrerai +concorri +concorriái +concorrirh +concors +concors +concors +concorses +concorses +concrèt +concretament +concubin +concubinatge +concurréncia +concurrent +condamina +condamnacion +condemnable +condemnacion +condemnaire +condemnar +condemnat +condenser +condesirh +condicion +condich +condicha +condiguèri +condiment +condir +condirai +condire +condisciple +condiscípol +condisent +condisi +condisiái +condit +condita +condominium +condormirh +condòrsa +condorsar +condorsèri +condòrsic +condosirh +condrech +condrechament +condreit +condreitament +conductor +conductritz +conduch +conduch +conducha +conducha +conduchièr +conduguèri +conduirai +conduire +conduit +conduit +conduita +conduita +condure +conduseire +condusent +condusi +condusiái +condusirh +còne +coneguda +coneguèri +conegut +coneissable +coneissença +coneissent +conéisser +coneisserai +coneissi +coneissiái +conestable +confederacion +confederacion +confèr +conferéncia +conferirh +confermar +confès +confessa +confessadís +confessador +confessar +confession +confessional +confessor +confiar +confiarazh +confidéncia +confidor +configuèri +configuracion +configuras +confiment +confinh +confinha +confinhament +confinhar +confinhièr +confir +confirai +confire +confirmar +confisança +confisar +confiscacion +confiscacion +confiscargh +confiseire +confisi +confisiái +confison +confit +confit +confitura +confla +conflacoquin +conflada +confladissa +conflaire +conflament +conflant +conflarèl +conflas +conflason +conflat +conflatge +conflaventre +confle +conflejargh +conflet +conflicte +conflitge +conflòti +confondreh +confòrme +conformitat +confòrt +confortabla +confortable +confortar +confortèri +confòrtic +confortiment +confortirh +confraire +confrairessa +confrariá +confront +confrontacion +confrontar +confusion +congausirh +congelar +congelèri +congèlic +congestion +congèt +congèt +congièra +conglaç +conglaçargh +Còngo +congolés +congòst +congosta +congostar +congòstes +congostós +congraire +congre +congreacion +congrear +congregargh +congrelh +congrelhar +congrès +congruéncia +congrut +conh +conhar +conhat +conhièira +conhièra +conhòl +conhon +conhonhon +conic +conifèr +conilh +conilh +conilhar +conilhièra +conjonch +conjoncha +conjonhent +conjonher +conjonherai +conjonhèri +conjonhi +conjonhiái +conjugargh +conjugason +conjunt +conjunta +conjur +conjuraire +conjurar +connectar +connectèri +connèctic +connector +conneissement +connexion +conoguda +conolh +conolha +conolhar +conolhièr +conolhièra +conòrt +conortar +conortèri +conòrtic +conquereguèri +conquerent +conquerent +conqueriái +conquerida +conquérirh +conquerit +conquerrai +conquèrre +conquesirh +conquèst +conquèstes +conquièri +conquista +conquistador +conresat +consacrar +consagrar +consciéncia +conscienciós +conscienciosament +conse +consecracion +consegal +consegrai +consègre +conseguent +conseguèri +consègui +conseguiái +conseguida +conseguiment +conseguirh +conseguit +conselh +conselhaire +conselhar +conselhièr +conselhièr +consent +consentida +consentiment +consentirh +consentirjh +consentit +consequéncia +conservacion +conservar +conservatòri +conservèri +consèrvic +consí +consideracion +considerar +considerèri +considèric +consigna +consignar +consirar +consirós +consisténcia +consistent +consistirh +consistòri +consistorial +cònsol +consolaire +consolament +consolar +consolat +consolèri +consòlic +consolidacion +consolidar +consomator +consomatritz +consomirh +consonança +consonanta +consonar +consonat +consòrcia +consòrt +consòuda +conspiracion +conspirator +conspiratritz +constant +Constantina +constantinés +Constantinòple +constatar +consternar +consternèri +constèrnic +constibar +constiblar +constipar +constitucion +constitucional +constitucionalista +constituirh +constrench +constrencha +constrencha +constrénger +constrenguèri +constrenhent +constrénher +constrenherai +constrenhi +constrenhiái +constrenta +construccion +construch +construcha +construguèri +construirh +construirai +construire +construisent +construit +construita +construsi +construsiái +construsirh +constubar +constupar +consulta +consultaire +consultant +consultar +consum +consumar +consumidor +consumirh +contacòp +contactar +contacte +contagiós +contaire +contament +contaminar +contar +contaralha +contarotlar +contarotlèri +contaròtlic +conte +conteiral +contemplar +contemporanèa +contemporanèu +contenéncia +contenent +contenent +conténer +contenguda +contenguèri +contengut +conteni +contenir +content +contentable +contentaire +contentament +contentar +contentièr +contèst +contèsta +contestable +contestaire +contestar +contestèri +contèstic +contèxt +contèxtual +contèxtuala +contigú +contigua +contigús +contilhon +continent +continú +continua +continuable +continuaire +continual +continualament +continuament +continuós +contorn +contornar +contornejargh +contornièra +contra +contrabalançargh +contrabanda +contrabandièr +contrabassa +contraccion +contracepcion +contracòr +contractar +contracte +contractura +contrach +contrada +contradiccion +contradictòri +contradictòria +contradich +contradicha +contradiguèri +contradirai +contradire +contradisent +contradisi +contradisiái +contrafaiçon +contrafaire +contrafar +contraire +contramandar +contramèstre +contraminar +contranòvi +contrapas +contraplacat +contrapoder +contrapoison +contrari +contrària +contrariaire +contrariament +contràriament +contrariant +contrariarazh +contrarietat +contrariós +contrarotlaire +contrarotlar +contrarotlèri +contraròtlic +contrast +contrastaire +contrastar +contratacargh +contratemps +contravencion +contravendrai +contravenent +contravenguda +contravenguèri +contravengut +contraveni +contraveniái +contravenir +contravent +contribuable +contribucion +contribuidor +contribuirh +contristar +contrit +controvèrsia +contumaç +contumaça +contumàcia +contumacis +contunh +contunha +contunhador +contunhar +conturbacion +conturbar +contusion +convalescéncia +convenablament +convenable +convenança +convenceira +convenceire +convencent +convéncer +convencerai +convenci +convenciái +convenciment +convencion +convencional +convencuda +convencut +convendrai +convenéncia +convenent +convenent +convenguda +convenguèri +convengut +conveni +conveniái +convenir +convenquèri +convent +convergéncia +convergent +convergirh +convèrsa +conversacion +conversar +conversèri +convèrsic +conversion +converteire +convertible +convertiment +convertirh +convesin +convèxa +convèxe +convexitat +conviarazh +conviccion +convidacion +convidada +convidadís +convidaire +convidar +convidatge +convís +convisar +convit +conviva +convivéncia +convocacion +convocar +convocar +convocarai +convocavi +convòi +convoquem +convoquèri +convoquetz +convòqui +convulsion +convulsiu +cookie +cooperacion +cooperatiu +cooperator +cooperatritz +cooptar +cooptèri +coòptic +coordenar +coordinacion +cop +còp +copa +copacap +copada +copadís +copador +copadura +copafum +copaire +copalard +copant +copapan +copaperdut +copapès +copar +coparàs +coparèla +copassejargh +copatge +copavedilhas +copejargh +copèl +copeleta +copelon +Copenaga +coperativa +copèri +copet +còpic +còpia +copiar +copiar +copièri +còpii +copilhon +copiós +copista +copola +copòla +copon +còpte +còptendrai +còptenent +còpténer +còptenguda +còptenguèri +còptengut +còpteni +còpteniái +copulacion +coput +coquèl +coquèla +coquelar +coquelejargh +coquelèri +coquèlic +coquelin +coquelós +coquem +coquèri +coquetz +còqui +coquin +coquinada +coquinalha +coquinar +coquinariá +coquinatge +coquinejargh +coquinèl +coquinet +coquinon +coquinòt +còr +corada +coral +coralada +coralament +coralh +coralha +coralhièra +coralin +corason +corasson +coratge +coratjós +coratjosament +còrb +corb +corbada +corbadòna +corbadura +corbaire +corbam +corbament +corbar +corbàs +corbassièr +corbatàs +corbatièra +corbèl +corbèl +corbèla +corbelh +corbeta +corbetar +corbièra +còrbmarin +corbut +còrcachal +còrcachar +còrcoissor +corcomalh +corcosson +corcossonar +corcossonós +còrcrebar +corcrebèri +corcrèbic +corcha +corchar +corchièra +còrda +cordada +cordaire +cordal +cordar +cordariá +cordat +cordatge +cordejargh +cordèl +cordèla +cordelar +cordelat +cordelèri +cordèlic +cordelièr +cordenc +cordèri +còrdic +cordièr +cordilh +cordilha +cordilhar +Còrdoa +cordoan +cordoan +còrdolent +còrdolguda +còrdolguèri +còrdolgut +còrdòli +còrdoliái +còrdolor +còrdòlrai +còrdòlre +còrdòlrent +cordon +cordonar +cordonariá +cordonejargh +cordonet +cordonièr +cordurar +Corèa +corean +còrfalhirh +còrfalit +corfendreh +córferirh +córfondreh +coriandre +coribant +Corint +corintièr +corinton +corintonièr +còrleugièr +corliu +côrmanar +còrmanat +còrn +còrna +còrnabuòu +còrnacèr +cornada +cornaire +cornalha +cornalièra +cornamusa +cornar +cornareda +cornassa +cornejargh +cornelut +cornenc +cornèri +corneta +còrnic +cornic +cornièr +cornièr +cornilh +cornilha +cornilhon +corniòla +cornissa +cornisson +Cornoalha +cornoga +cornuda +cornut +coròla +corona +coronadís +coronadura +coronaire +coronament +coronar +coronda +corondat +corondatge +corondèl +corondon +coronèl +corós +corosament +còrpa +còrpia +corpora +corporal +corporança +corporant +còrpus +corquichar +corra +corral +corratariá +corratatge +corratejargh +corratièr +corre +corrèc +correccion +corrèctament +corrècte +corrector +correctritz +corredís +corredor +correg +corregidor +corregirh +correguda +correguèri +corregut +correira +correire +correja +correjada +correjargh +correjariá +correjòla +correjon +correjonar +correjós +corrença +corrent +correnta +correntament +correntilha +correntina +córrer +correrai +correspodent +correspondéncia +correspondent +correspondreh +corri +corriái +corric +corrida +corrièr +corrieu +corrilh +corriòl +corriòla +corriolar +corriolèri +corriòlic +corrirh +corróbia +corroborar +corroç +corroçargh +corroçós +corròg +corrogada +corrolhada +corrolhar +corrolhariá +corrompeire +corrompement +corrompent +corrompèri +corrompi +corrompiái +corromprai +corrompre +corrompuda +corrompudament +corromput +corromput +corron +corron +corroquet +corrotada +còrs +cors +còrs +corsar +corsari +corsat +corsatge +còrsec +còrsecargh +Corsega +Corsega +corsegàs +corsegon +corsejargh +corselet +còrses +corsetaire +corsetar +corsièr +corsilhon +corsor +cort +cortada +cortal +cortalar +cortanèl +cortanela +cortanèla +cortapalha +cortàs +cortaud +cortaurelhas +cortavida +cortbolhon +cortcircuitar +cortègi +cortejaire +cortejargh +cortés +cortesan +cortesia +corteson +cortet +corteta +cortil +cortilha +cortin +cortina +cortinar +cortinatge +cortitge +cortiu +corton +cortpoisson +corveta +còrvirar +còs +coscodejargh +coscolh +coscolha +cosconilha +coscora +coscorilha +coscós +cosedor +cosedura +coseire +cosent +cóser +còser +coserai +cosèri +coseson +cosi +còsi +cosiái +cosin +cosinada +cosinaire +cosinar +cosinatge +cosinejargh +cosinièr +cosinus +cosirh +cosirada +cosívol +cosor +còspa +cospet +còssa +cossada +cossatge +cossegàs +cossegon +cosseguirh +cossejaire +cossejargh +cossergós +cosserguejargh +cossèrgues +cosset +cossí +cossilhon +cossirh +cossòla +cosson +cossonadís +cossonadura +cossonar +cossor +cossòta +cossut +còst +còsta +costada +costaire +costal +costalada +costalon +costar +còstarican +còstariquenc +costat +costatge +costejargh +costèl +costeleta +costelon +costèri +còstic +còsti +cóstia +costièr +costierenc +costilhon +costolar +costolin +coston +costonar +costós +costosament +costosidor +costosiment +costosirh +costugat +costum +costuma +costumar +costumièr +costut +cosut +cot +còt +còta +cotada +cotaire +cotal +cotança +cotangenta +cotar +cotat +cotatge +cotèl +cotèla +cotelada +cotelar +cotelariá +cotelàs +cotelassa +cotelejargh +cotelèri +cotèlic +cotelièr +cotelina +cotelon +cotèri +coteta +còtic +còti +cotianda +cotiga +cotigadura +cotigaire +cotigargh +cotigós +cotiguejargh +cotilhon +cotin +cotinaud +cotirh +cotís +cotissar +cotiva +cotolina +cotoliu +coton +cotonada +cotonar +cotonejargh +cotonièr +cotonina +cotonós +cotra +cotral +cotralada +cotralar +cotralhar +cotrassejaire +cotrassejargh +cotrassenc +cotre +cotrejargh +cotrejat +cotria +cotriada +cotrièr +cotrilhada +cotrís +cotseguirh +coucar +coüm +coümièr +craba +crabadèl +craca +cracaire +cracament +cracanda +cracargh +cracariá +cracatge +cracina +cracinada +cracinar +cracinejargh +cracineta +Cracòvia +craïnar +craïnejargh +cram +cramar +cramàs +cramesit +crampiòt +crampiu +crampon +cramponar +cran +cranar +cranc +crancargh +crancon +cranejargh +cranha +cranhar +crani +cranquièra +cranquilhon +crapa +crapar +crapàs +crapat +crapelós +crapièr +crapís +crapual +craquejargh +craquetar +cras +crascal +crascatge +crassa +crassador +crassalh +crassar +crassariá +crasset +crassièr +crassimar +crassinar +crassós +crassosament +crau +crauc +craular +crauma +craumèl +craumós +craumut +craunha +craunhat +cravacha +cravachar +cravata +cravatar +cravaton +cravenc +creac +creacion +crear +creat +creat +creator +creatritz +creatura +creaturar +creaturon +crèba +crèbabuòu +crèbacan +crèbacavala +crèbacòr +crebadís +crebador +crebadura +crèbafam +crebament +crebar +crebassa +crebassar +crebassina +crebasson +crebèri +crèbic +crèc +crèdit +creditar +creditor +credul +credulitat +creèri +creguda +cregueri +crèïc +creirai +creire +creis +creissèl +creisselonièra +creisselons +creissement +creissença +creissent +creissent +créisser +creisserai +creisseson +creissi +creissiái +creissonièra +creissons +crèl +crellar +crellèri +crèllic +crema +crèma +cremada +cremador +cremadura +cremalh +cremalha +cremalhar +cremalhièr +cremar +cremar +cremàs +cremason +cremat +cremèl +cremèri +crèmic +cremiu +cremor +cremós +crena +crénger +crenguda +crenguèri +crengut +crenhar +crenhassa +crenhença +crenhent +crénher +crenherai +crenhi +crenhiái +crenhirh +crenilh +crenilhadura +crenilhaire +crenilhament +crenilhar +crenirh +crensada +crensaire +crensar +crenta +crentar +crentiu +crentós +crentosament +crepuscul +cres +cresc +crescuda +crescut +creseire +cresença +cresent +créser +cresi +cresiái +cresinada +cresinal +cresp +crespadura +crespar +crespèl +crespelat +crespilhar +crespilhat +crespin +crespina +crespinar +crespinat +crespon +cresput +cresquèri +cressal +crest +cresta +crestabés +crestada +crestador +crestadura +crestaire +crestal +crestament +crestar +crestar +crestat +crestatge +crestejargh +crestèl +crestelon +crestenc +crestèri +crèstic +crestian +crestianament +crestianar +crestianisar +crestianisme +crestianizar +crestiantat +crestilh +creston +crestona +crestonar +Creta +creta +cretar +cretés +crètge +crèu +crèuge +creugem +creugèri +creugetz +crèugi +creujar +creujarai +creujavi +creule +creuma +cricada +cricaire +cricargh +cricòt +crida +cridada +cridadèsta +cridadís +cridaire +cridament +cridant +cridar +cridarèl +cridariá +cridassar +cridassejargh +cridèsta +crim +Crimèa +criminalitat +criminós +crin +crinal +crinca +crincargh +crincarelha +crinhassa +crinhat +crinièra +crinquet +crinut +criquet +crisi +crisocal +crisolit +Crist +cristal +cristalin +cristalisar +cristalizar +crit +critèri +criticargh +criuda +criudar +crivèl +crivèla +crivelada +criveladura +crivelaire +crivelar +crivelatge +crivelèri +crivelet +crivèlic +crivelièr +crivelum +Croàcia +croat +croc +cròc +cròca +cròça +crocadís +crocaire +crocanda +crocar +croçar +crocarai +croçarai +crocarèl +crocavi +croçavi +crocem +crocèri +croceta +crocetz +cròci +crocilha +crocinar +crocodil +crocut +crochon +crochonar +cròi +croissirh +crollar +cromatida +cromatina +cromatofòr +cromosòma +cromosomic +crompar +cronologia +cronometrar +cronometrèri +cronomètric +cropa +cropairon +cropal +cropiàs +cropièra +croput +croquem +croquèri +croquet +croqueta +croquetz +cròqui +cròs +cròsa +crosada +crosador +crosadura +crosaire +crosament +crosant +crosar +crosar +crosat +croselut +crosèri +croseta +cròsic +crosièra +crosilha +crosòla +cròssa +crossirh +crosta +crostada +crostalhut +crostar +crostàs +crostechon +crostejargh +crostet +crosteton +cròsti +crostièr +crostilh +crostilhaire +crostilhar +crostilhon +crostilhós +croston +crostonar +crostós +cròta +crotada +crotar +crotarèla +crotèri +crotet +cròtic +crotlar +crotlèri +cròtlic +crotòla +crotós +crotz +crovèl +crua +cruc +cruca +crucafavòtas +crucargh +crucat +crucific +crucificargh +cruga +cruguet +crugueta +cruguièr +cruissent +cruissiment +cruissirh +cruissirar +crum +crumada +crumassa +crumós +crup +cruparlhàs +crus +crus +crusa +crusament +crusca +cruscargh +cruscassar +crusejargh +crusèl +cruseltat +cruses +crusitge +crusòl +crusquejargh +crustacèu +cruvèl +cruvelar +cruvelèri +cruvèlic +cruvelut +cub +Cuba +cubada +cubadèl +cuban +cubar +cubat +cubatge +cubelha +cubèrt +cubeta +cubic +cubièr +cubribrèç +cubricap +cubricèl +cubricèla +cubrifòc +cubripè +cubrirh +cuc +cucargh +cuèch +cuèch +cuècha +cuècha +cuèissa +cueissut +cuèit +cuèita +cuèlher +cuèr +cuf +cufar +cufèla +cugargh +cugulièra +cuirassa +cuirassar +cuirassièr +cuissada +cuissal +cuissatge +cuissièra +cuissòt +cujança +cujargh +culada +culairon +cular +culassa +culatièr +culèfa +culejargh +culeta +culheire +culhida +culhidor +culhièr +culhierada +culhiment +culhiòt +culhirh +culhison +culinària +culirh +culon +culòt +culpa +culpar +culte +cultivable +cultivada +cultivador +cultivaire +cultivar +cultura +cultural +cumenjargh +cumin +cumulatiu +cumulativa +cunh +cunhar +cunhat +cunhièira +cunhièra +cuòissa +cuol +cuolbufós +cuolcosit +cuolfregargh +cuolpelat +cuolpoirit +cuolufós +cuòr +cup +cuquetar +cura +curabuòu +curacomuns +curada +curadents +curadís +curador +curadorat +curadura +curaestront +curafòc +curalh +curalhar +curalhat +curanís +curapera +curapès +curar +curat +curatariá +curatge +curatièr +curauèlhs +curd +Curdistan +curilh +curiós +curlirh +curós +curron +cusa +cuscuta +cusòl +cuson +cusson +cussonar +custòdia +cutanèa +cutar +cuticula +cuton +chabas +chablar +chabotar +chabreta +chabriolaire +chabriolar +chabriolèri +chabriolet +chabriòlic +chabròla +chabròt +chabrotar +chabrotèri +chabròtic +chabusclar +chac +chaca +chacada +chacaire +chacargh +chacàs +chacat +chacona +chacotar +chacotèri +chacòtic +Chad +chadian +chadre +chafar +chafaret +chafinhar +chafrar +chafre +chafre +chafrenar +chafrenat +chagòt +chagotar +chagotèri +chagòtic +chai +chal +chalar +chamada +chamàs +Chamberí +chamborlhadís +chamborlhaire +chamborlhar +chambotar +chambotèri +chambòtic +chambre +chammar +champa +champeirar +champeirèri +champèiric +champejargh +champestrejargh +champoirau +champolhar +chanal +chança +chancelon +chanut +chapada +chapadura +chapaire +chapar +chapilhar +chaplada +chapladís +chapladoira +chapladura +chaplaire +chaplament +chaplar +chaple +chaplum +chapòt +chapotadís +chapotaire +chapotar +chapotariá +chapotatge +chapotejargh +chapotèri +chapòtic +Charantas +charantés +charbotar +charbotèri +charbòtic +charcargh +chardit +chariscle +charlaire +charlar +charlariá +charlejargh +charlòt +charlotina +charnèga +charnegargh +charnegon +charnegós +charpadissa +charpaire +charpar +charpin +charpinada +charpinar +charpinós +charra +charra +charrada +charradís +charradissa +charragal +charragalhejargh +charraire +charramanha +charrar +charrarèri +charrin +charrinar +charròt +charrotada +charrotar +charrotèri +charròtic +chartrós +chas +chaspaire +chaspar +chaspatge +chaspejargh +chastra +chauchaire +chauchar +chauchàs +chauchilh +chauchilhar +chauchinar +chaucholar +chauchòlas +chaucholèri +chauchòlic +chaudél +chaupar +chaupicargh +chaupilh +chaupilhar +chaupin +chaupinar +chaupinhar +chaupirh +chaupre +chaurar +chaurimar +chaurirh +chaurit +chausida +chautrina +chavana +chavanar +chavanejargh +chèc +chèc +chechèn +Chechenia +chechon +chemenèia +cheminièira +Chequia +chequièr +cherrar +chèrre +chèrric +chèrri +chèstre +chic +chica +chicada +Chicago +chicaire +chicargh +chicon +chicotar +chicre +chichar +chicharra +chichet +chichomèia +chichorla +chif +chifla +chiflaire +chiflar +chiflariá +chifra +chifrar +Chile +Chile +chilen +chilian +chimada +chimaire +chimalha +chimar +chimarra +chimarradura +chimarraire +chimarrar +chimarratge +chimèra +chimeric +chimerlar +chimerlèri +chimèrlic +chimia +chimic +chimicargh +chiminièra +chimista +chimpa +chimpar +chimporlar +chimporlejargh +chin +China +chinar +chinareda +chinariá +chinàs +chinassariá +chincha +chinchar +chinchon +chinchorla +chinés +chinés +chinguet +chinièra +chipotar +Chipre +chipriòta +chiquet +chirp +chirpós +chispa +chispar +chitada +chitar +chiu +chiular +chiutar +chiutonar +cho +chòca +chocolat +chocorèia +chocha +chocho +chòina +chòine +choit +cholha +chomarrar +chomarro +chomarròl +chòp +chopar +chopar +chopèri +chòpic +choplar +chople +choquet +choquetar +chorlar +chorma +chormalha +chorra +chorrar +chorrilhar +chorrirh +chortar +chortèri +chòrtic +chòt +chotaire +chotar +chotèri +chòtic +chuc +chucaire +chucament +chucargh +chucarèl +chucós +chumar +chupar +chuquet +chuqueta +churga +churlar +churlumelar +churlumelèri +churlumèlic +churlutar +churmelar +churmelèri +churmèlic +d'a +d'abans +d'abausons +d'abocadents +d'abocons +d'abrogar +d'accedir +d'acoissar +d'acordar +d'acòrdi +d'aculhir +d'adaptar +d'adaptar +d'aduire +d'afortir +d'agafat +d'agir +d'aiçaí +d'aicí +d'aicí'nça +d'aicí'nla +d'ailà +d'ailí +d'alai +d'alargar +d'Alemanha +d'amagadons +d'amagat +d'amanhagar +d'amassar +d'America +d'amont +d'anar +d'anís +d'anonciar +d'aparténer +d'apartesir +d'apautons +d'aplicar +d'apojar +d'apondre +d'aprene +d'aprene +d'aprestar +d'aquel'ora'ndavant +d'aquí +d'aquí'ndavant +d'aquí'nfòra +d'aquí'nlà +d'aquí'nrèire +d'aquí'ntr'aqui +d'aquí'stant +d'Aquitània +d'ardor +d'arremicolons +d'arrestar +d'arribar +d'aspirar +d'assegurar +d'assetons +d'Aude +d'augmentar +d'augmentar +d'aut +d'avalorar +d'aver +d'avertir +d'aviar +d'avilir +d'el +d'elegit +d'empachar +d'emplegar +d'emplegar +d'empoisonar +d'en +d'encoratjar +d'enprenent +d'enrasigar +d'entendre +d'entreprendre +d'escambarlons +d'escondons +d'escotar +d'escotons +d'escriure +d'esper +d'esperar +d'espofidons +d'Estrasborg +d'estudiar +d'Euròpa +d'evitar +d'Evòri +d'executar +d'existir +d'i +d'illuminar +d'imaginar +d'imajar +d'imitar +d'importar +d'informar +d'informar +d'interés +d'interèsses +d'obesir +d'oblicar +d'oblidar +d'obténer +d'obtenir +d'obturar +d'Occitània +d'ofrir +d'onchar +d'ondejar +d'ont +d'ora +d'uèi +d'uèi +d'unes +d'utilizar +da +dabanar +dabena +dachar +daga +dagador +dagargh +daguejargh +dagueta +daguetar +dainelaissa +daissar +Dakar +dalfin +dalfinar +dalh +dalhada +dalhaire +dalhament +dalhar +dalhason +dalhatge +dalhon +dam +dam +damable +damaire +damaisèl +damaiselenc +damaiselum +damajana +damar +damarèl +Damàs +damàs +Damasc +damascèn +damaseilet +damasquin +damasquin +damasquinadura +damasquinaire +damasquinar +damasquinariá +damasquinatge +damassada +damassar +damassatge +damatge +damb +dambe +damejargh +dameta +damnar +damoçar +damorçar +dan +dança +dançador +dançaire +dançargh +dançarèl +dançareta +dançariá +dançatge +dancejargh +dancièr +dançum +Danemarc +danés +danés +dangeirós +dangièr +dangierós +Danièl +Danubi +danubian +dapàs +dapasset +dapassièr +dapasson +daquòs +dar +darbon +darbonada +darbonar +darbonièr +darbós +darbossièra +darbossilha +darbostat +darcargh +dard +dardaire +dardalh +dardalhada +dardalhament +dardalhant +dardalhar +dardalhejargh +dardana +dardar +dardejun +dardejunar +dardèl +dardena +dardenaire +Dardenne +dardenós +darna +darnagàs +darnar +darreirenc +darreiriá +darreirrotge +darrièr +darrièrament +darut +darwinisme +das +dasièr +dat +data +dàtil +datz +dau +daubar +daudèla +daurada +dauradura +dauraire +daurar +dauratge +daurèia +daurejargh +daurièr +daus +dausar +daval +davalada +davalador +davalaire +davalament +davalar +davalenc +davançargh +davancièr +davant +davantal +davantalat +davantantan +davantièr +davantièr +davantièrassa +davantiu +davantjorn +davantora +davantura +daverar +dçamenet +de +debanada +debanador +debanadura +debanaire +debanament +debanar +debanatge +debanèl +debarcada +debàs +debassaire +debassariá +debasson +debat +debateire +debatreh +debil +debit +debita +debitaire +debitant +debitar +debitor +debolicant +debolirh +deborraire +debotar +debrembar +debut +debuta +debutant +debutar +dèc +dec +deçà +decadéncia +decadenciar +decadencièri +decadénciic +decaèdre +decagòne +deçai +decalatge +decantar +decapitar +decargh +dècas +decebable +decebeire +decebement +decebent +decebèri +decebi +decebiái +decebrai +decebre +decebuda +decebuda +decebut +decedirh +decelar +decembre +decéncia +decepcion +decépia +decepiam +decépian +decépias +decepiatz +decernirh +decès +decesa +decessar +decidirh +decimal +decimar +decision +decisiu +declamar +declamatar +declaracion +declarar +declinar +decomposicion +decoracion +decorar +decoratiu +decorèri +decòric +decretar +decuplar +dedal +dedalat +dedicacion +dedicargh +dedins +deduch +deduch +deducha +deduguèri +deduida +deduirai +déduire +deduisent +deduit +deduit +dedusi +dedusiái +dedusirh +defalhença +defalhent +defalhida +defalhiment +defalhirh +defalirh +defaut +defautar +defèci +defeciar +defeciar +defecièri +defècii +defeciós +defectuós +defendeire +defendent +defendreh +defenduda +défenirh +defensa +defensable +defensiu +defensor +deferéncia +deferent +deferirh +defés +definhós +definicion +definida +definiment +definirh +deflorirh +defluxion +defonsament +defonsar +defòra +defrabitar +defronhe +defúgerh +defugiment +defugirh +defunt +defuntar +degalh +degalhadís +degalhador +degalhaire +degalhar +degalhièr +degalhiu +degalhós +degan +deganaci +deganaissa +deganat +deganèsta +deganissar +degarambirh +degarar +degarèsta +degast +degatinhaire +degatinhament +degatinhar +degatinhós +degavalh +degavalhaire +degavalhar +degavalhós +degelirh +degestirh +degetar +deglend +deglendar +deglende +déglutirh +degodilhada +degodilhar +degòl +degolar +degolar +degolèri +degolhadura +degolhar +degolhar +degolhèri +degòlhic +degòlic +degorar +degot +degotament +degotant +degotar +degoteg +degotièra +degotirh +degrà +degradar +deguda +deguèri +deguèrt +deguertant +deguilhon +degun +degunament +degut +degut +deimaire +deimar +deimariá +deimatge +dèime +deisse +dejalar +dejós +dejun +dejun +dejunada +dejunaire +dejunar +del +delà +delagar +delagavi +delai +delai +delaiarazh +delaissar +delampar +delanhar +delant +delatar +delavaci +delavar +delavat +delèch +delechable +delechar +delechèri +delechós +delegacion +delegargh +delegarai +delegirh +deleguem +deleguèri +deleguetz +delègui +delèit +deleitable +deleitar +deleitèri +delèitic +deleitós +delembrar +delenc +delgat +Delhi +deliarazh +deliberar +deliberèri +delibèric +delicadesa +delicat +delici +delícia +deliciós +deliciosament +delicte +delièchic +deligèia +deliment +delimitar +delincargh +delinquéncia +delinquent +delinquent +deliquescéncia +delirh +delirar +deliri +delogar +delovi +dels +delubre +deluvi +demacargh +demagargh +demai +deman +demanda +demandaire +demandar +demandet +demantalhar +demantaular +demarrimar +demasiadament +demasiadura +demasiar +demasièri +demàsiic +demegem +demegèri +demegetz +demejar +demejarai +demejavi +demembrar +demenar +deméncia +demendigargh +demenida +demeniment +demenirh +demens +dementirh +dementre +demercé +demés +demesconeguda +demesconeguèri +demesconegut +demesconeissent +demesconéisser +demesconeisserai +demesconeissi +demesconeissiái +demescòrdi +demesiment +demesirh +demesit +demespesar +demesse +demest +demetreh +demièg +demiègi +demiejar +demingargh +democracia +democracia +democrata +democrata +democratic +demograf +demografa +demografia +demografic +demoguda +demoguèri +demogut +demoliment +demolinar +demolirh +demòni +demonstracion +demonstracion +demòra +demorada +demoraire +demorança +demorant +demorar +demorèri +demòric +demostracion +demostrança +demostrar +demostrèri +demòstric +demourai +demòure +demòvi +demoviái +dempuèi +den +denada +denant +denantorar +denarridar +denaut +dencarrar +dendespuèi +denegar +denegar +denegarai +denegavi +deneguem +deneguèri +deneguetz +denègui +denhar +denieirada +denieiròla +denièr +denistar +denombrament +denombrar +denominacion +denominador +denon +denóncia +denonciar +denoncièri +denónciic +denotar +denotèri +denòtic +dens +densificargh +dent +dentada +dentadura +dentalh +dentalha +dentariga +dentat +dentegat +dentejargh +dentèla +dentelejargh +dentelh +dentelhar +dentelièr +denticion +dentilha +dentilhon +dentrita +denudament +denudar +denutricion +depaissent +depàisser +depaisserai +depaissi +depaissiái +departament +departemental +depascuda +depascut +depasquèri +depaus +depausar +depench +depench +depencha +dependéncia +dependent +dépendreh +depengeire +depénger +depenguèri +depenheire +depénher +depenherai +depenhi +depenhiái +deperiment +dépérirh +depès +depint +depintar +depòrt +deportament +deportar +deportèri +depòrtic +depositar +depòst +deprémer +depremerai +depremèri +depremi +depremiái +depremirh +depremuda +depremut +deprimar +deprimirh +deputat +dequé +deragargh +derbese +derecap +dereng +dèri +derivabla +derivable +derivacion +derivar +dèrma +dermatologia +derogar +derogar +derogarai +derogavi +deroguem +deroguèri +deroguetz +derògui +deroïment +deroïrh +deroïre +derraic +derraiga +derraigargh +derraigatge +derreigòpi +des +dès +desabalirh +desabarirh +desabelirh +desaben +desabestirh +desabilhar +desabitar +desabituarazh +desabonar +desabrigargh +desabusar +desacart +desacartar +desacatar +desacaumar +desaceirarr +desacieirar +desacieirèri +desacièiric +desacierar +desacierèri +desacièric +desacipar +desaclatar +desacoblar +desacocholirh +desaconselhar +desacòrd +desacordança +desacordar +desacordèri +desacòrdic +desacòrdi +desacostumar +desacotar +desacotèri +desacòtic +desacotirh +desacrocar +desacrocar +desacrocarai +desacrocavi +desacroquem +desacroquèri +desacroquetz +desacròqui +desachinirh +desadelirh +desafairirh +desafamar +desafilar +desaflorar +desafogar +desafogar +desafogarai +desafogavi +desafoguem +desafoguèri +desafoguetz +desafògui +desaforcargh +desafrairar +desafruchar +desagafar +desagantar +desagargh +desagarar +desagarrar +desagençargh +desagradabla +desagradablament +desagradable +desagradament +desagradança +desagradant +desagradar +desagradiu +desagrafar +desagrat +desagregar +desagregar +desagregavi +desagreguem +desagreguèri +desagreguetz +desagrègui +desagrotlar +desagrotlèri +desagròtlic +desaguici +desaibar +desaimar +desaïrh +desaise +desajaçargh +desajargh +desajudar +desajustar +desalar +desalatar +desalbirar +desalenar +desalenat +desalendar +desalendat +desaliarazh +desaligargh +desalogar +desalterar +desalterèri +desaltèric +desamagargh +desamairar +desamairirh +desamanar +desamarrar +desamatar +desamor +desamorrar +desan +desanament +desanar +desancargh +desandalhar +desanelar +desanelèri +desanèlic +desanhelar +desanhelèri +desanhèlic +desanisar +desanoblirh +desansar +desantorar +desaparaguda +desapareguèri +desaparegut +desapareissent +desaparéisser +desapareisserai +desapareissi +desapareissiái +desaparelhar +desapariar +desaparièri +desapàriic +desapartença +desapartirh +desapegargh +desapejargh +desapesar +desapetissar +desapilar +desaponchar +desapostemirh +desaprendrai +desaprendre +desaprene +desaprenent +desaprenguèri +desapreni +desapreniái +desaprés +desapresa +desaprestar +desaprestèri +desaprèstic +desaprimar +desaprivasar +desaprofechar +desaprofechèri +desaprofeitar +desaprofeitèri +desaprofèitic +desaprofièchic +desaprovar +desaprovèri +desapròvic +desapuntar +desar +desarborar +desarcinar +desarçonar +desardolar +desardolar +desardolèri +desardòlic +desarestar +desargentar +desarmar +desarmejargh +desarnescargh +desarpiar +desarpièri +desàrpiic +desarquetar +desarrapar +desarremosar +desarrendar +desarribar +desarrimar +desarropirh +desarrucargh +desarsar +desart +desartelhar +desaseimar +desaseimèri +desasèimic +desasermar +desasermèri +desasèrmic +desasimar +desassargargh +desassasonar +desassedar +desassegurar +desassermar +desassetar +desassetèri +desassètic +desassocargh +desassociar +desassociar +desassocièri +desassòcii +desassortirh +desastrar +desastre +desastrós +desatapar +desatelar +desatelèri +desatèlic +desatusonar +desaubar +desaubirar +desaurelhar +desausinar +desavantatge +desavantatjargh +desavantatjós +desavendrai +desavenent +desavenent +desavenguda +desavenguèri +desavengut +desavenhe +desaveni +desaveni +desaveniái +desavenir +desaventura +desaventurat +desaventurós +desavesar +desaviarazh +desbacegargh +desbacla +desbaclar +desbadar +desbadaular +desbadocar +desbadocar +desbadocarai +desbadocavi +desbadoquèri +desbadòqui +desbagatjargh +desbaissar +desbalaire +desbalament +desbalançargh +desbalar +desbalatge +desbalausida +desbalausirh +desbalindrar +desbalitrinar +desbanada +desbanar +desbanastar +desbancargh +desbandada +desbandar +desbanicargh +desbaranhar +desbaratar +desbarbar +desbarbelar +desbarbelèri +desbarbèlic +desbarbenar +desbarcador +desbarcament +desbarcargh +desbardar +desbarlugargh +desbarrar +desbarràs +desbarrassament +desbarrassar +desbarrassiu +desbarrotar +desbarrotèri +desbarròtic +desbarrotirh +desbaruta +desbarutar +desbastada +desbastador +desbastar +desbastatge +desbastejargh +desbastiment +desbastirh +desbatalhar +desbatanar +desbatar +desbatejaire +desbatejargh +desbatelar +desbatelèri +desbatèlic +desbatiflar +desbatreh +desbauç +desbauçargh +desbavar +desbavelaire +desbavelar +desbavelèri +desbavèlic +desbefiar +desbefiar +desbefièri +desbèfii +desbelitrar +desbendament +desbendar +desbequinhar +desbiaissat +desbiardar +desbibolat +desbigossar +desbigossassejargh +desbigossèri +desbigòssic +desbinhar +desbitrolat +desblasaira +desblasar +desbletar +desbletonar +desblocargh +desboact +desboçar +desbocargh +desboçar +desboçarai +desbocassament +desbocassar +desboçavi +desbocelar +desbocelèri +desbocèlic +desbocem +desbocèri +desbocetz +desbòci +desboclar +desbochardirh +desbochinar +desboissar +desbolar +desbolegargh +desbolhirh +desbolida +desbolirh +desbondada +desbondar +desbondonar +desbonetar +desbòrd +desbordador +desbordament +desbordar +desbordelar +desbordelèri +desbordèlic +desbordèri +desbòrdic +desbornar +desbornèri +desbòrnic +desborrada +desborrador +desborral +desborrar +desborrassar +desborrilhada +desborrilhar +desborronar +desborsar +desborselar +desborselèri +desborsèlic +desbosar +desboscalhadura +desboscalhament +desboscalhar +desboscar +desboscar +desboscarai +desboscavi +desboselar +desboselèri +desbosèlic +desbosiga +desbosigaire +desbosigargh +desbosigatge +desbosirh +desbosolar +desbosolèri +desbosòlic +desbosquem +desbosquèri +desbosquetz +desbòsqui +desbotar +desbotar +desbotelhar +desbotèri +desbòtic +desbotinar +desbotonar +desbraçargh +desbragargh +desbraguetar +desbrancagh +desbranda +desbrandar +desbregargh +desbrembar +desbrembièr +desbrenar +desbretar +desbribar +desbridada +desbridar +desbridatge +desbrinar +desbrís +desbrisar +desbriscargh +desbrossar +desbrostar +desbrotar +desbrugargh +desbrulhar +desburgalhar +desburrar +desc +descabalar +descabanar +descabassar +descabdelar +descabdelèri +descabdèlic +descabeçargh +descabelar +descabelhar +descabestrar +descaborlar +descabossar +descabossèri +descabòssic +descabridar +descabucelar +descabucelèri +descabucèlic +descabussar +descaça +descaçargh +descaçolar +descaçolèri +descaçòlic +descadaissar +descadaular +descadenar +descadenciar +descadencièri +descadénciic +descai +descairai +descaire +descaire +descaissalar +descaissar +descalabrat +descaladaire +descaladar +descaladatge +descalar +descalçargh +descalhar +descalonar +descalotar +descalotèri +descalòtic +descambaligargh +descambar +descambatar +descambiaire +descambiar +descambièri +descàmbiic +descaminar +descamisar +descampar +descampassiment +descampassirh +descamusar +descanilhar +descanilhatge +descantar +descantelar +descantelèri +descantèlic +descantonar +descapaironar +descapar +descaparar +descapelada +descapelar +descapelatge +descapelèri +descapèlic +descapilhar +descapitar +descapolhar +descaramelar +descaramelèri +descaramèlic +descarament +descarar +descarbar +descarcavelar +descarcavelèri +descarcavèlic +descaremar +descarga +descargadoira +descargador +descargament +descargargh +descarnador +descarnadura +descarnaire +descarnament +descarnar +descarnassirh +descarnilhar +descarpitarh +descarrar +descarrelar +descarrelèri +descarrèlic +descartairar +descasar +descasença +descasent +descàser +descasèri +descasi +descasiái +descassar +descassidar +descastrar +descasuda +descasut +descat +descatalanar +descatar +descatirh +descatonar +descauç +descauçament +descauçanar +descauçargh +descauçatge +descaucelar +descaucelèri +descaucèlic +descaudar +descaular +descaunar +descauquilhar +descausar +descausirh +descautar +descavalgargh +descavar +descavilhar +descelerar +descelerèri +descelèric +descenchar +descendent +descendreh +descenduda +descenglar +descentralisar +descentralizacion +descentralizar +descerclar +descervelar +descervelèri +descervèlic +descessar +descessonar +descigoladura +descigolar +descigonhar +descilhar +descimatar +descimelar +descimelèri +descimèlic +descimentar +descindrador +descindrament +descindrar +descinge +descinglar +descinjargh +descintar +descisclar +desclacargh +desclapaire +desclapar +desclapassar +desclapatge +desclassar +desclaurai +desclaure +desclausent +desclausèri +desclausi +desclausiái +desclausuda +desclausut +desclavar +desclavelar +desclavelèri +desclavèlic +desclisquetar +desclocar +desclocarai +desclocavi +desclocirh +descloquem +descloquèri +descloquetz +desclòqui +descloscar +desclucargh +desclucirh +descluchar +descoarazh +descoatar +descobèrt +descobertar +descobertèri +descobèrtic +descobilhonar +descoblar +descobrirh +descocirar +descoconada +descoconaira +descoconar +descoconatge +descodar +descodenar +descodèri +descòdic +descoetar +descofar +descofelar +descofelèri +descofelhar +descofèlic +descofèri +descòfic +descoforlhar +descoguèri +descoirai +descòire +descoissar +descoissar +descoissarai +descoissavi +descoissem +descoissèri +descoissetz +descolanar +descolar +descolèri +descolha +descolhaire +descolhar +descòlic +descolonisar +descolonizar +descolorar +descomandament +descomandar +descomblar +descomble +descompartirh +descompastar +descompausar +descomplaguda +descomplaguèri +descomplagut +descomplaire +descomplarai +descomplasent +descomplasi +descomplasiái +descomposicion +descomprimirh +descomptar +descon +desconat +desconcargh +desconcaratge +desconcertar +desconcertèri +desconcèrtic +desconeguda +desconegut +desconeissable +desconeissança +desconeissent +desconeissent +desconéisser +desconeisserai +desconeissi +desconeissiái +desconfès +desconfessa +desconfessit +desconfida +desconfièch +desconfiguèri +desconfirai +desconfire +desconfisent +desconfisi +desconfisiái +desconfit +desconflar +desconfòrt +desconfortar +desconfortèri +desconfortic +descongeirarrh +descongieirar +descongieirèri +descongièiric +descongierar +descongierèri +descongièric +desconnectar +desconnectèri +desconnèctic +desconnexion +desconoguda +desconoguèri +desconogut +desconóisser +desconoisserai +desconoissi +desconoissiá +desconselhar +desconsolar +desconsolèri +desconsòlic +descontenéncia +descontenenciar +descontenencièri +descontenénciic +desconvenable +desconvendrai +desconvenéncia +desconvenent +desconvenent +desconvenguda +desconvenguèri +desconvengut +desconveni +desconveniái +desconvenir +desconvidar +descopetar +descoquelar +descoquelèri +descoquèlic +descòr +descoraire +descorant +descorar +descoratjament +descoratjant +descoratjargh +descorbecelar +descorbecelèri +descorbecèlic +descordar +descordejargh +descordelar +descordelèri +descordèlic +descordèri +descòrdic +descordurada +descordurar +descoreguèri +descorèri +descòric +descornar +descornèri +descòrnic +descoronar +descorós +descorrejonar +descortés +descortesament +descortiá +descortinar +descoscolhar +descosent +descóser +descoserai +descosèri +descosi +descòsi +descosiái +descosirh +descostarar +descostelar +descostelèri +descostèlic +descosuda +descosut +descotar +descotelar +descotelèri +descotèlic +descotèri +descòtic +descotida +descotidor +descotirh +descotissar +descrassar +descrassirh +descrausselhar +descreguda +descreguèri +descregut +descreirai +descreire +descreis +descreissença +descreissent +descréisser +descreisserai +descreissi +descreissiái +descrenar +descrentirh +descrescut +descresença +descresent +descresent +descresguda +descresi +descresiái +descresquèri +descrestar +descrestianar +descrich +descridament +descridar +descriguèri +descrinhar +descripcion +descriptiu +descriure +descrivent +descrivi +descrocar +descroçar +descrocar +descroçar +descrocarai +descroçarai +descrocavi +descroçavi +descrocem +descrocèri +descrocetz +descròci +descrochonar +descroissirh +descronquetar +descroquem +descroquèri +descroquetz +descròqui +descrosament +descrosar +descrostar +descrotadoira +descrotador +descrotaire +descrotar +descrotatge +descrotèri +descròtic +descrovelar +descrovelèri +descrovèlic +descruissirh +descrusada +descrusar +descrusatge +descrussirh +descruvelar +descruvelèri +descruvèlic +descubrirh +descucargh +descuèch +descuecha +descueissar +descueissèri +descuèissic +descuèissi +descuèit +descuèita +descuèlha +descufelar +descufelèri +descufèlic +descuferlar +descuferlèri +descufèrlic +descuiarazh +descuissar +descular +desculèri +desculpa +desculpar +descunchar +descuòlic +descurbecelar +descurbecelèri +descurbecèlic +descurbirh +descuscargh +descharpirh +deschicargh +deschifranhar +deschifrar +deschucargh +desdaurar +desdejunar +desdenh +desdenhar +desdenhós +desdenhosament +desdentar +desdich +desdich +desdicha +desdiguèri +desdire +desdisent +desdisi +desdit +desdit +desdita +desdoblar +desdolçargh +desegèri +desègi +deseimat +deseiriçargh +desejar +desejar +desejarai +desejavi +deseleccionar +desembalar +desembanastar +desembarrar +desembarrassar +desembaumar +desembestiar +desembestiat +desembestièri +desembèstii +desemboissar +desembolhada +desembolhaire +desembolhament +desembolhar +desemborniar +desemborniar +desembornièri +desembòrnii +desembriagargh +desembular +desembulhar +desemmascargh +desemmascatge +desempacha +desempachar +desempalunar +desempantenar +desempaquetar +desemparaire +desemparament +desemparar +desempedirh +desempegargh +desempegomirh +desempeitar +desempeitrar +desempenar +desempesar +desempescargh +desempesolhar +desempesolhirh +desempestar +desempestelar +desempestelèri +desempestèlic +desempestèri +desempèstic +desempetegargh +desemplastar +desemplenar +desemplirh +desempoisonar +desempresonar +desemprimar +desempuèi +desempusar +desen +desen +desen +desenament +desenamorar +desenantirh +desenar +desenastar +desencabalar +desencabdelar +desencabdelèri +desencabdèlic +desencadenar +desencafornar +desencaissar +desencalar +desencalatge +desencant +desencantaire +desencantament +desencantar +desencarnar +desencarrar +desencigalar +desenclaurai +desenclaure +desenclaurirh +desenclausèri +desenclausi +desenclausiái +desenclausirh +desenclausuda +desenclausut +desenclavar +desencoconar +desencodar +desencodèri +desencòdic +desencolar +desencolèri +desencòlic +desencombrar +desencongeirarrh +desencongieirar +desencongieirèri +desencongièiric +desencongierar +desencongierèri +desencongièric +desencorar +desencorèri +desencòric +desencrancargh +desencrocar +desencrocarai +desencrocavi +desencroquem +desencroquèri +desencroquetz +desencròqui +desencrosar +desencrosèri +desencròsic +desencrotar +desencrotèri +desencròtic +desencrumirh +desenculpa +desenculpar +desencusa +desencusar +desendalhar +desendeutar +desendormirh +desendurcirh +desenebriadura +desenebriar +desenebrièri +desenébriic +desenfangargh +desenfardelar +desenfardelèri +desenfardèlic +desenfarinar +desenfecirh +desenfectar +desenfectèri +desenfèctic +desenfeirarrh +desenfeirejargh +desenferonar +desenferriar +desenferriar +desenferrièri +desenfèrrii +desenfieirar +desenfieirèri +desenfièiric +desenfierar +desenfierejargh +desenfierèri +desenfièri +desenfilar +desenfladura +desenflar +desenfornar +desenfosquirh +desengabiar +desengabièri +desengàbiic +desengainar +desengalochar +desengalochèri +desengalòchic +desenganar +desengargh +desengarrancirh +desengatjargh +desengaunhar +desengavachar +desengodofar +desengolirh +desengolopar +desengorgargh +desengranaire +desengranar +desengranatge +desengravar +desengrepesirh +desengrunar +desengulhar +desenièr +desenjaçargh +desenjocargh +desenlanhar +desenlusiment +desenlusirh +desennegresirh +desennivolirh +desenraiarazh +desenraiçargh +desenrampesirh +desenraucargh +desenraumassar +desenregargh +desenregistrar +desenrestar +desenrestèri +desenrèstic +desens +desens +desensablar +desensacargh +desensalvatgirh +desensebelirh +desenselar +desenselèri +desensèlic +desensolfrar +desensolprar +desensortirh +desentanhar +desentaular +desenterigargh +desenterrar +desenterrèri +desentèrric +desentestar +desentestèri +desentèstic +desentoissar +desentortibilhar +desentortilhar +desentortovilhar +desentrafegargh +desentravar +desentrepachar +desentristar +desentusar +desentutar +desenvelar +desenverenar +desenvescargh +desenviroutar +desenviroutèri +desenviròutic +desenvitar +desenvolopar +desenvrimar +deserbaire +deserbar +deserbatge +deserbèri +desèrbic +desermassirh +desernhar +desernhèri +desèrnhic +deserpèr +desèrt +desertar +desertèri +desèrtic +desertor +desertós +desescargh +desescufelar +desescufelèri +desescufèlic +desescuferlar +desescuferlèri +desescufèrlic +desescumenjargh +desescusa +desesper +desesperable +desesperadament +desesperaire +desesperança +desesperant +desesperar +desesperèri +desespèric +desespessesirh +desespinar +desespuèi +desestabilisar +desestabilizar +desestamar +desestatjargh +desestimar +desestivar +desfaciar +desfacièri +desfàciic +desfacha +desfada +desfaiçonar +desfaire +desfaissar +desfaisselar +desfaisselèri +desfaissèlic +desfaita +desfaminar +desfangargh +desfar +desfarda +desfarfolhar +desfaseire +desfata +desfatar +desfaut +desfautar +desfavor +desfavorable +desfèci +desfeirarrh +desfelcirh +desfemelar +desfemelèri +desfemèlic +desfenatar +desfèrra +desferrar +desferrèri +desfèrric +desferrolhar +desfialargargh +desficargh +desfieirar +desfieirèri +desfièiric +desfielargargh +desfierar +desfierèri +desfièric +desfigargh +desfilament +desfilar +desfilargargh +desfilfrar +desfís +desfisança +desfisant +desfisar +desfissonar +desfiusar +desflacargh +desflamar +desflectirh +desflocar +desflocarai +desflocat +desflocavi +desfloquem +desfloquèri +desfloquetz +desflòqui +desflorar +desflorirh +desfogar +desfogar +desfogarai +desfogavi +desfoguem +desfoguèri +desfoguetz +desfògui +desfolhar +desfolharai +desfolhat +desfolhavi +desfolhem +desfolhèri +desfolhetz +desfondreh +desfonzar +desformar +desfornirh +desforrelar +desforrelèri +desforrèlic +desfortuna +desfortunar +desforviarazh +desfrachivar +desfrairar +desfranjargh +desfraunhar +desfrenar +desfrescumar +desfrocar +desfrocar +desfrocarai +desfrocavi +desfronzirh +desfroquem +desfroquèri +desfroquetz +desfròqui +desfruchaire +desfruchar +desfrutirh +desfuèlhi +desfulhar +desfumar +desgafar +desgafetar +desgafonar +desgaiarazh +desgainar +desgaissar +desgaissonar +desgalaspar +desgaletar +desgambiat +desganachar +desganissar +desgansar +desgansilhar +desgantar +desgarambirh +desgarar +desgargalhar +desgargamelar +desgargamelèri +desgargamèlic +desgargantar +desgarlandar +desgarniment +desgarnirh +desgarrolhar +desgarronar +desgaspador +desgaspar +desgatar +desgatilhar +desgatinhament +desgatinhar +desgatinhós +desgatjargh +desgaubiadura +desgaubiat +desgaular +desgaunhada +desgaunhaire +desgaunhar +desgaunhós +desgautar +desgavachirh +desgavelar +desgavelèri +desgavèlic +desgèl +desgelada +desgelador +desgeladura +desgelar +desgelatge +desgelèri +desgèlic +desgermirh +desgetar +desgetèri +desgètic +desgiblar +desgiscletar +desgitar +desgiussar +desglaçargh +desglariat +desglebar +desglen +desglenada +desglenar +desglesirh +desglevar +desgobilhar +desgofonar +desgolhar +desgolhar +desgolhèri +desgòlhic +desgordiment +desgordirh +desgorgament +desgorgargh +desgorgolhar +desgosierar +desgosierèri +desgosièric +desgost +desgostaire +desgostant +desgostar +desgostós +desgràcia +desgraciament +desgraciar +desgracièri +desgràciic +desgraciós +desgraciosament +desgradable +desgradar +desgraissador +desgraissaire +desgraissar +desgraissatge +desgramenirh +desgranar +desgrapar +desgravar +desgresar +desgrevament +desgrevar +desgrevèri +desgrèvic +desgrinhar +desgrossador +desgrossiment +desgrossirh +desgrotlar +desgrotlèri +desgròtlic +desgrudar +desgrulhar +desgrunar +desguindat +desguisament +desguisar +desièc +designacion +designar +desincrementar +desincrustar +désinfectar +desinfectèri +desinfèctic +désintégrar +desintegrèri +desintègric +desinterès +desinteressar +desinteressèri +desinterèssic +desir +desirança +desirar +desirós +desistiment +desistirh +desjaçargh +desjardinar +desjoca +desjocargh +desjogar +desjogar +desjogarai +desjogavi +desjoguem +desjoguèri +desjoguetz +desjògui +desjonch +desjoncha +desjonchar +desjonguèri +desjonhent +desjónher +desjonherai +desjonhi +desjonhiái +desjúnher +desjunt +desjuntar +deslabrar +deslaçargh +deslachar +deslagastar +deslaiarazh +deslanhar +deslardar +deslardatge +deslargargh +deslassament +deslassar +deslatar +deslausar +desleial +desleialtat +deslengat +desliamar +desliarazh +deslièch +desliechar +desliechèri +deslièchic +desligamar +desligargh +deslimar +desliurança +desliurar +desliure +deslocalisar +deslocalizar +deslogar +deslogarai +deslogavi +desloguem +desloguèri +desloguetz +deslombar +deslotgem +deslotgèri +deslotgetz +deslòtgi +deslotjament +deslotjar +deslotjar +deslotjarai +deslotjavi +desluòguic +desluògui +desmacargh +desmagargh +desmagencaire +desmagencargh +desmagencatge +desmaiencargh +desmairar +desmaissar +desmalhar +desmalholar +desmalholèri +desmalhòlic +desmalhugadura +desmalhugargh +desmalmorit +desmalonar +desmalugargh +desmamar +desmamatge +desmanada +desmanadar +desmancipar +desmandar +desmanegargh +desmaneirarrh +desmanieirar +desmanieirèri +desmanièiric +desmanierar +desmanierèri +desmanièric +desmanilhar +desmanjament +desmanjargh +desmantaular +desmantelament +desmantelar +desmantelèri +desmantèlic +desmantendrai +desmantenent +desmanténer +desmantenguda +desmantenguèri +desmantengut +desmanteni +desmanteniái +desmanteniment +desmantenir +desmaonar +desmarcargh +desmargadura +desmargargh +desmargolar +desmaridar +desmarlhar +desmarmalhar +desmarrar +desmarrimar +desmascargh +desmascarar +desmasclaire +desmasclar +desmastar +desmasticargh +desmatalhar +desmatar +desmelsat +desmembrar +desmemoriament +desmemoriar +desmemoriarai +desmemoriavi +desmemoriem +desmemorièri +desmemorietz +desmemòrii +desmenar +desmentar +desmentida +desmentirh +desmerdar +desmerdèri +desmèrdic +desmeritar +desmeriti +desmerletar +desmesclar +desmescomptar +desmescompte +desmesconeguda +desmesconeguèri +desmesconegut +desmesconeissença +desmesconeissent +desmesconéisser +desmesconeisserai +desmesconeissi +desmesconeissiái +desmesolar +desmesura +desmesurar +desmetreh +desmicargh +desmigrar +desmineralisar +desmineralizar +desmingrar +desmobilisar +desmobilizar +desmoblament +desmoblar +desmoblèri +desmòblic +desmofar +desmonedar +desmontar +desmoralisar +desmoralizar +desmordent +desmordèri +desmòrdi +desmordiái +desmordirh +desmordrai +desmòrdre +desmorduda +desmordut +desmorenar +desmorralhar +desmorrar +desmorricargh +desmorsar +desmorsèri +desmòrsic +desmoscolar +desmostosirh +desmotar +desmuda +desmudar +desmuralhar +desmusclar +desmusclassar +desmuselar +desmuselèri +desmusèlic +desnantirh +desnarridar +desnasar +desnasicargh +desnaturar +desneblar +desneblèri +desnèblic +desnevar +desnevèri +desnèvic +desnisaire +desnisar +desnistar +desnivolirh +desnogalhada +desnogalhaire +desnogalhar +desnombrar +desnosador +desnosaire +desnosar +desnoselar +desnoselèri +desnosèlic +desnovar +desnovèri +desnòvic +desnoviat +desobesirh +desoblidar +desobligargh +desobrança +desobrar +desobrat +desobrèri +desòbric +desobstruirh +desolar +desolèri +desolhar +desolhar +desolhar +desolharai +desolhavi +desolhem +desolhèri +desolhetz +desòlic +desonçargh +desondrar +desondre +desonèst +desonestat +desonglar +desonorar +desontar +desontirh +desorat +desòrde +desordenar +desòrdre +desormejargh +desorriar +desorriarai +desorriavi +desorriem +desorrièri +desorrietz +desòrrii +desossament +desossar +desossèri +desòssic +desostalar +desoxiribonucleïc +despaciença +despacient +despacientar +despacha +despachaire +despachar +despachatiu +despachosament +despadelar +despadelèri +despadèlic +despaïsanirh +despaïsar +despaissar +despaisselar +despaisselèri +despaissèlic +despalar +despalastracargh +despalastrar +despalhar +despalhosirh +despalissonar +despampa +despampadura +despampaire +despampanar +despampar +despampatge +despanar +despanaussar +despangerlar +despangerlèri +despangèrlic +despanjarnar +despanolhada +despanolhar +despantolhar +despapachar +despaquetar +desparar +desparaular +desparaulat +despareguda +despareguèri +desparegut +despareissent +desparéisser +despareisserai +despareissi +despareissiái +desparentar +despariar +desparièr +desparièri +despàriic +desparlar +desparlatge +desparpelar +desparpelèri +desparpèlic +desparrar +desparrassar +desparricargh +despart +despartament +despartida +despartiment +despartirh +despaslmentar +despassar +despassionar +despastar +despastelar +despastelèri +despastèlic +despatar +despatat +despatolhar +despatriarazh +despaupar +despauralable +despausa +despausar +despava +despavar +despavonar +despeçaire +despeçar +despeçar +despeçaraix +despeçatge +despeçavif +despecejargh +despecem +despecèriw +despecetz +despècie +despecolhar +despechar +despechèri +despechós +despechosament +despegargh +despeirar +despeirèri +despèiric +despeissonar +despeitar +despeitós +despeitosament +despeitralhar +despeitrinar +despelar +despelardar +despelargargh +despelèri +despelhofar +despelhofèri +despelhòfic +despèlic +despelofrar +despelofrèri +despelòfric +despelonar +despellar +despellèri +despèllic +despenar +despenchenar +despendolar +despendreh +despenjargh +despens +despensar +despepidar +desperdent +desperdèri +despèrdi +desperdiái +desperdiciar +desperdicièri +desperdíciic +desperdrai +despèrdre +desperduda +desperdut +desperferirh +desperrecargh +despersonar +despèrt +despertar +despertèri +despèrtic +despescargh +despeselhar +despesolhar +despessesirh +despestelar +despestelèri +despestèlic +despestilhar +despetegargh +despetissar +despetorlar +despicargh +despièch +despiechar +despiechèri +despièchic +despieissar +despieissèri +despièissic +despieitar +despieitèri +despièitic +despietadós +despietadosament +despigargh +despigason +despilhar +despillar +despinar +despintar +despitralhar +despitrar +despiuselar +despiuselatge +despiuselèri +despiusèlic +desplaçament +desplaçargh +desplaguda +desplaguèri +desplagut +desplairai +desplaire +desplaisent +desplaissar +desplancargh +desplantador +desplantaire +desplantar +desplantatge +desplasença +desplasent +desplàser +desplaser +desplasi +desplasiái +desplec +desplecargh +desplega +desplegada +desplegadament +desplegaire +desplegargh +desplegat +desplegatge +desplegatòri +desplenar +desplombar +desplumar +despoblaire +despoblament +despoblar +despoblèri +despòblic +despocelar +despocelèri +despocèlic +despochinar +despoderament +despoderar +despòlha +despolhament +despolhangat +despolhar +despolhar +despolharai +despolhavi +despolhem +despolhèri +despolhetz +despolinar +desponchar +despondar +despondreh +despóner +desponguda +desponguèri +despongut +desponhent +despónher +desponherai +desponhi +desponhiái +despopador +despopar +desporcelar +desporcelèri +desporcèlic +desporgador +desporgargh +desporguèra +desporriolar +desporriolèri +desporriòlic +despòrt +desportar +desportèri +despòrtic +despossedirh +despostar +despostelar +despostelèri +despostèlic +despostèri +despòstic +despòta +despotar +despotelar +despotenciar +despotencièri +despoténciic +despotèri +despoterlar +despoterlèri +despotèrlic +despòtic +despotic +despotinar +despreciacion +despreciar +despreciar +desprecièri +desprècii +despresar +despresèri +desprèsic +despresós +desprimar +desprofechar +desprofiechèri +desprofièchic +desprometreh +desprovesiment +desprovesirh +despuèi +despuèlha +despuèlhi +despulhar +despuntar +despuòi +desquerbar +desquerbèri +desquèrbic +desquerdar +desquerdèri +desquèrdic +desquestirh +desquet +desquilhar +desquitar +desrabada +desrabaire +desrabar +desrabatge +desrabissar +desraçargh +desracinar +desradar +desraiçargh +desraigargh +desraissar +desralhament +desralhar +desramar +desrambolhar +desrambulhar +desrancargh +desrantelandor +desrantelar +desrascargh +desrascassirh +desrasigargh +desrasonar +desrastolhar +desratar +desraubar +desrausar +desrebondreh +desregargh +desreglament +desreglar +desreglèri +desrèglic +desregoïrh +desrelhar +desrenar +desrengament +desrengargh +desrevelhar +desrevesirh +desribar +desriblar +desròc +desrocar +desrocar +desrocarai +desrocavi +desroire +desromegargh +desrompreh +desroquem +desroquèri +desroquetz +desròqui +desrot +desrota +desrotlament +desrotlar +desrotlèri +desròtlic +desrovilhar +desrufar +desruna +desrunar +desrupar +desruscada +desruscaire +desruscament +desruscargh +desruscatge +dessabar +dessabatar +dessaborament +dessaborar +dessacargh +dessadolar +dessagelar +dessagelèri +dessagèlic +dessagrilhar +dessagrotlar +dessagrotlèri +dessagròtlic +dessalar +dessaldar +dessalivar +dessan +dessanflorar +dessanhar +dessara-pericles +dessarra +dessarrar +dessasiment +dessasirh +dessason +dessasonar +dessauclar +dessaurar +dessè +dessecament +dessecant +dessecargh +dessegondar +desselar +desselèri +dessèlic +dessemblable +dessemblança +dessemblant +dessemblar +dessenar +dessenh +dessenhaire +dessenhar +dessensat +dessentèri +desseparar +dessèrt +dessèrt +desservirh +dessessonar +desseudar +dessilhar +dessobre +dessobtada +dessobtaire +dessobtar +dessobtatge +dessocargh +dessoirat +dessolar +dessolason +dessolelhar +dessolèri +dessòlic +dessolprar +dessompartirh +dessonar +dessosterraire +dessosterrar +dessosterrèri +dessostèrric +dessota +dessotadessubre +dessoudar +dessoudèri +dessòudic +dessouprar +dessouprèri +dessòupric +dessucelar +dessucelèri +dessucèlic +dessujargh +dessuplar +dessurjargh +dessús +dessusar +destablar +destaboissonar +destacament +destacança +destacargh +destalentaire +destalentar +destalhar +destalonar +destalpar +destalpeirarrh +destalpieirar +destalpieirèri +destalpièiric +destalpierar +destalpierèri +destalpièric +destamar +destampar +destancargh +destanciar +destancièri +destànciic +destançonar +destanguda +destanguèri +destangut +destanhent +destànher +destanherai +destanhi +destanhiái +destapada +destapaire +destapar +destapatge +destapiar +destapièri +destàpiic +destapissar +destaponar +destaranhar +destarinhar +destarirh +destatarinar +destaupar +destaussar +destavelar +destavelèri +destavèlic +destecargh +destéisser +desteisserai +desteissi +desteissiái +destelh +destelhar +destemplat +destemporat +destench +destencha +destenchurar +destenda +destendar +destendilhar +destendreh +destenembrar +destenembre +destenguèri +destenhent +desténher +destenherai +destenhi +destenhiái +destepar +destermenaire +destermenament +destermenar +desterminar +destesar +destescuda +destescut +destesquèri +destestar +destestèri +destèstic +destetador +destetar +desteular +destibar +destilhar +destillacion +destillador +destillaire +destillament +destillar +destillariá +destimborlaire +destimborlar +destimbrar +destin +destinacion +destinacion +destinacion +destinacion +destinada +destinar +destinari +destinària +destinatari +destinatària +destinelar +destinelatge +destinelèri +destinèlic +destinga +destinguirh +destintar +destintarrar +destituirh +destombar +destopar +destorbaire +destorbament +destorbar +destorbe +destorbi +destorbièr +destorcer +destorcerai +destorcèri +destòrci +destorciái +destorçuda +destorçut +destorn +destornaire +destornament +destornar +destòrni +destornicargh +destorniós +destorrada +destorrar +destorrèri +destòrric +destòrs +destorsa +destortilhar +destortonar +destoscaire +destoscargh +destrabalhar +destracanar +destrachiment +destrachirh +destrafegargh +destrainar +destral +destralada +destralejargh +destrambalat +destrampalar +destranhar +destrantalhar +destrantolar +destrantolèri +destrantòlic +destrapa +destrapada +destrapar +destrar +destrastar +destraucargh +destravar +destraversar +destraversèri +destravèrsic +dèstre +destrecesirh +destrechan +destrechesirh +destrefelida +destrefelirh +destrelingargh +destreman +destremar +destrempa +destrempament +destrempar +destrempe +destrenaire +destrenar +destrench +destrencha +destrenguèri +destrenhador +destrenheire +destrenhent +destrénher +destrenherai +destrenhi +destrenhiái +destrèri +destresch +destressa +destressonar +dèstric +destriadura +destriaire +destriament +destriarazh +destric +destricargh +destricat +destrièr +destrigargh +destroçar +destroçargh +destrocar +destrocarai +destrocavi +destrocelar +destrocelèri +destrocèlic +destropar +destropelar +destropelèri +destropèlic +destroquem +destroquèri +destroquetz +destròqui +destruccion +destruci +destructor +destructritz +destruguèri +destruidor +destruirh +destruirai +destruire +destruisent +destruit +destruita +destruseire +destrusi +destrusiái +destrusidor +destrusiment +destrusirh +destudar +destuferlat +desturbar +desturbelar +desturbelèri +desturbèlic +desturbi +desturmelar +desturmelèri +desturmèlic +desturrar +desturrassar +desuelhar +desuèlhi +desunirh +desvalent +desvaler +desvalguda +desvalguèri +desvalgut +desvali +desvaliái +desvalisar +desvalorar +desvalorisar +desvalorizar +desvalrai +desvantar +desvari +desvariaire +desvariar +desvarièri +desvàriic +desvedelar +desvedelèri +desvedèlic +desvedilhar +desvelar +desvelh +desvelhar +desvencirh +desventar +desverdegaire +desverdegargh +desverdegatge +desverdiar +desverdièri +desvérdiic +desverenar +desvergargh +desverginar +desvergonhar +desverilhar +desvernissar +desverrolhar +desvèrs +desversar +desversèri +desvèrsic +desvertegargh +desvertolhar +desvesador +desvesar +desvestirh +desviacion +desviador +desviadura +desviament +desviarazh +desvirada +desviraire +desvirar +desviratge +desvirolar +desvirolèri +desviròlic +desvisar +desvisatjargh +desvissar +desvistar +desvitalhar +desvolar +desvolent +desvoler +desvolèri +desvolguda +desvolguèri +desvolgut +desvòlic +desvòli +desvoliái +desvolopaire +desvolopament +desvolopar +desvolrai +desvolzar +desvólzer +desvousent +desvouser +desvouserai +desvousèri +desvòusi +desvousiái +desvousuda +desvousut +det +detada +detalh +detalhaire +detalhant +detalhar +detalhièr +detectat +detendrai +deteneire +detenent +deténer +detenguda +detenguèri +detengut +deteni +deteniái +détenir +detergirh +deteriorar +determinacion +determinar +detràs +dètz +dètzenat +deumaire +deumar +deumari +dèume +deumièr +deurai +deure +dèus +deutarèl +deute +deuteire +deutenièr +devalisar +devastacion +devastador +devath +devegadas +deveire +devendrai +devenent +devenguda +devenguèri +devengut +deveni +deveniái +devenir +devent +dever +deverdiar +deverdièri +devérdiic +devèrs +deversar +deversèri +devèrsic +devertut +devés +devesar +devesiment +devesirh +devi +deviái +devina +devinable +devinador +devinaire +devinalha +devinar +devinarèl +devinat +devinhar +devinhòla +devinòla +devís +devisa +devisar +devissar +devistaire +devistar +devoraire +devorant +devorar +devorèri +devòric +devoriment +devorirh +devòt +devotament +devòtament +devotitge +devouseire +devousoira +Dhaka +diablament +diablariá +diablatada +diablatalha +diablatàs +diablaton +diable +diablejargh +diablèra +diablessa +diablotalha +diablotin +diaga +diagnostica +diago +diagrama +diague +diahuròa +dialècte +dialòg +dialogar +dialogar +dialogarai +dialogavi +dialoguem +dialoguèri +dialoguetz +dialògui +diamant +diana +dianar +diantre +diccionari +dictada +dictaire +dictar +dictat +dictator +dictatura +dich +dicha +didactic +didal +didaròl +dièsi +dieu +dieumercé +dièure +dieusa +difamar +diferéncia +diferenciacion +diferenciar +diferencièri +diferénciic +diferent +diferentament +diferirh +dificil +dificilament +dificultar +dificultós +difluirh +difòrme +diformitat +difteria +difteric +diftong +diftong +diftongargh +difusar +difusion +digerirh +digèst +digestiu +digitalisar +digitalizar +digitigrada +digitigrade +digne +dignitat +diguèri +digús +Dijon +dijonenc +dijòs +dijòus +dilapidar +dilatacion +dilatar +dilemna +diligéncia +diligent +diligentament +diligentar +diluirh +diluns +dilús +diluvian +dimars +dimècres +dimenge +dimenjada +dimenjal +dimension +diminucion +diminuirh +dimorfisme +dinamic +dinamic +dinamicament +dinamisme +dinar +dinda +dindard +dindòl +dindola +dindolièr +dinnada +dinnadís +dinnaire +dinnalhar +dinnar +dinnaron +dins +dintrar +dintre +diocèsi +diplodòcus +diploïda +diploïde +diplòma +diplomatic +dirai +dire +direccion +dirèctament +dirècte +director +directritz +dirigent +dirigenta +dirigirh +diriment +dirimirh +disavèrt +disc +discerniment +discernirh +disciple +disciplina +disciplinari +disciplinària +discípol +discontinú +discontinua +discontunhar +discordància +discordant +discordar +discordèri +discòrdic +discòrdia +discorreire +discorrirh +discors +discotèca +discrecion +discreta +discriminacion +discriminant +discriminatòria +disculpar +discussion +discutirh +disent +diser +disgràcia +disgraciar +disgracièri +disgràciic +disgraciós +disi +disiái +disjonctor +dislocargh +dispareguda +dispareguèri +disparegut +dispareissent +disparéisser +dispareisserai +dispareissi +dispareissiái +dispàrer +disparerai +dispari +dispariái +disparicion +dispausar +dispausicion +dispensar +dispergirh +dispèrs +dispersar +disponible +disponobilitat +disposicion +dispositiu +disputa +disputaire +disputar +disputejargh +dissabte +dissecar +dissecar +dissecarai +dissecavi +disseminar +dissentèri +dissequem +dissequèri +dissequetz +dissèqui +dissestre +dissillab +dissolguda +dissolguèri +dissolgut +dissolvent +dissolvent +dissòlver +dissolverai +dissòlvi +dissolviái +dissòlvre +dissouda +dissout +dissuadirh +distància +distanciar +distancièri +distànciic +distic +distillar +distinguirh +distraccion +distrach +distracha +distraguèri +distrairai +distraire +distrasent +distrasi +distrasiái +distre +distribucion +distribuirh +distributiu +distributiu +distributivitat +dit +dita +ditada +diva +divenc +divendres +divergéncia +divergirh +divèrs +divèrsa +divèrses +diversificargh +diversitat +divertiment +divertirh +divessa +dividend +dividirh +divin +divinitat +divinizar +divisar +divisibilitat +divisible +division +divisor +divòrci +divorciar +divorciarai +divorciavi +divorciem +divorcièri +divorcietz +divòrcii +divulgada +divulgargh +dò +do +doana +doanièr +doari +doarièra +doas +doat +dobèrt +dobertura +dobla +dobladura +doblaire +doblairon +doblament +doblar +doble +doblièr +doblon +dobrirh +dobtaire +dobtança +dobtar +dobte +dobtós +doç +doçaina +doçamara +doçament +doçanha +doçàs +doçassa +docejargh +docet +docetament +docil +docilitat +docinèl +docinós +docirh +doçor +doçorós +dòcte +doctor +doctoressa +doctrina +doctrinari +doctrinària +document +documentacion +documentari +documentària +doçura +docha +dochaire +dochar +doèla +doelar +doelèri +doèlic +doga +dogam +dogat +dògma +dogmatic +dògol +doguin +doidar +doirar +dòl +doladoira +dolaire +dolar +dolatge +dòlça +dolçargh +dòldre +dolença +dolent +dolent +dolentament +dolentar +dolentós +dòler +dolèri +dolguda +dolguèri +dolgut +dolh +dolha +dolhar +dolhon +dòlic +dòli +doliái +dolmèn +dolor +dolorós +dolrai +dòlre +dòma +domaisèl +domaiselat +domaiselenc +domaiseleta +domaiselum +domdaira +domdaire +domdar +domengal +domeni +domenjargh +domergadura +domergal +domergargh +domergirh +domèrgue +domestic +domètge +dometjargh +domicili +domiciliari +domiciliària +dominacion +dominància +dominar +Dominica +dominican +dominicargh +don +dona +dòna +dònabèla +donada +donador +donaire +donar +donar +donarèl +donavent +donc +doncas +dondable +dondada +dondadura +dondaire +dondar +donde +donèri +dònic +donjon +dont +donzèl +dorbirh +dordar +dordèri +dòrdic +dordol +dorg +dorgada +dorgadeta +dorgue +dorguet +dorguièra +dormeire +dorment +dormiàs +dormiaud +dormida +dormidoira +dormidor +dormilhós +dormilhum +dormirh +dormitòri +dorna +dornada +dornèl +dornet +dornha +dorsièr +dos +dosar +dosen +dosèri +dòsic +dòsi +dosilhada +dosilhar +dossièr +dostar +dostèri +dòstic +dòt +dotar +dotz +dotzar +dotze +dotzen +dotzena +dòu +dòure +dova +drac +draca +dracada +draga +dragargh +dragas +dragàs +dragassar +dragèa +drageia +dragon +dragona +dragonàs +draguejargh +draguet +draiarazh +draina +dralh +dralha +dralhada +dralhadura +dralhaire +dralhar +dralhatge +dralhet +dralhòl +dramaturg +drandalhar +drandolar +drandolèri +drandòlic +dranga +drap +drapar +drapariá +drapèl +drapet +drapèu +drapièr +drapilha +drapina +draussa +draussar +dreçargh +drech +drecha +drechament +drechièr +drechor +drechura +drechurièr +drechurièrament +dreiça +dreiçador +dreiçaire +dreiçargh +dreicièra +dreit +dreitament +dreitièr +dreitor +dreitura +dreiturièr +dreiturièrament +drenar +driça +drilha +drilhança +drilhant +drilhar +drindar +drindòl +dringa +dringat +drivar +dròga +drogar +drogar +drogarai +drogariá +drogavi +droguejargh +droguem +droguèri +droguetz +drògui +droguista +drolha +drolhar +drolhenc +drolhièr +drolhièr +drolhon +drollalha +drollat +drollatalha +drollatièr +dròlle +drollejargh +drollet +dròna +drud +drudament +drudariá +drudejargh +drudesa +druditge +drudor +druèlha +druide +druidessa +drulhenc +drulhièr +drulhièr +drulhon +duala +dubèrt +dubertura +Dublin +dubrirh +duc +ducargh +duganèl +dugargh +dugàs +dugon +duna +duncas +duneta +duntras +duò +duò +duquessa +dur +durablament +durable +durada +duradís +dural +durament +duran +durant +durar +durbèc +durbirh +durcirh +durdar +duresa +duret +duretat +durièr +dusca +duscas +dzetà +e +è +ebèn +ebenariá +ebenièr +ebenista +ebglotat +ebissoaraz +ebissoat +eboliment +ebosigarg +ebosigat +ebraïc +ebraïca +Èbre +Ebrèu +ebri +ébria +ebriac +ebriaca +ebriagarg +ebriagat +ebriarb +ebriat +ebrièrid +ébriic +ebullicion +ecir +ecirada +ecirara +ecirat +eclesiastic +eclesiastica +eclipsara +eclipsat +eclipsi +ecologia +ecologic +ecologista +economia +economic +economica +ecran +ectar +ectogram +ectolitre +edat +edicion +edictara +edictat +edicte +edificarg +edificat +edifici +edil +edilitat +Edimborg +editara +editat +editor +editorial +ediu +edor +èdra +educacion +educacion +educarg +educat +educatiu +educativa +efant +efècte +efectiu +efectivament +efectuara +efectuat +efèit +efemèr +efemèra +eficaç +eficaça +eficaçament +eficàcial +eficacita +eficacitat +efièch +efièit +èga +egadon +egal +egala +egalara +egalat +egalejarg +egalejat +egalisara +egalisat +egalitari +egalitat +egalizara +egalizat +egassadal +egassièr +egatadal +egatièr +egèal +egèul +egipcian +egipcian +egipcian +egipciana +Egipte +egrègi +egrègia +eiada +eiara +eiarb +eiat +eibaucarg +eibaucat +eidracarg +eidracat +eièrid +èiic +eila +èime +eimendara +eimendat +eirara +eiretara +eiretat +eiretatge +eiretièr +eiretièra +eiriç +eiriçada +eiriçament +eiriçarg +eiriçat +eiriçon +eiseu +eissabancarg +eissabancat +eissabra +eissabrancarg +eissabrancat +eissabranlara +eissabranlat +eissabre +eissac +eissagada +eissagaire +eissagant +eissaganta +eissagarg +eissagat +eissagatara +eissagatat +eissalanca +eissalara +eissalat +eissalatada +eissalatara +eissalatat +eissaliva +eissalivara +eissalivat +eissam +eissamada +eissamara +eissamat +eissamat +eissamatge +eissamenara +eissamenat +eissanara +eissanat +eissancarg +eissancas +eissancat +eissarmara +eissarmat +eissarpa +eissarpara +eissarpat +eissarrara +eissarrasiri +eissarrasit +eissarrat +eissart +eissartada +eissartaire +eissartara +eissartat +eissartatge +eissartiri +eissartit +eissaurada +eissaurara +eissaurat +eissaure +eissaurelhara +eissaurelhat +eissaurida +eissaurit +eissausiri +eissausit +eissegarg +eissegat +eissegatara +eissegatat +eisselhon +eisselse +eissemara +eissemat +eissendret +eissendut +eisserbarb +eisserbat +eisserbèrid +eissèrbic +eissermenara +eissermenat +eisserment +eissermentaira +eissermentara +eissermentat +eissèrques +eissertiri +eissertit +eissida +eissida +eissigalara +eissigalat +eissilhara +eissilhat +eissinge +eissinja +eissinjarg +eissinjat +eissirara +eissirat +eissirpas +eissirpe +eissirpós +eissit +eissits +eissivernarb +eissivernat +eissivernèrid +eissivèrnic +eissoblidara +eissoblidat +eissolelhara +eissolelhat +eissolevarb +eissolevat +eissolevèrid +eissolèvic +eissorbament +eissorbarb +eissorbat +eissorbèrid +eissòrbic +eissordada +eissordara +eissordat +eissordatge +eissordós +eissordosa +eissorida +eissorit +eissormara +eissormat +eissuch +eissucha +eissuchina +eissugada +eissugador +eissugaire +eissugament +eissugarg +eissugat +eissugatge +eissugatièra +Eivissa +eivissenc +ejectarb +ejectat +ejectèrid +ejèctic +el +ela +ela +elaborarb +elaborat +elaborèrid +elabòric +elastic +elastica +èldra +elebòr +eleccion +elector +electoral +electorala +electricitat +electrificarg +electrificat +electrisara +electrisat +electritz +electrizara +electrizat +electrocutara +electrocutat +electrolisara +electrolisat +electrolizara +electrolizat +electronic +elefant +elegant +eleganta +elegantejarg +elegantejat +elegible +elegiri +elegit +elèit +element +elemental +elementar +elementara +elementari +elementària +eles +elevada +elevadura +elevaire +elevament +elevarb +elevat +elevatge +elevèrid +elèvic +èlfe +elhauç +elhauçarg +elhauçat +elidiri +elidit +eliminacion +eliotròpi +èlm +elògi +eludiri +eludit +Elx +elze +ellipsa +emai +emanara +emanat +ematia +ematologia +embabiarb +embabiat +embabièrid +embàbiic +embabinara +embabinat +embabochiri +embabochit +embaboinara +embaboinat +embaboquiri +embaboquit +embabotiri +embabotit +embabucarg +embabucat +embacegarg +embacegat +embadaliri +embadoquida +embadoquit +embafara +embafat +embagarg +embagassara +embagassat +embagat +embailencarg +embailencat +embaimara +embaimat +embainar +embainara +embaïri +embaïsadura +embaisara +embaisat +embaissa +embaissada +embaissador +embaisset +embait +embal +embaladit +embaladoira +embalaire +embalara +embalàs +embalascada +embalascarg +embalascat +embalassat +embalat +embalatge +embalausida +embalausidura +embalausiment +embalausiri +embalausit +embalçarg +embalçat +embalmara +embalmat +embalme +embalsemara +embalsemat +embanadura +embanaire +embanament +embanara +embanastara +embanastat +embanastatge +embanat +embanatge +embandara +embandat +embandiri +embandit +embanicarg +embanicat +embaranara +embaranat +embarandara +embarandat +embarandús +embaranhara +embaranhat +embaratara +embaratat +embarbolhara +embarbolhat +embarcador +embarcament +embarcatge +embarda +embardada +embardara +embardat +embardonara +embardonat +embarg +embarga +embargaire +embarganhara +embargarg +embargat +embarginaire +embarginara +embarginat +embargnhat +embarra +embarrada +embarrador +embarraire +embarrament +embarrara +embarrarg +embarràs +embarrasièr +embarrasiu +embarrasiva +embarrassaire +embarrassant +embarrassanta +embarrassara +embarrassat +embarrassièra +embarrassós +embarrats +embarratge +embarreirarbr +embarreirrat +embarretinara +embarretinat +embarriarb +embarriat +embarricarg +embarricat +embarrieirarb +embarrieirat +embarrieirèrid +embarrièiric +embarrierarb +embarrierat +embarrierèrid +embarrièric +embarrièrid +embàrriic +embarrilhara +embarrilhat +embartassara +embartassat +embasonara +embasonat +embassada +embassador +embastaire +embastara +embastardiment +embastardiri +embastardit +embastat +embastatge +embastonara +embastonat +embat +embatatge +embatret +embatut +embauç +embauçada +embauçador +embauçarg +embauçat +embaudada +embaudat +embaudufara +embaudufat +embaugida +embaugit +embaulhara +embaulhat +embaumadura +embaumaire +embaumament +embaumant +embaumanta +embaumara +embaumat +embaunhara +embaunhat +embaurada +embauraire +embaurara +embaurat +embausemara +embausemat +embavada +embavara +embavarilhament +embavarilhant +embavarilhanta +embavarilhara +embavarilhat +embavat +embavosiri +embavosit +embedossara +embedossat +embèfi +embèfia +embefiar +embefiar +embefiaraix +embefiavif +embefièriw +embèfiie +embeguda +embeguèriw +embeguinadura +embeguinament +embeguinara +embeguinat +embegurara +embegurat +embegut +embèl +embeleg +embelejarg +embelejat +embelic +embelida +embeliment +embelinaire +embelinament +embelinara +embelinat +embeliri +embelit +embemiar +embendara +embendat +embendelarb +embendelat +embendelèrid +embendèlic +emberbesiment +emberbesiri +emberbesit +embercar +embercar +embercaraix +embercavif +emberlucarg +emberlucat +emberquem +emberquèriw +emberquetz +embèrquie +embessa +embessara +embessat +embessonara +embessonat +embessonatge +embestèstii +embestiadura +embestiaire +embestiament +embestiant +embestianta +embestiarb +embestiat +embestièrid +embèstiie +embetumara +embetumat +embeudara +embeudat +embeuraix +embeure +embevement +embeviu +embeviáiv +embiaçarg +embiaçat +embiaissara +embiaissat +embigossada +embigossarb +embigossat +embigossat +embigossèrid +embigòssic +embijonara +embijonat +embladara +embladat +emblaimara +emblaimat +emblancada +emblancarg +emblancat +emblanquiment +emblanquinara +emblanquinat +emblanquiri +emblanquit +emblausiri +emblausit +emblestarg +emblestat +emblodada +emblodat +emblotiri +emblotit +embocadís +embocadura +embocaire +emboçar +emboçar +embocarg +emboçaraix +embocat +emboçavif +embocem +embocèriw +embocetz +embòcie +embochardiri +embochardit +embodelarb +embodelat +embodelèrid +embodèlic +embodenament +embodenara +embodenat +embodessèrid +embodoscarg +embodoscat +embodossarb +embodossat +embodòssic +embodracarg +embodracat +emboemiaire +emboemiar +emboemiar +emboemièri +emboèmii +embofara +embofat +embofiri +embofit +embogida +embogit +emboiricarg +emboiricat +emboisselarb +emboisselat +emboisselèrid +emboissèlic +emboissonara +emboissonat +emboissoniri +emboissonit +embolacarg +embolacat +embolara +embolat +emboldrara +emboldrat +embolemiar +embolh +embolha +embolhacada +embolhacat +embolhaire +embolhament +embolhara +embolhat +embolhatge +embolhós +embolhosa +embolidorara +embolidorat +embolnada +embolnador +embolnara +embolnat +embolnenc +embolnèri +embolon +embolzenara +embolzenat +embollara +embollat +emboncarg +emboncat +embonetara +embonetat +embonilh +emboniment +emboniri +embonissent +embonissenta +embonit +embonnara +embonnat +emboquinara +emboquinat +embord +emborda +embordada +embordaire +embordara +embordat +embordescarg +embordescat +embordièr +embordiri +embordit +emborginara +emborginat +emborjarg +emborjat +emborlharb +emborlhat +emborlhèrid +embòrlhic +embornarb +embornat +embornegada +embornegarg +embornegat +embornèrid +embòrnic +emborniada +emborniaire +emborniament +emborniar +emborniarai +emborniavi +emborniem +embornièri +embornietz +embòrnii +emborrador +emborraire +emborrara +emborrassara +emborrassat +emborrat +emborratge +emborrelida +emborrelit +emborriri +emborrissara +emborrissat +emborrit +emborrombara +emborrombat +emborronara +emborronnat +emborsa +emborsara +emborsat +embosara +embosat +emboscada +emboscar +emboscar +emboscaraix +emboscavif +embosenara +embosenat +embosquem +embosquèriw +embosquetz +embòsquie +embotador +embotaire +embotara +embotarrara +embotarrat +embotat +embotatge +embotelada +embotelaire +embotelarb +embotelat +embotelat +embotelatge +embotelèrid +embotelhara +embotelhat +embotèlic +embotergarg +embotergat +embotidura +embotigarg +embotigat +embotinhar +embotinhara +embotiri +embotit +embraç +embraça +embraçada +embraçaire +embraçament +embraçarg +embraçat +embracelarb +embracelat +embracelèrid +embracèlic +embracetara +embracetat +embragadura +embragament +embragarg +embragat +embraiarza +embraiarza +embraiat +embraigarg +embraigat +embranara +embranat +embrancada +embrancament +embrandara +embrandarg +embrandat +embrasament +embrasara +embrasat +embrasugarg +embrasugat +embrecada +embrecadura +embregonara +embregonat +embremara +embremat +embrenada +embrenaire +embrenament +embrenar +embrenara +embrenarg +embrenat +embrenatge +embrenicarg +embrenicat +embresenara +embresenat +embriac +embriaga +embriagada +embriagadissa +embriagadura +embriagaire +embriagament +embriagant +embriaganta +embriagarg +embriagat +embriaguesa +embricalhara +embricalhat +embricant +embricanta +embricarg +embricat +embrimara +embrimat +embrinara +embrinat +embrindara +embrindat +embrion +embrocar +embrocaraix +embrocavif +embroissar +embroissar +embroissarai +embroissavi +embroissem +embroissèri +embroissetz +embrolarb +embrolat +embrolèrid +embròlic +embronc +embronca +embroncada +embroncadura +embrondara +embrondat +embroquem +embroquèriw +embroquetz +embròquie +embrucliri +embruclit +embrudara +embrudat +embrueissarb +embrueissat +embrueissèrid +embruèissi +embruèissic +embrugarg +embrugat +embrulhegarg +embrulhegat +embrumara +embrumassara +embrumassat +embrumat +embruniri +embrunit +embrustiarb +embrustiat +embrustièrid +embrústiic +embrutara +embrutat +embrutiri +embrutit +embucarg +embucat +embufada +embufara +embufat +embufecar +embufecar +embufecaraix +embufecavif +embufelarb +embufelat +embufelèrid +embufèlic +embufequem +embufequèriw +embufequetz +embufèquie +embuforlara +embuforlat +embugadara +embugadat +embugarg +embugat +embuglara +embuglat +embulh +embulhara +embulhat +embullara +embullat +embuscada +embuscarg +embuscat +embut +embutaire +embutara +embutat +emegem +emegèri +emegetz +emejar +emejarai +emejavi +emenda +emendabla +emendable +emendaire +emendament +emendara +emendat +emendièr +emés +emesa +emetent +emetret +emicicle +emicicle +emiègi +emiejar +Emília +emilian +eminéncia +Emirat +emission +emmagazinara +emmagazinat +emmagenara +emmagenat +emmagresiri +emmagresit +emmalautiri +emmalautit +emmaliciarb +emmaliciat +emmalicièrid +emmalíciic +emmalignara +emmalignat +emmaliri +emmalit +emmandara +emmandat +emmanhaguiri +emmanhaguit +emmanhotada +emmanhotarb +emmanhotat +emmanhotat +emmanhotèrid +emmanhòtic +emmanilhara +emmanilhat +emmanolhara +emmanolhat +emmantelarb +emmantelat +emmantelèrid +emmantèlic +emmantolara +emmantolat +emmaranhara +emmaranhat +emmarcarg +emmarcat +emmarinara +emmarinat +emmascaire +emmascarg +emmascat +emmelarb +emmelat +emmelèrid +emmèlic +emmenara +emmenat +emmenucarg +emmenucat +emmerçar +emmerçar +emmerçaraix +emmerçat +emmerçavif +emmercem +emmercèriw +emmercetz +emmèrcie +emmerdarb +emmerdat +emmerdèrid +emmèrdiMLQNc +emmimarelarb +emmimarelèrid +emmimarèlic +emmimerelat +emmodolonara +emmodolonat +emmonecar +emmostara +emmostat +emmotlarb +emmotlat +emmòtle +emmotlèrid +emmòtlic +emmuralhada +emmuralhat +emocion +empacarg +empacat +empach +empachacarg +empachacat +empachada +empachador +empachaire +empachament +empachara +empachat +empachat +empachatiu +empachativa +empachós +empachosa +empafara +empafat +empaïsaniri +empaïsanit +empaisseladoira +empaisselador +empaisselarb +empaisselat +empaisselèrid +empaissèlic +empaita +empaitara +empaitat +empalament +empalara +empalat +empalh +empalhaire +empalhara +empalhat +empalhatge +empalhosiri +empalhosit +empalissara +empalissat +empalissonara +empalmara +empalmat +empalossinat +empalsara +empalsat +empampanara +empampanat +empanelarb +empanelat +empanelèrid +empanèlic +empanselarb +empanselat +empanselèrid +empansèlic +empantenara +empantenat +empapachara +empapachat +empapara +empapat +empapeirarbr +empapeirat +empapieirarb +empapieirat +empapieirèrid +empapièiric +empapierarb +empapierat +empapierèrid +empapièric +empapilhonara +empapilhonat +empapolarb +empapolat +empapolèrid +empapòlic +empapussara +empapussat +empaquetara +empaquetat +empara +emparadisara +emparadisat +emparara +emparat +emparauliri +emparaumit +emparedara +emparedat +emparentara +emparentat +empargarg +empargat +empartiri +empartit +empassara +empassat +empastament +empastara +empastat +empastelarb +empastelat +empastelèrid +empastèlic +empastissara +empastissat +empatolhara +empatolhat +empatronara +empatronat +empaumada +empaumaire +empaumara +empaumat +empaume +empauriri +empaurit +empausador +empausara +empausat +empautara +empautat +empautrara +empautrat +empebrara +empebrat +empecada +empecadat +empedegarg +empedegat +empegador +empegaire +empegament +empegarg +empegat +empegomida +empegomiri +empegomit +empegomit +empegontara +empegontat +empegosiri +empegosit +empeguiri +empeguit +empeilarb +empeilat +empeilèrid +empèilic +empeirada +empeirament +empeirarb +empeirat +empeiregarg +empeiregat +empeirèrid +empèiric +empeissonara +empeissonat +empejorara +empejorat +empelada +empelal +empelarb +empelat +empelèrid +empèlic +empelissada +empelissat +empelotar +empelotarb +empelotèrid +empelòtic +empeltarb +empeltat +empeltèrid +empèltic +empenada +empenara +empenat +empenat +empench +empencha +empencha +empenguèriw +empenha +empenhara +empenhat +empenheire +empénher +empenheraix +empenhiu +empenhiáiv +empensada +empensat +empenta +empepiarb +empepiat +empepièrid +empèpiic +empepinara +empepinat +emperador +emperaire +emperairitz +emperara +emperat +emperau +emperesiri +emperesit +empergar +empergat +empèri +emperida +emperit +emperlarb +emperlat +emperlèrid +empèrlic +empernarb +empernat +empernèrid +empèrnic +emperosinara +emperosinat +empersonada +empersonat +empertesiri +empertesit +empés +empesa +empesadura +empesaire +empesara +empesat +empesatge +empesolhinara +empesolhinat +empesolhiri +empesolhit +empestarb +empestat +empestelarb +empestelat +empestelèrid +empestèlic +empestèrid +empèstic +empetardiri +empetardit +empetegarg +empetegat +empèut +empeutadís +empeutadoira +empeutador +empeutaire +empeutarb +empeutat +empeutèrid +empèutic +empeuton +empicanhara +empicanhat +empila +empilada +empilaire +empilara +empilat +empilatge +empimarrar +empimparrara +empimponara +empimponat +empiporlara +empiporlat +emplaçada +emplaçament +emplaçarg +emplaçat +emplaçat +emplajarg +emplajat +emplanara +emplanat +emplanat +emplastrara +emplastrat +emplastre +emplastricarg +emplastricat +emplèc +emplec +emplegadament +emplegaire +emplegarg +emplegat +emplenara +emplenat +empliment +empliri +emplit +emplombadura +emplombara +emplombat +emplumara +emplumat +empobolara +empobolat +empocharb +empochat +empochèrid +empòchic +empoderada +empoderat +empoilarb +empoilat +empoilèrid +empòilic +empoisonaire +empoisonament +empoisonara +empoisonat +empoisonatge +empolverara +empolverat +emponganada +emponganara +emponganat +emponha +emponhada +emponhaire +emponhament +emponhara +emponhat +empont +empontatge +empontilhara +empontilhat +empopinara +empopinat +emportabla +emportable +emportadís +emportadissa +emportaire +emportament +emportarb +emportat +emportèrid +empòrtic +emposcalhara +emposcalhat +emposcarg +emposcat +empotegarg +empotegat +empotumada +empotumat +empra +empre +emprecairada +emprecairat +emprecariarb +emprecariat +emprecarièrid +emprecàriic +empreisonament +empreisonara +empreisonat +empreissament +empreissara +empreissat +empremeire +emprémer +empremeraix +empremèriw +empremiu +empremiáiv +empremiri +emprendraix +emprendre +emprene +emprenguèriw +emprenhament +emprenhara +emprenhat +empreniu +emprenta +emprés +empresa +empresara +empresat +empresent +empresurara +empresurat +empricipièrid +emprigondiri +emprimiri +emprimit +emprincipiarb +emprincipiat +emprincípiic +emprogondit +emprumtara +emprumtat +emprunt +empruntador +empruntaire +empruntara +empruntat +empudegarg +empudegat +empudesinara +empudesinat +empunaisiri +empunaisit +empurara +empurat +empusador +empusaire +empusament +empusara +empusat +en +en +enaigament +enaigarg +enaigat +enairara +enairat +enairat +enamorament +enamorara +enamorat +enamorent +enanara +enanat +enançament +enançara +enançat +enant +enantiment +enantiri +enantit +enantora +enarbrara +enarbrat +enarcarg +enarcat +enardiri +enardit +enarmassiri +enarmassit +enarquilhara +enarquilhat +enart +enartament +enartara +enartat +enastara +enastat +enaubrara +enaubrat +enauçarg +enauçat +enaucelarb +enaucelat +enaucelèrid +enaucèlic +enaurament +enaurant +enauranta +enaurara +enaurat +enauratge +enaurelarb +enaurelat +enaurelèrid +enaurèlic +enausiri +enausit +enautara +enautat +enaval +enavant +enbàs +ençà +encabalara +encabalat +encabanara +encabanat +encabassara +encabassat +encabdelarb +encabdelat +encabdelèrid +encabdèlic +encabestrara +encabestrat +encablara +encablat +encabrara +encabrat +encadaissara +encadaissat +encadastrara +encadastrat +encadaulara +encadaulat +encadeirarbr +encadeirat +encadenada +encadenaire +encadenament +encadenara +encadenassara +encadenassat +encadenassejarg +encadenassejat +encadenat +encadeneta +encadieirarb +encadieirat +encadieirèrid +encadièiric +encadierarb +encadierat +encadierèrid +encadièric +encadrara +encadrat +encafornara +encafornat +ençai +encaire +encaissara +encaissat +encalada +encaladara +encaladat +encaladat +encaladièr +encalara +encalat +encalat +encalatge +encalcinara +encalcinat +encalelhara +encalelhat +encalorara +encalorat +encaloriri +encalorit +encalossarb +encalossat +encalossèrid +encalòssic +encalotarb +encalotat +encalotèrid +encalòtic +encalrara +encalrat +encalvacadura +encambada +encambament +encambara +encambat +encambonara +encambonat +encambrara +encambrat +encamelarb +encamelat +encamelèrid +encamèlic +encaminara +encaminat +encamisada +encamisat +encanalhara +encanalhat +encanara +encanat +encandelarb +encandelat +encandelèrid +encandèlic +encanelarb +encanelat +encanelèrid +encanèlic +encanhara +encanhat +encanissara +encanissat +encant +encantada +encantaire +encantament +encantara +encantarèl +encantarèla +encantat +encap +encapada +encapadura +encapaire +encapaironara +encapaironat +encapara +encaparraire +encaparrament +encaparrara +encaparrat +encapat +encapatge +encapelanara +encapelanat +encapelarb +encapelat +encapelèrid +encapèlic +encapinara +encapinat +encapitelarb +encapitelat +encapitelèrid +encapitèlic +encapriçarg +encapriçat +encapriciarb +encapriciat +encapricièrid +encapríciic +encapuchonara +encapuchonat +encara +encaracion +encaraire +encarara +encarat +encarcasselarb +encarcasselat +encarcasselèrid +encarcassèlic +encaremara +encaremat +encarenara +encarenat +encaresiri +encaresit +encarestiri +encarestit +encargament +encargarg +encargat +encaridor +encarieirat +encariri +encarit +encarnada +encarnament +encarnara +encarnat +encarnat +encarnissara +encarnissat +encaronhara +encaronhat +encarosida +encarosit +encarquilhara +encarquilhat +encarrador +encarrara +encarrat +encarreirarb +encarreirat +encarreirèrid +encarrelarb +encarrelat +encarrelèrid +encarrèlic +encarrieirarb +encarrièiric +encarrierarb +encarrierat +encarrierèrid +encarrièric +encartada +encartadara +encartadat +encartament +encartara +encartats +encartelada +encartelat +encascavelarb +encascavelat +encascavelèrid +encascavèlic +encaselarb +encaselat +encaselèrid +encasèlic +encasernarb +encasernat +encasernèrid +encasèrnic +encassidara +encassidat +encastelarb +encastelat +encastelèrid +encastèlic +encastradura +encastrament +encastrara +encastrat +encastratge +encastre +encatarinara +encatarinat +encatarriarb +encatarriat +encatarrièrid +encatàrriic +encauçanara +encauçanat +encauçarg +encauçat +encaucinara +encaucinat +ençauclara +ençauclat +encaunara +encaunat +encausa +encaustic +encautara +encautat +encavalara +encavalat +encavalcarg +encavalcat +encavara +encavat +encavernarb +encavernat +encavernèrid +encavèrnic +encefal +encefaliti +encelclara +encelclat +encench +encencha +encencha +encenchara +encenchat +encendi +encendiarb +encendiari +encendiat +encendièrid +encéndiic +encendrara +encendrat +encendret +encendrosiri +encendrosit +encenguèriw +encenhent +encénher +encenheraix +encenhiu +encenhiáiv +encens +encensara +encepaire +encepara +encepat +encerara +encerat +encerclara +encerclat +encergat +encervelarb +encervelat +encervelèrid +encervèlic +encés +encesada +encesaire +encesament +encesara +encesat +encesièr +enceuclara +enceuclat +encibetara +encibetat +enciclopedia +encigalara +encigalat +encimelara +encimelat +encisa +encisara +encisat +encitara +encitat +encitós +encitosa +enclancar +enclancarg +enclariri +enclarit +enclastrara +enclastrat +enclastre +enclauguèriw +enclauraix +enclaure +enclaus +enclausara +enclausat +enclauseire +enclausent +enclausiu +enclausiáiv +enclausiri +enclausit +enclausuda +enclausut +enclavadura +enclavament +enclavara +enclavat +enclavelarb +enclavelat +enclavelèrid +enclavèlic +encledara +encledat +enclin +enclina +enclinara +enclinason +enclinat +enclitic +enclitica +encloscar +encloscar +encloscaraix +encloscat +encloscavif +enclosquem +enclosquèriw +enclosquetz +enclòsquie +enclotadura +enclotarb +enclotat +enclotèrid +enclòtic +enclotiri +enclure +enclusa +enclusaira +enclusaire +enclusara +enclusat +enclusièr +enclusiri +enclusit +enclutge +encoblament +encoblara +encoblas +encoblat +encobriri +encobrit +encocar +encocarai +encocardara +encocardat +encocat +encocavi +encocolara +encocolat +encocorlat +encocudara +encocudat +encodeniri +encodenit +encodessiri +encodessit +encofinara +encofinat +encofrarb +encofrat +encofrèrid +encòfric +encogorlara +encogorlir +encogorliti +encoirara +encoirassara +encoirassat +encoirat +encoissar +encoissar +encoissarai +encoissat +encoissavi +encoissem +encoissèri +encoissetz +encoissinara +encoissinat +encolarb +encolardara +encolardat +encolarinara +encolarinat +encolassara +encolassat +encolat +encolèrid +encoleriri +encòlic +encolorara +encolorat +encombrament +encombrant +encombranta +encombrara +encombrat +encombre +encombrós +encombrosa +encongeirarbr +encongeirat +encongieirarb +encongieirat +encongieirèrid +encongièiric +encongierarb +encongierat +encongierèrid +encongièric +enconhara +enconhat +enconheirarbr +enconheirat +enconhieirarb +enconhieirat +enconhieirèrid +enconhièiric +enconhierarb +enconhierat +enconhierèric +enconilhara +enconilhat +enconolhara +enconolhat +enconsomiri +enconsomit +enconsomit +encontrada +encontrara +encontrat +encontre +encòp +encop +encoquem +encoquèri +encoquetz +encòqui +encorarb +encorat +encoratjaire +encoratjament +encoratjant +encoratjanta +encoratjarg +encoratjat +encordarb +encordat +encordat +encordelarb +encordelat +encordelèrid +encordèlic +encordèrid +encòrdic +encorèrid +encòric +encornament +encornarb +encornat +encornèrid +encornetara +encornetat +encòrnic +encornilhara +encornilhat +encoronara +encoronat +encorreguda +encorreguda +encorreguèriw +encorregut +encorrent +encórrer +encorreraix +encorriu +encorriáiv +encorriri +encorrit +encorroçarg +encorroçat +encortinament +encortinara +encortinat +encossolara +encossolat +encotissara +encotissat +encovenara +encovenat +encra +encramponara +encramponat +encranara +encranat +encrancarg +encrancat +encrassara +encrassat +encrassiri +encrassit +encraumara +encre +encreissent +encréisser +encreisseraix +encreissiu +encreissiáiv +encrenadura +encrenara +encrenat +encrepal +encrepara +encrepat +encrepitara +encrepitat +encrescuda +encrescut +encresquèriw +encressara +encressat +encrestadura +encrestara +encrestat +encrestatge +encrestiri +encrestit +encricotarb +encricotat +encricotèrid +encricòtic +encrocadura +encrocaire +encrocament +encrocar +encrocat +encrosadura +encrosara +encrosarb +encrosat +encrosèrid +encròsic +encrosilhara +encrosilhat +encrostadura +encrostament +encrostara +encrostat +encrostiri +encrostit +encrotarb +encrotat +encrotèrid +encròtic +encrumiri +encrumit +encrustara +encrustat +encubertarb +encubertat +encubertèrid +encubèrtic +encubrecelarb +encubrecelat +encubrecelèrid +encubrecèlic +encucarg +encucat +encueissar +encueissat +encuèissi +encuirassara +encuirassat +encuissar +encuissat +enculhiri +enculhit +enculpara +enculpat +encurara +encurat +encusara +encusat +encussara +encussat +enchaiaire +enchaiarza +enchaiat +enchaiatge +enche +enchichorlara +enchichorlat +enchiprament +enchiprara +enchiprat +enchipre +enchiprós +enchiprosa +enchosclara +enchosclat +enchotarb +enchotat +enchotèrid +enchòtic +enchusclara +enchusclat +endacòm +endalh +endalièra +endalmairara +endalmairat +endaran +endarnara +endarnat +endarreirarbr +endarreirat +endarrèr +endarrieirarb +endarrieirat +endarrieirèrid +endarrièiric +endarrièr +endarrieralhas +endarrierarb +endarrieratge +endarrierèrid +endarrièric +endavalara +endavalat +endavant +endebadas +endec +endecarg +endecat +endecós +endecosa +endecum +endedins +endefòra +endegadura +endegarig +endejós +endejun +endejunara +endejunat +endelugal +endelugala +endeluvi +endeman +endemeniri +endemenit +endemesi +endemesida +endemesiri +endemesits +endemic +endemica +endemoniar +endemoniat +endenhara +endenhat +endenhós +endenhosa +endent +endentelarb +endentelat +endentelèrid +endentèlic +endequitge +enderocar +enderocat +endervon +endesrocar +endesrocat +endeutara +endeutat +endevenabla +endevenable +endevendraix +endevenença +endevenent +endevenguda +endevenguda +endevenguèriw +endevengut +endevengut +endeveniu +endeveniáiv +endevenidoira +endevenidor +endevenir +endevenit +endeveras +endévia +endevieta +endevinaira +endevinaire +endevinara +endevinat +endiablara +endiablat +endiamantara +endiamantat +endiamara +endiamat +endiana +endicarg +endich +endicha +endigna +endignada +endignara +endignat +endignat +endigne +endiguèriw +endilh +endilhada +endilhara +endilhat +endimengarg +endimengat +endimenjarg +endimenjat +endimergarg +endimergat +endinnalhara +endinnalhat +endins +endintrara +endintrat +endiraix +endire +endisent +endisiu +endisiáiv +endita +endoçainara +endoçainat +endodèrma +endolentiri +endolentit +endoleriri +endolerit +endolesiri +endolesit +endoliri +endolit +endolomarb +endolomat +endolomèrid +endolòmic +endolòmi +endomaiselencarg +endomaiselencat +endomaiseliri +endomaiselit +endomatjarg +endomatjat +endometgiri +endometgit +endorgara +endorgat +endorguet +endormeire +endorment +endormenta +endormida +endormidoira +endormiri +endormit +endormitòri +endorsada +endorsaire +endorsament +endorsara +endorsat +endòrt +endòrta +endorziment +endorziri +endorzit +endosilhara +endosilhat +endracarg +endracat +endraiaraz +endraiat +endralhada +endralhara +endralhat +endreç +endreça +endreçarg +endreçat +endrech +endrechièra +endreia +endreiçarg +endreiçat +endreit +endrinhara +endrinhat +endrogar +endrogat +endrudiri +endrudit +enduch +enduch +enducha +enduècha +enduèlh +enduguèriw +enduiraix +enduire +enduit +endumiarb +endumiat +endumièrid +endúmiic +endura +endurant +enduranta +endurara +endurat +endurciri +endurcit +endusent +endusiu +endusiáiv +endusiri +endusit +enébiic +enebiri +enebit +enebriadura +enebrianta +enebriarb +enebriat +enebrièrid +eneguetiri +eneguetit +enemic +enemiga +enemigarg +enemigat +enemistat +enenbriant +enerbarb +enerbat +enerbèrid +enèrbic +energetic +energia +eneriçada +eneriçat +enermassiri +enermassit +enervarb +enervat +enervèrid +enèrvic +enfaciarb +enfaciat +enfacièrid +enfàciic +enfachilhara +enfachilhat +enfachinaire +enfachinament +enfachinara +enfachinat +enfachinatge +enfadesiri +enfadesit +enfadiarb +enfadiat +enfadièrid +enfàdiic +enfadiri +enfadit +enfafachara +enfafachat +enfafiarb +enfafiat +enfafièrid +enfàfiic +enfagotarb +enfagotat +enfagotèrid +enfagòtic +enfaissadura +enfaissament +enfaissara +enfaissat +enfaissatge +enfaitilhara +enfaitilhat +enfalagarg +enfalagat +enfalenara +enfalenat +enfalordiri +enfalordit +enfança +enfància +enfanfarnara +enfanfarnat +enfangarg +enfangat +enfangosiri +enfangosit +enfant +enfanta +enfantaira +enfantaire +enfantament +enfantara +enfantariá +enfantat +enfantejarg +enfantejat +enfantesa +enfantilhara +enfantilhat +enfantilhatge +enfantin +enfantina +enfantolida +enfantolit +enfantolitge +enfanton +enfantona +enfantonejarg +enfantonejat +enfantonet +enfantoneta +enfantonièr +enfantonièra +enfantoniri +enfantonit +enfantuènha +enfarcimara +enfarcimat +enfardelarb +enfardelat +enfardelèrid +enfardèlic +enfarinadoira +enfarinaire +enfarinara +enfarinat +enfarinièra +enfarnara +enfarnat +enfarnissara +enfarnissat +enfascarg +enfascat +enfastigarg +enfastigat +enfebrarb +enfebrat +enfebrèrid +enfèbric +enfeciment +enfecinara +enfecinat +enfeciri +enfecit +enfecta +enfectaire +enfectant +enfectanta +enfectarb +enfectariá +enfectat +enfècte +enfectèrid +enfèctic +enfelonara +enfelonat +enfeneirarbr +enfeneirat +enfenestrarb +enfenestrat +enfenestrèrid +enfenèstric +enfenieirarb +enfenieirat +enfenieirèrid +enfenièiric +enfenierarb +enfenierat +enfenierèrid +enfenièric +enfenolhara +enfenolhat +enferenara +enferenat +enfèrn +enfernal +enfernala +enferonara +enferonat +enferoniri +enferonit +enferrarb +enferrat +enferrèrid +enfèrric +enferriar +enfèrrias +enferriat +enfèrris +enferrolhara +enferrolhat +enfestarb +enfestat +enfestèrid +enfèstic +enfestoliri +enfestolit +enfestonara +enfestonat +enfetra +enfetre +enfeudarb +enfeudat +enfeudèrid +enfèudic +enfeumadura +enficelarb +enficelat +enficelèrid +enficèlic +enfichoirara +enfichoirat +enfieirarb +enfieirat +enfieirèrid +enfièiric +enfierarb +enfierat +enfierèrid +enfièric +enfilada +enfilaire +enfilara +enfilat +enfilosara +enfilosat +enfiltrara +enfiltrat +enfin +enfiscalhara +enfiscalhat +enfistrara +enfistrat +enfla +enflada +enfladura +enflairara +enflairat +enflamabla +enflamable +enflamairara +enflamairat +enflamatiu +enflamativa +enflambara +enflambat +enflament +enflaquiri +enflaquit +enflara +enflascarg +enflascat +enflat +enflatge +enfle +enfleumarb +enfleumat +enfleumèrid +enflèumic +enfligiri +enfligit +enflocar +enflocat +enflor +enflorara +enflorat +enfloriri +enflorit +enfloroncarg +enfloroncat +enfluéncia +enfluenciarb +enfluenciat +enfluencièrid +enfluénciic +enfluent +enfluenta +enfluiri +enfluit +enfluscarg +enfluscat +enfogassetara +enfogassetat +enfogonara +enfogonat +enfoirara +enfoirat +enfolesiri +enfolesit +enfoliri +enfolit +enfolitge +enfonhada +enfonhara +enfonhat +enfonhat +enfonilh +enfonilha +enfonilhara +enfonilhat +enfonsara +enfonsat +enfonzada +enfonzaire +enfonzament +enfonzara +enfonzat +enforbandiri +enforbandit +enforcadura +enforcament +enforçar +enforcarg +enforcat +enforçat +enforgarg +enforgat +enfornada +enfornaire +enfornament +enfornara +enfornat +enfornatge +enfortiment +enfortiri +enfortit +enfortunara +enfortunat +enfoscarg +enfoscat +enfosinara +enfosinat +enfosquiri +enfosquit +enfra +enfrairejarg +enfrairejat +enfranguda +enfranguèriw +enfrangut +enfranhent +enfrànher +enfranheraix +enfranhiu +enfranhiáiv +enfraussara +enfraussat +enfredara +enfredat +enfregiment +enfregiri +enfregit +enfregonida +enfregonit +enfrenara +enfrenat +enfresqueirarbr +enfresqueirat +enfresquieirarb +enfresquieirat +enfresquieirèrid +enfresquièiric +enfresquierarb +enfresquierat +enfresquierèrid +enfresquièric +enfringiri +enfringit +enfrocar +enfrocaraiQx +enfrocavif +enfronhara +enfronhariá +enfronhat +enfroquem +enfroquèriw +enfroquetz +enfròquiQe +enfruchara +enfruchat +enfruchiri +enfruchit +enfugiri +enfugit +enfumara +enfumardara +enfumardat +enfumargarg +enfumargat +enfumat +enfumatara +enfumatat +enfumecarg +enfumecat +enfumelarb +enfumelat +enfumelèrid +enfumèlic +enfumerlarb +enfumerlat +enfumerlèrid +enfumèrlic +enfurgarg +enfurgat +enfuronara +enfuronat +enfusca +enfuscador +enfuscaire +enfuscarg +enfuscat +enfust +enfustara +enfustat +engabiarb +engabiat +engabièrid +engàbiic +engabolhara +engabolhat +engachara +engachat +engafara +engafat +engafetara +engafetat +engaginara +engaginat +engainada +engainara +engainat +engainat +engalafatara +engalafatat +engalantada +engalantat +engalara +engalat +engalbara +engalbat +engalhara +engalhardiri +engalhardit +engalhat +engalhonara +engalhonat +engalhostara +engalhostat +engalinaire +engalinara +engalinat +engamachara +engamachat +engamara +engamassiri +engamassit +engamat +engambi +engambiarb +engambiat +engambièrid +engàmbiic +engamonara +engamonat +engan +engana +enganada +enganadoira +enganaira +enganaire +enganament +enganara +enganarrara +enganarrat +enganat +enganaussara +enganaussat +enganchara +enganchat +enganche +engandalhara +engandalhat +engangueirarbr +engangueirat +enganguieirarb +enganguieirat +enganguieirèrid +enganguièirib +enganguierarb +enganguierat +enganguierèrid +enganguièric +enganiu +enganiva +engansara +engansat +engansilhara +engansilhat +engantara +engantat +engara +engarachara +engarachat +engarara +engarat +engarbairara +engarbairat +engarbara +engarbat +engarbeirarbr +engarbeirat +engarbieirarb +engarbieirat +engarbieirérid +engarbièiric +engarbieraire +engarbierarb +engarbierat +engarbierèrid +engarbièric +engarçarg +engarçat +engard +engarda +engardara +engardat +engargassara +engargassat +engarlandara +engarlandat +engarotara +engarotat +engarradura +engarrafada +engarrafara +engarrafat +engarramachada +engarramachat +engarransiri +engarransit +engarrapetara +engarrapetat +engarrara +engarrat +engarratara +engarratat +engarriri +engarrit +engarronara +engarronat +engarroniri +engarronit +engarrossada +engarrossat +engarrotarb +engarrotat +engarrotèrid +engarròtic +engarrussida +engarrussit +engasconiri +engasconit +engat +engatge +engatjament +engatjant +engatjanta +engatjarg +engatjat +engauba +engaubara +engaubat +engaubi +engaubiadura +engaubiarb +engaubiat +engaubièrid +engàubiic +engauchilhara +engauchilhat +engauda +engaudiri +engaudit +engaugilhara +engaugilhat +engaulaire +engaulara +engaulat +engauma +engaume +engaumiri +engaumit +engaunhada +engaunhadissa +engaunhadura +engaunhaire +engaunhara +engaunhat +engausilhadura +engausilhara +engausilhat +engausiri +engausit +engautara +engautat +engautejarg +engautejat +engavachament +engavachara +engavachat +engavelarb +engavelat +engavelèrid +engavèlic +engegarg +engegat +engeissara +engeissat +engeladura +engelarb +engelat +engelèrid +engèlic +engelosiri +engelosit +engemelarb +engemelat +engemelèrid +engemèlic +engendrara +engendrat +engenestarb +engenestat +engenestèrid +engenèstic +engengivara +engengivat +engenh +engenh +engenhadament +engenhaire +engenhara +engenhat +engenhós +engenhosa +engerbiri +engerbit +engèrd +engèrda +engerdabla +engerdable +engerdarb +engerdat +engerdèrid +engèrdic +engermeniri +engermenit +engetarb +engetat +engetèrid +engètic +engimbara +engimbat +engimbrara +engimbrat +engimerrarb +engimerrat +engimerrèrid +engimèrric +engimerriri +engimerrit +enginara +enginat +engincarg +engincat +enginh +enginhara +enginhat +enginpara +enginpat +engiponara +engiponat +engivanara +engivanat +englajarg +englajat +englandara +englandat +englantina +englanziri +englanzit +englasi +englasiament +englasiarb +englasiat +englasièrid +englàsiic +englasiri +englasit +englasívol +englaujarg +englaujat +englazit +englenara +englenat +englevassara +englevassat +engloiaraix +engloiem +engloièriw +engloietz +engloriar +engloriat +engloriavif +englòriie +englotadura +englotara +englotidor +englotiri +englotit +englut +engobiar +engobiarai +engobiat +engobiavif +engobiem +engobièriw +engobietz +engòbiie +engodissara +engodissat +engodofada +engodofara +engodofat +engodofat +engodoliri +engodolit +engofiri +engofit +engoissa +engoissara +engoissat +engoissós +engoissosa +engolampa +engolara +engolat +Engoleime +engolidor +Engolmés +engolmés +engolop +engolopara +engolopat +engonnara +engonnat +engonsara +engonsat +engordilhara +engordilhat +engordiment +engordiri +engordit +engorgalara +engorgalat +engorgara +engorgat +engorgosida +engorgosit +engorgossara +engorgossat +engorgovelhara +engorgovelhat +engormossara +engormossat +engorrinara +engorrinat +engorriniri +engorrinit +engorrudara +engorrudat +engossiri +engossit +engrafatara +engrafatat +engrafiarb +engrafiat +engrafièrid +engràfiic +engrafoliri +engrafolit +engrais +engraissament +engraissapòrc +engraissara +engraissat +engranada +engranadís +engranaire +engranalhara +engranalhat +engranara +engranat +engranatge +engranha +engranhòta +engranhotarb +engranhotat +engranhotèrid +engranhòtic +engranièra +engranjarg +engranjat +engrasara +engrasat +engraufinhara +engraufinhat +engraunhara +engraunhat +engraupinhara +engraupinhat +engrautara +engrautat +engravara +engravat +engrepesiri +engrepesit +engrepiarb +engrepiat +engrepièrid +engrépiic +engrepiment +engrepiri +engrepit +engreula +engrimara +engrimat +engrisara +engrisat +engrisòla +engròla +engrolara +engrolat +engronhara +engronhat +engrossarb +engrossat +engrossèrid +engròssic +engrumelarb +engrumelat +engrumelèrid +engrumèlic +engrumicelarb +engrumicelat +engrumicelèrid +engrumicèlic +engrun +engruna +engrunada +engrunaire +engrunament +engrunara +engrunat +engue +enguefiar +enguefiar +enguefiat +enguefièri +enguèfii +enguent +enguentaire +enguentara +enguentat +enguentièr +enguerlharb +enguerlhat +enguerlhèrid +enguèrlhic +enguiala +enguila +enguilada +enguilat +enguilenc +enguilenca +enguindara +enguindat +engulhara +engulhat +engusa +engusaire +engusara +engusat +enins +enintrara +enintrat +enirara +enirat +enjaçament +enjaçarg +enjaçat +enjalosiri +enjalosit +enjarrara +enjarrat +enjaulaire +enjaulara +enjaulat +enjaurara +enjaurat +enjaure +enjauriri +enjaurit +enjavinha +enjavinhara +enjavinhat +enjòc +enjocarg +enjocat +enjoiar +enjoiarai +enjoiat +enjoiavi +enjoiem +enjoièri +enjoietz +enjòii +enjolhar +enjolhat +enjolivaire +enjolivament +enjolivara +enjolivat +enjoncarg +enjoncat +enjós +enjoveniri +enjovenit +enjuèlhi +enjulhament +enjulhar +enjulhar +enjulharai +enjulhat +enjulhavi +enjulhem +enjulhèri +enjulhetz +enjun +enjuna +enlà +enlaçament +enlaçarg +enlaçat +enlai +enlaidiment +enlaidiri +enlaidit +enlairament +enlairara +enlairat +enlanara +enlanat +enlanhara +enlanhat +enlapara +enlapat +enlardara +enlardat +enlastara +enlastat +enlastrara +enlastrat +enlatinara +enlatinat +enlaurara +enlaurat +enlaureirarbr +enlaureirat +enlaurieirarb +enlaurieirat +enlaurieirèrid +enlaurièiric +enlaurierarb +enlaurierat +enlaurierèrid +enlaurièric +enlausara +enlausat +enlavaci +enlaval +enlençolarb +enlençolat +enlençolèrid +enlençòlic +enleniri +enlenit +enlessara +enlevament +enlevarb +enlevèrid +enlèvic +enlhausara +enliamada +enliamadura +enliamaire +enliamara +enliamatge +enligarg +enlimpara +enlinhament +enlinhara +enlisara +enlòc +enlodara +enlordiri +enlugarnara +enlugrant +enlugranta +enlugrara +enluminaire +enluminament +enluminara +enlunara +enlunetara +enluòc +enlusentiri +enlusernarb +enlusernèrid +enlusèrnic +enlusida +enlusiment +enlusiri +enlutrinara +enmatelotarb +enmatelotèrid +enmatelòtic +ennasicarg +ennastara +ennaut +ennautara +enneblarb +enneblat +enneblèrid +ennèblic +ennegar +ennegar +ennegaraix +ennegavif +ennegrara +ennegriri +enneguem +enneguèriw +enneguetz +ennèguif +enneïri +ennejar +enneussarb +enneussèrid +ennèussic +ennevassara +ennigolara +ennitara +ennivolara +ennivoliri +ennobliri +ennoviar +ennoviarai +ennoviat +ennoviavi +ennoviem +ennovièri +ennovietz +ennòvii +enòdi +enoirara +enombrara +enonciarb +enoncièrid +enónciic +enorgulhiri +enòrma +enòrme +enossarb +enossèrid +enòssic +enquadrament +enquadrara +enquant +enquantaire +enquantara +enque +enquereguèriw +enquerent +enqueriáiv +enquerida +enqueriri +enquerit +enquerraix +enquèrre +enquesiri +enquèsta +enquestaire +enquestarb +enquestat +enquestèrid +enquèstic +enquicòm +enquièriu +enquilhara +enquilhat +enquiquiricarg +enquiquiricat +enquissara +enquissat +enquitranament +enquitranara +enquitranat +enrabassara +enrabassat +enrabiada +enrabiadura +enrabiant +enrabianta +enrabiarb +enrabiat +enrabièrid +enràbiic +enrabissara +enrabissat +enracarg +enraçarg +enracat +enraçat +enracinara +enracinat +enrada +enragarg +enragat +enraiador +enraiarza +enraiat +enraiçarg +enraiçat +enraida +enraigarg +enraigat +enrajason +enramada +enramara +enramat +enramatge +enrambolhara +enrambolhat +enrambulhara +enrambulhat +enrameirarb +enrameirat +enramelarb +enramelat +enramelèrid +enramèlic +enramieirar +enramieirat +enramieirèrid +enramièiric +enramierarb +enramierat +enramierèrid +enramièric +enrampanara +enrampanat +enrampesiri +enrampesit +enrantelara +enrantelat +enraquiri +enraquit +enrariri +enrarit +enrasara +enrasat +enrasigarg +enrasigat +enrasimara +enrasimat +enrasinara +enrasinat +enratjarg +enratjat +enraucarg +enraucat +enraufelarb +enraufelat +enraufelèrid +enraufèlic +enraujarg +enraujat +enraumassara +enraumassat +enrauquesiri +enrauquesit +enrauquiment +enrauquiri +enrauquit +enrauselarb +enrauselat +enrauselèri +enrausèlic +enravalara +enravalat +enravanhada +enravanhat +enrè +enrebada +enrebalara +enrebalat +enrebat +enrebeliri +enrebelit +enrebinhara +enrebinhat +enredara +enredat +enreddenara +enreddenat +enreddeniment +enreddesiri +enreddesit +enreddiri +enreddit +enredondara +enredondat +enredondiri +enredondit +enredordarb +enredordat +enredordèrid +enredòrdic +enregada +enregador +enregarg +enregat +enregatge +enregistrament +enregistrar +enregolara +enregolat +enrèire +enrejolada +enrelhadura +enrelhara +enrelhat +enremegar +enremegara +enrengarg +enrengat +enressarb +enressat +enressèrid +enrèssic +enrestarb +enrestat +enrestèrid +enrèstic +enretnara +enretnat +enribanara +enribanat +Enric +enriguda +enriguèriw +enrigut +enriquiment +enriquiri +enriquit +enriraix +enrire +enrisent +enrisiu +enrisiáiv +enrocar +enrocaraix +enrocavif +enrodarb +enrodat +enrodèrid +enròdic +enrojarg +enrojat +enromegar +enromegaraix +enromegat +enromegavif +enromeguem +enromeguèriw +enromeguetz +enromèguie +enrondara +enrondat +enronhara +enronhat +enronzara +enronzat +enropara +enropat +enroquem +enroquèriw +enroquetz +enròquie +enrosalara +enrosalat +enrossarb +enrossat +enrossèrid +enròssic +enrotlarb +enrotlat +enrotlèrid +enròtlic +enrufada +enrufara +enrufat +enrufat +enrugarg +enrugat +ensabatada +ensabatat +ensablament +ensablara +ensablat +ensabrada +ensabrat +ensacada +ensacadoira +ensacador +ensacadura +ensacaire +ensacament +ensacarg +ensacat +ensacatge +ensafranara +ensafranat +ensafrara +ensafrat +ensag +ensagnara +ensagnat +ensagnosiri +ensagnosit +ensaïnara +ensaïnat +ensajarg +ensajat +ensalada +ensaladièr +ensaladièra +ensalvara +ensalvat +ensanglantara +ensanglantat +ensanhara +ensanhat +ensardinara +ensardinat +ensarra +ensarrara +ensarrat +ensarriada +ensarriarb +ensàrrias +ensarriat +ensarrièrid +ensàrriic +ensatanada +ensatanat +ensaulara +ensaulat +ensaumadaire +ensaumadara +ensaumadat +ensauvara +ensauvat +ensebeliment +ensebeliri +ensebelit +ensedara +ensedat +ensedatge +ensedonaire +ensedonara +ensedonat +ensegat +ensegraix +ensègre +enseguent +enseguèriw +ensèguiu +enseguiáiv +enseguida +enseguiri +enseguit +enseguit +enselarb +enselat +enselèrid +enselhara +enselhat +ensèlic +enselièr +ensem +ensemble +ensemenada +ensemenara +ensemenat +ensems +ensenha +ensenhador +ensenhaire +ensenhament +ensenhara +ensenhat +ensenhorir +ensenhoriri +enséria +enseriós +enseriosa +enseriri +enserit +ensèrt +ensertadura +ensertaire +ensertarb +ensertat +ensertatge +ensertèrid +ensèrtic +ensertidor +ensertiri +ensertit +ensetara +ensetarb +ensetat +ensetèrid +ensètic +ensibocarg +ensibocat +ensidernarb +ensidernat +ensidernat +ensidernèrid +ensidèrnic +ensiègre +ensièr +ensirment +ensirmentaira +ensirmentara +ensirmentat +ensitjarg +ensitjat +ensobla +ensocador +ensocament +ensocar +ensocar +ensocaraix +ensocat +ensocavif +ensolarb +ensolat +ensolelhara +ensolelhat +ensolèrid +ensòlic +ensolprada +ensolprara +ensolprat +ensolpratge +ensoquem +ensoquèriw +ensoquetz +ensòquie +ensordaire +ensordament +ensordant +ensordanta +ensordara +ensordat +ensordiri +ensordit +ensorrara +ensorrat +ensortiment +ensortiri +ensortit +ensoveniri +ensovenit +ensubre +ensucrara +ensucrat +ensuperbiri +ensuperbit +ensús +ent +entà +enta +entacòm +entaïnara +entaïnat +entalarinara +entalarinat +entalentara +entalentat +entalh +entalhament +entalhara +entalhat +entalossarb +entalossat +entalossèrid +entalòssic +entalufara +entalufat +entamenada +entamenadura +entamenaire +entamenara +entamenat +entamenon +entancha +entanchara +entanchat +entanche +entanchiu +entanchiva +entant +entanta +entantinara +entantinat +entapissara +entapissat +entarabastejarg +entarabastejat +entarada +entartugarg +entartugat +entascarg +entascat +entatarinara +entatarinat +entaulament +entaulara +entaulat +entavanara +entavanat +entavelarb +entavelat +entavelèrid +entavèlic +entecarg +entecat +enteirarbr +enteirat +entelara +entelat +entemenara +entemenat +entenchívol +entendabla +entendable +entendedor +entendeire +entendement +entendret +entendut +entenebrarb +entenebrat +entenebrèrid +entenèbric +entenecarg +entenecat +entenèrc +entenèrca +entèrc +enteriga +enterigarg +enterigat +enterinara +enterinat +enternarb +enternat +enternèrid +entèrnic +enterrada +enterraire +enterrament +enterrarb +enterrat +enterrèrid +entèrric +enterrosiri +enterrosit +entesic +entesicarg +entesicat +entestament +entestarb +entestardiri +entestardit +entestat +entestèrid +entestesiment +entestesiri +entèstic +entetinada +entetinat +enteulara +enteulat +entieirament +entièr +entièra +entierada +entierament +entièrament +entierarb +entierat +entierèrid +entièric +entim +entima +entimonara +entimonat +entinara +entinat +entindara +entindat +entindonara +entindonat +entinelarb +entinelat +entinelèrid +entinèlic +entintainara +entintainat +entipara +entipat +entiponara +entiponat +entirara +entirat +entissara +entissat +entitat +entitolara +entitolat +entolhament +entolhara +entolhat +entonara +entonat +entopinara +entopinat +entòrca +entorcar +entorcar +entorcaraix +entorcat +entorcavif +entorcent +entòrcer +entorceraix +entorcèriw +entòrciu +entorciáiv +entorclara +entorclat +entorçuda +entorçut +entòrcha +entorn +entornara +entornat +entornejarg +entornejat +entorondara +entorondat +entorquem +entorquèriw +entorquetz +entòrquie +entòrs +entorsa +entortibilhara +entortibilhat +entortilhara +entortilhat +entortiri +entortit +entortobilhara +entortobilhat +entortovilhara +entortovilhat +entrabalhar +entrabalhara +entrabilhara +entrabilhat +entrabolhara +entrabolhat +entrabucarg +entrabucat +entrach +entrach +entracha +entrachara +entrachat +entrafegarg +entrafegat +entrafoirara +entrafoirat +entraguèriw +entrainara +entraïnara +entrainat +entraïnat +entrairaix +entraire +entrait +entraita +entralhas +entram +entrams +entrant +entranugarg +entranugat +entrapachara +entrapachat +entrapara +entrapat +entrapelarb +entrapelat +entrapelèrid +entrapèlic +entrara +entràs +entrasent +entrasiu +entrasiáiv +entrat +entraucarg +entraucat +entraulara +entraulat +entrausiri +entrausit +entrava +entravacadura +entravacaire +entravacarg +entravacat +entravacós +entravacosa +entravada +entravadís +entravadissa +entravara +entravat +entraversadura +entraversarb +entraversat +entraversèrid +entravèrsic +entravolhara +entravolhat +entre +entreajuda +entrebadara +entrebadat +entrebaisara +entrebaisat +entrebalhara +entrebalhat +entrebatret +entrebatut +entrebaujarg +entrebaujat +entrebescarg +entrebescat +entrebolhiri +entrebolhit +entreboliment +entreboliri +entrebolit +entrecamba +entrecilhas +entreclinara +entreclinat +entreclucarg +entreclucat +entrecolhiri +entrecolhit +entrecopara +entrecopat +entrecòsta +entrecridara +entrecridat +entrecrosara +entrecrosat +entrecuèissa +entreculhiri +entreculhit +entreculiri +entreculit +entredich +entredich +entredicha +entredicha +entrediguèriw +entrediraix +entredire +entredisent +entredisiu +entredisiáiv +entredit +entredita +entredobriri +entredobrit +entredós +entredubriri +entredubrit +entrefachas +entrefaitas +entrefegas +entreferiri +entreferit +entrefoguda +entrefoguèriw +entrefogut +entrefoiraix +entrefòire +entrefolida +entrefoliri +entrefolit +entrefolit +entrefòs +entrefosa +entrefosent +entrefòsiu +entrefosiái +entrefotjarg +entrefotjat +entrefuèlh +entrefurara +entrefurat +entregafara +entregafat +entregarg +entregat +entregelarb +entregelat +entregelèrid +entregèlic +entregenara +entregenat +entrejalara +entrejalat +entrelaç +entrelaçadura +entrelaçament +entrelaçarg +entrelaçat +entrelachara +entrelachat +entrelard +entrelardara +entrelardat +entreliaraz +entreliat +entreligarg +entreligat +entrelusent +entrelusenta +entrelusida +entrelusiri +entrelusit +entremacarg +entremacat +entremalhara +entremalhat +entrement +entremes +entremesa +entremesa +entremescla +entremescladament +entremesclament +entremesclara +entremesclat +entremescle +entremeteira +entremeteire +entremetret +entremièg +entremiegièr +entremièjas +entremièjas +entremitan +entremoliri +entremolit +entremuèja +entrena +entrenaire +entrenaissent +entrenàisser +entrenaisseraix +entrenaissiu +entrenaissiáiv +entrenara +entrenascuda +entrenascut +entrenasquèriw +entrenat +entrenc +entrenca +entrencarg +entrencat +entrenec +entrenecada +entrenecat +entrenós +entrenosara +entrenosat +entrepachaire +entrepachament +entrepachara +entrepachat +entrepachós +entrepachosa +entreparlaire +entrepartiri +entrepartit +entrepaus +entrepausaire +entrepausara +entrepausat +entrepautara +entrepautat +entreponch +entreponcha +entreponguèriw +entreponhent +entrepónher +entreponheraix +entreponhiu +entreponhiáiv +entrepont +entrepositari +entreprendraix +entreprendre +entreprene +entrepreneire +entreprenent +entreprenent +entreprenenta +entreprengueriw +entrepreniu +entrepreniáiv +entreprés +entreprés +entrepresa +entrerelhara +entrerelhat +entresarrat +entresecament +entresenha +entressarrara +entressecarg +entressecat +entresselhara +entresselhat +entressemenara +entressemenat +entressenhara +entressenhat +entressentiment +entressentirj +entressomiri +entressomit +entressonara +entressonat +entrestant +entretant +entretemps +entretendraix +entreteneire +entretenement +entretenença +entretenéncia +entretenent +entreténer +entretenguda +entretenguèriw +entretengut +entreteniu +entreteniáiv +entretenir +entreturtara +entreturtat +entretustara +entretustat +entreulara +entreulat +entrevarb +entrevat +entrevedilh +entrevegèriw +entreveiraix +entreveire +entrevèrid +entrevesent +entrevéser +entrevesiu +entrevesiáiv +entrèvic +entrevic +entrevige +entrevist +entrevista +entrevists +entrevolhara +entrevolhat +entriga +entrigaire +entrigant +entriganta +entrigarg +entrigat +entrigós +entrigosa +entripara +entripat +entristara +entristat +entristesiri +entristesit +entristiri +entristit +entrò +entrocarg +entrocat +entrompara +entrompat +entronhara +entronhat +entroniri +entronit +entrumara +entrumat +entrumida +entrumiri +entrumit +entruò +entufara +entufat +entusara +entusat +entussiri +entussit +entustassada +entustassat +entutara +entutat +entuveliri +entuvelit +enuc +enuèg +envaborinara +envaborinat +envalara +envalat +envanara +envanat +envarairara +envarairat +envasara +envasat +envasidor +envasiment +envasiri +envasissent +envasissenta +envasit +envedilhara +envedilhat +envegeta +enveirada +enveirat +enveirinara +enveirinat +enveja +envejabla +envejable +envejadura +envejaire +envejarg +envejassa +envejat +envejós +envejosa +envejoset +envejosòt +envelada +envelara +envelat +envelat +envelopara +envelopat +enventadura +enventara +enventat +enventrara +enventrat +enverdara +enverdat +enverdurara +enverdurat +enverenara +enverenat +envergadara +envergadat +envergadura +envergalhara +envergalhat +envergarg +envergat +envergonhara +envergonhat +enverimara +enverimat +enverinaire +enverinament +envermarb +envermat +envermèrid +envèrmic +envernissaire +envernissara +envernissat +envernissatge +enverrolhara +enverrolhat +enverrugarg +enverrugat +envèrs +envèrsa +enversada +enversador +enversaire +enversarb +enversat +enversenc +enversèrid +envèrsic +envesc +envescador +envescadura +envescaire +envescament +envescant +envescanta +envescarg +envescat +envesinara +envesinat +envestida +envestidura +envestiment +envestiri +envestit +envetara +envetat +enviaraz +enviarza +enviat +envielhiri +envielhit +envinadoira +envinagrara +envinagrat +envinara +envinassara +envinassat +envinassat +envinat +envirolarb +envirolat +envirolèrid +enviròlic +environ +environament +environamental +environara +environat +enviscarg +enviscat +envit +envitaire +envitara +envitat +envolamara +envolamat +envolarb +envolat +envolèrid +envòlic +envolop +envolopa +envolòpa +envolopament +envolopara +envolopat +envolzara +envolzat +enzengarg +enzengat +enzima +epatocite +epidèrm +epidèrma +epileptic +epileptica +epilòb +episòdi +epistòla +epitafi +epitèt +epòca +epopèia +epsilòn +epsilòn +eptagòne +equacion +eqüacion +Equator +Eqüator +equator +equator +eqüator +equatorial +eqüatorial +equatoriala +eqüatoriala +eqüatorian +equèstra +equèstra +equèstre +equèstre +equidistància +eqüidistància +equidistant +eqüidistant +eqüidistant +equidistanta +eqüidistanta +equilater +eqüilatèr +equilibrara +equilibrat +equilibri +eqüilitèra +equipament +equipara +equipat +equipatge +equitable +equitable +equitat +equivaléncia +equivalent +equivalent +equivalenta +equivaler +equivalguda +equivalgueriw +equivalgut +equivaliu +equivaliáiv +equivalraix +èr +èra +eràisser +eram +èran +erarb +èras +erat +Erau +èrba +erbacèa +erbalha +erbarb +erbassèra +erbassièra +erbat +erbat +erbatge +erbejarg +erbejat +erbèrid +erbeta +èrbic +erbilh +erbivòr +erbivòra +erbolha +erborilha +erborisara +erborisat +erborista +erborizacion +erborizara +erborizat +erbós +erbosa +erbuda +erbut +Ercegovina +ereditat +èrem +erèrid +eretara +eretat +eretatge +eretge +eretgia +eretièr +eretièra +eretja +èretz +Erevan +ergonomia +èri +èric +eriç +eriçarg +eriçat +eriçon +erigiri +erigit +Eritrèa +eritrèa +eritrèu +èrm +ermàs +ermassiri +ermassit +ermita +ermitatge +ermitòri +ermòl +ernès +èrnha +ernharb +ernhat +ernhèrid +èrnhic +ernhós +ernhosa +ernhuda +ernhut +ernia +erniós +erniosa +ernugo +eròi +eroïc +eroïca +eroïna +eròs +erosion +èrp +erpegador +erpegarg +erpegat +èrpia +erpiar +erpiat +erpiatge +erpièri +èrpii +errança +errant +erranta +errarb +errat +errèrid +èrric +error +error +èrsa +ersada +ersejarg +ersejat +eruga +ès +es +esarrièrs +esavant +esbadalhara +esbadalhat +esbadaulara +esbadaulat +esbaïda +esbaïment +esbaïri +esbaïssent +esbaït +esbalançarg +esbalançat +esbalausida +esbalausidura +esbalausiment +esbalausiri +esbalausit +esbarbadoira +esbarbara +esbarbat +esbardosiri +esbardosit +esbarrancarg +esbarrancat +esbat +esbatós +esbatosa +esbatret +esbatut +esbaudiment +esbaudiri +esbaudit +esbefiar +esbefiar +esbefiat +esbefièri +esbèfii +esbeleg +esbelejarg +esbelejat +esbelugarg +esbelugat +esbercar +esbercar +esbercaraix +esbercat +esbercavif +esbèrda +esberlarb +esberlat +esberlèrid +esbèrlic +esberquem +esberquèriw +esberquetz +esbèrquie +esbèrt +esbiçolarb +esbiçolat +esbiçolèrid +esbiçòlic +esbigossarb +esbigossat +esbigossèrid +esbigòssic +esbilhonara +esbilhonat +esblancassara +esblancassat +esbleugiment +esbleugiri +esbleugissent +esbleugissenta +esbleugit +esbòç +esbodelarb +esbodelat +esbodelèrid +esbodèlic +esbodenament +esbodenara +esbodenat +esbogarjarg +esbogarjat +esbolargarg +esbolargat +esboldrament +esboldrara +esboldrat +esbolh +esbolhadís +esbolhament +esbolhara +esbolhat +esbolhentament +esbolhentara +esbolhentat +esbolhiri +esbolhit +esbolinara +esbolinat +esboliri +esbolit +esborassara +esborassat +esborissat +esbornalh +esbornalhara +esbornalhat +esborniar +esbornièri +esbòrnii +esborrasat +esborrassada +esborrassara +esborrissara +esbosada +esbosara +esbosat +esboselarb +esboselat +esboselèrid +esbosèlic +esbosenara +esbosenat +esbosigarg +esbosigat +esbraçotada +esbraçotat +esbrancarg +esbrancat +esbrandament +esbrandara +esbrandat +esbravara +esbravat +esbrecar +esbrecat +esbrenara +esbrenat +esbridolara +esbridolat +esbrilhaudara +esbrilhaudat +esbrofara +esbrofat +esbroncarg +esbroncat +esbrondelarb +esbrondelat +esbrondelèrid +esbrondèlic +esbronselhada +esbronselhat +esbrotara +esbrotat +esbrudiment +esbrudiri +esbrudit +esbudèl +esbudelarb +esbudelat +esbudelèrid +esbudèlic +esburdara +esburdat +esca +escabalhan +escabantara +escabantat +escabàs +escabassa +escabassaire +escabassara +escabassat +escabeçarg +escabeçat +escabèl +escabèla +escabelarb +escabelat +escabelejaire +escabelejarg +escabelejat +escabelèrid +escabeleta +escabèlic +escabilh +escabilhara +escabilhàs +escabilhat +escabin +escabinat +escabiosa +escabolhada +escabolhaire +escabolhara +escabolhat +escaborn +escaborniá +escabornilha +escaborniri +escabornit +escabossarb +escabossat +escabossèrid +escabòssic +escabossòl +escabòt +escabotarb +escabotat +escabotèrid +escabòtic +escac +escaça +escacalassara +escacalassat +escaçarg +escaçat +escacèla +escacelarb +escacelat +escacelèrid +escacèlic +escacièr +escacolada +escacolat +escaçon +escadèrna +escadra +escadrilha +escadron +escafadura +escafalara +escafalat +escafalh +escafalhara +escafalhat +escafament +escafara +escafarnèl +escafiarb +escafiat +escafida +escafièrid +escàfiic +escafit +escafoirara +escafoirat +escafolhara +escafolhat +escafolhum +escaganhara +escaganhat +escagaròl +escagaròt +escagarotaire +escagarotarb +escagarotat +escagarotèrid +escagaròtic +escagarotièra +escagassament +escagassara +escagassat +escaiernara +escaiernat +escaifara +escaifat +escairaix +escairaire +escairara +escairat +escaire +escaire +escairon +escais +escaissara +escaissat +escaisson +escaiuernhara +escaiuernhat +escal +escala +escalabacon +escalabarris +escalabrara +escalabrat +escalabrinara +escalabrinat +escalabrós +escalabrosa +escalada +escaladara +escaladat +escaladís +escaladissa +escaladoira +escalador +escalaire +escalamaci +escalamancha +escalamanha +escalampara +escalampat +escalampetara +escalampetat +escalancida +escalancit +escalapet +escalapetada +escalapetara +escalapetat +escalara +escalassa +escalassara +escalassat +escalats +escalatge +escalaurara +escalaurat +escalcidor +escalcigarg +escalcigat +escalciri +escalcit +escalène +escaleta +escalfada +escalfaire +escalfament +escalfara +escalfason +escalfat +escalfejarg +escalfejat +escalfesit +escalfestrarb +escalfestrat +escalfèstre +escalfestrèrid +escalfèstric +escalfeta +escalfurara +escalfurat +escalha +escalhador +escalhaire +escalhara +escalhat +escalhatge +escalhempara +escalhempat +escalhon +escalièr +escalimpara +escalimpat +escalindrara +escalindrat +escaliòfa +escalivara +escalivat +escalm +escalofarb +escalofat +escalofèrid +escalòfic +escalon +escalonara +escalonat +escalorara +escalorat +escalossarb +escalossat +escalòssic +escalpradura +escalpraire +escalprara +escalprat +escaluènha +escalugarg +escalugat +escalussada +escalustrada +escalustrara +escalustrat +escallara +escallat +escama +escamacho +escamaisara +escamaisat +escamaissent +escamàisser +escamaissiu +escamaissiáiv +escamandràs +escamandre +escamandron +escamara +escamarrara +escamarrat +escamascuda +escamascut +escamasquèriw +escamasseraix +escamat +escamat +escamatge +escambaissara +escambaissat +escambara +escambarlada +escambarlara +escambarlat +escambarlat +escambarleta +escambat +escambatara +escambatat +escambi +escambiadura +escambiarb +escambiat +escambièrid +escàmbiic +escambisara +escambisat +escambitornada +escambitornat +escamotarb +escamotat +escamotèrid +escamòtic +escamp +escampa +escampada +escampadoira +escampador +escampadura +escampaire +escampament +escampara +escampat +escampat +escampatge +escampativa +escampèstre +escampeta +escampilh +escampilhada +escampilhaire +escampilhara +escampilhat +escamussara +escamussat +escanador +escanagat +escanaire +escanara +escanat +escanaulida +escanaulit +escandal +escandalh +escandalhaire +escandalhara +escandalhat +escandalhatge +escandalhatge +escandalhièr +escandalhon +escandalisara +escandalisat +escandalizara +escandalizat +escandalós +escandalosa +escandalosament +escande +escandilh +escandilhada +escandilhara +escandilhat +escandilhon +escandinau +escandinau +escandinava +Escandinàvia +escandiri +escandit +escandòla +escanelarb +escanelat +escanelèrid +escanèlic +escanh +escanha +escanhada +escanhaire +escanhara +escanhat +escanissada +escanissat +escanjarg +escanjat +escansonament +escansonara +escansonat +escantiment +escantiri +escantit +escap +escapada +escapadís +escapadoira +escapador +escapadura +escapaire +escapament +escapara +escapat +escapatòri +escapçarg +escapçat +escapèl +escapfuèlh +escapiaire +escapiament +escapiarb +escapiat +escapièrid +escàpiic +escapit +escapitara +escapitat +escapol +escapolaire +escapolaire +escapolara +escapolat +escapolon +escapolonara +escapolonat +escapulari +escaquièr +escarg +escara +escarabassara +escarabassat +escarabissa +escarabissonda +escarada +escarafiri +escarafit +escaragòl +escaralh +escaralhara +escaralhat +escaralhatge +escaramiarb +escaramiat +escaramièrid +escaràmiic +escaramossa +escaramossada +escaramossaire +escaramossara +escaramossat +escaràs +escarasson +escaravat +escaravic +escaravida +escaravila +escarbairara +escarbairat +escarbalhara +escarbalhat +escarbara +escarbassara +escarbassat +escarbat +escarbatara +escarbatat +escarbica +escarbicada +escarbolhara +escarbolhat +escarcabalhada +escarcabalhat +escarcal +escarcalàs +escarcalhada +escarcalhara +escarcalhat +escarcanara +escarcanat +escarcanelarb +escarcanelat +escarcanelèrid +escarcanèlic +escarcàs +escarcèla +escarceladura +escarcelarb +escarcelat +escarcelèrid +escarcèlic +escarchadura +escarchara +escarchat +escarchòfa +escardassada +escardassal +escardassara +escardassat +escardassat +escardenc +escardenca +escardussara +escardussat +escarena +escarfalida +escarfalit +escargòl +escarièr +escarièra +escarilhas +Escariòt +Escariòta +escariri +escarit +escarivol +escarlambara +escarlambat +escarlambicarg +escarlambicat +escarlancada +escarlancat +escarlat +escarlatin +escarlatina +escarlimpada +escarlimpaire +escarlimpant +escarlimpara +escarlimpat +escarmalhara +escarmalhat +escarmenara +escarmenat +escarmòl +escarmotara +escarmotat +escarnador +escarnadura +escarnaissent +escarnàisser +escarnaisseraix +escarnaissiu +escarnaissiáiv +escarnara +escarnascuda +escarnascut +escarnasquèriw +escarnat +escarni +escarniment +escarniri +escarnit +escaròla +escarpa +escarpada +escarpador +escarpaire +escarpament +escarpara +escarpassa +escarpat +escarpat +escarpe +escarpenara +escarpenat +escarpeta +escarpida +escarpilhara +escarpilhat +escarpilhon +escarpin +escarpinada +escarpinadura +escarpinara +escarpinat +escarpinat +escarpiri +escarpit +escarpoirara +escarpoirat +escarpòt +escarrabilhadet +escarrabilhadeta +escarrabilhadura +escarrabilhara +escarrabilhat +escarrador +escarradura +escarrafiri +escarrafit +escarramanha +escarrara +escarrassa +escarrassada +escarrassaire +escarrassara +escarrassat +escarrassatge +escarrat +escarraunhada +escarraunhadura +escarraunhaire +escarraunhal +escarraunhara +escarraunhat +escarraunhós +escarraunhosa +escarrièr +escarrièra +escarrós +escarrosa +escars +escarsa +escarsèla +escarselièr +escarset +escarsina +escart +escarta +escartabelarb +escartabelat +escartabelèrid +escartabèlic +escartada +escartairament +escartairara +escartairat +escartaire +escartament +escartara +escartat +escartifolarb +escartifolat +escartifolèrid +escartifòlic +escartulhada +escartulhat +escàs +escascalhara +escasença +escasent +escàser +escasèriw +escasiu +escasiáiv +escasiri +escasit +escassa +escassament +escassara +escassat +escassesa +escassetat +escassolada +escassolat +escasson +escasuda +escasuda +escasut +escat +escata +escatara +escatat +escatós +escatosa +escatossara +escatossat +escatsara +escatsat +escatuda +escatut +escaucèl +escaucelador +escaucelaire +escaucelarb +escaucelat +escaucelatge +escaucelèrid +escaucèlic +escauciri +escaucit +escaudaboc +escaudabulh +escaudada +escaudadura +escaudalha +escaudara +escaudat +escaudufara +escaudufat +escaudum +escaudurara +escaudurat +escaufador +escaufament +escaufara +escaufat +escaufestrarb +escaufestrat +escaufèstre +escaufestrèrid +escaufèstric +escaufeta +escaufiguièr +escaufit +escaulara +escaulat +escaulelhara +escaulelhat +escaulilhara +escaulilhat +escauma +escaumaci +escaumada +escaumaire +escaumara +escaumarrada +escaumason +escaumat +escaume +escaumièra +escaumós +escaumosa +escaunhada +escaunhaire +escaunhara +escaunhat +escaunhat +escauquilhada +escauquilhara +escauquilhat +escauquilhat +escaut +escauta +escautara +escautat +escauton +escautonara +escautonat +escavadura +escavament +escavara +escavartada +escavartadura +escavartara +escavartat +escavassara +escavassat +escavat +escavèl +escavelarb +escavelat +escavelèrid +escavèlic +escavelon +escavena +escaviròll +escient +escientament +esclabissara +esclabissat +esclaca +esclafada +esclafaire +esclafalhara +esclafalhat +esclafara +esclafat +esclafi +esclafidor +esclafiment +esclafiri +esclafit +esclairada +esclairara +esclairat +esclairatge +esclairida +esclairiri +esclairit +esclairòl +esclairon +esclamadís +esclamara +esclamat +esclamatara +esclamatat +esclamentara +esclamentat +esclames +esclampocharb +esclampochat +esclampochèrid +esclampòchic +esclanciri +esclancit +esclantida +esclantiri +esclantit +esclap +esclapa +esclapada +esclapador +esclapaire +esclapara +esclapàs +esclapat +esclapatge +esclapeta +esclapetara +esclapetat +esclapissara +esclapissat +esclapon +esclaponara +esclaponat +esclaquejarg +esclaquejat +esclarcida +esclarcidura +esclarciment +esclarciri +esclarcit +esclargiri +esclargit +esclarida +esclariment +esclariri +esclarit +esclarziri +esclarzit +esclat +esclata +esclatament +esclatant +esclatanta +esclatara +esclatat +esclatidor +esclatidura +esclatiri +esclatit +esclau +esclaufida +esclaufiri +esclaufit +esclaufit +esclauguèriw +esclauraix +esclaure +esclausiu +esclausiáiv +esclausura +esclava +esclavara +esclavat +esclavatge +esclaveta +esclavitat +esclet +escleta +esclinchara +esclinchat +esclinsara +esclinsat +esclipsara +esclipsat +esclipsi +esclòp +escloparb +esclopat +esclopejarg +esclopejat +esclopèrid +esclopet +esclopeta +esclòpic +esclopièr +esclopinejarg +esclopinejat +esclús +esclusa +esclusada +escluscada +escluscat +esclusent +escoarza +escoàs +escoassara +escoassat +escoat +escoatara +escoatat +escoba +escobada +escobadura +escobaire +escobara +escobàs +escobassa +escobat +escobatge +escobejarg +escobejat +escobet +escobeta +escobetara +escobetat +escobièr +escobilh +escobilhara +escobilhas +escobilhat +escobilhièr +escobilhon +escobilhonara +escobilhonat +escobilhum +escoblada +escocés +Escòcia +escoda +escodeire +escodenara +escodenat +escodèri +escodeson +escodi +escodiái +escodièra +escodisson +escodol +escodomara +escodomat +escodossa +escodossara +escodossat +escodrai +escodre +escodrilhada +escoduda +escoetara +escoetat +escofa +escofiarb +escofiat +escofièr +escofièrid +escófiic +escofiment +escofinhara +escofinhat +escofiri +escofit +escofrara +escofrat +escoguda +escoguèriw +escogut +escoiandrara +escoiandrat +escoiraix +escòire +escoissar +escoissar +escoissarai +escoissavi +escoissem +escoissendret +escoissenduda +escoissendut +escoissèri +escoissetz +escòla +escolada +escoladís +escoladoira +escolador +escoladura +escolaire +escolament +escolan +escolana +escolara +escolar +escolat +escolets +escolièr +escoloriri +escolorit +escombejarg +escombejat +escomboirada +escomboirara +escomboirat +escomboriri +escomborit +escombrara +escombrat +escombres +escombrièra +escombrilhara +escombrilhat +escomenjarg +escomenjat +escomés +escomesa +escometeire +escometret +escomoguda +escomoguèriw +escomogut +escomós +escomossara +escomossat +escomouraix +escomòure +escomovent +escomòviu +escomoviáiv +escompetara +escompetat +escompissara +escompissat +escomptara +escomptat +escompte +escomuniaire +escomuniarb +escomuniat +escomunièrid +escomúniic +esconçon +escondalha +escondedor +escondeire +escondilha +escondiri +escondit +escondon +escondret +esconduda +escondut +esconflara +esconflat +esconilhara +esconilhat +esconjur +esconjurada +esconjuraire +esconjurament +esconjurara +esconjurat +escòp +escopeta +escopetada +escopetal +escopetièr +escopiri +escopit +escorarb +escorat +escorba +escòrbi +escòrça +escorçar +escorçar +escorçaraix +escorçat +escorçavif +escorcem +escorcèriw +escorcetz +escòrcie +escorcolh +escorcolhara +escorcolhat +escorcossonara +escorcossonat +escorchara +escorchat +escorchiri +escorchit +escordiu +escorèrid +escorfalida +escorfalit +escorgar +escorgat +escorgem +escorgèri +escorgetz +escòrgi +escòric +escorjada +escorjador +escorjadura +escorjal +escorjar +escorjar +escorjarai +escorjat +escorjavi +escòrna +escornarb +escornat +escornèrid +escòrnic +escorniolada +escorniolarb +escorniolat +escorniolat +escorniòlic +escornissara +escornissat +escornolièrid +escorpeluda +escorpelut +escorpena +escòrpi +escorpitara +escorpitat +escorpiu +escorra +escorraix +escorreguda +escorreguda +escorreguèriw +escorregut +escorrejada +escorrejarg +escorrejat +escorrement +escorrença +escorrent +escorrent +escorrenta +escórrer +escorriu +escorriáiv +escorribanda +escorrilhas +escorriment +escorriri +escorrit +escorriu +escorrívol +escorsa +escorsara +escorsat +escorsièras +escòrta +escortada +escortaire +escortara +escortat +escortegarg +escortegat +escortinara +escortinat +escosença +escosent +escosent +escosenta +escosentor +escòser +escoseson +escòsiu +escosiáiv +escospara +escospat +escossadura +escossoira +escosson +escossonaire +escossonara +escossonat +escossor +escossura +escostarrara +escostarrat +escòt +escota +escòta +escotada +escotaire +escotara +escotelaire +escotelarb +escotelatge +escotelèrid +escotèlic +escotiar +escotiar +escotida +escotièri +escòtii +escotilha +escotilhon +escotiment +escotiri +escotissada +escotissara +escotissat +escotisson +escotit +escotós +escotosa +escprjaire +escrabairara +escrabida +escrabidaire +escrabochida +escrabochit +escrachada +escrachador +escrachaire +escrachament +escrachara +escrafara +escramachada +escramachara +escrancadura +escrancarg +escrancat +escrapara +escrapochinara +escrasa +escrasament +escrasara +escrassa +escrassadoira +escrassadura +escraumara +escrebassara +escremarb +escremason +escremèrid +escrèmic +escremièras +escrestara +escret +escreta +escriba +escrich +escricha +escrichas +escridament +escridara +escridassada +escridassara +escrifara +escrigalhara +escriguèri +escrima +escrimaire +escrimara +escrinceladura +escrincelaire +escrincelarb +escrincelèrid +escrincèlic +escrinh +escrinzelarb +escrinzelèrid +escrinzèlic +escripèl +escrit +escrita +escritòri +escritura +escriuraix +escriure +escriure +escrivalha +escrivan +escrivana +escrivaniá +escrivassejarg +escrivassièr +escriveire +escriviu +escriviáiv +escròc +escrocar +escrocar +escrocaraix +escrocavif +escroissent +escroissenta +escroissida +escroissiri +escroissit +escròlas +escrolós +escrolosa +escrombara +escrombilhara +escropa +escropara +escroquem +escroquèriw +escroquetz +escròquie +escroquichara +escrossiri +escrostara +escrostèrid +escrotarb +escròtic +escrotlament +escrotlarb +escrotlèrid +escròtlic +escrotoira +escruissiri +escruma +escrumadoira +escrumaire +escrumara +escrumejarg +escrumós +escrumosa +escrupolosament +escrupul +escrupulós +escrupulosa +escrusada +escrusara +escrussiri +escrutador +escrutaire +escrutara +escrutin +escrutinh +escrutinhara +escucassara +escucatara +escuçon +escuçonara +escudariá +escudèla +escudelada +escudelaire +escudelarb +escudelèrid +escudeleta +escudèlic +escudelièr +escudelon +escudet +escudièr +escuèch +escuecha +escuèissi +escuèlh +escularb +esculèrid +esculhiri +escultara +escultor +escultura +escumenge +escumenjarg +escumergarg +escuòlh +escuòlic +escup +escupanha +escupàs +escupeire +escupida +escupidor +escupiment +escupinha +escupinhàs +escupinhejarg +escupinhon +escupinhós +escupinhosa +escupiri +escupit +escur +escura +escuraire +escuralhada +escuralhara +escuralhas +escuralhat +escurament +escurara +escurassaire +escurassara +escurciment +escurcina +escurciri +escuresin +escuresina +escuresiri +escuret +escureta +escuriment +escurina +escuriri +escuritat +escuror +escurós +escurosa +escursiri +escurziri +escusa +escusabla +escusable +escusara +escuset +escuseta +escut +escutlara +eschirpós +eschirposa +esdeveniri +esdracada +esdracant +esdracanta +esdracarg +esdracatge +esenhant +esenhanta +esfaçable +esfaçadura +esfaçament +esfaçarg +esfalenara +esfalhara +esfanelarb +esfanelèrid +esfanèlic +esfangassara +esfar +esfarfalhara +esfarlingarg +esfarotjarg +esfasolida +esfasolit +esfataire +esfatara +esfatatge +esfatrimelarb +esfatrimelèrid +esfatrimèlic +esfaulara +esfegarg +esfeltrara +esfèra +esferic +esferica +esferlarb +esferlèrid +esfèrlic +esferotjarg +esfetgiri +esfetjarg +esfeupara +esfialara +esfigurara +esfiladís +esfilara +esfinx +esfiulara +esfiulet +esflorada +esfloraire +esflorara +esflorejarg +esflotarb +esflotèrid +esflòtic +esflotinhara +esfogalhara +esfogassara +esfoirada +esfoiraire +esfoirara +esfoiràs +esfolhar +esfolhar +esfolhara +esfolharai +esfolhavi +esfolhem +esfolhèri +esfolhetz +esfoliri +esfolissada +esfolissara +esfondret +esfonduda +esfondut +esfòrç +esforçar +esforçar +esforçaraix +esforçavif +esforcem +esforcèriw +esforcetz +esfòrcie +esfosc +esfosca +esfoscarg +esfoscor +esframbailhara +esfrandalhara +esfregiment +esfregiri +esfrejarg +esfrenara +esfringolada +esfringolara +esfrisara +esfrondara +esfrontada +esfrontat +esfruchara +esfuèlhi +esfulhar +esfumara +esgaiament +esgaiant +esgaianta +esgaiarza +esgajarg +esgalinara +esgalissara +esgambiada +esgambiartb +esgambiat +esgambièrid +esgàmbiitc +esgarament +esgarara +esgard +esgargamelarb +esgargamelèrid +esgargamèlic +esgariada +esgariarb +esgarièrid +esgàriic +esgarlip +esgarramachara +esgarrara +esgatara +esgaunhara +esgirbara +esglai +esglajarg +esglandadura +esglandara +esglariarb +esglarièrid +esglàriic +esglasi +esglasiaire +esglasiament +esglasiant +esglasianta +esglasiarb +esglasièrid +esglàsiic +esglausadura +esglausara +esglauselarb +esglauselèrid +esglausèlic +esgotal +esgotament +esgotara +esgramara +esgratilhara +esgraulara +esgusperarb +esgusperèrid +esguspèric +esitacion +esitar +eslabrara +eslanç +eslançarg +eslargarg +eslengarg +eslhauç +eslhauçarg +esliuç +eslonhar +eslonhar +eslonharai +eslonhavi +eslonhem +eslonhèri +eslonhetz +eslovac +Eslovaquia +eslovèn +Eslovènia +esluc +eslucarg +eslucarnhara +esluci +esluciada +esluciaire +esluciarb +eslucièrid +eslúciic +esluènhi +eslugarg +eslunhaire +eslunhament +eslunhar +esmagençarg +esmai +esmaiarza +esmalt +esmaravilhara +esmarrador +esmarrara +esmarratge +esmaut +esmautaire +esmautara +esmautariá +esmenda +esmendabla +esmendable +esmendaire +esmendament +esmendança +esmendara +esmendièr +esmeradura +esmerarb +esmerauda +esmeravelhara +esmerçar +esmerçaraix +esmerçavif +esmercem +esmercèriw +esmercetz +esmèrcie +esmerèrid +esmèric +esmerilh +esmerilhon +Esmirna +esmoguda +esmoguèriw +esmogut +esmolesa +esmolhas +esmòlhas +esmolinara +esmoliri +esmonedara +esmossara +esmotara +esmouraix +esmòure +esmovent +esmovent +esmoventa +esmòviu +esmoviáiv +esneirarb +esneirèrid +esnieirarb +esnieirèrid +esnièiric +esnierarb +esnierèrid +esnièric +esofag +espabolhada +espabolhat +espaçament +espaçarg +espacejarg +espaci +espaciós +espaciosa +espaciosament +espada +espadaire +espadara +espadassa +espadelarb +espadelèrid +espadèlic +espadon +espadonara +espaimara +espaime +espalaficarg +espalaissara +espalancada +espalancament +espalancarg +espalara +espalargarg +espalh +espalhadoira +espalhaire +espalhara +espalhassar +espalhassara +espalhejarg +espalhièra +espalichara +espalissara +espalma +espalmada +espalmara +espalme +espalmonara +espalussara +espampalhara +espampanada +espampanara +espampara +espampegarg +espampèl +espampelarb +espampelèrid +espampèlic +espampolara +espampolejarg +espan +espanairara +espançarg +espandairara +espandi +espandida +espandidoira +espandidor +espandilhara +espandiment +espandiós +espandiosa +espandiri +espandit +espandolhara +espandret +espandrolhara +espandut +espangarg +espangerlarb +espangerlèrid +espangèrlic +Espanha +espanha +espanhòl +espanhòl +espanhòla +espaniri +espanjarlara +espanjarnara +espansilhara +espant +espantabla +espantable +espantadoira +espantador +espantament +espantant +espantanta +espantara +espantolhara +espardilha +espardilhièr +espargiment +espargiri +espàrgol +espargola +espargolièra +espargue +esparguièra +esparmara +esparn +esparnal +esparnèl +esparnha +esparnhaira +esparnhaire +esparnhant +esparnhanta +esparnhara +esparnhe +esparnhet +esparnhi +esparnhós +esparnhosa +esparnida +esparniri +esparpalh +esparpalhara +esparpalhejarg +esparpelarb +esparpelèrid +esparpèlic +esparpelugarg +esparra +esparrabingada +esparrabingat +esparrabissara +esparracarg +esparrada +esparradoira +esparraira +esparraire +esparrancarg +esparrantus +esparrara +esparràs +esparrat +esparrecar +esparrèla +esparricarg +esparron +esparronara +esparsara +esparsinara +esparson +espart +espartaire +espartariá +espartega +espartegarg +espartièr +espartinara +espartiri +espartit +esparvairara +esparvairatge +esparvairenc +esparvairenca +esparvairon +esparvièr +espasa +espasada +espasador +espasaire +espasara +espasassa +espaseta +espasièr +espasièra +espasmara +espason +espassara +espassionara +espatanara +espatara +espatarrada +espatarrant +espatarranta +espatarrara +espatla +espatlament +espatlara +espatlassuda +espatlassut +espatleta +espatlièra +espatlon +espatlós +espatlosa +espatluda +espatlut +espauma +espaumara +espaume +espauriment +espauriri +espaurugada +espaurugal +espaurugant +espauruganta +espaurugarg +espausada +espausaire +espausant +espausanta +espausara +espausat +espautara +espautrigarg +espava +espavent +espaventa +espaventabla +espaventablament +espaventable +espavental +espaventara +espaventós +espaventosa +espavordiment +espavordiri +espavoriri +espebinhara +espeçaire +espeçar +espeçar +espeçaraix +espeçatge +espeçavif +especegarg +especejarg +especem +especèriw +especetz +espècie +espècia +especiaire +especial +especialament +especialista +especialitat +especializacion +especiar +especiar +especiariá +especièr +especièri +especific +especificacion +especificada +especificament +especificarg +especificat +especigarg +espècii +especolara +espectacle +espectaclós +espectaclosa +espeçugarg +especulara +espeçunhara +espeçunhós +espeçunhosa +espèdi +espediri +espefidara +espeimara +espeirador +espeiraire +espeirarb +espeiratge +espeiregada +espeiregarg +espeirèrid +espèiric +espeirigarg +espeirilhara +espeirugarg +espeitara +espeitrinara +espelagassara +espelalhara +espelanhara +espelarb +espelèrid +espelhadura +espelhagondriri +espelhaire +espelhandrara +espelhansara +espelhara +espelhinsara +espelhofara +espelhofiri +espelhordiri +espelhotarb +espelhotèrid +espelhòtic +espèlic +espelida +espelidor +espeliment +espeliri +espelocarg +espelofada +espelofaira +espelofaire +espelofara +espelofiós +espelofiosa +espelofiri +espelofit +espelofriri +espelofrit +espelonga +espelsada +espelsat +espelta +espelte +espeltirara +espeltirat +espelucada +espelucaire +espelucament +espelucarg +espelucariá +espelucat +espelucat +espelucatge +espelufara +espelufat +espelugarg +espelugat +espeluquejarg +espeluquejat +espelussara +espelussat +espenadura +espenara +espenat +espencha +espénger +espenguda +espenguèriw +espengut +espenhent +espénher +espenheraix +espenhiu +espenhiáiv +espenta +espepidaire +espepidara +espepidat +espepidejarg +espepidejat +espepissara +espepissat +espepissonara +espepissonat +espepiussara +espepiussat +espèr +espèra +espèra +esperada +esperaire +esperança +esperarb +esperat +esperbolhiri +esperbolhit +esperboliri +esperbolit +esperdent +esperdèriw +espèrdiu +esperdiáiv +esperdigalhara +esperdigalhat +esperdraix +espèrdre +esperduda +esperdut +esperenc +esperenca +esperencon +esperèrid +esperfòrç +esperforçar +esperforçar +esperforçaraix +esperforçat +esperforçavif +esperforcem +esperforcèriw +esperforcetz +esperfòrcie +esperfumara +esperfumat +espèric +esperiéncia +esperiment +esperimentara +esperimentat +esperimentós +esperimentosa +esperit +esperital +esperitala +esperitalament +esperitara +esperitàs +esperitat +esperiton +esperitós +esperitosa +esperjur +esperjurament +esperjurara +esperjurat +esperla +esperlecarg +esperlecat +esperlenc +esperlongarg +esperlongat +esperlucarg +esperlucat +esperlugarg +esperlugat +espermatida +espermatogenèsi +espermatogonia +espermatozoïde +esperon +esperonada +esperonaire +esperonara +esperonat +esperonejarg +esperonejat +esperonièr +espèrra +esperrecar +esperrecar +esperrecaraix +esperrecavif +esperrequem +esperrequèriw +esperrequetz +esperrèquie +espersarb +espersat +espersèrid +espèrsic +espèrt +espertaire +espertament +espertarb +espertat +espertèrid +espertesara +espertesat +espèrtic +espertin +espertinaire +espertinara +espertinat +espertisara +espertisat +espertitge +espertizara +espertizat +espés +espeselhada +espesicarg +espesicat +espesiclara +espesiclat +espesida +espesilhada +espesiment +espesiri +espesit +espesolhada +espesolhador +espesolhaire +espesolhara +espesolhat +espesotarb +espesotat +espesotèrid +espesòtic +espessa +espessarb +espessat +espessèrid +espessesiri +espessesit +espèssic +espessiment +espessiri +espessit +espessor +espessugarg +espessugat +espet +espetadura +espetairal +espetara +espetard +espetardara +espetardat +espetarrada +espetarrara +espetarrat +espetat +espetidura +espetiri +espetit +espetnicar +espetnicarg +espetoirara +espetoirat +espetorida +espetoriri +espetorit +espeulha +espeulhasèrp +espeut +espeuta +espeutièra +espevinhara +espevinhat +espevinhós +espevinhosa +espia +espiabla +espiable +espiador +espiament +espiarza +espiat +espic +espicassara +espicassat +espichoaraz +espichoat +espieut +espifidara +espifidat +espiga +espigada +espigaire +espigal +espigarg +espigat +espigoladís +espigolarb +espigolat +espigolèrid +espigolharb +espigolhat +espigolhèrid +espigòlhic +espigòlic +espigolum +espigon +espigonara +espigonat +espigossarb +espigossat +espigossèrid +espigòssic +espigotarb +espigotat +espigotèrid +espigòtic +espiguet +espigueta +espilhara +espilhat +espilidoira +espilla +espillai +espillal +espillara +espillat +espillejarg +espillejat +espillèri +espillet +espilleta +espillièr +espillon +espin +espina +espinaire +espinalh +espinant +espinanta +espinara +espinarc +espinarguet +espinàs +espinassa +espinassara +espinassat +espinat +espinat +espinçaire +espincarg +espinçarg +espincat +espinçat +espinchada +espinchaire +espinchament +espinchara +espinchat +espinchon +espinchonara +espinchonat +espineta +espingada +espingaira +espingaire +espingala +espingarg +espingat +espingòla +espingolarb +espingolat +espingolèrid +espingòlic +espingolièr +espinguejarg +espinguejat +espinguet +espinhuda +espinhut +espinòla +espinós +espinosa +espinoset +espinoseta +espintara +espintat +espinuda +espinut +espira +espiral +espirala +espirara +espirat +espiron +espisara +espisat +espisolara +espisolat +espital +espitalet +espitalièr +espitlòri +espiugarg +espiugat +espiulara +espiulat +espiusara +espiusat +esplafara +esplafat +esplanada +esplanara +esplanàs +esplanat +esplandiri +esplandit +esplanissa +esplanissòl +esplatussal +esplatussara +esplatussat +esplech +esplecha +esplechable +esplechara +esplechat +espleit +espleita +espleitable +espleitara +espleitat +esplena +esplendor +esplicarg +esplicat +esplombara +esplombat +esplomissara +esplomissat +esplorara +esplorarb +esplorat +esplorèrid +esplòric +esplumassada +esplumassaire +esplumassal +esplumassara +esplumassat +esplumissara +esplumissat +espocharrara +espocharrat +espochigarg +espochigat +espodassaire +espodassara +espodassat +espodassatge +espodrara +espodrat +espofada +espofara +espofat +espofegarg +espofegat +espofidal +espofidara +espofidat +espofinara +espofinat +espofiri +espofit +espofit +espogarg +espogat +espoilada +espoilara +espoilat +espoilat +espolarb +espolat +espoldrara +espoldrat +espolèrid +espòlic +espoliarza +espoliat +espolsada +espolsador +espolsadura +espolsaire +espolsara +espolsat +espolsatge +espolseirarbr +espolseirat +espolsejarg +espolsejat +espolseta +espolsetara +espolsetat +espolsieirar +espolsierarb +espolsierat +espolsierèrid +espolsièric +espolson +espoltiri +espoltrara +espoltrat +espoltrit +espompara +espomparlara +espomparlat +espompat +espompida +espompidura +espompiment +espompinhara +espompinhat +espompiri +espompissara +espompissat +espompit +espompit +esponch +esponch +esponcha +esponcha +esponchada +esponchara +esponchat +esponda +espondièira +espondilhara +espondilhat +espondret +espondut +esponga +espongarg +espongassa +espongat +espónger +espongós +espongosa +esponguèriw +espongueta +esponhent +espónher +esponheraix +esponhiu +esponhiáiv +esponida +esponit +espontanèa +espontanèu +espontara +espontat +esponton +espontonada +espòra +esporangi +esporg +esporgarg +esporgat +esporiu +esporiva +esporívol +espòrla +esporlarb +esporlat +esporlèrid +espòrlic +espòrt +esportin +esportiu +espós +esposa +esposada +esposador +esposaire +esposalhas +esposament +esposara +esposarèl +esposarèla +esposat +esposc +esposcada +esposcador +esposcadura +esposcaire +esposcarg +esposcat +esposívol +espotarb +espotassara +espotassat +espotat +espotenciarb +espotenciat +espotencièrid +espoténciic +espotèrid +espoterlarb +espoterlat +espoterlèrid +espoterlet +espoterleta +espotèrlic +espòtic +espotida +espotidura +espotilhara +espotilhat +espotiment +espotiri +espotissent +espotissenta +espotit +espotrigarg +espotrigat +espoussarb +espoussat +espoussèrid +espòussic +espoutiri +espoutit +espoutrarb +espòutrarb +espoutrat +espoutrèrid +espòutric +espoutrinhara +espoutrinhat +esprandin +esprandinara +esprandinat +esprantinara +esprantinat +esprèlha +espremeson +espremida +espremiri +espremit +esprès +espressament +espressitè +esprimara +esprimat +espròc +esprocada +espròva +esprovaire +esprovarb +esprovat +esprovèrid +esproveta +espròvic +espudiri +espudit +espulgarg +espulgat +espunta +espuntada +espuntara +espuntat +espurara +espurat +espurga +espurgada +espurgaire +espurgament +espurgarg +espurgat +espurgatòri +esqiu +esquadrilha +esquartairara +esquartairat +esquatrara +esquatrat +esquelet +esqueleta +esquèma +esquematic +esquematica +esquematisara +esquematisat +esquematizara +esquèr +esquerilh +esquerlarb +esquerlat +esquerlèrid +esquèrlha +esquèrlhe +esquèrlic +esquèrn +esquèrra +esquerrenc +esquerrenca +esquerrièr +esquerrièra +esquerròt +esquiç +esquiçada +esquiçadura +esquiçaira +esquiçaire +esquiçal +esquiçament +esquiçant +esquiçanta +esquiçarg +esquiçat +esquiçat +esquich +esquichabonheta +esquichada +esquichadura +esquichagrapaud +esquichaire +esquichament +esquichara +esquichat +esquichons +esquichum +esquierlarb +esquierlat +esquierlèrid +esquièrlic +esquièrn +esquifara +esquifat +esquila +esquilada +esquilara +esquilassara +esquilassat +esquilat +esquileta +esquilha +esquilhada +esquilhaire +esquilhara +esquilhat +esquilheta +esquilhièra +esquilon +esquilonara +esquilonat +esquilòt +esquilòta +esquima +esquina +esquinada +esquinador +esquinal +esquinanciá +esquinara +esquinassada +esquinassara +esquinassat +esquinat +esquinatge +esquinç +esquinçarg +esquinçat +esquineta +esquintament +esquintara +esquintat +esquinzara +esquinzat +esquipa +esquipada +esquipaire +esquipament +esquipara +esquipat +esquipatge +esquipòt +esquirau +esquiròl +esquironèl +esquiròu +esquirrara +esquirrat +esquismatic +esquismatica +esquisofrenia +esquist +esquista +esquistament +esquitada +esquitara +esquitats +esquiu +esquiva +esquiva +esquivança +esquivara +esquivat +essarb +essat +esse +esséncia +essencial +essenciala +essencialament +essent +èsser +èsser +essèrid +èssers +èssic +essiagada +essiagat +essilagada +essilagat +essinjarg +essinjat +essiolara +essiolat +essiòlic +essirara +essirat +essun +èst +èst-timorés +esta +està +estabilhon +estabilhonara +estabilhonat +estabilisara +estabilisat +estabilitat +estabilitat +estabilizara +estabilizat +establada +establaire +establament +establara +establariá +establat +establatge +estable +establida +establiment +establiri +establit +estaboisson +estaboissonara +estaboissonat +estabordiment +estabordiri +estabordit +estaborniri +estabornit +estabosiment +estabosiri +estabosit +estac +estaca +estacada +estacadoira +estacador +estacadura +estacaire +estacament +estacant +estacanta +estacarg +estacareda +estacat +estacion +estacionament +estada +estadas +estadiri +estadís +estadissa +estadissara +estadissat +estadistica +estadit +estafanari +estafara +estafat +estafeta +estafièira +estafièr +estafinhara +estafinhat +estafinhós +estafinhosa +estagi +estagiaris +estaira +estaire +estajan +estajanariá +estajant +estala +estalaire +estalara +estalat +estalatge +estalausiri +estalausit +estalhants +estaloirara +estaloirat +estalpeirarbr +estalpeirat +estalpieirar +estalpierarb +estalpierat +estalpierèrid +estalpièric +estalvi +estalviaire +estalviament +estalviarb +estalviat +estalvièrid +estàlviic +estam +estamador +estamadura +estamaire +estamara +estamat +estamatge +estambòt +estament +estamièr +estamina +estaminada +estaminièr +estamós +estampa +estampadoira +estampador +estampadura +estampaire +estampanal +estampara +estampariá +estampat +estampatge +estampèl +estampèla +estampida +estampilha +estampilhara +estampilhat +estampilhatge +estampiri +estampit +estàn +estanc +estanca +estança +estancada +estancarg +estancat +estançon +estançonara +estançonat +estandard +estanh +estanh +estanha +estanhada +estanhador +estanhal +estanhara +estanhat +estanhièr +estanhocar +estanhocar +estanhocaraix +estanhocat +estanhocavif +estanhòl +estanhoquem +estanhoquèriw +estanhoquetz +estanhòquie +estanhs +estanilhara +estanilhat +estanisson +estanquièr +estant +estantara +estantat +estantiada +estantiat +estantís +estantissa +estantòl +estapa +estar +estaranha +estarasina +estarda +estarencla +estarengla +estarenglada +estarenglara +estarenglat +estariri +estarit +estartalissara +estartalissat +estartiri +estartit +estarviarb +estarviat +estarvièrid +estàrviic +estàs +estasi +estasiarb +estasiat +estasièrid +estàsiic +estat +Estat +Estat +estatge +estatic +estatica +estatjant +estatjarg +estatjat +estats +Estats-Units +estatsunidenc +estatua +estatuiri +estatuit +estatunitenc +estatunitenca +estatut +estatz +estau +estaudèl +estaudet +estaupeirat +estaupieirarb +estaupieirèrid +estaupièiric +estaussara +estaussat +estautiá +estauviarb +estauviat +estauvièrid +estàuviic +estavanida +estavaniment +estavaniri +estavanit +este +èste +estebesiri +estebesit +estefinhara +estefinhat +estel +estela +estèla +estelam +estelara +estelarb +estelat +estelejarg +estelejat +estelèrid +esteleta +estelha +estelhada +estelhadura +estelhara +estelhat +estelhonara +estelhonat +estelhons +estelhós +estelhosa +estèlic +estelicòta +estelon +estelonara +estelonat +estelós +estelosa +estelum +èsten +estenalhada +estenalhara +estenalhas +estenalhas +estenalhat +esténcia +estench +estencha +estencha +estendal +estendalha +estendard +estendatge +estendedor +estendeire +estendilh +estendilhara +estendilhat +estendilhièr +estendret +estenduda +estendut +esténger +estenguèriw +estenguiri +estenguit +estenhement +estenhent +esténher +estenheraix +estenhiu +estenhiáiv +estepa +estequida +estequidura +estequiri +estequit +estequit +estèri +esterificarg +esterificat +esterigal +estèrla +estèrle +esterlejarg +esterlejat +esterlin +esterlisara +esterlisat +esterlizara +esterlizat +esterlucada +esterlucat +esterniri +esternit +esternudaire +esternudament +esternudara +esternudat +esternudatge +esternut +esterpara +esterpat +esterrassara +esterrassat +esterrenal +esterrissara +esterrissat +esterrolhara +esterrolhat +esterrussara +esterrussat +estèrs +estersa +estervelh +estervelhada +estervelhara +estervelhat +èstes +estesa +estesenara +estesenat +estetician +esteva +estève +estevena +estiblada +estiblador +estiblaire +estiblara +estiblassada +estiblassara +estiblassat +estiblat +estifla +estiflada +estiflaire +estiflara +estiflat +estiflau +estifle +estiflejarg +estiflejat +estiflet +estiflòl +estigador +estigança +estigançarg +estigançat +estigant +estigara +estigat +estigmatisara +estigmatisat +estigmatizara +estigmatizat +estil +estilara +estilat +estilet +estiletara +estiletat +estilò +estillador +estillara +estillat +estima +estimabla +estimablament +estimable +estimada +estimadoira +estimador +estimaire +estimara +estimason +estimat +estimborlada +estimborlat +estimossada +estimossal +estimossara +estimossat +estimossiara +estimossiat +estimulara +estimulat +estingòri +estinhassara +estinhassat +estipulara +estipulat +estir +estira +estirabla +estirable +estirada +estiradís +estiradoira +estirador +estiraire +estiraisa +estiralh +estiralhara +estiralhat +estirament +estiranhara +estiranhat +estirara +estirassara +estirassat +estirat +estiratge +estirejarg +estirejat +estireta +estirgonhal +estirgonhara +estirgonhat +estirgossarb +estirgossat +estirgossèrid +estirgòssic +estisara +estisat +estisonara +estisonat +estiu +estiva +estivada +estivador +estival +estivala +estivalara +estivalat +estivalenc +estivalenca +estivalet +estivandièr +estivara +estivat +estivatge +estivet +estobesiri +estobesit +estobla +estòc +estocada +estòcafich +estocar +estocar +estocaraix +estocat +estocatge +estocavif +Estocòlme +estodonhara +estodonhat +estòfa +estofada +estofadoira +estofador +estofament +estofara +estofarb +estofat +estofatge +estofegarg +estofegat +estofèrid +estofet +estòfic +estofinada +estofinara +estofinat +estòla +estolha +estolhada +estolhara +estolhat +estolomiarb +estolomiat +estolomièrid +estolómiic +estòma +estomac +estomagada +estomagal +estomagarg +estomagat +estomagós +estomagosa +estomaguet +estomaquet +estomiarb +estomiat +estomièrid +estómiic +estona +estonabla +estonablament +estonable +estonada +estonal +estonament +estonant +estonanta +estonara +estonat +estondejarg +estondejat +Estònia +estonian +estopa +estopada +estopal +estopara +estopàs +estopats +estopatge +estopeta +estopièra +estopilha +estopilhara +estopilhat +estopinara +estopinat +estopiri +estopit +estopós +estoposa +estoquem +estoquèriw +estoquetz +estòquie +estorbara +estorbat +estorbe +estorbilh +estorcent +estòrcer +estorceraix +estorcèriw +estòrciu +estorciáiv +estordidament +estordiment +estordiri +estordissent +estordissenta +estordit +estorguda +estorgut +estòri +estorlí +estorlòg +estorminara +estorminat +estornabós +estornal +estornara +estornat +estornèl +estornelarb +estornelat +estornelèrid +estornèlic +estornic +estornicarg +estornicat +estorrada +estorrador +estorrara +estorrat +estorrelhada +estorrelhara +estorrelhat +estorrida +estorriment +estorrinara +estorrinat +estorriri +estorrís +estorrit +estorrolhara +estorrolhat +estorrum +estòrs +estòrsa +estòrsa +estorvilh +estosiarb +estosiat +estosièrid +estósiic +estossegarg +estossegat +estossiri +estossit +estraborgesa +estrabrasara +estrabrasat +estrabuncarg +estrabuncat +estraç +estraçada +estraçador +estraçadura +estraçaire +estraçament +estraçarg +estraçariá +estraçat +estracejarg +estracejat +estrach +estrach +estracha +estracha +estrada +estradalh +estradalhara +estradalhat +estradalhièira +estradièr +estradièra +estrafaciarb +estrafaciat +estrafacièrid +estrafàciic +estrafegarg +estrafegat +estrafoisson +estragon +estraguèriw +estrairaix +estraire +estrait +estralh +estralhadura +estralhara +estralhat +estralunada +estralunat +estralusida +estram +estrambòrd +estrambordarb +estrambordat +estrambordèrid +estrambòrdic +estrangièr +estrangièra +estrangieralha +estrangiri +estrangit +estranglacats +estranglacavals +estranglachins +estranglada +estranglador +estrangladura +estranglaira +estranglaire +estranglament +estranglara +estranglat +estranglon +estranglós +estranglosa +estrangolara +estrangolat +estranh +estranha +estranhara +estranhat +estranjament +estranjarg +estranjat +estransidura +estransilhara +estransilhat +estransinadura +estransinara +estransinat +estransiri +estransit +estrantalara +estrantalat +Estrasborg +estrasborg +estrasborgés +estrasent +estrasiu +estrasiáiv +estrasolhar +estrasolhar +estrasolharai +estrasolhat +estrasolhavi +estrasolhem +estrasolhèri +estrasolhetz +estrasuèlhi +estrasulhar +estrasulhat +estrategia +estrategic +estratificarg +estratificat +estratiri +estratit +estraucarg +estraucat +estrava +estravacarg +estravacat +estravagança +estravagant +estravaganta +estravagarg +estravagat +estravejarg +estravejat +estraviadura +estraviarza +estraviat +estraviatge +èstre +estrech +estrecha +estrechament +estrechan +estrechana +estrechesa +estrechida +estrechiment +estrechiri +estrechit +estrefach +estrefacha +estrefaire +estrefalida +estrefaliri +estrefalit +estrefar +estrefasent +estrega +estreit +estreita +estreitament +estreitesa +estreitiri +estreitit +estrelha +estrelhada +estrelhaire +estrelhal +estrelhara +estrelhat +estrelhatge +estrelida +estreliri +estrelit +estrelit +estrèm +estrèma +estremada +estremaire +estremal +estrèmament +estremara +estremat +estrematge +estrementida +estrementiment +estrementiri +estrementit +estremesiri +estremesit +estremoliri +estremolit +estremonciarb +estremonciat +estremoncièrid +estremónciic +estremoncion +estremordida +estremordit +estrena +estrenara +estrenat +estrench +estrencha +estrénger +estrenguèriw +estrenhedoira +estrenhement +estrenhent +estrénher +estrenhiu +estrepaira +estrepara +estrepat +estresaurara +estresaurat +estreveliri +estrevirara +estrevirat +estribara +estribat +estribièra +estric +estricada +estricarg +estricat +estrictament +estrictament +estridaire +estridara +estridat +estrif +estrifara +estrifat +estrigonhara +estrigonhat +estrigossara +estrigossat +estrilha +estrilhara +estrilhat +estringadura +estringarg +estringat +estringla +estringlara +estringlat +estripada +estripal +estripament +estripara +estripat +estrissadoira +estrissador +estrissara +estrissat +estriu +estroçada +estroçar +estroçar +estroçaraix +estroçat +estroçat +estroçavif +estrocejarg +estrocejat +estrocelarb +estrocelat +estrocelèrid +estrocèlic +estrocem +estrocèriw +estrocetz +estròcie +estrochingada +estrolhiri +estrolhit +estronàs +estroncarg +estroncat +estroncuda +estroncut +estronchara +estronchat +estronchinara +estronchinat +estronchucarg +estronchucat +estronet +estronhàs +estronhet +estront +estrop +estròp +estropada +estropaire +estropara +estroparb +estropat +estropèrid +estròpic +estropiadura +estropiament +estropiar +estropiar +estropiat +estropièri +estròpii +estrós +estructuracion +estructurara +estructurat +estruch +estrucha +estrugarg +estrugat +estruguèriw +estruiraix +estruire +estrumental +estrumentala +estrumentara +estrumentat +estrun +estrusent +estrusiu +estrusiáiv +estuba +estubada +estubadissa +estubadura +estubaire +estubara +estubassada +estubassaire +estubassara +estubassat +estuc +estucaire +estucarg +estucat +estudi +estudiaire +estudiant +estudiarb +estudiat +estudièrid +estúdiic +estudiò +estudiós +estudiosa +estudiosament +estudornara +estudornat +estuèira +estufergua +estufèrgue +estuferlarb +estuferlat +estuferlèrid +estufèrlic +estug +estuit +estujadoira +estujador +estujarg +estujat +estun +estunhara +estunhat +estuniri +estunit +estup +estupa +estupara +estupat +estupid +estupiditat +esturbat +esturion +esturlufada +esturlufat +esturminara +esturminat +esturrassara +esturrassat +estustara +estustassat +estustat +esvaliri +esvalit +esvanara +esvanat +esvanesida +esvanesiment +esvanesiri +esvanesit +esvaniment +esvaniri +esvanit +esvartara +esvartat +esvedilhada +esvedilhat +esventada +esventador +esventadura +esventament +esventara +esventat +esventrara +esventrat +etanòl +eterificarg +eterificat +etèrn +etèrna +eternal +eternala +eternalament +eternitat +eterotrofia +etiòp +Etiopia +etiopian +etiqueta +etirador +etnia +etnic +etnobotanica +etnografia +etnològ +etnologia +etnològue +euàs +eucariòta +euclidian +euclidiana +eufòrbi +eufra +Eufrates +eufre +èuro +euro +eurò +eurodeputat +euròpa +europèa +europenc +europenca +europèu +euse +euseda +euset +eusièra +Euskadi +euskara +evaluarza +evaluat +evangèli +evangeliari +evangelic +evangelica +evangelisara +evangelisat +evangelizacion +evangelizara +evangelizat +evaporara +evaporat +evasiment +evasiri +evasit +evenciri +evencit +eveniment +eventual +eventualament +eventualitat +evèrs +eversa +evescal +evescala +evescalament +evescat +evesque +evesquessa +evidéncia +evident +evidenta +evidentament +evitara +evitat +evocacion +evolucion +evolucionara +evolucionat +evòri +evorian +evoriana +evorin +evorina +exacerbarb +exacerbat +exacerbèrid +exacèrbic +exactament +exactitud +exagerarb +exagerat +exagerèrid +exagèric +exagonal +exagonala +exagòne +exalara +exalat +exaltacion +exaltara +exaltat +examèn +examinara +examinat +exasperarb +exasperat +exasperèrid +exaspèric +exaustiu +exaustiva +excedent +excedenta +excediri +excedit +excellent +excellenta +excelliri +excellit +excentricitat +excepcion +excepcional +excepcionala +exceptat +excès +excessiu +excessiva +excipiri +excipit +excitara +excitat +excluguèriw +excluraix +exclure +exclús +exclusent +exclusiu +exclusiáiv +excomuniarb +excomuniat +excomunièrid +excomúniic +excrecion +excrement +excrescéncia +excretarb +excretat +excretèrid +excrètic +excretòri +excretòria +excusara +excusat +execrarb +execrat +execrèrid +exècric +execucion +executara +executat +exemplar +exemplar +exemplar +exemplar +exemple +exercici +exerciri +exercit +exibiri +exibit +exigiri +exigit +exilh +exilhara +exilhat +exili +exiliarb +exiliat +exilièrid +exíliic +existéncia +existent +existenta +existir +existit +exòdi +exonerarb +exonerat +exonerèrid +exonèric +exorcisara +exorcisat +exorcizara +exorcizat +exortarb +exortat +exortèrid +exòrtic +exotic +expatriarza +expatriat +expausara +expausat +expausat +expectorarb +expectorat +expectorèrid +expectòric +expediri +expedit +experiéncia +experimentacion +experimental +experimentara +experimentat +expèrt +expèrta +expertesa +expertisara +expertisat +expertitge +expiacion +expiarza +expiat +expirara +expirat +expleitacion +expleitar +explicacion +explicarg +explicat +explicatiu +explicitara +explicitat +explorarb +explorat +explorèrid +explòric +explosion +explosiul +explosival +exponencial +exponenciala +exponent +exportacion +exportarb +exportat +exportèrid +expòrtic +exposicion +exprès +expression +exprimiri +exprimit +expropriarza +expropriat +expulsara +expulsat +exsudara +exsudat +extension +exterior +exteriora +exterminacion +exterminacion +exterminara +exterminat +extèrn +extèrna +extincion +extintor +extirpara +extirpat +extorquiri +extorquit +extrach +extracha +extraguèriw +extrairaix +extraire +extraordinari +extraordinari +extraordinària +extraordinària +extrasent +extrasiu +extrasiáiv +extravagància +extravagant +extravaganta +extravagarg +extravagat +extravasara +extravasat +extraviarza +extraviat +extrèm +extrèm +extrèm +extrèma +Extremadura +extrèmament +extrème +extremenc +extremenca +extremisme +extremista +extremista +extremitat +extremonciarb +extremonciat +extremoncièrid +extremónciic +extremoriental +extremorientala +extremum +exumara +exumat +fa +fàbia +fabla +fablèl +fablièr +fabrariá +fabre +fabrega +fabregargh +fabrejargh +fabressa +fabrica +fabricacion +fabricaire +fabricant +fabricargh +fabrilhon +fabron +faca +fàcia +faciada +facial +faciar +faciat +facible +facièri +facieta +fàciic +facil +factor +factoriala +factorisar +factorizar +factura +facturacion +facturadís +facturaire +facturant +facturar +facturièr +facultar +facultat +facultós +fach +facha +fachal +fachariá +fachet +fachilha +fachilhar +fachilhièr +fachilièra +fachin +fachinar +fachinariá +fachinièr +fachoira +fad +fada +fadar +fadarèla +fadariá +fadejalhas +fadejargh +fadejòlhas +fadelenc +fadèrlhe +fadesa +fadet +fadièr +fadinèl +fadiòl +fador +fadorlas +fadorlàs +fadorlejargh +fadrin +fadurla +fag +faga +fagam +fagan +faganàs +fagas +fagatz +fageda +faget +fagocitar +fagòt +fagotar +fagotèri +fagòtic +fagotièra +faguèrem +faguères +faguèretz +faguèri +faguèron +faguèson +faguèsse +faguèssem +faguèsses +faguèssetz +faguèt +faia +faiçon +faiçonar +faiçoneta +faiçonós +faidiment +faidirh +faidit +faiença +faiençariá +faiencièr +faïn +faïnar +faïnós +faire +fairirh +fais +faisan +faissa +faissar +faissejargh +faissèl +faissèla +faisselièr +faisset +faissièr +faissilhal +faissina +faissòla +faissós +faissuc +fait +faitas +faitet +faitilha +faitilhar +faitilhièr +faitilhièra +faitís +faja +fajal +fajan +fajàs +fajòl +falabrega +falabreguièr +falais +falangista +falapat +falbe +falbejargh +falbèl +falbet +falç +falca +falcargh +falcon +falconèl +falconièr +falet +falgairòla +falgargh +falguièa +falguièra +falguieràs +falha +falhada +falhar +falhassa +falhida +falhièr +falhièra +falhirh +falhit +falhon +falhòt +falimard +faliment +falirh +falord +falorda +falordàs +falordièra +falorditge +falòt +falquet +falquetar +falquièra +fals +falsa +falsada +falsairon +falsament +falsamoneda +falsar +falsaretna +falsari +falsasofra +falscatàs +falsejargh +falsesa +falset +falsetat +falsièira +falsièr +falsificargh +falsmonedièr +fallic +fam +fama +famassa +famat +famelic +famgala +familha +familhal +familhala +familhar +familharament +familhau +famina +famolent +famós +famosament +fan +fanabrega +fanabregon +fanabreguièr +fanal +fanar +fanatisme +fanatisme +fanfara +fanfarejargh +fanfaron +fanfaronada +fanfaronar +fanfaronariá +fanfre +fanga +fangàs +fangassejargh +fangassièr +fangassós +fangós +fangosa +fangossejargh +fanguejargh +fanhanhon +fantasc +fantascariá +fantasiá +fantasiar +fantasièri +fantàsiic +fantasiós +fantasmar +fantassin +fantastic +fantauma +fantaumariá +fantaumejaire +fantaumejargh +fanton +fantonejada +fantonejaire +fantonejargh +far +farà +fara +farai +faramat +faramauca +faramiand +faràn +farandèl +farandòla +farandolar +farandolejaire +farandolejargh +faràs +farcidura +farcin +farcirh +farcit +fard +farda +fardada +fardaire +fardalada +fardalha +fardalhar +fardar +fardas +fardassejargh +fardassièr +fardatge +fardau +fardejargh +fardèl +fardelàs +fardetas +fardolha +fardolhejargh +fardual +farèla +farem +faretz +farfadet +farfalh +farfalha +farfalhar +farfaneja +farfanejargh +farfant +farfantaire +farfantariá +farfantejaire +farfantejargh +farfantèla +farfantelar +farfantelèri +farfantèlic +farfatèl +farga +fargada +fargador +fargaire +fargargh +fariá +fariái +fariam +farián +fariás +fariatz +faridondèl +farina +farinada +farinadoira +farinaire +farinal +farinar +farinejaire +farinejargh +farinèl +faringe +faringiti +farinièira +farinièr +farinòla +farinós +farivòl +farivolejaire +farivolejargh +farlabic +farlabicaire +farlabicargh +farlanda +farlatar +farlenga +farlingat +farmaceutic +farmacia +farmacian +farna +farnacargh +farnat +farnatada +farnatejada +farnatejargh +farnejargh +farnholas +farnós +faró +faròt +farotament +farotariá +farotejargh +farratge +fars +farsar +farsejaire +farsejargh +farson +farsum +fart +fartalha +fas +fasa +fascista +fasedor +faseire +fasèm +fasenda +fasendièr +fasent +fasètz +fasi +fasiá +fasiái +fasiam +fasián +fasiás +fasiatz +aso +fastat +fasti +fastigargh +fastigatge +fastigós +fastigosament +fastiguejargh +fat +fata +fataire +fatalega +fatar +fatarassa +fatelós +fatiga +fatigant +fatigargh +fatiguejargh +faton +fatràs +fatrassariá +fatrassejargh +fatrassièr +fatrimàs +fatrimèl +fau +faube +faubèrt +faubet +faubin +fauç +faucèla +faucet +faucilh +faucilha +faucilhaire +faucilhar +fauçmarue +faucon +fauda +faudada +faudal +faudalat +faudar +faudàs +faudièira +faudièr +faufrach +faugièra +faugina +faula +faulièr +fauna +faune +faunhador +faunhaire +faunhar +faunhejargh +fauquièra +faure +faurejargh +fauressa +fauriá +faurilhon +faus +fausflòris +faussa +fausses +fauta +fautada +fautar +fautat +fautenc +fautèrna +fautible +fautiu +fautor +fautraga +fautuèlh +fava +favar +favaral +favarassa +favard +favarèl +favarelon +favaròla +favaron +favaròt +favèla +favelar +favelèri +favèlic +faveta +favièra +faviòl +faviòlas +favòl +favon +favonada +favonièra +favor +favorablament +favorable +favorirh +fe +feblaire +feblament +feblant +feblar +feblarèl +feble +feblesa +febletat +feblirh +febrada +fèbre +febrejargh +febrelent +febrerada +febrièr +febrifug +febrifuga +febrifugue +febril +febrós +febrosament +fecal +fecond +feconda +fecondacion +fecondar +feconditat +fecula +feculent +feda +fedaira +fedam +fedassa +federacion +federal +fedeta +fedial +fedièira +fedièr +fedon +fedonalha +fedonar +fedum +fèfa +fegondar +feirejargh +fèl +felen +felibre +felibrejada +felibrejargh +felibrenc +felibrencament +felibressa +felibritge +felicitar +felid +felide +feligrés +felin +felina +felitge +feloca +felon +felonha +feloniá +felut +felzar +felze +femada +femadís +femadura +femar +femason +fematge +feme +femèl +femèla +femelaire +femelalha +femelam +femelar +femelassa +femelèri +femeleta +femèlic +femelum +femena +femenèl +femenin +femeta +feminisar +feminisme +feminitat +feminizar +femna +femnarèla +femnaron +femnàs +femnassa +femnassièr +femnatge +femneta +femnièr +femnil +femnòta +femnum +femoràs +femorejargh +femorièr +fems +femsa +femsar +femsièr +femsós +femur +femurs +fen +fenador +fenairada +fenairaire +fenairar +fenairason +fenairatge +fenaire +fenairon +fenal +fenar +fenàs +fenason +fenassa +fenassièr +fenata +fench +fencha +fenda +fendalha +fendascla +fendasclada +fendasclar +fendasclatge +fendedura +fendeire +fendelha +fendilha +fendilhament +fendilhar +fendreh +fenduda +fenejaire +fenejargh +fenejatge +fenejós +fenèstra +fenestral +fenestràs +fenestratge +fenestreta +fenestrièr +fenestron +fenetrà +fénger +fenguèri +fenhantàs +fenheire +fenhent +fénher +fenhi +fenhiái +fenièr +fenirh +fenolh +fenolhada +fenolhàs +fenolheda +fenolhet +fenolhièr +fenomèn +fenomenal +fenotipe +fentar +fenzisclet +fèr +fèr +feram +feràmia +fèrblanquièr +ferdinament +ferdinar +ferejargh +feresa +fèria +ferida +feriment +ferirh +ferit +ferleda +ferlupar +fèrm +fermalh +fermalhas +fèrmament +fermança +fermatge +fèrme +fermentacion +fermentar +fermetat +fermirh +fernirh +feròç +feromòna +feron +feronejargh +feror +ferotge +ferpilha +fèrra +ferrada +ferradièr +ferrador +ferradura +ferral +ferralha +ferralhaire +ferralhar +ferralhatge +ferrament +ferramenta +ferrar +fèrras +ferrassa +ferrasson +ferrat +ferratalha +ferratat +ferratega +ferrategargh +ferratge +ferratgièra +ferratièr +ferratja +ferratjal +fèrre +ferrejargh +ferrenc +ferrèri +ferret +ferreta +ferretaire +ferretar +fèrric +fèrrias +ferrièr +ferrièra +ferriòl +ferrolhar +ferrós +ferrovària +ferroviari +ferrussalha +fertil +fertila +fertilisar +fertilitat +fertilizar +fertils +ferum +ferumejargh +feruna +fervent +fervorós +fes +ès +fèsta +festadièr +festal +festar +festejada +festejaire +festejant +festejargh +festenal +festèri +fèstic +festièr +festin +festinar +festiu +festival +feston +festonar +festor +festuc +fetas +fetge +fetjat +fetjòlas +fetjolet +feton +fetonièr +fètus +fèu +feusar +feuse +feusièra +feusina +feutrar +feutratge +feutre +feutrièr +feval +fial +fialfra +fiata +fiatada +fiblar +fibra +fibroblaste +fic +fica +ficalh +ficant +ficargh +ficassal +ficcion +ficós +ficòt +ficral +ficre +ficha +fichièr +fichoira +fichoiraire +fichoirar +fichoirejargh +fidèl +fidèla +fidelament +fidelièr +fidelitat +fidelizar +fideus +fièch +fieirejargh +fièl +fièlfra +fièra +fieraire +fieral +fierejaire +fieusa +fifor +fiforla +figa +figairada +figareda +figaret +figassejargh +figassièr +figatada +figon +figuièr +figura +figurable +figuradament +figurant +figurar +figurassa +figurat +figurina +figurona +iji +fijian +fil +fila +filable +filactèri +filachon +filada +filadís +filadoira +filador +filadura +filaire +filandièra +filandra +filandrejargh +filandrós +filanha +filantròp +filar +filariá +filarmonia +filarmonic +filàs +filassa +filat +filatelia +filatge +filatièr +filbastar +filejargh +filfra +filfrejargh +filfrós +filfrut +filh +filha +filhada +filhalha +filham +filhandram +filhandrum +filhantirh +filhàs +filhassa +filhassièr +filhastre +filhat +filhatàs +filhatge +filhet +filhòl +filholatge +filhon +filhum +filibustièr +filipin +ilipinas +filipon +filistèu +filma +filme +filmós +filochar +filochèri +filòchic +filològ +filologia +filosa +filosada +filosèla +filoset +filosofar +filosofèri +filosòfic +filosofia +filosofic +filtrar +filtratge +filtre +filum +filloxerat +fimple +fin +finada +final +finalament +finalitat +finament +finança +finançament +finançargh +financièr +finangargh +finard +finarda +finàs +finassariá +finassejargh +finaudèl +finés +finesa +finesor +fineta +finfa +finfara +finicion +finida +finiment +finimond +finirh +finlandés +inlàndia +fins +finta +fintaire +fintanèla +fintar +fintís +fintonar +fintonejaire +fintonejargh +fiòla +fiolada +fiolaire +fiolar +fiolèri +fiolet +fiòlic +fionar +fiòrd +fiquesa +fisa +fisable +fisança +fisançós +fisar +fisèl +fisèl +fisic +fisicament +fisician +fisiologia +fissa +fissada +fissador +fissadura +fissaire +fissal +fissant +fissar +fissard +fissolar +fisson +fissonada +fissonar +fissonenc +fissòt +fissut +fita +fitas +fitoira +fitoirar +fiton +fitosanitàri +fitosanitària +fiugastar +fiulada +fiuladís +fiulaire +fiular +fiulèl +fiulet +fiuletar +fiusar +fiutaròl +fivèla +fixacion +fixar +fjòrd +flac +flaçada +flaçadèla +flaçadièr +flaçadon +flacament +flacandejargh +flacargh +flacason +flacassièr +flacciditat +flacunha +flagadar +flage +flagèl +flagelaire +flagelant +flagelar +flagelèri +flagèlic +flagirh +flagívol +flainar +flaira +flairar +flairejargh +flairon +flairor +flairós +flaja +flajargh +flajàs +flam +flamada +flamadèla +flamadura +flamarèl +flamaròta +flamba +flambada +flambador +flambant +flambar +flambard +flambèl +flambent +flambesa +flambissa +flambusca +flambuscada +flambuscal +flambuscargh +flambusquet +flame +flame +flamejargh +flamenc +flamenc +flamencariá +flaminadura +flaminar +flamissa +flan +flancada +flancargh +landes +landra +flandrés +flandrin +flandrinaire +flandrinar +flandrinàs +flandrinejargh +flandrinós +flanèla +flap +flapar +flaquejargh +flaquesa +flaquetat +flaquirh +flaquit +flaquitge +flasca +flascat +flascolet +flascon +flasconar +flasconièr +flasque +flasquejargh +flasquet +flataire +flatar +flatariá +flatason +flatejargh +flatièr +flatinga +flatonejargh +flatonièr +flatós +flatosament +flatum +flau +flauge +flaugièr +flauja +flaujòl +flaujolar +flaujolèri +flaujolet +flaujòlic +flauma +flaume +flaunhac +flaunhaga +flaunhagargh +flaunhar +flaunharagariá +flaunhard +flaunhardar +flaunhardejargh +flaunhardiá +flaunharditge +flaunhàs +flausina +flauson +flaüt +flaüta +flaütada +flaütaire +flaütejaire +flautejargh +flaütèl +flaütet +flaütista +fleca +flech +flècha +flechiment +flechirh +flegirh +fleis +fleissa +fleissar +fleissejargh +fleissèri +flèissic +flequièra +flesqua +flestar +flestejargh +fleton +flèu +flèuma +fleumatic +flèume +fleumièr +fleumós +fleune +flinga +flingargh +flinja +flisc +fliscargh +flisquet +flisquetar +fliutar +floc +flòc +flocada +flocalhat +flocar +flocar +flocarai +flocariá +flocàs +flocassejargh +flocatge +flocavi +flocon +floconejargh +flon +floquejargh +floquem +floquèri +floquet +floquetar +floquetièr +floqueton +floquetz +flòqui +flor +florada +floradís +floral +florar +floratge +florcurar +florejargh +lorença +florentin +floret +floreta +floretejargh +floretós +flòri +floricat +floricultura +lorida +florida +floridura +florièr +floriment +florirh +florison +florissent +florista +floronc +floroncós +flòt +flotabilitat +flotable +flotacion +flotaire +flotament +flòtament +flotant +flotar +flotariá +flotason +flotatge +flotejargh +flotèri +flòtic +floton +flotós +fluctuacion +fluid +fluida +fluidificargh +fluiditat +flum +fluòr +fluorescéncia +fluorescent +flus +flus +fluses +flussa +fluvi +fluviatil +fluviatila +fluviatils +foal +fòc +foca +fòca +focar +focar +focarai +focavi +focenc +focha +focharon +foches +fochis +fochoirar +fochòla +fochon +foet +foetada +foetaire +foetant +foetatge +foetejaire +foetejargh +fofa +fofós +fòga +fogada +fogairon +fogal +foganha +foganhièr +fogar +fogar +fogarai +fogassa +fogasset +fogasseta +fogassièr +fogasson +fogat +fogatada +fogatèl +fogatge +fogatièra +fogaton +fogavi +fogon +fogós +foguda +foguejargh +foguem +foguèrem +foguères +foguèretz +foguèri +foguèron +foguèsse +foguèssem +foguèsses +foguèssetz +foguèsson +foguèt +foguetz +fògui +foguièr +foguinenc +fogut +foira +foirai +foiralada +foiralàs +fòire +foireh +foirejargh +foirós +foirosa +foirut +fòisent +foison +foisonar +foissa +foissada +foissar +foissenc +foisset +foissina +foissinar +foisson +fòl +fola +folador +foladura +folaire +folament +fòlament +folan +folar +folàs +folassejargh +folastrada +folastràs +folastre +folastrejaire +folastrejargh +folastritge +folatada +folatge +folatin +folc +folca +folclòr +folclòre +folcloric +folclorisme +folclorisme +folega +folejargh +folet +foletat +foletatge +foletejargh +foletge +foleton +folhac +folhacargh +folhar +folhar +folharaca +folharada +folharai +folharàs +folhargargh +folharut +folhàs +folhascut +folhassa +folhaud +folhavi +folhejargh +folhem +folhèri +folhetz +folhòla +folholar +folholèri +folhòlic +folhut +foliá +foliacion +foliar +foliara +folièira +folieirada +foligada +foligargh +foligaud +foligaudar +foligaudariá +foligaudejargh +foligauditge +folimard +folinèl +foliò +folitge +fologada +folon +folor +folora +folzejargh +fólzer +folzinar +follicul +folliculs +fòma +fomarejargh +fomarièr +foment +fomentacion +fomentar +fomentejargh +fomeràs +foncion +foncion +foncionalitat +foncionament +foncionar +foncionari +fonda +fondador +fondament +fondamenta +fondamental +fondamentar +fondariá +fondas +fondat +fondedís +fondegue +fondeire +fondejargh +fondent +fondon +fondreh +fonduda +fonetic +fonge +fonha +fonhada +fonhadissa +fonhador +fonhaire +fonhar +fonhariá +fonhatge +fonheta +fonhós +fonilh +fonilhar +fonograma +fonologia +fonomètre +fonometria +fons +font +fònt +fontana +fontanal +fontanèla +fontaneta +fontanièr +fontanilh +fontassa +fonteta +fontilha +fonza +fonzada +fonzaire +fonzal +fonzalhas +fonzar +fonzaralhas +fonzatge +fonzèl +fonzelat +fonzes +fonzièr +fonzierament +fonzilh +fonzilhas +fonzilhon +fonzor +fonzós +fonzura +fonzut +foquem +foquèri +foquet +foquetz +fòqui +fòr +fora +fòra +forabandirh +fòradòs +foradura +foragandirh +fòragèt +foragetar +fòragetat +foragetèri +foragètic +fòraguièra +foraminifèrs +forana +foranhar +foraniaire +foranisar +fòranison +fòrapaïs +forar +forat +foratejada +foratejar +fòratet +foratge +foratièra +fòratrait +fòravertat +fòraviarzah +forbidor +forbingargh +forbirh +forc +fòrça +forcada +forçadament +forcadèl +forcadet +forcadièr +forcadís +forcadura +forçadura +forçaire +forçar +forçarai +forcareleta +forcarut +forcas +forcat +forçat +forçavi +forcèla +forcem +forcèri +fòrces +forcetz +fòrci +forcon +forçós +forçut +fordol +forécia +forenaire +forenc +forèri +orés +forés +forés +foresenc +foresian +forèst +forestar +forestatge +forestèri +forèstic +forestièr +forestós +foretge +forfach +forfaire +forfait +forfaitura +fòrga +fòric +forlinhar +forma +fòrma +formable +formacion +formaire +formalisar +formalisma +formalizar +formar +format +formatar +formatge +formatgièr +formatjargh +formatjariá +formatjon +formator +formatritz +formeta +formic +formièr +formiga +formigament +formigargh +formiguejament +formiguejargh +formiguièr +ormosa +formosan +formula +formulacion +formular +formulari +forn +forna +fornada +fornairon +fornàs +fornasa +fornatge +fornèl +fornelar +fornelèri +fornèlic +fornial +fornidor +fornidura +fornièr +fornièra +fornilha +forniment +fornirh +forniu +forquejargh +forquèla +forqueta +forquetar +forquièr +forra-borra +forra +forradura +forraire +forrar +forrargh +forre +forrèl +forrelar +forrelèri +forrèlic +forriala +forrièira +forrièr +forrolh +forrolha +forrup +forrupadís +forrupar +forselon +forsenat +fòrt +fortalesa +fòrtament +fortàs +fortejargh +fortet +fortetat +forticàs +fortificargh +fortin +fortor +fortuna +fortunablament +fortunable +fortunar +fortunejargh +fortunós +forum +forupargh +forviarzah +forzirh +fos +fos +fosa +fosc +foscor +foscós +fosec +fosegada +fosegaire +fosegargh +foseire +fosèl +foser +foseson +fosfat +fosfatar +fosfòr +fosforar +fosforèri +fosfòric +fòsi +fosiái +fosiara +fosic +fosicargh +fosilh +fosilhada +fosilhaire +fosilhar +fosquejargh +fosquet +fòssa +fossaire +fossar +fossarèla +fossat +fossèri +fòssic +fossil +fossilisar +fossilizacion +fossilizar +fossor +fote +fotent +fotesa +fotesc +fotesquet +fotgem +fotgetz +fòtgi +foti +fotimard +fotimàs +fotimassar +fotimassejargh +fotimós +fotisson +fotja +fotjada +fotjaire +fotjar +fotjar +fotjarai +fotjason +fotjavi +fotocopiar +fotocopièri +fotocòpii +fotografia +fotografiarzah +fotosintèsi +fototaxi +fotra +fotral +fotralàs +fotralet +fotralha +fotralhada +fotralhar +fotralitge +fotranca +fotrariá +fotrassal +fotrassejargh +fotrassenc +fotrassós +fotre +fotrejargh +fotriquet +fotumar +fòuca +fòvia +fracargh +fracàs +fracatjargh +fraccion +fraccionar +fraccionari +fraccionària +fraccionejargh +fractage +fracturar +fracha +frachar +frachissa +frachiva +fraga +fragargh +fragàs +fragil +fragilisar +fragilitat +fragilizar +fragmentar +fragon +fragosta +fraguièr +frairada +frairal +frairalament +frairanha +frairar +frairàs +frairastre +fraire +frairejacion +frairejargh +frairenal +frairesa +frairet +fraireton +frairiá +frairièra +frairós +frairosament +frais +fraissa +fraisse +fraisset +fraisseta +fraissòl +fraissós +fraita +fraitura +framarada +framariá +framatada +framatalha +frambuèlh +frami +fràmia +framinar +franc +rança +rança +francament +francàs +francés +francés +rancfòrt +francilhòt +francillian +francimand +francimandalha +francimandejaire +francimandejargh +rancisco +francofòna +francomtés +francor +frangièr +frangilha +frangilhar +frangilhós +franhador +franhaire +franhal +franhar +franhòl +franja +franjador +franjargh +franjatge +franquesa +franquetat +franquirh +franquitge +frapa +frapacion +frapaire +frapament +frapant +frapar +frapat +frapejargh +frapi +fràpia +fraput +frasa +frascargh +frau +fraudaire +fraudament +fraudar +fraudariá +fraudiu +fraulejargh +fraumina +frauminar +fraunha +fraunhós +frè +frecham +frechilhas +fred +fredament +fredàs +fredeluc +fredonar +fredor +freduc +freg +fregada +fregadís +fregador +fregaire +fregal +fregargh +fregeluc +fregeluquejargh +fregida +fregidura +fregil +fregiment +freginament +freginar +fregirh +fregit +fregonar +freja +frejal +frejalièr +frejament +frejàs +frejaud +frejolada +frejolas +frejolum +frejós +frejura +frejurós +frelatar +frelhar +frelhum +fremesirh +fremiment +freminejargh +fremirh +fremissent +fren +frenaire +frenesia +frenetic +frengargh +frenirh +frequéncia +frequent +frequenta +fresa +fresadura +fresaga +fresaire +fresc +fresca +frescada +frescament +frescargh +frescolen +frescolet +frescor +frescós +frescòt +frescuèlh +frescum +frescura +fresilhadís +fresilhar +fresilhon +fresinar +fresonar +fresor +fresqueiron +fresqueirós +fresquejargh +fresquièira +fresquièra +fressa +frèst +frestal +frestèl +fret +freta +fretadís +fretador +fretar +freu +freule +fribolada +fricassa +fricassada +fricaud +fricaudèl +friccion +friccionar +fricós +fricòt +rieu +frifralha +frigiditat +frigol +frigola +frigolada +frigolàs +frigolet +frigorific +frilhar +fringa +fringadissa +fringaire +fringant +fringargh +fringarèl +fringariá +fringatge +fringolhar +fringolhatge +fringolhejargh +riol +friolan +friquet +risa +frisa +frisar +frison +frisum +fritura +friular +friule +friuta +friutar +friute +frivól +frivolitat +fròc +fromatge +froment +fromentaire +fromentièr +fromentós +fronda +frondejargh +front +frònt +frontal +frontièra +fronton +fronza +fronzidura +fronziment +fronzirh +frosar +frostida +frostilhar +frostirh +fructificargh +fruch +fruchada +frucham +fruchar +fruchariá +fruchatge +fruchejargh +fruchièr +fruchós +frustada +frustejargh +frustrar +frut +fruta +frutada +frutam +frutariá +frutatge +frutejargh +frutièr +frutós +frutosament +ftalic +TP +fucha +fuèc +fuèlh +fuèlhi +fug-l'òbra +fuga +fugaç +fugaça +fúger +fugida +fugidís +fugidor +fugidura +fugièr +fugirh +fugiròl +fugitiu +fugívol +fulgurant +fulhac +fulhaca +fulhada +fulham +fulhar +fulharaca +fulhejargh +fulhet +fulhetatge +fulhetejargh +fulhon +fulhós +fulhum +fum +fumadís +fumaire +fumairòl +fumar +fumarèl +fumarèsta +fumarlat +fumarló +fumarós +fumarràs +fumason +fumat +fumatge +fumatièra +fumejargh +fumet +fumièra +fumista +fumós +funerari +funèst +fuòc +fuòlh +fura +furaire +furalhar +furar +furbèc +furejargh +furejon +furenejargh +furet +furetaire +furetar +fureton +furg +furga +furgabelha +furgabornhon +furgador +furgalhaire +furgalhar +furgargh +furgonar +furlupar +furòl +fus +fusada +fusadièr +fusanh +fusar +fusèl +fuselatge +fusil +fusilh +fusilhada +fusilhaire +fusilhament +fusilhar +fusilhièr +fusion +fusionar +fusòl +fust +fusta +fustada +fustadet +fustalha +fustament +fustariá +fustat +fustatge +fustejaire +fustejargh +fustèl +fusteta +fustièr +fustigargh +futa +futur +futurista +ga +gabar +gabard +gabarra +gabarrièr +gabarrit +gabarròt +gabarset +gabèla +gabelaire +gabelar +gabelatge +gabelèri +gabèlic +gaben +gàbia +gabiada +gabiaire +gabiar +gabiat +gabièr +gabièri +gàbiic +gabilha +gabilhat +gabina +gabinèla +gabinet +gabinòla +gabiòla +gabion +gabionar +gabolhaire +gabolhar +gabolhatge +Gabon +gabonés +gabrar +gabràs +gabre +gabron +gach +gacha +gachar +gachet +gachil +gachinar +gachòla +gadafas +gadal +gadalesa +gadalós +gadassa +gadèusse +gadilha +gadòfa +gadós +gaëlic +gafa +gafada +gafaire +gafal +gafar +gafaron +gafaròt +gafet +gafeton +gafinariá +gafinhar +gafolar +gafolèri +gafolh +gafolha +gafolhada +gafolhar +gafolhatge +gafolhon +gafòlic +gafon +gafonièr +gag +gagèl +gaget +gagetièr +gaginar +gai +gai +gaiament +gaida +gaidèl +gaidelejargh +gaidelum +gaiejargh +gaietat +gaimand +gaina +gainar +gainèla +gainièr +gairar +gaire +gaireben +gairit +gairota +gais +gaissar +gaisson +gaissonar +gait +gaita +gaitar +gajal +gal +gal +gal +galabontemps +galadura +galafataire +galafatar +galafatatge +galafèrna +galafre +galambejargh +galaminar +galampre +galamprejargh +galant +galantament +galantariá +galantejargh +galantina +galapastre +galapian +galapiana +galapianàs +galapiar +galapièri +galàpiic +galapitança +galar +galar +galariá +Galas +galastre +galatar +galatàs +galaup +galaupada +galaupaire +galaupar +galaupejargh +galavard +galavardejargh +galavarditge +galavernat +galaversar +galaversèri +galavèrsic +galavessa +galavessar +galavessèri +galavèssic +galban +galbe +galbiar +galbièri +gàlbiic +galdana +galdanar +galdrar +galèc +galefre +galèga +galejada +galejargh +galentièr +galèra +galerian +galèrna +galernada +galés +galés +galés +galesc +galet +galeta +galetada +galetar +galetejargh +galeton +galga +galgue +galha +galhamada +galhamàs +galhamassa +galhar +galhard +galhardet +galhardiá +galhat +galhèc +galhego +galhejargh +galhet +galho +galhòfa +galhòfre +galhon +galhonar +galhost +galhostada +Gàlia +galiassa +Galícia +Galícia +galician +galiciana +galichon +galièira +galièr +galifola +galimand +galimenar +galina +galinada +galinaire +galinar +galinariá +galinàs +galinassa +galinat +galindon +galinèla +galinenca +galinet +galineta +galinièr +galinòta +galion +galiòt +galipa +galís +galobet +galòi +galompejargh +galon +galonar +galopar +galopèri +galòpic +galpesquièr +galsar +galup +galuran +galutre +galzebre +galla +gallés +Gàllia +gamacha +gamadura +gamar +gamarra +gamarrós +gamàs +gamassa +gamassada +gamata +gamatada +gamatar +gambe +gambejargh +gambèl +gambèrle +gamberlejargh +gambi +Gàmbia +gàmbia +gambian +gambilhar +gamèla +gamet +gamèta +gametogenèsi +gamon +gana +ganacha +ganachon +ganarra +ganassa +gancilhar +ganda +gandalh +gandalhar +gandalhejargh +gandalisa +gandard +gandelh +gandesada +gandida +gandil +gandilha +gandilhar +gandiment +gandirh +gandòla +gandolejargh +gandon +gandré +ganèl +ganelar +ganelejada +ganelejargh +ganelèri +ganèlic +ganelós +ganga +gangalha +gangalhar +gangalhon +gangassa +gangassada +gangassaire +gangassar +gangasset +Gange +Ganges +gangetic +gangolh +gangolhar +gangrena +gangrenar +gangrenós +ganguejargh +ganguelar +ganguelèri +ganguèlic +ganguièr +ganh +ganha +ganhador +ganhaire +ganhant +ganhar +ganhatge +ganheta +ganhiu +ganhós +ganic +ganidar +ganitèl +ganitòrta +ganiva +ganivet +ganivetada +ganjòl +gansa +gansar +ganseta +gansòla +gansolar +gansolèri +gansòlic +gant +ganta +gantar +gantariá +gantàs +gantelet +gantièr +gantilha +gapan +gape +gapirh +gara +garach +garachan +garachar +garachon +garafat +garait +garaitar +garajòl +garalda +garamacha +garança +garançargh +garancièra +garanhon +garantirh +garar +garatge +garatgista +garauba +garaubatge +garaubièr +garauda +garaula +garaupa +garba +garbada +garbairejargh +garbairon +garbajaire +garbam +garbassa +garbassat +garbeg +garbejaire +garbejargh +garbejatge +garbèla +garbi +garbièr +garbilh +garbin +garbinada +garbolh +garbolhar +garbura +garç +garçargh +garcejargh +garcejariá +garceta +garçon +garçonalha +garçonejargh +garçonèl +garçonièra +gard +garda +gardabòsc +gardacaça +gardacanal +gardaclaus +gardacòs +gardacòsta +gardadura +gardafòc +gardaire +gardamalaut +gardamàs +gardament +gardan +gardapesca +gardar +gardarauba +gardarèl +gardariu +gardatge +gardejargh +gardèla +gardescudariá +gàrdia +gardian +gardianat +gardianatge +gardiar +gardièri +gàrdiic +gardiòla +gardon +gardonada +gardonar +gardonejargh +gardonenc +Gardonenca +garena +garenièira +garent +garentida +garentirh +gargalh +gargalhada +gargalhaire +gargalhar +gargalhariá +gargalhejargh +gargalheta +gargalhòl +gargalin +gargamèl +gargamelar +gargamelèri +gargamèlic +gargamelièr +gargamelitge +garganèl +gargant +gargata +gargatar +gargatet +gargatièira +gargolh +gargolhament +gargolhant +gargolhar +gargolhatge +gargolhós +gargòta +gargotament +gargotar +gargotatge +gargotejargh +gargotèri +gargotge +gargòtic +gargotièr +garguilh +garguilhar +garguilhós +gari +gariat +garibal +garibalda +garida +garidor +garilhan +garimèl +gariment +garinhós +gariòla +garirh +garison +garitges +garlambasti +garlanda +garlandatge +garlandèa +garlandejargh +garlapat +garlesca +garlon +garlopar +garlopèri +garlòpic +garna +garnacha +garnada +garnidura +garniment +garnirh +garnison +garnissari +garòi +garolh +garolhar +garolhàs +garolhon +Garona +garonenc +garòspa +garpi +garra +garraba +garrabelièr +garrabelut +garrabièr +garrabusta +garrabustar +garrafa +garrafada +garrafon +garramachas +garramanha +garranhon +garrassejargh +garratibar +garrau +garraussa +garrèl +garrelàs +garrelejadís +garrelejargh +garri +garribabau +garric +garriga +garrigada +garrigal +garrigat +garrigatge +garrigòl +garrigon +garrigós +garrigòt +garrissa +garrissada +garrissal +garrissòl +garrofa +garrofal +garrolha +garrolhada +garrolhaire +garrolhar +garrolhàs +garrolhat +garron +garronar +garronièr +garrossa +garrosta +garròt +garrotar +garrotèri +garròtic +garrotièr +garrús +garrusièra +gasaire +gasalh +gasalha +gasalhadís +gasalhament +gasalhar +gasalhejargh +gasalhièr +gasanh +gasanha +gasanhaire +gasanhan +gasanhar +gasanhatge +gasar +gasardon +gasardonar +gasarilha +gascon +gasèla +gaselh +gasificargh +gasilha +gasilhan +gasirh +gasòfi +gasòli +gasós +gaspa +gaspalhat +gaspejaire +gaspejargh +gaspèl +gaspilh +gaspilhar +gaspilhejargh +gaspinèl +gasquet +gassòt +gast +gastable +gastaditge +gastador +gastadura +gastament +gastar +gastitge +gastós +gastrula +gastrulacion +gat +gat +gatada +gatamina +gatar +gatassa +gatat +gatet +gateta +gatfaïn +gatgargh +gatièra +gatilh +gatilhaire +gatilhar +gatilhon +gatilhós +gaton +gatonada +gatonar +gatonat +gatonejargh +gatonèl +gatonièr +gatonièra +gatons +gatossa +gatpudre +gatsause +gatulhar +gaubanèl +gaube +gaubejaire +gaubejargh +gaubejatge +gaubi +gàubia +gaubiar +gaubiassa +gaubièri +gàubiic +gaubiós +gaud +gauda +gaudesiá +gaudial +gaudina +gaudinada +gaudinament +gaudinar +gaudinet +gaudirh +gaudre +gaufèlha +gaufelhut +gaug +gaujós +gaujosa +gaujosament +gaula +gaulada +gaular +gaule +gaulem +gaulha +gaulhar +gaulhàs +gaulhassa +gaulhassar +gaunha +gaunhada +gaunhàs +gaunhasson +gaunhejargh +gaunheta +gaunhièr +gaunhut +gaure +gaüs +gaus +gausador +gausaire +gausament +gausar +gausard +gausardament +gausardariá +gausidura +gausiment +gausirh +gausit +gaüsses +gauta +gautada +gautar +gautàs +gautassa +gautejargh +gauterlut +gautet +gautimàs +gautimassar +gautisson +gauton +gautona +gautrilet +gautut +gavach +gavacharia +gavachejargh +gavachon +gavada +gavar +gavatge +gavèl +gavelada +gavelaire +gavelar +gavelat +gavelèri +gavèlic +gaveta +gavetaire +gavian +gavina +gavitèl +gavòt +gazalhaire +geina +geinant +geinar +gèis +gèissa +geissar +geissièr +geissièra +geissós +gèl +gelabra +gelada +geladís +gelador +geladura +gelaire +gelairon +gelant +gelar +gelarèia +gelatinós +gelèri +gèlic +gelibradura +gelibrar +gelibre +gelificargh +geliu +gelivar +gelós +gelosar +gelosetat +gelosiá +gema +gemèc +gemegar +gemegar +gemegarai +gemegavi +gemeguem +gemeguèri +gemeguetz +gemègui +gemeire +gemèl +gemelar +gemelèri +gemèlic +gemicada +gemicaire +gemicargh +gemiment +gemirh +gemissent +gençana +gençargh +gendarma +gendarmar +gendarmariá +gendre +gène +generacion +general +generala +generalament +generalisar +generalizar +generar +generèri +genèric +generic +generica +generosament +generositat +genèsi +genèst +genestada +genestèla +genestet +genestièra +geneston +genestós +genestròl +genetic +genetica +Genèva +genevés +gengibre +gengiva +gengivard +gengivièr +gengivós +genibre +genibrièra +genibrosa +genic +genic +genièr +genito-urària +genito-urinari +Gènoa +genoés +genolh +genolhada +genolhet +genolhièira +genolhon +genòma +genotèca +genotipe +genovés +genovesa +genre +gens +gensemil +gensemin +gent +gentalha +gentament +gentassa +gentet +gentil +gentilament +gentilesa +gentilòme +gentor +gentum +geodesia +geografia +geografic +geograficament +geologia +geometria +geometric +Georgia +georgian +Gerard +gèrba +gèrda +geréncia +gerent +gergil +gerirh +gèrla +gerlada +gerlet +gerlièr +Germania +germanic +germanica +gèrme +germenar +germós +gèrs +gersièr +ges +gespadera +gespet +gespetal +gèst +gèst +gèst +gèsta +gèsta +gestion +get +geta +getada +getador +getadura +getament +getar +getèla +getèri +gètic +Ghana +ghanés +giba +gibadissa +gibador +gibaire +gibar +gibastèl +gibelina +giblada +giblaire +giblar +giborna +gibornada +gibornar +gibornatge +gibós +gibosetat +gibossejargh +gibrada +gibral +gibrar +gibre +gibrós +GI +giga +gigant +giganta +gigantal +gigantesc +gigantièra +gigat +gigossar +gigòt +gigotar +gigotèri +gigòtic +gilard +gileta +gilhar +gimar +gimbar +gimbèl +gimbelet +gimblar +gimbrar +gimèrre +gimerritge +gimeta +gimnastic +gimnastica +gimpa +gimpòla +ginecologia +ginèsta +ginet +gingla +ginglada +ginglar +gingolar +gingolin +ginguèla +ginjorla +ginjorlièr +ginoscla +gip +gipa +gipar +gipariá +gipàs +gipassar +gipatge +gipièr +gipon +gipós +giquetar +gira +girada +girador +girafa +girandòla +girar +girarzah +girba +girbar +girbàs +girbola +girbon +girèla +giret +gireta +girfalc +girgon +girgonar +girgonejargh +giriva +girle +girodèla +giròfle +giroflièr +giròla +girolet +girolèta +girolha +Girona +gironin +giscla +gisclada +giscladís +giscladoira +gisclaire +gisclament +gisclant +gisclar +gisclard +gisclarèl +gisclàs +gisclassar +giscle +gisclet +giscletar +gisclós +giscós +gisparra +gisparrada +gisparrar +gispet +gisplàs +gisquet +giu +giuladís +giular +giunar +giussa +giusses +glaç +glaça +glaçada +glaçaire +glaçant +glaçargh +glaçatge +glaceiron +glacet +glacial +glacièr +glacina +glacinar +glacís +glaçon +glaira +glairós +glandatge +glandivós +glandola +glandulós +glandús +glapada +glapirh +glària +glas +Glasgow +glasi +glat +glatidura +glatièr +glatilhós +glatiment +glatirh +glatís +glatissar +glaubanèl +glauç +glauçargh +glaujòl +glaujòla +glaujolet +glausa +glausar +glausàs +glaveire +glèisa +gleisada +gleisal +gleisassa +gleisatge +gleiseta +gleisòla +glena +glenada +glenaire +glenar +glenatge +gleu +gleva +glevada +glevós +glevut +glicolipide +glicoproteïna +glòb +global +global +global +globilhon +globul +glòg +glop +glopar +glopejada +glopejargh +glopèl +glopet +glòria +gloriejargh +glorieta +glorificargh +gloriós +gloriosament +glòt +glot +glota +glotament +gloton +glotona +glotonejargh +glotoniá +glucide +glucòsa +gluèg +glujar +goapa +goapo +gobaire +gobar +gobèl +gobelar +gobelariá +gobelèri +gobelet +gobeletat +gobeletejargh +gobeletièr +gobèlic +gobèri +gobet +gòbic +gòbi +góbia +gobiar +gobiar +gobièri +gòbii +gòch +gochopar +gochopèri +gochòpic +gòda +godal +godassa +godièr +godiflaire +godiflar +godilhar +godimèl +godina +godirh +godofi +godomar +godonflar +gòf +gofar +gofèri +gòfic +gòfi +gòfi +gofiar +gofiar +gofièri +gòfii +gofirh +gofolhaire +gofre +gòga +gòi +goiar +goiarai +goiavi +goiejargh +goiem +goièri +goietz +gòii +gòine +gòira +gòire +goirilh +gòit +goitre +goitron +goitrós +goja +gojard +gojarda +gojardar +gojardariá +gojat +gojata +gojatièra +gojon +gojonar +gola +golabadat +golada +golaire +golalhon +golamard +golamàs +golar +golard +golardada +golardament +golardejargh +golardiá +golardum +golarut +golàs +golassa +golatge +golaud +golaudada +golaudament +golaudejargh +golaudiá +gòlça +golçada +golçar +golçar +golçarai +golçavi +golcem +golcèri +golcetz +gòlci +golem +golesejargh +golet +golf +gòlf +golfe +gòlfe +golhar +golhassar +golibaud +golís +goludariá +goludesa +goluditge +golut +goma +gomar +gomarra +gomatge +gomós +gona +gonèl +gonfalon +gonfalonièr +gonfanon +gonga +gongar +gongolha +gongolhat +gongolheta +gonha +gonheta +gonocòc +gòr +gòrb +gorbada +gorbat +gorbaud +gorbauda +gorbèla +gorbelha +gòrbi +gorbiar +gorbièri +górbiic +gorbilh +gorbilhar +gorbilhejargh +gord +gorda +gordejargh +gordeta +gordiá +gordilha +gordilhar +gordissal +gordissar +gordon +gorg +gorga +gorgada +gorgargh +gorgarèl +gorgàs +gorgem +gorgèri +gorgeta +gorgetz +gòrgi +gorgièr +gorgolh +gorgolhada +gorgolhament +gorgolhar +gorgolhejargh +gorgolhut +gorgolin +gorgolina +gorgolinar +gorgorial +gorgosson +gorgossut +gorgotar +gorgoton +gorguejargh +gorguièr +gorilla +gorimand +gorimandàs +gòrja +gòrjabadat +gorjada +gorjador +gòrjafendre +gòrjalís +gòrjalisa +gorjar +gorjar +gorjarai +gorjavi +gòrjavirat +gormand +gormàs +gorminada +gorminar +gormolhada +gormolhar +gorra +gòrra +gorraire +gorrar +gorret +gorrièr +gorrin +gorrina +gorrinaire +gorrinalha +gorrinar +gorrinariá +gorrinàs +gorrinassa +gorrinatge +gorrinejargh +gorrinitge +gorrinon +gos +gosil +gosiòu +gospar +gospilhaire +gospilhar +gospilhatge +gossa +gossalha +gossana +gossàs +gossassa +gossatalha +gossatièr +gosses +gosset +gosseton +gossonilha +gossós +gost +gostacion +gostada +gostaire +gostar +gostard +gostós +gòt +gota +gotal +gotar +gotat +gotejament +gotejargh +gotèl +gotent +gotet +goteta +gotièr +gotina +gotja +gotós +govèrn +governador +governalh +governament +governant +governar +governèri +govèrnic +gra +gràcia +graciable +graciar +gracièri +gràciic +graciós +graciosament +graciosar +graciosetat +gradèl +graduarzah +grafa +grafada +grafadat +grafanhauda +grafar +grafia +grafic +grafic +grafica +grafièr +grafinhada +grafinhar +grafinhós +grafiu +grafut +grailaire +grailar +graile +grais +graisfondreh +graissa +graissalha +graissam +graissapola +graissar +graissejargh +graisset +graisseta +graissièr +graissilhona +graisson +graissonar +graissós +gralha +gram +grama +gramatica +gramatical +gramaticalament +gramatician +grambòt +gramenar +gramenàs +gramenet +gramenièra +gramenós +gran +granable +granache +Granada +granada +granadièr +granadin +granadura +granaire +granal +granalha +granar +granason +granassa +granat +granatge +granatièr +granatina +grancadièra +grand +grandament +grandaràs +grandàs +grandautar +grandesa +grandetat +grandida +grandinèl +grandirh +grandmercé +grandor +grandós +granejargh +granèl +granelar +granelèri +granelet +granèlic +granelós +granet +graneta +grangalar +grangièr +granha +granhada +granhar +granhòta +granièr +granierat +granilha +granilhaire +granilhós +granissa +granissada +granissar +graniu +granívol +granja +granjada +granolha +granolhada +granolhar +granolheta +granolhièr +granolhon +granòu +granul +grapa +grapad +grapada +grapador +grapaire +grapar +grapàs +grapassa +grapat +grapatge +grapaud +grapauda +grapaudalha +grapaudàs +grapaudejaire +grapaudejargh +grapaudejatge +grapaudièra +grapaudina +grapelar +grapelèri +grapèlic +grapelós +grapilh +grapilha +grapilhar +grapirh +grapussar +grapussejargh +gras +grasa +grasairon +grasal +grasala +grasalada +grasalet +grasant +grasèl +grasièra +grasilha +grasilhada +grasilhaire +grasilhar +grasilhatge +grasirh +grassa +grassament +grassejargh +grasset +grassièra +grat +grat +gratabon +gratacuol +gratada +gratador +grataire +gratalard +gratalord +gratament +grataminau +gratamuralhas +gratapalhièr +gratapiuses +gratar +gratariá +gratavèl +gratavèu +gratavol +gratelós +grateusson +gratificacion +gratificargh +gratilh +gratilhar +gratilhon +gratilhonejargh +gratinar +gratinós +gratis +gratisset +grativol +gratonar +gratonejargh +gratulhar +gratusar +gratussar +grau +grau +gràubia +graufi +graufinhar +graula +graular +graule +graulejargh +graulet +graulha +graulhar +graulhet +graulitge +graulonièra +graulós +graumelar +graumelèri +graumèlic +graumelós +graumilhar +graumissar +graunhar +graunhós +graupinhar +grausèl +grausèla +grauselar +grauselèri +grausèlic +grauselièira +grauselós +grausièra +grausilhas +grausissa +grausòla +graussal +grauton +grava +gravadura +gravaire +gravairon +gravairós +gravar +gravasson +gravat +gravatge +gravèl +gravèla +gravelièra +gravelós +gravelut +gravena +gravenàs +gravenejargh +gravenós +graveta +graviar +gravièr +gravièri +gràviic +gravilh +gravilhejargh +gravilhós +gravitar +gravós +grèc +grèc +grèca +Grècia +greda +gredar +gredós +gréfol +grefuèlh +grefuèlhat +grèga +grèga +gregalada +gregalejargh +gregari +grela +grelh +grelh +grelhada +grelhar +grelhau +grelhet +grella +grellada +grellador +Grenada +Grenòble +grenoblés +grep +grepesit +grépia +grepial +grepirh +grequejada +grequejargh +gres +gresa +gresal +gresar +grescal +grescós +gresièr +gresilh +gresilhada +gresilhar +gresilhut +gresinada +gresinha +gresós +grèu +grèuge +greugem +greugèri +greugetz +grèugi +greujaire +greujar +greujarai +greujariá +greujavi +greula +greulaire +greular +greule +greule +greulejargh +greulet +greuta +greuton +grèva +grèvament +grevament +grevança +grevar +grevèri +grèvic +griarzah +grifa +grifada +grifaire +grifar +grifaunhar +grífol +grifol +grifolar +grifolàs +grifoleda +grifolet +grifolhat +grifolièira +grifon +grilh +grilh +grilhada +grilhar +grilhet +grilhòt +grimaud +grin +grinhon +grinhut +gripa +gripar +gripet +gris +grisalenc +grisalha +grisalhar +grisar +grisàs +grisastre +grisejargh +grisèl +grisèla +grisenc +grisòla +grisolàs +grisolièra +grison +grisonar +grisonejargh +griul +griular +griule +griva +gro +groada +groadís +groador +groanha +groarzah +groasson +groat +grodat +groenlandés +Groenlàndia +grogargh +grol +grola +grolariá +grolassièr +grolasson +grolejaire +grolejargh +groleta +grolh +grolha +grolhament +grolhant +grolhar +grolièr +grolut +gromenar +gromèsta +gromilhar +gromissal +gromissar +grompinhar +gronch +gronchar +grondinar +gronh +gronhadissa +gronhaire +gronhament +gronhar +gronhirh +grop +gropa +gropada +gropal +gropar +gropàs +gropejargh +gropelar +gropelèri +gropèlic +gropièra +gropion +gropirh +gropós +groput +gròs +grosieretat +gròssa +grossal +grossala +grossan +grossar +grossariá +grossejargh +grossèri +gròsses +grossesa +gròssic +grossièr +grossiment +grossirh +grossor +grua +gruarzah +grudar +grudat +gruelha +grufièr +gruia +grulh +grulha +grulhon +grum +grumada +grumaire +grumant +grumejargh +grumejós +grumèl +grumelar +grumelejargh +grumelèri +grumèlic +grumicelar +grumicelèri +grumicèlic +grumilhar +grumirh +grumós +grun +gruna +grunejargh +grunèl +grup +grupelar +grupelèri +grupèlic +grupelós +Guadalope +Güadalope +guadalopenc +Guaiana +Güaiana +guaianés +Guatemala +Güatemala +guatemalenc +guatemaltèc +guèch +guechejargh +guechitge +gueinassejargh +guèine +guelsa +guelsar +guelsirh +guellar +guèlle +guellèri +guèllic +guepard +guerdon +guerdonar +guerlariá +guèrle +guèrlhe +guerlhesa +guerlièr +guerpitat +guerpum +guèrra +guerrejaire +guerrejargh +guerrejatge +guerrièr +guida +guidaire +guidar +guidatge +guidon +guierdon +guierdonar +guiflar +guilha +guilhaire +guilhar +guilharòt +guilhotina +guimba +guimbadas +guimbar +guin +guina +guinchada +guinchaire +guinchament +guinchar +guincharèl +guinche +guincholar +guincholèri +guinchòlic +guinda +guindaire +guindal +guindar +guinde +guindièr +guindol +guindola +guindolièr +Guinèa +guinean +guinèu +guingasson +guingassonar +guinhada +guinhaire +guinhament +guinhar +guinhassa +guinhejargh +guinhon +guinhonut +guinhòrla +guinièr +guinsa +guinsar +guiolar +guiraudet +guirba +guirgoste +guirguilh +guirguilhar +guisa +guisarma +guisquet +guissal +guissar +guissolar +guit +guitarra +guitèrn +guiternut +guiteta +guiton +gulampe +gurron +gus +gusa +gusalha +gusard +gusariá +gusàs +gusejargh +gusina +gusitge +Guyana +Haití +haitian +Hanòi +Havre +Hawaii +hawaiian +Helsinki +Himalaya +himalayan +himalayana +Honduras +hondurenc +HTTP +iN +iala +ialara +ialat +iard +ibèr +ibèra +iberic +Iberica +ibridara +ibridat +ibronhara +ibronhat +ibronhejarg +ibronhejat +icòna +ida +idèa +ideal +ideala +idealisara +idealisat +idealizara +idealizat +idear +ideassa +ideat +identic +identica +identificacion +identificarg +identificat +identitat +ideologia +ideologic +ideós +ideosa +idilli +idòla +idola +idolara +idolat +idolatrara +idolatrat +idolatric +idolatrica +idonèa +idonèu +idra +idratara +idratat +idraulic +idraulica +idrogenarb +idrogenat +idrogenèrid +idrogènic +idrolisara +idrolisat +idrolizara +idrolizat +idromèl +ièis +ièis +Iemèn +iemenita +ièna +ièr +ièra +ierarquic +ierarquica +ieu +iga +igada +igaraz +igarèla +igat +igièna +iglauç +ignicion +ignominia +ignorància +ignorant +ignoranta +ignorantisme +ignorara +ignorat +igüana +igüanodònt +ilhauçarg +ilhauçat +illa +illegal +illegale +illegibla +illegible +illegitim +illegitima +illegitime +illegitimitat +illetrat +illicit +illicita +illicite +illimitat +illogic +illogica +illon +illòt +illuminacion +illuminara +illuminat +illusionara +illusionat +illusionist +illusionista +illusiri +illusit +illusòri +illusòria +illustrara +illustrat +ima +imagenara +imagenat +imaginacion +imaginari +imaginària +imago +imajaire +imajarg +imajat +Imalaia +imalaian +imalaiana +imam +imant +imantara +imantat +imatge +imatgenaire +imbecil +imbecila +imbevabla +imbevable +imbrandabla +imbrandable +ime +imèl +imén +imenèu +imitacion +imitara +imitat +imitator +imitatritz +immaculat +immancabla +immancablament +immancable +immanent +immanenta +immatriculara +immatriculat +immediat +immediata +immediatament +immens +immensa +immenses +immensitat +immergiri +immergit +immersion +immersion +immigracion +immigracion +immigrar +imminent +imminenta +immobil +immobila +immobiliari +immobiliària +immobilisara +immobilisat +immobilizara +immobilizat +immòble +immolarb +immolat +immolèrid +immòlic +immoral +immorala +immoralitat +immortal +immortala +immudabla +immudable +immunisara +immunisat +immunitat +immunizara +immunizat +imne +imois +imoissa +imoissara +imoissat +imorejarg +imorejat +imorosiri +imorosit +impaciéncia +impacient +impacienta +impacientament +impacientara +impacientat +impacte +impacte +impagabla +impagable +impar +imparcial +imparciala +impausara +impausat +impecabla +impecable +imperatiu +imperativa +imperfièch +imperfiècha +imperfièit +imperfièita +imperial +imperit +imperita +impermeabilisara +impermeabilisat +impermeabilizara +impermeabilizat +impia +impietadós +impietadosa +impiu +implantacion +implantar +implicacion +implicacion +implicargh +implorara +implorat +impolida +impolidesa +impolit +impopular +impopulara +importacion +importància +important +importanta +importarb +importat +importèrid +impòrtic +importunara +importunat +impossibilitat +impòst +impòst +impòsta +impòstes +impotent +impotenta +imprecís +imprecisa +impregnara +impregnat +imprenabla +imprenable +impression +impression +impressionant +impressionanta +imprevesença +imprevesent +imprevesenta +imprevist +imprevista +imprimeire +imprimeriá +imprimiri +imprimit +impròpri +impròpria +impròpriament +improprietat +improvarb +improvat +improvèrid +impròvic +improvisara +improvisat +impudéncia +impunidament +impur +impura +impuretat +imputara +imputat +inabitual +inabituala +inaccessibla +inaccessible +inactiu +inactiva +inagantabla +inagantable +inagotabla +inagotable +inamorçabla +inamorçable +inapercebuda +inapercebut +inaugurara +inaugurat +inausida +inausit +incalada +incalat +incapacitat +incèrt +incèrta +incèrtan +incèrtana +incertitud +incèst +incinerarb +incinerat +incinerèrid +incinèric +incitacion +incitara +incitat +incluguèriw +incluraix +inclure +inclús +inclusa +inclusent +incluses +inclusiu +inclusiáiv +inclusion +inclusiu +inclusiva +incombiri +incombit +incomòda +incomodarb +incomodat +incomòde +incomodèrid +incomòdic +incomplèt +incompleta +inconcebable +inconcebalbla +inconducha +inconduita +inconeguda +inconegut +inconeissabla +inconeissable +inconsciéncia +incontestable +incorporara +incorporat +incorrècte +incredul +incredula +incrementara +incrementat +increpal +increparb +increpat +increpèrid +incrèpic +incresabla +incresable +incrustara +incrustat +incubara +incubat +inculpara +inculpat +incult +inculta +inde +indecentament +indefinibla +indefinible +indeguda +indegudament +indegut +indemnisara +indemnisat +indemnizara +indemnizat +independéncia +independent +independenta +indevinibla +indevinible +indèx +indexacion +indèxes +indi +Índia +índia +indian +indian +indiana +indicacion +indicarg +indicat +indicatiu +indici +indiferent +indiferentament +indigèna +indigèst +indigna +indignara +indignat +indigne +indirècta +indirècte +indispausara +indispausat +indisponibla +indisponible +individual +indocil +indocila +indondabla +indondable +Indonesia +indonesian +indonesiana +induccion +induch +inducha +induguèriw +induiraix +induire +indulgéncia +indulgenciarb +indulgenciat +indulgencièrid +indulgénciic +indulgent +indulgenta +indusent +indusiu +indusiáiv +indusiri +industria +industrial +inequacion +inequacion +ineqüacion +inèrcia +inèrt +inèrta +inesfaçable +inestorrible +inexacta +inexacte +infama +infamant +infame +infart +infasabla +infasable +infecciós +infecciosa +infectarb +infectat +infectèrid +infèctic +inferior +infèrn +infernal +infernós +infernosa +infèrta +infidèl +infidèla +infiltrara +infiltrat +infim +infima +infimum +infinidament +infinit +infinitiu +infirm +infirma +infirmier +infirmièra +inflamacion +inflexion +infligiri +infligit +influéncia +influenciarb +influenciat +influencièrid +influénciic +influiri +influit +infòrma +informacion +informara +informat +informatic +informatica +informatician +informatisara +informatisat +informatiu +informativa +informatizara +informatizat +informator +informatritz +infòrme +infraccion +infrastructura +infrastructura +infusara +infusat +ingèni +ingeniós +ingeniosa +ingenuïtat +ingeréncia +ingeriri +ingerit +ingredient +inibiri +inibit +inic +inica +inicial +inicial +iniciala +iniciala +inicialament +inicialisara +inicialisat +inicializara +inicializat +iniciaraz +iniciarb +iniciat +iniciativa +inicièrid +iníciic +iniquitat +injectarb +injectat +injectèrid +injèctic +injectiu +injectiva +injúria +injuriarb +injuriat +injurièrid +injúriic +injuriós +injuriosa +injuriosament +injust +injusta +injustícia +injustificat +innocéncia +innocent +innocenta +innocentament +innocentara +innocentat +innombrabla +innombrable +innomenada +innomenat +innovacion +inobidabla +inobidable +inoculara +inoculat +inodòr +inondacion +inondara +inondat +inorganic +inorganica +inoxidable +inquant +inquantara +inquantat +inquiá +inquiet +inquieta +inquietant +inquietanta +inquietara +inquietat +inquietós +inquietosa +inquietud +insadolabla +insadolable +insasibla +insasible +inscrich +inscricha +inscriguèriw +inscripcion +inscripcion +inscriuraix +inscriure +inscrivent +inscriviu +inscriviáiv +insècte +inseminara +inseminat +insensibla +insensible +insercion +inseriri +inserit +insinuaraz +insinuat +insipid +insipida +insisténcia +insistiguent +insistiri +insistit +insofribla +insofrible +insolent +insolenta +insolentament +insolentara +insolentariá +insolentat +insolvabla +insolvable +insostenibla +insostenible +inspeccion +inspectarb +inspectat +inspectèrid +inspèctic +inspector +inspectritz +inspiracion +inspirara +inspirat +instabla +instable +installacion +installara +installat +instància +instant +instauracion +instaurara +instaurat +instigaraz +instigat +instint +institucion +instituiri +instituit +institut +instruccion +instruguèriw +instruiri +instruiraix +instruire +instruisent +instruit +instruit +instruita +instrument +instrumentara +instrumentat +instrusiu +instrusiáiv +instrusiri +instrusit +insubremontabla +insubremontable +insuffiséncia +insuffiséncia +insufisent +insular +insulara +insult +insultara +insultat +insurgent +insurgiri +insurgit +intacta +intacte +integracion +integrala +integrarb +integrat +integrèrid +intègric +integritat +intellectual +intellectuala +intelligéncia +intelligent +intelligenta +intencion +intendéncia +intendent +intendenta +intens +intensa +intensificarg +intensificat +intensitat +interactiu +interactivitat +interagiri +interagit +intercalara +intercalat +intercambiarb +intercambiat +intercambièrid +intercàmbiic +intercediri +intercedit +intercellular +intercellulara +interceptarb +interceptat +interceptèrid +intercèptic +interdich +interdicha +interdiguèriw +interdiraix +interdire +interdisciplinaritat +interdisent +interdisiu +interdisiáiv +interès +interessant +interessanta +interessarb +interessat +interessèrid +interèsses +interèssic +interfàcia +interfasa +interferiri +interferit +interior +interiora +interiorisara +interiorisat +interiorizara +interiorizat +interlinhara +interlinhat +intermedària +intermèdi +intermediari +intermediària +intèrn +intèrna +internacional +internacional +internacionala +internacionala +internacionalizacion +internarb +internat +intèrne +internèrid +internet +intèrnic +interpausara +interpausat +interpelacion +interpelarb +interpelat +interpelèrid +interpèlic +interpolarb +interpolat +interpolèrid +interpòlic +interprèt +interpretacion +interpretarb +interpretat +interpretèrid +interprètic +interregional +interrègne +interrogar +interrogarai +interrogativa +interrogavi +interroguem +interroguèri +interroguetz +interrògui +interrompret +interromput +interseccion +interval +intervale +intervencion +intervendraix +intervenent +intervenguda +intervenguèriw +intervengut +interveniu +interveniáiv +intervenir +intervenit +intervertiri +intervertit +intimidara +intimidat +intitulara +intitulat +intocabla +intocable +intolerant +intonacion +intoxicarg +intoxicat +intractabla +intractable +intrada +intrandolabla +intrandolable +intrant +intranta +intrara +intrat +intratge +intres +intrigaraz +intrigat +introbable +introduccion +introduch +introducha +introduguèriw +introduiraix +introduire +introdusent +introdusiu +introdusiáiv +introdusiri +introdusit +intuïcion +inuman +inumana +inutil +inutila +inutilament +inutilizabla +inutilizable +inutilizada +invalid +invalida +invariable +invariant +invarianta +invencion +invendabla +invendable +inventara +inventat +inventor +invèrsa +inversara +inversat +invèrse +inversibla +inversible +invertebrat +invertiri +invertit +investiri +investit +iodarb +iodat +iòde +iodèrid +iòdic +iogort +iogoslau +iogoslava +Iogoslavia +ionic +ionica +ionisara +ionisat +ionizara +ionizat +iperbòla +iperbolic +iperbolica +ipertèxt +ipertrofiaraz +ipertrofiat +ipnòsi +ipnotic +ipnotisara +ipnotisat +ipnotizaire +ipnotizar +ipnotizara +ipnotizat +ipocràs +ipocrisia +ipocrit +ipocrita +ipopotam +ipotèca +ipotenusa +ipotèsi +ira +irada +iradament +iraga +iragaraz +iragat +iraissent +iràisser +iraisseraix +iraissiu +iraissiáiv +Iran +irange +iranget +irangièr +iranian +iraniana +iranjada +iranjariá +iranjat +iranjon +Iraq +iraquian +iraquiana +irascibla +irascible +irascuda +irascut +irasquèriw +irat +iretge +iretgem +iretgèriw +iretgetz +irètgie +iretja +iretjar +iretjar +iretjaraix +iretjat +iretjavif +Irlanda +irlanda +irlandés +irlandés +irlandesa +irlandesa +ironda +irondon +irós +irosa +irosta +irpara +irpat +irradiacion +irradiarb +irradiat +irradièrid +irràdiic +irreductibla +irreductible +irregular +irregulara +irresponsable +irrigaraz +irrigat +irritabla +irritabla +irritable +irritable +irritacion +irritacion +irritara +irritat +irudor +iruge +isabòt +isala +isalada +isalara +isalat +isard +iscla +iscoscèle +isla +islam +islamic +islamisme +islamista +islamiste +Islanda +islandés +islandesa +Islàndia +isocèla +isocèle +isocròn +isocròna +isogamia +isolacion +isolacionisme +isolament +isolara +isolat +isometria +isòp +isotèrm +isotèrma +isotèrma +isotòp +isotòp +Israèl +Israèl +israelian +israelian +israeliana +israelita +issa +issalancarg +issalancat +issara +issat +issèlze +issoaraz +issoat +isson +Istambol +istamboliòta +isteria +istme +istòria +istorian +istoriana +istoriarb +istoriat +istoric +istorica +istorièrid +istòriic +Itàlia +Itàlia +Italian +italian +italiana +Italic +iteracion +iterarb +iterat +iterèrid +itèric +itinerant +itinerari +ivèrn +ivernada +ivernal +ivernala +ivernalha +ivernarb +ivernat +ivernatge +ivernejarg +ivernejat +ivernenc +ivernenca +ivernèrid +ivèrnic +ivernós +ivernosa +ivernotge +ivernotja +iversenc +iversenca +ivòri +ivorin +ivorina +ja +jaba +jabotar +jabotèri +jabòtic +jaç +jaça +jaçargh +jaçariá +jacièr +jacilha +jacina +jacinar +jacinièra +jacint +jacomard +jacotin +jaguda +jaguèri +jagut +jaiet +jairai +jaire +jaisent +jaissaire +jaissar +jaissós +Jakarta +jalenca +jalonar +jalosar +jamai +Jamaica +jamaican +jambièch +jambin +jamborla +jambre +jampièra +Janeiro +janencargh +janeta +jangolada +jangoladissa +jangolaire +jangolament +jangolar +jangolatge +jangolejargh +jangolina +jangolum +janicòt +jap +japar +japèsta +Japon +Japon +japonés +japustèl +jaqueta +jardin +jardinar +jardinatge +jardinièr +jarga +jargargh +jargàs +jargassar +jargau +jargaudon +jargonar +jarjarlida +jarlon +jarra +jarretar +jasar +jasena +jasent +jàser +jasi +jasiái +jasilha +jasilhar +jaspadura +jaspar +jaspe +jauga +jaujargh +jaula +jaulièr +jauminar +jaunàs +jaune +jaunejargh +jaunèl +jaunet +jaunirh +jaunissa +jaunissós +jaunitge +jaunura +jaup +jaupada +jaupadís +jaupaire +jaupal +jaupar +jauparèl +jaupariá +jaupatge +jaupet +jaupilhaire +jaupilhar +jaupilhariá +jaurèl +Javascript +jelha +Jerusalèm +Jèsus +Jesús +Jiang +Jiboti +jibotian +jispoet +jo +Joan +Joan +joanada +joanàs +joanenc +joanencargh +joanet +joanical +joanicòt +joata +joatièr +jobarga +joc +jòc +jocador +jocargh +jogadís +jogador +jogadura +jogaire +jogalha +jogar +jogarai +jogarèl +jògas +jogassejargh +jogatge +jogavi +joglar +joglèri +jòglic +joguejargh +joguem +joguèri +joguet +joguetz +jògui +joguina +jogum +jòia +joialament +joièl +joielièr +joine +joinesa +joinet +joiós +joiosament +joiosetat +jòlh +jòli +jòlia +jolifrina +jolverd +jolverdassa +jolverdina +jombre +jompet +jompigargh +jonc +joncada +joncairòla +joncalha +joncargh +joncàs +joncós +jonch +jonch +joncha +joncha +jonchada +jonchaire +jonchar +jonchís +jonchura +jónger +jongirar +jonguèri +jonhent +jónher +jonherai +jonhi +jonhiái +jonquièr +jonquilha +jonquina +jonquinèl +jopas +joquièr +joquierat +jòr +jòra +jordan +Jordania +jordanian +jòrg +jorgar +jorgar +jorgarai +jorgàs +jorgavi +jorguem +jorguèri +jorguet +jorguetz +jòrgui +jorguièra +jorguina +jorn +jornada +jornadièr +jornal +jornalament +jornalat +jornalejargh +jornalièr +jornalisme +jornalisme +jornalista +jos +josiba +josibièr +josieu +josieva +jostitolat +jostotal +jota +jotèlh +jòus +jove +jovena +jovenàs +jovença +jovencèl +jovenet +jovenil +jovenòt +jovent +joventejargh +joventut +JPEG +jubicat +jubilar +jubilèu +judaïc +judici +juèiras +juèlh +juèrg +jugular +julh +julh +julhar +julhas +julhat +julhet +julhós +jumenta +jumplar +jun +junaire +junar +june +junega +junèga +júnger +junh +junhenc +júnher +junt +junta +juntada +juntaire +juntar +juntura +jupa +jupirh +jupon +jur +Jura +jurada +jurador +juraire +jurament +jurar +jurassenc +juratòri +juridic +jurisprudéncia +jurista +jurmèla +jurmelar +jurmelèri +jurmèlic +jus +jusquiam +just +justaire +justament +justar +justesa +justícia +justiciar +justicièr +justicièri +justíciic +justificable +justificanta +justificargh +justificatiu +jutariá +jutge +jutjable +jutjada +jutjaire +jutjament +jutjargh +jutjariá +juxtapausar +juxtapausicion +juxtaposion +Kabol +Karachi +Kenya +kenyan +Kiev +kievian +Kinshasa +Kiribati +km +Kowait +kowaitian +Kuapa +Kyiiv +kyiivian +Kyoto +l'abèu +l'acès +l'afisat +l'anar +l'aprene +l'aprene +l'Assemblada +l'aver +l'Edat +l'escampet +l'escorgassèla +l'espart +l'Estat +l'Euròpa +l'interrogar +l'Occitània +l'òm +l'Ostal +la Reünion +la +labech +labechada +labirint +labor +laboratòri +labra +labrejargh +labridon +labrit +labrut +lac +laç +laca +lacai +lacargh +laçargh +lacàs +lacet +Laci +lacial +lach +lachacraba +lachada +lachairon +lachariá +lachasson +lachejargh +lachenc +lacheta +lachièr +lachintar +lachisson +lachoira +lachon +lachós +lachuc +lachuènha +lachuga +lachugard +lachugàs +lachugat +lachugueta +lachusclada +ladin +Ladínia +ladre +ladrièr +ladrièra +ladritge +lag +laga +lagadís +laganha +laganhar +laganhejargh +laganhós +laganhut +lagargh +lagast +lagetat +Lagos +lagossa +lagrema +lagremable +lagremaire +lagremal +lagremar +lagremejargh +lagremós +lagremusa +laguejargh +lagui +laguiar +laguièri +làguiic +laguiós +lai +lai +laiar +laïc +laïcisar +laïcizar +laidament +laidetat +laidor +laidum +laièri +laiic +lairadí +lairaire +lairan +lairar +laire +lairet +lairon +laironalha +laironici +lais +laisana +laisand +laisanejargh +laisar +laissa +laissar +laissòla +laissòla +lait +laitièr +laitós +laituga +laitugard +laitugueta +lajament +lalejargh +lallèra +lama +lamar +lamarckisme +lambiard +lambiardejaire +lambiardejargh +lambiardum +lambra +lambrar +lambre +lambrec +lambrejada +lambrejargh +lambret +lambròt +lambrotar +lambrotejargh +lambrotèri +lambròtic +lambrusc +lambrusca +lambruscaire +lambruscargh +lambrusquejaire +lambrusquejargh +lambrusquièra +lamèla +làmia +lamp +lampada +lampant +lampar +lampejada +lampejargh +lampesa +lampesièr +lamporda +lampordeta +lampresa +lana +lanada +lanaire +lanar +lanariá +lanat +lanatge +lanç +lança +lançada +lançadoira +lançaire +lançament +lançargh +lançariá +lancejada +lancejaire +lancejant +lancejargh +lanceta +lancetièr +lanci +land +landa +landaire +landar +landari +landàs +landièr +landissièra +landon +landòra +landrar +landrejaire +landrejargh +landrin +landrinaire +landrinar +landrinejargh +lanejargh +lanenc +lanfi +lànfia +lanfiejargh +lanfiós +lanfrar +lanfrariá +lanfrin +lanfrinar +lanfrinejargh +langasta +langastièr +langiu +langoirar +langoirejargh +langor +langorós +langorosament +langosta +langostam +langostièra +langostina +langoston +langui +languiá +languidoira +languidura +languiment +languina +languinejargh +languirh +languirejargh +languissent +languisson +languit +languitòri +lanha +lanhaire +lanhar +lanhós +lanièr +lanièr +lanissa +Lanka +lansacanet +lansaman +lansiman +lantena +lantèrna +lanternar +lanternejargh +lanternèri +lantèrnic +lanternièr +lanum +lanut +lanvandièr +Laos +laossian +lapa +lapaç +laparassa +lapàs +lapidar +lapidificargh +lapin +lapinada +lapinar +lapinejargh +lapinièra +lapinon +lapon +Lapònia +lapuçós +laquet +lar +larar +laràs +larbés +lard +larda +lardada +lardadoira +lardaire +lardar +lardejargh +lardèl +lardièr +lardinhós +lardon +lardonar +larèr +larg +largada +largament +largant +largargh +largor +largós +largueirarrh +larguejargh +larguesa +larguet +larguetat +larguieirar +larguieirèri +larguièiric +larguièr +larguierar +larguiereta +largural +larièr +larmar +larme +las +lasbinalesa +lasc +lascargh +lasega +lassadís +lassant +lassar +lasses +lasset +lassièra +lassitge +lassitud +lata +latada +lataire +latar +latassar +latejaire +latejargh +latenc +latin +latinada +latinament +latinejargh +latinitat +Latinoamerica +latinoamerican +latís +laton +latrina +latz +laucàs +lauce +laucec +lauceguejargh +laucejargh +laucièra +laucha +laupard +làupia +laur +laurable +laurada +lauradís +laurador +lauraire +laurar +laurason +lauratge +laurejargh +laurièr +laus +lausa +lausable +lausaire +Lausana +lausange +lausar +lausariá +lausàs +lausat +lausatge +lausenja +lausenjargh +lausèrda +lausèrt +lauseta +lausetaire +lausetar +lausièr +lausilha +lausissa +laüt +laütaire +laütièr +lava +lavaci +lavada +lavador +lavadura +lavaire +lavament +lavanda +lavandièr +lavanhaire +lavanhar +lavanhièr +lavanhós +lavar +lavarada +lavassar +lavassejargh +lavatge +lavavaisséla +LDAP +lebrar +lebrat +lebrata +lebratada +lebratar +lebratós +lebraud +lèbre +lebrèri +lebreta +lebretar +lebretat +lèbric +lebrieirum +lec +leca +lecada +lecadís +lecafròia +lecaire +lecal +lecaplats +lecargh +lecarèl +lecariá +lecat +lecon +lector +lectritz +lectura +lefinhar +lefinhós +lèg +lega +lèga +legadís +legal +legal +legalament +legalament +legale +legar +legargh +legar +legarai +legavi +legeire +legenda +legenda +legent +Léger +legible +legiblement +legidor +legiferar +legiferèri +legifèric +legion +legionari +legirh +legislacion +legislatiu +legislator +legislatura +legitim +legitimacion +legitimar +legitime +legor +leguem +leguenada +leguenador +leguenar +leguent +leguèri +leguetz +lègui +legum +leguminosa +legumós +legums +lei +leial +leialament +leiautat +leiçon +leiçonar +leida +leidar +leidèri +lèidic +lèime +Leir +Leire +lèit +lèma +lemon +lemosin +lempar +lenegargh +lengabit +lengadòc +Lengadòc-Rosselhon +lengadocian +lengamanjargh +lengargh +lengatejargh +lengatge +lenguejargh +lenguetar +lenha +lenhaire +lenhàs +lenhièr +lenhierat +lenhós +lent +lentament +lenticular +lentilha +lentilhièra +lentilhós +lentor +Leon +leon +leonat +Leone +leonés +leonin +lep +lepacuol +lepada +lepafangas +lepafarinas +lepaire +lepar +lepassejargh +lepatge +lepet +lepetitge +lepirh +lepra +leprós +leprosariá +lequièr +lera +lerat +lèri +lèria +les +lès +lesada +lesca +lesirh +lesor +lesorat +Lesotho +lesquejargh +lesqueta +lessa +lessiu +lessivós +lessós +lèst +lèstament +lestar +lestèri +lèstic +lestitge +leton +Letònia +letra +letraferit +letrat +letrat +letrona +letrum +letrut +letrut +letrut +letz +lèu-lèu +lèu +leuda +leudari +leudièr +lèuge +leugièr +leugièrament +leugieretat +leuja +lèumens +leuna +lèus +levada +levadar +levadariá +levadièr +levadís +levadoira +levador +levadura +levalhas +levam +levandièra +levant +levantada +levantés +levantet +levar +levar +lèvas +levat +leventin +levèri +lèvic +lexical +lhabardàs +lhacàs +lhamicós +lhançana +lhaquit +lhauçargh +lhaura +lhaurar +lhausòla +Lhèida +lheidatan +lhejor +lhestar +lhestèri +lhèstic +lhimat +lhimec +lhimpar +lhimpiar +lhimpièri +lhimpiic +lhobaud +lhoca +lhucet +lhuquet +li +lia +liada +liador +liadura +liaire +lialament +lialtat +liam +liamada +liamar +liambra +liament +lianha +liant +liarazh +liardar +liardejargh +liarga +liason +liata +Liban +libanés +libèl +liberal +liberar +liberèri +libèric +Libèria +liberian +libertat +Libia +libian +librari +librariá +libràs +libre +libret +libron +liça +licéncia +licenciar +licencièri +licénciic +licèu +licuna +lichariá +lichièira +lichoira +lièch +liechet +liechòta +Liechtenstein +lièja +lifada +lifar +lifrar +lifre +lifritge +liga +ligadura +ligaire +ligam +ligament +ligant +ligargh +ligason +ligast +lige +ligòci +ligombau +Ligorna +ligòs +ligossa +ligossaire +ligossar +ligossas +ligossejargh +ligossèri +ligòssic +ligòta +ligur +Ligúria +Lilla +lillà +lillac +lillés +lim +Lima +limac +limacós +limada +limadura +limaire +limalha +limar +limase +limauc +limauca +limaucada +limaucós +limauda +limauguejargh +limbarda +limbe +limbèl +limejargh +limenc +limièr +limiquièr +limit +limitar +limon +limona +limonada +limonadièr +limonat +limonejargh +limoneta +limonièr +limonós +limorós +limosin +limpa +limpada +limpanós +limpar +limparós +limpós +limpum +limut +lin +lina +linal +linar +linason +lindament +linde +lindet +lindetat +lindós +lindre +lindròt +linear +linfa +linfocite +lingairòla +linge +lingesa +lingièr +lingostin +linguistic +lingüistic +linha +linhada +linhar +linhatge +linhòla +linholada +linièra +linja +linjada +linjariá +linjoira +linós +linòt +lins +linzar +Lion +Lionés +lionés +lipa +lipet +lipide +lipós +lipòta +liqueficargh +liquèn +liquid +liquidacion +liquide +liquièira +liquor +liquorista +liquorós +lira +lirga +lirgargh +lirgue +liri +liric +lirica +lisa +lisada +lisador +lisaire +lisar +lisboèta +Lisbona +lisbonés +lisc +lisca +liscargh +liset +lisiaira +lisièra +lisoarazh +lispar +lissa +lissada +lissaira +lissar +list +lista +listar +listèl +listelar +listelatge +listelèri +listèlic +liston +listonar +listra +listrar +litànias +literari +literària +literatura +litièra +litigi +litre +litsacabra +lituan +Lituània +lituanian +liturgia +liuç +liuçargh +liura +liurada +liural +liurament +liurar +liurason +liurèa +liusa +liute +Ljubljana +lmauc +lo +loba +lobal +lobar +lobarés +lobaressa +lobariá +lobàs +lobasson +lobat +lobatada +lobatar +lobatariá +lobatàs +lobatièr +lobatiu +lobet +lobièra +lobina +lòc +lòca +local +locala +localisacions +localisar +localizacion +localizar +loco +loctenença +lòctenent +Locutor +loda +lodràs +lodrós +loesar +lofa +lofar +lófia +lofiar +lofièri +lófiic +lofina +lofinar +lòga +logacion +logadièr +logadís +logador +logaire +logar +logar +logarai +logaritme +logaritmic +logatari +logatge +logavi +logica +logicial +login +lògo +loguem +loguèri +loguetz +lògui +loguièr +loira +loirard +Loís +Loïsiana +lomb +lombar +lombard +Lombardia +lombet +lombric +lòna +londinenc +Londres +long +longa +longaine +longamai +longament +longanha +longanhejargh +longariá +longarut +longàs +longièra +longinèl +longobard +longor +longtemps +longuejargh +longuet +longuièr +lonja +lop +lópia +lopilha +lor +lord +Lorda +lordàs +lordejargh +lordet +lordièra +lorditge +Lorena +lorenc +lorenc +lormand +losar +lòt +lotar +lotariá +lotejargh +lotèri +lòtic +lòtja +lotjable +lotjada +lotjaire +lotjament +lòtjament +lotjargh +luca +lucada +lucaire +lucan +lucana +lucargh +luci +luciada +luciar +lucièri +lúciic +luciòla +lucre +lucritge +lucha +luchaire +luchar +luchet +luchetaire +luchetar +luenchenc +luènh +luènha +luènhas +luènhs +luga +lugan +lugana +lugar +lugardejargh +lugarèla +lugaròta +lugor +lugran +lugre +lugrejaire +lugrejargh +lugres +lugret +lugrirh +lum +lumenada +lumenon +lumenós +lumet +lumièra +luminariá +luminós +Lumpur +Luna +luna +lunada +lunaire +lunar +lunard +lunason +lunat +lunatenc +lunatièr +luneissa +luneissat +lunetaire +lunetar +lunetas +luòc +luonchor +luònh +lupar +luquet +luquetaire +luquetièr +luqueton +lusa +Lusàcia +lusacian +lusc +luscambra +luscargh +luscariá +luscre +lusent +lusenta +lúser +luserai +lusèrna +lusernar +lusernèri +lusèrnic +lusernièra +luseta +lusi +lusiái +lusida +lusida +lusièra +lusiguèri +lusiment +lusirh +lusit +lusor +lusquet +lustra +lustre +lut +luta +lutaire +lutar +lutrat +lutz +luxe +Luxemborg +luxemborgés +luxúria +m'en +ma +maca +maça +maçacap +macada +maçadoira +macador +maçador +macadura +macaire +maçaire +macament +maçan +maçaneda +maçanièr +macar +maçargh +macarèl +macarelatge +macatge +maçatge +Macedònia +macedonian +maceta +macièr +macip +maco +maçòla +maçolar +maçolèri +maçòlic +macomà +maçon +maçonar +maçonariá +maçonatge +maçonenc +maçòt +maçotar +maçotèri +maçòtic +macrò +macrofague +maçuga +machacoladura +machacrosta +machada +machador +machafavas +machal +machar +machas +machaud +machegadura +machegargh +machilhar +machin +machina +machinacion +machinaire +machinal +machinament +machinar +machinista +macho +machorlar +machòta +machugadura +machugargh +Madagascar +madaissa +madaisson +madama +madamejargh +madameta +madeble +madièr +madomaisèla +madòna +madoneta +madorne +madraga +madraguièr +madrar +Madràs +madrat +madre +Madrid +madridenc +madrilenc +madur +madur +madurament +madurar +madurason +maduret +maduretat +mag +magalh +magalhada +magalhaire +magalhar +magan +maganha +maganhaire +maganhar +maganhon +maganhós +maganhum +magasin +magasinatge +magasinièr +magazin +magdalenenc +magena +magenc +magencargh +magencatge +màger +magerement +magestat +magia +magiar +magistral +magistralada +magistralejargh +magistre +magnetic +magnetisar +magnetizar +magnific +magnificament +magnificargh +magnificéncia +magranatge +magre +Magrèb +magrejargh +magrestin +magrièra +magrilhàs +magrirh +magrissal +magrisson +magritge +magriule +magrívol +magror +maguèla +mai +maia +maiada +maiat +maid +maidich +maidicha +maidiguèri +maidirai +maidire +maidisent +maidisent +maidisi +maidisiái +maidita +maienc +mailing +mainada +mainadalha +mainadar +mainadièr +mainadum +mainar +mainat +mainatge +mainatgenc +mainatjon +mainatjum +maine +mainida +mainit +mainucalha +mainulha +mairada +mairal +mairam +mairandièr +mairassa +mairastra +maire +mairegrand +mairejargh +mairenal +maireselva +mairilhièr +mairina +mairitz +maisa +maison +maisonassa +maisonatge +maisoneta +maissa +maissada +maissar +maissèla +maisseta +maissut +maistre +maitin +maivalença +majada +majestat +majofa +majofièr +majofràs +major +majorada +majoral +majorana +majorar +majorièr +majoritari +majoritària +majoritat +majossa +majuscula +mal +mala +malabastar +malabèstia +malabèu +malabòça +malabosena +malacara +maladobat +maladrech +maladrecha +malafacha +malafachièr +malafaita +malafam +malagent +malaguet +malaguinhada +malaiga +malairós +malaise +Malàisia +malaisidament +malaisit +malajaça +malamanha +malament +malan +malanar +malanesian +malanha +malanhós +malapèst +malapèsta +malarestada +malària +malaròsa +malasirh +malasòrt +malastrada +malastrosament +malastrosament +malaür +malaurança +malaürar +malaürosament +malaürosament +malaut +malautejargh +malautiá +malautièra +malautís +malautiu +malautós +malavet +Malawi +malaxar +malcalhar +malcontentament +malcorar +malcorèri +malcòric +malcorós +malcorrai +malcorreguda +malcorreguèri +malcorregut +malcorrent +malcórrer +malcorri +malcorriái +maldespièch +maldich +maldich +maldicha +maldiguèri +maldirai +maldire +maldiseire +maldisença +maldisent +maldisent +maldisi +maldisiái +Maldivas +maldivian +maldobtança +maldobtar +maldona +malenconiá +malent +malesa +malescarpit +malèsser +malestruch +maleta +malfach +malfachós +malfait +malfaitor +malfaitós +malfar +malfargargh +malfargat +malfaseire +malfasença +malfisança +malfisar +malfraisse +malgairit +malgalbiat +malgalhard +malganhat +malgash +malgastar +malgovèrn +malgraciós +malgraciosament +malgraciosetat +malgrat +malgraunhat +malgraunhat +malh +malha +malhaire +malhar +malhau +malhet +malhetar +malhòl +malholada +malholar +malholèri +malhòlic +malholièra +malhon +Malhòrca +malhorquin +malhòt +malhuc +malhuca +malhucargh +malhum +Mali +malian +malícia +maliciada +maliciejargh +maliciós +maligne +malignitat +malingèrt +malit +malmenada +malmenadament +malmenar +malnolent +malombrina +malon +malonaire +malonar +malonatge +malonèst +malor +malora +malordit +malós +malparat +malrog +malsabença +malsapiós +malsegur +malsegura +malt +Malta +Malta +maltés +maltés +maltractament +maltractar +maltrach +maltracha +maltrafuja +maltraguèri +maltraire +maltraire +maltraisent +maltrasi +maltraste +maluc +malulhada +malur +malura +malurant +malurós +malurosament +malva +malvada +malvaguda +malvais +malvaisetat +malvalent +malvaler +malvalguèri +malvalgut +malvali +malvaliái +malvalrai +malve +malvestat +malvisc +malviure +malviure +malvivent +malvolença +malvolent +malvoler +malzirh +mallobet +mam +mamà +mamada +mamar +mamarèla +mamèl +mamèla +mamelaire +mamelar +mamelèri +mamèlic +mamelièra +mameta +mamifèr +mammà +mamòis +mamòissa +mamot +man +mana +manada +manadon +manaira +manairal +manaire +manar +manat +mancablament +mancadís +mancaire +mancament +mancança +mancant +mancargh +mancip +mancipeta +manchon +manchonièr +mand +mandadís +mandador +mandaire +mandament +mandant +mandar +mandarèl +mandarèla +mandarin +mandarina +mandarinat +mandarinièr +mandat +mandatar +mandatari +mandatària +mandatge +mandibula +mandil +mandilha +mandilhon +mandolina +mandòrra +mandra +mandragola +mandragora +mandrassa +mandrat +mandre +mandreta +mandrigola +mandrilh +mandrilha +mandrin +mandrinar +mandrolièr +mandrona +mandronejargh +manèfla +maneflaire +maneflariá +manèfle +maneflejargh +maneflitge +manega +manegargh +manejable +manejada +manejaire +manejament +manejargh +manejatiu +manejós +manèl +manèla +manelhar +manent +manequin +manescal +maneta +manètge +mangana +manganèl +manganesa +mangèsta +mangilha +manginar +mangisca +mangiscla +mangona +mangonar +mangonariá +mangonièr +mangosta +manhac +manhaga +manhagargh +manhagonetas +manhaguejargh +manhagum +manhan +manhanarièr +manhandièr +manhanièr +manhanièra +manhòc +mania +maniac +manicòrdi +manicur +manicura +manièr +manièra +manierós +manifacièr +manifèst +manifest +manifestacion +manifestant +manifestar +manifestèri +manifèstic +maniguièra +manihat +Manila +manilha +manilhar +manilheta +manilhon +manipol +manipòla +manipòli +manipulacion +manipular +maniqueïsme +manit +manitòrta +manivèla +manjada +manjadís +manjador +manjadura +manjaganhat +manjaire +manjalha +manjamèl +manjament +manjança +manjapaures +manjaquejargh +manjargh +manjarèl +manjariá +manjatge +manjatiu +manjucargh +manlèu +manlèva +manlevada +manlevaire +manlevament +manlevar +manlevèri +manlèvic +manmòrta +manna +mannar +mannat +manne +manòbra +manobrar +manobrèri +manòbric +manolh +manolha +manon +manosacaride +manpòt +manquet +manrega +manse +mant +manta +mantasta +mantèl +mantelar +mantelejargh +mantelèri +mantelet +manteleta +mantèlic +manten +mantenança +mantendrai +mantenedor +manteneire +mantenement +mantenença +mantenent +mantenent +manténer +mantenguda +mantenguda +mantenguèri +mantengut +manteni +manteniái +mantenir +mantilha +Màntoa +mantoan +mantòl +mantolar +mantuèlha +mantum +mantun +mantusar +manual +manualament +manulacturar +manuscrich +manuscricha +manuscrit +manuscrita +maon +maonaire +maonar +maonatge +maosonada +mapa +maquilhar +maquilhatge +maquina +maquinal +mar +maraca +marana +maratge +maravelhar +marbradura +marbrar +marbre +marbrièr +marbrin +marc +març +marca +marcadissa +marcador +marcant +marcargh +marcarèl +marcat +marcejargh +marcenc +marcesc +marcescada +marcirh +marcívol +marcivòlta +marcha +marchaire +marchament +marchand +marchandisa +marchandòt +marchar +Marchas +marchesan +marchon +marchondon +mareia +marèia +marejargh +marejòu +marèl +marèl +marelar +marelèri +marèlic +marés +marescal +marescalciá +marescatge +marescatjós +marfar +marfe +marfega +marfièira +marfirh +marfondement +marfondiment +marfondirh +marfondreh +marga +margal +margalh +margalhar +margalhièra +margargh +margarida +margarideta +margaridièr +margassa +margassar +marge +marginalisar +marginalizar +margolh +margolhar +margon +margue +Maria +maridable +maridada +maridador +maridaire +maridament +maridanha +maridar +maridatge +marin +marinada +marinar +marinejargh +marinièr +marioneta +mariòta +marit +maritim +maritosa +marjassa +marjassada +marla +marlar +marlatge +marlha +marlièra +marlós +marma +marmalha +marmalhar +marmalheta +marmalhòt +marmanda +marmatalha +marme +marmelada +marmelar +marmelèri +marmèlic +marmessar +marmièra +marmostegargh +marmòta +marmotaire +marmotar +marmotejargh +marmotèri +marmòtic +marmoton +marmulhar +marmussar +marofle +marqués +marquetar +marra +marraire +marran +marrana +marranal +marranar +marrane +Marraquèsh +marrar +marrasièr +marratge +marre +marrega +marrelat +marrelatge +marrés +marridalha +marridariá +marridesa +marridum +marrimar +marriment +marrirh +marrit +marro +Marròc +Marròc +marròc +marrofa +marrogal +marron +marronièr +marroquin +marroquin +marroquinar +marroquinariá +Marselha +Marshall +martegat +martejargh +martèl +martelada +martelaire +martelar +martelariá +martelatge +martelèri +martelet +martèlic +martinet +martingala +Martinica +martiniqués +martre +martronada +martror +mas +mas +masada +masant +masantament +masantar +masantatge +masantejargh +masariá +masatge +masatgièr +masc +masca +mascadura +mascanha +mascanhaire +mascanhar +mascanhon +mascargh +mascarada +mascaradura +mascaraire +mascarar +mascaratge +mascaret +mascariá +mascarilha +mascarina +mascaron +mascarós +mascassejaire +mascassejargh +mascle +masclejargh +masclon +masclum +mascòp +mascòt +masculin +masèl +maselar +maselèri +masèlic +maselièr +masèra +maserar +maserèri +masèric +masèrnhas +masièr +masilha +masquejargh +masquerrièr +masquet +masqueta +massa +massacrar +massacre +massapan +massar +massís +massissa +massissament +massoquet +mast +mastanècas +mastar +mastarganhas +mastegada +mastegador +mastegadura +mastegaire +masteganha +mastegargh +mastegatge +mastic +masticargh +mastin +mastinar +mastingargh +mastra +mastrada +mastralhon +mastrolh +mastrolhaire +mastrolhar +mastulhar +masuc +masuflièr +mat +matablat +matable +matafam +mataflet +matagòt +matalàs +matalassaire +matalassar +matar +mataritge +matarrada +matarrar +matatruc +mate +matematic +matematician +matèria +material +materialisar +materializar +matesirh +matièra +matin +matinada +matinal +matinas +matinièr +matinós +matisar +matòla +matràs +matrassa +matrassada +matrassar +matrassent +matrassina +matre +matrifusa +matrifusar +matrimòni +matritz +matrona +matronhar +matronhièra +matruc +mauca +maucachat +maucargh +maudich +maudicha +maugrabin +maulhar +maura +maure +maurèl +maurelar +maurelèri +maurèlic +maurician +mauritan +Mauritània +mauritanian +mauruc +mauruga +mausac +mautar +mauva +mauve +mauvís +mauvisc +mauvitge +màver +maxillar +maxillara +maximal +maximala +maximom +maximum +me +meat +mec +mèc +Mèca +mecada +mecalàs +mecanic +mecanicament +mecanician +mecanisme +mecanizara +mecon +Mecong +mecós +mecró +mecrut +mecut +mecha +medalha +medalhar +medalhièr +medalhon +medecin +medecina +medecinal +medecinar +medeire +medèri +mèdi +mèdia +mediacion +mediái +mediatèca +mediatic +mediatizara +mediator +mediatritz +medical +medicament +medicargh +medieval +mediòcra +mediòcre +mediocritat +mediom +meditacion +meditar +Mediterranèa +mediterranèa +mediterranenc +mediterranèu +medium +medrai +mèdre +medusa +mèfi +mèg +megalitic +megièr +megièr +megièrament +megina +mèia +mèie +meissent +méisser +meisserai +meissi +meissiái +meisson +meissonada +meissonaire +meissonar +meissonatge +meissonièr +meitat +mèja +mejan +mejanament +mejanar +mejançament +mejançariá +mejancièr +mejancièrament +mejanenc +mejanièr +mèl +mèla +melada +Melanesia +melanina +melar +melassa +melat +Melbourne +melejargh +melèri +melhor +melhorament +melhorança +melhorar +melhorièr +mèlic +melica +melicós +melicosament +melilòt +melingre +melissa +melodia +melodic +melodiós +melodrama +meloman +melon +melonada +melonenca +melonièr +melopèa +melós +mèlsa +melsat +melsós +melze +mèlze +melle +membrana +membrança +membranós +membrar +membrat +membre +membrilhon +membruda +membrut +memento +memòis +memorable +memorandom +memorandum +memorar +memoratiu +memorèri +memòric +memòria +memorial +memorialista +memoriar +memoriós +memorisar +memorizacion +memorizar +mena +menaça +menaçaire +menaçant +menaçargh +menacejargh +menada +menador +menairal +menaire +menairòl +menairon +menal +menalh +menament +menar +menariu +mençonar +mendés +mendic +mendicant +mendicantalha +mendicargh +mendicon +mendigaire +mendigol +mendre +mendrigol +mendrigolet +menejargh +menèl +menèl +menerbés +menestairal +menèstra +menestral +menestrièr +menet +menetar +mengana +menganós +meni +menièr +menimós +menimosament +menin +menon +menopausa +Menòrca +menorquin +menrabia +mens +mensdich +mensdicha +mensdicha +mensdiguèri +mensdirai +mensdire +mensdisent +mensdisi +mensdisiái +mensdita +menstruacion +menstrual +mensual +mensualizar +mensvalença +menta +mental +mentastre +menteire +mentida +mentidor +mentirh +mentonièra +mentre +mentretant +menudalhas +menudar +menudariá +menudet +menudièr +menudilhas +menuguet +menusa +menusar +menusariá +menusièr +menut +mequet +mequitge +mèr +meranda +meravelhar +meravilha +meravilhaire +meravilhar +meravilheta +meravilhós +meravilhosament +merça +mercadar +mercadial +mercadièr +mercand +mercandar +mercandejaire +mercandejargh +mercant +mercar +mercargh +merçargh +merçariá +mercat +mercé +mercejargh +mercés +mercièr +mercurial +merchand +mèrda +mèrdafèr +merdalha +merdalhon +merdalon +merdans +merdanson +merdassièr +merdausson +merdejargh +merendar +mergolhar +mèrgue +mèri +mericles +mericocargh +merilhon +merinjana +merit +meritant +meritar +meriti +meritós +merlada +merlata +merlatar +merlaton +mèrle +merlet +merletar +merlhe +merlièira +merlotar +merlotèri +merlòtic +merluç +merluça +merluçaire +merluçat +merlucièr +mermada +mermament +mermar +merme +mermelha +merulhar +mes +mesa +mesacòrdi +mesada +mesadièr +mesal +mesaliança +mesaliarazh +mesarribar +mescap +mescàs +mescla +mesclada +mescladament +mescladís +mescladura +mesclaire +mesclanha +mesclar +mesclatge +mescle +mesclejargh +mesclum +mescomptar +mescompte +mesconeguda +mesconeguèri +mesconegut +mesconeissent +mesconéisser +mesconeisserai +mesconeissi +mesconeissiái +mesconneissença +mesconoguda +mesconoguèri +mesconogut +mesconoissent +mesconóisser +mesconoisserai +mesconoissi +mesconoissiái +mescòrdi +mescreguda +mescreguèri +mescregut +mescreirai +mescreire +mescresença +mescresent +mescresent +mescresi +mescresiái +mescuda +mescuja +mescut +mesdich +mesdicha +mesdiguèri +mesdirai +mesdire +mesdisi +mesdisiái +meseion +mesèl +meselariá +meses +mesestima +mesestimar +mesfach +mesfaire +mesfait +mesfar +mesfisança +mesfisant +mesfisar +mesgarda +mesina +mesinièra +mesola +mesolh +mesolha +mesolhós +mesolós +mesparlar +mespla +mesplièr +mespola +mespolièr +mesprendrai +mesprene +mesprenguèri +mespreni +mespreniái +mesprés +mespresa +mespresa +mespresable +mespresadament +mespresador +mespresaire +mespresant +mespresar +mespresent +mespresèri +mesprèsic +mespresiu +mespresívol +mespresós +mesprètz +mesquèri +mesquin +mesquinament +mesquinariá +mesquinatge +mesquinejargh +mesquinetat +messa +messar +messatge +messatgièr +messatjariá +messeguièr +messenc +messièr +messin +Messina +messorga +messòrga +messorguièr +messorguièra +mestièr +mestieral +mestís +mestiva +mestratge +mèstre +mestreg +mestrejaire +mestrejargh +mestressa +mestriá +mestritge +mestron +mestura +mesura +mesurable +mesuradament +mesuraire +mesurança +mesurar +mesuratge +mesuret +mesurièr +meta +metable +metabolisme +metafisica +metaforar +metaforèri +metafòric +metal +metalhon +metallic +metallurgia +metallurgic +metamorfosar +metamorfosejargh +metamorfosèri +metamorfòsic +meteire +meteis +meteissa +meteissas +meteisses +metement +meteorològ +meteorologia +meteorologic +meteorologica +mètge +metjar +metòda +metòde +metodic +meton +metonar +metrar +mètre +metre +metrèri +mètric +Mètz +metze +meu +meuca +meuna +meva +Mexic +mexican +mi +miá +mians +miata +miau +miaulada +miauladís +miaular +miaulatge +miaunar +mica +micalha +micalhar +micargh +micarèla +micassièr +micocola +micocolièr +micòla +micoqueta +microanalisi +microbiologia +micrografia +Micronesia +micronesian +microscòpi +microscopia +microsòma +micut +micha +michon +michor +mièg +miegièr +miègjorn +miègjornada +miègjornal +miègjornenc +mièja +miejaire +mièjaluna +mièjament +mièjanuèch +miejariá +mièjas +mièlhs +mieu +mieule +mieuna +mieva +mifa +mifada +mifaire +mifalh +mifar +mifaudèl +mifla +miflar +miflut +migon +migracion +migrana +migrar +migrós +mil +mila +milaflòris +milafuèlhas +Milan +milandre +milanés +milanés +milanta +milantassa +milen +milen +milesme +milgrana +milgranièr +milh +milhada +milhard +milharga +milhàs +milhason +milhassada +milhassièr +milhavés +milhièr +milhièra +milhierat +milhòc +milhòca +milhon +milhonari +miliard +miliasssa +milièr +milierat +milion +milionari +milionària +militant +militantisme +militantisme +militar +militarisar +militarizar +milocoton +mimar +mimarèla +min +mina +minable +minaire +minal +minar +minàs +mineral +minerala +mineralisar +mineralizar +mineralogia +mineralogic +minet +minga +mingana +mingarèl +mingon +mingra +mingrar +minhard +minharda +minhardament +minhardatge +minhardejargh +minhardós +minhòt +minhotar +minhotariá +minhotèri +minhòtic +miniatura +miniaturizacion +miniaturizar +minièr +minièra +minim +minima +minimal +minimala +minime +minimom +minimós +minimum +ministèri +ministerial +ministre +minitèl +minon +minonada +minonar +minoritari +minoritària +minoritat +minorizar +minós +minòt +minotariá +minotièr +minsa +minsonja +minucia +minuscul +minuscula +minuta +minutar +mioblaste +miocardi +miocardi +miofribrilla +miòl +miòp +miòpa +miòpes +mirable +miracle +miraclejargh +miraclós +miraclosament +miracocargh +miraculós +mirada +mirador +miraire +miralh +miralhar +miralhat +miralhejargh +miralhet +miralhièr +miralhòla +mirament +miranda +mirar +miratge +miravelhar +miravilha +mirca +mirga +mirgalhadís +mirgalhadura +mirgalhar +mirgalhejargh +mirgalhon +mirgassa +mirgaud +mirgola +miriapòde +miricocargh +miroflet +mirondèl +mirra +mirta +misantròp +misantròpa +miscaròla +miscòpa +miserablament +miserable +misèria +misericòrdia +misericordiós +misogin +misogina +missal +missara +missard +misset +missil +missile +mission +missionari +missionària +Mississipí +missorelha +miste +mistèri +misteriós +misteriosa +misteriosament +mistic +mistificacion +mistificargh +mistofla +mistoflet +mistòia +mistonar +mistós +mistosament +mistral +mistralenc +mita +mitadar +mitadenc +mitadièr +mitan +mitanar +mitanenc +mitanièr +mitans +mitat +mite +mitocondria +mitocondrial +mitocondrial +mitologia +mitologic +mitoman +mitomania +miton +mitonar +mitonejargh +mitòsi +mitotic +mitra +mitralha +mitralhaira +mitralhar +mitralheta +mitralhièra +mitrar +mixte +mixtura +mobil +mobila +mobiliari +mobiliària +mobilisacion +mobilisar +mobilitat +mobilizacion +mobilizar +moblar +mòble +moblèri +mòblic +moc +mocada +mocador +mocadorat +mocadura +mocaire +mocal +mocalhon +Moçambic +moçambican +moçambiqués +mocanàs +mocandièr +mocargh +mocarèla +mocariá +mocidar +mocion +mocon +mocha +mochacho +mochal +mochar +mocharnon +mochau +mocheta +mochifarra +mochil +mòda +modal +modalitat +mòde +mode +modèl +modelar +modelèri +modèlic +modèm +moderacion +moderaire +moderar +moderèri +modèric +modèrn +modèrne +modernitat +modernizacion +modernizar +modèst +modèsta +modestia +modic +modificabla +modificable +modificacion +modificador +modificaira +modificaire +modificargh +modilh +modilhar +modista +modolon +modorre +modòu +modre +modul +modulable +modulacion +modular +moerrar +mofa +mofar +mofiarazh +mofidadura +mofidar +mofidor +mofidós +mofil +mofinar +moflàs +mofle +moflejargh +moflet +moflut +mofut +mogargh +moge +mogetar +moguda +moguèri +mòi +mois +moissa +moissa +moissal +moissalina +moissalinada +moissalós +moissalum +moisse +moissèla +moisselaire +moisselar +moisselejargh +moisselèri +moissèlic +moisselièr +moisselum +moissena +moisses +moisset +moisson +mojòl +mòl +mòla +molada +molador +moladura +molaic +molaiga +molaire +mòlament +molandrejargh +molar +molardós +molastrós +moldau +Moldàvia +mòldre +moldura +moldurar +molecula +molecular +moleculara +moleda +moledàs +moledós +molegargh +molegós +moleire +molejargh +molena +molenenc +molent +mòler +molergue +molèri +molesa +molesan +molestar +molestèri +molèstic +molet +moleta +molguda +molguèri +molgut +mòlh +molhadós +molhadura +molhar +molhas +molhàs +molhatge +molhèr +molhet +molheta +molhós +molhuc +mòlic +mòli +moliái +molicós +molièira +molièr +molierós +moligàs +moligós +molin +molina +molinaire +molinar +molinassa +molinatge +molinejargh +molinet +molinièr +molisan +Molise +molon +molonada +molrai +mòlre +molt +mòlta +molusc +molza +molzar +molzeire +mólzer +molzerai +molzèri +molzi +molziái +molzina +molzoira +molzuda +moment +momia +momon +mon +mona +monaca +monar +monarca +monarcargh +monard +monarquejargh +monarquia +monarquista +monarquista +monassa +monassariá +monastèri +monastic +monastièr +mond +mondada +mondador +mondaduras +mondaire +mondan +mondar +mondatge +mondial +mondiala +mondializacion +mondin +mondinet +monèca +moneda +monedaire +monedar +monedariá +monedatge +monedièr +monegasc +monet +monge +monget +mongeta +mongetièra +mongiá +mongièra +mongilh +mongòl +Mongolia +monha +monhada +monhar +monharra +monhe +monhon +monifla +monilh +monin +moninada +moninariá +moninejargh +monjarassa +monjassa +monografia +monòmi +monoploïda +monoploïde +monopòli +monopolisar +monopolizar +monotòn +monotòne +monsen +monsénher +Monsenhor +monsenhor +monstre +monstrilhon +mont +monta +montada +montador +montairon +montanha +montanhar +montanhard +montanhenc +montanhièr +montanhòl +montanhós +montant +montar +montaruc +montatge +montèl +Monteleimar +montenegrin +Montenegro +montilha +montjòia +Montpelhièr +montpelhierenc +montpelhierenc +Montréal +montura +monument +moquet +moquetar +moral +moralament +moralitat +moralizar +morar +morastèl +morat +moratòri +morbosa +morca +morda +mordada +mordàfias +mordal +mordas +mordassada +mordassar +mordassas +mordassejargh +mordedura +mordeire +mordejargh +mordement +mordent +mordent +mordèri +mòrdi +mordiái +mordicha +mordidura +mordirh +mordissal +mordrai +mòrdre +morduda +morduda +mordut +more +morèl +morena +morenar +morent +morèri +moresc +morescat +morfiar +morfidar +morfièri +mórfiic +morfinhar +morfondreh +morga +morgalha +morgar +morgue +mòric +mòria +moriá +morilha +moriment +morina +morir +moriscaud +morison +morlaco +morlar +morlec +morlecada +morlecargh +morlevada +morlevar +morlevèri +morlèvic +mormochar +mormolh +mormolhadís +mormolhaire +mormolhant +mormolhièira +mornarós +mòrne +mornifla +morniflar +morol +morolessa +morós +morrada +morral +morralh +morralha +morralhada +morralhar +morralhon +morranchon +morràs +mòrre +morre +morrejada +morrejament +morrejargh +morrèl +morrelon +morret +morrilhon +morron +morrut +mors +mòrs +mòrsa +morsaire +morsal +morsar +morsèl +morselar +morselèri +morsèlic +morsèri +mòrsic +morsilh +morsilhar +morsura +mòrt +mòrta +mortairòl +mortaisa +mortaisar +mortal +mortalament +mortalatge +mortalenc +mortalha +mortaula +mortièr +mortificargh +mortinèl +mortirh +morton +mortuari +morven +morvenada +morvís +mos +mos +mosca +moscada +moscairòla +moscal +moscal +moscalh +moscalha +moscalhada +moscalhaire +moscalhar +moscalhat +moscalhon +moscalhum +moscargh +moscarèla +moscarós +moscassejargh +moscatièr +moscolar +moscolonar +Moscòu +moscovita +moselós +mosena +mosenejargh +mosidura +mosil +mosilhador +mosilhar +mosirh +mosquèa +mosquejargh +mosquèla +mosquet +mosqueta +mosquetada +mosquetadura +mosquetaire +mosquetar +mosquetariá +mosquetièira +mosquièr +mosquilh +mossa +mossada +mossaire +mossairon +mossar +mossard +mossec +mossèc +mossegada +mossegadura +mossegaire +mossegargh +mossejargh +mòssi +mossièr +mossigargh +mossilhadura +mossilhar +mossilhatge +mossilhon +mossolina +most +mostacha +mostachal +mostachar +mostachon +mostachut +mostada +mostadoira +mostar +mostarda +mostardariá +mostardenc +mostardièr +moste +mostejargh +mostèl +mostelat +mostièr +mostilhar +mostin +mostinar +mostinós +mostirh +mostor +mostós +mòstra +mostraire +mostrar +mostre +mostre +mostrèri +mòstric +mostrós +mot +motada +motal +motard +motassa +motassar +motejargh +motent +motiflau +motirh +motiu +motivacion +motivar +motjargh +motlador +motladura +motlage +motlaire +motlar +mòtle +motlèri +mòtlic +motò +moton +motonada +motonalha +motonar +motonàs +motonet +motonièr +motonina +motor +motorisar +motorizar +motòs +motós +motosa +motut +mòudre +mourai +mòure +mòuta +movedís +movement +movent +mòvi +moviái +muc +mucosa +mucositat +muda +mudable +mudacion +mudada +mudadís +mudament +mudança +mudar +mudason +mudejargh +múger +mugiment +mugirh +muguet +muguetòla +muishar +mujol +mujòl +mul +mulassa +mulassièra +mulastre +mulatalha +mulatièr +mulejargh +mulet +mulhar +Mülhausen +Mulhouse +multa +multar +multicellular +multicellulara +multicultural +multilinguisme +multilingüisme +multimedià +multimèdia +multinacional +multipla +multiple +multiplicargh +multitud +Munic +municipal +municipala +municipalitat +muniqués +munirh +muòl +muolat +mur +murada +muralha +muralhar +muralhièr +murar +Múrcia +murcian +mureta +murga +murgueta +murmurar +murra +mursa +murtre +murtrejargh +murtrièr +murtrirh +mus +musairàs +musaire +musairejargh +musar +musard +musatge +musc +muscada +muscadèl +muscadièr +muscadin +muscargh +muscardin +muscardina +muscat +musclar +muscle +musclièra +musèl +muselar +muselèri +musèlic +muselièra +museta +musèu +musèu +musica +musicadís +musicaire +musical +musicargh +musician +musiquejargh +musiquièr +musiu +musquet +musquetar +mussa +mussenca +musulman +mut +mutacion +mutagèna +mutagène +mutant +mutanta +mutar +mutilar +mutinar +mutualisme +MySQL +n'activar +n'an +n'anar +n'anèt +n'aver +n'aver +na +nabeta +nabièra +nabina +nabís +nabissa +nacarat +nacèla +nacion +nacional +nacionala +nacionalisar +nacionalista +nacionalitat +nacionalizacion +nacionalizar +nacrat +nacre +nada +nadada +nadador +nadaire +nadal +nadalenc +nadalet +nadar +nadarèla +nadatge +nadèla +nadilhar +nadiu +nadon +naduèlh +naduòlh +nafa +nafra +nafradura +naframent +nafrar +nafta +nagaire +nairat +Nairòbi +naisar +naissedura +naissença +naissent +nàisser +naisserai +naissi +naissiái +Namibia +namibian +nan +nancean +Nancí +nanet +Nanquin +Nantas +nantés +nantora +nap +napolitan +Nàpols +Narbona +narbonés +narcís +narcotic +narcotica +narma +narra +narrada +narrar +narrejaire +narrejargh +narreta +nàrria +narridar +narrilha +narrut +narsa +narsèrp +narsós +nas +nasada +nasal +nasalha +nasalisar +nasalizar +nasard +nasat +nasejaire +nasejargh +nasic +nasicada +nasicargh +nasilhaire +nasilhar +nasquèri +nassa +nassona +nat +nata +natièr +natiu +natre +natulhar +natura +natural +naturalisar +naturalizar +nau +nauc +nauca +nauça +naucada +nauçapè +nauçargh +nauçural +nauchièr +naufragargh +naufragi +naufragièr +naulagi +naular +naulatge +naulejargh +nauquelha +nauquet +Nauru +nausa +naut +naut +nauta +nautàs +nautor +nautre +Navarra +Navarra +navarrenc +navarrenc +navarrés +navarrin +navenc +naveta +navetar +navigacion +navigador +navigargh +naviòl +naviri +ne +ne'n +ne'n +nèbla +nebladís +nebladura +neblalha +neblar +neblarés +neblatge +neblèri +nèblic +neblós +neblum +neboda +nebodalha +nebodet +nebot +nèc +nèça +necar +necar +necarai +necavi +necessari +necessària +necessitat +nèci +neciament +neciard +neciardariá +neciàs +neciejada +neciejargh +necièra +necierós +necior +necitge +necitjada +nedanés +neerlandés +nefasta +negable +negada +negadís +negador +negar +negar +negarai +negatge +negatiu +negavi +neglegirh +negligéncia +negligent +negligentament +negligirh +negòci +negociable +negociacion +negociant +negociar +negociarai +negociavi +negociejargh +negociem +negocièri +negocietz +negòcii +negre +negrejargh +negreput +negresirh +negret +negretat +negrilhon +negrilhós +negriment +negrinèl +negrirh +negron +negror +negrós +negrotin +negrulh +negrum +negrura +neguem +neguèri +neguetz +nègui +nelha +nèn +nenèia +nenet +nenia +nenon +neocaledonian +neodarwinisme +neozelandés +nèp +Nepal +nepalés +neperian +nequem +nequèri +nequetz +nèqui +nèr +nerilhons +nertejargh +nèrvi +nervin +nerviós +nerviosament +nerviut +nervosenc +nervositat +nervura +nesciejargh +nesièr +nèspla +nesplièr +nespolièr +net +netament +netejada +netejadissa +netejaire +netejargh +netejatge +netetat +netitge +nèu +nèufa +nèula +neulièr +neuroblaste +neurologia +neuròna +neutralisar +neutralizar +neutre +neutrofila +neutrofile +nevada +nevadís +nevairàs +nevairat +nevalhar +nevar +nevàs +nevassada +nevassar +nevassós +nevatada +nevatejargh +neveja +nevejargh +nevenc +nevèri +nèvic +nevièr +nevilhada +neviòla +nevós +nhac +nhacargh +nhafrar +nhargargh +ni +niarga +niargasson +nibla +niblatós +nible +Nicaragua +Nicaragüa +nicaraguenc +nicaragüenc +niçard +nicolejargh +nicon +Nicosia +nichola +nièira +nièla +nielada +nielar +nielèri +nièlic +nièra +nierada +nieram +nieratge +nierèla +nieret +nieron +nierós +nierum +nifara +nifla +niflal +niflar +niflard +niflàs +niflejargh +nigaudejargh +Nigèr +Nigèria +nigerian +nigerin +Nil +nilhada +nilhar +nilotic +nimai +nimai +Nimes +nimfa +nimfèia +nin +ninar +ninarèl +ninèia +ninet +nineta +ninfa +ninòi +ninòia +ninòt +nipar +nipon +niquetar +nis +nisada +nisador +nisaire +nisairòl +nisalièr +nisar +nisejargh +nises +niset +nisola +nison +nissa +Nissan +nisses +nissolons +nistar +nistassejaire +nistassejargh +nistejaire +nistejargh +niston +nistós +nitrat +nitrificacion +nitrificargh +niu +niva +nivatge +nivèl +nivelaire +nivelament +nivelar +nivelatge +nivelèri +nivèlic +nívol +nivola +nivolada +nivolam +nivolar +nivolàs +nivolejargh +nivoleta +nivolina +nivolós +nivolum +nivós +noalha +noarzah +noblalha +nòblament +nòble +noblesa +noblilhon +nobusta +nòça +nocejaire +nocejargh +nocion +nòda +noetar +noga +nogairòla +nogalh +nogalhar +nogalhon +nogareda +nogaret +nogat +nogatièr +noguda +noguèri +noguièr +nogut +noirai +nòire +noiriç +noiriça +noiricièr +noiriçon +noirida +noiridor +noiridura +noirigal +noirigat +noirigatge +noiriguièr +noirim +noiriment +noirirh +noirissent +noirit +nòisa +nolença +nolent +nolent +nolenta +nòler +nolguda +nolguèri +nolgut +nòli +noliái +nolrai +nòlre +nom +nombrable +nombrar +nombre +nombrós +nomenar +nomençargh +nomentar +nominar +nommar +non +nòna +nonanta +noncalença +noncalent +nonci +nonciar +noncièri +nónciic +nondegun +nonent +nonpacient +nonparièr +nonrés +nonsen +nonvalor +nonvolença +nòra +nòrd +nòrd-american +nòrd-corean +nòrd-irlandés +nordic +nòrma +normal +normala +normalisar +normalizar +normand +Normandia +Norvègia +norvegian +nos +nos +nosada +nosador +nosadura +nosar +nosard +nosàs +nosassa +nosau +nosautras +nosautres +nose +nòse +noselament +noselar +noselèri +nosèlic +noselut +nosement +nosent +nòser +noseta +nosetar +nòsi +nosiái +nosible +nosièr +nosilha +nosilhon +nostalgic +nòstre +nòta +notablament +notable +notar +notari +notària +notarial +notariat +notèri +nòtic +notícia +notificargh +notòri +notz +nòu +nòu +nova +nòva +nòvayorkés +novèl +novelaire +novèlament +novelari +novelejargh +novelet +noveletat +novelum +novembre +noven +novetat +nòvi +noviada +novial +novialament +noviat +noviatge +noviau +nuançargh +nuca +nuclear +nucleara +nucleoïde +nucleòl +nuclèu +nud +nudament +nudet +nuditat +nuèch +nuechada +nuechejargh +nuechenc +nuechòla +nuechorlar +nueisa +nuèit +nueitada +nueitenc +nujargh +nul +nulla +nullament +nullitat +numeracion +numerador +numeral +numerari +numeric +numericament +numerisar +numerizar +numèro +numerò +numeròs +numerotacion +numerotar +numerotèri +numeròtic +numismatic +nuòch +nuòchs +Nurembèrg +nus +nusa +nutricion +nutritiu +o +ò +oasis +obediéncia +obeïda +obeïri +obeïssent +obeït +obeliscs +obèrt +oberta +obertura +obès +obèsa +obesiri +obesissença +obesissent +obesissenta +obesit +obesitat +òbit +objeccion +objectarb +objectat +objècte +objectèrid +objèctic +objectiu +objectiva +objectivitat +oblic +oblica +oblicament +oblicarg +oblicat +oblidaire +oblidança +oblidara +oblidat +oblidós +oblidosa +oblidosament +obligacion +obligança +obligant +obligantament +obligarg +obligat +obligat +obligatòri +obligatòria +obliquitat +oblit +obliteracion +oblong +oblonga +obòl +òbra +obrabla +obrable +obrador +obral +obrant +obrarb +obrat +obratge +obratjarg +obratjat +obrejarg +obrejat +obrèrid +obreta +òbric +obrièr +obrièra +obrieralha +obriment +obriri +obrissent +obscèn +obscèna +obscènes +obscenitat +obsediri +obsedit +obséquias +obsèquias +obsequiós +obsequiosa +obsequiosament +obsequiositat +obsequis +obsèquis +observabla +observable +observacion +observança +observància +observarb +observat +observator +observatòri +observatritz +observèrid +obsèrvic +obsession +obsessional +obsessiu +obsessiva +obsidiana +obsolèt +obsolèta +obstacle +obstetrica +obstetrician +obstetriciana +obstinacion +obstruccion +obstruirh +obtencion +obtendraix +obtenent +obténer +obtenguda +obtenguèriw +obtengut +obteniu +obteniáiv +obtenir +obtenit +obturacion +obturara +obturat +obtús +obtusa +obtuses +obúsl +obviarza +obviat +òc-ben +òc-plan +òc +òca +ocarina +ocasion +ocasional +ocasionala +ocasionalament +ocasionara +ocasionat +occident +occiput +occitan +occitan +occitana +occitana +occitanejarg +occitanejat +occitanenc +occitanenca +occitània +occitània +occitanisara +occitanisat +occitanismel +occitanista +occitanizara +occitanizat +occitanofòna +occitanofòne +occitendal +occuréncia +occurenta +ocean +Oceania +oceanian +oceaniana +oceanic +oceanica +oceanografia +oceanologia +òci +ociós +ociosa +ociositat +òcra +octaèdre +octava +octòbre +octòbre +octobre +octòbre +octogòne +ocult +oculta +ocupacion +ocupant +ocupanta +ocupara +ocupat +ocupatiu +ocupativa +ocurréncia +ocurrent +òcha +ochanta +ochava +ochen +òda +òdi +òdia +odiós +odiosa +odiosament +odor +odorament +odorant +odoranta +odorara +odorat +odorat +odorenc +odorenca +odorós +odorosa +oelha +oelhièr +oèst +ofegarg +ofegat +ofensa +ofensaire +ofensant +ofensanta +ofensara +ofensat +ofensiu +ofensiva +ofensor +ofèrt +ofèrta +ofèrta +ofertòri +ofici +oficial +oficiala +oficialament +oficialisara +oficialisat +oficialitat +oficializara +oficializat +oficiant +oficiarb +oficiat +oficièr +oficièrid +ofíciic +oficina +oficiós +oficiosa +oficiosament +ofrenda +ofriri +ofrissent +oftalmia +oftalmologia +oftamològ +oftamològa +ofuscarg +ofuscat +Oganda +ogandés +ogandese +ogiva +ogival +ogivala +OGM +oilha +oirara +oirat +oire +òisa +oissa +oitanta +oiva +ola +olada +olaire +Olanda +olandara +olandat +olandés +olandés +olandesa +olent +olenta +oleta +òlfa +olfada +olfiar +olfiar +olfiat +olfièra +olfièri +òlfii +òlga +olhar +olhar +olharb +olharai +olhat +olhavi +olhem +olhèrid +olhèri +olhetz +òlhic +olhòl +òli +oliaire +oliar +oliar +òlias +oliat +olièr +olièra +olièri +olifant +oligoelement +òlii +Olimpiada +olimpic +olimpica +olimpisme +oliós +oliosa +oliu +oliva +olivada +olivadura +olivara +olivastra +olivastre +olivat +olivatge +oliveda +oliveireda +olivejarg +olivejat +oliveta +olivièr +olivièra +olm +olmada +olmat +olmeda +olmes +olmièra +olor +olorajat +olorejarg +oludara +oludat +òlva +òlze +òm +Oman +omanita +ombra +ombrada +ombrara +ombrassa +ombrat +ombratge +ombratjarg +ombratjat +ombratjós +ombratjosa +ombrejarg +ombrejat +ombrenc +ombreta +ombrièra +ombrilha +ombrilhada +ombrilhat +ombrina +ombriu +ombriva +ombrivol +ombrivola +ombrun +OMC +òme +omega +omenàs +omenatge +omenèl +omenenc +omenenca +omenet +omeniri +omenit +omenon +omicida +omicidi +omission +omnibús +omnipoténcia +omnipotent +omnipotenta +omnipreséncia +omnipresent +omnipresenta +omnivòr +omnivòra +omnivòres +omofòn +omofòna +omofòne +omogenèa +omogeneïsara +omogeneïsat +omogeneïtat +omogeneïzara +omogeneïzat +omogenèu +omogenèus +omograf +omografa +omografe +omològ +omològa +omologacion +omologargh +omològue +omonim +omonima +omonime +omonimia +omoplata +omosexual +omosexuala +omosexualitat +omotetia +omozigòte +onça +oncejarg +oncejat +oncion +oncle +onch +oncha +oncha +onchadura +onchara +onchat +onchós +onchosa +onchum +onchura +onda +ondada +ondejament +ondejant +ondejanta +ondejarg +ondejat +ondenc +ondenca +ondencament +ondés +ondina +ondós +ondosa +ondradura +ondrara +ondrat +ondrejarg +ondrejat +onerós +onèst +onèsta +onèstament +onestat +onestetat +ONG +ONG +ongan +onganassas +ónger +ongit +ongla +onglada +onglejarg +onglejat +onglet +onglon +ongluda +onglut +ongrés +ongrés +ongresa +ongresa +Ongria +Ongria +onguèriw +onguligrada +onguligrade +onhedura +onheire +onhement +onhent +ónher +onheraix +onhiu +onhiáiv +onhuda +oniric +onirica +onirisme +oniromancia +onix +onomastic +onomastica +onomatopèa +onor +onorabilitat +onorabla +onorablament +onorable +onorança +onorara +onorari +onorària +onorat +onorific +ont +onta +ontabla +ontable +ontejarg +ontejat +ontós +ontosa +ontosament +onze +onzen +onzena +oogenèsi +opac +opaca +opacificarg +opacificat +opacitat +opal +opalescent +opalescenta +opausaira +opausaire +opausant +opausara +opausat +opcion +opcion +operacion +operador +operairitz +operator +operatritz +òpi +opiacèa +opiacèu +opinion +oportun +oportuna +oportunisme +oportunista +oportunitat +oposicion +oprémer +opremiri +opremit +oprimar +oprimat +oprimiri +oprimit +opròbri +òps +optic +optica +optimizar +òr +ora +orada +orador +oral +orala +oralament +Oran +orange +orari +orària +orason +orator +oratritz +òrb +òrba +orbet +orbita +orcèl +òrd +òrda +ordejarg +ordejat +ordenador +ordenaire +ordenara +ordenat +ordesons +òrdi +ordiada +ordiat +ordical +ordilha +ordilhara +ordilhat +ordiment +ordinacion +ordinari +ordinària +ordinàriament +ordiri +ordit +ordonança +ordonançarg +ordonançat +ordòu +ordre +òrdre +ordura +oreirarbr +oreirat +orèl +orelarb +orelat +orelèrid +orèlic +orèmus +orens +orensa +oret +oreta +oretara +oretat +orfanèl +orfanèla +òrfe +organ +organdi +organic +organica +organigrama +organisacion +organisara +organisat +organisator +organisme +organista +organizacion +organizara +organizat +organizator +organogenèsi +orguèlh +orguena +orgueneta +orguiòla +orgulh +orgulhança +orgulhós +orgulhosa +orgulhosament +orieirar +Orient +Orient +orient +orientacion +oriental +orientala +orientara +orientat +orièra +orierarb +orierat +orierèrid +orièric +orifici +origan +origina +original +originala +originalitat +orisont +orizont +orizontal +orizontala +orizontalament +orizontalitat +orjat +orjau +orjòl +orjolada +orjolarb +orjolat +orjolèrid +orjolet +orjòlic +orladura +orlarb +orlat +òrle +orleanés +orleanesa +Orleans +orlèrid +òrlic +orma +ormejarg +ormejat +ormèl +ormenada +ormenat +ormeràs +ormeu +ormièra +ormilha +ormòna +orna +ornament +ornara +ornat +ornatiu +ornativa +ornhara +ornhat +ornièra +oronge +orquestra +orquestra +orquèstra +orquestracion +orquestracion +orquestral +orquestral +orquestrala +orquestrala +orquet +orquidacèas +orquís +òrra +òrrament +òrre +orrejarg +orrejat +orresara +orresat +orresiá +orretat +orriar +orriar +orriat +orriblament +orrible +orrièri +òrrii +orripilara +orripilat +orriri +orrit +orrit +orror +orrós +ors +orsa +òrsa +orsalhon +orsarb +orsat +orsatièr +orsèrid +orsets +òrsic +orsièr +orsin +orsinàs +orson +òrt +ortada +ortalan +ortalatge +ortalécia +ortalha +ortalièr +ortalís +ortalissa +ortencl +ortencal +orteta +ortic +ortiga +ortigada +ortigana +ortigarg +ortigassa +ortigat +ortigon +ortocentre +ortogonal +ortogonala +ortogonalitat +ortografiarza +ortografiat +ortografic +ortografica +ortolan +ortolejarg +ortolejat +ortonormal +ortonormala +òs +Òsca +òsca +oscar +oscar +oscaraix +oscat +oscavif +oscillacion +oscillara +oscillat +oscultara +oscultat +Òslo +osmòsi +osquem +osquèriw +osquetz +òsquie +ossalha +ossament +ossamenta +ossarb +ossat +ossèrid +osset +òssic +ossilhon +ossós +ossosa +ossuda +ossut +òst +ostal +ostal +ostalada +ostaladon +ostalamenta +ostalariá +ostalàs +ostalièr +ostalon +ostarb +ostarda +ostat +ostatge +òste +osteïna +ostensibla +ostensible +ostèrid +ostessa +òstic +ostia +ostil +ostila +ostilitat +ostracisme +ostreïcultor +ostreïcultritz +ostreïcultura +otaria +otramar +otramarin +otrança +otratge +otratjarg +otratjat +otratjós +otratjosa +ovada +oval +ovala +ovalara +ovalat +ovarb +ovat +ovèrid +òvic +ovièra +ovipar +ovipara +ovocita +ovocite +ovogenèsi +ovovivipara +ovovivipare +ovul +oxidara +oxidat +oxigèn +oxigenarb +oxigenat +oxigenèrid +oxigènic +ozbèc +ozbèca +Ozbequistan +pabalhon +pabol +paca +pacan +pacanariá +pacandalha +pacandejargh +pacanejargh +pacanilha +pacarandejargh +pacarejargh +paciença +paciéncia +pacient +pacientament +pacientar +pacientós +pacific +pacolet +pacotilha +pacotilhaire +pacotilhar +pacre +pacha +pachac +pachacaire +pachacargh +pachaquejargh +pachaquièr +pachar +pachejaire +pachejargh +pachejatge +pachicargh +pachinar +pachinchin +pachòc +pachocaire +pachocar +pachocar +pachocarai +pachocariá +pachocavi +pachòla +pacholhar +pachonaira +pachoquejaire +pachoquejargh +pachoquem +pachoquèri +pachoquet +pachoquetz +pachòqui +pade +padèla +padelada +padelejargh +padelon +padena +padenada +padenar +padenat +padenejargh +Pàdoa +padoan +padoenc +padoïrh +padon +paga +pagable +pagadís +pagador +pagaficargh +pagaire +pagaleugièr +pagament +pagan +pagant +pagargh +pagason +page +pagèla +pagelar +pagelèri +pagèlic +pagés +pagesiá +pagina +paginacion +paginar +pairal +pairar +pairastre +paire +paireblanc +pairegrand +pairejargh +pairenal +pairin +pairinejargh +pairòl +pairolada +pairolariá +pairolat +pairolejargh +pairolièr +pairon +paironar +pairugal +país +pais +paisan +païsan +païsanalha +paisanejargh +païsanilha +païsatge +païsatge +païsbassòl +paises +païses +paissejaire +paissejargh +paissèl +paisselaire +paisselar +paisselatge +paisselèri +paissèlic +paisselièra +paissença +paissent +pàisser +paisserai +paisseron +païsses +paissi +paissièra +paissierada +paissii +pal +pala +palabès +palabessada +palabessaire +palabessar +palabessèri +palabèssic +palada +paladaire +paladar +paladejargh +palador +palaficargh +palaficat +palafré +palafrenièr +palagrilh +palagrilhaire +palagrilhar +palaiga +palaire +palais +palaisar +palaissar +palaissòt +palalam +palamalh +palamardièr +palamèla +palanc +palanca +palancadoira +palancargh +palancon +palandra +palandrejargh +palangrar +palangre +palangrièr +palanquejargh +palar +palarissa +palason +palassa +palasson +palastracha +palastre +palatge +palatrar +palatz +palaversar +palaversèri +palavèrsic +palavirar +palejada +palejaira +palejargh +palenc +palenca +palencada +palencargh +Palèrme +palermitan +Palestina +Palestina +palestinian +palet +paleta +palfèr +palficargh +palha +palhada +palhar +palharada +palhard +palhardament +palhardar +palhardariá +palharga +palharissa +palharquejargh +palhàs +palhassa +palhassada +palhassalhièr +palhasseta +palhassièra +palhasson +palhassonat +palheiròla +palhejaira +palhejargh +palhenc +palhet +palhièira +palhieiron +palhòla +palholada +palholar +palholèri +palhòlic +palhon +palhonar +palhós +palhossàs +palhum +palhurgam +palhurgat +palhús +palhut +palica +palicargh +palièira +paligòt +palís +palisson +palissonar +palm +Palma +palmada +palmar +palmarès +palmat +palme +palmejargh +palmèla +palmesan +palmièr +palmola +palmolàs +palmolièr +palmon +palmonèla +palmonista +palnh +palntador +palomb +palombat +palombèla +palombièra +palon +palonaire +palonar +palòt +palotariá +palotejargh +palp +palpable +palpada +palpaire +palpament +palpar +palparimòtas +palpatin +palpejament +palpejargh +palpugargh +palpuquejargh +palput +palsemar +paltrada +paltre +palú +palun +palunalha +palunenc +palunós +palusèla +palusenc +palussa +palussada +palussar +palle +pallenga +pallevar +pallevèri +pallèvic +palliar +pallièri +pallifèc +pàlliic +pallinàs +pallinejargh +pallinèl +pallirh +pallitge +pallufèc +pampa +pampalhejaire +pampalhejargh +pampalheta +pampaligòssa +Pampalona +pampalonés +pamparruga +pamparrugueta +pampatge +pampe +pampejargh +pàmpol +pampola +pampolejargh +pampolha +pampós +pampre +pamput +pan +pana +panada +panadèla +panador +panairar +panaire +Panamà +panamenc +panar +panard +panardejargh +panardejat +panarditge +panarís +panat +panatièr +panatièra +panatòri +panauçargh +pança +pançada +pançargh +pançard +pancarta +pançarut +pancejargh +pancèl +panceta +pancièra +pancilh +pancosièr +pancossièr +panchòca +pandorèl +pandorga +panecar +panejargh +panèl +panelar +panelejargh +panelèri +panèlic +panet +pange +panhòta +panicaut +panièr +panièra +panieraire +panieràs +panierat +panlevar +panlevèri +panlèvic +panolh +panolhar +panolhós +panós +panotejargh +pansa +pansarilha +pansarilhar +panselar +panselèri +pansèlic +pansièra +panta +pantais +pantaisar +pantaissada +pantaissaire +pantaissar +pantaissèt +pantaissós +pantalha +pantejargh +pantena +pantés +pantièra +pantiga +pantimar +pantirh +pantofla +pantoflar +pantofleta +pàntol +panturla +panturlar +papà +papa +papach +papachada +papachat +papador +papagai +papaire +papal +papalard +papar +paparat +paparaunha +paparèl +papat +papeirassar +papeirejargh +papet +papeta +papiaire +papièr +papièra +papierat +papierejargh +papieret +papilhotar +papilhotèri +papilhòtic +papisme +papista +Papoa-Nòva +papòla +paponejargh +paquet +paqueta +paquetaire +paquetalha +paquetar +paquetejargh +paquetièr +paqueton +Paquistan +paquistanés +par +para-sòl +para-solelh +parabanda +parabandon +parabast +parabastada +parabastar +parabèla +parabelat +parabissar +parabòla +parabolic +parabolica +paracasuda +paracròta +parada +paradaire +paradar +paradís +paradisenc +parador +paradós +paradòxa +paradòxa +paradura +paraficha +parafòc +parafolhar +parafolhar +parafolharai +parafolhavi +parafolhem +parafolhèri +parafolhetz +parafrasejargh +parafuèlh +parafuèlhi +parafulhar +paragraf +paragraf +paragrafes +Paraguai +Paragüai +paraguaian +paragüaian +parai +parairar +paraire +parairiá +paralisar +parallèl +parallèla +parallèle +parallelepipède +parallelograma +parametratge +paramètre +paramijal +paranòia +parapluèja +parapluejaire +parar +parasit +parasita +parasite +parasitisme +parasolar +parasolèri +parasòlic +paratge +paratroneire +paratrucs +paraula +paraular +paraulassa +paraulatge +paraulejargh +parauleta +paraulièr +paraulís +paraulós +paraulum +paravent +paravirar +parc +parçan +parcatge +parcèla +parcelatge +parcelièr +parcial +parcil +parda +pardós +paredada +paredaire +paredal +paredar +paredièr +paredon +pareguda +pareguèri +paregut +pareissent +paréisser +pareisserai +pareissi +pareissiái +parejargh +parelh +parelhat +parèli +parença +parent +parenta +parentalha +parentat +parentatge +parentèsi +parentilha +parentiu +pàrer +paret +paretalha +paretar +paretejargh +pareu +pargada +pargam +pargamèla +pargaminièr +pargantejargh +pargantèla +pargargh +pargassièr +pargue +parguial +pari +pària +parià +pariable +pariái +pariaire +pariança +pariar +pariatge +parièr +parièrament +parièri +parietal +pàriic +parion +parirh +Paris +parisenc +paritat +pariu +parivament +parlada +parladís +parladissa +parlador +parladura +parlaire +parlament +parlamentar +parlamentari +parlamentària +parlant +parlantin +parlara +parlar +parlariá +parlatge +parlatòri +parlejargh +parlementària +parleta +parlicada +parlièr +parlofejargh +parlòta +parlotejargh +parlufejargh +parlufièr +parlussejargh +parodiarzah +paroxisme +parpal +parpalha +parpalhejargh +parpalheta +parpalhòc +parpalhòl +parpalhòla +parpalholat +parpalholejargh +parpalhon +parpalhonar +parpalhonejargh +parpantèl +parpantelar +parpantelèri +parpantèlic +parpatiaud +parpèl +parpèl +parpèla +parpelejargh +parpelhar +parpelós +parquejargh +parquetar +parragada +parran +parrana +parranèla +parrascla +parrat +parrec +parricida +parricidi +parrimèlas +parroquet +parròquia +parroquial +parroquian +parroquièr +parrugada +parson +part +partan +partega +partegaire +partegargh +partejargh +partenari +partenària +partenariat +partença +partenogenèsi +particion +participacion +participant +participant +participar +particula +particular +particularament +particularitat +partida +partidament +partidari +partidària +partidas +partidor +partiment +partirh +partisan +partisan +partison +partit +partitiu +partitiu +partorirh +parucion +parvèl +parvendrai +parvenent +parvenguda +parvenguèri +parvengut +parveni +parveniái +parvenir +pas +pascada +pascajon +pascal +pascaleta +pascas +pascatge +pascatièr +pascatjargh +pascuda +pascut +pasiblament +pasible +pasible +pasiment +pasimentar +pasmens +paspabat +pasperdut +pasqueirarrh +pasquejargh +pasquèri +pasqueta +pasquieirar +pasquièr +pasquierar +pasquierèri +pasquièric +passa +passablament +passable +passacaval +passacordèla +passada +passadís +passador +passadreit +passagrola +passaire +passalís +passaman +passamantar +passamantariá +passamantièr +passament +passant +passapaïs +passapaïsses +passapòrt +passar +passard +passarèla +passarilhar +passarilhas +passaròsa +passat +passatemps +passatge +passatgièr +passatgièrament +passavant +passavelhada +passavelós +passaveta +passejada +passejaire +passejargh +pàsser +passera +passerada +passerat +passerata +passerièra +passerina +passeron +passeronalha +passeronièr +passidura +passièra +passion +passionala +passionar +passirh +passoira +past +pasta +pastada +pastador +pastaire +pastandièra +pastar +pastasinhòla +pastatge +pastèca +pastejargh +pastèl +pastèla +pastenaga +pastenaiga +pastenal +pastenc +pastengargh +pastequièr +pasterar +pasticargh +pastièra +pastierada +pastilha +pastingargh +pastís +pastissar +pastissariá +pastissejargh +pastissièr +pastisson +pastoira +pastolh +pastonar +pastor +pastora +pastoral +pastorejargh +pastorèl +pastorisar +pastorizar +pastrar +pastratge +pastre +pastrejargh +pastressa +pastrilha +pastrisson +pastura +pasturaire +pastural +pasturatge +pasturenc +pasturgargh +pasturguièr +pat +patac +patacada +patacadura +patacaire +patacargh +patacs +patacula +patacular +pataculèri +patacuolar +patacuòlic +patada +patafiolar +patafiòlic +pataflet +patafolièri +patais +patalafa +patalè +patalon +patament +patana +patanaire +patanièra +patanilhièra +patanon +patantèina +patantèra +pataplan +pataquejargh +patar +pataràs +patarassa +patarassar +patarassejargh +patarin +patarinalha +patarinejargh +pataròcas +patarut +patàs +patassa +patastèla +patatan +patatrac +pataud +pataudament +pataunhar +pataussada +pataussal +patavirar +patec +patejargh +patèla +patelada +patelon +patena +patent +patentable +patentar +patèr +patèrla +paterlut +paternejargh +paternièr +patèrnòstre +pateron +pateronejargh +patés +patesejargh +patet +pateta +patetament +patetariá +patetejaire +patetejargh +patetic +pati +patilha +patilhós +patiment +patin +patinar +patirh +patiràs +pàtis +patís +patissent +patna +patòla +patolar +patolèri +patolh +patolhar +patolhard +patolhariá +patolhièr +patolhós +patòlic +patologia +patologic +patolós +paton +patonejargh +patorlejargh +patós +patraca +patracalha +patracargh +patramand +patramandejargh +patrassejargh +patrat +patria +patrial +patrialament +patrici +patrician +patriciat +patricolaire +patricolar +patricolatge +patricolejargh +patricolèri +patricòlic +patrifassi +patrifassièr +patrimòni +patrimonial +patriòta +patrocinar +patrolh +patrolhar +patron +patronar +patronat +patronatge +patufard +patufejargh +patufèl +patufelar +patufelariá +patufelatge +patufelèri +patufèlic +patz +pauc +paucada +paucament +paucival +paucparla +paucum +paucvalièira +Paulo +pauma +paumassièr +paumenc +paupilh +pauquejargh +pauquet +pauquinada +paur +pauralha +paurament +paure +paurejargh +pauret +pauretat +paurièra +paurilha +paurinèl +pauritge +paurós +pauròt +pauruc +paurucargh +paurugament +paurugàs +paurum +pausa +pausada +pausadament +pausadís +pausadissa +pausador +pausar +pausatge +pauset +pauta +pautàs +pautassa +pautós +pautra +pautrada +pautridor +pautrirh +pautròla +pautut +pauvali +pava +pavaire +pavament +pavana +pavanar +pavar +pavat +pavatge +pavés +pavesada +pavesar +pavesièr +pàvia +Pàvia +pavièr +pavimentar +pavon +pavonar +pavonat +pavonejargh +pavòt +pè +pè +peatge +pèbatreh +pebrada +pebraire +pebram +pebrar +pebre +pebrejargh +pebriana +pebrièr +pebrin +pebrinada +pebron +pebrós +pebrot +pèc +peca +pèca +pèça +pecable +pecadilh +pecadilha +pecadís +pecador +pecaire +pecairitz +pecant +pecargh +peçar +peçarai +pecat +pecatàs +peçavi +pecejargh +pecem +pecèri +pecetz +pèci +pecic +pecigada +pecigaire +pecigargh +peciguet +pecilh +pecilha +pecilhar +pecol +pecòla +pecolar +pecolar +pecolat +pecolèri +pecolet +pecòlic +pecolós +pecolut +peçòta +pectinat +peçugargh +peculat +peculi +pecunh +pecunha +pecunhós +pechairàs +pecheirat +pechièr +pechugargh +pèda +pedaçargh +pedacejargh +pedaçon +pedaçum +pedagòg +pedagòg +pedagòga +pedagòga +pedagogia +pedagogia +pedagogic +pedala +pedanha +pedèl +pedofile +pedofilia +pedològ +pedològa +pedologia +pefon +pefonar +pefonariá +pega +pegadís +pegaire +pegairòla +pegal +pegalat +pègament +pegargh +pegarèla +pegàs +pegasson +pegatge +pegmatita +pegola +pegolièra +pegomàs +pegon +pegós +pegòt +pegotuènha +peguejargh +pegulhièra +peiladura +peilar +pèile +peilèri +pèilic +pèira +pèirabatreh +peirada +pèirafic +pèiraficaire +pèiraficargh +pèirafís +peiral +peirat +peiratèl +peiratge +peiregada +peiregal +peiregargh +peiregàs +peiregós +peireguièr +peirejargh +peirenc +peireta +peirièr +peirièra +peirilhas +peirilhós +peiron +peironenc +peirós +peiròta +peirugal +peirugargh +peis +peisses +peisson +peissonalha +peissonariá +peissonenc +peissonièr +peissonós +peissum +peitas +Peitau +peitavin +peitavin +peitevin +Peitieus +peitral +peitralejargh +peitrina +peitrinari +peitrinièra +pejar +pejoratiu +pejoratiu +pel +pel +pèl +pela +pelacon +pelada +peladilha +peladís +pelador +peladura +pelafa +pelafós +pelagic +pelagosta +pelaire +pelalhós +pelanha +pelar +pelard +pelatariá +pelatge +pelatièr +pelaud +pelaudar +pelaudejargh +pelblanc +pelbufar +pelegant +pelegantièr +pelegre +pelegrin +pelegrinatge +pelejada +pelejargh +pelena +pelenc +pelenquejargh +pelferit +pelfic +pelha +pelhaire +pelhandra +pelhandran +pelhandrós +pelhar +pelhard +pelharòc +pelharocaire +pelhàs +pelhasson +pelhenc +pelheret +pelhièra +pelhòc +pelhòfa +pelhòl +pelhomás +pelhon +pelhós +pelhotassa +pelhum +pelican +pelin +pelissa +pelissariá +pelissièr +pelmudar +pèlmudar +pelmudatge +pelofacièr +pelòfi +pelofre +peloira +peloirós +pelona +Peloponès +peloponesian +pelós +pelòta +pelpèl +pelplantat +pelprés +pelràs +pelratat +pelrós +pelrosset +pelrotge +peltach +peltirada +peltirament +peltirar +peltiri +peluc +pelucaire +pelucargh +pelucard +pelucre +pelufòls +peluquejaire +peluquejargh +pelut +pellecargh +pellèra +pellevament +pellevar +pellevèri +pellèvic +pempena +pempilhós +pena +penable +penacha +penachar +penal +penalh +penar +pench +pencha +penche +penchenada +penchenadís +penchenador +penchenadura +penchenaire +penchenal +penchenar +penchenariá +penchenièr +penda +pendable +pendard +pendeire +pendejargh +pendèl +pendeleta +pendement +pendent +pendentin +pendeson +pendigolhar +pendilh +pendilha +pendilhar +pendís +pendolada +pendolaire +pendolant +pendolar +pendolejargh +pendolet +pendolh +pendolièr +pendreh +pendula +pendulaire +pendulièr +penèc +penecargh +penedenc +penedença +penedent +penedent +penedèri +penèdi +penediái +penedrai +penèdre +peneduda +penedut +penejada +penejargh +penèl +penequejargh +penequet +penet +penetrar +penetrèri +penètric +pénger +penguèri +penheire +penhent +pénher +penherai +penhi +penhiái +penhon +penhuca +penible +penís +penitant +peniténcia +penitencial +penitenciariá +penitencièr +peniu +penjadís +penjador +penjaire +penjal +penjalut +penjant +penjargh +penjason +penjolar +penjolèri +penjolet +penjòlic +penjorlar +penjorlèri +penjòrlic +pennicargh +penon +penós +pensa +pensable +pensada +pensadís +pensador +pensaire +pensament +pensamentós +pensar +pensatiu +pensionari +pensiu +pensós +Pentacosta +pentagòne +pentença +pentent +pentiment +pentirjh +pentós +penultim +pepelejargh +pepelon +peperin +peperon +pèpi +pèpia +pepiar +pepiar +pepiatge +pepida +pepidejargh +pepidós +pepiejargh +pepièri +pèpii +pepin +pepiòt +peptide +pequenejargh +Pequin +pequin +pequinatge +pequinés +pequiu +per +pera +perada +perairada +peral +peràs +perassièr +perat +perbocargh +perbolhirh +perbolirh +pèrca +percaç +percaça +percaçant +percaçargh +percasirh +perçaupre +percebre +perceguda +perceguèri +percegut +percentatge +percepcion +perceurai +perceure +percevent +percevi +perceviái +percinta +percorrai +percorreguda +percorreguèri +percorregut +percorrent +percórrer +percorri +percorriái +percorrirh +percurar +percutirh +perchata +pèrda +perdable +perdeire +perdement +perdent +perdequé +perdèri +pèrdi +perdiái +perdic +perdigal +perdigalhat +perdigalièira +perdigoleta +perditz +perdiu +perdon +perdonable +perdonaire +perdonament +perdonar +perdrai +pèrdre +perduda +perdudas +perdurar +perdut +perduts +perenga +perenguièra +peresa +peresina +peresós +peresosament +pereta +peretièr +perfaire +perfar +perfeccionar +perfèch +perfèit +perfèitament +perfendreh +perferi +perferiment +perferirh +perfialar +perfid +perfièch +perfielar +perfil +perfiladura +perfilar +perfin +perfoçarai +perfocem +perfocèri +perfocetz +perforar +perforçar +perforçar +perforçavi +perfòrci +perforèri +perfòric +perfornirh +perfum +perfumaire +perfumar +perfumariá +pèrga +pergada +pergaire +pergam +pergamin +pergaminar +pergaminariá +pergar +pergar +pergarai +pergavi +pergmèla +perguem +perguèri +pergueta +perguetz +pèrgui +periclada +periclar +pericle +peridura +perièr +perilh +perilhar +perilhós +periment +perimètre +perimirh +peringleta +periòde +periodic +periodicitat +periòsti +perirh +peritòni +perjurament +perjurar +perjuri +pèrla +perlar +perlecargh +perlejargh +perlèri +perlet +perleta +pèrlic +perlinqueta +perlon +perlongament +perlongargh +perlongós +permanéncia +permanent +permanenta +permeabilisar +permeabilizar +permegirh +permejargh +permenar +permés +permetreh +permission +permutacion +permutar +pèrna +pèrnabatut +pernador +pernar +pernassada +pernèri +pèrnic +peròl +peròt +perpal +perpausar +perpendicular +perpensar +perperic +perpetrar +perpetrèri +perpètric +perpetuarazh +perpinha +Perpinhan +perpinhanenc +perpinson +perpont +perprendrai +perprendre +perprene +perprenent +perprenguèri +perpreni +perpreniái +perprés +perpresa +perpunt +perqu'èra +perque +perqué +perquisicionar +perrè +perrec +perregirh +perreguièr +perret +perro +perròt +perruqua +perruquièr +pèrs +pèrsa +pèrsa +persada +persament +persan +persar +pèrsec +persecutar +persega +persegrai +persègre +persegueire +perseguent +perseguèri +persègui +perseguiái +perseguida +perseguida +perseguièr +perseguirh +perseguit +persèri +pèrses +perseverar +perseverèri +persevèric +pèrsic +Pèrsia +Persic +persiegrai +persiègre +persieguèri +persiègui +persièguiái +persistant +persistanta +persisténcia +persistent +persistirh +persona +personal +personalament +personalisacion +personalisar +personalisat +personalizat +personatge +personificargh +perspectiva +persuadirh +persuta +pertanguda +pertanguèri +pertangut +pertanhent +pertànher +pertanherai +pertanhi +pertanhiái +pertasiái +pertèrra +pertesirh +pertirar +pertocant +pertocarai +pertocat +pertocavi +pertoquem +pertoquèri +pertoquetz +pertòqui +pertot +pertractar +pertrach +pertrach +pertracha +pertraguèri +pertrairai +pertraire +pertrait +pertrasent +pertrasi +perturbable +perturbacion +perturbador +perturbar +perturbatiu +pertús +pertusana +pertusar +peruèlh +perussièr +pervenca +pervendrai +pervenent +pervenguda +pervenguèri +pervengut +perveni +perveniái +pervenir +pervenquièra +pervertirh +pervesirh +pès +pes +pesable +pesada +pesaire +pesant +pesantament +pesantar +pesantor +pesar +pesarassa +pesaròta +pesat +pesatge +pesca +pescada +pescador +pescaire +pescajons +pescargh +pescariá +pescolhar +pescorlejargh +pescorlhar +pescotejargh +pese +pesegada +pesèl +pesenada +pesenar +pesenha +peseron +pesilhada +pesolh +pesolhada +pesolhet +pesolhièra +pesolhina +pesolhós +pesòta +pesquièr +pesquièr +pessabata +pessamentós +pessar +pessatge +pessugargh +pèsta +pestar +pestèl +pesteladura +pestelar +pestelèri +pestèlic +pestèri +pèstic +pesticid +pesticide +pestiléncia +pesuc +pesugament +pet +petabàs +petaç +petaçargh +petaçatge +petacejargh +petach +petada +petadís +petador +petaire +petalaganha +petalèbre +petanca +petapèl +petar +petard +petardar +petardejargh +petardèla +petardièr +petarèl +petarrada +petarranha +petarrar +petarufa +petega +petegargh +petejaire +petejament +petejant +petejargh +petelar +petelega +petelèri +petèlic +petelièira +petelon +petenar +pèterós +petesca +petescós +petet +pètge +peticion +petièr +petifla +petiflar +petilh +petilhar +petimant +petimar +petimós +petin +petit +petitament +petitesa +petitet +petnar +petnejargh +petnicargh +petniquejargh +petofejargh +petòfia +petofiar +petofiar +petofiàs +petofièr +petofièri +petòfii +petofiós +petofium +petoirar +petolàs +petolejargh +petolièr +petonar +petonch +petonchum +petonejargh +petós +petrificargh +petrilha +petrografia +petròli +petrolièr +petrologia +petromàs +petrumàs +petrús +peulha +peulhar +peulhós +peuna +pevinha +pevinhar +pevinhós +piada +piafa +piafada +piafadís +piafar +piajargh +pialha +pialhada +pialhadís +pialhar +pian +piancha +pianchon +piarazh +piatejargh +pibala +pibe +pibèc +pibol +píbol +pibola +pibolada +pibolat +piboleda +pibolièira +pic +picaborre +picacrosta +picada +picadís +picador +picadura +picafars +picaformic +picaire +pical +picalenga +picalha +picalhar +picalhasson +picament +picanhada +picanhaire +picanhar +picanhejargh +picanhièr +picanhós +picant +picapebre +picapeirièr +picapelada +picapol +picargh +picard +picard +picarda +Picardia +picaròla +picason +picassa +picassaire +picassal +picassar +picasson +picat +picatar +picatàs +picataulièr +picatge +picatièira +picavermes +picon +piconar +piconejargh +picorar +picorejargh +picorèla +picorèri +picòric +picòt +picotar +picotejargh +picotèri +picòtic +picotós +picharra +pichièr +picholina +pichon +pichonament +pichonàs +pichonèl +pichonet +pichonetat +pichòt +pichòtament +pièch +pièg +pièger +pièger +pièit +pièja +piejadís +piejaire +piejar +pièla +pielar +pielèri +pièlic +Piemont +piemontés +pietadós +pietadosament +pietat +pietejargh +pietós +pifaud +pifonar +piforc +piforcargh +pifraire +pifrar +pifre +pifrejargh +piga +pigalh +pigalhar +pigargh +pigassa +pigassaire +pigassar +pigasson +pigat +pigmentar +pigrament +pigre +pigrejargh +pigresa +pigritge +pigritjargh +pijargh +pila +pilaire +pilar +pilaret +pilastre +pilhaire +pilhar +pilhard +pilhatge +pilon +pilòri +pilòt +pilotar +pilotatge +pilotèri +pilòtic +pilula +pimar +pimentar +pimenton +pimèrle +pimet +pimpa +pimpalhadura +pimpalhar +pimpanar +pimpanèla +pimpant +pimpar +pimparèl +pimparlar +pimparradura +pimpeiar +pimpeiarai +pimpeiavi +pimpeiem +pimpeièri +pimpeietz +pimpèii +pímpia +pimpilhar +pimpilhas +pimpilhejargh +pimpilhós +pimpinèla +pimpinhar +pimpinhós +pimponar +pimponejargh +pimporlar +pin +pinassa +pinastre +pinatièr +pinau +pinça +pinçada +pincal +pincalhar +pinçament +pinçan +pincargh +pinçargh +pinçard +pincarda +pincèl +pincelada +pincelar +pincelèri +pincèlic +pincelièr +pincon +pinçon +pinchada +pinchar +pinchuc +pindolar +pineda +pinèl +pinenc +pinha +pinhar +pinhareda +pinhasson +pinhastre +pinhastritge +pinhat +pinhata +pinhatièr +pinheta +pinhièr +pinhòl +pinholièra +pinhon +pinhonat +pinhorat +pinhorièr +pinhut +pinièra +pinós +pinquet +pinta +pintada +pintadissa +pintadon +pintar +pintard +pintat +pintièr +pinton +pintonar +pintorejargh +pintoresc +pintorlar +pintorlatge +pintorlejargh +pintrar +pintura +pintusar +pinzèl +pinzelar +pinzelèri +pinzèlic +piòla +piòt +piotada +piotaire +piotenc +pipada +pipaire +pipan +pipar +piparda +pipinhar +pipòt +pipotièr +piramida +pirata +piratar +piratariá +pirenenc +Pirenèus +Pirenèus-atlanticas +piròl +pirolada +pirotecnia +pis +Pisa +pisa +pisador +pisaire +pisan +pisar +pisat +piscicultura +piscoalha +pissa +pissacan +pissacauda +pissada +pissador +pissadorat +pissafreg +pissaire +pissal +pissalait +pissament +pissanha +pissanhada +pissar +pissarada +pissarèl +pissarós +pissaròu +pissatge +pissèira +pisses +pissòl +pissolar +pissolejargh +pisson +pissonièr +pissorlin +pista +pistar +pistarèla +pistil +pistils +pistille +pistòla +pistolada +pistolet +pistoletada +piston +pistre +pit +pitança +pitançariá +pitancièr +pitançós +pitantargh +pitar +piton +pitraca +pitrada +pitraire +pitral +pitre +pitron +piuçada +piuçaire +piuçal +piuçargh +piucèl +piulada +piuladís +piulaire +piulament +piular +piulàs +piulat +piulejargh +piulèl +piulet +piuletar +piunar +piusada +piuse +piusèl +piuselatge +piusièr +piuson +piusós +piusson +piuta +piutada +piutadissa +piutaire +piutament +piutar +piutarèl +piutejargh +pivelar +pivelèri +pivèlic +pivòt +pivotar +pivotèri +pivòtic +placa +plaça +plaçament +placargh +plaçargh +placejargh +placenc +placeta +placièr +placilhon +placiu +plaçon +plafon +plafonar +plafonatge +plag +plaga +plagaire +plagargh +plagós +plaguda +plaguèri +plagut +plaid +plaidar +plaidason +plaidejaire +plaidejament +plaidejargh +plaidejariá +plaidejat +plaijargh +plairai +plaire +plais +plaisent +plaissa +plaisses +plaja +plajargh +plan +planada +planadura +planaire +planal +planar +planareda +planàs +planatge +planca +plancada +plancargh +plançard +plançàs +plancat +plançòl +plançolièr +plançon +plançoneda +plancton +planctonic +plancha +planchon +planejargh +planés +planet +planeta +planetària +plangent +planguda +planguèri +plangut +planhent +planhent +plànher +planherai +planhi +planhiái +planhirh +planhòl +planhòla +planhum +planièr +planòl +planqueta +plant +planta +plantacion +plantada +plantadís +plantage +plantaire +plantament +plantar +plantatge +plantièr +plantigrada +plantigrade +plantol +plantolièr +plantum +planura +plapa +plapar +plaqueta +plasença +plasent +plasentament +plasentat +plasentièr +plàser +plaser +plasi +plasiái +plastic +plastrar +plastrariá +plastràs +plastre +plastrièr +plastron +plastronar +plastrunhar +plat +platabanda +platada +plataforma +platana +platanièr +plataràs +platàs +platassejargh +platèl +platèla +platina +platissal +platon +platuga +platugàs +plautirh +plebiscitar +plec +plecadura +plecargh +plecha +plechar +plechat +plechon +plegable +plegada +plegadís +plegador +plegadura +plegaire +plegament +plegargh +plegatge +plegatiu +plegon +plegonar +pleiada +pleiade +pleidar +pleidejargh +pleidèri +plèidic +plen +plenament +plenièr +plenitud +plenor +plesc +plesca +pletar +pleura +pleurèsi +plòc +ploguèt +plogut +plomb +plombada +plombaire +plombar +plombatge +plombèl +plombet +plombièr +plombon +plond +plondament +plondor +plonjaire +plonjargh +plonjon +plonós +plonzut +plor +plorada +ploradís +ploragós +ploraire +plorament +plorar +plorassar +plorassejargh +ploregós +plorinejargh +plorinós +plorós +ploruga +plorum +plotocracia +plotocratic +plòu +plòure +plovina +plovinar +plovinejada +plovinejargh +plovinós +pluèg +pluèja +plugargh +plugina +pluginós +plugon +plujada +plujaires +plujal +plujàs +plujat +plujau +pluma +plumacho +plumada +plumadilhas +plumadís +plumaire +plumalh +plumalhar +plumar +plumàs +plumassada +plumassièr +plumet +plumilha +plumon +plumós +plural +pluralisme +pluralista +pluricellular +pluricellulara +plus +plusors +pluvièr +PNG +Pò +poblada +poblar +pòble +poblèri +pòblic +pocana +pocanada +pocanariá +poce +pòcha +pochar +pochejargh +pochèri +pòchic +pochina +pochinadura +pochinaire +pochinar +pochinchin +pochon +pochonejargh +pochonet +podada +podador +podagre +podagrós +podaire +podar +podard +podàs +podason +podassejargh +podatge +podença +poder +poderós +poderosament +podestat +podet +podeta +pòdi +podiái +podilhàs +podrigargh +poèma +poëma +poësia +poèta +poèta +poëta +poetessa +poetessa +poëtic +pofiàs +pofieta +pofre +pogau +pogés +pogròm +poguda +poguèri +pogut +poila +poilàs +poile +poilièra +poilitge +poirai +poire +poire +poiredura +poirenca +poiridièr +poiridor +poiridura +poirièra +poirirh +poirison +poison +poisonariá +poisonièr +poissança +poissant +poissinièira +poissiu +poitre +poitròlas +poja +pojada +pojaire +pojar +pojargh +pòl +pol +polacre +polaire +polalh +polalhièr +polandrièr +polard +polardar +polaritat +polassa +polassariá +polassièr +polastre +polça +poleja +polelha +polemic +polemica +polemista +polemista +polena +polet +poleton +Polha +polhaire +polhés +polhosa +poliandre +poliandria +poliartriti +polícia +policiar +policièr +policièri +políciic +policlinica +policòpia +policròm +policultura +polidament +polideja +polidesa +polidetament +polidetat +polidiá +poliditge +polidor +polidura +polièdre +polièr +poliglòta +poligòn +poligòne +poliment +polin +polinada +polinar +polinejargh +Polinesia +polinesian +polinets +polinièra +polinòmi +poliquet +polirh +polisacaride +polispermia +polissa +polit +politic +politicaire +politicaire +politician +politizacion +politizacion +polonés +polonés +Polonha +polòta +polpra +polpres +pols +polsa +polsada +polsador +polsar +polsejargh +polset +polsic +polsièra +polsierós +poltra +poltre +poltrirh +polva +polvàs +polvera +polverejargh +polverèl +polverin +polverós +polzin +polzinada +polzinar +polzinièira +pollambert +pollinisacion +pollinisar +pollinizar +polluirh +pom +pomacha +pomada +pomairada +pomar +pomarada +pomareda +pomaret +pomastre +pomat +pomata +pomatèl +pomèl +pomelar +pomelèri +pomèlic +pomet +pometièr +pomièr +pomon +pompa +pompar +pompatge +pompelmós +pompet +pompida +pompidor +pompièr +pompilh +pompilhat +pompilhós +pompinar +pompirh +pompissal +pompista +pomponi +pompós +pomposament +ponat +poncèla +ponctuacion +ponctuarazh +ponch +ponch +poncha +poncha +ponchada +ponchaire +ponchal +ponchar +ponchason +ponchejadís +ponchejargh +ponchièr +ponchilhon +ponchimpèrla +ponchon +ponchonada +ponchonar +ponchonejargh +ponchuc +ponchut +pondar +ponde +pondeira +pondenta +ponderacion +pondreh +ponduda +ponedor +ponent +ponent +ponentés +póner +pónger +pongirh +ponguèri +ponh +ponha +ponhada +ponhadièra +ponhal +ponhar +ponhedura +ponheirarrh +ponheire +ponhejargh +ponhement +ponhent +ponhent +pónher +ponherai +ponheson +ponhet +ponhi +ponhiái +ponhieirar +ponhierar +ponhierèri +ponhièric +ponhirh +ponhor +ponre +ponsèri +ponsirada +pont +pontada +pontaire +pontal +pontanièr +pontar +pontarri +pontatge +pontet +pontièr +pontife +pontifical +pontificargh +pontificat +pontilh +pontilha +pontilhar +ponton +pontonièr +pontura +popa +popaire +popar +popardièra +poparèla +popèl +popelet +popeta +pòpia +popial +popièira +popon +poponar +poponejargh +poponet +popòta +populacion +popular +populara +popularitat +populisme +poput +pòr +pòrc +pòrca +porcachon +porcada +porcairòla +porcairon +porcal +porcalha +porcanhàs +porcariá +porcàs +porcatejargh +porcatièr +porcèla +porcelada +porcelar +porcelat +porcelèri +porcelet +porcèlic +porcelièra +porcin +porfir +porfirs +porgaire +porgargh +porgas +pòrge +porgeire +porgem +pòrger +porgèri +porgetz +pòrgi +porgiment +porgirh +porguiol +porjar +porjarai +porjavi +pornograf +pornografia +porositat +porpal +porporat +porporin +porpra +porpre +porquejargh +porquetaire +porquièr +porquitge +porrada +porrar +porrat +porrata +pòrre +porregetar +porregetèri +porregètic +porrejitar +porrèri +porret +pòrric +porrigal +porriòl +porron +porronar +pòrt +portable +pòrtacotel +portada +portador +portadura +pòrtafais +pòrtafuèlha +pòrtaiga +portaire +portal +portalada +portalièr +portalièra +pòrtamantèl +portament +pòrtamoneda +portanèl +portanha +portant +pòrtapapièr +pòrtaparaula +pòrtapluma +portar +portariá +portatge +pòrtatinal +pòrtavista +pòrtavitra +pòrtavotz +portèla +portèri +pòrtfòlio +pòrtic +portic +portica +porticargh +portièr +portisson +Porto +portolaiga +Portugal +portugués +portugués +posa +posaca +posada +posadís +posador +posaire +posal +posandièr +posar +posaraca +posca +poscada +poscam +poscargh +poscarrada +poscatz +poscós +posicion +posita +positiu +posquejargh +posquina +posquinada +posquinar +possa +possada +possaire +possal +possar +possat +possatge +possedirh +possesirh +possesòri +possession +posseta +possibilitat +possible +possible +possigargh +possís +possissiana +possiu +post +pòst-produccion +pòst +pòst +postada +postada +postadar +postadet +postadís +postal +postala +postam +postamar +postanha +postar +postarèl +postat +pòstdatar +postejargh +postèl +postèma +postemejargh +postemós +postèri +posterior +posteriòri +postèrla +postèrna +pòstic +postièira +postilha +postular +postum +postura +pòt +pota +potable +potada +potagièr +pòtagròs +potar +potarda +potariá +potarra +potarrada +potarràs +potarron +potarron +potassium +potat +potatge +potèl +poténcia +potencial +potencialament +potent +potèri +potèrla +potestat +potet +pòtfendut +pòtic +potièr +potilha +potilhós +potin +potina +potinaire +potinar +potinejargh +potinga +potingaire +potingança +potingargh +potingarda +potingatge +potingon +potingós +potinguejaire +potinguejargh +potinhar +potissa +potisson +poton +potona +potonada +potonaire +potonar +potonariá +potonàs +potonejargh +potonet +potonièra +potonta +potonton +potontonejargh +potorlada +potralada +potrocan +potrolha +potrolina +potz +pòutra +pr'amor +pr'aquí +pr'aquò +practic +practica +practicament +practicargh +practician +practicós +practics +prada +pradal +pradariá +pradasca +pradatge +pradèl +pradèla +pradelet +pradelon +pradenc +pradesca +pradet +pradièr +pradièra +pradon +Praga +pragmatisme +pragmatista +pragués +prandièra +prangieiron +prangièra +prat +pratic +prausèli +prautidor +prautirh +preambul +prebenda +prebendar +prebendièr +prebòst +prebostal +prebostat +prèc +precària +precaucion +precedéncia +precedent +precedentament +precedirh +precèpta +preceptor +preciós +preciosament +preciositat +precipitacion +precipitadament +precipitar +precirculacion +precís +precís +precisa +precisa +precisament +precisar +precision +preclar +precòç +precòçament +precocitat +precon +preconisar +preconizar +preda +predator +predatritz +predefinit +predestinar +predicargh +prediccion +predispausar +preexisténcia +preexistent +preexistirh +prefaci +prefaciar +prefacièri +prefàciic +prefècte +prefectoral +prefectura +preferéncia +preferible +preferirh +prefiguracion +prefix +prefixar +prefixes +prèga +prègadiable +prègadieu +pregadís +pregaire +pregairenc +prègajoana +pregar +pregar +pregarai +pregària +pregavi +pregit +preguejargh +preguem +preguèri +preguetz +prègui +preguièra +preiral +preiralha +preirat +prèire +preiressa +preissa +preissar +preissèri +prèissic +preistòria +prejudici +prejudiciable +prejudiciable +prejudicial +prejudiciar +prejudicièri +prejudíciic +prejutjargh +prejutjat +prelat +prelatura +prelevar +prelevèri +prelèvic +preliminar +preludi +preludiar +preludièri +prelúdiic +prement +prémer +premerai +premèri +premi +prèmi +premi +premiái +premiar +premícias +premicièr +premida +premièri +prèmiic +premirh +premissa +premonicion +premsa +premsar +premuda +premunirh +premut +prenable +prendrai +prendre +prene +preneire +prenement +prenent +prenenta +prenguèri +preni +preniái +prenom +prens +prensa +prensada +prensaire +prensar +prensòia +preocupacion +preocupar +prèp +prèp +prèpa +preparacion +preparar +preparatiu +preparatori +prepaus +prepausar +preponderant +preposicion +prepuci +prequesit +prerogativa +pres +pres +pres +près +presa +presa +presa +presa +presable +presada +presagi +presagiar +presagièri +presàgiic +presaire +presar +presas +presas +presatge +presbicia +presbita +presbitèri +presbiterian +presciéncia +prescrich +prescricha +prescriguèri +prescripcion +prescrirai +prescriura +prescriure +prescrivent +prescrivi +prescriviái +preséncia +present +presentacion +presentament +presentar +presentator +presentatritz +presèri +preservatiu +preses +preses +prèsic +presic +presicada +presicador +presicaire +presicança +presicargh +presidéncia +presidencial +president +presidirh +presoiron +presompcion +presomptuós +preson +presonièr +presor +pressada +pressadament +pressador +pressaire +pressant +pressar +pressatge +pressentida +pressentiment +pressentirh +pressèri +prèssic +pression +pressupausar +pressurar +pressurisar +pressurizar +prèst +prestacion +prestadís +prestador +prestaire +prèstament +prestança +prestar +prestason +prestatge +prestèri +prestesa +prèstic +prestidigitator +prestidigitatritz +prestidor +prestigargh +prestigi +prestigiós +prestilhon +prestirh +prestiu +presumidor +presumirh +presura +presurar +presuratge +pretendent +pretendreh +pretendut +pretension +pretensiós +preterit +pretèxt +pretextar +pretextèri +pretèxtic +pretòri +Pretòria +prètz +prètzes +prètzes +prètzfach +prètzfachièr +prètzfait +prètzfaitièr +prevalent +prevaler +prevalguda +prevalguèri +prevalgut +prevali +prevaliái +prevalrai +prevegèri +preveirai +preveire +prevencion +prevendrai +prevenença +prevenent +prevenent +prevenguda +prevenguèri +prevengut +preveni +preveniái +prevenir +preventiu +prevesença +prevesent +prevesent +prevéser +prevesi +prevesiái +previneta +prevision +previst +prevista +prigol +prigolada +prigolar +prigond +prigondament +prigondor +prim +primachòl +primadèla +primaic +primaiga +primairenc +primalba +primament +primar +primarc +primarga +primari +primària +primatge +primauba +primautat +primavèra +primaveral +primejaire +primejargh +primesa +primet +primfiela +primfilar +primfin +primflor +primieiratge +primieirenc +primieiretat +primièr +primièrament +primitiu +primitiva +primol +primor +primordial +primordiala +primotada +primotejargh +primotiá +primotièr +primpenchenat +primsòm +prince +princejargh +princessa +princièr +princilhon +principal +principat +principi +principiar +principièri +princípiic +prion +prior +priorat +prioressa +priòri +prioritari +prioritària +prioritat +prisma +prismatic +prisme +prison +prisonièr +pritanèa +priusses +privacion +privada +privadament +privadança +privadía +privar +privat +privilègi +privilegiar +privilegiar +privilegièri +privilègii +pro +proa +proada +probabilitat +probablament +probable +probaginar +probainar +probatjargh +pròbe +probega +problèma +problematic +pròc +procariòta +procediment +procedirh +procedura +procès +procession +procèssus +processús +proclamar +procònsol +proconsolar +proconsulat +procreadoira +procreador +procrear +procura +procurador +procuraire +procurar +procurat +pròcha +pròche +pròcheoriental +prodig +prodigalitat +prodigament +prodigargh +prodigi +prodigiós +prodigiosament +produccion +productiu +productor +productritz +produch +producha +produguèri +produirai +produire +produit +produsent +produsi +produsiái +produsirh +proëminent +proesa +profaça +profan +profanacion +profanar +profecia +profèch +profechable +profechar +profechèri +profechós +profechosament +profèit +profeitar +profeitèri +profèitic +profeitós +profeitosament +proferirh +proferris +profession +professional +professionalisme +professionalisme +professor +profèta +profetessa +profetisar +profetizar +profièch +profièchic +profièit +profilaxia +profit +profusion +progenitura +programa +programacion +programar +programator +progrès +progressar +progressèri +progrèssic +progression +progressista +progressiu +prohibirh +proïbitf +proïbitiu +proïn +projeccion +projectar +projècte +projectèri +projèctic +projectil +projector +proletari +proletària +proletariat +proliferacion +prolific +prolix +prolixes +prològ +prològue +prolong +prolongacion +prolongament +prolongargh +prolonguejargh +promés +promesa +promessa +prometedor +prometeire +prometença +prometreh +promís +promisa +promocion +promoguda +promoguèri +promogut +promontòri +promotor +promourai +promòure +promovent +promòvi +promoviái +promptament +promptet +promptitud +promte +promulgargh +pronóncia +prononciacion +prononciament +prononciar +prononcièri +pronónciic +propaganda +propagargh +propagator +propagatritz +pròpi +pròpia +propici +propícia +proporcion +proporcion +proporcionar +proposar +proposicion +pròpre +pròpri +pròpria +pròpriament +proprietari +proprietat +propulsar +propulsion +propulsor +proratà +prorogar +prorogar +prorogarai +prorogavi +proroguem +proroguèri +proroguetz +prorògui +pros +prosament +proscrich +proscricha +proscriguèri +proscriure +proscrivent +proscrivi +proselit +prospectar +prospectèri +prospèctic +prospèctus +prospèr +prosperar +prosperèri +prospèric +prosternar +prosternèri +prostèrnic +prostitucion +prostituïda +prostituirh +prostituït +protagonista +proteccion +proteccionisme +protector +protectritz +protegirh +proteïna +protestar +protestèri +protèstic +protocòl +protocòle +prototip +pròva +provaire +provament +provant +provar +Provença +provençal +provençau +provendrai +provenença +provenent +provenguda +provenguèri +provengut +proveni +proveniái +provenir +provèrbi +proverbiaire +proverbial +proverbiós +provèri +provesidor +provesiment +provesion +provesirh +proveta +pròvic +providéncia +província +provincial +provisor +provisòri +provisòriament +provocar +provocarai +provocavi +provoquem +provoquèri +provoquetz +provòqui +proxenetisme +proximitat +prudéncia +prudent +prudentament +prudomal +prudòme +prudomia +pruna +prunada +prunèl +prunèla +prunelada +prunelièr +prunieirada +prunièr +prus +prusent +prúser +prusesta +pruseta +prusiment +prusirh +prusitge +prusor +Prussa +prussian +psalmejargh +pseudogène +pseudonim +pseudonim +pseudonime +pseudopòdi +psicanalisar +psicanalista +psicanalitic +psicanalitica +psico-somatic +psicològ +psicologia +psicologic +psicològue +psicosi +psipsi +psiquiatre +psiquiatric +psiquic +psiquitra +pua +puadèl +pual +puat +puatièr +pubèr +pubertat +pubís +public +publicacion +publicament +publican +publicargh +publicista +publicitar +publicitari +publicitària +publicitat +publipostatge +pudent +pudentariá +pudesa +pudesenc +pudesina +pudic +pudicament +pudicitat +pudirh +pudís +pudol +pudor +pudre +puèg +puèi +puèi +puèlh +puelhar +puelhèri +puèlhic +pueril +puget +pujada +pujador +pujal +pujant +pujargh +pujatèl +pujòl +pulmonar +pulpa +pulsacion +pulsar +pullular +pumà +punais +punaisa +punaisièr +punaisós +púnger +punh +punhada +punhaic +punhal +punhatja +punheirarrh +punhent +púnher +punhet +punhic +punhieirar +punhièra +punhierar +punhierèri +punhièri +punhirh +punhor +punicion +punidor +puniment +punirh +punt +punt +punta +puntaire +puntal +puntar +puntatge +puntejadís +puntejargh +puntets +puntièr +puntilha +puntilhar +puntilhisme +puntonada +puntura +puòg +pupa +pupil +pupilla +pupitre +puput +pur +purament +purar +purèa +purèia +puretat +purga +purgador +purgaire +purgament +purgargh +purgatiu +purgatòri +purificargh +purista +puritan +purpurenc +pursang +pus +pusaut +puselh +puslèu +pustula +put +puta +putafin +putalha +putan +putana +putanèla +putanièr +putariá +putarra +putarralha +putassa +putassièr +putejargh +putitge +Pyeongyang +Qatar +qatarita +qu'als +qu'an +qu'aquesta +qu'aqueste +qu'aquò +qu'ela +qu'èra +qu'èran +qu'Euròpa +qu'Euròpa +qu'existís +qu'i +qu'o +qu'òm +quadragesima +quadrangular +quadrant +quadrar +quadre +quadriga +qüadrilatèr +quadrilatèr +qüadrilatèrs +quadrilha +quadrilhar +quadrilhatge +quadrupèda +quadrupède +quadruplar +quadruple +qual +quala +qualificant +qualificargh +qualitat +qualitós +qualqu'un +qualque +quan +quand +quanes +quant +quantes +qüantificator +quantitat +quaranta +quaranten +quarantena +quarantenc +quarantièr +quaresma +quarre +qüars +quart +quartairon +quartalatge +quartan +quartar +quartejargh +quartet +quartolar +quartòlic +quarton +quasèrn +quasernet +quasi +quasiment +quasiment +qüasirta +quatre +quatren +quatrenament +quatrin +quauqu'un +quauque +que +qué +Quebèc +Quebèc +quebequés +quèc +quèca +queirèl +quèli +quenha +quenque +quèpi +quequejaire +quequejargh +quèr +quèra +querar +querat +queratina +quereguèri +querèla +querelaire +querelar +querelèri +querèlic +querelós +querèri +quèric +queriái +querirh +quermès +querós +querrai +quèrre +quers +quersada +querubin +quesirh +quessar +question +questionar +quet +qui +quicòm +quicomet +quich +quichaclau +quichada +quichadura +quichaire +quichant +quichant +quichar +quichorlar +quièr +quièri +quiet +quietament +quietud +quila +quilada +quiladissa +quilaire +quilament +quilant +quilar +quilariá +quilet +quilh +quilha +quilhaboira +quilhabomba +quilhaire +quilhandra +quilhar +quilharèl +quilheta +quilhièr +quilhon +quilhonar +quilò +quilogram +quilograma +quilograme +quilomètre +quilòmètre +quilometric +quilòs +quimèra +quimeric +quimia +quimic +quimicament +quimioterapia +quimista +quin +quin +quina +quinament +quinaud +quincairòla +quincalha +quincalhariá +quincalheta +quincalhièr +quincanèla +quincanelaire +quincargh +quinçard +quincarlòta +quincarlotièra +quinçon +quinçonalha +quinçonièr +quincha +quines +quinquirilh +quint +quintaina +quintal +quintalenc +quintalièr +quintana +quintar +quintesséncia +quintós +quintuplar +quintuple +quinze +quinzen +quinzenada +quinzenar +quiqueta +quiquiriqui +quirguiz +quirguiza +quirguizes +Quirguizstan m +quiromancia +quiromancian +quiscarra +quist +quista +quistaire +quistant +quistar +quistatge +quiston +quita +quitaire +quitament +quitança +quitançargh +quitar +quite +quitran +quitranar +quocient +quora +quòta +quotidian +quotitat +raba +rabacaul +rabadan +rabaissar +rabalar +rabalenca +rabalha +rabalhar +rabalhut +raban +rabanar +rabanèl +rabanèla +rabanenca +rabanhaire +rabanhar +rabanilha +rabanisèla +rabanissa +rabàs +rabàs +rabassa +rabassat +rabassièr +rabasson +rabassòt +rabasta +rabastaire +rabastar +rabastejargh +rabastinar +rabastinèla +rabastís +rabastolejargh +rabastrach +rabastracha +rabastrada +rabastraguèri +rabastraire +rabastrarai +rabastrasent +rabastrasi +rabastrasiái +Rabat +rabat +rabe +rabeg +rabejador +rabejaire +rabejargh +rabent +rabentament +rabeta +ràbia +rabièira +rabierard +rabigotar +rabigotèri +rabigòtic +rabilhon +rabiment +rabina +rabinar +rabinat +rabinatge +rabinèl +rabinós +rabiós +rabirh +rabís +rabissana +rabissent +rablat +rable +rablut +rabodilhar +rabossar +rabossejargh +rabostoire +rabòta +rabotaire +rabotar +rabotat +rabotatge +rabotèri +rabòtic +rabotilh +rabotós +rabrugargh +rabugargh +rabuscal +raca +raça +racacòr +racada +raçada +racadura +racaire +racaniá +racanilha +racargh +raçargh +racat +racatge +racejargh +racial +racina +racinar +racinat +racinatge +racinum +racinut +racional +racionalisar +racionalisme +racionalitat +racionalizar +racionar +racís +racisa +racisme +racista +racochet +racolaire +racolar +racolèri +racòlic +racontar +raconte +racorchirh +racordar +racordèri +racòrdic +racornirh +racós +racròc +racrocar +racrocarai +racrocavi +racroquem +racroquèri +racroquetz +racròqui +racha +rachar +rada +radabèl +radal +radalosa +radar +radassar +radèl +radelada +radelièr +radial +radian +radical +radicalitat +ràdio +radió +radiòelectric +radiografia +radiograma +radiolaris +radiologia +radioscopia +radioterapia +radissar +radobar +radobar +radobèri +radòbic +radocirh +rafa +rafajós +rafalar +rafalejadís +rafalejargh +rafanatge +rafanèla +rafar +rafastinar +rafatalh +rafatalha +rafatejargh +rafatòri +rafatum +rafe +rafe +rafega +rafegaire +rafegargh +rafidura +rafièr +rafiment +rafinaire +rafinament +rafinar +rafinariá +rafinatge +rafirh +rafissar +rafissós +rafitè +rafla +raflaire +raflar +rafle +rag +ragach +ragadís +raganit +ragargh +ragàs +ragatge +ragentada +ragentar +ragièira +ragost +ragostant +ragostar +ragostejargh +ragostièra +ragostós +ragòt +ragusa +rai +raia +raiadura +raiar +raiat +raiç +raiçargh +raicinejargh +raicivada +raidar +raide +raièri +raigal +raiic +raimajargh +raina +rainal +rainar +raineta +raiolada +raiolàs +raiós +raiòu +raiòua +raire +raissa +raissada +raissal +raissar +raissejargh +raissum +raja +rajada +rajador +rajadura +rajal +rajant +rajargh +rajoinirh +rajòl +rajòla +rajolant +rajolar +rajolejargh +rajolèri +rajolet +rajòlic +rajustar +ralegrar +ralegrèri +ralègric +ralh +ralhadís +ralhaire +ralhament +ralhar +ralharèl +ralhariá +raliament +raliarazh +ralongargh +ralucargh +ralumar +ram +rama +ramaconilh +ramada +ramador +ramalha +ramalhar +ramalhàs +ramalhós +ramandilha +ramanhòl +ramar +ramaraire +ramàs +ramassar +ramat +ramatge +ramatjada +ramatjaire +ramatjargh +rambada +rambalh +rambalha +rambalhada +rambalhadís +rambalhaire +rambalhar +rambalhejargh +rambalhós +rambar +rambiarazh +rambolh +rambolhar +rambulhar +ramejargh +ramèl +ramelar +ramelèri +ramelet +ramèlic +ramelut +ramenc +ramentar +ramilha +ramís +ramon +ramonaire +ramonar +ramonatge +ramondenc +ramondin +ramonet +ramonetatge +ramós +rampa +rampalm +rampèl +rampelada +rampelaire +rampelar +rampelèri +rampèlic +rampelin +ramplec +ramplegargh +rampòina +rampon +ramponar +ramponha +ramponhar +ramponhèri +rampònhic +rampós +ramut +ran +ranc +rança +rancareda +rancàs +rance +rancejargh +rancidura +rancirh +rançor +rancós +rançós +rançum +rancuna +rancunhar +rancunós +rancura +rancuraire +rancurant +rancurar +rancurèl +rancurós +randa +randac +randal +randalar +randalha +randalièr +randalmar +randalme +randissa +randòl +randòla +randolar +randolejaire +randolejargh +randolèri +randoleta +randòlic +randolinejargh +randonar +randonejargh +randura +randurar +randuràs +ranfina +rangol +rangolar +rangolejargh +rangolós +rangolum +Rangon +ranguilh +ranguilhar +ranguilhejargh +ranguilhós +ranhada +ranhar +ranices +ranoncle +ranquejargh +ranquet +ranquièra +ranquilha +ranquilhada +ranquilhós +ranquipotèina +ranselhar +ransilhar +rantel +rantela +rantelar +rantelat +rantelejargh +rantelós +ranviaire +ranviarazh +raon +raonatge +rapaç +rapaça +rapacitat +rapada +rapalhon +rapar +rapatalha +rapaton +rapelar +rapelèri +rapèlic +rapiada +rapiar +rapid +rapidament +rapiditat +rapièri +ràpiic +rapilha +rapilhaire +rapilhar +rapilhatge +rapilhejargh +rapin +rapina +rapinaire +rapinar +rapinariá +rapinèl +rapinós +rapon +raponchon +rapòrt +raportaire +raportar +raportèri +rapòrtic +rapportièr +raprochar +raprochèri +rapròchic +rapsòde +rapsodia +rapuga +rapugaire +rapugargh +raquejaire +raquejargh +raquet +raqueta +raquialgia +raquidian +raquís +rar +rarament +rarc +rareficargh +rarejargh +raretat +ras +rasa +rasa +rasada +rasadura +rasaire +rasal +rasament +rasar +rasariá +rasatge +rasca +rascaç +rascaça +rascaçargh +rascaire +rascala +rascalaire +rascalar +rascalau +rascalhar +rascalon +rascanha +rascanhadura +rascanhar +rascanhós +rascanhut +rascargh +rascàs +rascassós +rascat +rascla +rasclada +rasclador +rascladura +rasclaire +rasclamilhàs +rasclar +rasclàs +rasclatge +rascle +rasclet +rasclós +rasclum +rascoalha +rascoalhar +rascòl +rascós +rascum +rasejargh +rasèl +rasent +rasic +rasièr +rasiga +rasigon +rasigòt +rasim +rasimada +rasimar +rasimat +rasimèla +rasimièra +rasinet +rasinòl +rasinòt +rasoirar +rason +rasonablament +rasonable +rasonador +rasonaire +rasonament +rasonar +rasor +raspa +raspada +raspadura +raspalar +raspalh +raspalha +raspalhada +raspalhaire +raspalhar +raspalhejargh +raspalheta +raspar +raspassal +raspassejargh +raspet +raspï +raspiar +raspièra +raspièri +raspiic +ràspiic +raspilhada +raspilhar +raspinaire +raspinar +raspinhal +raspinós +raspirh +raspós +rasquet +rasqueta +rasquilha +rassa +rassada +rassar +rassasiar +rassèga +rassegador +rassegaire +rassegar +rassegatge +rasseguièr +rassegum +rassegurar +rasserenar +rassièr +rassilhon +rassolar +rassolèri +rassòlic +raste +rasteganha +rastegargh +rastèl +rastelada +rasteladura +rastelaire +rastelar +rastelat +rastelatge +rastelejargh +rastelenc +rastelèri +rastelet +rastèlic +rastelièr +rastelitge +rastelum +rastolh +rastolhada +rastolhaire +rastolhar +rastugargh +rastum +rastumar +rastumat +rat +rata +ratada +ratadura +rataire +ratairòl +ratalha +ratapanada +ratapenada +ratar +ratatet +ratatinar +ratbufon +ratcalhòl +ratèla +ratet +ratièr +ratificacion +ratificargh +ratigàs +ratinhòl +ratonada +ratonalha +ratonar +ratonejargh +ratoneta +ratonièra +ratós +ratuga +ratugargh +ratum +ratum +ratumat +ratunha +ratunha +rau +rauba +raubadís +raubador +raubaire +raubalong +raubament +raubar +raubariá +raubatge +raubatin +raubatòri +raubeta +raubilha +rauc +raucament +raucós +raufèl +raufelar +raufelejargh +raufèlic +raufelós +raufi +ràufia +raufinhar +rauja +raujargh +raujós +raulet +raulirh +rauma +raumàs +raumat +raumatic +raumatisma +raumèca +raumèl +raumelar +raumelèri +raumèlic +raumelós +raumi +raumida +rauminar +raumirh +raunar +raunhadís +raunhar +raunheta +raunhòla +raunholar +raunholèri +raunhòlic +raunhut +raunòta +rauquejargh +rauquièra +rauquilhejargh +rauquilhós +rauquitge +raus +rausa +rausadura +rausar +rausàs +rausat +rausèl +rauselar +rauselèri +rausèlic +rausièra +rausilha +rausirh +rausós +raust +raustinar +raustum +ravajargh +ravalar +raviòli +ravisar +ravisquilhar +ravoirar +razià +reabilitar +reaccion +reactor +reagirh +real +realisacion +realisar +realisme +realitat +realizacion +realizar +reaprene +reaprenent +reaprenguèri +reapreni +reaprés +reapresa +reatrapar +reauçargh +reba +rebacaular +rebais +rebaisar +rebaissament +rebaissar +rebala +rebalada +rebaladís +rebalanta +rebalar +rebalassejargh +rebalat +rebalçargh +rebalejargh +rebalin +rebalit +rebalum +rebanar +rebanc +rebandar +rebandirh +rebanhar +rebarba +rebardar +rebarrar +rebastirh +rebat +rebatar +rebatatge +rebatedís +rebatejargh +rebatement +rebatreh +rebatuda +rebatum +rebauçargh +rebaucet +rebavadura +rebavar +rebèc +rebèca +rebecada +rebecaire +rebecar +rebecar +rebecarai +rebecavi +rebecós +rebèl +rebelaire +rebelar +rebelejargh +rebelèri +rebèlic +rebendar +rebenesirh +rebentar +rebequem +rebequèri +rebequetz +rebèqui +rebertut +rebèstia +rebestorn +rebetirh +rebic +rebicaul +rebichinar +rebilhar +rebingargh +reblar +reblariá +reblatalha +reblatge +reble +reblèri +rèblic +reblonalha +reboarazh +rebocada +rebocadís +rebocaire +rebocament +rebocargh +rebocatge +reboclar +rebochèl +rebochin +rebochirh +rebodilhar +reboeimada +reboeimar +reboeime +rebofar +rebofet +rebofit +rebofum +reboge +reboirar +reboissar +rebol +rebola +rebolat +rebolh +rebolhent +rebolhidor +rebolhirh +rebolida +rebolirh +rebolut +rebomb +rebombar +rebombassal +rebombèl +rebombelar +rebombelèri +rebombèlic +rebombeta +rebombida +rebombilh +rebombilhar +rebombiment +rebombirh +rebombissent +rebon +rebond +rebondar +rebondeire +rebondirh +rebondreh +rebord +rebòrd +rebordar +rebordelada +rebordelar +rebordelèri +rebordèlic +rebordèri +rebòrdic +rebordièra +rebordilh +rebordon +reborrar +rebors +reborsièr +reboscargh +reboscar +reboscarai +reboscavi +rebosquem +rebosquèri +rebosquetz +rebòsqui +rebossar +rebostèri +rebosticargh +rebostilhar +rebostilhum +rebostoirar +rebota +rebotaire +rebotar +rebotelhar +rebotilhar +rebotilhat +rebotinhaire +rebotinhar +rebotirh +rebotit +rebotonar +rebraç +rebraçargh +rebracejargh +rebram +rebrèc +rebrèca +rebregargh +rebrembar +rebridar +rebrodar +rebrodèri +rebròdic +rebrolhar +rebrolharai +rebrolhavi +rebrolhem +rebrolhèri +rebrolhetz +rebronda +rebrondada +rebrondaire +rebrondar +rebrondatge +rebrondilhas +rebrondrum +rebronhirh +rebrot +rebrotada +rebrotar +rebrotum +rebruèlhi +rebrugargh +rebrulhar +rebrusirh +rebrutlar +rebuc +rebucada +rebufada +rebufal +rebufar +rebufelar +rebufelèri +rebufèlic +rebugabartàs +rebugada +rebugadament +rebugaire +rebugal +rebugargh +rebugàs +rebugassit +rebugatge +rebulhirh +reburgalhar +rebusada +rebusaire +rebusament +rebusar +rebussar +rebut +rebutant +rebutar +rèc +recabalar +recabalat +recabironar +recabús +recabussada +recabussar +recaçargh +recadelar +recadelèri +recadèlic +recagargh +recairai +recaire +recaironar +recaladar +recalar +recalcargh +recalçargh +recalendaire +recaliu +recalivada +recalivar +recambi +recampadís +recampadura +recampaire +recampar +recanada +recanar +recantar +recanton +recantonar +recap +recapelar +recapelèri +recapèlic +recapi +recàpia +recapitular +recaptador +recaptaire +recaptalha +recaptar +recaptason +recapte +recaptós +recapvirar +recar +recar +recarai +recardar +recardariá +recardièr +recarga +recargargh +recargue +recarirh +recarrelar +recarrelèri +recarrèlic +recartenièr +recarzirh +recasent +recasèri +recasi +recasiái +recassa +recast +recastenar +recasuda +recasut +recatar +recauç +recaucargh +recauçargh +recaufar +reçaupre +recauquilh +recauquilhar +recauquilhatge +reçaure +recausirh +recavada +recavaire +recavar +recavi +recavilhar +recebable +recebedor +recebeire +recebement +recebèri +recebi +recebiái +recebrai +recebre +recebuda +recebudas +recebut +recebut +recebuts +recelada +recelaire +recelament +recelar +recenar +recenchar +recensar +recent +recentament +recentrar +recep +recepaire +recepar +recepatge +recepcion +recepcionar +recépia +recepiam +recépian +recépias +recepiatz +recepon +recepta +recèpta +receptar +receptèri +recèptic +receptor +recèrc +recèrca +recercar +recercargh +recercar +recercarai +recercavi +recerclar +recerquem +recerquèri +recerquetz +recèrqui +recès +recessiu +recessivitat +receuclar +recidivar +recinglar +recintar +recipient +recipròc +recipròcament +recit +recitar +reclam +reclamacion +reclamar +reclantirh +reclauguèri +reclaurai +reclaure +reclaus +reclausa +reclausent +reclausi +reclausiái +reclinar +reclòc +reclogem +reclogèri +reclogetz +reclojar +reclojarai +reclojavi +reclòt +recluègi +recluguèri +reclujar +reclurai +reclure +reclus +reclusa +reclusent +reclusi +reclusiái +rècmairal +rècmòrt +recobrable +recobrada +recobrament +recobrar +recòbre +recobrèri +recòbric +recobrirh +recocada +recocar +recocar +recocavi +recocrai +recochon +recofar +recofèri +recòfic +recoguèri +recoide +recòire +recolament +recolar +recolhirh +recoltar +recoltèri +recòltic +recolum +recomandable +recomandacion +recomandaire +recomandar +recomautar +recombinason +recomença +recomençargh +recomoutar +recomoutèri +recomòutic +recompassar +recompausar +recompensa +recompensar +recomplidor +recomplirh +recomprar +recomptament +recomptar +reconciliar +reconcilièri +reconcíliic +reconduch +reconducha +reconduguèri +reconduirai +reconduire +recondusent +recondusi +recondusiái +reconeguda +reconeguèri +reconegut +reconeisent +reconeissable +reconeissença +reconeissent +reconéisser +reconeisserai +reconeissi +reconeissiái +reconeissut +reconflar +reconfòrt +reconfortable +reconfortar +reconfortèri +reconfòrtic +reconhar +reconoguda +reconoguèri +reconogut +reconoissent +reconóisser +reconoisserai +reconoissi +reconoissiái +reconquista +reconquistar +reconsirar +reconsolar +reconsolèri +reconsòlic +reconstituirh +recontar +recontorn +reconvalirh +recopa +recopadura +recopament +recopar +recopèri +recopiar +recopièri +recòpiic +recòpii +recoquem +recoquèri +recoquetz +recòqui +recorbar +recòrd +recordança +recordar +recordèri +recòrdic +recordonar +recordurar +recòrn +recoronar +recorreguda +recorreguèri +recorregut +recorrent +recórrer +recorrerai +recorri +recorriái +recorrirh +recors +recosent +recóser +recoserai +recosèri +recosi +recòsi +recosiái +recossidar +recosuda +recosut +recòta +recotar +recotelar +recotelèri +recotèlic +recotèri +recòtic +recotin +recreacion +recreament +recreança +recrear +recreèri +recreguda +recreguèri +recregut +recrèïc +recreirai +recreire +recreissent +recréisser +recreisserai +recreissi +recreissiái +recrèri +recrescuda +recrescut +recresent +recresi +recresiái +recresquèri +recridar +recriminar +recrocar +recrocar +recrocarai +recrocavi +recrocut +recroissit +recrompar +recroquem +recroquèri +recroquetz +recròqui +recroquilhar +recrosar +recrostets +recrostilhon +recrutaire +recrutament +recrutar +rectangular +rectificargh +rectitud +rector +rectoral +rectorejargh +rectoriá +recuèch +recuècha +recuèit +recuèita +recuèlh +reculada +reculador +reculaire +reculament +recular +reculèri +reculhida +reculhiment +reculhirh +reculirh +recuòlic +recuperacion +recuperar +recuperèri +recupèric +recura +recurada +recuradís +recurador +recuraire +recurar +recuratge +recurilha +recuron +recurréncia +recurum +recusar +rechauchon +rechichinar +rechifrar +rechinchirh +rechiquetar +redable +redaccion +redactor +redactritz +redalh +redalhar +redarguirh +redaurar +redavalar +reddament +redde +reddesirh +redebanar +redeguda +redeguèri +redegut +redemandar +redement +redémer +redemerai +redemèri +redemi +redemiái +redemuda +redemut +redent +redent +redèri +redescendreh +redeurai +redeure +redevable +redevença +redevent +redevi +redeviái +redi +rediái +redich +redich +redicha +redifusion +redigirh +rediguèri +redimirh +redintrar +redirai +redire +redireccion +redisent +redisi +redisiái +redit +redoblament +redoblar +redobtable +redobtar +redòl +redòla +redolada +redolaire +redolar +redoléncia +redolent +redolèri +redolet +redòlic +redolièr +redolon +redolum +redonar +redond +redondal +redondància +redondar +redondedat +redondèl +redondet +redondetat +redondièira +redondon +redonhadura +redonhar +redor +redòrt +redòrta +redortar +redortèri +redòrtic +redortièra +redrai +redralhar +redre +redreçador +redreçaire +redreçament +redreçargh +redreiçargh +redruit +reduccion +reduct +reductor +reductritz +reduch +reduch +reducha +reduda +reduguèri +reduirai +reduire +redusent +redusi +redusiái +redusirh +redut +reelegirh +reeligible +reencadenar +reencoratjargh +reestacargh +reestudiar +reestudièri +reestúdiic +refachar +refachons +refaire +refalsada +refar +refastar +refasti +refastigargh +refastigós +refastinar +refastinhar +refastinhós +refastum +refauda +refaudirh +refaudís +refend +refendreh +referénciament +referenciar +referencièri +referénciic +referèndum +referent +referirh +refermar +refermar +refermèri +refèrmic +refernirh +refestinar +refestugargh +refichar +refièra +refigurar +refilar +refissar +reflam +reflambor +reflamejargh +reflectirh +reflexion +reflorirh +reflotar +reflotèri +reflòtic +refluirh +reflús +reflúses +refochin +refofar +refoguèri +refoirai +refòire +refoissar +refòl +refolar +refole +refolèri +refondar +refondreh +refonfonhar +refonzar +reforfolhar +reforfum +reforma +reformable +reformaire +reformar +refòrt +refortiment +refortirh +refòs +refosa +refosegargh +refosent +refòsi +refosiái +refotgem +refotgèri +refotgetz +refòtgi +refotjar +refotjarai +refotjavi +refractar +refranch +refranh +refregida +refregidor +refregiment +refregirh +refrejador +refrejament +refrenaire +refrenament +refrenar +refresc +refrescada +refrescadís +refrescador +refrescadum +refrescadura +refrescaire +refrescament +refrescant +refrescargh +refrescatge +refresquèri +refresquiment +refresquirh +refresquissent +refretada +refretar +refrigerador +refrigerar +refrigerèri +refrigèric +refrigèri +refronzinhadura +refronzinhar +refronzirh +refudar +refugi +refugiar +refugièri +refúgiic +refugirh +refús +refusar +refut +refutar +rega +regach +regachar +regacholon +regachon +regada +regadura +regaginar +regajargh +regal +regalada +regaladura +regalaire +regalant +regalar +regalécia +regaleg +regalejargh +regalèmus +regalhardirh +regalian +regalida +regambilhar +regandirh +regandit +reganèl +reganh +reganhada +reganhadament +reganhal +reganhar +reganhàs +reganhon +reganhonar +reganhós +reganhut +reganilha +regantadís +regantar +regargh +regard +regardadís +regardador +regardadura +regardament +regardant +regardar +regardèla +regardons +regardós +regarirh +regarnirh +regàs +regassada +regassar +regassatge +regastinhar +regat +regata +regatejargh +regatièr +regaud +regaudiment +regaudinar +regaudinatge +regaudirh +regaujós +regaular +regaunhada +regaunhaire +regaunhar +regaunhejargh +regaunhós +regausença +regausilh +regausiment +regausirh +regausiu +regaussar +regemirh +regéncia +regent +regentar +regèri +reget +regetal +regetar +regetèri +regètic +regiblar +regicida +regicidi +regidor +regiginar +regim +regimar +regiment +regina +region +regional +regionalizacion +regionalizacion +regipar +regirh +regisclada +regiscladís +regiscladura +regisclal +regisclant +regisclar +regiscle +registèl +registirh +registrament +registrar +registre +regitar +règla +reglada +regladament +regladura +reglaire +reglament +reglamentacion +reglamentar +reglamentari +reglamentària +reglanaire +reglanar +reglanum +reglar +reglatge +reglèri +reglet +règlic +reglòt +regobiar +regobiar +regobièri +regòbii +regobilhar +regòla +regolada +regolaire +regolament +regolant +regolar +regolar +regolatge +regolejargh +regolèri +regolet +regòli +regòlic +regolièr +regolirh +regolisti +regolit +regolitge +regolum +regomàs +regomassar +regomèla +regon +regordet +regordon +regorgargh +regorgem +regorgèri +regorgetz +regòrgi +regorjar +regorjar +regorjarai +regorjavi +regortilhar +regraciar +regracièri +regràciic +regraissar +regrelhar +regression +regrilh +regrilhar +regrolaire +regrolar +regrolièr +regropar +reguejargh +reguèl +reguerga +reguergar +reguergar +reguergarai +reguergavi +reguergue +reguerguem +reguerguèri +reguerguetz +reguèrgui +reguièr +reguilhar +reguinhar +reguirguilhar +reguitnada +reguitnaire +reguitnal +reguitnar +reguitnatge +reguitnèra +reguitnet +reguitnós +regulacion +regulament +regular +regulara +regularament +regularisar +regularizar +regulars +regussar +rei +reial +reialament +reialisme +reialista +reialme +reialtat +reiaton +reibelet +reimprimirh +reina +reinatge +reinaubi +reineta +reintroduccion +reinvendicacion +reinvendicargh +reirai +rèiraujòl +rèirausirh +reire +rèire +rèireband +rèirebelet +rèirebotiga +rèirecòr +rèirefais +rèirefièra +rèirefilha +rèiregarda +rèiregost +rèiregrand +rèiregrand +rèiregrand +rèiregrandmaire +rèirejorn +rèireman +rèiremargue +rèirendeman +rèirenebot +rèirenom +rèireoncle +rèireoncle +rèirepè +rèirepel +rèirepensada +rèiresolelh +rèiretanta +rèiretanta +rèiretemps +reissòla +rèiva +reivaire +reja +rejar +rejonch +rejoncha +rejoncha +rejonchar +rejónger +rejonguèri +rejonhent +rejónher +rejonherai +rejonhi +rejonhiái +rejontar +rejovenar +rejovenirh +rejúnher +rejunhirh +rejunta +rejuntar +relacion +relais +relaissar +relaisset +relambi +relanar +relançargh +relant +relarg +relargador +relargargh +relargatge +relassadura +relassar +relat +relatar +relatiu +relegar +relegar +relegarai +relegavi +relegirh +releguem +releguèri +releguetz +relègui +relencargh +relenquirh +relentirh +relèu +relèva +relevadura +relevaire +relevar +relevat +relevèri +relèvic +relha +relhar +religadura +religaire +religargh +religatge +religion +religiós +relíquia +reliquiari +reliurament +reliurar +reliusar +relogar +relogar +relogarai +relogavi +reloguem +reloguèri +reloguetz +relògui +relòpi +relòtge +relotgièr +relotjariá +relucaire +relucargh +relusent +relusirh +rem +remaire +remaisa +remaisar +remalonar +remanar +remanda +remandament +remandar +remanejament +remanejargh +remaonar +remar +remarcablament +remarcable +remarcaire +remarcargh +remargada +remargargh +remaridar +remàs +remascada +remassada +remassar +remasset +remastegargh +remaus +remausar +remausirh +remborsament +remborsar +remèdi +remediable +remediar +remediarai +remediavi +remediem +remedièri +remedietz +remèdii +remembrança +remembrar +remembre +rememoriar +rememorièri +rememòriic +remenada +remenadís +remenaire +remenar +remenda +remendaire +remendar +remendatge +remenilh +remerciament +remerciar +remerciarai +remerciavi +remerciem +remercièri +remercietz +remèrcii +remés +remés +remesa +remesa +remesatge +remesclar +remesent +remesurar +remetreh +remialhar +remicoladet +remicolar +remifada +remifar +remirabla +remirable +remiracion +remirandas +remirar +remisa +remisar +remocada +remocargh +remochinada +remochinar +remoguda +remoguèri +remogut +remòl +remolada +remolat +remolcaire +remolcargh +remolcatge +remolhar +remoliment +remolin +remolinada +remolinadís +remolinejargh +remolinet +remolirh +remolitge +remolnar +remolut +remondaire +remondar +remondilhas +remondum +remontada +remontador +remontament +remontar +remora +remòrca +remorcar +remordent +remordèri +remòrdi +remordiái +remordirh +remordrai +remòrdre +remorduda +remordut +remòrs +remós +remosar +remostachar +remostegargh +remostejargh +remostrar +remostrèri +remòstric +remourai +remòure +removent +remòvi +removiái +rempegargh +rempegós +rempelar +rempelèri +rempèlic +remplaçament +remplaçargh +remplec +remplegargh +remplet +rempliment +remplirh +remplumar +Rems +remudar +remudas +remudatge +remulhar +Ren +ren +rena +renadissa +renadiu +renais +renaissança +renaissent +renaissent +renàisser +renaisserai +renaissi +renaissiái +renan +renar +renascuda +renascut +renasquèri +renaubi +renavièr +renca +renda +rendable +rendat +rendeire +rendement +rendetz-vos +rendièr +rendiu +rendòla +rendreh +rendut +renèc +renegable +renegaire +renegament +renegar +renegar +renegarai +renegat +renegavi +renegon +reneguem +reneguèri +reneguetz +renègui +renfortirh +reng +renga +rengada +rengargh +renguièra +renguierada +renhar +renhòta +renòcha +renòche +renom +renomenada +renomenar +renonciacion +renonciament +renonciar +renoncièri +renónciic +renós +renosar +renòu +renovaire +renovament +renovar +renovèl +renovelable +renovèlament +renovelar +renovelèri +renovèlic +renovèri +renòvic +renòvi +renòviá +renovièr +renovum +rentalha +renut +renvèrs +renviarazh +reobertura +reorganizacion +repa +repagargh +repairar +repaire +repais +repaissar +repaissent +repàisser +repaissi +repaissòla +repalmar +repapi +repapiadís +repapiaire +repapiar +repapiatge +repapièri +repàpiic +repapilhar +repapilhotar +repapilhotèri +repapilhòtic +repapirh +repapussar +repar +reparable +reparacion +reparaire +reparar +repareguda +repareguèri +reparegut +repareissent +reparéisser +repareissi +reparticion +repartida +repartidor +repartirh +repascuda +repascut +repasimar +repasiment +repasquèri +repassa +repassada +repassar +repassatge +repasson +repastar +repatinar +repatriarazh +repatumar +repaumar +repaus +repausada +repausador +repausar +repausòla +repavar +repè +repèbatreh +repedaçaire +repedaçargh +repedaçatge +repedaçum +repel +repelar +repelèri +repelhar +repèlic +repench +repencha +repenchenar +rependreh +repenedent +repenedèri +repenèdi +repenediái +repenedrai +repenèdre +repeneduda +repenedut +repenguèri +repenhent +repénher +repenherai +repenhi +repenhiái +repenjargh +repensar +repenténcia +repentent +repentida +repentidor +repentiment +repentirh +repepiar +repepièri +repèpiic +repepina +repercutirh +reperpilhar +repertòri +repertoriar +repertorièri +repertòriic +repesar +repesar +repescargh +repescolhar +repesèri +repèsic +repessar +repestelar +repestelèri +repestèlic +repetaçargh +repetada +repetant +repetarabh +repeteire +repetelat +repetenaire +repetenar +repetenat +repetèri +repetetiu +repètic +repeticion +repetidor +repetièr +repetilha +repetingargh +repetirh +repetum +repic +repicada +repicador +repicargh +repimpar +repinça +repinçargh +repintar +repipilhar +repiquet +repiutar +replaçargh +replanar +replanat +replanatge +replanièr +replantar +replastrar +replegargh +replica +replicaire +replicargh +reploguda +replogut +replorar +replòu +replòura +replòure +replumar +repoblar +repoblèri +repòblic +repoda +repodar +repofar +repogem +repogèri +repogetz +repojament +repojar +repojarai +repojavi +repolirh +repols +repompèl +repompelet +repompida +repompirh +repon +reponar +reponchon +reponchon +repongirh +reporgargh +repòrt +reportar +reportatge +reportèri +repòrtic +reportièr +repós +reposc +reposcargh +repossador +repossar +repòsta +repostar +repostèri +repòstic +repotalat +repotason +repotèc +repotega +repotegaire +repotegargh +repotinar +repotirh +repòtis +repotolhat +reprement +reprémer +repremerai +repremèri +repremi +repremiái +repremirh +repremuda +repremut +reprendrai +reprendre +reprene +reprenent +reprenent +reprenguèri +repreni +repreniái +reprentatiu +représ +represa +represa +represalha +representacion +representant +representar +representatiu +representatiu +repression +reprim +reprimendar +reprimirh +reprochable +reprochar +reprochèri +repròchic +repròchi +reproduccion +reproductor +reproductritz +reproduch +reproducha +reproduguèri +reproduirai +reproduire +reprodusent +reprodusi +reprodusiái +reprodusirh +reprovacion +reprovar +reprovèri +repròvic +reptil +Republica +republica +republican +repudiarazh +repuègi +repugnància +repugnar +repujargh +repulsion +repullar +repurgargh +reputacion +reputar +requem +requereguèri +requeréncia +requerent +requerent +requèri +requeriái +requerida +requerirh +requerit +requerrai +requèrre +requesirh +requèsta +requetz +rèqui +requièm +requièri +requilhar +requincargh +requinquilhar +requisicion +requisitòri +requist +requist +requista +requista +requistar +requit +requitar +res +res-non-còst +res-non-còsta +resal +rescaçada +rescaçargh +rescalfar +rescalorirh +rescan +rescapar +rescaptar +rescat +rescaud +rescaudar +resclacadís +resclacargh +resclansirh +resclantida +resclantiment +resclantirh +resclantissent +resclauguèri +resclaurai +resclaure +resclaus +resclausa +resclausa +resclausada +resclausaire +resclausar +resclausent +resclausi +resclausiái +rescompassar +rescondal +rescondalha +rescondeire +rescondilhons +rescondon +rescondreh +resconduda +rescontrar +rescossa +rescòstas +rescostièra +rescrich +rescricha +rescridar +rescriguèri +rescriurai +rescriure +rescrivent +rescrivi +rescriviái +rese +resement +resémer +resemerai +resemèri +resemi +resemiái +resemuda +resemut +resenda +resent +reservacion +reservar +reservèri +resèrvic +resesiái +resestirh +resi +resiái +residéncia +resident +residirh +residú +residús +resignar +resilha +resilhar +resiliar +resilièri +resíliic +resina +resinginar +resinós +resisténcia +resistent +resistirh +resòl +resolguda +resolguèri +resolgut +resoluble +resolucion +resòlver +resolverai +resòlvi +resolviái +resòlvre +resonzadura +resonzar +resorgargh +respalma +respalmar +respectar +respècte +respectèri +respèctic +respectiu +respectiva +respectuós +respechar +respechèri +respeitar +respeitèri +respèitic +respelida +respelirh +respet +respetar +respetar +respetèri +respètic +respièch +respièchic +respièit +respirable +respiracion +respiralh +respirament +respirar +respiratòri +respiratòria +resplandirh +resplendença +resplendent +resplendiment +resplendirh +resplendor +respondeire +respondent +respondre +respondut +respóner +responsa +responsabilitat +responsabla +responsable +respòs +resposc +resposcadís +resposcargh +resposquet +respotirh +resquilhada +resquilhador +resquilhaire +resquilhant +resquilhar +resquilhatge +resquilhós +resquit +resquitar +rèssa +ressabuda +ressaca +ressada +ressador +ressaibre +ressaire +ressalpicargh +ressanar +ressar +ressarament +ressarcirh +ressarclar +ressarrar +ressasi +ressasiament +ressasiant +ressasiar +ressasièri +ressàsiic +ressasirh +ressaucilhat +ressaupicargh +ressaut +ressautament +ressautar +ressèc +ressecargh +ressegaire +ressegar +ressegar +ressegarai +ressegavi +ressegrai +ressègre +resseguda +ressegueire +resseguem +resseguent +resseguèri +resseguetz +ressègui +ressègui +resseguiái +resseguirh +ressegut +resseirai +ressèire +ressemblaire +ressemblança +ressemblant +ressemblar +ressemenar +ressentida +ressentiment +ressentirh +resserbe +ressèri +ressesent +ressèsi +rèssic +ressiègre +ressignar +ressilha +ressoc +ressoca +ressocargh +ressolaire +ressolar +ressolàs +ressolatge +ressolèri +ressòlic +resson +ressonar +ressondidós +ressondirh +ressontirh +ressopar +ressopet +ressopetar +ressorça +ressorgentar +ressorsa +ressòrt +ressortirh +ressòt +ressoudar +ressoudèri +ressòudic +ressovenença +ressovenirh +ressusar +ressuscitar +rest +rèsta +restabliment +restablirh +restacargh +restamar +restampar +restanc +restança +restancaire +restancament +restancargh +restant +restar +restaurada +restauraire +restaurament +restaurant +restaurar +restèri +rèstic +restincle +restinclièira +restituirh +restoblada +restoblaire +restoblar +restoble +restòla +restondirh +restontida +restontidís +restontidós +restontiment +restontirh +restontissent +restòri +restranglar +restrecirh +restrech +restrechiment +restrechirh +restrench +restrencha +restrénger +restrengueri +restrenheire +restrenhement +restrenhent +restrénher +restrenherai +restrenhi +restrenhiái +restropar +restructuracion +restrunh +resular +resulta +resultar +resultat +resumirh +resumit +resurgargh +resurgirh +ret +retaconar +retalh +retalha +retalhar +retalhatge +retamisar +retanòc +retapament +retapar +retapissar +retard +retardament +retardar +retardièr +retardiu +retardivar +retastar +retaussar +reteissent +retéisser +reteisserai +reteissi +reteissiái +retemptar +retenal +retench +retencha +retenedor +reteneire +retenement +retenença +retenent +reténer +retenerai +retenguda +retenguèri +retengut +retenhent +reténher +retenherai +retenhi +retenhiái +reteni +reteniái +retenir +retentar +retescuda +retescut +retesquèri +reteulejargh +reteulissar +reticador +reticargh +reticéncia +reticós +retipaire +retipar +retipe +retiplaire +retiplar +retiple +retira +retirada +retiraire +retirament +retirança +retirar +retiratge +retna +retòca +retocament +retocar +retocar +retocarai +retocavi +retolicargh +retombada +retombador +retombadura +retombar +retombat +retombatge +retombet +retondedor +retondilhas +retondreh +retonirh +retoquem +retoquèri +retoquetz +retòqui +retorcedís +retorcedoira +retorceire +retòrcer +retorcerai +retorcèri +retòrci +retorciái +retorçuda +retorçut +retorgaire +retorgar +retorgar +retorgarai +retorgavi +retorguem +retorguèri +retorguetz +retòrgui +retoricargh +retorn +retornada +retornament +retornar +retornèl +retorquirh +retòrs +retòrsa +retòrt +retortilh +retortilhar +retrabalhar +retraçargh +retractament +retractar +retrach +retrach +retracha +retraguèri +retrairai +retraire +retrait +retrasença +retrasent +retrasi +retrasiái +retrassar +retraucargh +retremp +retrempar +retrencament +retribucion +retribuirh +retrissar +retroactiu +retrobar +retrobèri +retròbic +retrocedirh +retrogargh +retrogradar +retrolhar +retrolhar +retrolharai +retrolhavi +retrolhem +retrolhèri +retrolhetz +retronadís +retronar +retroniment +retronirh +retronissent +retrós +retrossar +retroversar +retroversèri +retrovèrsic +retrovirus +retruèlhi +retrum +retrunhirh +retrunirh +retunirh +retutèla +rèu +rèuma +reumós +reünion +reünionés +reünirh +reüssirh +reva +revalejargh +revalorisar +revalorizar +revar +revegèri +reveirai +reveire +revelament +revelar +revelh +revelhada +revelhadís +revelhaire +revelhar +revelhet +revelhièr +revelhon +revelhonar +revelin +reven +revenar +revencirh +revenda +revendariá +revendeire +revendejargh +revendicargh +revendrai +revendreh +revenença +revenent +revenent +revenge +revenguda +revenguèri +revengut +revengut +reveni +reveniái +revenir +revenja +revenjaire +revenjargh +reventar +reverar +reverbèr +reverberar +reverberèri +reverbèric +reverd +reverdaci +reverdejargh +reverdèla +reverdirh +reverdissent +reverdum +reveréncia +reverencial +reverèri +revergargh +revèric +revèrs +revèrsa +reversada +reversament +reversar +reversenc +reversèri +reverseta +revèrsic +reversièr +reversinar +revèrt +revertar +revertegargh +revertèri +revertèri +revèrtic +revertiguet +revertut +revesent +revéser +revesi +revesiái +revesirh +revesitar +revestiment +revestirh +revira +reviracoet +revirada +reviradaire +reviradatge +reviradura +reviral +reviramarion +revirar +reviret +reviròla +revirolar +revirolèri +reviròlic +reviron +revironda +revisar +reviscòl +reviscòla +reviscolada +reviscoladís +reviscolaire +reviscolament +reviscolant +reviscolar +reviscolèri +reviscolet +reviscòlic +reviscuda +reviscut +revisionista +revisquèri +revist +revista +reviudacion +reviudaire +reviudament +reviudar +reviudatge +reviurai +reviurar +reviure +reviurós +revivent +revivi +reviviái +revivificacion +reviviscéncia +revòbis +revocable +revocar +revocar +revocarai +revocavi +revogada +revogem +revogèri +revogetz +revoidar +revojar +revojarai +revojavi +revòl +revolar +revolèri +revòlic +revòlta +revoltar +revoltèri +revòltic +revolucion +revolucionar +revolucionari +revolucionària +revolum +revolumada +revolumar +revolver +revolvèr +revolzar +revólzer +revòlzer +revoquem +revoquèri +revoquetz +revòqui +revousent +revòuser +revouserai +revousèri +revousi +revousiái +revousuda +revousut +revuègi +revujargh +Reykjavík +riá +rial +riala +rialet +riassa +riba +ribada +ribairòl +ribal +riban +ribanariá +ribanejargh +ribanet +ribanièr +ribàs +ribassa +ribassejargh +ribassut +ribatge +ribaud +ribaudalha +ribaudar +ribaudariá +ribeirarrh +ribejaire +ribejargh +ribieiral +ribieirar +ribieiratge +ribieirenc +ribièra +ribierar +ribierèri +ribièric +ribla +ribladura +riblatge +rible +ribosòma +ribotejargh +ric +ricament +ricanar +richon +richonar +richonatge +richonejaire +richonejargh +ridar +ridèl +ridelar +ridelèri +ridèlic +ridicul +ridiculisar +ridiculizar +riège +rièja +riejar +riejat +rifanhada +rifanhadís +rifanhar +rifla +rifladar +riflar +Riga +rigal +rigaud +rigaudon +rigid +rigol +rigolar +rigolar +rigolèri +rigòlic +rigolistís +rigor +rigòt +rigotar +rigotèri +rigòtic +riguèri +rilh +rille +rima +rimada +rimadís +rimadura +rimaire +rimalha +rimalhaire +rimalhar +rimar +rimassar +rimassejargh +rimatge +rimejargh +rimelejargh +rimonar +rimonejargh +rimor +rinçada +rinçargh +ringa +ringaire +ringargh +ringoleta +ringue +rinoceròs +rintrar +riòla +riòsta +riostada +riostar +riostèri +riòstic +riostós +riòta +ripar +riquesa +riquet +riqueta +riquetejargh +rirai +rire +ris +risada +risalha +risariá +risc +risca +riscable +riscaire +riscargh +riscós +riseire +risejargh +risen +risent +ríser +riserèl +riset +risi +risiái +risiblament +risible +risièra +risolejargh +risolent +risolet +risolièr +rispa +rispada +rispaire +rispar +rispeta +rista +ristaire +rit +rite +riteta +ritmar +riton +ritona +ritual +riu +riule +riusset +rival +rivalisar +rivalizar +rivassèl +rivatèl +rivet +rivetar +Roan +roant +roard +robal +ròbi +robiaca +robin +robinejargh +robinon +robust +ròc +rocada +rocadèla +rocairòl +rocalha +rocalhàs +rocalhós +rocam +rocar +rocarai +rocareda +rocàs +rocassam +rocassièr +rocassós +rocassut +rocavi +rocolar +roconada +roconament +roconar +rochacuòla +rochacuolons +rochada +rochar +Rochèla +ròda +ròdabèla +rodada +rodaire +rodal +rodalièr +rodam +rodament +rodanenc +rodar +rodassejargh +rodatge +ròdavèrsa +rodèl +rodelar +rodelejargh +rodelèri +rodelet +rodèlic +rodèri +Rodès +rodet +rodeta +ròdic +rodièr +rodilhaire +rodilhar +ròdol +rodonal +ròdor +rodorièr +roena +roergàs +roergat +roèrgue +roerguejargh +ròferrau +rofiaire +rofian +rofianatge +rofianejargh +rofiar +rofièri +rófiic +rofinhar +roganhar +roganhon +rogargh +rogasons +ròge +roge +rogeiràs +rogeiròla +rogejargh +rogenc +roget +rogeta +rogieiròla +rogièr +rogieràs +rogilhon +roginejargh +roginèl +roginós +rogirh +roguda +roguèri +rogut +ròia +roïna +roïnar +roïnós +roïrh +roire +ròire +roire +roireda +roissar +roissent +ròisser +ròissi +roissiái +rojairòla +rojal +rojastre +rojòla +rojor +rojós +ròl +rolhar +rolhet +rom +Roma +roman +roman +romanatge +romanch +romancha +Romanchia +romand +Romandia +romanèl +romanés +romanesc +Romanha +romanhòl +Romania +romanièr +romanin +romanisme +romanista +romb +rombalhet +rombar +rome +romec +romeca +romèca +romega +romegada +romegar +romegargh +romegar +romegarai +romegàs +romegat +romegavi +romegós +romeguem +romeguèri +romeguèri +romeguetz +romèguic +romègui +romeguièr +romesc +romesi +ròmia +romiaire +romiar +romièri +romieu +romieuatge +romieva +romievatge +rómiic +rompable +rompedor +rompedura +rompeire +rompement +rompent +romplirh +rompre +rompreh +rompuda +rona +ronadís +ronar +ronça +roncada +ronçada +roncadís +roncaire +roncament +ronçança +roncargh +ronçargh +roncatge +ronce +roncéncia +rond +ronda +rondament +rondatge +rondejargh +rondèl +rondelar +rondelejargh +rondelèri +rondelet +rondèlic +rondilh +rondina +rondinaire +rondinal +rondinar +rondinejargh +rondinós +rondor +rondòta +ronet +ronflaire +ronflar +ronfut +rongargh +ronha +ronhaire +ronhar +ronhon +ronhonada +ronhonal +ronhós +ronza +ronzada +ronzar +ropa +ropilha +roquejargh +roquèla +roquem +roquèri +roquèri +roquet +roquetz +ròqui +roquièr +ros +ròs +ròsa +rosada +rosadar +rosadós +rosal +rosalar +rosalós +rosar +rosari +rosarinada +rosarinar +rosassa +rosat +rosatge +Ròse +ròse +rosegaire +rosegargh +rosegon +rosèla +rosembre +rosenc +rosent +rosentar +rosentirh +rosentor +rosèri +roseta +ròsic +rosicargh +rosièr +rosigargh +rosilh +rosilhon +rosina +rosinalha +rosinar +rosís +rosòla +rospiar +rospièri +róspiic +rosquilha +rossa +ròssa +rossada +rossaire +rossalha +rossan +rossana +rossanèla +rossar +rossard +rossas +rossatalha +rossatièr +rossatin +ròsse +rossèc +rossega +rossegada +rossegargh +rossegatge +rossejargh +rossèl +rosselejargh +rosselet +Rosselhon +rosselhon +rosselhonés +rosselós +rossenc +rossèri +rosses +rosset +rosseta +ròssic +rossilha +rossilhar +rossin +rossinèl +rossinhòl +rossinholada +rossinholejargh +rossinholenc +rossinièr +rossolar +rossolèri +rossòlic +rosta +rostega +rostegargh +róstia +rostida +rostidoira +rostidor +rostilhar +rostirh +rostissal +rostissariá +rostisseire +rostit +rostolar +ròstre +rostum +rostumar +rosura +rosurar +ròt +rota +rotacion +rotaire +rotament +rotar +rotatiu +rotativa +rotèri +ròtic +rotièr +rotina +rotinat +rotlada +rotladoira +rotlador +rotlaire +rotlament +rotlar +rotlatge +ròtle +rotlèri +ròtleu +ròtlic +rotonda +rotonditat +rotreh +Rotterdam +roturièr +roussegargh +rove +roveda +roveireda +roveiròl +rovenàs +rovenet +rovièra +rovilh +rovilha +rovilhaire +rovilhar +rovilhejargh +rovilhós +rubarba +rubeòla +rubés +rubescent +rubicond +rubissa +rubrica +rubricós +ruchaquila +ruchar +rudament +rude +rudejargh +rudesa +rudirh +rudor +ruèira +rueissa +rufa +rufadís +rufar +rufe +rufeca +rufelada +rufelar +rufelèri +rufèlic +rufirh +ruga +rugargh +rugbí +rugós +ruissa +ruissat +rulhetar +rulle +rumba +rumegargh +runas +runiar +runic +runièri +rúniic +rupar +rupèstre +rural +rus +rusc +rusca +ruscadaira +ruscadar +ruscaire +ruscargh +ruscàs +ruscassat +ruscat +ruscle +ruscós +rusquejargh +russa +Russia +Russia +russula +rustambòu +ruste +rustica +rusticament +rusticargh +rustiquejargh +rutèn +rutilància +rutlar +Rwanda +rwandés +s'abaissarA +s'abandonarA +s'abarbassirA +s'abatelarA +s'abauquirA +s'aberonirA +s'abregandirA +s'abrigar +s'abrondarA +s'absténer +s'acabarA +s'acabassirA +s'acabrarA +s'acalmirA +s'acampestrirA +s'acandirA +s'acanharA +s'acanhardarA +s'acanhardirA +s'acantelirA +s'acantirA +s'acaparA +s'acaponirA +s'acarcanarA +s'acarcavelirA +s'acaselirA +s'acercar +s'aclafarA +s'aclonarA +s'acoassarA +s'acocolarA +s'acocolirA +s'acoconarA +s'acocholarA +s'acodarA +s'acodenirA +s'acodesirA +s'acogoncharA +s'acoïr +s'acolarA +s'acolobrirA +s'acompesirA +s'aconflarA +s'aconsomirA +s'acopelar +s'acoquelar +s'acoquelirA +s'acorbaissarA +s'acorbara +s'acorcossonirA +s'acordar +s'acordelar +s'acraparA +s'acrassirA +s'acrochonirA +s'acutorbarA +s'achorrirA +s'adancirA +s'adaptar +s'adonarA +s'adormirA +s'adrapirA +s'adreçarA +s'adreiçarA +s'afairarA +s'afalenarA +s'afeccionarA +s'afemorarA +s'afernar +s'afolastrirA +s'afondarA +s'afrabar +s'afranarA +s'afranquirA +s'afrescar +s'afriscar +s'afrontar +s'agalarA +s'agalissarA +s'agarlandirA +s'agarrussirA +s'agautonir +s'agendrarA +s'agerbassirA +s'agirA +s'agís +s'aglabirA +s'agladirA +s'aglatirA +s'aglebirA +s'aglenarA +s'aglevirA +s'agorrudarA +s'agraparA +s'agrapinharA +s'agrapirA +s'agratonirA +s'agrepiar +s'agrolirA +s'agrosolar +s'agrovarA +s'agrovassarA +s'aisarA +s'ajaire +s'ajàser +s'ajoguirA +s'alabardirA +s'alairarA +s'alarassarA +s'alaricar +s'alastrarA +s'alatrarA +s'alenquirA +s'aleserarA +s'alesorarA +s'aletrarA +s'alifarA +s'alincar +s'alobatirA +s'alobirA +s'alunhar +s'alurarA +s'allartarA +s'amargar +s'amassarA +s'amatarrarA +s'ameritarA +s'amodorrarA +s'amolencar +s'amoninarA +s'amostelirA +s'amotoflarA +s'anoar +s'anochejar +s'anujat +s'apaïsandirA +s'apaïsanirA +s'apalhassarA +s'apanolharA +s'apantirA +s'apapesirA +s'aparassarA +s'apastrassirA +s'apatrassara +s'apechalarA +s'apelaudirA +s'apelenquirA +s'apencar +s'apensarA +s'apercebre +s'aperdesirA +s'apetarA +s'apilocar +s'apinhastrarA +s'apinhelar +s'aplatussarA +s'apoderar +s'apoge +s'apogen +s'apogèron +s'apogèsse +s'apogèsson +s'apogèt +s'apojar +s'apojarà +s'apojaràn +s'apojava +s'apojavan +s'apolacrirA +s'apomelar +s'apostissarA +s'aprene +s'aprene +s'aprochar +s'apuèja +s'apuèjan +s'aquel +s'aquela +s'aquela +s'aquelas +s'aqueles +s'arencar +s'arracapesirA +s'arrasolar +s'arremausirA +s'arremicolarA +s'arrengar +s'arrestar +s'arrisentarA +s'arrodar +s'arroflarA +s'arrogar +s'arronzarA +s'arrossirA +s'arrotinarA +s'arrufarA +s'asairarA +s'asarbrarA +s'ascienciar +s'aspergir +s'assimarA +s'atacarA +s'atamarirA +s'atautassirA +s'atemar +s'atestirA +s'atestudirA +s'atetonirA +s'atornarA +s'atrabalhirA +s'atracharA +s'atransirA +s'atrantolirA +s'atrassarA +s'atrulhirA +s'atunirA +s'aurelar +s'avacassirA +s'avalancar +s'avalentarA +s'avaliscar +s'aviar +s'avinagrirA +s'avisarA +s'efarcimar +s'eissecar +s'eissegar +s'eissolelharA +s'embadalirA +s'embaisarA +s'embauçar +s'embefiar +s'embencar +s'embiaissarA +s'emblescar +s'emblotirA +s'embodracar +s'emboissonirA +s'embolarA +s'emboldrara +s'embordescar +s'embornar +s'embornegar +s'embracetarA +s'embregonarA +s'embrenar +s'emmaliciar +s'empaïsanirA +s'empampanarA +s'emparaulirA +s'empartirA +s'empepinarA +s'empetardirA +s'emplanarA +s'empreissarA +s'en +s'enanar +s'enarbrarA +s'enarmassir +s'enauçar +s'enaucelar +s'encabrarA +s'encadeirar +s'encalrara +s'encaminar +s'encarcasselar +s'encaremarA +s'encargar +s'encarnilharA +s'encarnissarA +s'encaronharA +s'encarquilhar +s'encarrelar +s'encatarinarA +s'encatarriar +s'encaunarA +s'enclancar +s'encloscar +s'encocolarA +s'encodenirA +s'encoirarA +s'enconilharA +s'enconsomirA +s'encovenarA +s'encreire +s'encréisser +s'encrestirA +s'encrosilharA +s'enchotar +s'endiamarA +s'endignarA +s'endomaiselencar +s'endomaiselirA +s'enemigar +s'enermassirA +s'enfadesirA +s'enfarcimarA +s'enfistrarA +s'enfloroncar +s'enfogassetarA +s'enfoirarA +s'enforbandirA +s'enforçar +s'enfosinarA +s'enfredarA +s'enfregirA +s'enfronharA +s'enfruchirA +s'enfugirA +s'engafarA +s'engalafatarA +s'engalarA +s'engalhostarA +s'engalinarA +s'engamassirA +s'enganarrarA +s'engandalharA +s'engaracharA +s'engargassarA +s'engarrapetarA +s'engatjar +s'engautejarA +s'engendrarA +s'engordilharA +s'engorgalarA +s'engorgossarA +s'engorgovelharA +s'engormossarA +s'engorrinarA +s'engorrinirA +s'engorrudarA +s'engrafolirA +s'engrimarA +s'enguindarA +s'enmatelotar +s'enquerirA +s'enquestar +s'enquiquiricar +s'enrasimarA +s'enraufelar +s'enrebelirA +s'enretnarA +s'enrire +s'enromegar +s'enrosalarA +s'enròtlaA +s'enrufarA +s'enrugar +s'ensalvarA +s'ensenhorirA +s'ensidernar +s'ensocar +s'ensovenirA +s'ensuperbirA +s'entendre +s'enternar +s'entestesirA +s'entortobilharA +s'entracharA +s'entraularA +s'entrebaisarA +s'entrebalharA +s'entrebatreA +s'entrecridarA +s'entredire +s'entreferirA +s'entrefurarA +s'entregafarA +s'entrelacharA +s'entremacar +s'entresenhar +s'entresenhar +s'entressentirA +s'entressomirA +s'entressonarA +s'entretustarA +s'entreularA +s'entrevar +s'entronharA +s'entufarA +s'entuvelirA +s'envanarA +s'envolar +s'èra +s'èri +s'ermassirA +s'es +s'esbalançar +s'esbardosirA +s'esbatreA +s'esbiçolar +s'esboldrarA +s'esbolinarA +s'esbrenarA +s'escabornirA +s'escaganharA +s'escalfestrar +s'escamarrarA +s'escapar +s'escarafirA +s'escaramiarA +s'escarcanarA +s'escarcanelar +s'escarmalharA +s'escarpoirarA +s'escaunharA +s'esclafalharA +s'esclamarA +s'escofrarA +s'esconflarA +s'esconilharA +s'escrancar +s'escraparA +s'escrimarA +s'escrocar +s'escurarA +s'esfalharA +s'esfangassarA +s'esfigurarA +s'esfogalharA +s'esfolirA +s'esfolissarA +s'esfondreA +s'esforçar +s'esgalinarA +s'esgalissarA +s'esgargamelar +s'eslançar +s'esmaiar +s'espacejar +s'espalaficar +s'espalaissarA +s'espalarA +s'espalhassarA +s'espalmonarA +s'espalussarA +s'espandir +s'espassionarA +s'espatanarA +s'espautarA +s'espaventarA +s'espeitrinarA +s'espelufarA +s'espenarA +s'esperjurarA +s'espevinharA +s'espisolarA +s'esplafarA +s'espocharrarA +s'espofinarA +s'esquitarA +s'establirA +s'estarenglarA +s'estarirA +s'estartira +s'estequirA +s'esterrolharA +s'estirar +s'estonarA +s'estorrelharA +s'estorrolharA +s'estrantalarA +s'estrefalirA +s'estresaurarA +s'estrevelirA +s'estricar +s'estrolhirA +s'estroparA +s'esvanarA +s'esvanesirA +s'esvanirA +s'evasirA +s'evitar +s'explicar +s'exprimir +s'extravirar +s'i +s'igar +s'impausaA +s'impausar +s'inquietar +s'installar +s'insurgirA +s'iragar +s'iretjar +s'isolar +s'ocupaA +s'ocupar +s'omenirA +s'opausar +s'organizar +s'organizar +s'unir +sa +saarian +saba +sabagòl +sabar +sabarnaud +sabartés +sabat +sabata +sabatada +sabatar +sabatariá +sabatàs +sabatejargh +sabatèla +sabatièr +sabaton +sabatòri +sabaud +sabèa +sabença +sabent +sabentalha +sabentament +sabentat +sabentós +sabentura +saber +saberut +sabèu +sabi +sabiái +sabin +sablaire +sablairòla +sablar +sablàs +sable +sableta +sablièr +sablonar +sablonenc +sablonièr +sablonós +sablós +sablum +sablut +sabon +sabonada +sabonadís +sabonaire +sabonar +sabonariá +sabonatge +sabonejargh +sabonèla +saboneta +sabonièr +sabonós +sabor +saboral +saborar +saborejargh +saborent +saborós +sabotar +sabotejargh +sabotèri +sabòtic +sabotiment +sabotirh +sabrada +sabraire +sabrar +sabre +sabrejargh +sabron +sabuc +sac +sacada +sacal +sacamand +sacamandejargh +sacapautràs +sacargh +sacaride +sacaròsa +sacàs +sacatge +sacatjargh +sacerdòci +sacerdotal +sacietat +sacòcha +sacon +saconèl +sacotreh +sacraire +sacralizacion +sacralizar +sacrament +sacrar +sacrari +sacrason +sacre +sacrejaire +sacrejargh +sacrificador +sacrificaire +sacrificargh +sacrifici +sacrilèg +sacrilègi +sacripandejargh +sacristan +sacristia +sacsabelada +sadic +sadol +sadolable +sadolada +sadolament +sadolar +sadolitge +sadolum +sadrèia +saducèa +saducèu +safarès +safaret +safir +safran +safranada +safranar +safranièr +saga +sagaç +sagaça +sagacitat +sagaia +saganhar +sagat +sagata +sagatada +sagataire +sagatar +sagatejargh +sagatum +sagèl +sagelaire +sagelar +sagelèri +sagèlic +sageta +sagin +saginós +sagitari +sagnada +sagnadís +sagnador +sagnadura +sagnaire +sagnairòla +sagnament +sagnant +sagnar +sagnariá +sagnatge +sagnejargh +sagneta +sagnetar +sagnièira +sagnièra +sagnós +sagolut +sagotar +sagotirh +sagrar +sagron +sagrotlament +sagrotlar +sagrotlèri +sagròtlic +Sahara +saharian +sai +saia +saibre +sailar +saile +saïne +saiòla +saion +saique +saissa +sal +sala +salabrós +salabrum +saladaire +saladèla +salador +saladura +salaira +salamandra +salamèca +Salamon +salanc +salancós +salar +salari +salariar +salarièri +salàriic +salason +salat +salatge +salausirh +salavés +salcirh +salclar +salconduit +salèga +saleirada +saleiron +salejargh +salgotar +salgotirh +salhar +salhent +salhirh +salicòr +salicòrn +salida +salièr +salièra +salificar +salin +salinièr +salirh +salís +saliva +salivada +salivaire +salival +salivar +salivejargh +salivós +salm +salme +salmejargh +salmoira +salmoirar +salmon +salmonat +salon +Salonica +salonician +salòp +salòpa +salopariá +salopejargh +salpètra +salpetrièr +salpetrós +salpic +salpicargh +salposcargh +salprendrai +salprene +salprenet +salprenguèri +salpreni +salpreniái +salprés +salprés +salpresa +salsa +salsada +salsaire +salsar +salsat +salsefic +salsejargh +salseta +salsièr +salsièra +salsinadís +salsissa +salsissada +salsissaire +salsissard +salsissièr +salsisson +salsissòt +salsolhar +salson +saltar +salubretat +salubritat +saludaire +saludar +salut +salutacion +salutar +salutós +salvable +salvacion +Salvador +salvador +salvadorenc +salvagarda +salvagardar +salvament +salvar +salvar +salvason +salvatge +salvatgejargh +salvatgenc +salvatgina +salvatiu +salvatjament +salvatjariá +salvatjós +salvatjum +salvatòri +salve +salvetat +sàlvia +salviar +salvièri +sàlviic +sambejargh +sambotar +sambotèri +sambòtic +sambotirh +sambuc +sambucargh +sambuèlh +sambugueda +sambuguièra +Samoa +samoan +sampa +sampejargh +sampeta +sampilhar +sampon +samponar +samucargh +san +sanacion +sanada +sanadèla +sanadís +sanadura +sanaire +sanament +sanar +sanassejargh +sanccionar +sanclame +sanclamiar +sanclamièri +sanclàmiic +sanctificargh +sanctuari +sandalejargh +sandatívol +sanèc +sanetat +sanflorada +sanflorar +sang +sangargh +sangarinada +sangbeguda +sangbeguèri +sangbegut +sangbeurai +sangbeure +sangbevent +sangbevi +sangbeviái +sangflac +sangfreg +sanglaçargh +sanglentar +sanglot +sanglotar +sanglotejargh +sanglotirh +sangolar +sangpausar +sangsuga +sanguetar +sanguin +sanguin +sanguinada +sanguinar +sanguinari +sanguinariá +sanguineda +sanguinenc +sanguinós +sanha +sanhaire +sanhairòla +sanhar +sanhat +sanhièr +sanicargh +sanicla +saniçon +sanís +sanitari +sanitària +sanitós +sanoarazh +sanquet +sansaga +sansavi +sansibola +sansoira +sansoirós +sansolha +sansolhar +sansònha +sansonhaire +sansonhar +sansonhariá +sansurar +sant +santament +Santas +santat +santestevenc +santetat +Santiago +santirolet +santiron +santisme +Santonge +santongés +santongés +santós +São +sap +sapa +sapaire +sapar +sapartença +sapartirh +sapatge +sàpia +sapiam +sàpian +sàpias +sapiatz +sapiença +sapient +sapientament +sapientat +sapina +sapinalha +sapineda +sapinièra +saplonar +sapo +saprofaga +saprofague +saquamand +saquejal +saquejament +saquejargh +saquet +saquetar +saquièr +Saragossa +saragossan +Sarajevo +sarceire +sarcida +sarcidura +sarcirh +sarclada +sarcladís +sarclador +sarcladura +sarclaire +sarclar +sarclatge +sarclet +sarcletièra +sarcofag +sarcòma +sarcoplasma +Sard +sarda +sarde +Sardenha +sardina +sardinaire +sardinal +sardinièr +sardonic +sarga +sargaire +sargalh +sargalhada +sargalhar +sargalhàs +sargeta +sargolhar +sargotadís +sargotar +sargotida +sargotièra +sargotirh +sargue +sariga +sarmostar +sarnegon +sarnilhar +sarnirh +sarpar +sarpatan +sarrabastal +sarrabastejargh +sarracap +sarrada +sarradament +sarradura +sarral +sarralha +sarralhar +sarralhariá +sarralhejaire +sarralhejargh +sarralhièr +sarraliard +sarramauca +sarramaura +sarrampiu +sarrana +sarrar +sarrasin +sarrat +sarratge +sarrejargh +sarret +sarron +sartan +sartanada +sartanar +sartanejargh +sartrar +sartre +sartressa +sas +sasi +sasida +sasiment +sasina +sasirh +sason +sasonada +sasonièr +sassa +sàssic +sassigada +sassiguet +satanic +satar +satelit +satibau +satin +satinada +satinaire +satinar +satinatge +satinet +satinós +satir +satirar +satiric +satirisar +satirizar +satisfaccion +satisfaire +satisfar +satisfasent +saton +satonar +satrapa +satrapia +saturabilitat +saturabla +saturable +saturar +saturnalas +saturnian +sauç +sauclar +saudian +saufinar +saugràs +saula +saular +sauma +sauma +saumada +saumadaire +saumadar +saumalièr +saumastre +saumatar +saumaton +saumeiron +saumejargh +saumèl +saumelar +saumelèri +saumèlic +saumic +saumièr +saumierat +saumilh +saumissord +saunejaire +saunejargh +saunejós +saunièr +saupejargh +saupèri +saupetar +saupicargh +sauplar +sauprai +saupre +sauquilhada +saurar +saurenc +saurengargh +saurin +saurirh +saurra +saurraire +saurrar +sausareda +sause +sauseda +sausenca +sausinar +saussoira +saussòla +saut +sautabaranhas +sautabarralhas +sautabartas +sautabernat +sautaboc +sautacascabeta +sautada +sautador +sautagrip +sautaire +sautalaissas +sautalengrin +sautaleugièr +sautapochinchin +sautar +sautarèc +sautarèl +sautarelajaires +sautarelejargh +sautariá +sautejaire +sautejargh +sautet +sauticaire +sauticament +sauticargh +sautilhejargh +sautinejargh +sauton +sautonejargh +sautorlejargh +sauvacion +sauvaire +sauvatgin +savèl +savelada +savelenc +savelós +savi +sàvia +sàviament +saviesa +Savòia +savoian +savoiard +savoiard +scelerat +sceleratesa +scèna +scenari +scenic +sceptic +scepticism +sciatic +sciencèri +sciéncia +scienciar +sciénciic +scientament +scientific +scintilha +scintilhament +scintilhar +scission +scissiparitat +scriptum +se +se'n +sebelirh +sebissa +sebrar +sec +secada +secadís +secador +secafetge +secafetja +secaire +secairon +secalhàs +secament +secant +secarg +sécargh +secaresa +secariá +secarós +secason +secatge +seccion +seccion +seccionar +secodeire +secodèri +secodi +secodiái +secodirh +secodrai +secodre +secoduda +secoduda +secodut +secorrable +secorreire +secorrirh +secors +secós +secossa +secossa +secotesa +secotirh +secotreh +secrecion +secret +secreta +secretament +secretar +secretari +secretària +secretària +secretariat +secretejargh +secretèri +secrètic +secretós +sècta +sectari +sectaria +sector +secular +secularisa +secularizar +securitat +secutaire +secutament +secutar +seda +sedaç +sedaçaire +sedaçargh +sedaçat +sedada +sedaire +sedar +sedariá +sedatiu +sedativa +sedejargh +sedèla +sedentari +sedentària +sedicion +sediciós +sedièr +sediment +sedimentacion +sedimentar +sedimentari +sedimentària +sedon +sedós +seduccion +seductor +seductritz +seduch +seducha +seduguèri +seduirai +seduire +seduit +seduita +seduseire +sedusent +sedusi +sedusiái +sedusirh +sèga +segable +segada +segadoira +segaira +segaire +segairitz +segairòl +segal +segalar +segalièr +segalin +segar +segar +segarai +segasons +segatge +segavi +sègle +segment +segmentacion +segòl +segon +segond +segondament +segondar +segondari +segondària +segondèl +segondèl +segrai +sègre +segregacion +segudar +seguem +seguent +seguenta +seguenta +seguèri +seguetz +sègui +sègui +seguiái +seguida +seguidor +seguiment +seguirh +seguit +segur +seguraire +segurament +segurança +segurar +segurent +seguretat +segutar +Seichèlas +Sèina +seirai +sèire +seisen +seissanta +seissantar +seissanten +seissantena +seja +sejorn +sejornar +sèla +selaire +selar +selariá +seleccion +seleccionar +selèri +seleta +selha +selhada +selhar +selhatge +selhon +selhonar +selhonat +sèlic +selièr +selva +selvamaire +sèm +semafòr +semal +semalada +semalièr +semalon +semar +semblablament +semblable +semblança +semblant +semblar +semelar +semelèri +semèlic +semen +semenada +semenadís +semenador +semenaire +semenalhas +semenar +semenason +semenat +semenatge +semença +semencièr +semenièra +semestral +semèstre +semicercle +semidrecha +seminari +seminarista +semison +semola +semondreh +semonsa +semonsar +semostar +sempre +sen +senada +senàs +senat +senator +senatritz +sença +sence +sencer +sencer +sencera +sendal +sendent +sendic +sendical +sendicalisme +sendicalista +sendicargh +sendicat +sendièr +sendreh +sendreja +sened +Senegal +senegalés +senepar +senépia +senepiu +senescal +senescalciá +senèstre +sengirar +senguelh +senh +senha +senhador +senhaire +senhal +senhalaire +senhalament +senhalar +senhaletic +senhalièr +senhar +sénher +senhera +senhet +senhor +senhora +senhoral +senhoratge +senhorejaire +senhorejament +senhorejargh +senhoressa +senhoret +senhoriá +seniçon +senilh +senina +senòdi +senon +sens +sensacion +sensadament +sensat +sensenar +senserigalha +senses +sensibilisar +sensibilizacion +sensibilizar +sensibla +sensible +senteire +senténcia +sentenciar +sentencièri +senténciic +sentenció +sentenciós +sentenciosament +senticós +sentida +sentidor +sentiment +sentina +sentinèla +sentirjh +sentor +sentorassa +sentorós +senut +Seol +separable +separacion +separadament +separadoira +separador +separaire +separar +separatisme +separatisme +separtirh +sépia +sepion +sepionet +septuplar +septuple +sequèla +sequéncia +sequeral +sequestrar +sequèstre +sequestrèri +sequèstric +sequièr +ser +serà +serada +serai +seràn +seràs +serbe +sèrbe +serem +seren +serena +serenada +serenar +serenatge +serenc +serenejargh +serenitat +serenós +seretz +sergent +sergentar +sergentariá +seriá +seria +seriái +seriam +serián +seriás +seriatz +seringà +seringa +seringada +seringaire +seringal +seringargh +seringàs +seringatge +seriòla +seriós +seriosament +sermanièr +sermar +sermatge +sermon +sermonaire +sermonar +sermonari +sernassa +serom +sèrp +serpar +serpàs +serpat +serpatàs +serpatejargh +serpatièr +serpaton +serpejargh +serpelhièra +serpentaire +serpentejargh +serpentina +serpentós +serpèri +sèrpic +serpilha +serpol +sèrra +serradèl +serraire +serral +serralhon +serrar +serrat +serratge +sèrre +serrèri +serreta +sèrric +serrilhar +sertidura +sertirh +serum +sèrv +sèrva +servant +servar +servent +serventas +servèri +sèrvic +servici +serviciable +servicial +serviciós +servidor +servieta +servieton +servil +servilitat +serviment +servirh +servitud +sès +sesca +sescarèl +sèser +sèsi +sesiái +sesilha +sesilhon +sesombre +sesquiar +sesquiar +sesquièr +sesquièri +sèsquii +sesquilh +sessa +sesselega +sesselegargh +sèsta +sestairada +sestairal +sestèrci +sestièr +sestrada +sestre +sèt +set +Seta +setanta +setanten +setembral +setembre +seten +setenari +setenc +sètge +sèti +setmana +setmanada +setmanal +setmanièr +setmanon +setmeson +setòri +setòria +setós +sètz +setze +setzen +setzenc +seu +seulièr +sevar +sevèr +sevèrament +severitat +Sevilha +sevilhan +sèxe +sextuplar +sextuple +sexual +sexuala +sexualament +sexualitat +sexuar +Shanghai +si +siá +siái +siam +sián +siás +siatz +sibabis +sibèc +Siberia +siberian +siblada +sibladís +sibladura +siblaire +siblament +siblar +siblejaire +siblejargh +siblet +sibola +sibornièr +sicap +Sicília +sicilian +siclar +sicomòr +sicona +sicut +sidèrn +sidola +sièga +siègre +sièis +sièja +Sierra +siès +siesen +sieu +sifon +sifòn +sifonar +siga +sigalar +signaire +signar +signatari +signatura +signe +signet +significacion +significargh +significatiu +sigolas +sigossar +sigossèri +sigòssic +silenci +silenciós +silèx +silhar +silhetejargh +silhonar +siloèta +silvicòla +silvicultura +sillaba +simbelar +simbelèri +simbèlic +simbet +simbiòsi +simbòl +simbolic +simbolisar +simbolisme +simbolizar +simetria +simetric +simetrisar +simetrizar +simfonia +similar +similariá +similitud +similituda +simpatia +simpatic +simpatisar +simpatizar +simpladejargh +simplament +simplardariá +simplarditge +simplàs +simplassa +simple +simplesa +simplet +simpletat +simplicitat +simplificacion +simplificargh +simplista +simplitge +simplor +simptòma +simptomatic +simulacre +simular +simultanèa +simultaneïtat +simultanèu +sin +sinagòga +sinapsi +sinaptic +sincèr +sincèrament +sinceritat +sincopar +sincopèri +sincòpic +sincòpi +sincronizara +sindicacion +sindical +sindicalisme +sindicalista +sindicargh +sindicat +sindròme +sinecura +sinfonia +sinfònia +sinfonic +Singapor +singlar +singlar +singlarenc +single +singlon +singlonar +singular +singularament +singularisar +singularitat +sinhal +sinhòca +sinhocar +sinhocar +sinhocarai +sinhocavi +sinhòla +sinholar +sinhoquem +sinhoquèri +sinhoquetz +sinhòqui +sinistra +sinistrat +sinistre +sinòde +sinon +sinonim +sinoptic +sinós +sinsar +sinsirimbalhas +sinsòla +sintaxi +sintaxic +sintèsi +sintetic +sintetisar +sintetizar +sinuós +sinus +sinusita +sinusoïda +sinut +siòi +siòis +sionisme +sirar +sirèna +sirgargh +sirgon +Siria +sirian +sirincon +sirment +sirmentar +sirmentejargh +siròp +siropejargh +siropós +sirpa +sirvent +sirventès +sisa +sisclada +siscladís +sisclaire +sisclal +sisclar +sisclet +siscletar +sismograf +sismografe +sistar +sistèma +sistematic +sistematisar +sistematizar +sistonar +sistrar +sistre +sistrièra +site +siti +situacion +situarazh +situirh +siula +siular +siurada +siure +siurièr +soalgargh +sobacada +sobat +sobeiran +sobeiranament +sobeiranetat +sòbra +sobraire +sobran +sobranha +sobrar +sobrat +sobredich +sobredicha +sobrediguèri +sobredirai +sobredire +sobredisent +sobredisi +sobredisiái +sobrenc +sobrèri +sobreseguda +sobreseguèri +sobresegut +sobreseirai +sobresèire +sobresesent +sobresèsi +sobresesiái +sobrevendrai +sobrevenent +sobrevenguda +sobrevenguèri +sobrevengut +sobreveni +sobreveniái +sobrevenir +sobrevisquèri +sobreviurai +sobreviure +sobrevivi +sobreviviái +sòbric +sobrièr +sobtament +sobtar +sobte +soc +sòca +socada +socal +socalhar +socalhon +socam +socargh +socar +socarai +socaràs +socareda +socarèl +socarrar +socat +socatge +socatirh +socavi +sòci +sòci +sociable +social +socialisar +socialista +socializar +socidar +societat +socil +sociografia +sociologia +socitar +socitós +sòcle +sodada +Sodan +sodanés +sodar +sodium +sodòt +soeinar +sofiar +sofiar +sofièri +sófiic +sofla +soflada +sofladissa +sofladura +soflaire +soflament +soflar +soflariá +soflatge +sofle +soflet +sofletada +sofletaire +sofletar +sofletejargh +soflorar +sofracha +sofrachós +sofraita +sofraitós +sofranhar +sofrar +sofratge +sofre +sofrença +sofrent +sofrièra +sofriment +sofrirh +soga +soganhar +sogatirh +sògre +soi +soicidar +soilevar +soilevèri +soilèvic +soira +soiràs +soirenadar +soís +Soïssa +soïssa +soissojorn +sojornar +sol +sòl +sòlabatut +solaç +solaçargh +solada +solairar +solairòl +solament +solana +solanelh +solar +solar +solàs +solason +solatatge +solatge +solatjargh +solcirh +sòlda +soldar +soldat +soldata +soldatalha +soldatàs +soldatesc +soldaton +soldèri +sòldic +soledrada +soledran +soledràs +soledrat +solelh +solelhada +solelhadís +solelhador +solelhal +solelhar +solelhàs +solelhenc +solelhet +solelhièr +solelhós +solemnament +solemne +solemnial +solemnisar +solemnitat +solemnizar +solenca +solencargh +soler +solèri +solesa +solet +soletar +solevar +solevèri +solèvic +solfegi +solfègi +solfegiar +solfegièri +solfégiic +solfinar +solguda +solguèri +solgut +solh +solhadura +solhar +solhard +solhardament +solhardar +solhardariá +solhet +sòlic +sòli +soliái +solid +solidar +solidari +solidarisar +solidaritat +solidarizar +solidificargh +soliditat +solièira +solièr +solilocar +solilocar +solilocarai +solilocavi +soliloquem +soliloquèri +soliloquetz +solilòqui +solitari +solitària +solitud +solivol +solombrada +solombrador +solombrar +solombre +solombrejargh +solombrièr +solombrós +solombrut +solprar +solpreta +solpretièr +solprièra +solrai +solsar +solses +solucion +solucionar +solvent +sòlver +solverai +sòlvi +solviái +sòlvre +sollicitar +sòm +som +sòma +somal +somali +Somalia +somalian +somand +somar +somari +somàriament +somatic +somatic +somativa +sombrejargh +somelh +somelhada +somelhar +somelhejargh +somelhós +somés +somesa +somessa +somessaire +somessar +somessionar +somet +sometreh +sòmi +somiadís +somiaire +somiar +somiejargh +somièri +sómiic +sòmiic +sominhar +somission +somoguda +somoguèri +somogut +somola +somourai +somòure +somòvi +somoviái +sompa +sompartida +sompartirh +sompe +sompesar +son +sona +sonada +sonadís +sonadissa +sonaire +sonal +sonalh +sonalhar +sonalhejargh +sonalhièr +sonament +sonant +sonar +sonariá +sonatge +soncirh +sonda +sondable +sondaire +sondar +sondar +sondatge +sondatge +sondatge +sondormirh +sonha +sonhar +sonharai +sonhason +sonhavi +sonhem +sonhèri +sonhetz +sonhós +sonhosament +sonièr +sonò +sonòr +sonoritat +sonorizacion +sonque +sonsa +sonsida +sonsidura +sonsiment +sonsirh +sonson +sonsonar +sopa +sopacargh +sopada +sopadís +sopador +sopaire +sopapa +sopar +soparèl +sopartirh +sopejaire +sopejargh +sopeta +sopic +sopièr +sopierada +soplament +sople +soplesa +soplòg +soplogem +soplogèri +soplogetz +soplojar +soplojarai +soplojavi +sopluèg +sopluègi +sopluejar +soquèla +soquem +soquèri +soquet +soquetz +sòqui +soquilh +soquilhon +sorab +sorbièr +sorcilhar +sord +sordament +sordanha +sordejargh +sordèri +sordi +sordiái +sordièra +sordrai +sordre +sorga +sòrga +sorgirh +soriguda +soriguèri +sorigut +sorire +sorisanta +soriseire +sorisent +sorisent +sorisi +sorisiái +sorn +sornament +sornariá +sorneta +sornièra +sornura +sorra +sorraire +sorral +sorrar +sorràs +sorrastra +sòrre +sorropar +sors +sorsa +sorsejargh +sòrt +sortable +sortida +sortidura +sortilègi +sortirh +sorzent +sórzer +sorzèri +sorzi +sorziái +sos +sosarrendaire +sosarrendament +sosarrendar +sosbacada +sosbacargh +sosbarba +sosbarbal +sosbat +sosbatejargh +sosbatreh +sosbaum +sosbaumar +sosbornar +sosbornèri +sosbòrnic +sosbràs +sosbrasar +sosc +sosca +soscada +soscadissa +soscairar +soscaire +soscament +soscargh +soscavar +soscrich +soscricha +soscriguèri +soscriurai +soscriure +soscriveire +soscrivent +soscrivi +soscriviái +sosensemble +sosespaci +sosgainar +sosganhar +sosgaunhar +sosindèx +soslapa +soslàupia +soslenga +soslèu +soslevar +soslevèri +soslèvic +soslinhar +soslipar +soslogar +soslogar +soslogarai +soslogavi +sosloguem +sosloguèri +sosloguetz +soslògui +sosmostar +sospartirh +sospecha +sospecharr +sospechós +sospeitar +sospeitèri +sospèitic +sospès +sospesar +sospirant +sospirar +sospirós +sosplec +sosplegargh +sosplojar +sosplujar +sosquejargh +sosrepertòri +sosrubrica +sossa +sosselar +sosselega +sosselegargh +sosselèri +sossèlic +sossignar +sosta +sostaire +sostar +soste +sostèla +sosten +sostenable +sostendrai +sosteneire +sostenement +sostenença +sostenent +sosténer +sostenguda +sostenguèri +sostengut +sosteni +sosteniái +sostenir +sosterranh +sosterrar +sosterrèri +sostèrric +sostilha +sostirar +sostítol +sostitolara +sostraccion +sostrach +sostracha +sostrachar +sostraguèri +sostrairai +sostraire +sostral +sostrar +sostrasent +sostrasi +sostrasiái +sostre +sostrejargh +sota +sotacamp +sotaire +sotana +sotar +soteiran +sotejargh +sotensemble +sotespaci +sotho +sotièra +sotindèx +sotisar +sòtol +sotolum +sòu +sòuda +sòudada +sòudadura +sòudaire +sòudalha +soudar +soudar +sòudatge +soudejargh +soudèri +soudèri +sòudic +soufinar +sòut +sòuta +sovenença +sovenent +sovenirh +sovent +sovetar +sovetèri +sovètic +Sri +srilankés +suassa +suau +suava +suavament +suavitat +subaltèrn +subaumar +subdelegar +subdelegar +subdelegarai +subdelegavi +subdeleguem +subdeleguèri +subdeleguetz +subdelègui +subdevesirh +subdivision +subèc +subirh +subjècte +subjugargh +sublar +sublim +sublimar +submergirh +subordenar +subornar +subran +subrar +subre +subrebaissar +subrebèl +subrebon +subrebondar +subrebondós +subrecarga +subrecargargh +subrecaupirh +subrecèl +subrecilha +subrecopar +subrecreis +subredaurar +subredemandar +subredicha +subredire +subredita +subrejornada +subrelogar +subrelogar +subrelogarai +subrelogavi +subreloguem +subreloguèri +subreloguetz +subrelògui +subremèstre +subremontar +subrenadar +subrenatural +subrendeman +subrenom +subrenomar +subrenomenar +subrenuèit +subrepagargh +subreparlar +subrepassar +subrepausar +subrepés +subreplan +subrepoblar +subrepoblèri +subrepòblic +subreprendrai +subreprene +subreprenent +subreprenguèri +subrepreni +subrepreniái +subreprés +subrepresa +subresautar +subreseguda +subreseguèri +subresegut +subreseirai +subresèire +subresesent +subresèser +subresèsi +subresesiái +subrestar +subretaussar +subretítol +subretot +subrevendrai +subrevendreh +subrevenent +subrevenguda +subrevenguèri +subrevengut +subreveni +subreveniái +subrevenir +subrevida +subreviscuda +subreviscut +subrevisquèri +subreviurai +subreviure +subrevivença +subrevivent +subrevivent +subrevivi +subreviviái +subrogar +subrogar +subrogarai +subrogat +subrogavi +subroguem +subroguèri +subroguetz +subrògui +subrondar +subrora +subrost +subsidi +subsisténcia +subsistent +subsistirh +substància +substancial +substanciosament +substantiu +substitucion +substituirh +subtada +subtar +subte +subterfugi +subtil +subtilisar +subtilitat +subtilizar +subvencion +subvencionar +subvendrai +subvenent +subvenguda +subvenguèri +subvengut +subveni +subveniái +subvenir +suc +suca +sucada +sucal +suçapega +sucargh +suçargh +suçarèl +sucaton +succedirh +succès +succession +succin +sucejargh +sucet +sucombar +sucombirh +sucrar +sucrariá +sucre +sucrièr +sucursala +sud +sud-african +sud-corean +Suècia +suedés +suedés +suèja +suènh +suènhi +sufiguèri +sufirai +sufire +sufisença +sufisent +sufisentament +sufisi +sufisiái +sufixar +suflar +sufocar +sufocar +sufocarai +sufocavi +sufoquem +sufoquèri +sufoquetz +sufòqui +sufragi +suggerirh +suggestion +sugròs +suicida +suicidar +suicidi +suiva +suja +sul +sulcòp +sulfat +sulfatar +sulfit +sulfur +sulfuric +sulfurós +sulhar +sulhet +sumac +sumaure +sumirh +sup +supa +supar +supausable +supausar +supèl +supelar +supelèri +supèlic +superar +supèrb +supèrbament +supèrbia +superèri +superficial +supèric +superior +superiorament +superpausar +supièra +suplantar +suplar +suple +suplementari +suplementària +suplicant +suplicargh +supliciar +suplicièri +suplíciic +suplirh +supòrt +suportable +suportar +suportèri +supòrtic +suposicion +supositòri +supòst +suprèm +suprémer +supremirh +supremum +supression +suprimirh +suputar +suquet +surbaissar +surge +surgent +surgentar +surgentin +surgetar +surgetèri +surgètic +surgian +surgilh +surgirh +Surinam +surja +surjat +surjós +surramat +surre +surrièr +sursit +sus +susada +susaire +susant +susar +susari +susbrumar +suscargargh +suscitar +susdurar +susejargh +susfàcia +susfaire +susflorar +suslevar +suslevèri +suslèvic +susmontar +susnomar +susnomenar +susorlejargh +susós +suspartirh +suspassar +suspectar +suspectèri +suspèctic +suspençargh +suspenda +suspendre +suspendut +suspension +suspicion +suspicion +suspiçon +suspiçonar +susplomb +susplombar +susposc +susposcargh +susprendrai +susprendre +susprene +susprenent +susprenent +susprenguèri +suspreni +suspreniái +susprés +suspresa +suspresa +sustentar +susvelhar +susvendrai +susvenent +susvenguda +susvenguèri +susvengut +susveni +susveniái +susversar +susversèri +susvèrsic +susvolar +suturar +suve +suvièr +swazi +Swaziland +Sydney +ta +tabac +taban +tabarar +tabard +tabasada +tabasaire +tabasament +tabasar +tabasatge +tabastèl +tabat +tabataire +tabatar +tabatejargh +tabatièra +tabatós +tablar +tablèu +taboissar +taboisson +taboissonar +tabòla +tabolièr +tabor +tabor +taborada +taborar +taboratge +taboreta +taborin +taborn +taborn +tabornièira +taboscargh +tabòssa +tabòt +tabular +tabussar +tabust +tac +taça +taçada +tacadís +tacadura +tacament +tacan +tacanariá +tacandariá +tacargh +tacarèl +tacina +taciturne +tacolar +tacon +taçon +taconar +taçonat +taconejargh +tacte +tactic +tacha +tachaire +tachar +tachetar +tachièr +tachon +tachonar +tadon +tafa +tafanari +tafanhon +tafaraud +tafaron +tafataire +tafatàs +tafuraire +tafurar +tafuratge +tafurèl +Tage +tai +Taibei +taïca +taifa +tailandés +Tailàndia +taïna +taïnar +taïnejargh +taïnós +Taipèi +tairai +tairal +taire +tais +taisar +tàiser +taisson +taissonièra +taita +taiteta +Taiwan +taiwanés +tal +talabàs +talabassièr +talabrena +talabrenat +talament +talar +talarina +talastre +talats +talent +talh +talha +talhable +talhada +talhadís +talhador +talhadura +talhafons +talhaire +talhament +talhandariá +talhandièr +talhants +talhaprat +talhar +talhent +talhièr +talhòla +talhon +talhonar +talhvirar +talibaud +talibornàs +talica +talon +talonada +talonaire +talonar +talonejargh +talonièra +talòs +talòssa +talossariá +talpa +talpada +talpaire +talpairon +talpal +talpar +talpari +talpat +talpatièra +talpejargh +talpenc +talpierada +talpinada +talpinar +talús +talussar +talvera +talverar +talveron +Tallinn +tam +tamarat +tamariguièra +tamarirh +tamarís +tamarissa +tamarissièra +tambor +tamboraire +tamborar +tamborinaire +tamborinar +tamborinejargh +tambornaire +tambornar +tambornet +tambornièr +tambre +tambust +tamèl +Tamèsi +tamís +tamisadoira +tamisaire +tamisar +tamisatge +tamisièr +tamós +tampa +tampador +tampais +tampaissada +tampaissar +tampal +tampanal +tampanejargh +tampanèl +tampar +tamparèl +tampàs +tampat +tampatge +tampina +tampinar +tampirh +tampon +tamponar +tamponejargh +tamponèl +tan +tana +tanada +tanaire +tanar +tanard +tanare +tanariá +tanarida +tanatge +tanben +tanc +tanca +tancada +tancador +tancadura +tancaire +tancal +tancargh +tançargh +tancàs +tancatge +tanèl +tanflar +tangargh +tangéncia +tangencial +tangent +tangenta +Tànger +tànger +tangirh +tanguda +tanguèri +tangut +tanhent +tànher +tanherai +tanhi +tanhiái +tanièra +tanlèu +tanlòra +tanoquet +tanpauc +tanplan +tant +tanta +tantalòri +tantaravèl +tantarra +tantejargh +tantes +tantolhar +tantossada +tantòst +Tanzania +tanzanian +tap +tapa +tapacap +tapacul +tapada +tapadièr +tapadoira +tapador +tapaire +tapament +tapar +taparàs +taparlet +tapatjargh +tapèl +tapera +taperada +taperièr +tàpia +tapiaire +tapiar +tapiatge +tapièra +tapièri +tàpiic +tapin +tapinada +tapinar +tapirh +tapís +tapissar +tapissariá +tapissièr +tapoinar +tapoinar +tapoinèri +tapòinic +tapòla +taponar +tapotejargh +taquetar +taquilhar +taquinar +taquinejargh +tar +tara +tarabast +tarabastada +tarabastal +tarabastar +tarabastatge +tarabastejargh +tarabastèl +tarabastèla +tarabastèri +tarabastièr +tarabastòri +tarabastós +tarabustar +taradoira +taradura +taraire +taranta +tarar +tararanha +tararanhós +tarasca +taraudar +taravèl +taravelar +taravelèri +taravèlic +taravol +Tarba +tard +tardada +tardament +tardança +tardar +tardet +tardièr +tardiu +tardival +tardívol +tardola +tardonar +tardor +tarenca +targa +targaire +targanhar +targargh +tarida +tarifa +tarifar +tariment +tarin +tarirh +tarlanguejargh +tarlecargh +Tarn +tarnada +tarnagàs +tarnar +tarnavelar +tarnavelèri +tarnavèlic +tarniga +tarós +tarrabali +tarrabani +tarrabastejargh +tarraganhar +tarragaunhar +Tarragona +tarragonin +tarrangolada +tarranhar +tarranquejargh +tarridar +tarrina +tarrís +tarrisa +tarrissa +tarro +tarron +tarronar +tartalh +tartalhar +tartan +tartanaire +tartanat +tartanèla +tartaràs +tartarin +tartifle +tartiflejargh +tartiflièra +tartiflon +tartocar +tartocar +tartocarai +tartocavi +tartoquem +tartoquèri +tartoquetz +tartòqui +tartra +tartre +tartufa +tartuga +tartugada +tartugargh +tartuguejargh +tartuguièra +tasca +tascada +tascaire +tascargh +tascassejargh +tascolar +tàser +tasèri +Tashkent +tasi +tasiái +tasquejaire +tasquejargh +tassar +tassèl +tassetas +tassièr +tassina +tast +tastadissa +tastaire +tastament +tastar +tastariá +tastatge +tastavin +tastejargh +tastet +tastigol +tastigolejargh +tastonar +tastonejargh +tastugargh +tastulhar +tastuquejargh +tatai +tataranhas +tataròt +tatarotaire +tatgic +Tatgiquistan +tatinar +tatinàs +tatoarazh +taüc +taula +taulada +taulador +taular +taulassa +taulat +taulatge +taulejada +taulejaire +taulejargh +tauleta +taulièr +taupa +taupinièira +taure +taurèl +tauret +taurirh +taus +tausièra +tausin +taussal +taussar +taussin +taussòl +tautàs +tautassada +tautèl +tautelat +tautelet +tautena +tautilhon +tavana +tavanar +tavanejaire +tavanejargh +tavanièra +tavar +tavèl +tavelar +tavelèri +tavèlic +tavèrna +tavernal +tavernièr +tavernòla +tavi +tàvia +taxa +Tbilissi +te +tè +teatral +teatre +tebejargh +tebés +tebesa +tebesar +tebeses +tebesirh +tèbiament +tèc +teca +tecnic +tecnologia +tecnologic +teçonar +tech +techa +techar +techat +techon +tedi +tediós +tedut +Teheran +teicejargh +teiral +teirejargh +teiron +teissedre +teisseire +téisser +teisserai +teissi +teissiái +teissum +teissut +tela +telada +telador +telaire +telar +telariá +telat +telatge +telatièr +telecargament +telecargargh +telecomandar +telecomunicacion +teledifusar +telefòn +telefonar +telefòne +telefonèri +telefonet +telefònic +telefonic +telegrafiarazh +telegrama +teleguidar +telescopar +telescopèri +telescòpic +telescòpi +telesqui +teletar +televisar +television +televisor +televisual +telèx +telh +telhar +telhós +telhut +telièr +tèma +temaire +tematica +témer +temerai +temèri +temeruc +temi +temiái +temoniar +temonièri +temòniic +temorós +temós +tempe +tempeirarr +temperatura +tempèri +tempèsta +tempestar +tempestejargh +tempestèri +tempèstic +tempestós +tempestosament +tempestum +tempieirar +tempièr +tempierar +tempierèri +tempièric +templa +temple +templega +tempora +temporada +temporal +temporanar +temporar +temporari +temporària +temporàriament +temporirh +temporisar +temporiu +temporizar +temps +temptacion +temptaire +temptar +temptarèl +temptat +temptatiu +temptativa +tenable +tenaç +tenalhar +tenalhas +tenalièr +tenar +tenard +tenca +tença +tençon +tench +tench +tencha +tencha +tenchar +tenchar +tenchièr +tenchura +tenchurar +tenchurariá +tenchurièr +tenda +tendada +tendar +tendeire +tendèla +tendelar +tendelèri +tendèlic +tendéncia +tendent +tendeson +tendièr +tendilh +tendilhar +tendolet +tendrai +tendrament +tendre +tendreh +tendresa +tendretat +tendritge +tendron +tendror +tendrum +tenèbras +tenebror +tenebrós +teneca +tenecar +tenecarai +tenecavi +tenedoira +tenedor +teneire +tenement +tenéncia +tenencièr +tenequem +tenequèri +tenequetz +tenèqui +téner +teneson +ténger +tenguda +tenguèri +tengut +tengut +tenhas +tenhedura +tenhent +ténher +tenherai +tenhi +tenhiái +teni +teniái +tenilha +tenir +tenor +tensonar +tentacular +tentacular +tentar +tentenar +tenturariá +teologia +teologiana +teologiana +teologic +teorèma +teoria +teoric +teoricament +teorician +teorisar +teorizar +tepa +tepada +tepar +tepàs +tepatge +tepièra +tepós +teput +tequilhar +tequilhon +terapeutic +tèrç +tèrça +terçan +terçana +terçar +terçarai +terçavi +tercelet +tercem +tercèri +tercetz +tèrci +terciar +terciar +tercièri +tèrcii +tèrçpont +terebentina +terebint +terèna +tergiversar +tergiversèri +tergivèrsic +tèrgue +terigossar +termal +tèrme +tèrme +tèrme +termejargh +termenal +termic +termica +terminar +terminologia +terminologic +termodinamica +tèrn +ternal +ternari +tèrne +ternirh +teron +terondèl +tèrra +terrada +terrador +terradorenc +tèrrafòrt +terragal +tèrragela +tèrragiala +terragós +terrairòl +terrajada +terral +terral +terralha +terralhada +terralhaire +terralhar +terralhatge +terralhièr +terralhon +terranha +terranhàs +tèrraplen +terrar +terràs +terrassa +terrassar +terrassièr +terrasson +terrassós +terrat +tèrratenent +tèrratrem +tèrratremol +terrejada +terrejador +terrejaire +terren +terrenal +terrenc +terrencós +terrèri +terrèstre +terret +tèrric +terriblament +terrible +terrigòla +terrilha +terrina +terrinada +terrinaire +terrinhòl +terrís +terriscle +terrissa +terrissar +territòri +territorial +territorialament +terró +terrolhar +terror +terrorisar +terrorisme +terrorista +terrorizar +terrum +terrusson +terrut +tes +tesa +tesada +tesar +tesàs +tesaurariá +tesaurièr +tesaurisar +tesaurizar +tesbeston +tesconejargh +tescum +tescut +teseira +tèsi +tesic +tesicargh +tesicós +tesicum +teson +tesquejargh +tesquèri +tesquièra +Tessalonica +tessalonician +tessèla +tesseladura +tesselar +tesselat +tesselèri +tessèlic +tesson +tessonada +tessonar +tèst +tèsta +testador +testaire +testament +testamentari +testant +testar +testar +testard +testardariá +testardejargh +testarditge +testat +testator +testejaire +testejargh +testèri +tèstic +testicul +testièr +testimòni +testimoniar +testimoniar +testimoniatge +testimonièri +testimònii +testola +testolièra +testona +testòri +testut +tesurar +tesus +tet +teta +tetada +tetaire +tetar +tetarèl +tetejargh +tetelon +tetina +tetinarda +teton +tetraèdre +teu +teugargh +teula +teulada +teuladièr +teuladòta +teulaire +teular +teulariá +teulassenc +teulat +teulatge +teule +teulèla +teulís +teulissar +teulissatge +teulissièr +teulisson +teulon +teulós +teuna +teune +tèune +teunesa +teunesirh +teunet +teunha +teunhe +tèunhe +tèxt +tèxte +tibadura +tibament +tibanèl +tibant +tibar +tibat +tibatge +tibèrja +Tibet +tibetan +tibla +tiblada +tiblar +tiblassada +tible +Tibre +tièch +tieirejar +tieirejèri +tièirejic +tièra +tierada +tierejar +tierejèri +tierèjic +tieu +tieuna +tige +tigrar +Tigre +tigre +tigressa +tija +tilha +tilhac +tilhar +tilhet +tilhièr +tilhòl +tilòcha +timanglar +timbal +timbalaire +timbalar +timbalin +timblar +timbol +timbolejargh +timborla +timborle +timborlièr +timbrar +timbrat +timbre +timbrós +timid +timiditat +timon +timonal +timonar +timonièr +Timòr +timp +timpla +timplal +timplar +timponar +tina +tinada +tinairòl +tinal +tinalièr +tind +tindadís +tindaire +tindal +tindament +tindant +tindar +tindarèl +tindèl +tindelhon +tindinar +tindol +tindon +tindonar +tindorlar +tindorlejargh +tinèl +tineta +tingàs +tinha +tinhassièr +tinhon +tinhós +tinieiral +tinnhar +tinòl +tint +tinta +tintaina +tintainaire +tintainar +tintainejargh +tintar +tintèina +tintièr +tinton +tintonar +tintorèla +tintorlar +tintorlejargh +tintura +tinturar +tinturièr +tiòca +tip +tipa +tipar +tipe +tipejargh +tipic +tipic +tiplar +tiple +tipografiarazh +tipografic +tiquet +tiqueta +tir +tira +tiracambas +tiracotèl +tirada +tiradís +tiradoira +tirador +tiragassa +tiragossar +tiragossèri +tiragòssic +tiralenga +tiralhaire +tiralhament +tiralhar +tiralinhòl +tiramandil +tirament +tiran +Tirana +tiranejargh +tiranha +tiranhar +tiranic +tiranisar +tiranisme +tiranizar +tirantèina +tirapè +tirar +tirarena +tirassada +tirassar +tirassejargh +tiratap +tiratge +tirejargh +tirèls +tireta +tiròla +tirolejargh +tirolet +tiron +tironada +tironèl +Tirrèna +tisana +tisanaire +tisanejargh +tisar +tisia +tisic +tison +tisonaire +tisonar +tisonièr +tissa +tissós +tita +tita +titara +títol +titolar +titolet +titolon +titrar +titular +titular +titularisar +titularizar +tiular +tiure +tiurièra +toalha +toalheta +toalhon +toat +Tobago +tòc +tòca +tocable +tocada +tocadís +tocadoira +tocador +tocadura +tocaire +tòcamanetas +tòcamans +tocament +tocant +tocantés +tocar +tocarai +tòcasen +tocassejargh +tocavi +tochin +tochinariá +tòcho +toda +todelhar +tofa +tofaron +tofiardàs +tofiassa +toga +tòga +Tògo +togolés +tòia +toïca +toïs +toison +toissa +toja +tojaga +tòla +tolái +tolariá +toleda +tòler +tolerància +tolerar +tolerèri +tolèric +tolguèri +tolhaud +tòli +tolipa +Tolon +tolonenc +Tolosa +tolosan +tolosenc +tolrai +tolzet +tollorar +tollorar +tollorèri +tollòric +tòm +toma +tòma +tomar +tomata +tomatat +tomatièra +tomba +tombada +tombadís +tombador +tombadura +tombaire +tombament +tombant +tombar +tombarèl +tombarelaire +tombarelàs +tombarelat +tombarelejargh +tombassièr +tombèl +tombèu +tombèus +tombièr +tombolà +Tomé +tomèl +tometa +tomièr +tomple +tomplina +ton +tona +tonaina +tonalitat +tonar +tonatge +tònca +tondalha +tondefèu +tondeira +tondeire +tondeson +tondra +tondral +tondrassejaire +tondrassejargh +tondreh +tonejargh +tonèl +tonèla +tonelada +tonelariá +tonelatge +tonelièr +tonelon +Tònga +tongan +tonhar +tonhòl +tòni +tònia +tonic +tonina +tonsurar +tonta +topar +topazi +topèri +tòpic +tòpi +topin +topina +topinaire +topinambor +topinar +topinàs +topinat +topinejargh +topinèl +topinet +topinièr +topinòl +topinon +topografia +topografic +toponimia +toquejargh +toquem +toquèri +toquet +toquetz +tòqui +Tòquio +toquioïta +tor +tòr +tòr +tòra +toracic +torada +torador +toral +torar +torassa +torat +torax +torb +torba +torbejargh +torbièra +torbilh +torbilhar +torcada +torcaire +torcar +torcar +torcarai +torcavi +torcedor +torcedura +torcement +torcent +tòrcer +torcerai +torcèri +tòrci +torciái +torcida +torcionari +torcirh +torcit +torcon +torconar +torçuda +torçudas +torçut +torçuts +torde +tordejargh +tordièira +tordís +tordolejargh +tordolhar +tordre +torelhar +Torena +torèri +toret +tòric +torilhon +torisme +torista +toristic +toristic +torlhe +torlí +torment +tormenta +tormentaire +tormental +tormentar +torn +torna-sòl +torna-solelh +tornada +tornadís +tornadoira +tornaire +tornal +tornamai +tornaman +tornament +tornar-mai +tornar +tornar +tornason +tornavitz +torneg +tornejaire +tornejament +tornejargh +tornejatge +tornèri +tornés +tòrnic +tornièr +tornissar +tornvirar +torolhar +Toronto +torpilha +torpilhaire +torpilhar +torquem +torquèri +torquetz +tòrqui +torrada +torradís +torraire +torralha +torrar +torrasa +torratge +torre +torreficargh +torrèl +torrèla +torrelat +torrelhar +torrent +torrèri +torreta +tòrric +torridar +torrièr +torrièra +torrilh +torrilha +torrirh +torrís +torrofle +torrogat +torrolhar +torronhon +torrut +Tors +tòrs +tòrs +tòrsa +torsadar +tòrsas +tòrses +tòrt +torta +tortejaire +tortejargh +tortèl +tortibilhar +tortièr +tortilhament +tortilhar +tortilhon +tortilhós +tortipè +tortís +tortissar +tortissariá +tortoira +tortoirar +tortoire +tortonar +tortor +tortorèl +tortorièr +tortovilhar +tortra +tortre +torturar +tos +tos +tòs +tosa +tosarda +toscan +Toscana +toscargh +Toshkent +tosoiras +tosoiron +tosquirar +tòssa +tosseires +tossejargh +tossilage +tossilhós +tossiment +tossinejargh +tossirh +tòsta +tostada +tostar +tostaut +tostejargh +tostemps +tostèn +tostena +tostèri +tòstic +toston +toston +tostonar +tostonèl +tot +tòt +total +totalament +totalisar +totalitari +totalitat +totalizar +totara +totes +totjorn +totòm +totona +totonar +totora +totoroton +Totsants +totum +tòut +toxic +toxicologia +toxina +trabaca +trabalh +trabalhable +trabalhador +trabalhador +trabalhaire +trabalhar +trabalhejargh +trabalhon +trabastièr +trabocargh +trabotejargh +trabuc +trabucada +trabucaire +trabucament +trabucargh +trabuquet +traburgalhar +traca +traça +traçada +traçador +traçaire +tracalan +traçament +tracanar +tracanard +tracanet +tracargh +traçargh +traçard +traçariá +tracassar +tracassejargh +tracejargh +tracièra +tracilha +tracitge +tractable +tractaire +tractament +tractar +tractat +traçuènha +trach +tracha +trachamand +trachamandejargh +trachamantejargh +trachar +trachelar +trachelèri +trachèlic +trachimand +trachirh +tradicion +tradicional +traduccion +traduch +traducha +traduguèri +traduire +traduseire +tradusent +tradusi +tradusiái +tradusible +tradusirh +trafan +trafanar +trafec +trafega +trafegadís +trafegaire +trafegant +trafegargh +trafegariá +trafegós +trafeguejaire +trafeguejargh +trafegum +tragiaire +tragidor +tragin +traginar +tragirh +traguèri +traïdor +traïment +traïn +traïnada +traïnadís +traïnaire +traïnar +traïnariá +traïnàs +traïnassar +traïnassariá +traïnejargh +traïnèl +traïrh +trairai +traire +traïson +trait +traitament +traitesa +trajècte +trajectòria +tralejargh +traleta +tralh +tralha +tralhadís +tralhar +tralhàs +tralucargh +tralla +trallar +tralle +tram +tramada +tramador +tramar +trambalar +trame +tramega +tramegon +trampalejargh +trampelada +trampelaire +trampelar +trampelèri +trampèlic +trampolada +trampolaire +trampolar +tran +tranar +tranca +trancadís +tranchadaurar +tranchafilar +trandirh +trandolant +trandolar +trandolèri +trandòlic +tranèl +tranfi +tranfraisa +tranièra +tranirh +tranit +tranquil +tranquilisar +tranquilizar +tranquillitat +transaccion +transcrich +transcricha +transcriguèri +transcriurai +transcriure +transcrivent +transcrivi +transcriviái +transferiment +transfuga +transgenic +transicion +transicion +transida +transidura +transigirh +transinar +transirh +translacion +transmès +transmesa +transparéncia +transparent +transpòrt +transposicion +transposicion +transversal +tranta +tranta +trantalh +trantalhada +trantalhant +trantalhar +trantalhar +trantalhejant +trantalhejargh +trantalhièra +trantar +trantida +trantiment +trantirh +trantís +trantolant +trantolar +trantolar +trantolejargh +trantolèri +trantòlic +trantussa +trantussar +trap +trapa +trapadèla +trapanèl +trapar +trapèla +trapelièira +trapelon +trapet +trapeton +trapèzi +trapissar +trapon +traponièra +traquejargh +traquet +tras +trasanar +trasbargalhar +trasbastada +trasbastar +trasbatejargh +trasbocargh +trasborre +trasborron +trasbotejargh +trasbucargh +trasburgalhar +trasca +trascapdèt +trascolar +trascompassar +trascrich +trascricha +trascriguèri +trascriurai +trascriure +trascrivent +trascrivi +trascriviá +traseire +trasferiment +trasferirh +trasficha +trasfigurar +trasfoguièr +trasfolirh +trasforar +trasforèri +trasfòric +trasformacion +trasformar +trasfornièr +trasfuga +trasgetaire +trasgetar +trasgetèri +trasgètic +trasgredirh +trasgressar +trasgressèri +trasgrèssic +trasi +trasiái +traslatar +traslimar +traslundar +trasmajoral +trasmans +trasmegem +trasmegèri +trasmegetz +trasmejar +trasmejarai +trasmejavi +trasmetreh +trasmiègi +trasmission +Trasmontana +trasmosit +trasmudar +traspausar +traspirar +trasplantar +traspòrt +trasportar +trasportèri +traspòrtic +traspuèg +traspuèges +trassar +trassegrai +trassègre +trasseguda +trasseguent +trasseguèri +trassègui +trassèguiái +trassegut +trassejargh +trassirh +trast +trastalon +trastar +trastasenc +trastasent +trastejaire +trastejargh +trastèl +trastet +trastirar +trastol +trastolàs +trastolejargh +trastolet +trasvasar +trasvestiment +trasvestirh +trasvin +trasvirar +trasvogem +trasvogèri +trasvogetz +trasvojar +trasvojarai +trasvojavi +trasvuègi +trau +trauc +traucable +traucada +traucadoira +traucador +traucaire +traucament +traucanèu +traucapaissièra +traucargh +traucariá +traucàs +traucatge +traucatripa +traular +traulhar +traulhejargh +traupeire +traupidoira +traupilhar +traupirh +trauquèlha +trauquet +trauquilh +trauquilhar +trauquilhejargh +trauquilhon +trauquilhós +trava +travada +travadèl +travalhar +travar +travason +travatèl +travatèla +travatelar +travatelèri +travatèlic +travèrs +travèrsa +traversada +traversan +traversar +traversèri +travèrsic +traversièr +traversièras +traversut +travestirh +travet +travetar +travolh +travolhar +tre +trebenca +trebilha +trebimbar +treblar +treble +trebol +trebola +trebolacomuna +treboladís +trebolador +trebolafèsta +trebolaire +trebolament +trebolant +trebolaplasers +trebolar +trebolejargh +trebolèris +trebolet +trebolici +trebolina +trebolinar +trebolirh +trebolitge +trebolós +trebolum +trebunha +treca +treça +treçaire +treçargh +treçatge +trecimaci +tréfol +trefolet +trefolirh +treforirh +trefosirh +trefuèlh +tregan +tregenar +treginar +treginièr +tregirh +trelha +trelhaire +trelhar +trelhàs +trelhat +trelhatge +trelhet +trelhièra +trelhís +treliç +trelingargh +trelingatge +trelis +trelís +trelissar +trelucargh +tremblaire +tremblament +tremblant +tremblar +tremblason +tremble +tremblòta +tremblotar +tremblotejargh +tremblotèri +tremblòtic +tremblum +trementirh +tremida +tremogem +tremogèri +tremogetz +tremojar +tremojarai +tremojavi +tremol +tremolada +tremoladís +tremolaire +tremolament +tremolant +tremolar +tremolason +tremoleda +tremolejargh +tremolièra +tremolina +tremolís +tremolum +tremor +tremp +trempada +trempador +trempadura +trempaire +trempament +trempar +trempariá +trempassar +trempatge +trempeta +trempilhon +tremuègi +tremuèja +tremujar +tren +trena +trenada +trenar +trenca +trencada +trencadura +trencaire +trencament +trencant +trencargh +trenèla +trenholaire +trenholar +trenholet +trenhon +trenhonaire +trenhonar +trenquejargh +trenquièra +trens +trenta +trentanèla +trenten +trentena +trentenar +trentenari +trentenat +trentenejargh +trepar +trepejargh +trepilhar +tres +tres-quarts +tresanar +tresaur +tresaurariá +tresbanhar +tresbarra +tresbarrar +tresbast +tresbastar +tresbimbar +tresboliment +tresbolirh +tresborre +tresborron +tresca +trescalan +trescambar +trescamp +trescampar +trescantons +trescargh +trescavilha +trescoa +trescòl +trescolar +trescolar +trescolèri +trescolet +trescòlic +trescondreh +tresconhar +trescunhar +tresen +tresenament +tresfilar +tresflòri +tresfolar +tresfoliment +tresfolirh +tresfolissent +tresfosiment +tresfosirh +tresgirar +treslampar +treslimar +treslonhar +treslonhar +treslonharai +treslonhavi +treslonhem +treslonhèri +treslonhetz +tresluc +treslucargh +tresluènhi +treslunhaire +treslunhar +treslús +treslusent +treslusida +treslusirh +treslusor +tresmancargh +tresmont +tresmontada +tresmontament +tresmontan +Tresmontana +tresmontar +tresmuda +tresmudable +tresmudament +tresmudar +trespala +trespalaire +trespalar +trespanar +tresparlar +trespassar +trespeirar +trespeirèri +trespèiric +tresperdent +tresperdèri +trespèrdi +trespèrdiái +tresperdrai +trespèrdre +tresperduda +tresperdut +trespès +trespialar +trespilar +trespirar +tresplantar +tresplomb +tresplombar +tresponch +tresponcha +tresponcha +tresponchar +tresponguèri +tresponheire +tresponhent +trespónher +tresponherai +tresponhi +tresponhiái +trespontar +tresprendrai +tresprene +tresprenent +tresprenguèri +trespreni +trespreniái +tresprés +trespresa +trespúnher +trespunta +tresquilh +tressabent +tressaber +tressabi +tressabiái +tressaliment +tressalirh +tressar +tressaupèri +tressauprai +tressaupuda +tressauput +tressaut +tressautar +tressecargh +tressièis +tressòl +tressoriguda +tressoriguèri +tressorigut +tressorirai +tressorire +tressorisent +tressorisi +tressorisiái +tressusada +tressusant +tressusar +tressusor +trestalhar +trestirar +trestombant +trestombar +trestornar +tresvalar +tresvasar +Tresvèrgas +tresvinar +tresvirar +tretze +tretzelengas +tretzen +tretzenar +tretzenatge +trèu +treule +treulet +trèva +trevadís +trevaire +trevança +trevandièra +trevar +trevassejargh +trevelirh +trevèri +trèvic +trèviapada +trevièr +tria +triacargh +triada +triador +triadura +triaire +trialh +trialhas +triangle +triangular +triangulara +triarazh +tribejargh +triblar +trible +tribolejargh +tribòrd +tribú +tribular +tribuna +tribunal +tribut +tributari +tributària +trica +tricalada +tricon +tricòrn +tricosa +tricòt +tricotar +tricotejargh +tricotèri +tricòtic +trichaire +trichar +trichariá +trichor +trida +tridaire +tridanha +tridàs +tridat +tride +tridol +tridolar +tridolent +tridolet +tridorsar +tridorsèri +tridòrsic +triga +trigaire +trigargh +trigòci +trigolar +trigonometria +trigonometric +trigós +trigòssa +trigossada +trigossar +trigossar +trigossejargh +trigossèri +trigòssic +trilha +trilhar +trilhat +trilhatge +trilhièr +trille +trimaire +trimar +trimatge +trimbalar +trimèstre +trinar +trinc +trincador +trincalhar +trincargh +trinchar +tringlant +tringlar +trinhon +trinhonaire +trinhonar +Trinitat +trinquelh +trinquet +trinquetar +triomfar +triomfe +triomflar +trionfar +tripa +tripalha +tripalhós +tripard +tripariá +tripassa +tripassièr +tripassut +tripet +tripièr +triplar +triple +Trípol +tripolitan +tripon +tripotar +tripotejargh +tripotèri +tripòtic +triquet +tris +triscassa +trissador +trissaire +trissalh +trissar +trissatge +trisses +trissolar +trissolèri +trissòlic +trisson +trist +tristesa +trive +trivejargh +tròba +trobada +trobador +trobadorenc +trobadura +trobaire +trobalha +trobar +trobèri +tròbic +trobilhar +tròc +tròç +tròca +troça +trocaire +troçal +trocantar +trocar +troçar +trocar +trocarai +trocavi +trocelh +trocelhar +trocièra +trocilhon +trocha +trochada +trochamand +trochamandar +trochamandejargh +trogem +trogèri +trogetz +troïna +troïnar +troïnejargh +troita +trojada +trojar +trojarai +trojavi +tròl +trolha +trolhadís +trolhador +trolhaire +trolhar +trolhar +trolhar +trolharai +trolhatge +trolhavi +trolhem +trolhèri +trolhetz +trolhièr +trombilhar +trompa +trompar +trompeta +trompetada +trompetaire +trompetar +trompetejaire +trompetejargh +trompilh +trompilhar +trompilhon +tron +tròn +tronada +tronadís +tronaire +tronament +tronant +tronar +tronar +tronargh +tronc +tronc +tronça +troncargh +tronçon +tronçonar +troncut +troncha +tronchar +troneire +tronejargh +tronèri +tronhar +trònic +tronic +tronissada +tronquejargh +tronquilhar +tròp +tropa +tropèl +tropelada +tropelàs +tropelet +tropelièr +tropelon +tropical +troquem +troquèri +troquetz +tròqui +trosquinar +tròt +trotada +trotaire +trotant +trotar +trotatge +trotejargh +trotèri +tròtic +trotièr +trotinejargh +truand +truandalha +truandar +truandariá +trubès +truc +truca +trucada +trucaire +trucal +trucalhar +trucamalent +trucament +trucargh +trucarèl +trucataulièr +truègi +truèja +truèlh +truèlhi +trufa +trufacha +trufada +trufaire +trufandièr +trufar +trufarèl +trufariá +trufassa +trufet +trufièr +trufièra +trujada +trujar +trujassas +trulh +trulha +trulhaire +trulhar +trulhièr +trulle +trum +trumada +trumaud +trumèl +truquejargh +truquet +truquetar +trus +trusquilh +trussal +trussar +trustar +trut +tswana +tu +tuable +tuadoira +tuador +tuaire +tuarazh +tuariá +tub +tuba +tubanèl +tubar +tubarejargh +tubassièra +tubejargh +tubercul +tuborejargh +tubós +tuc +tucas +tucat +tucle +tucòl +tucolet +tudèl +tudèla +tudelada +tuejargh +tuèla +tuèra +tuf +tufada +tufar +tufarèla +tufarina +tufat +tufega +tufegargh +tufèra +tuferièr +tuferlina +tufes +tufet +tujargh +tulipa +tulipan +tulipeta +tulipièr +tumar +tumor +tumult +tuna +tunar +tunèl +Tunis +tunisenc +Tunisia +tunisian +tunsar +tupèl +tuquièr +turbar +turbinar +turbuléncia +turbulent +turc +turc +turcargh +turcmèn +Turcmenistan +turgargh +Turin +turinés +turla +turle +turlupinar +turmèl +turon +turqués +Turquia +turra +turrassèl +turrasson +turre +turrejargh +turtar +tusa +tuson +tusonaire +tusonar +tussilhar +tust +tustabarta +tustaboisses +tustada +tustadís +tustador +tustaire +tustal +tustament +tustar +tustassada +tustassal +tustassar +tustejargh +tustet +tut +tutar +tutejargh +tutèl +tutelar +tutèrla +tutet +tutolatge +tutor +tutoratge +tutriç +tutritz +Tuvalu +tuvelós +ubac +ubagós +ubrirh +ucada +ucargh +ucles +Ucraïna +ucraïnés +ucraïnian +udòl +udolada +udolaire +udolament +udolant +udolanta +udolar +uèch +uècha +uèi +uèit +uèla +uèlh +uèlhi +ufa +ufan +ufana +ufanejargh +ufanós +ufanosa +ufanosament +uflar +uganaud +uganauda +uganaudalha +uganaudariá +uis +uissa +uisset +uissièr +ulcèra +ulcerar +ulcerèri +ulcèric +ulcerós +ulcerosa +ulhada +ulhar +ulhard +ulhat +ulhauçargh +ulhet +ulhetar +ulheton +ulhièra +ulterior +ulteriora +ultrastructura +uman +umana +umanisar +umanitat +umanizar +umar +umectar +umectèri +umèctic +umid +umida +umide +umidificargh +umiditat +umidós +umidosa +umil +umila +umilament +umiliarazh +umirh +umor +umorejargh +umorós +umorosa +umorosirh +un +una +unanima +unanime +unanimitat +unasQ +uncha +unchar +unchós +unchosa +unchura +unenc +unenc +unencament +unes +UNESCO +Unesco +ungla +únher +unible +unic +unicament +unicellular +unicellulara +unicòrn +unidament +unificargh +unifòrma +unifòrme +uniformisar +uniformizar +uniment +Union +unirh +unitl +unitat +universalisar +universalizar +universitat +uns +untadura +uòch +uòi +uèch +uòlh +uèlh +uòu +upa +upega +ur +urbanisar +urbanisme +urbanistic +urbanistica +urbanizacion +urbanizacion +urbanizar +urina +urinal +urinar +URL +urós +urosa +Uruguai +Urugüai +uruguaian +urugüaian +us +usança +usancièr +usancièra +usar +usatge +usatgièr +usclada +usclar +uscle +usina +usinar +ussa +ussar +ussejargh +ussetar +ustensilha +ustensilhar +ustra +usurar +usurari +usurària +usurièr +usurpar +util +utila +utilament +utilisar +utilitat +utilizabla +utilizable +utilizacion +utilizaira +utilizaire +utilizar +utrièr +utrièra +va +vabor +vabre +vaca +vacada +vacador +vacaire +vacança +vacant +vacargh +vacariá +vacassejargh +vacassièr +vacatièr +vaccinacion +vaccinar +vacilhant +vacilhar +vacillar +vaciu +vagabond +vagabondar +vagabondatge +vagabondejargh +vagament +vaganari +vaganaud +vagant +vagargh +vagina +vagon +vaguejargh +vai +vaigargh +vaigós +vaiguitge +vailèra +vailet +vailetàs +vailetatge +vailetejargh +vaileton +vairada +vairar +vairason +vairat +vairejargh +vairòla +vairolar +vairolèri +vairòlic +vairolós +vairon +vaissa +vaissada +vaissèl +vaissèla +vaisseladoira +vaisselar +vaisselèri +vaissèlic +vaisselièr +vaissiéra +val +valabla +valable +valada +valadada +valadaire +valadar +valadassa +valadejargh +valadet +valadièr +valat +valdre +Valença +valença +Valéncia +Valéncia +valencian +valencian +valent +valentament +valentiá +valentin +valentinés +valentisa +valentitge +valentós +valer +valeriana +Valeta +valeta +valetalha +valguèri +Valhadolid +valhisoletan +vali +valiái +valid +validacion +validar +validitat +valièra +valisa +valòia +valon +valon +valonar +Valonia +valor +valorisacion +valorisar +valorizacion +valorizar +valorós +valorosament +valpauc +valrai +valre +valsar +valva +vam +vampir +van +van +vanaglòria +vanaire +vanament +vanar +vandalisme +vandar +vanega +vanegacion +vanegaire +vanegargh +vaneja +vanejargh +vanèla +vanelós +vanesa +vanetar +vanilha +vanitat +vanitós +vantacion +vantadissa +vantador +vantar +vantard +vantariá +vanteta +vantòrla +vanturla +vantussa +Vanuatu +vapat +vapor +vaporisar +vaporizador +vaporizar +vaporizator +vaporós +vaquejargh +vaquí +vaquièr +vara +varairar +varalhar +varar +varat +varèc +varèit +varejargh +varena +varenglar +variablament +variable +variacion +variament +variància +variant +variar +variça +varièri +varietat +vàriic +varonat +Varsòvia +varsovian +vartavèla +vartavelejargh +vas +vas +vase +vàser +vaset +vason +vassal +vassalatge +vast +vastetat +Vatican +vau +vaur +vàuria +vauriàs +vautra +vautre +veça +vector +vedar +vedejargh +vedèl +vedelar +vedelàs +vedelat +vedelèri +vedelet +vedèlic +vedelièr +vedelon +vedèri +vedeta +vèdic +vedigana +vedilh +vedilha +vedilhada +vedilhaire +vedilhar +vedissa +veëméncia +veëment +vegada +vegelha +vegèri +vegetacion +vegetal +vegetar +veguda +vehicular +veïcul +veïcular +veirai +veiral +veirariá +veiràs +veirat +veiratge +veire +veire +veirejargh +veirenc +vèiria +veirial +veirièr +veirina +veitura +veiturar +veiturin +vejaire +vel +velament +velar +velatge +velejargh +velet +velha +velhada +velhadís +velhador +velhaire +velhairòla +velhar +velheta +velin +velinaire +velòç +velòçament +velocipèd +velocitat +velós +velós +velosar +velosariá +velosat +velut +vena +venada +venador +venaire +venal +venar +venason +venceire +vèncer +vencerai +venci +venciái +vencidor +venciment +vencirh +vencre +venda +vendable +vendeire +vendémia +vendemiador +vendemiaire +vendemiar +vendemièri +vendémiic +vendenhar +vendent +vendeson +vendrai +vendre +vendròi +vendròia +venduda +Venècia +Venècia +venecian +veneçolan +Veneçuèla +venent +venerar +venerèri +venèric +Venèt +venèt +vengargh +venguda +venguèri +vengut +venguts +veni +veniái +venician +venidor +veniment +venir +venjadissa +venjador +venjaire +venjament +venjança +venjargh +venjatiu +venós +venquèri +vent +ventable +ventada +ventadís +ventadoira +ventador +ventaire +ventalh +ventalha +ventalhar +ventar +ventarèl +ventarinada +ventaròla +ventatge +ventejargh +Ventemilha +ventemilhós +ventilar +ventilhon +ventolada +ventolar +ventolejargh +ventolet +ventolin +ventòrla +ventós +ventosar +ventrada +ventralha +ventrar +ventrecosut +ventresca +ventrièra +ventron +ventrós +ventrut +vera +verai +veraiament +verament +vèrb +vèrba +verbal +verbalisar +verbalizar +vèrbe +verbena +vèrbes +vèrbia +vèrbs +verd +verdairòla +verdala +verdan +verdastre +verdejargh +verdelet +verdenc +verdesca +verdirh +verdolàs +verdolejargh +verdolent +verdor +verdós +verdura +verdurar +veren +verenada +verenat +verenejargh +verenhar +verenós +verga +vergada +vergaire +vergargh +verge +vergetar +vergièr +verginal +verginitat +verglaçargh +vergonha +vergonhable +vergonhejargh +vergonhós +vergonhosament +verguejargh +vergueta +verguetar +verificacion +verificargh +verin +verinada +verinós +vèrm +vèrma +vermatat +vermatós +vermelh +vermelhau +vermelhejargh +vermelhòla +vermena +vermenada +vermenadura +vermenar +vermenàs +vermenejargh +vermenenc +vermenet +vermenièr +vermenós +vermicèli +vermilhon +vermisson +vernada +verneda +vernet +verneta +vernhar +vernhat +vèrnhe +vernhèri +vèrnhic +vernièra +vernís +vernissar +vernissenc +vernissòla +Verona +veronés +veronica +verquièra +verrar +verrassejargh +verrèri +vèrric +verrirh +verrolh +verrolhar +verrolhon +verruga +verrugós +vèrs +vèrsa +versada +versadís +versador +versadura +versaire +versament +versant +versar +versemblablament +versemblable +versemblança +versemblant +versèri +vèrsic +versificacion +versificargh +versò +vertadièr +vertadièrament +vertat +vertèbra +vertebral +vertebrat +vertebrat +vertelhar +vertèx +vertical +vertige +vertilhar +vertudós +vertuós +verturós +vertut +vesadament +vesadum +vesadura +vesat +vesc +vescada +vescós +vesedor +vesença +vesenha +vesenhar +vesent +véser +vesi +vesiadament +vesiadar +vesiadejargh +vesiadèla +vesiadissa +vesiadum +vesiadura +vesiái +vesiar +vesiat +vesièri +vésiic +vesin +vesinaire +vesinal +vesinalament +vesinança +vesinar +vesinat +vesinatge +vesinejargh +vesionar +vesita +vesitaire +vesitament +vesitar +vèspa +vespatièra +vesperal +vespertin +vespertinada +vespertinaire +vespertinar +vespièr +vesprada +vespral +vespralh +vespralhada +vespralhar +Vèspras +vèspre +vessiga +vessigargh +vessina +vessinada +vessinaire +vessinar +vèsta +vestiari +vestidura +vestigi +vestiment +vestimenta +vestirh +vestison +vestit +veston +veta +vetar +vetust +veus +veusar +veusatge +veuseta +veusetat +vexar +vexèri +vèxic +via +viaduc +Viana +vianda +vianés +viatge +viatgejargh +viatic +viatjador +viatjaire +viatjargh +vibrar +vibre +vicari +vicariar +vicariat +vicarièri +vicàriic +vici +viciar +vicièri +víciic +viciós +viciosament +victimar +victòria +victoriós +victoriosament +vida +vidalhar +vidanta +vidanta +vidassa +vidimar +vièch +vièlh +vièlha +vielhaca +vielhariá +vielhàs +vielhesa +vielhet +vielhirh +vielhitge +vielhon +vielhós +vielhum +vielhuna +Viena +vienés +vièt +Vietnam +vietnamian +viganha +viganhejargh +viganhièr +vige +vigièr +vigor +vigorós +vigorosament +vigorosetat +viguièr +vijolar +vijolèri +vijòlic +vil +vila +vilament +vilan +vilanalha +vilanament +vilandrés +vilaniá +vilard +vilaret +vilassa +vilata +vilatèla +vilatge +vilatgenc +vilatgésf +vilatjàs +vilatjon +vilatjòt +vilesa +viletat +Vílnius +vilòta +vim +vimada +vimejargh +vimenenc +viminièra +vin +vinada +vinagrada +vinagre +vinagrièr +vinagrièra +vinagrós +vinalha +vinar +vinari +vinassa +vinassós +vinatariá +vinatge +vinatièr +vindicatiu +vindicativa +vinenc +vineta +vinha +vinhairon +vinhairon +vinhairon +vinhal +Vinhana +vinhareda +vinharés +vinheta +vinhon +vinicòla +vinicultura +vinificargh +vinilic +vinòcha +vinolet +vinolièr +vinós +vinotièr +vint +vinten +vintenada +vintenat +viòl +viòl +viòla +violadura +violaire +violament +violant +violar +violat +violéncia +violent +violentament +violentar +violèri +violet +violeta +violetar +violetejargh +violetós +viòlic +violon +violona +violonaire +violonar +violoncèl +violonièr +vipèra +viperin +vira-solelh +vira +virabiquí +virabiquí +virabocargh +viraboquet +viracanton +viracòl +virada +viradèla +viradent +viradís +viradoira +virador +virafàcia +viragang +viragardar +viraire +viral +viralengargh +viraman +viramarion +virament +virant +virapaladas +virapascada +virapassar +virar +virascla +virason +viratge +viravòlta +virginal +Virgínia +viril +virilitat +viròla +virolada +virolar +virolejargh +virolèri +virolet +virolhonar +viròlic +viron +vironar +virondèl +vironejargh +vironet +viròta +viroutar +viroutèri +viròutic +virtual +virus +visada +visar +visatge +visatjargh +visatjon +viscèra +viscoalhas +viscolejargh +viscomtal +viscomtat +viscomte +viscomtessa +viscuda +viscut +visibilitat +visibla +visible +visièra +vision +visitaira +visitaire +visitar +visitor +visplar +vispòla +vispre +vispror +visprós +visquèri +vissar +vist +vistable +vistaflac +vistal +vistalha +vistalhada +vistalhaire +vistalhar +vistar +vistejar +viston +vistoneta +Vistula +visualisacion +visualisar +visualizar +vitalha +viticòla +viticòla +viticòla +viticultor +viticultor +viticultritz +viticultritz +viticultura +viticultura +Vitòria +vitra +vitraire +vitrar +vitratge +vitre +vitrificargh +vitriòl +vitriolar +vitriolèri +vitriòlic +vituperar +vituperèri +vitupèric +vitz +viu +viurai +viure +viutar +viva +vivable +vivaç +vivaça +vivament +vivandièr +vivarés +vivassar +vivent +vivi +viviái +vivificargh +vivotejargh +vlincargh +voarazh +vocabulari +vocabulari +vocacion +vocala +vocalisar +vocalizar +vociferar +vociferèri +vocifèric +vodar +vodèri +vòdic +vodre +vòg +vòga +vòga +vogada +vogaire +vògan +vogar +vogarai +vògas +vogavi +vogem +vogèri +Vòges +vogetz +vogian +vògue +voguejargh +voguem +vòguen +voguèri +vògues +voguetz +vògui +voiatjargh +void +voidada +voidadís +voidador +voidaire +voidança +voidar +voirar +vojada +vojadís +vojador +vojaire +vojança +vojar +vojarai +vojat +vojavi +vòl +volada +voladís +volador +vòlaguiraud +volant +volar +volastrejargh +volatar +volatejargh +volatge +volatil +volatilisar +volatilizar +volatum +volcadís +volcan +volcanic +volcanica +volcanisar +volcanizar +volcargh +volejargh +volença +voléncia +voler +volèri +vòles +voletejargh +Vòlga +vòlga +vòlgan +vòlgas +volguda +volguèri +volguèri +volgut +vòlic +voliái +vòlon +volont +volontar +volontari +volontari +volontària +volontàriament +volontat +volontièr +volontós +volp +volrai +vòls +vòlta +voltaïc +voltar +voltejaire +voltejament +voltejargh +voltor +volubilitat +voludar +volum +volume +volvent +vòlver +volverai +vòlvi +volviái +vòlvre +volzar +vólzer +vomidura +vomirh +vomiscalha +vòmit +vomitar +vonvonar +vonvonejargh +voraçf +voracitat +vòrma +vormalh +vormèla +vormelhut +vormelós +vormós +vos +vosautras +vosautres +vosejargh +voseta +vòstre +vòt +votacion +votant +votar +vòte +votèri +vòtic +votz +vòus +vousam +vousatz +vòuser +vouserai +vousèri +vòusi +vousiái +vòut +vòuta +voutejargh +vòutís +vrenhar +vrespalhar +vudar +vuèg +vuègi +vujar +vulcanisar +vulcanizacion +vulcanizar +vulcanologia +vulgar +vulgarament +vulgarisar +vulgarisme +vulgaritat +vulgarizar +Washington +web +webmèstre +webzine +xenofilia +xenofòbia +xerofil +Yangzi +York +Zagrèb +Zambia +zambian +zambonha +zambonhaire +zapatge +zazó +zebrar +zèbre +zebrèri +zèbric +zefir +zèl +Zelanda +zelat +zelós +zenit +zerò +zigazaguejargh +zigòte +Zimbabwe +zimbabwés +zinc +zingaire +zingargh +zingatge +zinzinar +zinzonejargh +zizania +zoave +zobarga +zodiac +zodiacal +zòna +zongargh +zonzonament +zonzonar +zonzonejargh +zoofit +zoofòbia +zoogeografia +zoolatria +zoospòra +zootaxia +zootecnia +Zuric +zuriqués +zusuba +zusubièr +èsser +èssent +estent +essent +estat +estats +estada +estadas +soi +siáu +ès +sès +sèm +siam +sètz +son +èri +èras +èra +èrem +èretz +èran +foguèri +foguères +foguèt +fogèrem +foguèretz +foguèron +serai +seràs +serà +serem +seretz +seràn +seriái +seriás +seriá +seriam +seriatz +serán +siá +siás +siam +siatz +sián +siasque +siasques +siasquem +siasquetz +siague +siagues +siagam +siaguem +siegui +siegue +fugui +fugue +siegues +fugues +siguem +fuguem +siguetz +fuguetz +siegan +fugan +foguèsse +foguèsses +foguèssem +foguèssetz +foguèsson +foguèssi +foguessiam +foguessiatz +siguèssi +siguèsse +siguèsses +siguessiam +siguessiatz +siguèsson ++++boriagnol +aver +avent +agut +aguts +aguda +agudas +ai +as +a +avèm +avètz +an +aviái +aviás +aviá +aviam +aviatz +avián +aguèri +aguères +aguèt +aguèrem +aguèretz +aguèron +aurai +auràs +auràs +aurem +auretz +auràn +auriái +auriás +auriá +auriam +auriatz +aurián +aja +ajas +ajam +ajatz +ajatz +ajan +age +ages +agem +aguèsse +agèsses +aguèssem +aguèssetz +aguèsson +anar +anant +anat +anats +anada +anadas +vau +vas +vai +va +anam +anem +anatz +van +anavi +anave +anavas +anava +anàvem +anàvetz +anavan +anèri +anères +anèt +anèrem +anèretz +anèron +anarai +anaràs +anarà +anarem +anaretz +anaràn +anirai +aniràs +anirà +anirem +aniretz +aniràn +anariái +anariái +anariás +anariá +anariam +anariatz +anarián +ane +anes +ane +anetz +anen +angue +angues +anguem +anguetz +anguen +vagui +vague +vagues +vague +vagan +anèsse +anèsses +anèssem +anèssetz +anèsson +anguèsse +anguèsses +anguèssem +anguèssetz +anguèsson +dire +díser +disent +diguent +dich +dichas +dit +dita +diches +dichas +dits +ditas +dichs +disi +dises +ditz +disèm +disètz +dison +disiái +disiás +disiá +disiam +disiatz +disián +diguèri +diguères +diguèt +diguèrem +diguèretz +diguèron +dirai +diràs +dirà +direm +diretz +diràn +diga +digas +diga +digam +digatz +digan +digue +digues +diguem +diguent +diguèsse +diguèsses +diguèssem +diguèssetz +diguèsson +-- +venir +venent +venenta +vengut +venguda +venguts +vengudas +veni +venes +ven +venèm +venètz +venon +vèni +vène +vènes +vène +vènon +veniái +veniáu +veniás +veniá +veniam +veniatz +venián +venguèri +venguère +venguères +venguèt +venguèrem +venguèretz +venguèron +vendrai +vendràs +vendrà +vendrem +vendretz +vendràn +vendriái +vendriás +vendriá +vendriam +vendriatz +vendrián +venga +vengas +vengam +vengatz +vengan +vengue +vèngui +vèngues +vèngues +vèngan +venguetz +vengues +venguem +venguen +venguèsse +venguèssi +venguèsses +venguèssem +venguessiam +venguèssetz +venguessiatz +venguèsson +téner +tenir +tenent +tengut +tenguda +tenguts +tengudas +teni +tenes +ten +tenèm +tenètz +tenon +tèni +tène +tènes +tène +tènon +teniái +teniáu +teniás +teniteniam +teniatz +tenián +tenguèri +tenguères +tenguèt +tenguèrem +tenguèretz +tenguèron +tendrai +tendriau +tendràs +tendrà +tendrem +tendretz +tendràn +tenga +tengas +tengam +tengatz +tengan +tengue +tengues +tenguem +tenguem +tèngui +tèngue +tèngues +tèngue +tenguetz +tèngan +tenguèsse +tenguèsses +tenguèssi +tenguèssem +tenguèssetz +tenguèsson +tenguèssiam +tenguessiatz +tenguèsson +far +faire +fasent +fasquent +fent +fach +facha +fat +fata +faches +fachas +fachs +fau +fas +fa +fai +fasèm +fasètz +fan +fèm +fètz +fasiái +fasiáu +fasiás +fasiá +fasiam +fasiatz +fasián +farai +faràs +farà +farem +faretz +faràn +faguèri +faguère +fèri +fère +faguères +fères +faguèt +fèt +fagueriam +feriam +fagueriatz +feriatz +faguèron +fèron +faga +fagas +fagam +fagatz +fagan +fague +fagues +faguem +fasque +fasques +fasquem +fasquen +fagui +fague +faci +face +faces +face +facem +facetz +façan +faguèssi +faguèsse +fèssi +fèsse +faguèsses +fèsses +faguèsses +faguèssem +faguessiam +faguèssetz +faguessiatz +fessiatz +faguèsson +fèsson +veire +véser +vesent +vist +vista +vistes +vistas +vesi +veses +vei +vesèm +vesètz +veson +vese +vieu +viés +vetz +viam +viatz +vién +vesiái +vesiáu +vesiás +vesiá +vesiam +vesiatz +vesián +vegèri +vegères +vegèt +vegèrem +vegèretz +vegèron +veguèri +veguère +veguères +veguèt +vegueriam +vegueriatz +veguèron +veirai +veiràs +veirà +veirem +veiretz +veiràn +veiriái +veiriáu +veiriás +veiriái +veiriam +veiriatz +veirián +veja +vejas +vejam +vejatz +vejan +vege +veges +vegem +vegen +vegui +vegue +vegues +vegue +veguem +veguetz +vegan +vegèsse +vegèsses +vegèssem +vegèssetz +vegèsson +veguèssi +veguèsses +veguèsse +veguessiam +veguessiatz +véguèsson +ve +beure +bevent +begut +beguda +beguts +begudas +bevi +beve +beves +beu +bevèm +bevètz +bevon +beviái +beviáu +beviás +beviá +beviam +beviatz +bevián +beurai +beuràs +beurà +beurem +beuretz +beuràn +beguèri +beguère +beguères +beguèt +beguèrem +begueriam +beguèretz +begueriatz +beguèron +bega +begas +begam +bagatz +began +begui +begue +begues +begue +beguem +beguetz +beguèsse +beguèssi +beguèsses +beguèssem +beguessiam +beguèssetz +beguessiatz +beguèsson +beuriái +beuriáu +beuriás +beuriá +beuriam +beuriatz +beurián +aduire +adusent +aduch +aducha +aduit +aduita +aduches +aduchas +aduits +aduitas +adusi +adutz +adugèri +adusiái +aduga +ardre +ardent +ars +arsa +ardi +ard +ardèri +arda +ardètz +astrénher +astrenhent +astrench +astrenhu +astrenh +astrenguèri +astreniái +astrenga +bolir +bolent +bolit +bolida +boli +bol +boliguèri +bola +caire +càser +casent +casut +casuda +casi +cai +catz +casiái +caiga +calgut +calguda +calguèt +caliá +calga +calgue +cambiant +cambiat +candiada +càmbii +càmbi +cambièri +càmbie +caupre +cabent +cabut +cabuda +cabuts +cabudas +cabi +caupi +caup +caupèri +caibiái +càpia +cabètz +cénher +cengent +cench +cint +cinta +cenhi +cenh +cenhèri +cenha +claure +clausent +claus +clausa +clausi +clau +clauguèri +clausiái +clauga +cobrir +cobèrt +cuèbri +cuèbra +cuèrp +cobrent +cubrent +cobrèmcòire +cosent +cuèch +cuèit +còit +cuècha +cuèta +còita +còsi +còi +coguèri +còga +conclure +concluent +conclús +conclusa +conclutz +conclusi +concluguèri +concluga +conéisser +coneissent +conegut +conneguda +coneis +coneguèri +coneissiái +conesca +construire +construsent +construisi +construga +construtz +construch +construcha +còser +cosent +cosut +cosuda +cosi +cos +cosèri +cosiái +cosa +creire +cresent +cregut +creguda +cresi +crei +crega +créisser +creissent +crescut +crescuda +creis +cresca +crénher +crenhent +crengut +crenguda +crenhu +crenguèri +crenhiái +crenha +culhir +culhent +culhit +culhida +cuèlhi +cuèlh +cuèlha +deure +devent +degut +deguda +deguts +degudas +devi +deu +deguèri +deviái +dega +dòler +dolent +dolgut +dolguda +dòli +dòl +doolguèri +doliái +dòlga +dorment +dormit +dormida +dòrmi +dòrm +dormiguèri +dormiái +dòrma +empénher +empenhent +empench +empenhu +empenh +empenga +escrivent +escrich +escricha +escrit +escrita +escriu +escriga +estau +està +estèri +estavi +èste +falhir +falhent +falhit +falh +falha +nàisser +naissent +nascut +nascuda +nais +naissi +nasquèri +nasca +nòire +nosent +nogut +noguda +nòsi +nòtz +nòga +paréisser +pareissent +paregut +pareguda +pareis +paresca +plasent +plagut +plasi +plai +platz +plasiái +plaga +plovent +plogut +ploguda +plòu +plèu +ploguèt +ploviá +ploga +pogut +poguda +pòt +pòsca +pòsque +prenent +pres +preni +pren +prenga +prusent +prusit +prusi +prutz +pruga +quèrre +querent +querit +querida +quièri +quièr +quereguèri +queriái +recebent +recebut +recebuda +recebi +recep +receupèri +recépia +risent +rigut +riguda +risi +ritz +riga +sabent +sabut +sabi +sap +saupèri +sàpia +sèire +sesent +segut +seguda +sèsi +sèi +sètz +sèga +tenent +tengut +tenguda +tenga +ten +trasent +trach +tracha +trait +traita +trasi +trai +traguèri +traga +valent +valgut +valguda +val +valga +véncer +vencent +vencut +cencuda +venci +venç +venquèri +cenciái +vença +venca +volent +volgut +volguda +volguts +volgudas +vòl +vòlga +vòlgue +vòlgas +vòlgues +vòli +vòle +vòles +vòls +vòs +vòl +volèm +volètz +vòlon +voliáu +voliái +voliás +voliá +volgam +volguem +volgatz +vòlgan +volguèsse +volguèssi +volguèsses +volguèssem +volguèsson +volriái +volriás +volriá diff --git a/ppocr/utils/corpus/readme.md b/ppocr/utils/corpus/readme.md new file mode 100644 index 0000000000000000000000000000000000000000..c1783e04011b510d71334e2f0cf2cb0a53dbdc11 --- /dev/null +++ b/ppocr/utils/corpus/readme.md @@ -0,0 +1,6 @@ +# Waiting for your contribution + +PaddleOCR welcomes you to provide multilingual corpus for us to synthesize more data to optimize the model. + +If you are interested, you can submit the corpus text to this directory and name it with {language}_corpus.txt. +PaddleOCR thanks for your contribution. \ No newline at end of file diff --git a/ppocr/utils/corpus/readme_ch.md b/ppocr/utils/corpus/readme_ch.md new file mode 100644 index 0000000000000000000000000000000000000000..444dfe159ed0d63a14acf0830e06796ef9f82920 --- /dev/null +++ b/ppocr/utils/corpus/readme_ch.md @@ -0,0 +1,8 @@ +# 欢迎贡献语料 + +PaddleOCR非常欢迎你提供多语言的语料,以供我们合成更多数据来优化模型。 + +如你感兴趣,可将语料文本提交到此目录,并以 {语言}_corpus.txt 命名,PaddleOCR团队感谢你的贡献。 + + + diff --git a/ppocr/utils/french_dict.txt b/ppocr/utils/dict/french_dict.txt similarity index 100% rename from ppocr/utils/french_dict.txt rename to ppocr/utils/dict/french_dict.txt diff --git a/ppocr/utils/german_dict.txt b/ppocr/utils/dict/german_dict.txt similarity index 100% rename from ppocr/utils/german_dict.txt rename to ppocr/utils/dict/german_dict.txt diff --git a/ppocr/utils/japan_dict.txt b/ppocr/utils/dict/japan_dict.txt similarity index 99% rename from ppocr/utils/japan_dict.txt rename to ppocr/utils/dict/japan_dict.txt index ddcc89f7c3ef011274862b1d573d079b76129ff2..339d4b89e5159a346636641a0814874faa59754a 100644 --- a/ppocr/utils/japan_dict.txt +++ b/ppocr/utils/dict/japan_dict.txt @@ -1,4399 +1,4399 @@ -誰 +! +" +# +$ +% +& +' +( +) +* ++ +, +- +. +/ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +: +; +< += +> +? +A +B +C +D +E +F +G +H +I +J +K +L +M +N +O +P +Q +R +S +T +U +V +W +X +Y +Z +[ +] +_ +` +a +b +c +d +e +f +g +h +i +j +k +l +m +n +o +p +q +r +s +t +u +v +w +x +y +z +© +° +² +´ +½ +Á +Ä +Å +Ç +È +É +Í +Ó +Ö +× +Ü +ß +à +á +â +ã +ä +å +æ +ç +è +é +ê +ë +í +ð +ñ +ò +ó +ô +õ +ö +ø +ú +û +ü +ý +ā +ă +ą +ć +Č +č +đ +ē +ė +ę +ğ +ī +ı +Ł +ł +ń +ň +ō +ř +Ş +ş +Š +š +ţ +ū +ż +Ž +ž +Ș +ș +ț +Δ +α +λ +μ +φ +Г +О +а +в +л +о +р +с +т +я +ồ +​ +— +― +’ +“ +” +… +℃ +→ +∇ +− +■ +☆ +  +、 +。 +々 +〆 +〈 +〉 +「 +」 +『 +』 +〔 +〕 +〜 +ぁ +あ +ぃ +い +う +ぇ +え +ぉ +お +か が -一 -番 -に -着 +き +ぎ く -か -私 -は -分 -り -ま +ぐ +け +げ +こ +ご +さ +ざ +し +じ +す +ず せ -ん -。 -多 -の -動 -物 -人 -間 -よ +ぜ +そ +ぞ +た +だ +ち +ぢ っ +つ +づ て -滅 -ぼ -さ -れ -た -テ -ニ -ス -部 -員 で -す -エ -ミ -幸 -そ -う -見 -え -こ -事 -実 -を -心 -留 -め -お -い -下 -彼 -女 -ち -世 -話 -し -る -達 -国 -際 -な と -思 -約 -束 -破 -べ -き -あ -道 -路 -横 -切 -車 -注 -意 -生 -甲 -斐 -父 -外 -へ -行 -承 -知 -弁 -当 -食 -ょ -小 -説 -1 -つ -も -読 ど -ら -、 -母 -親 -少 -似 -卑 -屈 -奴 -曇 -日 -音 -楽 -好 -本 -ず -仕 -引 -受 -け -サ -ッ -カ -ー -以 -前 -今 -気 -混 +な +に +ぬ +ね +の +は ば -問 -題 -2 -時 -待 -ボ -ブ -友 -だ -ぞ -午 -後 -家 -来 -子 -供 -ろ -申 -告 -何 -夕 -済 +ぱ +ひ +び +ぴ +ふ +ぶ +ぷ +へ +べ +ぺ +ほ +ぼ +ぽ +ま み -雪 -降 -陰 -口 -言 -的 -年 -馬 -鹿 -ね -大 -変 -忙 -危 -険 -遅 -刻 -度 -学 -校 -入 -電 -々 -酒 -飲 む -顔 -奇 -妙 -聞 -自 -慢 -声 -ク -ラ -男 -数 -3 -0 -歴 -史 -試 -験 -計 -画 -反 -対 -づ -先 -渡 -連 -恐 -羽 -振 -ロ -ン -ド -合 -由 -舞 -靴 -向 -手 -紙 -週 -休 -釣 -ひ +め +も +ゃ +や +ゅ +ゆ +ょ +よ +ら +り +る +れ +ろ わ -? -頼 +ゑ +を +ん +ゝ +ゞ +ァ ア -メ -リ -婦 -結 -婚 -猫 -木 -登 -ぶ -ジ -ョ -駅 -方 -歩 -怒 -必 -要 -折 -返 -ケ -キ -召 -上 -成 -功 -努 -力 -選 -び -屋 -坂 -東 -京 -育 -月 -曜 -終 -買 -戦 -争 -起 -目 -覚 -病 -院 -元 -無 -セ -フ -阪 -や -格 -祝 -ゆ -十 -中 -八 -九 -勘 -定 -我 -ほ -叫 -耳 -通 -書 -帽 -5 -ル -朝 -君 -兄 -交 -故 -亡 -単 -純 -列 -止 -老 -全 -新 -忠 -尊 -重 -解 -決 -欲 -ざ -僕 -浮 -件 -裁 -持 +ィ イ -ギ -味 -夢 -ぎ -続 -ぜ -直 -接 -考 -頭 -別 -住 -辞 -役 -立 -明 -違 -指 -摘 -勇 -答 -適 -冷 -売 -旅 -疲 -辺 -鄙 -村 -訪 -水 -回 -両 -昨 -映 -空 -太 -陽 -輝 -正 -賛 -町 -案 -内 -助 -会 -次 -延 -期 -チ -ム -最 -価 -値 -タ -シ -歌 -他 -劣 -勉 -強 +ゥ +ウ ェ -喜 -伝 -職 -業 -関 -係 -誉 -犬 -近 -座 -転 -使 -妹 -建 -奥 -損 -野 -球 -緒 -繊 -細 -出 -教 -マ -駄 -石 -油 -不 -足 -震 -ト -同 -じ +エ +ォ +オ +カ ガ +キ +ギ +ク +グ +ケ +ゲ +コ +ゴ +サ +ザ +シ +ジ +ス +ズ +セ +ゼ +ソ +ゾ +タ +ダ +チ +ヂ +ッ ツ -発 -表 -然 -失 -敗 -滞 -在 +ヅ +テ +デ +ト +ド +ナ +ニ +ヌ +ネ +ノ +ハ バ -コ -吸 -平 -和 -泳 -寒 -秋 -社 -台 -短 -死 -情 -報 -民 -政 -府 -作 -帰 -宅 -順 -調 -真 -仮 -命 -用 -箱 -階 -運 -長 -ご -腕 -放 -乗 -利 -程 -腹 -悪 -念 -怖 -形 -抗 -議 -ゲ -面 -白 -記 -憶 -姉 -都 -劇 -残 -早 -信 -懸 -ャ -品 パ -初 -開 -理 -誤 -急 -ぐ -簡 -易 -英 -語 -娘 -寝 -赤 -ゃ -願 -障 -金 -支 -払 -冒 -論 -ぱ -確 ヒ -産 -火 -散 -守 -有 -名 -医 -者 -毎 -渋 -レ ビ -消 -服 -宿 -署 -齢 -ポ -突 -げ -良 -徒 -貧 -戻 -牛 -二 -夫 -脱 -暑 -湖 -深 -普 -段 -謝 -優 -甘 -ソ -非 -常 -場 -警 -察 -呼 -誘 -惑 -坊 -字 -可 -能 -料 -涙 -落 -量 -妻 -愛 -界 -温 -授 -船 -酔 -万 -仲 -付 -捜 -静 -若 -ダ -招 -追 -夜 -雨 -述 -山 -獲 -訳 -居 -異 -熱 -息 -点 -主 -質 -始 -花 -飾 -幼 -寂 -興 -プ -触 -活 -オ -青 -春 -尋 -盲 -燃 -傷 -科 -晩 -騒 -機 -限 -予 -想 -望 -代 -薬 -効 -「 -風 -共 -去 -ぬ -」 -孤 -独 -店 -径 -ュ -態 -銀 -認 -至 -驚 -美 -添 -光 ピ -ノ -伴 -奏 -嬉 -7 -除 -席 -吹 -創 -設 -市 -! -髪 -悔 -秘 -密 -高 -地 -丸 -悲 -極 -暇 -葉 -速 -走 -三 -企 -天 -茶 -働 -演 -8 -泣 -公 -園 -原 -因 -勝 -標 -進 +フ +ブ +プ ヘ -郵 -便 -局 -農 -遊 -到 -笑 -冬 -ィ -参 -加 -版 -暗 -絶 -誕 -6 -歳 -鍵 -絵 -栄 -将 -張 -過 -弾 -ふ -等 -具 -雇 -賞 -得 -絞 -取 -健 -康 -身 -頂 -客 -迎 -所 -夏 -海 -草 -ヨ -配 -古 -鳴 -庭 -探 -偶 -眠 -昼 -禁 -煙 -提 -閉 -飛 -魚 -捕 -断 -武 -装 -背 -街 -丘 -ホ -泊 -快 -求 -怠 -惰 -グ -欠 -片 -視 -特 -難 -締 -半 -壁 -困 -冗 -談 -族 -神 -戸 -遣 -状 -握 -第 -ザ -師 -倍 -級 -逆 -為 -化 -恩 -諸 -貸 -卒 -諦 -互 -依 -存 -円 -嫌 -紳 -士 -凍 -誇 -例 -迷 -否 -準 -備 -専 -晴 -満 -邪 -腰 -痛 -菜 -商 -離 -疑 -資 -送 -忘 -暖 -素 -敵 -窓 -色 -写 -途 -文 -防 -識 -4 -側 -叱 -裕 -福 -果 -移 -停 -百 -魔 -性 -郎 -感 -耐 -治 -恋 -敬 -様 -診 -橋 -安 -慰 -貴 -眺 -討 -処 -逃 -符 -許 -狂 -審 -軽 -率 -恵 -規 -則 -猶 -借 -歯 -録 -責 -任 -絡 -爆 -撃 -趣 -替 -芝 -捨 -抜 -費 -ペ -黙 -床 -個 -裏 -暮 -叔 ベ -尽 -迫 -材 -田 -舎 -没 -侮 -辱 -施 -歓 -援 -滑 -恥 -飯 -置 -徹 -廃 -机 -退 -拝 -詰 -ぁ -蝙 -蝠 -従 -王 -札 -幌 -氏 -随 -縁 -整 -頓 -ぽ -概 -六 -川 -岸 -博 -館 -図 -慣 -儀 -像 -緻 -昇 -土 -伏 -悩 -敷 -包 -囲 -善 -肉 -担 -偽 -呂 -盛 -噂 -希 -序 -焼 -狭 -掌 -苦 -避 -積 -港 -復 -荷 -御 -嘘 -徳 -ゴ -再 -粧 -卵 -繰 -習 -畑 -匹 -是 -星 -景 -余 -永 -久 -デ -盗 -ヤ -巨 -遠 -械 -愚 -洗 -濯 -珍 -溶 -込 -履 -昔 -千 -泥 -棒 -号 -乏 -偉 -継 -ウ -崩 -勤 -務 -術 -克 -聴 -権 -惚 -弟 -体 -飼 -軒 -犯 -課 -修 -四 -鮮 -汽 -鳥 -現 -旧 -塔 -冊 -五 -塩 -経 -批 -判 -簿 -棚 -才 -研 -究 -ぷ -類 -覆 -祈 -往 -妨 -柄 -財 -捧 -衛 -距 -闇 -著 -区 -隣 -相 -比 -頃 -就 -矛 -盾 -広 -掛 -典 -型 -制 -憎 -殺 -モ -嘆 -雄 -鼓 -負 -右 -窮 -法 -掃 -繕 -篠 -流 -章 -看 -杯 -植 -評 -枚 -叶 -抑 -滴 -斎 -森 -額 -蛮 -ナ -攻 -雅 -米 -雑 -編 -換 -構 -詳 -帳 -厳 -ワ -預 -室 -更 -銘 -与 -濃 -臭 -布 -衆 -撮 -舌 -容 -貌 -乳 -喫 -固 -巣 -懇 -奈 -群 -集 -皆 -影 -響 -ネ -悟 -弱 -ハ -嗅 -飽 -完 -了 -浴 -昆 -虫 -ヌ -乱 -描 -俺 -首 -嵐 -給 -低 -派 -衝 -団 -投 -函 -礼 -島 -委 -官 -周 -鋭 -宝 -契 -採 -致 -漏 -翻 -洋 -恒 -保 -証 -筆 -潜 -ォ -枯 -打 -憩 -護 -尾 -埋 -紹 -介 -城 -谷 -沈 -季 -節 -巻 -倒 -巡 -姿 -踏 -黒 -己 -沿 -ぇ -懐 -扮 -詩 -労 -左 -底 -占 -差 -架 -壊 -ゼ -欺 -検 -造 -寄 -庫 -眼 -鏡 -慮 -郊 -購 -営 -駐 -血 -模 -ズ -収 -越 -板 -癌 -飢 -井 -罵 -忍 -増 -賢 -涼 -荒 -踊 -些 -並 -省 -銃 -州 -症 -麻 -雀 -濡 -般 -展 -覧 -紅 -統 -領 -ぴ -松 -江 -c -d -講 -義 -熟 -扶 -養 -属 -9 -鹸 -遇 -寿 -司 -憂 -乾 -唱 -割 -皿 -拭 -貯 -箇 -殴 -鉛 -狙 -蒸 -雲 -椅 -未 -練 -卓 -ぺ -淑 -壇 -憲 -末 -沙 -汰 -操 -匙 -抱 -候 -鼻 -ヶ -蔑 -毛 -勢 -償 -浜 -激 -倹 -製 -宛 -ゅ -翌 -稿 -鞄 -届 -慌 -扱 -式 -組 -瓶 -渉 -句 -技 -陸 -器 -河 -衰 -納 -律 -罰 -譲 -旨 -補 -傘 -贈 -請 -駆 -腐 -ァ -線 -丁 -骨 -筋 -伺 -丈 -祖 -孫 -犠 -牲 -遭 -肌 -綺 -麗 -魂 -種 -減 -唯 -婆 -推 -薦 -訓 -曲 -睡 -頑 -s -f -勧 -印 -刷 -錠 -励 -胆 -糧 -績 -排 -剣 -岳 -涯 -競 -精 -敏 -衣 -赦 -志 -位 -胸 -堅 -販 -査 -税 -壷 -暴 -露 -益 -敢 -撒 -喧 -嘩 -蹴 -沢 -妊 -娠 -芸 -航 -催 -射 -超 -改 -戒 -n -a -泉 -奪 -零 -咲 -隠 -遺 -憾 -漱 -肥 -輩 -房 -寺 -奨 -脚 -汚 -煩 -弥 -怪 -免 -氷 -灯 -総 -ユ -戚 -掘 -維 -釈 -拾 -凝 -漫 -兵 -痔 -馳 -粋 -微 -訴 -浅 -緩 -崖 -覗 -塞 -虚 -北 -湘 -南 -賭 -腎 -臓 -仰 -仙 -筈 -砂 -糖 -干 -唾 -観 -娯 -臆 -門 -宇 -宙 -複 -毒 -奮 -患 -撲 -控 -液 -貫 -禄 -辛 -郷 -稼 -餓 -痙 -攣 -秀 -澄 -遂 -挨 -拶 -慈 -富 -豪 -溺 -県 -緑 -籠 -刑 -根 -脅 -誌 -訂 -揺 -築 -罪 -喋 -陥 -姫 -髭 -剃 -害 -疎 -銭 -墓 -賦 -押 -穴 -淡 -噛 -賃 -導 -域 -肩 -尻 -伯 -牧 -傾 -基 -又 -咳 -邦 -貨 -豊 -挑 -偏 -溜 -傲 -樹 -含 -滝 -魅 -嫉 -妬 -脇 -謎 -磨 -括 -佐 -猛 -烈 -玄 -吉 -執 -応 -及 -拒 -顎 -鬚 -既 -狐 -浣 -腸 -隅 -拡 -吠 -璧 -ヴ -顧 -睦 -湯 -幾 -輪 -七 -絹 -湿 -疹 -池 -袋 -灰 -摂 -即 -紛 -刈 -況 -染 -矢 -聖 -塗 -伸 -浪 -岩 -餌 -戴 -鎖 -宣 -測 -工 -被 -象 -痩 -搭 -妥 -協 -汗 -救 -跳 -裂 -林 -檎 -棲 -帝 -潮 -侵 -略 -柔 -票 -蝶 -肯 -筒 -呆 -沼 -厚 -宗 -梨 -軍 -蔵 -較 -羨 -粛 -痢 -愉 -儲 -癒 -鬱 -幹 -掴 -鎮 -縫 -炎 -示 -諾 -寛 -虜 -瀬 -鉄 -祭 -醜 -菓 -項 -岡 -胎 -拠 -択 -網 -拳 -党 -繁 -熊 -爪 -慎 -墜 -穏 -募 -縦 -伊 -藤 -胃 -惜 -芽 -誠 -薄 -嫁 -譜 -寮 -薔 -薇 -賜 -1 -2 -l -i -y -潔 -充 -据 -舟 -遮 -寸 -猿 -・ -抵 -暢 -錆 -脈 -挙 -瞬 -萎 -聡 -埠 -琵 -琶 -黄 -策 -宜 -梅 -各 -匂 -清 -撥 -載 -境 -吐 -怯 -唸 -却 -拍 -端 -吻 -惨 -剤 -甥 -核 -緊 -香 -層 -系 -躍 -嬢 -縛 -酸 -t -〆 -鱗 -堂 -算 -貢 -献 -威 -監 -督 -針 -襲 -銅 -姪 -幽 -霊 -癖 -綾 -扉 -雹 -崎 -条 -療 -封 -癇 -癪 -揮 -碁 -瓜 -泰 -嘲 -錯 -凡 -碗 -豚 -哀 -児 -童 -虐 -蕩 -刺 -波 -貰 -凪 -炭 -嚢 -索 -圧 -均 -帯 -u -o -峠 -西 -騙 -肘 -砕 -黍 -革 -棄 -俳 -秩 -如 -宵 -竜 -姓 -噴 -閑 -幅 -虎 -塀 -堪 -鈴 -双 -照 -淋 -葬 -悠 -蝿 -鳩 -獄 -晒 -j -仏 -某 -享 -尿 -慶 -裸 -丹 -( -) -杖 -逮 -徴 -災 -〔 -〕 -酷 -角 -炉 -僚 -揚 -馴 -珠 -霧 -詞 -潟 -陣 -鍋 -拘 -焦 -h -k -蜜 -蜂 -穂 -湾 -弄 -跡 -麓 -蔭 -讐 -弊 -董 -〜 -綴 -ゾ -膳 -称 -痒 -倉 -怨 -掻 -蓄 -茨 -摩 -厄 -陳 -詫 -贔 -屓 -桃 -赴 -墟 -湧 -逢 -隻 -― -伎 -潰 -鯔 -鑑 -鯨 -炊 -腑 -獣 -勿 -禎 -沖 -縄 -蕾 -股 -娩 -枝 -殆 -氾 -濫 -乞 -恨 -豆 -禿 -釧 -扇 -誓 -躊 -躇 -徐 -貿 -雷 -鋳 -飴 -洞 -窟 -粗 -鎌 -鈍 -刊 -狼 -煎 -幻 -旗 -狩 -耕 -範 -掲 -源 -漢 -枕 -嬌 -莫 -券 -崇 -隔 -袈 -裟 -里 -暫 -虹 -櫛 -硬 -此 -縮 -m -兆 -轢 -帆 -這 -央 -俗 -瞼 -頻 -需 -餐 -琴 -羊 -令 -薫 -勃 -朽 -虻 -賑 -刀 -籍 -漂 -煽 -斉 -株 -褒 -膝 -, -C -D -叩 -鶏 -N -A -S -糸 -. -挟 - -胡 -椒 -玩 -祉 -" -0 -— -併 -蛾 -ゥ -郡 -` -' -・ -9 -6 -8 -3 -- -拿 -爵 -准 -幕 -5 -~ -副 -鞭 -7 -兼 -: -á -ň -宮 -廷 -磁 -4 -ó -菌 -卿 -皇 -峰 -% -貝 -軟 -, -把 -携 -/ -析 -ž -盤 -斑 -輸 -託 -隊 -蓋 -『 -』 -彩 -& -詠 -篇 -騎 -_ -晋 -釜 -尚 -欧 -紀 -管 -渓 -韓 -李 -栽 -培 -尉 -骸 -ă -ş -剖 -翼 -亜 -羅 -奉 -畔 -拓 -環 -礁 -枢 -斜 -漕 -艇 -稀 -臣 -勲 -棘 -艦 -盟 -粒 -闘 -å -戯 -∇ -柵 -醸 -礎 -旬 -聘 -矮 -棟 -碑 -殿 -億 -! -惧 -抽 -迭 -% -  -垂 -還 -澤 -輔 -粉 -齊 -秦 -砲 -屯 -織 -胞 -諮 -殊 -媒 -嫡 -綱 -搬 -該 -透 -禽 -弦 -瞭 -坦 -浸 -韻 -竪 -墳 -隷 -撤 -哲 -叙 -é -庶 -紡 -禍 -肺 -婉 -$ -沃 -鬼 -棋 -揃 -楊 -綿 -訟 -遁 -妄 -玉 -軌 -榴 -蘇 -臨 -疇 -披 -顕 -圏 -Ș -融 -擦 -Č -č -埃 -曖 -昧 -旋 -瞳 -謡 -衡 -槍 -茎 -唐 -轄 -郴 -捉 -覇 -嘉 -陵 -嘴 -蔓 -嘱 -閲 -征 -謄 -胚 -陶 -浦 -勅 -芻 -疾 -昏 -; -耗 -践 -禅 -襟 -曹 -瞑 -ș -偵 -酬 -駿 -蔡 -諷 -瑁 -í -è -: -ø -呈 -笠 -岬 -洛 -聾 -唖 -溝 -堀 -雌 -牝 -仔 -尼 -庁 -穫 -妖 -曽 -= -= -嗜 -珊 -瑚 -軸 -# -紋 -劉 -璿 -胤 -墉 -彫 -盆 -饗 -宴 -挿 -蔽 -脳 -暦 -ä -õ -廊 -讃 -ë -促 -峻 -壌 -訛 -鉱 -姦 -唆 -舗 -迂 -ñ -弘 -昌 -舶 -箔 -冠 -溢 -鶴 -肛 -脊 -柱 -傑 -智 -彦 -朋 -昪 -靖 -姻 -哨 -尺 -冥 -​ -剪 -“ -” -L -P -- -瀕 -ö -津 -汐 -泌 -皮 -膚 -肢 -只 -鍮 -斧 -壮 -倫 -幣 -儒 -遷 -殻 -惹 -累 -ß -珪 -弛 -曝 -浙 -華 -柿 -哺 -ü -& -W -Z -X -I -薪 -E -M -ę -雰 -媚 -艶 -蹄 -拐 -ř -â -塊 -箋 -漠 -呪 -Ł -ą -ł -挽 -灌 -漑 -煉 -瓦 -G -μ -迅 -+ -猥 -褻 -頬 -逐 -廠 -ć -邸 -疼 -伐 -燥 -凌 -駕 -錐 -尖 -û -呉 -翔 -憤 -慨 -琥 -珀 -漸 -堆 -ā -亀 -肖 -T -R -à -枠 -桁 -剰 -匿 -秤 -厩 -褐 -Ž -đ -Ä -趙 -š -餃 -擁 -脆 -脂 -肪 -漿 -× -晶 -岐 -遍 -謙 -殉 -弓 -Ü -昭 -Å -* -澎 -擬 -債 -秒 -猟 -歪 -阻 -砦 -凸 -諜 -ı -… -腫 -晃 -也 -龍 -燕 -閣 -ê -眉 -牡 -旺 -ç -ō -恣 -疆 -坐 -孵 -搾 -傍 -■ -削 -唇 -釉 -凹 -囚 -魏 -腱 -謀 -ţ -堤 -# -笛 -靭 -V -B -崗 -О -с -т -р -о -в -Г -а -л -я -膜 -椎 -帥 -剛 -梢 -俊 -蟹 -腿 -牽 -粘 -葦 -ń -劾 -祥 -紺 -ヵ -芳 -須 -賀 -填 -殖 -痺 -浚 -渫 -H -F -ī -匯 -Š -寡 -閃 -É -疫 -庇 -而 -頁 -侯 -挺 -畳 -浄 -淘 -杭 -K -縞 -牙 -循 -髄 -Á -屑 -朴 -p -隆 -傭 -紫 -峡 -謬 -ã -膠 -瘍 -瞞 -鋸 -塁 -鋼 -雛 -弧 -ğ -桂 -½ -唄 -扁 -α -酵 -’ -; -肝 -Ö -孔 -彙 -φ -梁 -栖 -妃 -蛹 -勾 -欄 -茂 -漁 -晦 -遼 -寧 -吊 -刃 -彰 -之 -濁 -喪 -僧 -萬 -膣 -那 -蛍 -鍛 -麦 -腺 -ô -Ó -λ -尤 -z -Δ -ż -ò -℃ -肋 -臍 -丼 -´ -踵 -宏 -朱 -燻 -漬 -霜 -+ -巧 -鐘 -冶 -膿 -疱 -寓 -蚊 -匠 -檻 -桟 -洪 -后 -ū -楕 -垣 -孝 -e -r -O -耽 -© -鴨 -杉 -烏 -啓 -Ç -痴 -祀 -贅 -荘 -濾 -ú -瞰 -U -埼 -窒 -沸 -騰 -閾 -È -樽 -→ -陪 -Ş -酢 -ė -漆 -喰 -汎 -< -æ -乙 -² -倣 -− -葛 -墨 -腔 -坑 -緋 -稚 -潤 -侶 -喚 -踪 -穀 -膨 -畜 -陛 -巾 -鉢 -彗 -臼 -杵 -Í -罹 -狡 -猾 -凱 -塑 -頸 -梱 -矯 -竹 -焙 -窄 -剥 -捗 -憧 -袖 -ð -榮 -ț -閥 -窩 -沌 -抄 -遡 -> -鳳 -凰 -痕 -蛇 -矩 -罠 -詐 -ý -楼 -庵 -ē -° -賊 -ồ -爬 -柑 -橘 -曾 -郭 -措 -栗 -桐 -粥 -C -O -E -卯 -詮 -忌 - -倭 -禰 -菖 -蒲 -條 -祓 -幡 -A -B -L -G -T -M -S -u -( -) -a -. -W -i -V -b -c -f -e -N -K -R -U -D -g -P -醍 -醐 -F -Z -I -H -Q -y -o -t -J -ヂ -J -槙 -嵯 -峨 -畿 -塚 -Y -X -淀 -伽 -s -ヅ -餅 -蒡 -穣 -ゞ -絲 -p -鯖 -n -琳 -柳 -髷 -閤 -稲 -菊 -巌 -迦 -抹 -曳 -叡 -壺 -苑 -羌 -狗 -ヰ -醤 -ぉ -硝 -袴 -倶 -汁 -但 -杮 -葺 -煮 -爺 -夙 -桜 -亭 -ゑ -苗 -m -曼 -荼 -簪 -☆ -辻 -鑢 -ゝ -稗 -蹊 -貼 -獅 -廟 -阿 -陀 -蘭 -妓 -翠 -柚 -賓 -芦 -拉 -麺 -帷 -或 -槐 -屎 -j -惟 -撫 -瑞 -侍 -巴 -廉 -峯 -菩 -薩 -吽 -弖 -彌 -佛 -耨 -閇 -貞 -闍 -閦 -洲 -妾 -仁 -宕 -媛 -隧 -笥 -葵 -茜 -譚 -渥 -旭 -綬 -霰 -楓 -雁 -朗 -渕 -梓 -巫 -姐 -鉾 -囃 -藩 -藺 -鮎 -粟 -袷 -篤 -杏 -遵 -徽 -宍 -瓊 -堵 -猷 -馨 -與 -麿 -冨 -彷 -徨 -湊 -菅 -按 -渠 -龗 -鞍 -采 -琢 -枳 -詣 -祇 -稙 -祐 -毅 -冲 -坡 -阯 -堯 -庄 -掾 -牟 -豫 -尹 -弉 -牌 -鑒 -夷 -俘 -喬 -暁 -允 -亮 -緯 -繋 -偈 -誡 -諡 -瑠 -璃 -弼 -岑 -亥 -郁 -媞 -磯 -佳 -翁 -蹟 -揆 -槻 -嗣 -恭 -熈 -畝 -噌 -燈 -脩 -佩 -閻 -壱 -逸 -眷 -誼 -籌 -芋 -鰯 -璽 -旛 -鑰 -摺 -鉤 -淫 -祠 -凉 -牒 -款 -蟄 -丞 -鋒 -檗 -帖 -菟 -荻 -邨 -厨 -佑 -乃 -鷺 -屏 -柴 -於 -箒 -祷 -蓮 -鵜 -丑 -寅 -碓 -渦 -蔚 -鰻 -姥 -毘 -閏 -涌 -庸 -樂 -祚 -邵 -虞 -邇 -悦 -栃 -怡 -斯 -榎 -厭 -爾 -圓 -應 -吏 -并 -堰 -奄 -掩 -壕 -稔 -焔 -w -猴 -@ -薗 -諏 -窯 -甚 -麹 -竈 -无 -穢 -窠 -廻 -寇 -鈞 -菴 -鍍 -珉 -慕 -詢 -肇 -羲 -莽 -襖 -鴎 -錦 -紗 -胴 -輿 -玲 -畷 -窪 -徂 -徠 -對 -桶 -螺 -鈿 -麝 -巳 -卸 -寵 -狛 -裳 -剋 -喩 -樋 -噺 -藍 -婢 -梵 -樫 -鷲 -嶽 -憐 -宰 -塾 -蔬 -涅 -槃 -址 -耆 -穎 -糠 -鰭 -俣 -咒 -鼠 -裘 -筯 -繍 -宸 -翰 -魁 -隈 -匡 -熙 -翫 -畠 -瓢 -壽 -卉 -筐 -僑 -蝦 -蹉 -k -v -跋 -釐 -堕 -h -r -d -哩 -l -樓 -霞 -韶 -碩 -皓 -臥 -鷹 -淵 -篭 -收 -桑 -誅 -國 -竄 -煕 -苔 -晏 -韋 -芥 -墾 -闔 -梆 -拵 -舅 -鎧 -蛙 -播 -楯 -廓 -暹 -惠 -瑜 -鑁 -舘 -恂 -衞 -嶋 -駒 -箏 -悼 -橿 -梶 -箸 -烹 -喝 -稽 -餡 -鰹 -樺 -㈱ -兜 -竃 -炒 -盒 -茅 -萱 -嶺 -藉 -苅 -坤 -闥 -懲 -湛 -藁 -衙 -饉 -戈 -桓 -衫 -聚 -潅 -藷 -糟 -妍 -竿 -絃 -罷 -擾 -疏 -鈔 -銕 -亟 -瀧 -勒 -躰 -佶 -錬 -慧 -檀 -聨 -頴 -亘 -尭 -愿 -贋 -證 -撰 -附 -阜 -毫 -漉 -惣 -蘂 -爐 -賎 -祢 -刹 -叉 -饅 -茲 -菱 -筮 -澳 -纂 -楚 -辰 -詔 -遐 -蟻 -吾 -萩 -鞠 -謹 -叢 -伍 -卜 -吃 -桔 -梗 -砧 -敦 -仇 -宥 -飫 -粂 -廿 -鼎 -逕 -嬪 -箭 -恤 -杣 -舖 -汲 -竟 -邃 -糾 -邑 -哇 -〈 -〉 -圀 -盡 -儼 -椋 -籃 -芹 -滋 -蛤 -淳 -駝 -猪 -沂 -稜 -莵 -藏 -經 -筍 -茗 -侠 -凶 -蓆 -紐 -蕎 -魯 -朔 -澗 -藻 -甫 -琮 -鬘 -欣 -欽 -笙 -舜 -闕 -煇 -鈎 -騨 -蒔 -鰐 -埵 -幢 -鑽 -嵌 -楷 -榛 -錍 -鈷 -笈 -鐸 -磬 -碧 -熨 -斗 -翅 -襴 -鑚 -鵄 -吟 -垢 -掟 -卦 -筑 -茄 -葱 -竴 -廼 -玖 -珂 -跏 -蝉 -誄 -串 -沓 -游 -蕃 -蕪 -鍬 -粮 -諭 -盃 -葩 -迪 -圭 -廬 -諶 -德 -祕 -裃 -荊 -洒 -蟷 -螂 -腋 -袍 -髮 -禮 -趺 -堺 -嘗 -甞 -帛 -蝕 -芿 -讀 -褌 -坪 -簒 -鋤 -硯 -翺 -棺 -胝 -篩 -磐 -隋 -諫 -亨 -旦 -孚 -叟 -曉 -盈 -澪 -懿 -爲 -琦 -愔 -圃 -濱 -奘 -諺 -藪 -註 -蜘 -蛛 -鞏 -篷 -閨 -裡 -糊 -賁 -跨 -劫 -壬 -絁 -釘 -譬 -聯 -傳 -芒 -體 -髻 -悉 -荏 -綸 -柏 -珣 -撹 -芬 -裔 -焚 -廂 -饌 -嵩 -簾 -匣 -禊 -籤 -奠 -鯉 -幟 -脛 -巷 -楳 -胖 -庚 -浩 -諒 -溥 -丙 -楠 -冑 -班 -學 -麞 -緬 -肱 -砥 -縢 -耶 -舂 -靈 -砌 -樗 -暉 -蛸 -鞆 -芙 -蓉 -雙 -鴻 -臚 -褄 -濠 -奢 -槌 -紘 -框 -蓑 -甑 -忽 -淆 -艮 -樵 -竭 -羯 -牢 -櫃 -鸞 -拙 -椿 -榊 -肴 -萠 -綜 -鮭 -笹 -苞 -硫 -奸 -徭 -躯 -戟 -襷 -閘 -櫓 -嘯 -臂 -實 -椏 -潴 -藐 -麒 -麟 -烝 -杜 -籐 -槇 -曰 -筰 -懺 -縣 -褥 -輯 -蚕 -斬 -庖 -謌 -璞 -屍 -團 -哉 -畏 -塵 -什 -鳶 -鴉 -濤 -縒 -趾 -櫻 -麩 -曠 -愍 -彊 -驕 -姶 -兎 -鴫 -竺 -僊 -雫 -彭 -灘 -餝 -棗 -蔀 -侑 -弗 -婬 -牘 -訶 -衍 -錫 -惺 -熹 -顛 -呑 -粕 -楞 -咀 -詛 -釋 -瑋 -曄 -筧 -誾 -徧 -虔 -蒐 -酋 -會 -頌 -齋 -誦 -戎 -袿 -繹 -榱 -酥 -碕 -汪 -奔 -曙 -鶯 -囀 -裾 -楮 -歎 -嬬 -婿 -升 -晧 -娼 -祟 -楢 -蓬 -杢 -篁 -柯 -弐 -几 -渤 -憙 -蜀 -芭 -蕉 -恕 -谿 -樟 -訢 -蒋 -鉦 -鍾 -馗 -鞘 -殷 -臈 -檄 -滿 -憑 -埴 -劔 -寶 -鐵 -姨 -耀 -僭 -襄 -疋 -蘆 -靺 -鞨 -悌 -仍 -枡 -鱈 -籬 -芯 -酉 -姜 -陞 -睿 -逗 -頚 -迹 -掬 -巒 -槽 -滸 -魄 -錘 -饋 -椙 -彬 -狄 -躬 -瀋 -奎 -悍 -總 -瑛 -禧 -廣 -塘 -蓼 -兌 -碾 -桝 -瞿 -醒 -苧 -嶂 -韮 -薙 -皺 -莞 -膏 -贄 -咋 -啄 -鎚 -汀 -鏃 -龕 -衷 -諱 -駈 -笄 -酌 -觀 -礙 -杓 -决 -覲 -甕 -栴 -絅 -晟 -銑 -珈 -琲 -膩 -愷 -蕭 -戮 -租 -戔 -嗚 -盞 -鵞 -軾 -昉 -爽 -宋 -匝 -瑳 -逝 -蕨 -欅 -黌 -蒼 -鎗 -惇 -其 -攘 -杲 -斥 -傅 -鞁 -毬 -璋 -賈 -蹲 -踞 -黛 -鯛 -鉋 -姞 -葡 -萄 -訥 -輌 -閬 -鬯 -靜 -瑩 -孁 -洹 -闡 -盧 -猩 -岫 -套 -巖 -篳 -篥 -舩 -覺 -沅 -衒 -凞 -祺 -袱 -托 -蟇 -巽 -藹 -狸 -衾 -ぢ -蘊 -顗 -鮒 -遥 -邊 -箆 -簀 -雍 -筌 -漣 -筅 -鈦 -夾 -紵 -梧 -賣 -凋 -弔 -霖 -劭 -餉 -ぃ -篋 -諚 -朕 -茸 -栂 -佃 -柘 -蔦 -鍔 -逍 -綏 -碇 -逓 -鄭 -鏑 -簺 -棹 -卍 -痘 -闢 -籟 -饂 -飩 -澱 -汝 -邉 -儛 -暾 -屠 -祁 -砺 -俵 -蒙 -藝 -熾 -洽 -榜 -莱 -璵 -蕊 -髙 -鄰 -z -穆 -姚 -忻 -竝 -苡 -諟 -媓 -嫄 -忯 -鐙 -撞 -綽 -璨 -鑼 -苫 -煌 -皋 -當 -捺 -邁 -瞻 -舍 -[ -] -糜 -輦 -啼 -捻 -襠 -涛 -瀾 -娑 -諧 -毀 -簫 -溪 -煤 -賠 -奕 -蜷 -雉 -咫 -暲 -艘 -拏 -筏 -塙 -蜊 -隼 -纏 -叛 -彈 -枇 -杷 -柊 -畢 -逼 -桧 -鴛 -鴦 -蝋 -燭 -箪 -豹 -鋲 -蛭 -囉 -羂 -羈 -逞 -單 -蛎 -萍 -糞 -站 -騏 -鮫 -昂 -袒 +ペ +ホ +ボ +ポ +マ +ミ +ム +メ +モ +ャ +ヤ +ュ +ユ +ョ +ヨ +ラ +リ +ル +レ +ロ +ワ +ヰ +ン +ヴ +ヵ +ヶ +・ +ー +㈱ +一 +丁 +七 +万 +丈 +三 +上 +下 +不 +与 +丑 且 -鎬 -戊 -瓔 -珞 -俸 -檜 -萌 -萊 -俔 -潭 -鵬 -翡 -柾 -亦 -玅 -箕 -咸 -獏 -瞋 -聊 -礬 -孟 -氈 -銚 -葭 -橇 -籾 -澂 -匁 -嬾 -淇 -薮 -愈 -茹 -揖 -僮 -渾 -蜻 -蛉 -羹 -酪 -洸 -嶠 -癡 -畺 -謫 -琉 -瀑 -湫 -賤 -摸 -濟 -淄 -伶 -聲 -莬 -禖 -韜 -彝 -珎 -賄 -賂 -亙 -彎 -椀 +世 +丘 +丙 +丞 +両 +並 +中 +串 +丸 +丹 +主 +丼 丿 -舒 +乃 +久 +之 +乎 +乏 +乗 +乘 +乙 +九 +乞 +也 +乱 +乳 +乾 +亀 +了 +予 +争 +事 +二 +于 +互 +五 +井 +亘 +亙 +些 +亜 +亟 +亡 +交 +亥 +亦 +亨 +享 +京 +亭 +亮 +人 +什 +仁 +仇 +今 +介 +仍 +仏 +仔 +仕 +他 仗 -佚 +付 +仙 +代 +令 +以 +仮 +仰 +仲 +件 +任 +企 +伊 +伍 +伎 +伏 +伐 +休 +会 +伝 +伯 估 +伴 +伶 +伸 +伺 +似 +伽 +佃 +但 +位 +低 +住 +佐 +佑 +体 +何 +余 +佚 +佛 +作 +佩 +佳 +併 +佶 +使 +侈 +例 +侍 侏 +侑 侘 +供 +依 +侠 +価 +侮 +侯 +侵 +侶 +便 +係 +促 +俄 +俊 +俔 +俗 +俘 +保 +信 +俣 +俤 +修 俯 +俳 +俵 +俸 +俺 +倉 +個 +倍 +倒 +候 +借 +倣 +値 +倫 +倭 +倶 +倹 偃 -偕 +假 +偈 +偉 +偏 偐 +偕 +停 +健 +側 +偵 +偶 +偽 傀 +傅 +傍 +傑 +傘 +備 +催 +傭 +傲 +傳 +債 +傷 +傾 +僊 +働 +像 +僑 +僕 +僚 +僧 +僭 +僮 +儀 +億 +儇 +儒 +儛 +償 儡 -遜 +優 +儲 儺 +儼 兀 +允 +元 +兄 +充 +兆 +先 +光 +克 +兌 +免 +兎 +児 +党 +兜 +入 +全 +八 +公 +六 +共 +兵 +其 +具 +典 +兼 +内 +円 +冊 +再 +冑 +冒 +冗 +写 +冠 冤 -菫 +冥 +冨 +冬 +冲 +决 +冶 +冷 +准 +凉 +凋 +凌 +凍 +凛 +凝 +凞 +几 +凡 +処 +凪 +凰 +凱 +凶 +凸 +凹 +出 +函 +刀 +刃 +分 +切 +刈 +刊 刎 -畸 +刑 +列 +初 +判 +別 +利 +刪 +到 +制 +刷 +券 +刹 +刺 +刻 +剃 +則 +削 +剋 +前 +剖 +剛 +剣 +剤 +剥 +剪 +副 +剰 +割 +創 剽 -窃 -辨 -號 +劇 +劉 +劔 +力 +功 +加 +劣 +助 +努 +劫 +劭 +励 +労 +効 +劾 +勃 +勅 +勇 +勉 +勒 +動 +勘 +務 +勝 +募 +勢 +勤 +勧 +勲 +勺 +勾 +勿 +匁 +匂 +包 匏 +化 +北 +匙 +匝 +匠 +匡 +匣 +匯 +匲 +匹 +区 +医 +匿 +十 +千 +升 +午 +卉 +半 +卍 +卑 +卒 +卓 +協 +南 +単 +博 +卜 +占 +卦 +卯 +印 +危 +即 +却 +卵 +卸 +卿 +厄 +厚 +原 厠 +厨 +厩 +厭 +厳 +去 +参 +又 +叉 +及 +友 +双 +反 +収 +叔 +取 +受 +叙 +叛 +叟 +叡 +叢 +口 +古 +句 +叩 +只 +叫 +召 +可 +台 +叱 +史 +右 +叶 +号 +司 +吃 +各 +合 +吉 +吊 +同 +名 +后 +吏 +吐 +向 +君 吝 -嗇 +吟 +吠 +否 +含 +吸 +吹 +吻 +吽 +吾 +呂 +呆 +呈 +呉 +告 +呑 +周 +呪 +呰 +味 +呼 +命 +咀 咄 +咋 +和 +咒 +咫 +咲 +咳 +咸 +哀 +品 +哇 +哉 +員 +哨 +哩 哭 +哲 +哺 +唄 +唆 +唇 +唐 +唖 +唯 +唱 唳 +唸 +唾 +啄 +商 +問 +啓 +啼 +善 +喋 +喚 +喜 +喝 +喧 +喩 +喪 +喫 +喬 +單 +喰 +営 +嗅 +嗇 嗔 +嗚 +嗜 +嗣 +嘆 +嘉 +嘗 +嘘 +嘩 +嘯 +嘱 +嘲 +嘴 +噂 +噌 +噛 +器 +噴 +噺 嚆 -譯 -乘 +嚢 +囀 +囃 +囉 +囚 +四 +回 +因 +団 +困 +囲 +図 +固 +国 +圀 +圃 +國 +圏 +園 +圓 +團 圜 +土 +圧 +在 +圭 +地 +址 +坂 +均 +坊 +坐 +坑 +坡 +坤 +坦 +坪 +垂 +型 +垢 +垣 +埃 +埋 +城 埒 +埔 +域 +埠 +埴 +埵 +執 +培 +基 +埼 +堀 +堂 +堅 +堆 +堕 +堤 +堪 +堯 +堰 +報 +場 +堵 +堺 +塀 +塁 +塊 +塑 +塔 +塗 +塘 +塙 +塚 +塞 +塩 +填 +塵 +塾 +境 +墉 +墓 +増 +墜 +墟 +墨 +墳 +墺 +墻 +墾 +壁 +壇 +壊 +壌 +壕 +士 +壬 +壮 +声 +壱 +売 +壷 壹 +壺 +壽 +変 +夏 +夕 +外 +夙 +多 +夜 +夢 夥 +大 +天 +太 +夫 夬 夭 +央 +失 +夷 +夾 +奄 +奇 +奈 +奉 +奎 +奏 +契 +奔 +奕 +套 +奘 +奠 +奢 +奥 +奨 +奪 +奮 +女 +奴 +奸 +好 +如 +妃 +妄 +妊 +妍 +妓 +妖 +妙 +妥 +妨 +妬 妲 -沆 +妹 +妻 +妾 +姉 +始 +姐 +姓 +委 +姚 +姜 +姞 +姥 +姦 +姨 +姪 +姫 +姶 +姻 +姿 +威 +娑 +娘 娟 +娠 +娩 +娯 +娼 +婆 +婉 +婚 +婢 +婦 +婬 +婿 +媄 +媒 +媓 +媚 +媛 +媞 媽 +嫁 +嫄 +嫉 +嫌 +嫐 嫗 +嫡 +嬉 +嬌 +嬢 +嬪 +嬬 +嬾 +孁 +子 +孔 +字 +存 +孚 +孝 +孟 +季 +孤 +学 +孫 +孵 +學 +宅 +宇 +守 +安 +宋 +完 +宍 +宏 +宕 +宗 +官 +宙 +定 +宛 +宜 +宝 +実 +客 +宣 +室 +宥 +宮 +宰 +害 +宴 +宵 +家 +宸 +容 +宿 +寂 +寄 +寅 +密 +寇 +富 +寒 +寓 +寔 +寛 +寝 +察 +寡 +實 +寧 +審 +寮 +寵 +寶 +寸 +寺 +対 +寿 +封 +専 +射 +将 +尉 +尊 +尋 +對 +導 +小 +少 +尖 +尚 +尤 +尪 +尭 +就 +尹 +尺 +尻 +尼 +尽 +尾 +尿 +局 +居 +屈 +届 +屋 +屍 +屎 +屏 +屑 +屓 +展 +属 +屠 +層 +履 +屯 +山 +岐 +岑 +岡 +岩 +岫 +岬 +岳 岷 +岸 +峠 +峡 +峨 +峯 +峰 +島 +峻 +崇 +崋 +崎 +崑 +崖 +崗 +崛 +崩 +嵌 +嵐 +嵩 +嵯 +嶂 +嶋 +嶠 +嶺 +嶼 +嶽 +巀 +巌 +巒 +巖 +川 +州 +巡 +巣 +工 +左 +巧 +巨 +巫 +差 +己 +巳 +巴 +巷 +巻 +巽 +巾 +市 +布 +帆 +希 +帖 帚 +帛 +帝 +帥 +師 +席 +帯 +帰 +帳 +帷 +常 +帽 幄 -幔 +幅 幇 -淨 -繼 +幌 +幔 +幕 +幟 +幡 +幢 +幣 +干 +平 +年 +并 +幸 +幹 +幻 +幼 +幽 +幾 +庁 +広 +庄 +庇 +床 +序 +底 +庖 +店 +庚 +府 +度 +座 +庫 +庭 +庵 +庶 +康 +庸 +廂 +廃 +廉 +廊 +廓 +廟 +廠 +廣 +廬 +延 +廷 +建 +廻 +廼 +廿 +弁 +弄 +弉 +弊 +弌 +式 +弐 +弓 +弔 +引 +弖 +弗 +弘 +弛 +弟 +弥 +弦 +弧 +弱 +張 +強 +弼 +弾 +彈 +彊 +彌 +彎 +当 +彗 +彙 +彝 +形 +彦 +彩 +彫 +彬 +彭 +彰 +影 +彷 +役 +彼 +往 +征 +徂 +径 +待 +律 +後 +徐 徑 +徒 +従 +得 +徠 +御 +徧 +徨 +復 +循 +徭 +微 +徳 +徴 +德 +徹 +徽 +心 +必 +忉 +忌 +忍 +志 +忘 +忙 +応 +忠 +快 +忯 +念 +忻 +忽 忿 +怒 +怖 +思 +怠 +怡 +急 +性 +怨 +怪 +怯 +恂 +恋 +恐 +恒 +恕 +恣 +恤 +恥 +恨 +恩 恬 +恭 +息 +恵 +悉 +悌 +悍 +悔 +悟 +悠 +患 +悦 +悩 +悪 +悲 +悼 +情 +惇 +惑 +惚 +惜 +惟 +惠 +惣 +惧 +惨 +惰 +想 +惹 +惺 +愈 +愉 +愍 +意 +愔 +愚 +愛 +感 +愷 +愿 +慈 +態 +慌 +慎 +慕 +慢 +慣 +慧 +慨 +慮 +慰 +慶 +憂 +憎 +憐 +憑 +憙 +憤 +憧 +憩 +憬 +憲 +憶 +憾 +懇 +應 +懌 +懐 +懲 +懸 +懺 懽 +懿 +戈 +戊 戌 +戎 +成 +我 +戒 +戔 +或 +戚 +戟 +戦 截 +戮 +戯 +戴 +戸 +戻 +房 +所 +扁 +扇 +扈 +扉 +手 +才 +打 +払 +托 +扮 +扱 +扶 +批 +承 +技 +抄 +把 +抑 +抓 +投 +抗 +折 +抜 +択 +披 +抱 +抵 +抹 +押 +抽 +担 拇 +拈 +拉 +拍 +拏 +拐 +拒 +拓 +拘 +拙 +招 +拝 +拠 +拡 +括 +拭 +拳 +拵 +拶 +拾 +拿 +持 挂 +指 +按 +挑 +挙 +挟 +挨 +振 +挺 +挽 +挿 +捉 +捕 +捗 +捜 +捧 +捨 +据 +捺 +捻 +掃 +掄 +授 +掌 +排 掖 +掘 +掛 +掟 +採 +探 掣 +接 +控 +推 +掩 +措 +掬 +掲 +掴 +掻 +掾 +揃 +揄 +揆 揉 +描 +提 +揖 +揚 +換 +握 +揮 +援 揶 -揄 +揺 +損 搦 +搬 +搭 +携 +搾 +摂 +摘 +摩 +摸 +摺 +撃 +撒 +撞 +撤 +撥 +撫 +播 +撮 +撰 +撲 +撹 +擁 +操 +擔 +擦 +擬 +擾 +攘 攝 +攣 +支 +收 +改 +攻 +放 +政 +故 +敏 +救 +敗 +教 +敢 +散 +敦 +敬 +数 +整 +敵 +敷 +斂 +文 +斉 +斎 +斐 +斑 +斗 +料 +斜 斟 +斤 +斥 +斧 +斬 +断 +斯 +新 +方 +於 +施 旁 +旅 +旋 +旌 +族 +旗 +旛 +无 旡 +既 +日 +旦 +旧 +旨 +早 +旬 +旭 +旺 旻 +昂 +昆 +昇 +昉 +昌 +明 +昏 +易 +昔 +星 +映 +春 +昧 +昨 +昪 +昭 +是 昵 +昼 +晁 +時 +晃 +晋 +晏 +晒 +晟 +晦 +晧 +晩 +普 +景 +晴 +晶 +智 +暁 +暇 暈 +暉 +暑 +暖 +暗 +暘 +暢 +暦 +暫 +暮 +暲 +暴 +暹 +暾 +曄 +曇 +曉 +曖 +曙 +曜 +曝 +曠 +曰 +曲 +曳 +更 +書 +曹 +曼 +曽 +曾 +替 +最 +會 +月 +有 +朋 +服 朏 +朔 +朕 +朗 +望 +朝 +期 朧 +木 +未 +末 +本 +札 +朱 +朴 +机 +朽 杁 +杉 +李 +杏 +材 +村 +杓 +杖 +杜 杞 +束 +条 +杢 +杣 +来 +杭 +杮 +杯 +東 +杲 +杵 +杷 +杼 +松 +板 枅 -矧 -梟 -梔 -梛 +枇 +析 +枓 +枕 +林 +枚 +果 +枝 +枠 +枡 +枢 +枯 +枳 +架 +柄 +柊 +柏 +某 +柑 +染 +柔 +柘 +柚 +柯 +柱 +柳 +柴 +柵 +査 +柾 +柿 +栂 +栃 +栄 +栖 +栗 +校 +株 +栲 +栴 +核 +根 +栻 +格 +栽 +桁 +桂 +桃 +框 +案 +桐 +桑 +桓 +桔 +桜 +桝 +桟 +桧 桴 +桶 桾 +梁 +梅 +梆 +梓 +梔 +梗 +梛 +條 +梟 +梢 +梧 +梨 +械 +梱 +梲 +梵 +梶 +棄 +棋 +棒 +棗 +棘 +棚 +棟 +棠 +森 +棲 +棹 +棺 +椀 +椅 +椋 +植 +椎 +椏 +椒 +椙 +検 椥 -楫 椹 +椿 +楊 +楓 +楕 +楚 +楞 +楠 楡 +楢 +楨 楪 +楫 +業 +楮 +楯 +楳 +極 +楷 +楼 +楽 +概 +榊 +榎 +榕 +榛 +榜 +榮 +榱 +榴 +槃 +槇 +槊 +構 +槌 +槍 +槐 +様 +槙 +槻 +槽 槿 +樂 +樋 +樓 +樗 +標 +樟 +模 +権 +横 +樫 +樵 +樹 +樺 +樽 +橇 +橋 +橘 +機 +橿 +檀 +檄 +檎 檐 +檗 +檜 檣 -檸 +檥 檬 +檮 +檸 +檻 +櫃 +櫓 +櫛 櫟 +櫨 +櫻 +欄 +欅 +欠 +次 +欣 +欧 +欲 +欺 +欽 +款 +歌 +歎 +歓 +止 +正 +此 +武 +歩 +歪 +歯 +歳 +歴 +死 +殆 +殉 +殊 +残 +殖 殯 -麾 +殴 +段 +殷 +殺 +殻 +殿 +毀 +毅 +母 +毎 +毒 +比 +毘 +毛 +毫 +毬 +氈 +氏 +民 +気 +水 +氷 +永 +氾 +汀 +汁 +求 +汎 +汐 +汗 +汚 +汝 +江 +池 +汪 +汰 +汲 +決 +汽 +沂 +沃 +沅 +沆 +沈 +沌 沐 +沓 +沖 +沙 +没 +沢 +沱 +河 +沸 +油 +治 +沼 沽 +沿 +況 +泉 +泊 +泌 +法 +泗 +泡 +波 +泣 +泥 +注 +泯 +泰 +泳 +洋 +洒 +洗 +洛 +洞 +津 +洩 +洪 +洲 +洸 +洹 +活 +洽 +派 +流 +浄 +浅 +浙 +浚 +浜 +浣 +浦 +浩 +浪 +浮 +浴 +海 +浸 +涅 +消 +涌 +涙 +涛 +涯 +液 涵 +涼 +淀 +淄 +淆 +淇 +淋 +淑 +淘 +淡 淤 +淨 +淫 +深 +淳 +淵 +混 +淹 +添 +清 +済 +渉 +渋 +渓 +渕 +渚 +減 +渟 +渠 +渡 +渤 +渥 +渦 +温 +渫 +測 +港 +游 +渾 +湊 +湖 +湘 +湛 +湧 +湫 +湯 +湾 +湿 +満 +源 +準 +溜 +溝 +溢 +溥 +溪 +溶 +溺 滄 -滕 +滅 +滋 滌 +滑 +滕 +滝 +滞 +滴 +滸 +滹 +滿 +漁 +漂 +漆 +漉 +漏 +漑 +演 +漕 +漠 +漢 +漣 +漫 +漬 +漱 +漸 +漿 +潅 +潔 +潙 +潜 +潟 +潤 +潭 +潮 +潰 +潴 澁 -眞 +澂 +澄 +澎 +澗 +澤 +澪 +澱 +澳 +激 +濁 +濃 +濟 +濠 +濡 +濤 +濫 +濯 +濱 +濾 +瀉 +瀋 +瀑 +瀕 +瀞 瀟 +瀧 +瀬 +瀾 +灌 灑 +灘 +火 +灯 +灰 +灸 +災 +炉 +炊 +炎 +炒 +炭 炮 +炷 +点 +為 +烈 +烏 烙 +烝 +烹 +焔 +焙 +焚 +無 +焦 +然 +焼 +煇 +煉 +煌 +煎 +煕 +煙 +煤 +煥 +照 +煩 煬 +煮 +煽 +熈 +熊 +熙 +熟 +熨 +熱 +熹 +熾 +燃 +燈 +燎 燔 +燕 +燗 +燥 +燭 +燻 +爆 +爐 +爪 +爬 +爲 +爵 +父 +爺 +爼 +爽 +爾 +片 +版 +牌 +牒 +牘 +牙 +牛 +牝 +牟 +牡 +牢 +牧 +物 +牲 +特 +牽 犂 +犠 +犬 +犯 +状 +狂 +狄 +狐 +狗 +狙 +狛 +狡 +狩 +独 +狭 狷 +狸 +狼 猊 -祗 -瑾 -瑪 +猛 +猟 +猥 +猨 +猩 +猪 +猫 +献 +猴 +猶 +猷 +猾 +猿 +獄 +獅 +獏 +獣 +獲 +玄 +玅 +率 +玉 +王 +玖 +玩 +玲 +珀 +珂 +珈 +珉 +珊 +珍 +珎 +珞 +珠 +珣 +珥 +珪 +班 +現 +球 +理 +琉 +琢 +琥 +琦 +琮 +琲 +琳 +琴 +琵 +琶 +瑁 +瑋 瑙 +瑚 +瑛 +瑜 +瑞 +瑠 +瑤 +瑩 +瑪 +瑳 +瑾 +璃 +璋 +璜 +璞 +璧 +璨 +環 +璵 +璽 +璿 +瓊 +瓔 +瓜 +瓢 +瓦 +瓶 甍 +甑 +甕 +甘 +甚 +甞 +生 +産 +甥 +用 +甫 +田 +由 +甲 +申 +男 +町 +画 +界 +畏 +畑 +畔 +留 +畜 +畝 +畠 +畢 +略 +番 +異 +畳 +當 +畷 +畸 +畺 +畿 +疆 +疇 +疋 +疎 +疏 +疑 +疫 +疱 +疲 +疹 +疼 +疾 +病 +症 +痒 +痔 +痕 +痘 +痙 +痛 +痢 +痩 +痴 +痺 +瘍 瘡 瘧 +療 +癇 +癌 +癒 +癖 +癡 +癪 +発 +登 +白 +百 +的 +皆 +皇 +皋 +皐 +皓 +皮 +皺 +皿 盂 -鉉 +盃 +盆 +盈 +益 +盒 +盗 +盛 +盞 +盟 +盡 +監 +盤 +盥 +盧 +目 +盲 +直 +相 +盾 +省 +眉 +看 +県 +眞 +真 +眠 +眷 +眺 +眼 +着 +睡 +督 +睦 睨 +睿 +瞋 +瞑 +瞞 +瞬 +瞭 +瞰 +瞳 +瞻 +瞼 +瞿 矍 -鑠 +矛 矜 +矢 +知 +矧 +矩 +短 +矮 +矯 +石 +砂 +砌 +研 +砕 +砥 +砦 +砧 +砲 +破 +砺 +硝 +硫 +硬 +硯 +碁 +碇 碌 +碑 +碓 +碕 +碗 碣 +碧 +碩 +確 +碾 +磁 +磐 磔 +磧 +磨 +磬 +磯 +礁 +礎 礒 +礙 礫 +礬 +示 +礼 +社 +祀 +祁 +祇 +祈 +祉 +祐 +祓 +祕 +祖 +祗 +祚 +祝 +神 +祟 +祠 +祢 +祥 +票 +祭 +祷 +祺 +禁 +禄 +禅 +禊 +禍 +禎 +福 +禔 +禖 +禛 +禦 +禧 +禮 +禰 禹 +禽 +禿 +秀 +私 +秋 +科 +秒 +秘 +租 +秤 +秦 +秩 +称 +移 +稀 +程 +税 +稔 +稗 +稙 +稚 +稜 稠 +種 稱 +稲 +稷 +稻 +稼 +稽 +稿 +穀 +穂 +穆 +積 +穎 +穏 +穗 +穜 +穢 +穣 +穫 +穴 +究 +空 +突 +窃 +窄 +窒 +窓 +窟 +窠 +窩 +窪 +窮 +窯 +竃 +竄 +竈 +立 +站 +竜 +竝 +竟 +章 +童 +竪 +竭 +端 +竴 +競 +竹 +竺 +竽 +竿 +笄 +笈 笏 +笑 +笙 +笛 笞 +笠 +笥 +符 +第 +笹 +筅 +筆 +筇 +筈 +等 +筋 +筌 +筍 +筏 +筐 +筑 +筒 +答 +策 +筝 筥 +筧 筬 -箜 -篌 -筝 +筮 +筯 +筰 +筵 +箆 +箇 +箋 +箏 +箒 +箔 +箕 +算 箙 +箜 +管 +箪 +箭 +箱 +箸 +節 +篁 +範 篆 -籀 +篇 +築 +篋 +篌 篝 +篠 +篤 +篥 +篦 +篩 +篭 +篳 +篷 +簀 +簒 +簡 簧 +簪 +簫 +簺 +簾 +簿 +籀 +籃 +籌 +籍 +籐 +籟 +籠 +籤 +籬 +米 +籾 +粂 +粉 +粋 +粒 +粕 +粗 +粘 +粛 +粟 +粥 +粧 +粮 粳 +精 +糊 +糖 +糜 +糞 +糟 +糠 +糧 糯 +糸 糺 +系 +糾 +紀 +約 +紅 +紋 +納 +紐 +純 +紗 +紘 +紙 +級 +紛 +素 +紡 +索 +紫 +紬 +累 +細 +紳 +紵 +紹 +紺 +絁 +終 +絃 +組 +絅 +経 +結 絖 +絞 +絡 +絣 +給 +統 +絲 +絵 +絶 +絹 絽 +綏 +經 +継 +続 +綜 綟 -縅 -繦 +綬 +維 +綱 +網 +綴 +綸 +綺 +綽 +綾 +綿 +緊 +緋 +総 +緑 +緒 +線 +締 緥 +編 +緩 +緬 +緯 +練 +緻 +縁 +縄 +縅 +縒 +縛 +縞 +縢 +縣 +縦 +縫 +縮 縹 -繧 +總 +績 +繁 +繊 +繋 +繍 +織 +繕 繝 -纐 +繦 +繧 +繰 +繹 +繼 +纂 纈 +纏 +纐 +纒 纛 +缶 罔 +罠 罧 +罪 +置 +罰 +署 +罵 +罷 +罹 +羂 +羅 +羆 羇 +羈 +羊 +羌 +美 +群 +羨 +義 +羯 +羲 +羹 +羽 +翁 +翅 +翌 +習 +翔 +翛 +翠 +翡 +翫 +翰 +翺 +翻 +翼 +耀 +老 +考 +者 +耆 +而 +耐 +耕 +耗 +耨 +耳 +耶 +耽 +聊 +聖 +聘 +聚 +聞 +聟 +聡 +聨 +聯 聰 +聲 +聴 +職 +聾 肄 -膀 +肆 +肇 +肉 +肋 +肌 +肖 +肘 +肛 +肝 +股 +肢 +肥 +肩 +肪 +肯 +肱 +育 +肴 +肺 +胃 +胆 +背 +胎 +胖 +胚 +胝 +胞 +胡 +胤 胱 +胴 +胸 +能 +脂 +脅 +脆 +脇 +脈 +脊 +脚 +脛 +脩 +脱 +脳 +腋 +腎 +腐 +腑 +腔 +腕 +腫 +腰 +腱 +腸 +腹 +腺 +腿 +膀 +膏 +膚 +膜 +膝 +膠 +膣 +膨 +膩 +膳 膵 膾 +膿 +臂 +臆 +臈 +臍 +臓 臘 +臚 +臣 +臥 +臨 +自 +臭 +至 +致 +臺 +臼 +舂 +舅 +與 +興 +舌 +舍 +舎 +舒 +舖 +舗 +舘 +舜 +舞 +舟 +舩 +航 +般 舳 -范 -鷄 -苻 +舶 +船 +艇 +艘 +艦 +艮 +良 +色 +艶 +芋 +芒 +芙 +芝 +芥 +芦 +芬 +芭 +芯 +花 +芳 +芸 +芹 +芻 +芽 +芿 +苅 +苑 +苔 +苗 +苛 +苞 +苡 +若 +苦 +苧 +苫 +英 苴 -擔 +苻 +茂 +范 +茄 +茅 +茎 +茗 +茘 +茜 +茨 +茲 +茵 +茶 +茸 +茹 +草 +荊 +荏 +荒 +荘 +荷 +荻 +荼 +莞 莪 +莫 +莬 +莱 +莵 +莽 +菅 +菊 +菌 +菓 +菖 +菘 +菜 +菟 +菩 +菫 +華 +菱 +菴 +萄 +萊 +萌 +萍 +萎 +萠 +萩 +萬 +萱 +落 +葉 +著 +葛 +葡 +董 +葦 +葩 +葬 +葭 +葱 +葵 +葺 +蒋 +蒐 +蒔 +蒙 蒟 +蒡 +蒲 +蒸 蒻 -薨 +蒼 +蒿 +蓄 +蓆 +蓉 +蓋 +蓑 +蓬 +蓮 +蓼 +蔀 +蔑 +蔓 +蔚 +蔡 +蔦 +蔬 +蔭 +蔵 +蔽 +蕃 +蕉 +蕊 +蕎 +蕨 +蕩 +蕪 +蕭 +蕾 +薄 +薇 +薊 +薔 +薗 +薙 薛 -茘 -蠣 +薦 +薨 +薩 +薪 +薫 +薬 +薭 +薮 +藁 +藉 +藍 +藏 +藐 +藝 +藤 +藩 +藪 +藷 +藹 +藺 +藻 +蘂 +蘆 +蘇 +蘊 +蘭 +虎 +虐 +虔 +虚 +虜 +虞 +號 +虫 +虹 +虻 +蚊 +蚕 +蛇 +蛉 +蛍 +蛎 +蛙 +蛛 蛟 -蜆 +蛤 +蛭 +蛮 +蛸 +蛹 +蛾 +蜀 +蜂 蜃 -雖 +蜆 +蜊 +蜘 +蜜 +蜷 +蜻 +蝉 +蝋 +蝕 +蝙 +蝠 +蝦 +蝶 +蝿 +螂 +融 +螣 +螺 +蟄 +蟇 蟠 +蟷 +蟹 +蟻 蠢 +蠣 +血 +衆 +行 +衍 +衒 +術 +街 +衙 +衛 +衝 +衞 +衡 +衢 +衣 +表 +衫 +衰 衵 +衷 衽 +衾 +衿 +袁 +袈 +袋 +袍 +袒 +袖 袙 +袞 +袢 +被 袰 +袱 +袴 +袷 +袿 +裁 +裂 +裃 +装 +裏 +裔 +裕 +裘 裙 +補 +裟 +裡 +裲 +裳 +裴 +裸 裹 +製 +裾 褂 -裲 +褄 +複 +褌 +褐 +褒 +褥 褪 褶 +褻 +襄 +襖 襞 +襟 +襠 襦 -袢 襪 -誥 +襲 +襴 +襷 +西 +要 +覆 +覇 +覈 +見 +規 +視 +覗 +覚 +覧 +親 +覲 +観 +覺 +觀 +角 +解 +触 +言 +訂 +計 +討 +訓 +託 +記 +訛 +訟 +訢 +訥 +訪 +設 +許 +訳 +訴 +訶 +診 +註 +証 +詐 +詔 +評 +詛 +詞 +詠 +詢 +詣 +試 +詩 +詫 +詮 +詰 +話 +該 +詳 +誄 +誅 +誇 +誉 +誌 +認 +誓 +誕 +誘 +語 +誠 +誡 誣 +誤 +誥 +誦 +説 +読 +誰 +課 +誼 +誾 +調 +談 +請 諌 -謚 +諍 +諏 +諒 +論 +諚 +諜 +諟 +諡 +諦 +諧 +諫 +諭 +諮 +諱 +諶 +諷 +諸 +諺 +諾 +謀 +謄 +謌 +謎 謗 +謙 +謚 +講 +謝 +謡 +謫 +謬 +謹 +證 +識 +譚 譛 +譜 +警 +譬 +譯 +議 +譲 譴 +護 +讀 +讃 +讐 讒 +谷 +谿 +豅 +豆 +豊 +豎 豐 +豚 +象 +豪 +豫 +豹 +貌 +貝 +貞 +負 +財 +貢 +貧 +貨 +販 貪 +貫 +責 +貯 +貰 +貴 +買 +貸 +費 +貼 +貿 +賀 +賁 +賂 +賃 +賄 +資 +賈 +賊 +賎 +賑 +賓 +賛 +賜 +賞 +賠 +賢 +賣 +賤 +賦 +質 +賭 +購 賽 +贄 +贅 +贈 +贋 +贔 贖 -扈 +赤 +赦 +走 +赴 +起 +超 +越 +趙 +趣 +足 +趺 +趾 +跋 +跏 +距 +跡 +跨 跪 +路 +跳 +践 +踊 +踏 踐 -躑 +踞 +踪 +踵 +蹄 +蹉 +蹊 +蹟 +蹲 +蹴 躅 +躇 +躊 +躍 +躑 躙 躪 +身 +躬 +躯 +躰 +車 軋 +軌 +軍 +軒 +軟 +転 +軸 軻 +軽 +軾 +較 +載 +輌 +輔 輜 +輝 +輦 +輩 +輪 +輯 +輸 +輿 +轄 +轍 +轟 +轢 +辛 +辞 辟 -檮 -邂 +辥 +辦 +辨 +辰 +辱 +農 +辺 +辻 +込 +迂 +迅 +迎 +近 +返 +迢 +迦 +迪 +迫 +迭 +述 +迷 +迹 +追 +退 +送 +逃 逅 +逆 +逍 +透 +逐 +逓 +途 +逕 +逗 +這 +通 +逝 +逞 +速 +造 +逢 +連 +逮 +週 +進 +逸 +逼 +遁 +遂 +遅 +遇 +遊 +運 +遍 +過 +遐 +道 +達 +違 +遙 +遜 +遠 +遡 +遣 +遥 +適 +遭 +遮 +遯 +遵 +遷 +選 +遺 +遼 +避 邀 +邁 +邂 +邃 +還 +邇 +邉 +邊 +邑 +那 +邦 +邨 +邪 邯 -鄲 +邵 +邸 +郁 +郊 +郎 +郡 郢 +部 +郭 +郴 +郵 +郷 +都 鄂 +鄙 +鄭 +鄰 +鄲 +酉 +酋 +酌 +配 +酎 +酒 +酔 +酢 +酥 +酪 +酬 +酵 +酷 +酸 +醍 +醐 +醒 +醗 +醜 +醤 醪 醵 +醸 +采 +釈 +釉 +釋 +里 +重 +野 +量 +釐 +金 +釘 +釜 +針 +釣 +釧 釿 +鈍 +鈎 +鈐 +鈔 +鈞 +鈦 +鈴 +鈷 +鈸 +鈿 +鉄 +鉇 +鉉 +鉋 +鉛 +鉢 +鉤 +鉦 +鉱 +鉾 +銀 +銃 +銅 +銈 +銑 +銕 +銘 +銚 銜 +銭 鋏 +鋒 +鋤 +鋭 +鋲 +鋳 +鋸 鋺 +鋼 +錆 +錍 +錐 +錘 +錠 +錣 +錦 +錫 +錬 +錯 +録 錵 +鍋 +鍍 +鍑 +鍔 +鍛 +鍬 +鍮 +鍵 鍼 -灸 +鍾 +鎌 +鎖 +鎗 +鎚 +鎧 +鎬 +鎮 鎰 鎹 -鐔 +鏃 +鏑 +鏡 鐃 -鈸 鐇 +鐐 +鐔 +鐘 +鐙 +鐚 +鐡 +鐵 +鐸 +鑁 +鑊 +鑑 +鑒 +鑚 +鑠 +鑢 +鑰 +鑵 鑷 +鑼 +鑽 鑿 +長 +門 +閃 +閇 +閉 +開 +閏 +閑 +間 閔 +閘 +関 +閣 +閤 +閥 +閦 +閨 +閬 +閲 +閻 閼 -崛 +閾 +闇 +闍 +闔 +闕 +闘 +關 +闡 +闢 +闥 +阜 +阪 阮 +阯 +防 +阻 +阿 +陀 +陂 +附 +陌 +降 +限 +陛 +陞 +院 +陣 +除 +陥 +陪 陬 +陰 +陳 +陵 +陶 +陸 +険 +陽 +隅 +隆 +隈 +隊 +隋 +階 +随 +隔 +際 +障 +隠 +隣 +隧 +隷 +隻 +隼 +雀 +雁 +雄 +雅 +集 +雇 +雉 雊 +雋 +雌 +雍 +雑 +雖 +雙 +雛 +離 +難 +雨 +雪 +雫 +雰 +雲 +零 +雷 +雹 +電 +需 +震 +霊 霍 +霖 +霜 +霞 +霧 +霰 +露 +靈 +青 +靖 +静 +靜 +非 +面 +革 靫 +靭 靱 -乎 +靴 +靺 +鞁 +鞄 +鞆 +鞋 +鞍 +鞏 +鞘 +鞠 +鞨 +鞭 +韋 +韓 +韜 +韮 +音 +韶 +韻 +響 +頁 +頂 +頃 +項 +順 +須 +頌 +預 +頑 +頒 +頓 +領 +頚 +頬 +頭 +頴 +頸 +頻 +頼 顆 +題 +額 +顎 +顔 +顕 +顗 +願 +顛 +類 +顧 +顯 +風 +飛 +食 +飢 +飩 +飫 +飯 +飲 +飴 +飼 +飽 +飾 +餃 +餅 +餉 +養 +餌 +餐 +餓 餘 +餝 +餡 +館 +饂 +饅 +饉 +饋 +饌 饒 +饗 +首 +馗 +香 +馨 +馬 +馳 +馴 +駄 +駅 +駆 +駈 +駐 +駒 +駕 +駝 +駿 騁 +騎 +騏 +騒 +験 +騙 +騨 +騰 +驕 +驚 驛 驢 +骨 +骸 +髄 +體 +高 +髙 髢 +髪 +髭 +髮 +髷 +髻 +鬘 +鬚 鬢 鬨 +鬯 +鬱 +鬼 +魁 +魂 +魄 +魅 +魏 +魔 +魚 +魯 +鮎 鮑 +鮒 +鮪 +鮫 +鮭 +鮮 +鯉 +鯔 +鯖 +鯛 +鯨 +鯰 鯱 +鰐 鰒 +鰭 +鰯 鰰 +鰹 +鰻 +鱈 +鱒 +鱗 鱧 +鳥 +鳩 鳰 +鳳 +鳴 +鳶 +鴈 +鴉 +鴎 +鴛 鴟 -鶉 +鴦 +鴨 +鴫 +鴻 +鵄 +鵜 +鵞 +鵡 +鵬 +鵲 鵺 +鶉 +鶏 +鶯 +鶴 +鷄 鷙 +鷲 +鷹 +鷺 鸚 -鵡 +鸞 +鹸 +鹽 +鹿 麁 +麒 +麓 +麗 +麝 +麞 +麟 +麦 +麩 +麹 +麺 +麻 +麾 +麿 +黄 +黌 +黍 +黒 +黙 +黛 黠 鼈 +鼉 +鼎 +鼓 +鼠 +鼻 +齊 +齋 齟 +齢 齬 -棠 -遙 -瑤 -銈 -禔 -禛 -鈐 -儇 -匲 -媄 -尪 -巀 -辥 -忉 -掄 -枓 -栻 -梲 -檥 -滹 -沱 -潙 -炷 -猨 -璜 -穜 -竽 -筇 -翛 -薭 -螣 +龍 +龕 +龗 +! +# +% +& +( +) ++ +, +- +. / -豅 -辦 -鉇 -鍑 -鑊 -鼉 -磧 -寔 -拈 -轍 -泯 -諍 -? -錣 -爼 -纒 -鑵 -櫨 -酎 -泡 -俄 -燗 -鞋 -鵲 -茵 -缶 -紬 -絣 -衿 -鴈 -盥 -凛 -燎 -袞 -淹 -瀉 -聟 -嫐 -俤 -薊 -衢 -醗 -斂 -懌 -袁 -渟 -杼 -鱒 -瀞 -鐚 -苛 -陌 -侈 -旌 -筵 -泗 -槊 -稷 -鐐 -頒 -斤 -勺 -嶼 -篦 -埔 -假 -墺 -刪 -于 -鯰 -穗 -渚 -崑 -轟 -皐 -關 -晁 -迢 -崋 -榕 -楨 -菘 -呰 -蒿 -憬 -雋 -珥 -羆 -弌 -墻 -鮪 -陂 -裴 -顯 -鐡 -臺 -煥 -稻 -肆 -遯 -鹽 -暘 -栲 -洩 -抓 -覈 -豎 -禦 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +: +; += +? +@ +A +B +C +D +E +F +G +H +I +J +K +L +M +N +O +P +R +S +T +U +V +W +X +Z +a +c +d +e +f +h +i +j +k +l +m +n +o +p +r +s +t +u +y +z +~ +・ diff --git a/ppocr/utils/korean_dict.txt b/ppocr/utils/dict/korean_dict.txt similarity index 99% rename from ppocr/utils/korean_dict.txt rename to ppocr/utils/dict/korean_dict.txt index 0edec5fe5635cefe094a303f3c3038153e1b8e05..a13899f14dfe3bfc25b34904390c7b1e4ed8674b 100644 --- a/ppocr/utils/korean_dict.txt +++ b/ppocr/utils/dict/korean_dict.txt @@ -1,3636 +1,3688 @@ -저 -자 -명 -: -신 -효 -필 -< -국 -문 -초 -록 +! +" +# +$ +% +& +' +* ++ +- +/ +0 +1 2 +3 +4 5 -한 -어 -관 -계 -구 -의 -통 -사 -와 -미 -조 -- -합 -법 -적 -접 -근 -본 -논 -은 -형 -성 -일 -종 -으 -로 -오 -래 -전 -부 -터 -되 -온 -인 -특 -을 -살 -피 -고 -다 -시 -이 -를 -정 -보 -기 -반 -머 -리 -중 -심 -하 -여 -가 -상 -호 -작 -용 -는 -모 -안 -에 -서 -련 -된 -러 -현 -들 -술 -해 -것 -목 -표 -삼 -론 -과 -두 -함 -께 -복 -면 -더 -나 -아 -화 -황 -까 -지 -요 -측 -므 -재 -느 -른 -및 -포 -괄 -할 -수 -있 -잘 -착 -장 -뒤 -식 -절 -차 -위 -범 -주 -그 -유 6 -3 -동 -격 -설 -징 -찰 -존 -9 -라 -분 -류 -양 -였 -출 -발 -개 -념 -공 -백 -대 -귀 -등 -펴 -략 -연 -도 -울 -핀 -많 -영 -역 -니 -제 -능 -내 -만 -충 -첨 -점 -핵 -' -않 -높 -체 -낮 -섬 -약 -드 -난 -또 -순 -진 -언 -타 -소 -편 -르 -데 7 -별 -립 -야 -외 -밀 -맺 -방 -속 -행 -배 -경 -건 -려 -운 -원 -따 -후 -규 -짓 -바 -탕 -우 -선 -달 -활 -질 -채 -택 -임 -단 -히 -벗 -될 -색 -았 -간 -극 -루 -세 -파 -악 -게 -1 -말 -었 -집 -생 -입 -밝 -혀 -졌 -맥 -락 -쪽 -왔 -검 -토 -던 -확 -새 -란 -음 -치 -마 -못 -했 -맞 -춘 -며 -급 -거 -석 -남 8 -누 -든 -완 -갖 -추 -앞 -쓰 -익 -섭 -홍 -빈 -같 -눈 -{ -0 -런 -낸 -열 -람 -네 -떤 -렵 -때 -닌 -} -학 -당 -혼 -준 -즉 -불 -없 -취 -비 -강 -변 -결 -렇 -겨 -키 -무 -받 -4 -항 -흔 -처 -직 -뿌 -엄 -축 -휘 -담 -컴 -퓨 -향 -몇 -둔 -박 -병 -참 -잡 -율 -금 -긴 -태 -각 -값 -렬 -예 -+ -| -[ -] -큰 -갈 -칙 -됨 -산 -매 -크 -증 -막 -뿐 -럼 -청 -층 -롯 -랜 -떻 -독 -력 -응 -감 -틀 -롭 -낼 -최 -희 -돈 -겹 -친 -쉽 -삭 -킨 -놓 -실 -" -폭 -넓 -료 -허 -메 -교 -* -ㄴ -붙 -스 -싸 -환 -찬 -= -흐 -름 -물 -켰 -뀌 -삽 -# -첫 -번 -째 -억 -너 -멀 -떨 -져 -밑 -줄 -냥 -움 -볼 -둘 -깊 -탈 -낳 -왜 -벽 -족 -책 -읽 -겠 -찾 -큼 -투 -곳 -판 -끼 -철 -쉬 -칭 +9 +: ; -견 -빠 -섯 -린 -습 -흥 -객 -묘 -꼴 -쉼 -쓸 -끝 -올 -령 -풀 -? -몰 -냐 -년 -권 -씩 -길 -밖 -알 -떠 -옆 -슷 -룬 -윤 -_ -랑 -났 -침 -먹 -찌 -꺼 -곰 -죽 -풍 -탄 -냄 -듯 -엇 -꾼 -회 -트 -날 -빼 -닐 -승 -맏 -딸 -버 +< += > -켜 -덕 -총 -꾸 -ㄹ -혹 -김 -균 -밥 -폐 -쇄 -평 -깝 -쉘 -옛 +? +A +B +C +D +E +F +G +H +I +J +K +L +M +N +O +P +Q +R +S +T +U +V +W +X +Y +Z +[ \ -품 -ㄸ -얻 -돌 -셨 -킬 -득 -뜻 -갔 -봉 -넘 -뺏 -민 -워 -렸 -써 -림 -찍 -척 -잃 -답 -앗 -널 -송 -혜 -얼 -천 -셈 -녀 -골 -옮 -겼 -씨 -놀 -좌 -쳐 -좁 -님 -옷 -멋 -업 -월 -디 -늘 -창 -닭 -랐 -봄 -손 -왼 -코 -끌 -잉 -펄 -뛰 -낚 -對 -象 -化 -훈 -퍽 -쌍 -몸 -쯤 -걸 -! -쓴 -샀 -노 -좋 -컬 -쥐 -쫓 -혔 -잠 -깐 -좀 -깨 -웠 -군 -찔 -렀 -딕 -암 -룰 -맛 -카 -훨 -씬 -꼭 -럽 -촘 -광 -눌 -뒷 -팔 -망 -꺾 -먼 -뀐 -짐 -넣 -짜 -킴 -슴 -슨 -걷 -뉜 +] +^ +_ ` -숙 -글 -例 -同 -名 -異 -人 -럿 -퍼 -뜨 -험 -북 -끄 -짝 -칼 -닮 -짧 -쁜 -앉 -춥 -픈 -밉 -프 -둥 -싫 -애 -힌 -깎 -융 -앤 -똑 -깥 -껴 -싼 -잊 -낡 -봐 -욱 -케 -커 -곤 -낌 -헐 -긋 -테 -& -윈 -닥 -슬 -셋 -맨 -럴 -흡 -홀 -잖 -힘 -닫 -뮤 -션 -칠 -쉐 -량 -획 -혁 -협 -웨 -샹 -즘 -쏟 -쟁 -컨 -띠 -례 -플 -농 -낙 -탐 -육 -뇌 -팽 -궁 -늦 -춰 -탁 -패 -긍 -텔 -레 -젼 -뉴 -高 -빨 -퇴 -맡 -컫 -욕 -곽 -염 +a +b +c +d +e +f +g +h +i +j +k +l +m +n +o +p +q +r +s +t +u +v +w +x +y +z +{ +| +} ~ -팩 -베 -곧 -職 -뚜 -렷 -닦 -겪 -냉 -헌 -죄 -쳤 -젊 -엘 -냈 -맑 -쿠 -푸 -믿 -뎨 -웬 -멸 -츠 -끊 -윌 -릴 -밟 -브 -삶 -끔 -률 -깃 -듦 -딘 -램 -펀 -웅 -훗 -콜 -촉 -즈 -벨 -꾀 -궤 -펜 -쿨 -뢰 -톤 -륙 -젝 -젠 -딪 -묵 -됐 -곡 -빚 -템 -父 -系 -權 -혈 -첩 -압 -괴 -숭 -뽑 -숨 -벼 -즐 -쾌 -륜 +© +° +² +½ +Á +Ä +Å +Ç +É +Í +Î +Ó +Ö +× +Ü +ß +à +á +â +ã +ä +å +æ +ç +è +é +ê +ë +ì +í +î +ï +ð +ñ +ò +ó +ô +õ +ö +ø +ú +û +ü +ý +ā +ă +ą +ć +Č +č +đ +ē +ė +ę +ě +ğ +ī +İ +ı +Ł +ł +ń +ň +ō +ř +Ş +ş +Š +š +ţ +ū +ź +ż +Ž +ž +Ș +ș +Α +Δ +α +λ +φ +Г +О +а +в +л +о +р +с +т +я +​ +’ +“ +” +→ +∇ +∼ +「 +」 +ア +カ +グ +ニ +ラ +ン +ㄱ +ㄴ +ㄷ +ㄸ +ㄹ +ㅂ +ㅅ +ㅆ +ㅇ +ㅈ +ㅊ +ㅋ +ㅌ +ㅎ +ㅓ +ㅜ +ㅣ +一 +丁 +七 三 -從 +上 +下 +不 +丑 +世 +丘 +丞 +中 +丸 +丹 +主 +乃 +久 之 -道 -七 -去 -惡 -잔 -쉴 -낱 -흉 -낀 -얽 -납 -볍 -헤 -촌 -뻗 -% -뭐 -홉 -떼 -뻔 -쨌 -걱 -쌓 -튼 -썩 -덮 -굴 -엮 -곁 -델 -쯧 -갑 -괜 -찮 -땅 -랫 -얌 -왠 -껏 -녕 -쑥 -섞 -렴 -풋 -뗀 -벌 -얘 -닉 -횟 -클 -컸 -밤 -싶 -겉 -푼 -꼈 -릇 -쩍 -녁 -쩌 -멈 -눕 -겁 -듣 -낭 -얇 -꿈 -틴 -엷 -젓 -귄 -굉 -옳 -몹 -뚫 -떡 -죠 -훌 -륭 -앓 -팬 -티 -액 -묻 -흘 -텃 -밭 -핏 -엔 -쇠 -페 -댔 -톱 -깍 -땠 -땐 -툭 -멍 -붉 -빛 -띤 -쭐 -댄 -숱 -샤 -툰 -줍 -윽 -딱 -솔 -뭔 -뜬 -덥 -덜 -뜩 -줌 -떳 -십 -팼 -쌀 -꼬 -듬 -꼽 -쁘 -꿔 -몫 -쁨 -엽 -셔 -헛 -꽤 -툴 -숲 -덤 -엿 -쏘 -낄 -팠 -色 -톨 -릭 -랄 -섹 -훑 -띄 -돼 -봤 -홧 -끗 -룻 -到 -達 -度 -推 -論 -變 -革 -樸 -根 +乎 +乘 +九 +也 +乳 +乾 +事 +二 +云 +互 +五 +井 +亞 +亡 +交 +亥 +亨 +享 +京 +亭 +人 +仁 +今 +他 +仙 +代 +令 +以 +仰 +仲 +件 +任 +企 +伊 +伍 +伎 +伏 +伐 +休 +伯 +伴 +伸 +佃 +佈 +位 低 +住 +佐 +何 +佛 作 -爲 +使 +來 +供 +依 +侯 +侵 +侶 +便 +俗 +保 +俠 +信 +修 +俱 +俳 +倉 個 -原 -點 -밈 -賢 -明 -둑 -偏 -見 -者 -룩 -文 -質 -心 -身 -富 -利 -華 -美 -僞 -巧 -困 -惑 -飾 -無 -極 -仁 -萬 -物 -짚 -草 -犬 -不 -而 -不 -魏 -晋 -時 -代 -왕 -王 -弼 -開 -券 -常 -差 -別 -相 -一 -般 -窮 -稱 -大 -言 -辭 -當 -體 -實 -德 -上 -日 -證 -市 -씌 -老 -子 -秦 -漢 -源 -流 -生 -沒 -年 -宇 -宙 -著 +倍 +倒 +候 +借 +値 +倫 +倭 假 -託 -集 -積 -빗 -透 -徹 -前 -中 -期 -司 -馬 -遷 -史 -記 -韓 -非 -列 +偈 +偉 +偏 +停 +偶 +傅 +傑 傳 -學 -問 -經 -書 -諸 -百 -家 +傷 +傾 +像 +僞 +僥 +僧 +價 +儀 +儉 儒 -思 -想 -武 -帝 -董 -仲 -舒 -朝 -國 -敎 -的 -官 -典 -訓 -枯 -風 -始 -皇 -갱 -焚 -坑 -紀 -獻 +優 +儼 +兀 +允 +元 +兆 先 -濟 +光 +克 +兒 +入 +內 +全 +八 +公 +六 +共 +兵 +其 +具 +典 +兼 +再 +冠 +冥 +冶 +准 +凞 +凡 +凱 +出 +函 +刀 +分 +刊 +刑 +列 +初 +判 +別 +利 +到 +制 +券 +刺 +刻 +則 +前 +剛 +副 +創 +劃 +劑 +力 +功 +加 +劣 +助 +劫 +勇 +動 +務 +勝 +勢 +勳 +勸 +匈 +化 +北 +匠 +區 +十 +千 +午 +半 +卍 +卑 +卒 +卓 南 -伏 -故 -老 -新 -今 -舊 +博 +卜 +占 +卦 +印 +危 +卵 +卷 +卽 +卿 +厄 +原 +厦 +去 +參 +又 +叉 +友 +反 +叔 +受 +口 古 -尙 -텍 -룹 -뉘 -易 -五 -專 -門 -墨 -守 -數 -融 -鄭 -玄 -章 -建 -初 -白 -虎 -觀 -議 -奏 -通 -義 -誥 +句 +可 +台 +史 +右 +司 +各 +合 +吉 +同 +名 +后 +吏 +吐 +君 +吠 +吳 +呂 +告 周 -禮 -儀 -禮 -春 -秋 -鞏 -羊 -穀 -梁 -佐 -氏 -論 -語 -班 +味 +呵 +命 +和 +咳 +咸 +咽 +哀 +品 +哨 +哮 +哲 +唐 +唯 +唱 +商 +問 +啼 +善 +喆 +喉 +喜 +喩 +喪 +嘗 +器 +嚴 +囊 +四 +回 +因 +困 固 -筍 -悅 -凞 -衡 -太 -談 -憤 -滿 -公 -自 -序 -宣 -室 -令 -天 -星 -歷 -卜 -祝 -丞 -曆 -揚 -何 -黃 -元 -封 -泰 -山 -禪 +圈 +國 +圍 +園 +圓 +圖 +團 +土 +在 地 -治 -平 -閣 -딜 -河 -洛 -虞 -夏 -死 -西 -方 -關 -잇 -操 -縱 -發 -千 -歲 -海 -內 -紬 -君 +均 +坊 +坐 +坑 +坵 +型 +垢 +城 +域 +埴 +執 +培 +基 +堂 +堅 +堆 +堤 +堯 +報 +場 +塔 +塚 +塞 +塵 +境 +墜 +墟 +墨 +墳 +墾 +壁 +壇 +壓 +壤 士 -載 -修 -事 -業 -淡 -六 -陰 -陽 -刑 -致 -廬 -歸 -法 -省 -下 -本 -四 -季 +壬 +壯 +壺 +壽 +夏 +夕 +外 多 -面 -臣 +夜 +夢 +大 +天 +太 夫 +央 +失 +夷 +奄 +奇 +奉 +奎 +奏 +契 +奔 +奮 +女 +奴 +好 +如 +妄 +妊 +妖 +妙 +始 +姑 +姓 +姚 +姜 +威 +婆 +婚 婦 -長 -幼 -꿀 -節 -儉 -形 -善 -俗 -主 -旨 -功 -述 -点 -短 -卓 -說 -굳 -然 -久 -合 -虛 -聖 -텅 -因 -行 -端 +媒 +媚 +子 +孔 +字 +存 +孝 +孟 +季 +孤 +孫 +學 +孺 +宇 +守 +安 +宋 +宗 +官 +宙 +定 +客 +宣 +室 +宮 +害 +家 +容 +寂 +寃 +寄 +寅 +密 +寇 +富 +寒 +寓 +實 +審 +寫 寬 -正 -肖 -是 -政 -渾 -冥 -統 -循 -消 -綱 -龍 -陝 -城 -縣 -楊 -祖 -來 -蹟 -郎 +寶 +寸 +寺 +封 +將 +專 +尊 +對 小 -聞 -石 -遺 -抽 -出 -룡 -李 -龍 -禍 -匈 -奴 -宮 -옥 -갇 -廣 -卷 -찢 -腸 -땀 -젖 -끓 -任 -安 -悲 -境 -詩 -簡 -略 +少 +尙 +尹 +尼 +尿 +局 +居 屈 -離 -騷 -左 -丘 -意 -鬱 -結 -惟 -逝 -涇 -壺 -遂 -表 -理 -혐 -世 -再 -興 -徑 +屋 +屍 +屎 +屛 +層 +屬 +山 +岐 +岡 +岩 +岳 +岸 +峙 +峰 +島 +峻 +峽 +崇 +崔 +崖 +崩 +嶋 +巖 川 -溪 -谷 -禽 -獸 -木 -牝 -牡 -雌 -雄 -樂 -和 -잣 -指 -散 -侯 -奔 -走 -里 -照 -夕 -ㄷ -웃 -纂 +州 +巢 +工 +左 +巧 +巨 +巫 +差 +己 +巷 +市 +布 +帝 +師 +帶 +常 +帽 +幕 +干 +平 +年 +幹 +幻 +幼 +幽 +庇 +序 +店 +府 +度 +座 +庫 +庭 +康 +廟 +廣 +廳 +延 +廷 +建 +廻 +弁 +式 弑 -孝 -롤 -빙 -轉 -寫 -版 -註 -釋 -戰 -術 -脚 -맹 -唐 -解 -貞 -索 -隱 +弓 +引 +弘 +弟 +弱 張 -北 -宋 -遽 -뻐 -刊 -校 -訂 -耳 -伯 -뼈 -車 -流 -哲 -愚 -俠 -氣 -得 -雲 -尹 -喜 -萊 -用 -宗 -段 -干 -住 -骸 -앙 -膠 -仰 -傅 -淸 -淨 -口 -譯 -聃 -欄 -外 -交 -所 -在 -鄕 -曲 -膽 -函 +强 +弼 +彌 +彛 +形 +彬 +影 +役 +彼 +彿 +往 +征 +待 +律 後 -邊 -韶 -銘 -曾 -陳 -敍 -倫 -몽 -蒙 -申 -害 -京 -궐 -闕 -沛 -捌 +徐 +徑 +得 +從 +循 +微 +德 +徹 +心 +必 +忌 +忍 志 -廟 -녹 -읍 -鹿 -邑 -江 -펼 -擔 -刻 -疑 -梁 -玉 -繩 -讀 -雜 -念 -孫 -왈 -諡 -曰 -字 -選 -楚 -桓 -덧 -幽 -尼 -曼 -귓 -福 -哀 -齒 -敬 -案 -與 -判 -二 -藝 -畢 -沅 -駒 -禦 -寇 -商 -弟 -嚴 -憺 -音 -澹 -蟬 -欌 -遊 -性 -魯 -叔 -랍 -貴 -辯 -舌 -칫 -執 -峻 -烈 -近 -閻 -若 -據 -昭 -續 -葬 -巷 -黨 -食 -곱 -喪 -孔 -十 -有 -葉 -適 -識 -寓 -崔 -東 -壁 -洙 -泗 -考 -信 -錄 -戴 -朱 -핑 -尊 -崇 -堯 -舜 -設 -類 -驕 -浴 +忠 +思 +怡 +急 +性 +恐 +恒 +恨 +恩 +悅 +悖 +患 +悲 +情 +惑 +惟 +惠 +惡 +想 +惺 +愁 +意 +愚 +愛 +感 +愼 +慈 態 -淫 -盛 -我 -引 -存 -眞 -路 -庫 -굽 -欲 -禹 -立 -篇 -神 -仙 +慕 +慣 +慧 +慾 +憂 +憤 +憺 應 -注 -哮 +懸 +戎 +成 +我 +戟 +戮 +戰 +戴 +戶 +房 +所 +手 +才 +打 +批 +承 +技 +抄 +把 +抗 +抱 +抽 +拇 +拓 +拘 +拙 +拜 +拾 +持 +指 +捌 +捨 +捿 +授 +掌 +排 +接 +推 +提 +揚 +揭 +援 +損 +搗 +摩 +播 +操 +擒 +擔 +擘 +據 +擧 +攘 +攝 +攬 +支 +改 +攻 +放 +政 +故 +敍 +敎 +救 +敗 +散 +敬 +整 +數 +文 +斗 +料 +斛 +斜 +斧 +斯 +新 +斷 +方 +於 +施 +旋 +族 +旗 +日 +旨 +早 +旱 +昌 +明 +易 +昔 +星 +春 +昧 +昭 +是 +時 +晉 +晋 +晩 +普 景 -吳 -誅 -殺 -資 -鑑 -威 -定 -壽 -箱 -養 -쳇 -퀴 -씻 -私 -贍 -足 -移 -各 -博 -句 -韻 -陶 -冶 -탠 -核 -連 +晴 +晶 智 -壯 -荀 -呂 -管 -愼 -策 -鬼 -喩 -末 -乾 -괘 -卦 -告 -界 -藩 -屛 -器 -第 -莫 -終 -也 -比 -庇 -役 -可 -線 -造 -츰 -切 -部 -偈 -頌 -벳 -要 -誦 +暈 +暑 +暗 +暘 +曉 曜 -끈 -읊 -씀 -劫 -뾰 -틈 -妄 -챙 -뛸 -샘 -늪 -솟 -늙 -쭙 -苦 -솜 -삐 -꽃 -흩 -맙 -붓 -픔 -빌 -겸 -돋 -뽐 -팁 -돕 -흙 -랴 -坐 -뱀 -뿔 -숫 -댐 -읜 -짊 -깔 -듭 -ㄱ -엉 -붕 -넌 -貪 -瞋 -痔 -脫 -밴 -엎 -큽 -덩 -읠 -姓 -階 -級 -힐 -콩 -묶 -훔 -肉 -넷 -뇨 -갚 -흑 -꽁 -휴 -껌 -씹 -뱉 -랬 -九 -涅 +曠 +曦 +曰 +曲 +書 +曹 +曼 +曾 +最 +會 +月 +有 +朋 +服 +望 +朝 +期 +木 +未 +末 +本 +朱 +朴 +李 +材 +村 +杖 +杜 +杞 +杭 +杯 +東 +松 +板 +林 +果 +枝 +枯 +枰 +枾 +柏 +柑 +柱 +栗 +校 +栢 +核 +根 +格 +桀 +桂 +案 +桎 +桑 +桓 +桔 +梁 +梏 +梓 +梗 +條 +梨 +梵 +棗 +棟 +森 +植 +椒 +楊 +楓 +楚 +業 +楮 +極 +榮 槃 -入 -廷 -空 -惺 -具 -以 -둠 +槍 +樂 +樓 +樗 +樣 +樸 +樹 +樺 +樽 +橄 +橋 +橘 +機 +橡 +檀 +檎 +權 +欌 +欖 +次 +欲 +歌 +歐 +止 +正 +此 +步 +武 +歲 +歸 +死 +殖 +段 +殷 +殺 +殿 +毅 +母 +毒 +比 +毛 +氏 +民 +氣 +水 +永 求 -菩 -衆 -果 -벅 -짖 -센 -꼼 -똥 -뜸 -믐 -뜯 -털 -낯 -넬 -ㅎ -늑 -캐 -큐 -렌 -텐 -쿵 -흠 -핌 -탓 -턱 -뚤 -멕 -켈 -졸 -쪼 -ㅂ -앳 -탬 -즙 -휩 -폴 -뭉 -뚱 -빅 -슈 -셀 -둬 -캉 -튜 -ㅅ -뭇 -얗 -핍 -썼 -場 -뀔 -숴 -像 -띨 -科 -屬 -種 -괸 -롱 -띈 -횡 -킹 -웰 -닷 -얕 -탱 -팡 -꿨 -펌 -헨 -콰 -링 -벤 -콘 -빔 -둡 -뚝 -헬 -콥 -펠 -쏠 -잦 -탑 -멩 -튀 -뽀 -돔 -꽝 -돗 -빽 -펭 -ㅇ -짹 -렁 -옴 -껍 -옇 -윙 -햇 -닿 -얀 -흰 -윗 -굶 -둣 -깰 -맴 -뺨 -컷 -탔 -렐 -덟 -팥 -맘 -썰 -샌 -닝 -갯 -쩔 -캬 -춤 -릉 -싱 -캔 -깡 -킷 -뎠 -랭 -릎 -꽉 -첸 -췬 -랩 -옹 -뛴 -쐐 -믹 -찝 -댓 -걀 -쌘 -쉰 -갓 -틱 -폈 -냘 -랗 -늬 -빤 -톰 -맣 -/ -촬 -럭 -깬 -깜 -튕 -틋 -떴 -藻 -類 -잎 -셉 -싹 -캤 -훼 -틔 -놨 -얹 -젯 -캄 -師 -迦 -葉 -쯔 -붐 -僧 -茶 -弓 -醫 -팀 -臨 -曹 +汎 +汗 +江 +池 +沅 +沒 +沖 +沙 +沛 +河 +油 +治 +沼 +沿 +泉 +泊 +法 +泗 +泡 +波 +注 +泰 +洋 +洙 +洛 洞 -겐 -昧 -魔 -旋 -씽 -柱 -趙 -州 -껄 -촛 -臥 -딴 -呵 -笑 -護 -位 -ㅌ +津 +洲 +活 +派 +流 +浅 +浦 +浮 +浴 +海 +涅 +涇 +消 +涌 +液 +淑 +淡 +淨 +淫 +深 +淳 +淵 +淸 +渠 +渡 +游 +渾 +湖 +湯 +源 +溪 +溫 +溶 +滄 +滅 +滋 +滯 +滿 +漁 +漆 +漢 +漫 漸 -認 -都 -寺 -딛 -콤 -렉 -副 -聰 -持 -阿 -蜀 -佛 -育 -受 -蘊 -慧 -갠 -잿 -렝 -女 -뗑 -慈 -앎 -휼 -겅 -됩 -닙 -힙 -짠 -덴 -블 -맷 -重 -옵 -멜 -봅 -겔 -ㅈ -칩 -렘 -뵈 -삯 -몬 -暑 -싣 -찜 -퉁 -겟 -놋 -創 -컹 -렛 -花 -紅 -엡 -巢 -能 -꼐 -롬 -팍 -섰 -봇 -툼 -폼 -슥 -팎 -舟 -돛 -닻 -뗏 -엣 -칸 -知 -延 -批 -評 -理 -賞 -享 -뤄 -味 -浦 -筆 -漫 -쌩 -엠 -쇼 -흄 -뮈 -왓 -審 -分 -過 -間 -렙 -틸 -뭘 -뮐 -얏 -밋 -헉 -밧 -콧 -듸 -뿜 -앵 -쨍 -쭉 -誤 -덱 -愛 -샅 -밍 -눔 -룸 -엥 -폄 -꿰 -룐 -냇 -쑤 -릿 -圖 -盆 -勢 -坊 -民 -局 -承 -喆 -橋 -土 -保 -水 +潑 +潤 +潭 +澄 +澎 +澤 +澳 +澹 +濁 +濕 +濟 +濤 濯 -멱 +瀋 +瀝 +灣 +火 +灰 +灸 +災 +炎 +炭 +点 +烈 +烏 +烙 +焚 +無 +焦 +然 +煌 +煎 +照 +煬 +煮 +熟 +熱 +燁 +燈 +燔 +燕 +燥 +燧 +燮 +爲 +爵 +父 +片 +版 +牌 +牛 +牝 +牟 +牡 +物 +特 +犧 +犬 +狀 +狗 +猥 +猩 +猪 +獨 獵 -頭 -踏 -깅 -李 -岸 -强 -占 -排 -뺀 -渠 -껑 -暗 -力 -銀 -鑛 -鐘 -樓 -共 -涌 -則 -精 -秩 -樣 -式 -聲 +獸 +獻 +玄 +玉 +王 +玲 +珍 +珠 +珪 +班 +現 +球 +理 +琴 +瑞 +瑟 +瑪 +璃 +璋 +璽 +瓜 +瓦 +甑 +甘 +生 +産 +用 +甫 +田 +由 +甲 +申 +男 +界 畏 -脈 -絡 -찡 -뜰 -픽 -엌 -誠 -母 -胎 -其 -盤 -伴 -侶 -加 -工 -反 -車 -洋 -輪 -廻 -禾 -乘 -動 -땡 -볕 -캠 -귈 -넉 -感 -視 -覺 -댁 -늠 -戶 -棟 -뷰 -費 -얄 -廳 -往 -倍 -格 -斜 -젤 -客 -顚 -倒 -此 -彼 -步 -릅 -낫 -未 -靴 -샐 -핸 -켤 -줘 -톡 -맬 -넨 -巫 -슭 -兀 -瓦 -骨 -斯 +留 +畜 +畢 +略 +番 +異 +畵 +當 +畸 +疏 +疑 +疫 +疹 +疼 +病 +症 +痔 +痛 +痺 +瘀 +瘍 +瘡 +療 +癌 +癖 +登 +發 +白 +百 +的 +皆 +皇 +皮 +盂 +盆 +益 +盛 +盜 盟 -劃 -麗 -쿄 -뭍 -辰 -成 -族 -塞 -赤 -峰 -녔 -昔 -波 -角 -杯 -製 -꽂 -헝 -겊 -솥 -銅 -鏡 -줏 -鳥 +盡 +盤 +盧 +目 +直 +相 +省 +看 +眞 +眼 +睡 +督 +瞋 +矢 +矣 +知 +短 +石 +破 +碍 +碑 +磁 +磨 +磬 +示 社 -陵 -處 -텡 -堆 +祇 +祖 +祝 +神 +祥 +祭 +祺 +禁 +禅 +禍 +福 +禦 +禪 +禮 +禹 +禽 +禾 +秀 +私 +秉 +秋 +科 秘 -悖 -兒 -罕 -짙 -꿩 -쥬 -酒 -俱 -뭄 -홱 -靑 -鷹 -앴 -뽈 -튿 -卍 -騫 -域 -樺 -漁 -쟉 -八 -寶 -雙 +秤 +秦 +秩 +移 +稀 +稗 +種 +稱 +稷 +稼 +稽 +穀 +穆 +積 +空 +窮 +竅 +立 +章 +童 +竭 +端 +竹 +笑 +符 +第 +筆 +等 +筍 +答 +策 +箋 +箕 +管 +箱 +節 +篇 +簡 +米 +粉 +粘 +粥 +精 +糖 +糞 +系 +紀 +紂 +約 +紅 紋 -싯 -쩐 -욤 -丹 -뒬 -槍 -츨 -뱅 -泡 -疹 -哨 -눠 -톈 -샴 -캘 -쏜 -셰 -켯 -毛 -ㅓ -斷 -層 -푹 -숀 -멧 -鰐 -梨 -늄 -遍 -超 -턴 -옐 -쿼 -랙 -球 -슘 -뷔 -퐁 -윅 -벙 -멘 -産 -줬 -콕 -팅 -잽 -닛 -쌉 -텁 -헙 -乎 -옭 -派 -띌 -꾹 -遠 -챌 -썽 -씁 -훤 -칵 -곬 -딩 -團 -連 -삿 -갸 -잭 -뗄 -쥔 -光 -庭 -漆 -옻 -닯 -寄 -回 -羽 -狀 -複 -燁 -樗 -樹 -땔 +純 +紙 +級 +素 +索 +紫 +紬 +累 +細 +紳 +終 +組 +結 +絡 +統 +絲 +絶 +絹 +經 綠 -雖 -危 -最 -好 -啼 -影 -侵 -綠 -衣 -濕 -夢 -賣 +維 +綱 +網 +綸 +綽 +緖 +線 +緣 +緯 +縣 +縱 +總 +織 +繡 +繩 +繪 +繭 +纂 +續 +罕 +置 +罰 +羅 +羊 +美 +群 +義 +羽 +翁 +習 +翟 +老 +考 +者 +而 +耐 +耕 +耳 +聃 +聖 +聞 +聰 +聲 +職 +肇 +肉 +肖 +肝 +股 +肥 +育 +肺 +胃 +胎 +胚 +胞 +胡 +胥 +能 +脂 +脈 +脚 +脛 +脣 +脩 +脫 +脯 +脾 +腋 +腎 +腫 +腸 +腹 +膜 +膠 +膨 +膽 +臆 +臟 +臣 +臥 臨 -魚 -月 -軒 +自 +至 +致 +臺 +臼 +臾 +與 +興 +舊 +舌 +舍 +舒 +舜 +舟 +般 +船 +艦 +良 +色 +芋 +花 +芳 +芽 +苑 +苔 +苕 +苛 +苞 +若 +苦 +英 +茂 +茵 +茶 +茹 +荀 +荇 +草 +荒 +荷 +莊 +莫 +菊 +菌 菜 -妊 -雪 -深 -夜 -愁 -귤 -펑 -柑 -橘 -亞 -金 -쌌 -橄 -攬 -欖 +菩 +菫 +華 +菴 +菽 +萊 +萍 +萬 +落 +葉 +著 +葛 +董 +葬 +蒙 +蒜 +蒲 +蒸 +蒿 +蓮 +蔓 +蔘 +蔡 +蔬 +蕃 +蕉 +蕓 +薄 +薑 +薛 +薩 +薪 薺 -멎 -腋 -媒 -鹽 藏 -油 -쐬 -쪄 -桑 -童 -奇 -짇 -뽕 -供 -犧 -섣 -냅 -굵 -찧 -蓮 -詵 -巖 -液 +藝 +藤 藥 -盧 -命 -賦 -髮 -香 -囊 -燕 -楓 -歌 -謠 -永 -金 -澤 -霜 -뫼 -勸 -뻑 -굿 -雀 -配 -糖 -松 -障 -幹 -궂 -홈 -꿋 -꺽 -雅 -苕 -云 -矣 -憂 -維 -傷 -如 -웁 -칡 -凌 -女 -紫 -墜 -瘀 -血 -乳 -蔡 -絹 +藩 +藻 +蘆 +蘇 +蘊 +蘚 +蘭 +虎 +處 +虛 +虞 +虹 +蜀 +蜂 +蜜 +蝕 +蝶 +融 +蟬 +蟲 蠶 -繭 -紙 -蘭 -亭 -竹 -麻 -房 -友 +蠻 +血 +衆 +行 +術 +衛 +衡 +衣 +表 +袁 +裔 +裕 +裙 +補 +製 +複 +襄 +西 +要 +見 +視 +親 +覺 +觀 +角 +解 +言 +訂 +訊 +訓 +託 +記 +訣 +設 +診 +註 +評 +詩 +話 +詵 +誅 +誌 +認 +誕 +語 +誠 +誤 +誥 +誦 +說 +調 +談 +諍 +論 +諡 +諫 +諭 +諸 +謙 +講 謝 -箋 -燈 -堂 -薛 -濤 -杜 -甫 -苔 -楮 -蘚 -植 -넋 -錦 -썹 -病 -빳 -阪 -組 -柳 -쬐 -又 -會 -놈 -밸 -홋 -島 -岡 -덫 -폰 -놔 -췄 -찐 -켓 -켄 -텄 -野 -村 -뻘 -쌈 -큘 -쨋 -콱 -座 -쥘 -田 -登 -井 -兵 -鬪 -멤 -黑 -넸 -由 -쳔 -軍 -情 -뿍 -댕 -技 -쩡 +謠 +證 +識 +譚 +譜 +譯 +議 +護 +讀 +變 +谷 +豆 +豊 +豚 +象 +豪 +豫 +貝 +貞 +財 +貧 +貨 +貪 貫 -ㅋ -탤 -偶 -앰 -뷸 -핫 -郞 -店 -햄 -牛 -찼 -넛 -宅 -便 -急 -渡 -播 -磨 -齋 -藤 -忠 -次 -긁 -林 -晴 -띔 -낵 -吉 -祥 -짭 -짤 -隆 -勝 -茂 -務 -펫 -森 -良 -靖 -팸 -玲 -헹 -굼 -쉭 -륵 -쏙 -磁 -火 -印 -핥 -볐 -뎌 -現 -顯 -딤 -궈 -켠 -恨 -늉 -캇 -롸 -쎄 -헴 -誕 -탯 -夷 -낟 -殷 -슐 -燧 -農 -頊 -괭 -빻 -墟 -湯 -傑 -后 -稷 -戎 -越 -晉 -翟 -셜 -엊 -誌 -利 +貴 +貸 +費 +資 +賊 賓 -盡 -把 -習 -全 -於 -챠 -뱍 -즌 -셍 -園 -츄 -墳 -엑 -雇 -岳 -퓬 -蕓 -촨 -뻬 -虹 -豫 -蔬 -杭 -蘇 -桂 -林 -秀 -璃 -臺 -潭 -烈 +賞 +賢 +賣 +賦 +質 +贍 +赤 +赫 +走 +起 +超 +越 +趙 +趣 +趨 +足 +趾 +跋 +跡 +路 +踏 +蹟 +身 +躬 +車 +軍 +軒 +軟 +載 +輓 +輕 +輪 +輯 輸 -特 -區 -鳳 -榮 -池 -魯 -蓮 -溫 -泉 -슝 -膨 -湖 -墾 -丁 -恒 -췌 +輻 +輿 +轅 +轉 +辨 +辭 +辯 +辰 +農 +近 +迦 +述 +追 +逆 +透 +逐 +通 +逝 +造 +逢 +連 進 -옌 -텨 -냔 -ㅊ -팜 -提 -羅 -弘 -益 -輯 +逵 +遂 +遊 +運 +遍 +過 +道 +達 +遠 +遡 +適 +遷 +選 +遺 +遽 +還 +邊 +邑 +那 +邪 +郞 +郡 +部 +都 鄒 -牟 -奄 -넜 -랏 -留 -樂 -뼘 -曉 -잤 -諍 -薩 -柏 -逐 -鹿 -惠 -施 -꿴 -댈 -弱 -隨 -뱃 -汎 -兼 -支 -離 -損 -깻 -뭣 -鵲 +鄕 +鄭 +鄲 +配 +酒 +酸 +醉 +醫 醯 -診 -臟 -뭡 -紂 -己 -抱 -烙 -樓 -쿡 -卿 -竅 -箕 -微 -祭 -康 -桀 -右 -땜 -逆 -滑 +釋 +里 +重 +野 +量 釐 -攻 -煬 -辨 -拇 -枝 -目 -刺 -繡 -律 -律 -姑 -磬 -呂 -曠 -蔘 -輿 -衛 -靈 -堅 -居 -畸 -鳧 -脛 -鶴 -앨 -켐 -品 -少 -六 -孤 -齊 -首 -雷 -懸 -財 -貨 -눴 -챈 -參 -鰍 -臾 -盜 -拓 -麗 -縷 -躬 -穆 -調 -放 -至 -泊 -伐 -慾 -素 -朴 -樽 -珪 -璋 -쁠 -赫 -胥 -腹 -醴 -屋 -閭 -壬 -罰 -逢 -諫 -靈 -劣 -伍 -暈 -戮 -勇 -脣 -竭 -寒 -亡 -鄲 -薄 -圍 -起 -淵 -斗 -斛 -璽 -候 -爵 -恩 -斧 +金 +針 +鈍 +鈴 鉞 -示 -絶 -乃 -止 -珠 -芋 -瑟 -琴 -僥 -匠 -拙 -妙 -容 -央 -栗 -陸 -畜 -轅 -盧 -炎 -曦 -跡 -짱 -좽 -沼 -莊 -彿 -舍 -塔 -婆 -摩 -벵 -若 -密 -蜜 -펙 -群 -剛 -趣 -改 -盂 -蘭 +銀 +銅 +銘 +鋼 +錄 +錢 +錦 鎭 -卽 -屍 -눗 -컵 -緣 -謙 -姚 -祇 -坵 -秤 -胡 -忍 -鈍 -梵 -뇩 -먁 -等 -直 -幻 -捨 -男 -願 -陸 -默 -寂 -甘 -露 -抄 -他 -肇 -菴 -뵙 +鏡 +鐘 +鐵 +鑑 +鑛 +長 +門 +閃 +開 +間 閔 -累 -皆 -奉 -講 -邪 -$ -芳 -듀 -갬 -맵 -뎀 -値 -稼 -價 -輕 -際 -갭 -網 -靜 -依 -互 -癖 -鈴 -蕉 -俳 -滅 -件 -퀘 -話 -皮 -電 -荷 -活 -降 -台 -佈 -彌 +閣 +閥 +閭 +閻 +闕 +關 +阪 +防 +阿 陀 -疏 -唯 -攝 -燮 -跋 -親 -普 -叉 -難 -堤 -順 -儼 -澄 -苑 -昌 +降 +限 +陝 院 -奈 -孺 -蘆 -絲 -茶 -趨 -伊 -列 -災 -厄 -英 -運 -歐 -參 -岩 -倉 -攘 -幕 -府 -潑 -殖 -猩 -條 -約 -諭 -沖 -峽 -休 -培 -艦 -馨 -防 -督 -弁 -桎 -梏 -征 -峙 -쵸 -兆 -梓 -朋 -隣 -搗 -嘗 -薪 -栗 -遼 -半 -沿 -灣 -立 -圈 -瓜 -恐 -熱 -醉 -綸 -答 -豪 -紳 -岐 -菫 -津 -袁 -凱 -純 -鐵 -洲 -企 -針 +陰 +陳 +陵 +陶 +陸 +陽 +隆 隊 -瀋 -暘 -總 -領 -亥 -緖 -丸 -助 -敗 -猥 -獨 -望 +隋 +階 +際 +障 +隣 +隨 +隱 隷 -厦 -澳 -澎 -制 -祺 -瑞 -萍 -毅 -閥 -打 -破 -졍 -웹 -뙤 -튄 -쾰 -쏭 -뤼 -짰 -뭏 -看 -譜 -갛 -첼 -벡 -똘 -뺄 -잴 -잰 -偉 -勳 -寃 -掌 -布 -接 -亨 -甑 -姜 -淳 -報 -彬 -鼎 -奎 -倫 -訣 -吐 -蕃 -帽 -殿 -遡 -橡 -還 +雀 +雄 +雅 +集 +雇 +雌 +雖 +雙 +雜 +離 +難 +雨 +雪 +雲 +電 +霜 +露 +靈 +靑 +靖 +靜 +非 +面 +革 +靴 +鞏 +韓 +音 +韶 +韻 +順 +須 +頊 +頌 領 -綽 +頭 顔 -譚 -稽 -瑪 -壇 -彛 -꿇 -숯 -ㅆ -녘 -來 -裕 -唱 -媚 -繪 -畵 -崖 -羅 -服 -料 -圓 -煌 -冠 -ㅣ -船 -傾 -耕 -伎 -샬 -妖 -閃 -쩨 -몄 -맸 -晶 -ㅜ -矢 -쓱 -髓 -뺑 -鷄 -揭 -巨 -龜 -햐 -딧 -拜 -겡 -眼 -緯 -契 -鮮 -卑 -落 -蒿 -准 -黎 -댑 -깟 -빕 -툇 -춧 -뼉 -킵 -깼 -숟 -뭅 -낏 -섶 -뱁 -돝 -杖 -왱 -삵 -갉 -烏 +願 +顚 +類 +顯 +風 飛 -梨 -뒹 -쇳 -홰 -짢 -擧 -兩 -뺐 -펐 -쩜 -홑 -윳 -允 -좇 -쇤 -룽 -챘 -흣 -裔 -엾 -뒀 +食 +飢 +飮 +飯 +飾 +養 +餓 +餘 +首 +香 +馨 +馬 +駒 +騫 +騷 +驕 +骨 +骸 +髓 +體 +高 +髥 +髮 +鬪 +鬱 +鬼 +魏 +魔 +魚 +魯 +鮮 +鰍 +鰐 +鳥 +鳧 +鳳 +鴨 +鵲 +鶴 +鷄 +鷹 +鹽 +鹿 +麗 +麥 +麻 +黃 +黑 +默 +點 +黨 +鼎 +齊 +齋 +齒 +龍 +龜 +가 +각 +간 +갇 +갈 +갉 +감 +갑 +값 +갓 +갔 +강 +갖 갗 -묽 -넙 -꼿 -뻤 -꿍 -컥 -뎅 +같 +갚 +갛 +개 +객 +갠 +갤 +갬 +갭 +갯 +갰 +갱 +갸 +걀 +걔 +걘 +거 +걱 +건 +걷 +걸 +검 +겁 +것 +겄 +겅 +겆 +겉 +겊 겋 -뢸 -쏴 -쭈 -쾅 -혓 +게 +겐 +겔 +겟 +겠 +겡 +겨 +격 +겪 +견 +결 +겸 +겹 겻 -쫀 -뗐 -蝕 -臆 -荇 -∼ -쾡 -얍 -곶 -닳 -꿎 -켕 -캥 -탉 -곯 -짬 -뻣 -믈 -빡 -겄 -갤 -횃 -卒 -륨 -껐 -캡 -肥 -빴 -훅 -材 -翁 -뗍 -枰 -慣 -틉 -켭 -탭 -끽 -웜 -넝 -賊 -均 -米 -稀 -炭 -빵 -찹 -胚 -芽 -멥 -볶 -” +겼 +경 +곁 +계 +곕 +곗 +고 +곡 +곤 +곧 +골 곪 -酸 -沙 -麥 -궜 -貧 -怡 -찻 -肝 -豆 -壓 -疫 -午 -郡 -拾 -療 -滯 -痛 -菊 -症 -崩 -蔓 -葛 -粉 -救 -荒 -떫 -灰 -茵 -癌 -毒 -基 -脂 -授 -機 -滋 -補 -腎 -汗 -疼 -暈 -飮 -랒 -桔 -梗 -肺 -咽 -喉 -痺 -拘 -杞 -’ -菌 -燐 -板 -埴 -壤 -甲 -椒 -썬 -徐 -帶 -咳 -粘 -軟 -裂 -片 -援 -洛 -卵 -抗 -腫 -瘍 -粥 -伸 -將 -趾 -孟 -茹 -瀝 -튤 -苞 -蒲 -쫙 -番 -蠻 -倭 -擘 -煎 -苛 -劑 -符 -檀 -禁 -忌 -蒜 -必 -須 -量 -薑 -咸 -早 -隋 -챗 -棗 +곬 +곯 +곰 +곱 +곳 +공 +곶 +과 +곽 +관 +괄 +괌 +광 +괘 +괜 +괭 +괴 +괸 +굉 +교 +구 +국 +군 +굳 +굴 +굵 +굶 +굼 +굽 +굿 +궁 +궂 +궈 +권 +궐 +궜 +궝 +궤 +귀 +귄 +귈 +귓 +규 +균 +귤 +그 +극 +근 +글 +긁 +금 +급 +긋 +긍 +기 +긴 +길 +김 +깁 +깃 +깅 +깊 +까 +깍 +깎 +깐 +깔 +깜 +깝 +깟 +깡 +깥 +깨 +깬 +깰 +깻 +깼 +깽 +꺄 +꺼 +꺽 +꺾 +껀 +껄 +껌 +껍 +껏 +껐 +껑 +께 +껴 +꼈 +꼍 +꼐 +꼬 +꼭 +꼴 +꼼 +꼽 +꼿 +꽁 +꽂 +꽃 +꽉 +꽝 +꽤 +꽥 +꾀 +꾜 +꾸 +꾹 +꾼 +꿀 +꿇 +꿈 +꿉 +꿋 +꿍 +꿎 +꿔 +꿨 +꿩 +꿰 +꿴 +뀄 +뀌 +뀐 +뀔 +뀜 +뀝 +끄 +끈 +끊 +끌 +끓 +끔 +끕 +끗 +끙 +끝 +끼 +끽 +낀 +낄 +낌 +낍 +낏 +낑 +나 +낙 +낚 +난 +낟 +날 +낡 +남 +납 +낫 +났 +낭 +낮 +낯 +낱 +낳 +내 +낵 +낸 +낼 +냄 +냅 +냇 +냈 +냉 +냐 +냔 +냘 +냥 +너 +넉 +넋 +넌 +널 +넓 +넘 +넙 +넛 +넜 +넝 +넣 +네 +넥 +넨 +넬 +넴 +넵 +넷 +넸 +넹 +녀 +녁 +년 +념 +녔 +녕 +녘 +녜 +노 +녹 +논 +놀 +놈 +놋 +농 +높 +놓 +놔 +놨 +뇌 +뇨 +뇩 +뇽 +누 +눅 +눈 +눌 +눔 +눕 +눗 +눠 +눴 +뉘 +뉜 +뉩 +뉴 +늄 +늅 +늉 +느 +늑 +는 +늘 +늙 +늠 +늡 +능 +늦 +늪 +늬 +니 +닉 +닌 +닐 +님 +닙 +닛 +닝 +닢 +다 +닥 +닦 +단 +닫 +달 +닭 +닮 +닯 +닳 +담 +답 +닷 +당 +닻 +닿 +대 +댁 +댄 +댈 +댐 +댑 +댓 +댔 +댕 +댜 +더 +덕 +덖 +던 +덜 +덟 +덤 +덥 +덧 +덩 +덫 +덮 +데 +덱 +덴 +델 +뎀 +뎃 +뎅 +뎌 +뎠 +뎨 +도 +독 +돈 +돋 +돌 +돔 +돕 +돗 +동 +돛 +돝 +돼 +됐 +되 +된 +될 +됨 +됩 +됴 +두 +둑 +둔 +둘 +둠 +둡 +둣 +둥 +둬 +뒀 +뒤 +뒬 +뒷 +뒹 +듀 +듈 +듐 +드 +득 +든 +듣 +들 +듦 +듬 +듭 +듯 +등 +듸 +디 +딕 +딘 +딛 +딜 +딤 +딥 +딧 +딨 +딩 +딪 +따 +딱 +딴 +딸 +땀 +땄 +땅 +때 +땐 +땔 +땜 +땝 +땠 +땡 +떠 +떡 +떤 +떨 +떫 떰 -枾 -飢 -餓 -滄 -옅 -檎 -捿 -秉 -垢 -溶 -整 -焦 -脾 -擒 -栢 -鋼 -潤 -稗 -耐 -晩 -燥 -游 -燔 -珍 -蝶 -裙 -刀 -借 -料 -煮 -胞 -那 -쫄 -佃 -濁 -輻 -貝 -쥴 -丑 -灸 -脯 -脩 -熟 -輓 -鴨 -逵 -凉 -胃 -瘡 -蟲 -髥 -쫑 -蒸 -糞 -屎 +떱 +떳 +떴 +떵 +떻 +떼 +떽 +뗀 +뗄 +뗍 +뗏 +뗐 +뗑 +또 +똑 +똘 +똥 +뙤 +뚜 +뚝 +뚤 +뚫 +뚱 +뛰 +뛴 +뛸 +뜀 +뜁 +뜨 +뜩 +뜬 +뜯 +뜰 +뜸 +뜻 +띄 +띈 +띌 +띔 +띕 +띠 +띤 +띨 +띱 +띵 +라 +락 +란 +랄 +람 +랍 +랏 +랐 +랑 +랒 +랗 +래 +랙 +랜 +랠 +램 +랩 +랫 +랬 +랭 +랴 +략 +량 +러 +럭 +런 +럴 +럼 +럽 +럿 +렀 +렁 +렇 +레 +렉 +렌 +렐 +렘 +렙 +렛 +렝 +려 +력 +련 +렬 +렴 +렵 +렷 +렸 +령 +례 +로 +록 +론 +롤 +롬 +롭 +롯 +롱 +롸 +롹 +뢰 +뢴 +뢸 +룃 +료 +룐 +룡 +루 +룩 +룬 +룰 +룸 +룹 +룻 +룽 +뤄 +뤘 +뤼 +류 +륙 +륜 +률 +륨 +륭 +르 +륵 +른 +를 +름 +릅 +릇 +릉 +릎 +리 +릭 +린 +릴 +림 +립 +릿 +링 +마 +막 +만 +많 +맏 +말 +맑 +맘 +맙 +맛 +망 +맞 +맡 +맣 +매 +맥 +맨 +맬 +맴 +맵 +맷 +맸 +맹 +맺 +먀 +먁 +머 +먹 +먼 +멀 +멈 +멋 +멍 +멎 +메 +멕 +멘 +멜 +멤 +멥 +멧 +멩 +며 +멱 +면 +멸 +몄 +명 +몇 +모 +목 +몫 +몬 +몰 +몸 +몹 +못 +몽 +뫼 +묘 +무 +묵 +묶 +문 +묻 +물 +묽 +뭄 +뭅 +뭇 +뭉 +뭍 +뭏 +뭐 +뭔 +뭘 +뭡 +뭣 +뮈 +뮌 +뮐 +뮤 +뮬 +므 +믈 +믐 +미 +믹 +민 +믿 +밀 +밈 +밉 +밋 +밌 +밍 +및 +밑 +바 +박 +밖 +반 +받 +발 +밝 +밟 +밤 +밥 +밧 +방 +밭 +배 +백 +밴 +밸 +뱀 +뱁 +뱃 +뱄 +뱅 +뱉 +뱍 +뱐 +버 +벅 +번 +벌 +범 +법 +벗 +벙 +벚 +베 +벡 +벤 +벨 +벰 +벱 +벳 +벵 +벼 +벽 +변 +별 +볍 볏 -덖 -豚 -猪 -쌔 -蜂 -餘 -豊 -寅 -獵 -牌 -使 -停 -碍 -狗 -塚 -吠 -飯 +볐 +병 +볕 +보 +복 +볶 +본 +볼 +봄 +봅 +봇 +봉 +봐 +봤 +뵈 +뵐 +뵙 +부 +북 +분 +붇 +불 +붉 +붐 +붓 +붕 +붙 +뷔 +뷰 +뷴 +뷸 +브 +븐 +블 +비 +빅 +빈 +빌 +빔 +빕 +빗 +빙 +빚 +빛 +빠 +빡 +빤 +빨 +빳 +빴 +빵 +빻 +빼 +빽 +뺀 +뺄 +뺌 +뺏 +뺐 +뺑 +뺨 +뻐 +뻑 +뻔 +뻗 +뻘 +뻣 +뻤 +뻥 +뻬 +뼈 +뼉 +뼘 +뽀 +뽈 +뽐 +뽑 +뽕 +뾰 +뿌 +뿍 +뿐 +뿔 +뿜 +쁘 +쁜 +쁠 +쁨 +삐 +삔 +삘 +사 +삭 +삯 +산 +살 +삵 +삶 +삼 +삽 +삿 +샀 +상 +샅 +새 +색 +샌 +샐 +샘 +샙 +샛 +샜 +생 +샤 +샨 +샬 +샴 +샵 +샷 +샹 +서 +석 +섞 +선 +섣 +설 +섬 +섭 +섯 +섰 +성 +섶 +세 +섹 +센 +셀 +셈 +셉 +셋 +셌 +셍 +셔 +션 +셜 +셨 +셰 +셴 +셸 +소 +속 +손 +솔 +솜 +솝 +솟 +송 +솥 +쇄 +쇠 +쇤 +쇳 +쇼 +숀 +숄 숍 -錢 -雨 -追 -慕 -碑 -폿 -뵐 -쪘 -핼 -깁 -밌 -쩝 -떱 -넥 -짼 -씸 -겆 -휙 -깽 -뜀 +수 +숙 +순 +숟 +술 +숨 숩 -끙 -젭 -됴 -팝 -앱 -딨 -걔 -꺄 -눅 +숫 +숭 +숯 +숱 +숲 +숴 +쉐 +쉘 +쉬 +쉭 +쉰 +쉴 +쉼 +쉽 +슈 +슐 +슘 +슛 +슝 +스 +슥 +슨 +슬 +슭 +슴 +습 +슷 +승 +시 +식 +신 +싣 +실 +싫 +심 +십 +싯 +싱 +싶 +싸 +싹 +싼 +쌀 +쌈 +쌉 +쌌 +쌍 +쌓 +쌔 +쌘 +쌩 +써 +썩 +썬 +썰 +썸 +썹 +썼 +썽 +쎄 +쎈 +쏘 +쏙 +쏜 +쏟 +쏠 +쏭 +쏴 +쐈 +쐐 +쐬 +쑤 +쑥 +쑨 +쒀 쒔 -戀 -吏 -녜 -旱 -뺌 -샜 -꽥 -뻥 -걘 -떵 -뀄 +쓰 +쓱 +쓴 +쓸 +씀 +씁 +씌 +씨 +씩 +씬 +씰 +씸 +씹 +씻 +씽 +아 +악 +안 +앉 +않 +알 +앎 +앓 +암 +압 +앗 +았 +앙 +앞 +애 +액 +앤 +앨 +앰 +앱 +앳 +앴 +앵 +야 +약 +얀 +얄 +얇 +얌 +얍 +얏 +양 +얕 +얗 +얘 +얜 +어 +억 +언 +얹 +얻 +얼 +얽 +엄 +업 +없 +엇 +었 +엉 +엊 +엌 +엎 +에 +엑 +엔 +엘 +엠 +엡 +엣 +엥 +여 +역 +엮 +연 +열 +엷 +염 +엽 +엾 +엿 +였 +영 +옅 +옆 +옇 +예 +옌 +옐 +옙 +옛 +오 +옥 +온 +올 +옭 +옮 +옳 +옴 +옵 +옷 +옹 +옻 +와 왁 -菽 -댜 -訊 -戟 -置 -睡 -삘 -샛 -낍 -才 -낑 -퀸 -꼍 -쟤 -待 -寸 -뎃 -浮 -沈 -쑨 -塵 -奮 -惡 -쨀 -떽 +완 +왈 +왑 +왓 +왔 +왕 +왜 +왠 +왱 +외 +왼 +요 +욕 +욘 +욜 +욤 +용 +우 +욱 +운 +울 +움 +웁 +웃 +웅 +워 +웍 +원 +월 +웜 +웠 +웡 +웨 +웬 +웰 +웸 +웹 +위 +윅 +윈 +윌 +윔 +윗 +윙 +유 +육 +윤 +율 +윱 +윳 +융 +으 +윽 +은 +을 +읊 +음 +읍 +응 +의 +읜 +읠 +이 +익 +인 +일 +읽 +잃 +임 +입 +잇 +있 +잉 +잊 +잎 +자 +작 +잔 +잖 +잘 +잠 +잡 +잣 +잤 +장 +잦 +재 +잭 +잰 +잴 +잽 +잿 +쟀 +쟁 쟈 -貸 -씰 -쒀 +쟉 +쟤 +저 +적 +전 +절 +젊 +점 +접 +젓 +정 +젖 +제 +젝 +젠 +젤 +젬 +젭 +젯 +져 +젼 +졀 +졌 +졍 +조 +족 +존 +졸 +좀 +좁 +종 +좇 +좋 +좌 좍 -휭 -뱄 -얜 -썸 -텀 -껀 -곗 -휠 -숄 -괌 -퉜 -꿉 -벚 -샷 -뷴 -웸 -킥 -슛 +좽 +죄 +죠 +죤 +주 +죽 +준 +줄 +줌 +줍 +줏 +중 +줘 +줬 +쥐 +쥔 +쥘 +쥬 +쥴 +즈 +즉 +즌 +즐 +즘 +즙 +증 +지 +직 +진 +짇 +질 +짊 +짐 +집 +짓 +징 +짖 +짙 +짚 +짜 +짝 +짠 +짢 +짤 +짧 +짬 +짭 +짰 +짱 +째 +짹 +짼 +쨀 +쨉 +쨋 +쨌 +쨍 +쩄 +쩌 +쩍 +쩐 +쩔 +쩜 +쩝 +쩡 +쩨 +쪄 +쪘 +쪼 +쪽 +쪾 +쫀 +쫄 +쫑 +쫓 +쫙 +쬐 +쭈 +쭉 +쭐 +쭙 +쯔 +쯤 +쯧 +찌 +찍 +찐 +찔 +찜 +찝 +찡 +찢 +찧 +차 +착 +찬 +찮 +찰 +참 +찹 +찻 +찼 +창 +찾 +채 +책 +챈 +챌 챔 -뤘 -셸 -팻 -텝 -퀵 -콸 -뮬 -튈 -윔 -젬 -뮌 -욜 -갰 -휑 -퀭 -퉈 -헷 -탰 -랠 -븐 -퓰 -픕 -끕 -삔 -띵 -뀝 -헥 -휜 -룃 -셌 -흽 챕 -땝 -톳 -쟀 -띕 -졀 -쨉 -뱐 -윱 -햅 -띱 -꾜 -궝 -늅 -붇 -곕 -횝 -푭 -샙 -벱 -닢 -뀜 -솝 -뜁 -쿤 -듐 -펩 -旗 -手 -患 -凡 -膜 -失 -型 -優 -尿 -襄 -限 -婚 -股 -臼 -細 -織 -卵 -尿 -늡 -^ -헀 -á -ň -ó -ž -“ -ç -ü -í -é -ã -튠 -ä -ć -ă -ş -땄 -넹 -ö -Š -ě -ñ +챗 +챘 +챙 +챠 +챤 +처 +척 +천 +철 +첨 +첩 +첫 +청 +체 +첵 +첸 +첼 +쳄 +쳇 +쳉 +쳐 +쳔 +쳤 +초 +촉 +촌 +촘 +촛 +총 +촨 +촬 +최 +쵸 +추 +축 +춘 +출 +춤 +춥 +춧 +충 +춰 +췄 +췌 +취 +췬 +츄 +츠 +측 +츨 +츰 +층 +치 +칙 +친 +칠 +칡 +침 +칩 +칫 +칭 +카 +칵 +칸 +칼 +캄 +캅 +캇 +캉 +캐 +캔 +캘 +캠 +캡 +캣 +캤 +캥 +캬 +커 +컥 +컨 +컫 +컬 +컴 +컵 +컷 +컸 +컹 +케 +켄 +켈 +켐 +켓 +켕 +켜 +켠 +켤 +켭 +켯 +켰 +코 +콕 +콘 +콜 +콤 +콥 +콧 +콩 +콰 +콱 +콴 +콸 +쾅 +쾌 +쾡 +쾨 +쾰 +쿄 +쿠 +쿡 +쿤 +쿨 +쿰 +쿵 +쿼 퀀 -å -ř -ý -캅 -∇ -è +퀄 +퀘 +퀭 +퀴 +퀵 +퀸 퀼 -쳄 -헵 -ê -ō -ø -뢴 -î -쩄 -롹 -옙 -Č -č -샨 -Ș -쾨 -듈 -벰 -ș +큐 +큘 +크 +큰 +클 +큼 +큽 +키 +킥 +킨 +킬 +킴 +킵 +킷 +킹 +타 +탁 +탄 +탈 +탉 +탐 +탑 +탓 +탔 +탕 +태 +택 +탠 +탤 +탬 +탭 +탯 +탰 +탱 +터 +턱 +턴 +털 +텀 +텁 +텃 +텄 +텅 +테 +텍 +텐 +텔 +템 +텝 +텡 +텨 +톈 +토 +톡 +톤 +톨 +톰 +톱 +톳 +통 +퇴 +툇 +투 +툭 +툰 +툴 +툼 +퉁 +퉈 +퉜 +튀 +튄 +튈 +튕 +튜 +튠 +튤 +튬 +트 +특 +튼 +튿 +틀 +틈 +틉 +틋 +틔 +티 +틱 +틴 +틸 +팀 +팁 +팅 +파 +팍 +팎 +판 +팔 +팜 +팝 +팟 +팠 +팡 +팥 +패 +팩 +팬 팰 -셴 -쳉 -â -욘 -ë +팸 +팻 +팼 +팽 +퍼 +퍽 +펀 +펄 +펌 +펍 +펐 +펑 +페 +펙 +펜 +펠 +펨 +펩 +펫 +펭 +펴 +편 +펼 +폄 +폈 +평 +폐 +포 +폭 +폰 +폴 +폼 +폿 +퐁 +표 +푭 +푸 +푹 +푼 +풀 +품 +풋 +풍 +퓨 +퓬 +퓰 퓸 -É -먀 -쪾 -​ -Ö -팟 -禅 -퀄 -ß -ę -Ł -ź -ą -ł -Α -û -ā -à -튬 -Ž -đ -浅 -克 -Ä -š -넴 -× -뉩 -쐈 -Ü -Å -ì -왑 -힉 +프 +픈 +플 +픔 +픕 +피 +픽 +핀 +필 +핌 +핍 +핏 +핑 +하 +학 +한 +할 +핥 +함 +합 +핫 +항 +해 +핵 +핸 +핼 +햄 +햅 +햇 +했 +행 +햐 +향 +헀 +허 +헉 +헌 +헐 +험 +헙 +헛 +헝 +헤 +헥 +헨 +헬 +헴 +헵 +헷 +헹 +혀 +혁 +현 +혈 +혐 +협 +혓 +혔 +형 +혜 +호 +혹 +혼 +홀 +홈 +홉 +홋 +홍 +홑 +화 +확 +환 +활 +홧 +황 +홰 +홱 +횃 +회 +획 +횝 +횟 +횡 +효 +후 +훅 +훈 +훌 +훑 +훔 +훗 +훤 +훨 +훼 휄 -ı -ţ -웡 -İ -О -с -т -р -о -в -Г -а -л -я -샵 -ė -ń -Á -딥 -ī -ğ +휑 +휘 +휙 +휜 +휠 +휩 +휭 +휴 +휼 +흄 +흉 +흐 +흑 +흔 +흘 +흙 +흠 +흡 +흣 +흥 +흩 +희 +흰 +흽 +히 +힉 +힌 +힐 +힘 +힙 힝 -½ -Ç -φ -ż -ô -Ó -λ -웍 -Δ -ò -ū -캣 -嶋 -淑 -α -ニ -カ -ラ -グ -ア -ン -© -챤 -ï -ú -Ş -→ -죤 -æ -펨 -² -õ -뇽 -쎈 -° -펍 -Í -콴 -ð -첵 -Î -넵 -ē -쿰 -「 -」 +車 +滑 +金 +奈 +羅 +洛 +卵 +欄 +蘭 +郎 +來 +盧 +老 +魯 +綠 +鹿 +論 +雷 +樓 +縷 +凌 +樂 +不 +參 +葉 +沈 +若 +兩 +凉 +梁 +呂 +女 +廬 +麗 +黎 +曆 +歷 +戀 +蓮 +連 +列 +烈 +裂 +念 +獵 +靈 +領 +例 +禮 +醴 +惡 +尿 +料 +遼 +龍 +暈 +柳 +流 +類 +六 +陸 +倫 +律 +栗 +利 +李 +梨 +理 +離 +燐 +林 +臨 +立 +茶 +切 +宅 diff --git a/ppocr/utils/dict/occitan_dict.txt b/ppocr/utils/dict/occitan_dict.txt new file mode 100644 index 0000000000000000000000000000000000000000..9892a45a5efa8de38a92659f6b9659aae47d6324 --- /dev/null +++ b/ppocr/utils/dict/occitan_dict.txt @@ -0,0 +1,118 @@ +! +" +% +& +' +( +) ++ +, +- +. +/ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +: +; +? +[ +] +« +³ +µ +º +» +A +Á +À +B +C +Ç +D +E +É +È +F +G +H +I +Í +Ï +J +K +L +M +N +O +Ó +Ò +P +Q +R +S +T +U +V +W +X +Y +Z +a +á +à +b +c +d +e +é +è +f +g +h +i +í +ï +j +k +l +m +n +o +ó +ò +p +q +r +s +t +u +ú +ü +v +w +x +y +z +ç +æ +Æ +ê +Ê +ë +Ë +ñ +Ñ +ô +Ô +œ +Œ +ù +Ù diff --git a/ppocr/utils/utility.py b/ppocr/utils/utility.py index 2cf3c8f5c9ebba07ee1c21fe2248fe3f600126d9..831b8eff97d4d3c158b0d5a6fc93d6153d000740 100755 --- a/ppocr/utils/utility.py +++ b/ppocr/utils/utility.py @@ -16,6 +16,7 @@ import logging import os import imghdr import cv2 +import paddle from paddle import fluid @@ -90,3 +91,22 @@ def check_and_read_gif(img_path): return imgvalue, True return None, False + +def create_multi_devices_program(program, loss_var_name): + build_strategy = fluid.BuildStrategy() + build_strategy.memory_optimize = False + build_strategy.enable_inplace = True + exec_strategy = fluid.ExecutionStrategy() + exec_strategy.num_iteration_per_drop_scope = 1 + compile_program = fluid.CompiledProgram(program).with_data_parallel( + loss_name=loss_var_name, + build_strategy=build_strategy, + exec_strategy=exec_strategy) + return compile_program + + +def enable_static_mode(): + try: + paddle.enable_static() + except: + pass diff --git a/requirments.txt b/requirements.txt similarity index 63% rename from requirments.txt rename to requirements.txt index ec538138beaed70ec8f5285ea0c4114f22e3b0ef..aa1b6db4c207ac2ce669ca79055b333642792627 100644 --- a/requirments.txt +++ b/requirements.txt @@ -3,4 +3,5 @@ imgaug pyclipper lmdb tqdm -numpy \ No newline at end of file +numpy +opencv-python diff --git a/setup.py b/setup.py index 2cea853dca9ed67a64e52595b0f95606d21ca16e..33ed3ecdbd64ecd42b8d7eb44959449db16a29e1 100644 --- a/setup.py +++ b/setup.py @@ -15,7 +15,7 @@ from setuptools import setup from io import open -with open('requirments.txt', encoding="utf-8-sig") as f: +with open('requirements.txt', encoding="utf-8-sig") as f: requirements = f.readlines() requirements.append('tqdm') @@ -32,7 +32,7 @@ setup( package_dir={'paddleocr': ''}, include_package_data=True, entry_points={"console_scripts": ["paddleocr= paddleocr.paddleocr:main"]}, - version='1.0.0', + version='1.0.1', install_requires=requirements, license='Apache License 2.0', description='Awesome OCR toolkits based on PaddlePaddle (8.6M ultra-lightweight pre-trained model, support training and deployment among server, mobile, embeded and IoT devices', diff --git a/thirdparty/README.md b/thirdparty/README.md new file mode 100644 index 0000000000000000000000000000000000000000..cb026718ee24150825c7a285322cda51a9e9e64b --- /dev/null +++ b/thirdparty/README.md @@ -0,0 +1,60 @@ +## 第三方贡献说明 + + +- 首先感谢大家对于PaddleOCR的支持,我们也希望大家共同建设,共同分享,形成良好的开源社区氛围:) +- 如果您也有意愿贡献,可以快速查看[贡献说明](#贡献说明): + +## 一、近期更新(截至2020.11.5) + + +- 非常感谢 [zhangxin](https://github.com/ZhangXinNan)([Blog](https://blog.csdn.net/sdlypyzq)) 贡献新的可视化方式、添加.gitgnore、处理手动设置PYTHONPATH环境变量的问题([#210](https://github.com/PaddlePaddle/PaddleOCR/pull/210)) +- 非常感谢 [lyl120117](https://github.com/lyl120117) 贡献打印网络结构的代码([#304](https://github.com/PaddlePaddle/PaddleOCR/pull/304)) +- 非常感谢 [BeyondYourself](https://github.com/BeyondYourself) 给PaddleOCR提了很多非常棒的建议,并简化了PaddleOCR的部分代码风格([so many commits)](https://github.com/PaddlePaddle/PaddleOCR/commits?author=BeyondYourself)。 + +### 2、新增需求类 +- 非常感谢 [xiangyubo](https://github.com/xiangyubo) 贡献手写中文OCR数据集([#321](https://github.com/PaddlePaddle/PaddleOCR/pull/321)) +- 非常感谢 [Mejans](https://github.com/Mejans) 给PaddleOCR增加新语言奥克西坦语Occitan的字典和语料([#954](https://github.com/PaddlePaddle/PaddleOCR/pull/954))。 + +### 3、新增功能类 +- 非常感谢 [authorfu](https://github.com/authorfu) 贡献Android([#340](https://github.com/PaddlePaddle/PaddleOCR/pull/340))和[xiadeye](https://github.com/xiadeye) 贡献IOS的demo代码([#325](https://github.com/PaddlePaddle/PaddleOCR/pull/325)) +- 非常感谢 [tangmq](https://gitee.com/tangmq) 给PaddleOCR增加Docker化部署服务,支持快速发布可调用的Restful API服务([#507](https://github.com/PaddlePaddle/PaddleOCR/pull/507))。 +- 非常感谢 [lijinhan](https://github.com/lijinhan) 给PaddleOCR增加java SpringBoot 调用OCR Hubserving接口完成对OCR服务化部署的使用([#1027](https://github.com/PaddlePaddle/PaddleOCR/pull/1027))。 + + + +## 二、贡献说明 +### 1、修复建议类 + - 如果是bug改动和修复,直接提在官方代码对应位置修改,PR提交,review后合入即可。 + + +### 2、新增需求类 + - 如果目前提供的功能不能满足需求,可以在新需求中增加,注明【需求】xxx,可以提到[新需求](./requests.md)里面。 + +### 3、新增功能类 + + - 新增功能也可以在本文件夹中新建文件夹,按照功能命名,文件夹内需包含完整代码和readme文档,在文档中描述清楚具体如何使用(也可以在个人repo中完成,通过新增requirements文件,增加一行 `paddleocr` 可以通过usedby 收录) + - 新增部署方式支持,可以在本文件夹新增 + - 新增多种编程语言支持功能,可以在本文件夹新增 + + +## 三、代码要求 + - **文档、文档、文档**,重要的事情说三遍 + - 简单高效,直观明了,功能完善,没有bug + - 提交之前需要使用 pre-commit 工具来自动检查一些基本事宜(如每个文件只有一个 EOL,Git 中不要添加大文件等)。pre-commit测试是 Travis-CI 中单元测试的一部分,首先安装并在当前目录运行它: + +``` +pip install pre-commit +pre-commit install +``` + + - 目前默认使用 clang-format 来调整 C/C++ 源代码格式,请确保 clang-format 版本在 3.8 以上。注:通过pip install pre-commit和conda install -c conda-forge pre-commit安装的yapf稍有不同的,Paddle 开发人员使用的是pip install pre-commit。 + + + +## 四、联系我们 + - PR之前如果有任何的不确定,欢迎先通过issue或者微信群联系我们,提前沟通pr位置,减少comment和反复修改。 + + +## 五、致谢与后续 + - 合入代码之后,首页README末尾新增感谢贡献,默认链接为github名字及主页,如果有需要更换主页,也可以联系我们 + - 新增重要功能类,会在用户群广而告之,享受开源社区荣誉时刻。 diff --git a/thirdparty/paddleOcrSpringBoot/mvnw b/thirdparty/paddleOcrSpringBoot/mvnw new file mode 100644 index 0000000000000000000000000000000000000000..a16b5431b4c3cab50323a3f558003fd0abd87dad --- /dev/null +++ b/thirdparty/paddleOcrSpringBoot/mvnw @@ -0,0 +1,310 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/thirdparty/paddleOcrSpringBoot/mvnw.cmd b/thirdparty/paddleOcrSpringBoot/mvnw.cmd new file mode 100644 index 0000000000000000000000000000000000000000..c8d43372c986d97911cdc21bd87e0cbe3d83bdda --- /dev/null +++ b/thirdparty/paddleOcrSpringBoot/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/thirdparty/paddleOcrSpringBoot/paddleOcrSpringBoot.iml b/thirdparty/paddleOcrSpringBoot/paddleOcrSpringBoot.iml new file mode 100644 index 0000000000000000000000000000000000000000..e7675c8d2b2f776403c2559ead8035ddb5dad596 --- /dev/null +++ b/thirdparty/paddleOcrSpringBoot/paddleOcrSpringBoot.iml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/paddleOcrSpringBoot/pom.xml b/thirdparty/paddleOcrSpringBoot/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..76eb7be0b45e4d3c2d5407392f84e30c92bb7eb8 --- /dev/null +++ b/thirdparty/paddleOcrSpringBoot/pom.xml @@ -0,0 +1,65 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.3.4.RELEASE + + + com.paddelOcr_springBoot + demo + 0.0.1-SNAPSHOT + demo + Demo project for Spring Boot + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + org.apache.httpcomponents + httpclient + + + com.vaadin.external.google + android-json + 0.0.20131108.vaadin1 + compile + + + com.google.code.gson + gson + 2.8.6 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/thirdparty/paddleOcrSpringBoot/readme.md b/thirdparty/paddleOcrSpringBoot/readme.md new file mode 100644 index 0000000000000000000000000000000000000000..154a52bd1f4eacae51943a98e5ca2a40f017bea0 --- /dev/null +++ b/thirdparty/paddleOcrSpringBoot/readme.md @@ -0,0 +1,37 @@ +简体中文 + +- 使用本教程前请先基于PaddleHub Serving的部署. + +# 基于PaddleHub Serving的Java SpringBoot调用 + +paddleOcrSpringBoot服务部署目录下包括全部SpringBoot代码。目录结构如下: +``` +deploy/paddleOcrSpringBoot/ + └─ src 代码文件 + └─ main 主函数代码 + └─ java\com\paddelocr_springboot\demo + └─ DemoApplication.java SpringBoot启动代码 + └─ Controller + └─ OCR.java 控制器代码 + └─ test 测试代码 +``` + +- Hub Serving启动后的APi端口如下: +`http://[ip_address]:[port]/predict/[module_name]` + +## 返回结果格式说明 +返回结果为列表(list),列表中的每一项为词典(dict),词典一共可能包含3种字段,信息如下: + +|字段名称|数据类型|意义| +|-|-|-| +|text|str|文本内容| +|confidence|float| 文本识别置信度| +|text_region|list|文本位置坐标| + +不同模块返回的字段不同,如,文本识别服务模块返回结果不含`text_region`字段,具体信息如下: + +|字段名/模块名|ocr_det|ocr_rec|ocr_system| +|-|-|-|-| +|text||✔|✔| +|confidence||✔|✔| +|text_region|✔||✔| diff --git a/thirdparty/paddleOcrSpringBoot/src/main/java/com/paddelocr_springboot/demo/Controller/OCR.java b/thirdparty/paddleOcrSpringBoot/src/main/java/com/paddelocr_springboot/demo/Controller/OCR.java new file mode 100644 index 0000000000000000000000000000000000000000..a4b6ce0b6600998175515996e3d6c8abf8ff9495 --- /dev/null +++ b/thirdparty/paddleOcrSpringBoot/src/main/java/com/paddelocr_springboot/demo/Controller/OCR.java @@ -0,0 +1,61 @@ +package com.paddelocr_springboot.demo.Controller; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import org.json.JSONObject; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.ResourceUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.http.*; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; +import sun.misc.BASE64Encoder; +import java.util.Objects; + +@RestController +public class OCR { +@RequestMapping("/") + public ResponseEntity hi(){ + //创建请求头 + HttpHeaders headers = new HttpHeaders(); + //设置请求头格式 + headers.setContentType(MediaType.APPLICATION_JSON); + //读入静态资源文件1.png + InputStream imagePath = this.getClass().getResourceAsStream("/1.png"); + //构建请求参数 + MultiValueMap map= new LinkedMultiValueMap(); + //添加请求参数images,并将Base64编码的图片传入 + map.add("images", ImageToBase64(imagePath)); + //构建请求 + HttpEntity> request = new HttpEntity>(map, headers); + RestTemplate restTemplate = new RestTemplate(); + //发送请求 + ResponseEntity response = restTemplate.postForEntity("http://127.0.0.1:8866/predict/ocr_system", request, String.class); + //打印请求返回值 + return response; + } + private String ImageToBase64(InputStream imgPath) { + byte[] data = null; + // 读取图片字节数组 + try { + InputStream in = imgPath; + System.out.println(imgPath); + data = new byte[in.available()]; + in.read(data); + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + // 对字节数组Base64编码 + BASE64Encoder encoder = new BASE64Encoder(); + // 返回Base64编码过的字节数组字符串 + //System.out.println("图片转换Base64:" + encoder.encode(Objects.requireNonNull(data))); + return encoder.encode(Objects.requireNonNull(data)); + } + +} diff --git a/thirdparty/paddleOcrSpringBoot/src/main/java/com/paddelocr_springboot/demo/DemoApplication.java b/thirdparty/paddleOcrSpringBoot/src/main/java/com/paddelocr_springboot/demo/DemoApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..3834d02b432e0f34e65b558116fa5db2607a87b8 --- /dev/null +++ b/thirdparty/paddleOcrSpringBoot/src/main/java/com/paddelocr_springboot/demo/DemoApplication.java @@ -0,0 +1,13 @@ +package com.paddelocr_springboot.demo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DemoApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoApplication.class, args); + } + +} diff --git a/thirdparty/paddleOcrSpringBoot/src/main/resources/1.png b/thirdparty/paddleOcrSpringBoot/src/main/resources/1.png new file mode 100644 index 0000000000000000000000000000000000000000..f14534821e97c72185273c2d5f4f914e96548346 Binary files /dev/null and b/thirdparty/paddleOcrSpringBoot/src/main/resources/1.png differ diff --git a/thirdparty/paddleOcrSpringBoot/src/main/resources/application.properties b/thirdparty/paddleOcrSpringBoot/src/main/resources/application.properties new file mode 100644 index 0000000000000000000000000000000000000000..b3a58e21f2ebfc4b6a6e468a0612adcdd52c81d2 --- /dev/null +++ b/thirdparty/paddleOcrSpringBoot/src/main/resources/application.properties @@ -0,0 +1,7 @@ +server.port=8081 +http_pool.max_total: 200 +http_pool.default_max_per_route: 100 +http_pool.connect_timeout: 5000 +http_pool.connection_request_timeout: 1000 +http_pool.socket_timeout: 65000 +http_pool.validate_after_inactivity: 2000 \ No newline at end of file diff --git a/thirdparty/paddleOcrSpringBoot/src/test/java/com/paddelocr_springboot/demo/DemoApplicationTests.java b/thirdparty/paddleOcrSpringBoot/src/test/java/com/paddelocr_springboot/demo/DemoApplicationTests.java new file mode 100644 index 0000000000000000000000000000000000000000..c844d58f632da71c3b17b84404107eb05bb2f4b6 --- /dev/null +++ b/thirdparty/paddleOcrSpringBoot/src/test/java/com/paddelocr_springboot/demo/DemoApplicationTests.java @@ -0,0 +1,13 @@ +package com.paddelocr_springboot.demo; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class DemoApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/thirdparty/requests.md b/thirdparty/requests.md new file mode 100644 index 0000000000000000000000000000000000000000..6f78fddc5769ddfcc7bb48dde36e9021255ff567 --- /dev/null +++ b/thirdparty/requests.md @@ -0,0 +1,16 @@ +## 第三方新需求 + + +### 1、开发 - 多语言支持需求 + + + +### 2、模型 - 多语言支持需求 + + - 格式:需要提交对应的语言字典dict和语料文件corpus,建议以链接形式提供。 + + +### 3、部署 - 性能提升需求 + + +### 4、其他需求 diff --git a/tools/__init__.py b/tools/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tools/eval.py b/tools/eval.py index aff5fc7111a062c9b4346e9c2dcbc8f9225fe8da..a687bb6b33cca2e60e3b674c72a8765740286790 100755 --- a/tools/eval.py +++ b/tools/eval.py @@ -39,6 +39,7 @@ set_paddle_flags( import program from paddle import fluid from ppocr.utils.utility import initial_logger +from ppocr.utils.utility import enable_static_mode logger = initial_logger() from ppocr.data.reader_main import reader_main from ppocr.utils.save_load import init_model @@ -95,4 +96,5 @@ def main(): if __name__ == '__main__': + enable_static_mode() main() diff --git a/tools/eval_utils/eval_rec_utils.py b/tools/eval_utils/eval_rec_utils.py index 4479d9dff2c352c54a26ac1bfdbddab497fff418..180bfcfe679d1b74a643b1c97ce46d23d7c184cf 100644 --- a/tools/eval_utils/eval_rec_utils.py +++ b/tools/eval_utils/eval_rec_utils.py @@ -122,7 +122,9 @@ def eval_rec_run(exe, config, eval_info_dict, mode): def test_rec_benchmark(exe, config, eval_info_dict): - " Evaluate lmdb dataset " + """ + eval rec benchmark + """ eval_data_list = ['IIIT5k_3000', 'SVT', 'IC03_860', 'IC03_867', \ 'IC13_857', 'IC13_1015', 'IC15_1811', 'IC15_2077', 'SVTP', 'CUTE80'] eval_data_dir = config['TestReader']['lmdb_sets_dir'] diff --git a/tools/infer/__init__.py b/tools/infer/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tools/infer/predict_cls.py b/tools/infer/predict_cls.py index 3c14011a24cf5afcecc5edd5a54e395a0f171f53..dc4028d0ddcafa8e69cc47c783efe067fda51a0b 100755 --- a/tools/infer/predict_cls.py +++ b/tools/infer/predict_cls.py @@ -33,12 +33,13 @@ from paddle import fluid class TextClassifier(object): def __init__(self, args): - self.predictor, self.input_tensor, self.output_tensors = \ - utility.create_predictor(args, mode="cls") + if args.use_pdserving is False: + self.predictor, self.input_tensor, self.output_tensors = \ + utility.create_predictor(args, mode="cls") + self.use_zero_copy_run = args.use_zero_copy_run self.cls_image_shape = [int(v) for v in args.cls_image_shape.split(",")] self.cls_batch_num = args.rec_batch_num self.label_list = args.label_list - self.use_zero_copy_run = args.use_zero_copy_run self.cls_thresh = args.cls_thresh def resize_norm_img(self, img): @@ -103,7 +104,6 @@ class TextClassifier(object): label_out = self.output_tensors[1].copy_to_cpu() if len(label_out.shape) != 1: prob_out, label_out = label_out, prob_out - elapse = time.time() - starttime predict_time += elapse for rno in range(len(label_out)): diff --git a/tools/infer/predict_det.py b/tools/infer/predict_det.py index 625f87abc39fc0e9d7683f72dafec1d53324873a..12966718d3e135bb3400522898187c4f1addfdc1 100755 --- a/tools/infer/predict_det.py +++ b/tools/infer/predict_det.py @@ -42,7 +42,6 @@ class TextDetector(object): def __init__(self, args): max_side_len = args.det_max_side_len self.det_algorithm = args.det_algorithm - self.use_zero_copy_run = args.use_zero_copy_run preprocess_params = {'max_side_len': max_side_len} postprocess_params = {} if self.det_algorithm == "DB": @@ -75,9 +74,10 @@ class TextDetector(object): else: logger.info("unknown det_algorithm:{}".format(self.det_algorithm)) sys.exit(0) - - self.predictor, self.input_tensor, self.output_tensors =\ - utility.create_predictor(args, mode="det") + if args.use_pdserving is False: + self.use_zero_copy_run = args.use_zero_copy_run + self.predictor, self.input_tensor, self.output_tensors =\ + utility.create_predictor(args, mode="det") def order_points_clockwise(self, pts): """ @@ -117,7 +117,7 @@ class TextDetector(object): box = self.clip_det_res(box, img_height, img_width) rect_width = int(np.linalg.norm(box[0] - box[1])) rect_height = int(np.linalg.norm(box[0] - box[3])) - if rect_width <= 10 or rect_height <= 10: + if rect_width <= 3 or rect_height <= 3: continue dt_boxes_new.append(box) dt_boxes = np.array(dt_boxes_new) @@ -177,7 +177,7 @@ if __name__ == "__main__": text_detector = TextDetector(args) count = 0 total_time = 0 - draw_img_save = "./inference_results" + draw_img_save = os.path.join(".", "inference_results") if not os.path.exists(draw_img_save): os.makedirs(draw_img_save) for image_file in image_file_list: @@ -193,8 +193,8 @@ if __name__ == "__main__": count += 1 print("Predict time of %s:" % image_file, elapse) src_im = utility.draw_text_det_res(dt_boxes, image_file) - img_name_pure = image_file.split("/")[-1] - cv2.imwrite( - os.path.join(draw_img_save, "det_res_%s" % img_name_pure), src_im) + img_name_pure = os.path.split(image_file)[-1] # image_file.split("/")[-1] + img_path = os.path.join(draw_img_save, "det_res_%s" % img_name_pure) + cv2.imwrite(img_path, src_im) if count > 1: print("Avg Time:", total_time / (count - 1)) diff --git a/tools/infer/predict_rec.py b/tools/infer/predict_rec.py index 06273e9f9e5b42a9ecc829c435662e9aabcdd224..77dc82aad25bec5023367d051ec195001c4fd8e7 100755 --- a/tools/infer/predict_rec.py +++ b/tools/infer/predict_rec.py @@ -34,14 +34,15 @@ from ppocr.utils.character import CharacterOps class TextRecognizer(object): def __init__(self, args): - self.predictor, self.input_tensor, self.output_tensors =\ - utility.create_predictor(args, mode="rec") + if args.use_pdserving is False: + self.predictor, self.input_tensor, self.output_tensors =\ + utility.create_predictor(args, mode="rec") + self.use_zero_copy_run = args.use_zero_copy_run self.rec_image_shape = [int(v) for v in args.rec_image_shape.split(",")] self.character_type = args.rec_char_type self.rec_batch_num = args.rec_batch_num self.rec_algorithm = args.rec_algorithm self.text_len = args.max_text_length - self.use_zero_copy_run = args.use_zero_copy_run char_ops_params = { "character_type": args.rec_char_type, "character_dict_path": args.rec_char_dict_path, @@ -62,8 +63,9 @@ class TextRecognizer(object): def resize_norm_img(self, img, max_wh_ratio): imgC, imgH, imgW = self.rec_image_shape assert imgC == img.shape[2] + wh_ratio = max(max_wh_ratio, imgW * 1.0 / imgH) if self.character_type == "ch": - imgW = int((32 * max_wh_ratio)) + imgW = int((32 * wh_ratio)) h, w = img.shape[:2] ratio = w / float(h) if math.ceil(imgH * ratio) > imgW: @@ -320,7 +322,7 @@ def main(args): print(e) logger.info( "ERROR!!!! \n" - "Please read the FAQ:https://github.com/PaddlePaddle/PaddleOCR#faq \n" + "Please read the FAQ: https://github.com/PaddlePaddle/PaddleOCR#faq \n" "If your model has tps module: " "TPS does not support variable shape.\n" "Please set --rec_image_shape='3,32,100' and --rec_char_type='en' ") diff --git a/tools/infer/predict_system.py b/tools/infer/predict_system.py index 29c4d7e8e35ceda3966dfcadcca5f0ae985d1bb1..766cc577b07bc9845af610a7a7e1ba50614d64eb 100755 --- a/tools/infer/predict_system.py +++ b/tools/infer/predict_system.py @@ -160,8 +160,13 @@ def main(args): txts = [rec_res[i][0] for i in range(len(rec_res))] scores = [rec_res[i][1] for i in range(len(rec_res))] - draw_img = draw_ocr( - image, boxes, txts, scores, drop_score=drop_score, font_path=font_path) + draw_img = draw_ocr_box_txt( + image, + boxes, + txts, + scores, + drop_score=drop_score, + font_path=font_path) draw_img_save = "./inference_results/" if not os.path.exists(draw_img_save): os.makedirs(draw_img_save) diff --git a/tools/infer/utility.py b/tools/infer/utility.py index 45d7b73707904d3bb2df665a1cf348a32c70f852..72b19b9198163751423f5b34880ddc0acc6fbbdf 100755 --- a/tools/infer/utility.py +++ b/tools/infer/utility.py @@ -72,9 +72,7 @@ def parse_args(): default="./ppocr/utils/ppocr_keys_v1.txt") parser.add_argument("--use_space_char", type=str2bool, default=True) parser.add_argument( - "--vis_font_path", - type=str, - default="./doc/simfang.ttf") + "--vis_font_path", type=str, default="./doc/simfang.ttf") # params for text classifier parser.add_argument("--use_angle_cls", type=str2bool, default=False) @@ -86,16 +84,29 @@ def parse_args(): parser.add_argument("--enable_mkldnn", type=str2bool, default=False) parser.add_argument("--use_zero_copy_run", type=str2bool, default=False) + + parser.add_argument("--use_pdserving", type=str2bool, default=False) + return parser.parse_args() def create_predictor(args, mode): + """ + create predictor for inference + :param args: params for prediction engine + :param mode: mode + :return: predictor + """ if mode == "det": model_dir = args.det_model_dir elif mode == 'cls': model_dir = args.cls_model_dir - else: + elif mode == 'rec': model_dir = args.rec_model_dir + else: + raise ValueError( + "'mode' of create_predictor() can only be one of ['det', 'cls', 'rec']" + ) if model_dir is None: logger.info("not find {} model file path {}".format(mode, model_dir)) @@ -143,6 +154,12 @@ def create_predictor(args, mode): def draw_text_det_res(dt_boxes, img_path): + """ + Visualize the results of detection + :param dt_boxes: The boxes predicted by detection model + :param img_path: Image path + :return: Visualized image + """ src_im = cv2.imread(img_path) for box in dt_boxes: box = np.array(box).astype(np.int32).reshape(-1, 2) @@ -203,7 +220,12 @@ def draw_ocr(image, return image -def draw_ocr_box_txt(image, boxes, txts, font_path="./doc/simfang.ttf"): +def draw_ocr_box_txt(image, + boxes, + txts, + scores=None, + drop_score=0.5, + font_path="./doc/simfang.ttf"): h, w = image.height, image.width img_left = image.copy() img_right = Image.new('RGB', (w, h), (255, 255, 255)) @@ -213,7 +235,9 @@ def draw_ocr_box_txt(image, boxes, txts, font_path="./doc/simfang.ttf"): random.seed(0) draw_left = ImageDraw.Draw(img_left) draw_right = ImageDraw.Draw(img_right) - for (box, txt) in zip(boxes, txts): + for idx, (box, txt) in enumerate(zip(boxes, txts)): + if scores is not None and scores[idx] < drop_score: + continue color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) draw_left.polygon(box, fill=color) @@ -229,8 +253,7 @@ def draw_ocr_box_txt(image, boxes, txts, font_path="./doc/simfang.ttf"): 1])**2) if box_height > 2 * box_width: font_size = max(int(box_width * 0.9), 10) - font = ImageFont.truetype( - font_path, font_size, encoding="utf-8") + font = ImageFont.truetype(font_path, font_size, encoding="utf-8") cur_y = box[0][1] for c in txt: char_size = font.getsize(c) @@ -239,8 +262,7 @@ def draw_ocr_box_txt(image, boxes, txts, font_path="./doc/simfang.ttf"): cur_y += char_size[1] else: font_size = max(int(box_height * 0.8), 10) - font = ImageFont.truetype( - font_path, font_size, encoding="utf-8") + font = ImageFont.truetype(font_path, font_size, encoding="utf-8") draw_right.text( [box[0][0], box[0][1]], txt, fill=(0, 0, 0), font=font) img_left = Image.blend(image, img_left, 0.5) diff --git a/tools/infer_cls.py b/tools/infer_cls.py index aebdc0761b7ec48f81143ecbb758ce0e4da2edf7..739925f8cfcb97ee584f1e00c081634ca131a0e7 100755 --- a/tools/infer_cls.py +++ b/tools/infer_cls.py @@ -41,6 +41,7 @@ set_paddle_flags( import tools.program as program from paddle import fluid from ppocr.utils.utility import initial_logger +from ppocr.utils.utility import enable_static_mode logger = initial_logger() from ppocr.data.reader_main import reader_main @@ -109,6 +110,7 @@ def main(): if __name__ == '__main__': + enable_static_mode() parser = program.ArgsParser() FLAGS = parser.parse_args() main() diff --git a/tools/infer_det.py b/tools/infer_det.py index 1e7fdcc46a1d2f47a7928d6dc171ae393b15f901..79eb638dc2c61af3bd0c7a3c3c14b4a769650f45 100755 --- a/tools/infer_det.py +++ b/tools/infer_det.py @@ -49,6 +49,7 @@ import cv2 from ppocr.utils.utility import initial_logger logger = initial_logger() +from ppocr.utils.utility import enable_static_mode def draw_det_res(dt_boxes, config, img, img_name): @@ -104,8 +105,8 @@ def main(): save_res_path = config['Global']['save_res_path'] if not os.path.exists(os.path.dirname(save_res_path)): os.makedirs(os.path.dirname(save_res_path)) - with open(save_res_path, "wb") as fout: + with open(save_res_path, "wb") as fout: test_reader = reader_main(config=config, mode='test') tackling_num = 0 for data in test_reader(): @@ -135,9 +136,15 @@ def main(): elif config['Global']['algorithm'] == 'DB': dic = {'maps': outs[0]} elif config['Global']['algorithm'] == 'SAST': - dic = {'f_score': outs[0], 'f_border': outs[1], 'f_tvo': outs[2], 'f_tco': outs[3]} + dic = { + 'f_score': outs[0], + 'f_border': outs[1], + 'f_tvo': outs[2], + 'f_tco': outs[3] + } else: - raise Exception("only support algorithm: ['EAST', 'DB', 'SAST']") + raise Exception( + "only support algorithm: ['EAST', 'DB', 'SAST']") dt_boxes_list = postprocess(dic, ratio_list) for ino in range(img_num): dt_boxes = dt_boxes_list[ino] @@ -151,11 +158,12 @@ def main(): fout.write(otstr.encode()) src_img = cv2.imread(img_name) draw_det_res(dt_boxes, config, src_img, img_name) - + logger.info("success!") if __name__ == '__main__': + enable_static_mode() parser = program.ArgsParser() FLAGS = parser.parse_args() main() diff --git a/tools/infer_rec.py b/tools/infer_rec.py index 29fc5b40a890cd6e8fa3ca7d3f0999835555d9bd..389453a4117550b00772970feb4262d14eab4256 100755 --- a/tools/infer_rec.py +++ b/tools/infer_rec.py @@ -41,6 +41,7 @@ import tools.program as program from paddle import fluid from ppocr.utils.utility import initial_logger logger = initial_logger() +from ppocr.utils.utility import enable_static_mode from ppocr.data.reader_main import reader_main from ppocr.utils.save_load import init_model from ppocr.utils.character import CharacterOps @@ -171,6 +172,7 @@ def main(): if __name__ == '__main__': + enable_static_mode() parser = program.ArgsParser() FLAGS = parser.parse_args() main() diff --git a/tools/inference_to_serving.py b/tools/inference_to_serving.py new file mode 100644 index 0000000000000000000000000000000000000000..77af59cc70a2a6e7610579d798f2722c3c63f847 --- /dev/null +++ b/tools/inference_to_serving.py @@ -0,0 +1,29 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +from paddle_serving_client.io import inference_model_to_serving +def parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument("--model_dir", type=str) + parser.add_argument("--server_dir", type=str, default="serving_server_dir") + parser.add_argument("--client_dir", type=str, default="serving_client_dir") + return parser.parse_args() + +args = parse_args() +inference_model_dir = args.model_dir +serving_client_dir = args.server_dir +serving_server_dir = args.client_dir +feed_var_names, fetch_var_names = inference_model_to_serving( + inference_model_dir, serving_client_dir, serving_server_dir, model_filename="model", params_filename="params") diff --git a/tools/program.py b/tools/program.py index 2ef203f4cb08231fa04cf2e4c8ee41a40470a0ae..f1f4b8913bea7f36b6bc11f7dade9d8b2a3bc7a0 100755 --- a/tools/program.py +++ b/tools/program.py @@ -90,13 +90,13 @@ def load_config(file_path): merge_config(default_config) _, ext = os.path.splitext(file_path) assert ext in ['.yml', '.yaml'], "only support yaml files for now" - merge_config(yaml.load(open(file_path), Loader=yaml.Loader)) + merge_config(yaml.load(open(file_path, 'rb'), Loader=yaml.Loader)) assert "reader_yml" in global_config['Global'],\ "absence reader_yml in global" reader_file_path = global_config['Global']['reader_yml'] _, ext = os.path.splitext(reader_file_path) assert ext in ['.yml', '.yaml'], "only support yaml files for reader" - merge_config(yaml.load(open(reader_file_path), Loader=yaml.Loader)) + merge_config(yaml.load(open(reader_file_path, 'rb'), Loader=yaml.Loader)) return global_config @@ -121,7 +121,10 @@ def merge_config(config): global_config.keys(), sub_keys[0]) cur = global_config[sub_keys[0]] for idx, sub_key in enumerate(sub_keys[1:]): - assert (sub_key in cur) + assert ( + sub_key in cur + ), "key {} not in sub_keys: {}, please check your running command.".format( + sub_key, cur) if idx == len(sub_keys) - 2: cur[sub_key] = value else: @@ -150,19 +153,20 @@ def check_gpu(use_gpu): def build(config, main_prog, startup_prog, mode): """ Build a program using a model and an optimizer - 1. create feeds - 2. create a dataloader - 3. create a model - 4. create fetchs - 5. create an optimizer + 1. create a dataloader + 2. create a model + 3. create fetches + 4. create an optimizer Args: config(dict): config main_prog(): main program startup_prog(): startup program - is_train(bool): train or valid + mode(str): train or valid Returns: dataloader(): a bridge between the model and the data - fetchs(dict): dict of model outputs(included loss and measures) + fetch_name_list(dict): dict of model outputs(included loss and measures) + fetch_varname_list(list): list of outputs' varname + opt_loss_name(str): name of loss """ with fluid.program_guard(main_prog, startup_prog): with fluid.unique_name.guard(): @@ -207,8 +211,8 @@ def build_export(config, main_prog, startup_prog): Build input and output for exporting a checkpoints model to an inference model Args: config(dict): config - main_prog(): main program - startup_prog(): startup program + main_prog: main program + startup_prog: startup program Returns: feeded_var_names(list[str]): var names of input for exported inference model target_vars(list[Variable]): output vars for exported inference model @@ -241,9 +245,11 @@ def create_multi_devices_program(program, loss_var_name, for_quant=False): build_strategy.enable_inplace = True if for_quant: build_strategy.fuse_all_reduce_ops = False + else: + program = fluid.CompiledProgram(program) exec_strategy = fluid.ExecutionStrategy() exec_strategy.num_iteration_per_drop_scope = 1 - compile_program = fluid.CompiledProgram(program).with_data_parallel( + compile_program = program.with_data_parallel( loss_name=loss_var_name, build_strategy=build_strategy, exec_strategy=exec_strategy) @@ -254,10 +260,15 @@ def train_eval_det_run(config, exe, train_info_dict, eval_info_dict, - is_pruning=False): - ''' - main program of evaluation for detection - ''' + is_slim=None): + """ + Feed data to the model and fetch the measures and loss for detection + Args: + config: config + exe: + train_info_dict: information dict for training + eval_info_dict: information dict for evaluation + """ train_batch_id = 0 log_smooth_window = config['Global']['log_smooth_window'] epoch_num = config['Global']['epoch_num'] @@ -313,14 +324,21 @@ def train_eval_det_run(config, best_batch_id = train_batch_id best_epoch = epoch save_path = save_model_dir + "/best_accuracy" - if is_pruning: - import paddleslim as slim - slim.prune.save_model( - exe, train_info_dict['train_program'], - save_path) - else: + if is_slim is None: save_model(train_info_dict['train_program'], save_path) + else: + import paddleslim as slim + if is_slim == "prune": + slim.prune.save_model( + exe, train_info_dict['train_program'], + save_path) + elif is_slim == "quant": + save_model(eval_info_dict['program'], save_path) + else: + raise ValueError( + "Only quant and prune are supported currently. But received {}". + format(is_slim)) strs = 'Test iter: {}, metrics:{}, best_hmean:{:.6f}, best_epoch:{}, best_batch_id:{}'.format( train_batch_id, metrics, best_eval_hmean, best_epoch, best_batch_id) @@ -331,27 +349,50 @@ def train_eval_det_run(config, train_loader.reset() if epoch == 0 and save_epoch_step == 1: save_path = save_model_dir + "/iter_epoch_0" - if is_pruning: - import paddleslim as slim - slim.prune.save_model(exe, train_info_dict['train_program'], - save_path) - else: + if is_slim is None: save_model(train_info_dict['train_program'], save_path) + else: + import paddleslim as slim + if is_slim == "prune": + slim.prune.save_model(exe, train_info_dict['train_program'], + save_path) + elif is_slim == "quant": + save_model(eval_info_dict['program'], save_path) + else: + raise ValueError( + "Only quant and prune are supported currently. But received {}". + format(is_slim)) if epoch > 0 and epoch % save_epoch_step == 0: save_path = save_model_dir + "/iter_epoch_%d" % (epoch) - if is_pruning: - import paddleslim as slim - slim.prune.save_model(exe, train_info_dict['train_program'], - save_path) - else: + if is_slim is None: save_model(train_info_dict['train_program'], save_path) + else: + import paddleslim as slim + if is_slim == "prune": + slim.prune.save_model(exe, train_info_dict['train_program'], + save_path) + elif is_slim == "quant": + save_model(eval_info_dict['program'], save_path) + else: + raise ValueError( + "Only quant and prune are supported currently. But received {}". + format(is_slim)) return -def train_eval_rec_run(config, exe, train_info_dict, eval_info_dict): - ''' - main program of evaluation for recognition - ''' +def train_eval_rec_run(config, + exe, + train_info_dict, + eval_info_dict, + is_slim=None): + """ + Feed data to the model and fetch the measures and loss for recognition + Args: + config: config + exe: + train_info_dict: information dict for training + eval_info_dict: information dict for evaluation + """ train_batch_id = 0 log_smooth_window = config['Global']['log_smooth_window'] epoch_num = config['Global']['epoch_num'] @@ -428,7 +469,21 @@ def train_eval_rec_run(config, exe, train_info_dict, eval_info_dict): best_batch_id = train_batch_id best_epoch = epoch save_path = save_model_dir + "/best_accuracy" - save_model(train_info_dict['train_program'], save_path) + if is_slim is None: + save_model(train_info_dict['train_program'], + save_path) + else: + import paddleslim as slim + if is_slim == "prune": + slim.prune.save_model( + exe, train_info_dict['train_program'], + save_path) + elif is_slim == "quant": + save_model(eval_info_dict['program'], save_path) + else: + raise ValueError( + "Only quant and prune are supported currently. But received {}". + format(is_slim)) strs = 'Test iter: {}, acc:{:.6f}, best_acc:{:.6f}, best_epoch:{}, best_batch_id:{}, eval_sample_num:{}'.format( train_batch_id, eval_acc, best_eval_acc, best_epoch, best_batch_id, eval_sample_num) @@ -439,14 +494,42 @@ def train_eval_rec_run(config, exe, train_info_dict, eval_info_dict): train_loader.reset() if epoch == 0 and save_epoch_step == 1: save_path = save_model_dir + "/iter_epoch_0" - save_model(train_info_dict['train_program'], save_path) + if is_slim is None: + save_model(train_info_dict['train_program'], save_path) + else: + import paddleslim as slim + if is_slim == "prune": + slim.prune.save_model(exe, train_info_dict['train_program'], + save_path) + elif is_slim == "quant": + save_model(eval_info_dict['program'], save_path) + else: + raise ValueError( + "Only quant and prune are supported currently. But received {}". + format(is_slim)) if epoch > 0 and epoch % save_epoch_step == 0: save_path = save_model_dir + "/iter_epoch_%d" % (epoch) - save_model(train_info_dict['train_program'], save_path) + if is_slim is None: + save_model(train_info_dict['train_program'], save_path) + else: + import paddleslim as slim + if is_slim == "prune": + slim.prune.save_model(exe, train_info_dict['train_program'], + save_path) + elif is_slim == "quant": + save_model(eval_info_dict['program'], save_path) + else: + raise ValueError( + "Only quant and prune are supported currently. But received {}". + format(is_slim)) return -def train_eval_cls_run(config, exe, train_info_dict, eval_info_dict): +def train_eval_cls_run(config, + exe, + train_info_dict, + eval_info_dict, + is_slim=None): train_batch_id = 0 log_smooth_window = config['Global']['log_smooth_window'] epoch_num = config['Global']['epoch_num'] @@ -509,7 +592,21 @@ def train_eval_cls_run(config, exe, train_info_dict, eval_info_dict): best_batch_id = train_batch_id best_epoch = epoch save_path = save_model_dir + "/best_accuracy" - save_model(train_info_dict['train_program'], save_path) + if is_slim is None: + save_model(train_info_dict['train_program'], + save_path) + else: + import paddleslim as slim + if is_slim == "prune": + slim.prune.save_model( + exe, train_info_dict['train_program'], + save_path) + elif is_slim == "quant": + save_model(eval_info_dict['program'], save_path) + else: + raise ValueError( + "Only quant and prune are supported currently. But received {}". + format(is_slim)) strs = 'Test iter: {}, acc:{:.6f}, best_acc:{:.6f}, best_epoch:{}, best_batch_id:{}, eval_sample_num:{}'.format( train_batch_id, eval_acc, best_eval_acc, best_epoch, best_batch_id, eval_sample_num) @@ -520,10 +617,34 @@ def train_eval_cls_run(config, exe, train_info_dict, eval_info_dict): train_loader.reset() if epoch == 0 and save_epoch_step == 1: save_path = save_model_dir + "/iter_epoch_0" - save_model(train_info_dict['train_program'], save_path) + if is_slim is None: + save_model(train_info_dict['train_program'], save_path) + else: + import paddleslim as slim + if is_slim == "prune": + slim.prune.save_model(exe, train_info_dict['train_program'], + save_path) + elif is_slim == "quant": + save_model(eval_info_dict['program'], save_path) + else: + raise ValueError( + "Only quant and prune are supported currently. But received {}". + format(is_slim)) if epoch > 0 and epoch % save_epoch_step == 0: save_path = save_model_dir + "/iter_epoch_%d" % (epoch) - save_model(train_info_dict['train_program'], save_path) + if is_slim is None: + save_model(train_info_dict['train_program'], save_path) + else: + import paddleslim as slim + if is_slim == "prune": + slim.prune.save_model(exe, train_info_dict['train_program'], + save_path) + elif is_slim == "quant": + save_model(eval_info_dict['program'], save_path) + else: + raise ValueError( + "Only quant and prune are supported currently. But received {}". + format(is_slim)) return diff --git a/tools/test_hubserving.py b/tools/test_hubserving.py index f28ff39e441e9f0d8a4c6e1081827daf8aff9792..c34c1aeb90c0854cdb861f49ee3cf4ebe85c9f0e 100644 --- a/tools/test_hubserving.py +++ b/tools/test_hubserving.py @@ -63,8 +63,7 @@ def draw_server_result(image_file, res): scores.append(res[dno]['confidence']) boxes = np.array(boxes) scores = np.array(scores) - draw_img = draw_ocr( - image, boxes, texts, scores, draw_txt=True, drop_score=0.5) + draw_img = draw_ocr(image, boxes, texts, scores, drop_score=0.5) return draw_img diff --git a/tools/train.py b/tools/train.py index cf0171b340f8cebb6251d2ef12efb14d3cdb709e..d552f2152b91e0a01f1fc377ac0f90a02a2a0571 100755 --- a/tools/train.py +++ b/tools/train.py @@ -39,6 +39,7 @@ set_paddle_flags( import tools.program as program from paddle import fluid from ppocr.utils.utility import initial_logger +from ppocr.utils.utility import enable_static_mode logger = initial_logger() from ppocr.data.reader_main import reader_main from ppocr.utils.save_load import init_model @@ -119,14 +120,18 @@ def test_reader(): if count % 1 == 0: batch_time = time.time() - starttime starttime = time.time() - logger.info("reader:", count, len(data), batch_time) + logger.info("[reader]count: {}, data length: {}, time: {}". + format(count, len(data), batch_time)) except Exception as e: logger.info(e) logger.info("finish reader: {}, Success!".format(count)) if __name__ == '__main__': + enable_static_mode() startup_program, train_program, place, config, train_alg_type = program.preprocess( ) + # run the train process main() -# test_reader() + # if you want to check the reader, you can comment `main` and run test_reader + # test_reader() diff --git a/train_data/gen_label.py b/train_data/gen_label.py index 552f279f34efa0be437d404273c510585da12f83..43afe9ddf182ad0da8df023ff29cd3759011d890 100644 --- a/train_data/gen_label.py +++ b/train_data/gen_label.py @@ -13,6 +13,7 @@ #limitations under the License. import os import argparse +import json def gen_rec_label(input_path, out_label): @@ -32,15 +33,19 @@ def gen_det_label(root_path, input_dir, out_label): label = [] with open(os.path.join(input_dir, label_file), 'r') as f: for line in f.readlines(): - tmp = line.strip("\n\r").replace("\xef\xbb\xbf", "").split(',') - points = tmp[:-2] + tmp = line.strip("\n\r").replace("\xef\xbb\xbf", + "").split(',') + points = tmp[:8] s = [] for i in range(0, len(points), 2): b = points[i:i + 2] + b = [int(t) for t in b] s.append(b) - result = {"transcription": tmp[-1], "points": s} + result = {"transcription": tmp[8], "points": s} label.append(result) - out_file.write(img_path + '\t' + str(label) + '\n') + + out_file.write(img_path + '\t' + json.dumps( + label, ensure_ascii=False) + '\n') if __name__ == "__main__":