From b44e60f80d6fab30a05ad52732604350a51b7dc4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 29 Nov 2010 09:44:39 -0700 Subject: [PATCH 01/24] La Rijoa nad NacionRed by Arturo Martinez Nieves --- resources/nacionred.recipe | 11 +++++++ resources/recipes/la_rioja.recipe | 54 +++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 resources/nacionred.recipe create mode 100644 resources/recipes/la_rioja.recipe diff --git a/resources/nacionred.recipe b/resources/nacionred.recipe new file mode 100644 index 0000000000..4108deab88 --- /dev/null +++ b/resources/nacionred.recipe @@ -0,0 +1,11 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1291022049(BasicNewsRecipe): + title = u'NacionRed.com' + oldest_article = 7 + max_articles_per_feed = 100 + language = 'es' + __author__ = 'Arturo Martinez Nieves' + + feeds = [(u'NacionRed.com', u'http://feeds.weblogssl.com/nacionred?format=xml')] + diff --git a/resources/recipes/la_rioja.recipe b/resources/recipes/la_rioja.recipe new file mode 100644 index 0000000000..eea3dd2687 --- /dev/null +++ b/resources/recipes/la_rioja.recipe @@ -0,0 +1,54 @@ +__license__ = 'GPL v3' +__copyright__ = '2010, Darko Miletic ' +''' +www.larioja.com +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class LaRioja(BasicNewsRecipe): + title = 'La Rioja' + __author__ = 'Arturo Martinez Nieves' + description = 'Noticias de La Rioja y el resto del mundo' + publisher = 'La Rioja' + category = 'news, politics, Spain' + oldest_article = 2 + max_articles_per_feed = 200 + no_stylesheets = True + encoding = 'cp1252' + use_embedded_content = False + language = 'es' + remove_empty_feeds = True + masthead_url = 'http://www.larioja.com/includes/manuales/larioja/include-lariojapapeldigital-zonac-fondocabecera01.jpg' + extra_css = ' body{font-family: Arial,Helvetica,sans-serif } img{margin-bottom: 0.4em} .photo-caption{font-size: x-small} ' + + conversion_options = { + 'comment' : description + , 'tags' : category + , 'publisher' : publisher + , 'language' : language + } + + keep_only_tags = [ + dict(attrs={'id':'title'}) + ,dict(attrs={'class':['overhead','headline','subhead','date','text','noticia_cont','desarrollo']}) + ] + remove_tags = [dict(name='ul')] + remove_attributes = ['width','height'] + + + feeds = [ + (u'Ultimas Noticias' , u'http://www.larioja.com/rss/feeds/ultima.xml' ) + ,(u'Portada' , u'http://www.larioja.com/rss/feeds/portada.xml' ) + ,(u'Mundo' , u'http://www.larioja.com/rss/feeds/mundo.xml' ) + ,(u'Espana' , u'http://www.larioja.com/rss/feeds/espana.xml' ) + ,(u'Region' , u'http://www.larioja.com/rss/feeds/region.xml' ) + ,(u'Comarcas' , u'http://www.larioja.com/rss/feeds/comarcas.xml') + ,(u'Deportes' , u'http://www.larioja.com/rss/feeds/deportes.xml' ) + ,(u'Economia' , u'http://www.larioja.com/rss/feeds/economia.xml' ) + ,(u'Cultura' , u'http://www.larioja.com/rss/feeds/cultura.xml' ) + ,(u'Opinion' , u'http://www.larioja.com/rss/feeds/opinion.xml' ) + ,(u'Sociedad' , u'http://www.larioja.com/rss/feeds/sociedad.xml' ) + + ] + From 4bb388216a65dd86f70811ea3ee1d20906cd74e1 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Mon, 29 Nov 2010 16:58:54 +0000 Subject: [PATCH 02/24] Drag & drop onto user categories --- src/calibre/gui2/dialogs/tag_categories.py | 2 +- src/calibre/gui2/library/views.py | 2 + src/calibre/gui2/tag_view.py | 88 +++++++++++++++++++++- 3 files changed, 87 insertions(+), 5 deletions(-) diff --git a/src/calibre/gui2/dialogs/tag_categories.py b/src/calibre/gui2/dialogs/tag_categories.py index 679a5c9da9..7a9660a655 100644 --- a/src/calibre/gui2/dialogs/tag_categories.py +++ b/src/calibre/gui2/dialogs/tag_categories.py @@ -51,7 +51,7 @@ class TagCategories(QDialog, Ui_TagCategories): cc_map = self.db.custom_column_label_map for cc in cc_map: - if cc_map[cc]['datatype'] == 'text': + if cc_map[cc]['datatype'] in ['text', 'series']: self.category_labels.append(db.field_metadata.label_to_key(cc)) category_icons.append(cc_icon) category_values.append(lambda col=cc: self.db.all_custom(label=col)) diff --git a/src/calibre/gui2/library/views.py b/src/calibre/gui2/library/views.py index a972acfc13..fadb8314e3 100644 --- a/src/calibre/gui2/library/views.py +++ b/src/calibre/gui2/library/views.py @@ -517,6 +517,8 @@ class BooksView(QTableView): # {{{ md.setUrls([url_for_id(i) for i in selected]) drag = QDrag(self) + col = self.selectionModel().currentIndex().column() + md.column_name = self.column_map[col] drag.setMimeData(md) cover = self.drag_icon(m.cover(self.currentIndex().row()), len(selected) > 1) diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index 3ded769137..ed27026562 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -67,7 +67,7 @@ class TagsView(QTreeView): # {{{ author_sort_edit = pyqtSignal(object, object) tag_item_renamed = pyqtSignal() search_item_renamed = pyqtSignal() - drag_drop_finished = pyqtSignal(object) + drag_drop_finished = pyqtSignal(object, object) def __init__(self, parent=None): QTreeView.__init__(self, parent=None) @@ -252,6 +252,30 @@ class TagsView(QTreeView): # {{{ self.context_menu.popup(self.mapToGlobal(point)) return True + def dragMoveEvent(self, event): + self.setDropIndicatorShown(False) + index = self.indexAt(event.pos()) + if not index.isValid(): + self.setDropIndicatorShown(False) + return + item = index.internalPointer() + flags = self._model.flags(index) + if item.type == TagTreeItem.TAG and flags & Qt.ItemIsDropEnabled: + self.setDropIndicatorShown(True) + else: + item = index.internalPointer() + if item.type == TagTreeItem.CATEGORY: + fm_dest = self.db.metadata_for_field(item.category_key) + if fm_dest['kind'] == 'user': + md = event.mimeData() + fm_src = self.db.metadata_for_field(md.column_name) + if md.column_name in ['authors', 'publisher', 'series'] or \ + (fm_src['is_custom'] and + fm_src['datatype'] in ['series', 'text'] and + not fm_src['is_multiple']): + self.setDropIndicatorShown(True) + QTreeView.dragMoveEvent(self, event) + def clear(self): if self.model(): self.model().clear_state() @@ -448,8 +472,59 @@ class TagsModel(QAbstractItemModel): # {{{ ids = list(map(int, str(md.data(mime)).split())) self.handle_drop(node, ids) return True + elif node.type == TagTreeItem.CATEGORY: + fm_dest = self.db.metadata_for_field(node.category_key) + if fm_dest['kind'] == 'user': + fm_src = self.db.metadata_for_field(md.column_name) + if md.column_name in ['authors', 'publisher', 'series'] or \ + (fm_src['is_custom'] and + fm_src['datatype'] in ['series', 'text'] and + not fm_src['is_multiple']): + mime = 'application/calibre+from_library' + ids = list(map(int, str(md.data(mime)).split())) + self.handle_user_category_drop(node, ids, md.column_name) + return True return False + def handle_user_category_drop(self, on_node, ids, column): + categories = self.db.prefs.get('user_categories', {}) + category = categories.get(on_node.category_key[:-1], None) + if category is None: + return + fm_src = self.db.metadata_for_field(column) + for id in ids: + vmap = {} + label = fm_src['label'] + if not fm_src['is_custom']: + if label == 'authors': + items = self.db.get_authors_with_ids() + items = [(i[0], i[1].replace('|', ',')) for i in items] + value = self.db.authors(id, index_is_id=True) + value = [v.replace('|', ',') for v in value.split(',')] + elif label == 'publisher': + items = self.db.get_publishers_with_ids() + value = self.db.publisher(id, index_is_id=True) + elif label == 'series': + items = self.db.get_series_with_ids() + value = self.db.series(id, index_is_id=True) + else: + items = self.db.get_custom_items_with_ids(label=label) + value = self.db.get_custom(id, label=label, index_is_id=True) + if value is None: + return + if not isinstance(value, list): + value = [value] + for v in items: + vmap[v[1]] = v[0] + for val in value: + for (v, c, id) in category: + if v == val and c == column: + break + else: + category.append([val, column, vmap[val]]) + categories[on_node.category_key[:-1]] = category + self.db.prefs.set('user_categories', categories) + self.drag_drop_finished.emit(None, True) def handle_drop(self, on_node, ids): #print 'Dropped ids:', ids, on_node.tag @@ -499,7 +574,7 @@ class TagsModel(QAbstractItemModel): # {{{ self.db.set_metadata(id, mi, set_title=False, set_authors=set_authors, commit=False) self.db.commit() - self.drag_drop_finished.emit(ids) + self.drag_drop_finished.emit(ids, False) def set_search_restriction(self, s): self.search_restriction = s @@ -641,6 +716,8 @@ class TagsModel(QAbstractItemModel): # {{{ (fm['is_custom'] and \ fm['datatype'] in ['text', 'rating', 'series']): ans |= Qt.ItemIsDropEnabled + else: + ans |= Qt.ItemIsDropEnabled return ans def supportedDropActions(self): @@ -857,8 +934,11 @@ class TagBrowserMixin(object): # {{{ self.library_view.model().refresh() self.tags_view.recount() - def drag_drop_finished(self, ids): - self.library_view.model().refresh_ids(ids) + def drag_drop_finished(self, ids, is_category): + if is_category: + self.tags_view.recount() + else: + self.library_view.model().refresh_ids(ids) # }}} From fdf989c011f0bc7edffa68b6e9dbf585fa49b48d Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 29 Nov 2010 10:06:39 -0700 Subject: [PATCH 03/24] ... --- src/calibre/manual/faq.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/calibre/manual/faq.rst b/src/calibre/manual/faq.rst index f9fe5bd3af..55451206b6 100644 --- a/src/calibre/manual/faq.rst +++ b/src/calibre/manual/faq.rst @@ -247,6 +247,18 @@ Also, :: must return ``CONFIG_SCSI_MULTI_LUN=y``. If you don't see either, you have to recompile your kernel with the correct settings. +My device is getting mounted read-only in linux, so |app| cannot connect to it? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +linux kernels mount devices read-only when their filesystems have errors. You can repair the filesystem with:: + + sudo fsck.vfat -y /dev/sdc + +Replace /dev/sdc with the path to the device node of your device. You can find the device node of your device, which +will always be under /dev by examining the output of:: + + mount + Why does |app| not support collection on the Kindle or shelves on the Nook? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 25467ff22afa384a8945acee887b43ae053fd22d Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 29 Nov 2010 10:36:35 -0700 Subject: [PATCH 04/24] Fix #7729 (calibre network share not working) --- src/calibre/library/server/browse.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/library/server/browse.py b/src/calibre/library/server/browse.py index fbb35e598c..b6dbde4c77 100644 --- a/src/calibre/library/server/browse.py +++ b/src/calibre/library/server/browse.py @@ -368,7 +368,7 @@ class BrowseServer(object): for x, y, z in cats] main = u'

{0}

    {1}
'\ - .format(_('Choose a category to browse by:'), '\n\n'.join(cats)) + .format(_('Choose a category to browse by:'), u'\n\n'.join(cats)) return self.browse_template('name').format(title='', script='toplevel();', main=main) From eeda4caf10443bbdeeab1076cca2ca75e6ddb24d Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 29 Nov 2010 13:13:10 -0700 Subject: [PATCH 05/24] ... --- resources/{ => recipes}/nacionred.recipe | 0 setup/commands.py | 6 ++-- setup/installer/linux/__init__.py | 2 +- setup/installer/linux/freeze2.py | 44 +++++++++++++++--------- 4 files changed, 30 insertions(+), 22 deletions(-) rename resources/{ => recipes}/nacionred.recipe (100%) diff --git a/resources/nacionred.recipe b/resources/recipes/nacionred.recipe similarity index 100% rename from resources/nacionred.recipe rename to resources/recipes/nacionred.recipe diff --git a/setup/commands.py b/setup/commands.py index 06ab7b36f7..12fb5fe0af 100644 --- a/setup/commands.py +++ b/setup/commands.py @@ -18,7 +18,7 @@ __all__ = [ 'pypi_register', 'pypi_upload', 'upload_to_server', 'upload_user_manual', 'upload_to_mobileread', 'upload_demo', 'upload_to_sourceforge', 'upload_to_google_code', - 'linux32', 'linux64', 'linux', 'linux_freeze', 'linux_freeze2', + 'linux32', 'linux64', 'linux', 'linux_freeze', 'osx32_freeze', 'osx', 'rsync', 'push', 'win32_freeze', 'win32', 'win', 'stage1', 'stage2', 'stage3', 'stage4', 'publish' @@ -79,10 +79,8 @@ from setup.installer.linux import Linux, Linux32, Linux64 linux = Linux() linux32 = Linux32() linux64 = Linux64() -from setup.installer.linux.freeze import LinuxFreeze +from setup.installer.linux.freeze2 import LinuxFreeze linux_freeze = LinuxFreeze() -from setup.installer.linux.freeze2 import LinuxFreeze2 -linux_freeze2 = LinuxFreeze2() from setup.installer.osx import OSX osx = OSX() diff --git a/setup/installer/linux/__init__.py b/setup/installer/linux/__init__.py index 68f29362ee..3d759cff9a 100644 --- a/setup/installer/linux/__init__.py +++ b/setup/installer/linux/__init__.py @@ -17,7 +17,7 @@ class Linux32(VMInstaller): INSTALLER_EXT = 'tar.bz2' VM_NAME = 'gentoo32_build' VM = '/vmware/bin/gentoo32_build' - FREEZE_COMMAND = 'linux_freeze2' + FREEZE_COMMAND = 'linux_freeze' FREEZE_TEMPLATE = 'sudo python -OO setup.py {freeze_command}' diff --git a/setup/installer/linux/freeze2.py b/setup/installer/linux/freeze2.py index b30762f4b6..0379c0d839 100644 --- a/setup/installer/linux/freeze2.py +++ b/setup/installer/linux/freeze2.py @@ -16,21 +16,9 @@ SITE_PACKAGES = ['IPython', 'PIL', 'dateutil', 'dns', 'PyQt4', 'mechanize', 'sip.so', 'BeautifulSoup.py', 'cssutils', 'encutils', 'lxml', 'sipconfig.py', 'xdg'] - - -gcc = subprocess.Popen(["gcc-config", "-c"], stdout=subprocess.PIPE).communicate()[0] -chost, _, gcc = gcc.rpartition('-') -stdcpp = '/usr/lib/gcc/%s/%s/libstdc++.so.?'%(chost.strip(), gcc.strip()) -stdcpp = glob.glob(stdcpp)[-1] -is64bit = platform.architecture()[0] == '64bit' -arch = 'x86_64' if is64bit else 'i686' -ffi = '/usr/lib/libffi.so.5' if is64bit else '/usr/lib/gcc/i686-pc-linux-gnu/4.4.1/libffi.so.4' - - QTDIR = '/usr/lib/qt4' QTDLLS = ('QtCore', 'QtGui', 'QtNetwork', 'QtSvg', 'QtXml', 'QtWebKit', 'QtDBus') - binary_includes = [ '/usr/bin/pdftohtml', '/usr/lib/libwmflite-0.2.so.7', @@ -49,8 +37,6 @@ binary_includes = [ '/usr/lib/libjpeg.so.8', '/usr/lib/libxslt.so.1', '/usr/lib/libgthread-2.0.so.0', - stdcpp, - ffi, '/usr/lib/libpng14.so.14', '/usr/lib/libexslt.so.0', '/usr/lib/libMagickWand.so.4', @@ -66,7 +52,11 @@ binary_includes = [ ] binary_includes += [os.path.join(QTDIR, 'lib%s.so.4'%x) for x in QTDLLS] -class LinuxFreeze2(Command): +is64bit = platform.architecture()[0] == '64bit' +arch = 'x86_64' if is64bit else 'i686' + + +class LinuxFreeze(Command): def run(self, opts): self.drop_privileges() @@ -93,7 +83,21 @@ class LinuxFreeze2(Command): self.info('Copying libs...') os.mkdir(self.lib_dir) os.mkdir(self.bin_dir) - for x in binary_includes: + + gcc = subprocess.Popen(["gcc-config", "-c"], stdout=subprocess.PIPE).communicate()[0] + chost, _, gcc = gcc.rpartition('-') + gcc_lib = '/usr/lib/gcc/%s/%s/'%(chost.strip(), gcc.strip()) + stdcpp = gcc_lib+'libstdc++.so.?' + stdcpp = glob.glob(stdcpp)[-1] + ffi = gcc_lib+'libffi.so.?' + ffi = glob.glob(ffi) + if ffi: + ffi = ffi[-1] + else: + ffi = glob.glob('/usr/lib/libffi.so.?')[-1] + + + for x in binary_includes + [stdcpp, ffi]: dest = self.bin_dir if '/bin/' in x else self.lib_dir shutil.copy2(x, dest) shutil.copy2('/usr/lib/libpython%s.so.1.0'%self.py_ver, dest) @@ -268,7 +272,6 @@ class LinuxFreeze2(Command): base=`dirname $path` lib=$base/lib export LD_LIBRARY_PATH=$lib:$LD_LIBRARY_PATH - export QT_PLUGIN_PATH=$lib/qt_plugins export MAGICK_CONFIGURE_PATH=$lib/ImageMagick/config export MAGICK_CODER_MODULE_PATH=$lib/ImageMagick/modules-Q16/coders export MAGICK_CODER_FILTER_PATH=$lib/ImageMagick/modules-Q16/filters @@ -336,12 +339,19 @@ class LinuxFreeze2(Command): def set_helper(): __builtin__.help = _Helper() + def set_qt_plugin_path(): + from PyQt4.Qt import QCoreApplication + paths = list(map(unicode, QCoreApplication.libraryPaths())) + paths.insert(0, sys.frozen_path + '/lib/qt_plugins') + QCoreApplication.setLibraryPaths(paths) + def main(): try: sys.argv[0] = sys.calibre_basename set_default_encoding() set_helper() + set_qt_plugin_path() mod = __import__(sys.calibre_module, fromlist=[1]) func = getattr(mod, sys.calibre_function) return func() From 6f2a36949a9ce4d5f0311f70d6b4c2f8718c0e0f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 29 Nov 2010 16:37:50 -0700 Subject: [PATCH 06/24] Fix #7733 (Updated gui.rst and associated image files) --- src/calibre/manual/customize.rst | 2 + src/calibre/manual/gui.rst | 278 ++++++++++++------ src/calibre/manual/images/actions.png | Bin 21712 -> 37220 bytes src/calibre/manual/images/add_books.png | Bin 4054 -> 2705 bytes .../manual/images/auto_author_sort.png | Bin 0 -> 1283 bytes src/calibre/manual/images/catalogs.png | Bin 8581 -> 13227 bytes src/calibre/manual/images/connect_share.png | Bin 0 -> 4929 bytes src/calibre/manual/images/convert_ebooks.png | Bin 4742 -> 3788 bytes src/calibre/manual/images/device.png | Bin 0 -> 3152 bytes .../manual/images/edit_meta_information.png | Bin 2555 -> 3574 bytes src/calibre/manual/images/fetch_news.png | Bin 3132 -> 3101 bytes src/calibre/manual/images/folder_device.png | Bin 0 -> 3685 bytes src/calibre/manual/images/jobs.png | Bin 3726 -> 1753 bytes src/calibre/manual/images/library.png | Bin 0 -> 5737 bytes src/calibre/manual/images/preferences.png | Bin 0 -> 4505 bytes src/calibre/manual/images/remove_books.png | Bin 3952 -> 4993 bytes src/calibre/manual/images/save_to_disk.png | Bin 4466 -> 3934 bytes src/calibre/manual/images/send_to_device.png | Bin 4292 -> 2896 bytes src/calibre/manual/images/show_tag_editor.png | Bin 0 -> 1094 bytes .../manual/images/swap_title_author.png | Bin 0 -> 1327 bytes src/calibre/manual/images/view.png | Bin 3575 -> 3101 bytes 21 files changed, 185 insertions(+), 95 deletions(-) create mode 100644 src/calibre/manual/images/auto_author_sort.png create mode 100644 src/calibre/manual/images/connect_share.png create mode 100644 src/calibre/manual/images/device.png create mode 100644 src/calibre/manual/images/folder_device.png create mode 100644 src/calibre/manual/images/library.png create mode 100644 src/calibre/manual/images/preferences.png create mode 100644 src/calibre/manual/images/show_tag_editor.png create mode 100644 src/calibre/manual/images/swap_title_author.png diff --git a/src/calibre/manual/customize.rst b/src/calibre/manual/customize.rst index 0d6f75b9cf..d7b4e931d9 100644 --- a/src/calibre/manual/customize.rst +++ b/src/calibre/manual/customize.rst @@ -104,6 +104,8 @@ A Hello World GUI plugin Here's a simple Hello World plugin for the |app| GUI. It will cause a box to popup with the message "Hellooo World!" when you press Ctrl+Shift+H +.. note:: Only available in calibre versions ``>= 0.7.32``. + .. code-block:: python from calibre.customize import InterfaceActionBase diff --git a/src/calibre/manual/gui.rst b/src/calibre/manual/gui.rst index a91124b214..28fd0307d3 100644 --- a/src/calibre/manual/gui.rst +++ b/src/calibre/manual/gui.rst @@ -12,6 +12,7 @@ for using |app| is to first add books to the library from your hard disk. to its internal database. Once they are in the database, you can perform a various :ref:`actions` on them that include conversion from one format to another, transfer to the reading device, viewing on your computer, editing metadata, including covers, etc. +Note that |app| creates copies of the files you add to it, your original files are left untouched. The interface is divided into various sections: @@ -27,7 +28,7 @@ Actions .. image:: images/actions.png :alt: The Actions Toolbar -The actions toolbar provides convenient shortcuts to commonly used actions. Most of the action buttons have little arrows next to them. By clicking the arrows, you can perform variations on the default action. +The actions toolbar provides convenient shortcuts to commonly used actions. Most of the action buttons have little arrows next to them. By clicking the arrows, you can perform variations on the default action. Please note that the actions toolbar will look slightly different depending on whether you have an ebook reader attached to your computer. .. contents:: :depth: 1 @@ -39,99 +40,51 @@ Add books ~~~~~~~~~~~~~~~~~~ .. |adbi| image:: images/add_books.png -|adbi| The :guilabel:`Add books` action has three variations, accessed by the arrow next to the button. +|adbi| The :guilabel:`Add books` action has five variations, accessed by the clicking the down arrow on the right side of the button. 1. **Add books from a single directory**: Opens a file chooser dialog and allows you to specify which books in a directory should be added. This action is *context sensitive*, i.e. it depends on which :ref:`catalog ` you have selected. If you have selected the :guilabel:`Library`, books will be added to the library. If you have selected the ebook reader device, the books will be uploaded to the device, and so on. - 2. **Add books recursively (One book per directory)**: Allows you to choose a directory. The directory and all its sub-directories are scanned recursively and any ebooks found are added to the library.The algorithm assumes that each directory contains a single book. All ebook files in a directory are assumedto be the same book in different formats. This action is the inverse of the :ref:`Save to disk ` action, i.e. you can :guilabel:`Save to disk`, delete the books and re-add them with no lost information (except date). + 2. **Add books from directories, including sub-directories (One book per directory, assumes every ebook file is the same book in a different format)**: Allows you to choose a directory. The directory and all its sub-directories are scanned recursively and any ebooks found are added to the library. The algorithm assumes that each directory contains a single book. All ebook files in a directory are assumedto be the same book in different formats. This action is the inverse of the :ref:`Save to disk ` action, i.e. you can :guilabel:`Save to disk`, delete the books and re-add them with no lost information (except date). - 3. **Add books recursively (Multiple books per directory)**: Allows you to choose a directory. The directory and all its sub-directories are scanned recursively and any ebooks found are added to the library.The algorithm assumes that each directory contains many books. All ebook files with the same name in a directory are assumed to be the same book in different formats. This action is the inverse of the :ref:`Save to disk ` action, i.e. you can :guilabel:`Save to disk`, delete the books and re-add them with no lost information (except date). + 3. **Add books directories, including sub-directories (Multiple books per directory, assumes every ebook file is a different book)**: Allows you to choose a directory. The directory and all its sub-directories are scanned recursively and any ebooks found are added to the library. The algorithm assumes that each directory contains many books. All ebook files with the same name in a directory are assumed to be the same book in different formats. Ebooks with different names are added as different books. This action is the inverse of the :ref:`Save to disk ` action, i.e. you can :guilabel:`Save to disk`, delete the books and re-add them with no lost information (except date). + 4. **Add empty book. (Book Entry with blank formats)**: Allows you to create a blank book record. This can be used to then manually fill out the information about a book that you may not have yet in your collection. + + 5. **Add by ISBN**: Allows you to add one or more books by entering just their ISBN into a list or pasting the list of ISBNs from your clipboard. + +The :guilabel:`Add books` action can read metadata from a wide variety of e-book formats. In addition it tries to guess metadata from the filename. +See the :ref:`config_filename_metadata` section, to learn how to configure this. -The :guilabel:`Add books` action can read metadata from the following ebook formats: ``LRF, EPUB, LIT, MOBI, RTF, PDF, PRC, HTML``. In addition it tries to guess metadata from the filename. See the :ref:`config_filename_metadata` section, to learn how to configure this. - -To add a new format to an existing book, use the :ref:`edit_meta_information` action. - -.. _remove_books: - -Remove books -~~~~~~~~~~~~~~~~~~~~~ -.. |rbi| image:: images/remove_books.png - -|rbi| The :guilabel:`Remove books` action deletes books permanently, so use it with care. It is *context sensitive*, i.e. it depends on which :ref:`catalog ` you have selected. If you have selected the :guilabel:`Library`, books will be removed from the library. If you have selected the ebook reader device, the books will be removed from the device. To remove only a particular format for a given book use the :ref:`edit_meta_information` action. +To add an additional format for an existing book, use the :ref:`edit_meta_information` action. .. _edit_meta_information: -Edit meta information +Edit metadata ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. |emii| image:: images/edit_meta_information.png -|emii| The :guilabel:`Edit meta information` action has two variations, accessed by the arrow next to the button. +|emii| The :guilabel:`Edit metadata` action has six variations, which can be accessed by clicking the down arrow on the right side of the button. 1. **Edit metadata individually**: This allows you to edit the metadata of books one-by-one, with the option of fetching metadata, including covers from the internet. It also allows you to add/remove particular ebook formats from a book. For more detail see :ref:`metadata`. - 2. **Edit metadata in bulk**: This allows you to edit common metadata fields for large numbers of books simulataneously. It operates on all the books you have selected in the :ref:`Library view `. + 3. **Download metadata and covers**: Downloads metadata and covers (if available), for the books that are selected in the book list. + 4. **Download only metadata**: Downloads only metadata (if available), for the books that are selected in the book list. + 5. **Download only covers**: Downloads only covers (if available), for the books that are selected in the book list. + 6. **Download only social metadata**: Downloads only social metadata such as tags and reviews (if available), for the books that are selected in the book list. + 7. **Merge Book Records**: Gives you the capability of merging the metadata and formats of two or more book records together. You can choose to either delete or keep the records that were not clicked first. -.. _send_to_device: - -Send to device -~~~~~~~~~~~~~~~~~~~~~~~~ -.. |stdi| image:: images/send_to_device.png - -|stdi| The :guilabel:`Send to device` action has two variations, accessed by the arrow next to the button. - - 1. **Send to main memory**: The selected books are transferred to the main memory of the ebook reader. - 2. **Send to card**: The selected books are transferred to the storage card on the ebook reader. - -You can control the file name and folder structure of files sent to the device by setting up a template in -:guilabel:`Preferences->Import/Export->Sending books to devices`. Also see :ref:`templatelangcalibre`. - -.. _save_to_disk: - -Save to disk -~~~~~~~~~~~~~~~~~~~~~~~~~ -.. |svdi| image:: images/save_to_disk.png - -|svdi| The :guilabel:`Save to disk` action has two variations, accessed by the arrow next to the button. - -.. _save_to_disk_multiple: - - 1. **Save to disk**: This will save the selected books to disk organized in directories. The directory structure looks like:: - - Author - Title - Book Files - -.. _save_to_disk_single: - - 2. **Save to disk in a single directory**: The selected books are saved to disk in a single directory. - -All available formats as well as metadata is stored to disk for each selected book. Metadata is stored in an OPF file. - -Saved books can be re-imported to the library without any loss of information by using the :ref:`Add books ` action. - -You can control the file name and folder structure of files saved to disk by setting up a template in -:guilabel:`Preferences->Import/Export->Saving books to disk`. Also see :ref:`templatelangcalibre`. - - -.. _fetch_news: - -Fetch news -~~~~~~~~~~~~~~~~~ -.. |fni| image:: images/fetch_news.png - -|fni| The :guilabel:`Fetch news` action downloads news from various websites and converts it into an ebook that can be read on your ebook reader. Normally, the newly created ebook is added to your ebook library, but if an ebook reader is connected at the time the download finishes, the news is uploaded to the reader directly. - -The :guilabel:`Fetch news` action uses simple recipes (10-15 lines of code) for each news site. To learn how to create recipes for your own news sources, see :ref:`news`. - + .. _convert_ebooks: Convert e-books ~~~~~~~~~~~~~~~~~~~~~~ .. |cei| image:: images/convert_ebooks.png -|cei| Ebooks can be converted from a number of formats into the LRF format (for the SONY Reader). Note that ebooks you purchase will typically have `Digital Rights Management `_ *(DRM)*. |app| will not convert these ebooks. For many DRM formats, it is easy to remove the DRM, but as this is illegal, you have to find tools to liberate your books yourself and then use |app| to convert them. +|cei| Ebooks can be converted from a number of formats into whatever format your e-book reader prefers. +Note that ebooks you purchase will typically have `Digital Rights Management `_ *(DRM)*. +|app| will not convert these ebooks. For many DRM formats, it is easy to remove the DRM, but as this may be illegal, +you have to find tools to liberate your books yourself and then use |app| to convert them. For most people, conversion should be a simple 1-click affair. But if you want to learn more about the conversion process, see :ref:`conversion`. @@ -141,29 +94,180 @@ The :guilabel:`Convert E-books` action has three variations, accessed by the arr 2. **Bulk convert**: This allows you to specify options only once to convert a number of ebooks in bulk. - 3. **Create catalog**: This action allows you to generate a complete listing with all metadata of the books in your library, in several formats, like XML, CSV, EPUB and MOBI. The catalog will contain all the books showing in the library view currently, so you can use the search features to limit the books to be catalogued. In addition, if you select multiple books using the mouse, only those books will be added to the catalog. If you generate the catalog in an e-book format such as EPUB or MOBI, the next time you connect your e-book reader, the catalog will be automatically sent to the device. For details on how catalogs work, see `here `_. - + 3. **Create catalog**: This action allows you to generate a complete listing with all metadata of the books in your library, + in several formats, like XML, CSV, BiBTeX, EPUB and MOBI. The catalog will contain all the books showing in the library view currently, + so you can use the search features to limit the books to be catalogued. In addition, if you select multiple books using the mouse, + only those books will be added to the catalog. If you generate the catalog in an e-book format such as EPUB or MOBI, + the next time you connect your e-book reader, the catalog will be automatically sent to the device. + For details on how catalogs work, see `here `. + .. _view: View ~~~~~~~~~~~ .. |vi| image:: images/view.png -|vi| The :guilabel:`View` action displays the book in an ebook viewer program. |app| has a builtin viewer for the LRF format. For other formats it uses the default operating system application. If a book has more than one format, you can view a particular format by clicking the arrow next to the :guilabel:`View` button. +|vi| The :guilabel:`View` action displays the book in an ebook viewer program. |app| has a builtin viewer for the most e-book formats. +For other formats it uses the default operating system application. You can configure which formats should open with the internal viewer via +Preferences->Behavior. If a book has more than one format, you can view a particular format by clicking the down arrow +on the right of the :guilabel:`View` button. + +.. _send_to_device: + +Send to device +~~~~~~~~~~~~~~~~~~~~~~~~ +.. |stdi| image:: images/send_to_device.png + +|stdi| The :guilabel:`Send to device` action has eight variations, accessed by clicking the down arrow on the right of the button. + + 1. **Send to main memory**: The selected books are transferred to the main memory of the ebook reader. + 2. **Send to card (A)**: The selected books are transferred to the storage card (A) on the ebook reader. + 3. **Send to card (B)**: The selected books are transferred to the storage card (B) on the ebook reader. + 4. **Send and delete from library>**: The selected books are transferred to the selected storage location on the device, and then **deleted** from the Library. + 5. **Send Specific format>**: The selected books are transferred to the selected storage location on the device, in the format that you specify. + 6. **Eject device**: The device is detached from |app|. + 7. **Set default send to device action>**: This action allows you to Specify which of the option 1) through 6) above will be the default action when you click the main button. + 8. **Fetch Annotations**: This is an experimental action which will transfer annotations you may have made on an ebook on your device, and add those annotations to the comments metadata of the book in the |app| library + +You can control the file name and folder structure of files sent to the device by setting up a template in +:guilabel:`Preferences->Import/Export->Sending books to devices`. Also see :ref:`templatelangcalibre`. + +.. _fetch_news: + +Fetch news +~~~~~~~~~~~~~~~~~ +.. |fni| image:: images/fetch_news.png + +|fni| The :guilabel:`Fetch news` action downloads news from various websites and converts it into an ebook that can be read on your ebook reader. Normally, the newly created ebook is added to your ebook library, but if an ebook reader is connected at the time the download finishes, the news is also uploaded to the reader automatically. + +The :guilabel:`Fetch news` action uses simple recipes (10-15 lines of code) for each news site. To learn how to create recipes for your own news sources, see :ref:`news`. + +The :guilabel:`Fetch news` action has three variations, accessed by clicking the down arrow on the right of the button. + + 1. **Schedule news download**: This action allows you to schedule the download of of your selected news sources from a list of hundreds of available. Scheduling can be set individually for each news source you select and the scheduling is flexible allowing you to select specific days of the week or a frequency of days between downloads. + 2. **Add a custom news service**: This action allows you to create a simple recipe for downloading news from a custom news site that you wish to access. Creating the recipe can be as simple as specifying an RSS news feed URL, or you can be more prescriptive by creating python based code for the task, see :ref:`news`. + 3. **Download all scheduled news sources**: This action causes |app| to immediately begin to download all news sources that you have previously scheduled. + + +.. _library: + +Library +~~~~~~~~~~~~~~~~~ +.. |lii| image:: images/library.png + +|lii| The :guilabel: `Library` action allows you to create, switch between, rename or delete a Library. |app| allows you to create as many libraries as you wish. You coudl for instance create a fiction library, a non fiction library, a foreign language library a project library, basically any structure that suits your needs. Libraries are the highest organizational structure within |app|, each library has its own set of books, tags, categories and base storage location. + + 1. **Switch\Create library..**: This action allows you to; a) connect to a pre-existing |app| library at another location from your currently open library, b) Create and empty library at a nw location or, c) Move the current Library to a newly specified location. + 2. **Quick Switch>**: This action allows you to switch between libraries that have been registered or created within |app|. + 3. **Rename Library>**: This action allows you to rename a Library. + 4. **Delete Library>**: This action allows you to **permanenetly delete** a Library. + 5. ****: Actions 5, 6 etc .. give you immediate switch access between multiple Libraries that you have created or attached to. + +.. _device: + +Device +~~~~~~~~~~~~~~~~~ +.. |dvi| image:: images/device.png + +|dvi| The :guilabel:`Device` action allows you to view the books in the main memory or storage cards of your device, or to eject the device (detach it from |app|). +This icon shows up automatically on the main |app| toolbar when you connect a supported device. You can click on it to see the books on your device. You can also drag and drop books from your |app| library onto the icon to transfer them to your device. Conversely, you can drag and drop books from your device onto the |app| icon on the toolbar to transfer books from your device to the |app| library. + + +.. _save_to_disk: + +Save to disk +~~~~~~~~~~~~~~~~~~~~~~~~~ +.. |svdi| image:: images/save_to_disk.png + +|svdi| The :guilabel:`Save to disk` action has five variations, accessed by the arrow next to the button. + +.. _save_to_disk_multiple: + + 1. **Save to disk**: This will save the selected books to disk organized in directories. The directory structure looks like:: + + Author_(sort) + Title + Book Files + + You can control the file name and folder structure of files saved to disk by setting up a template in + :guilabel:`Preferences->Import/Export->Saving books to disk`. Also see :ref:`templatelangcalibre`. + +.. _save_to_disk_single: + + 2. **Save to disk in a single directory**: The selected books are saved to disk in a single directory. + + For 1. and 2. All available formats as well as metadata is stored to disk for each selected book. Metadata is stored in an OPF file. + + Saved books can be re-imported to the library without any loss of information by using the :ref:`Add books ` action. + + 3. **Save only ** format to disk**: The selected books are saved to disk in the directory structure as shown in (1.) but only in your preferred ebook format you can set format in :guilabel:`Preferences->Behaviour->Preferred output format` + + 4. **Save only ** format to disk in a single directory**: The selected books are saved to disk in a single directory but only in ebook format you can set format in :guilabel:`Preferences->Behaviour->Preferred output format` + + 5. **Save single format to disk ..**: The selected books are saved to disk in the directory structure as shown in (1.) but only in the format you select from the pop-out list. There are currently 35 formats available and new ones are being added all the time. + +.. _connect_share: + +Connect/Share +~~~~~~~~~~~~~~~~~ +.. |csi| image:: images/connect_share.png + +|csi| The :guilabel:`Connect/Share` action allows you to manually connect to a device or folder on your computer, it also allows you to set up you |app| library for access via a web browser, or email. + + The :guilabel:`Connect/Share` action has four variations, accessed by clicking the down arrow on the right of the button. + + 1. **Connect to folder**: This action allows you to connect to any folder on your computer as though it were a device and use all the facilities |app| has for devices with that folder. Useful if your device cannot be supported by |app| but is available as a USB disk. + + 2. **Connect to iTunes**: Allows you to connect to your iTunes books database as though it were a device. Once the books are sent to iTunes, you can then use iTunes to make them available on your various iDevices. Useful if you would rather not have |app| send books to your iDevice directly. + + 3. **Start Content Server**: This action causes |app| to start up its built-in web server. When this is started, your |app| library will be accessible via a web browser from the internet (if you choose). You can configure how the web server is accessed by setting preferences at :guilabel:`Preferences->Sharing->Sharing over the net` + + 4. **Setup email based sharing of books**: This action allows you to setup |app| to share books (and news feeds) by email. After setting up email addresses for this option |app| will send news updates and book updates to the entered email addresses. You can configure how the |app| sends email by setting preferences at :guilabel:`Preferences->Sharing->Sharing books by email`. Once you have setup one or more email addresses, this menu entry get replaced by menu entries to send books to the setup email addresses. + +.. _remove_books: + +Remove books +~~~~~~~~~~~~~~~~~~~~~ +.. |rbi| image:: images/remove_books.png + +|rbi| The :guilabel:`Remove books` action **deletes books permanently**, so use it with care. It is *context sensitive*, i.e. it depends on which :ref:`catalog ` you have selected. If you have selected the :guilabel:`Library`, books will be removed from the library. If you have selected the ebook reader device, the books will be removed from the device. To remove only a particular format for a given book use the :ref:`edit_meta_information` action. Remove books also has five variations which can be accessed by clicking the down arrow on the right side of the button. + + 1. **Remove Selected Books**: Allows you to **permanently** remove all books that are selected in the book list. + + 2. **Remove files of a specified format from selected books..**: Allows you to **permanently** remove ebook files of a specified format, from books that are selected in the book list. + + 3. **Remove all files of a specified format, except..**: Allows you to **permanently** remove ebook files of a multiple formats except a given format, from books that are selected in the book list. + + 4. **Remove covers from selected books**: Allows you to **permanently** remove cover images files, from books that are selected in the book list. + + 5. **Remove matching books from device**: Allows you to remove ebook files from a connected device, that match the books that are selected in the book list. + +.. note:: + Note that when you use Remove books to delete books from your |app| library, the book record is permanently deleted, but, on (Windows and OS X) the files are placed into the recycle bin, so you can recover them if you change your mind. + +.. _configuration: + +Preferences +--------------- +.. |cbi| image:: images/preferences.png + +The Preferences Action allows you to change the way various aspects of |app| work. To access it, click the |cbi|. + .. _catalogs: Catalogs ---------- .. image:: images/catalogs.png -A *catalog* is a collection of books. |app| can manage three different catalogs: +A *catalog* is a collection of books. |app| can manage two types of different catalogs: - 1. **Library**: This is a collection of books stored in a database file on your computers harddisk. + 1. **Library**: This is a collection of books stored in your |app| library on your computer - 2. **Reader**: This is a collection of books stored in the main memory of your ebook reader. It will be available when you connect the reader to your computer. - - 3. **Card**: This is a collection of books stored on the storage card in your reader. + 2. **Device**: This is a collection of books stored in the main memory of your ebook reader. It will be available when you connect the reader to your computer. + - In addition, you can see the books on the storage card (if any) in your reader device. + +Many operations, like Adding books, deleting, viewing, etc. are context sensitive. So, for example, if you click the View button when you have the **Device** catalog selected, |app| will open the files on the device to view. If you have the **Library** catalog selected, files in your |app| library will be opened instead. .. _search_sort: @@ -274,14 +378,6 @@ Searching for ``no`` or ``unchecked`` will find all books with ``No`` in the col :guilabel:`Advanced Search Dialog` -You can test for the number of items in multiple-value columns, such as tags, formats, authors, and tags-like custom columns. This is done using a syntax very similar to numeric tests (discussed above), except that the relational operator begins with a ``#`` character. For example:: - - tags:#>3 will give you books with more than three tags - tags:#!=3 will give you books that do not have three tags - authors:#=1 will give you books with exactly one author - #cust:#<5 will give you books with less than five items in custom column #cust - formats:#>1 will give you books with more than one format - Saving searches ----------------- @@ -289,14 +385,6 @@ Saving searches Now, you can access your saved search in the Tag Browser under "Searches". A single click will allow you to re-use any arbitrarily complex search easily, without needing to re-create it. -.. _configuration: - -Preferences ---------------- -The Preferences dialog allows you to change the way various aspects of |app| work. To access it, click the |cbi|. - -.. |cbi| image:: images/configuration.png - .. _config_filename_metadata: Guessing metadata from file names diff --git a/src/calibre/manual/images/actions.png b/src/calibre/manual/images/actions.png index efee432da25a21b367a3cffb6f35f7e50e6e6436..90f1ec4567c4fb4567b4232fbcfa929d53586d8e 100644 GIT binary patch literal 37220 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 literal 21712 zcmXt=byQSsxWxw~1_T_sk!C=oyM&>;OS+YAX^9b}yGvSz5)hE??go((>1GH4fqTAt z*FAp#Yf-~_-}5~C`R)A@si7v1i%o$I0)cQ96=bwPpl5L4V`VTZ@V3lvEdd0g1u4o% z>G1xFaUau3UDc1iIO<{9G$x}$Xr!*?DH^zN@zCaQ3^}+#@_ge2obV2F?Ivt8 zki_4kmAAg0cl}nE2=4}l#gwAaQ@J@+u;|iye4L&Kg|Kg_rVI~(^pGLN zIHN)t6{#ZdVPp(&5FH2Y?0R?l@!lCHbch;Tg zplbm-?@)-Au5Pon;&`QC5u88?YN3{(WTTcZu|7Xf7%8`{5)KLFPCN4MoNTpLJU*Bo z_ip7AoYpsPW2Y%nS(m}(MPI8?9hEeG+*+pS-BFNA)kA8Z^yieY~hRp`9hQXnIz z3@!MPpj4uxo4xE1Rk-0PVt1Y85hFu?HBy1e+1NxGzIp8v@W^9Sf=d^tA+4KYz&Eqn z{_!b9dNl3zYEZ9jy2ApcDAM|SQIUr$m$9a1vt>VpViE*KHE0n-_bM3#is;?E^25SH z2`+>_d-g2iMgHZjact}ruW5eavl80Tfjse=JP|KMRaGnm6$CEW+1crNqf$1z@9F32 znvlxL$yrlf-Eq>Qn$(xN_YR8*j5>*ovE(@z&OA!qZ9Zzsf%2e^L|F{T=<4bc&2#Mq z2wGauCLMYw;N2Lv^tIJ@TyQ zAV_pS-b)E%ef`}lKbJPQddBg@oKkpyhz{G;jIw`tM1-9NRGJkRBTR7hdy&uWUhS5h zslQjgltN&y*6@CVusB|mS)HhGoFI;LqV~RwjAB2}uz|mk|6qUIvEbS_+p7!1su`7} z>64SSyu8P(td@lZ=D001so+YHnBm<@EfF|m5((-;2AG(vCNU}B-QSyieDLw|^3~Pd z##uo8kOWKkoSoftJ_VXA8e;NjD0!LKi3<>GC}Cn^wzjr@yqnGMxM@FK{r;YMpv3Dt z+yOj4eHVF zo@duTmb{QphC$c&%@hR$=?U#}$g*$ZbXOMEoevKWm$&n%J(66h5iX zztwR#45w!*;yhmS|F;x*@RKPd>g`8a6D}QwWuHWOu?QiYlu&04-7@ldGV(ny|Iu*F z7PEg_%A1L26S+oqHF~_f5Mo(juY*dc$YRwB6dVeTTCj7nDRi8%SkEGaY#GeY&l3|9 zlX4gfc^_FTkGf~8<|MWd<3qRe1FxH3KJ3YhO|}|WW388JvDPe#Rz0`n$+YIVE#VB@ z-;8+K@o;Sf;jyi*V@mn<<-Gevhs*u-VcGpF<^-$aWa^{U*3*q{X#`@Z&XTM|@Eui4 z>%EL-+hKL9PhQiqBiYvG=B5r?zeob4r_^_$-0>$1oJ&atyy+`Jg-03Q?M7vUw^W8e z;6?QAdlJB41scGLBjL7CAFBDremqq@cSg{!SM)Ni~Cedk5g4RviEup=0MqA_9_ z5PXXrO!^ECiIKBT{VY~Dzi<~y*E+a+ej7(4E*En0v)L()P2ia|A5~nAh*x7r(0f_g zPqbjF!CEAGB{54tKQnDiEiL%<>(|oK((-XR1|4nOkTbKut0+t%sDMB81}@;Q#)xyjgDXs+imbK_k7DelQ0^7zrX37gtYjDb-9070FAKi+qJ4CvqQ-q&zM^l`C!9CUOM&0|N5xf zr0DzD+yqPVFt6Q&DfAemqijQ7bs!IM{(uXjzD0CCa5su_MZ8OwN&2+bohvIjMl9>tCwgM zLetXK|C}&mjk3g==42>H4_<{ilQ~ZIows!%t*rTsK(ty(L23d)A4sHloci(1;;G zjHO^m&yJY`is~#-T!06@)Tg_p3xnd<13cRW6n5`7S>*Vb%|x%c-zUBGnX}Te0V5Urj~ng z{}5G}Bj$UtlkF08-cOpHl|{Dt#_f0C&Up6C(XzIo;quZ_hFTe?@sBTue$2^kBDv>2 zZOzTTlX>EY3suiC!WLT9rY_7xB|*y}kw6_ka&Hz95lM=aVI;tp)tvu+aB!d^GCe!{ z5{woQ)H!*0d~|@Qs90%xKg&BQR{wss6uCReY1Sb|5XmPfxHvyQ{voUyZQs*&ag<@`MfO{AgA#0( zZR=Gbi33}1O7CrKw$buLP~Zu`GAl3^La{-#a4{NnW#!RwZ5F+%tWx2~fi((&peTtB#~H_g^u)w?dwZv)rk;zvkwOvKOqNP22Ffd- zL1xR;7Z(?e#^siQUEWg7o5;pcv^*&bD^|g89Ua)mKmpNg-F*?KbI6jCp?Ma(c&J*U zB{nI@&rb)Zprov*sF=)ubL!sQX3AOOIgilYbY0qX<#KyA@T09Q;N3eYL1eL3c~%xh zV@gH_ZBEBRFl5A<=i%XDcQRL*d8>gq%t&93QAk_2K-7^Hj}Y#IEs*;oIf|tU&0Z|d zfH~mOm4^!N=K31D@T>h>o>T<*(@ra^{%7%;qp}pedCn%x?7h7-N^&?Vtt8=2~90xc~LK_sRr$&01>mv;w2w-Q{g*scl5BMSX11a5C|w zUYI5!ddgp_L1C&m-HHX8H$etOP7>>vj!e<`i3&m#u|dBH^L_rE4{n_c!4%SLb}(&A ziX&xUY1?&mbvbPQFa@4WDk>^KsOX zAGE495Th}xw~f_x7|TOP4%&qmr)VW7x&NZqJkn4y@OLpXNh<@HG}xzJjYSc^0)1&{ zAO;y&6Kkt%UHQFw^=f>pL^(anW{h93tcZ+`Fw$9)HfYpO?}9+XQML(PsbF64Jg(&DB}lp+P7HnoXlpuL69oGzRW2nd_*D&B zK;&U?@ky`xt^dKF^K9pqHMWmA_{N*9RnP-K-HwdFXyOO03uD~gvd{`#;@ac9dS;ba zjDiA^6N2iRr+laxaLZXdtg12d+k~yOcsae>`6QPXM)F zjJ#s6YcG92b~3`(Zh3bH)VPRVIz@u)IxiETMg!|N%g3znpV;?4{&{uQ`=SDImwOse z*5I`o&{PLVe^g*12=x(@AkNlA23ic_v^aCUhL^r)uTC!f3Qt+u69R`0fuSHDF&b_8 zd~G57rWK%=3dK)w^nbuxms<^JMK$k)vDY`ISpY7h_Safw89D*vBDS znY8Vkv@c2H0>T8!U8iQ&wngPSB8dt(-jA@fbz>88+ewmmmNlOTFV&Owpj+PU-<&9O zM}kC9^e@3+(D=>ncU;bzIL-=@MSh*-=|%_N(X`)1g&?4%2;%fof1T?G(WeOWuE^%3 z;KGBgbZ|72G@K?%}VDJ`TAVdwE@LY)Hz>%X=V?27Y9HI1?j{ zmFv82s96oVKaLl_USfzBySQI}dh7~$1}G`>6e8wfGRxWw;jplhLkLV&RduD&srBJ{ zB~W4=Ir*mZ!>Oqzk#7+Gai}ts?u8IuH2sTUF<>uvWa3yGcDiJxMiTVW%8_K1Qid0N z<0^`Ry&n#FPj%$o%8Cm#yJsh1 zt1s=}8Be(Vnl2h_X=xcP*4LjG@9y@&6tbVuFrSeekSM|`aOe^wJC{v9DLxt-5`Z}+ zt!{aWEL3_Em6uEJmZ;TCR#>qx1><0Y1ZYZ#duh8Y;N1Pp!lO!Z!%HO8AP^LN!)JK^ z+>g`C^EH@9gpY4-b#-y+2NiqI)3Bc}D9t)vOUX+b6BNURRF@9sHn-#^sGF(8;vAkS z8I7a%?>)UqPmizfH?=mWfJ#BGk5_I6C|!&{ta{!2@|bL0yQi1|(gZi)V^S8N`~hva(K2PC!Tb+2D|?X2+KLv-QL2oFNK-9c)kS4%Phd4flf$t?H(Z5OSXrM< zB7x=GMY>U?4_gBo!H||Ee==Qt;5}mT$on2`7)n>H5VrpZjrU7dqV+iXI~$Am68df3 zavl4d6MX|e(pO2t)*qiX0x9QqMo1l9kA`2a(Zu;{m0#u>dDm3=@GPdPoU@>ODf@Y} z+maoTR6!&@)K>e7jZLp_M+tG}6~! zoSOOu$cl2AwnaWCSJ$(@=Ud0e$C)anb#?B*+?=SuNQL(dG|5T8q>sh)2W?sGf>L{@Mp0)j@3;W0}?&@{gXUS$gM9m#;|)SxJF zR(VW)%x4ZG`^PJK#j~s?iyk|c-&Ux_CT)1!J4C+G2NHP1eyW`*w;INCYgkOpTh7f+CBG-)Y)B^lR6#_x(c)_h7#A%ja?o*ThiLSJ++>CHKcN}wfKdeH0FupeE)HcdZ% zrj5NMlHEUkN#-Rj1qR8<$@Oec2UZ`<{Q#QwV`TEYz5F zdL8PK%*>zO0LmzPoO!g)f=sQfzNN+QI-B2!3nz>e4HcTUfKEflqQ-^+tj_1&A&w-2 zEPA*Q4jGC(egv!BXH-;M3oH-_Ve3j3UC2c#wNM=#gGY(+&8MGh?LF)I5Od0&3{b;j z7>fEVxp^~_vLI;PhgX*DICyxRmON}x!Uo`EroRtCdAl}-X*R;ZW1>~=DUz#H0#p`4 zn2wGP&}?mO`hVrQ|9tVQFtc$s4m5Ag~ma z=x3wTO8dE`;9x8b-CSB3M*I>StAotpvbcQ{?nDK6FMiD;=GL{h6|d-@#+OVj1$O&aUjvAq zl`j9C5uU%)qlJfdU%2|vW~!)7BsU9j^+W5Z1|tiHWP}Q#N=b~0Geo&6EHWEx7O2pY z-rmHE3#C$5YrQr?45UwbbZu`%TRp;FY!Wk!_~D^FiI2O(5lb6wV9ch~(%QN>*m{nS zm_Km0{zOSGE%LzeP@RfNFjINa%P`HbxOsEaLW%V`qcg`JZPHFd zGY(Cn<Hgp!f*-G$#chA#0*%DCTgUEIRXILQ7JgupU>& z%;P00ee=e~qUs*s1QYM*)EFKSsn2dZW8~6{+yncbElp*Z-h1gz+B^&akHbbinSNiy zV^vit1)YssZO12ruIp=~Nek#ZxQ@L2nR7i;G>0^r`bvm+a=4D@uUmguhij=o%+XTb ze`7_Df-s?R!H96MThx4Ld}0`JhOLe3CjW)I`dRalM6)FCYYf??zWRe>Zo8ch*I1px zhk?m(sUNIs7c{EjSEZE6SP{M4TwmmiYWtPsc7s{dhTZ{;ci=a(JC#elVgif(hs}>Q zINqYFjK9MRR*t>XSkLXNy>Xu%FV%X@mNu+EUcW$A)!D`|kueqNEXG#mLT4uqRj!6d zxbp9W9bwawX~eRc9hW7Xibs5-Q|H(^9$B8K0lQP=Z2&-DoSP`E z0xtKa*Z=JZQVjwE%?dq+HX6JvoBXH#r?rS@?-#N7-{j+T?uEhH2xn5Cm@n;bn(4Tv zWWAE3U^ZMiPWwf->iNx zV@rM8?#EA8Twf3Tu%9C`n@S#EkYX=!Fj`w$0I0A~ZIZ24)^1wEsMyj$25Wy?%ylag zK@ax?We+W*sZHae(JuSMo9sOw4aI%d11`uh5jCyR`ihMHX`2$Vdu!y zf00J)%mWf@x1(fnGHn=Hn46pX`Ez6^06qmYx;$}zHa0c@_R}YRt*ne0+_GislcY7b zC4tJ#EiQIkjF@)HaG}QadWT$4T?li*y68w=5+Nv^KKz_oxo+F|_ z&%T_fzNjJ}&d!hnhyPU~)-KL_QFHQrz6^JleVs0k$*>;4z5q@o z*7;^^t&+TXj{iA4VU>fQpC2gxAc|PIs(r~SJz3jokJ6&WD^2E+oDM@pkU?E>wa-2dd-9j8`*3N<|iw=5YG9ZP^j$D#0fN+vRSIfkTKu2x-W>~cZnI|ytMa9g!y)YvKUuX0_} z`zh_Px<0Sd=lpkz*WpBtaDBk7yR2qQYpa93y`R5-I){mfm>59EfZlpx;<0IUb&$4b zy7H1{uM){A2!;nVK7Kv%aK$J{3iieGiOD$9-hd3yy3$^J9xS5L*}w;Z72Yfcg>3!M zt;n)#3!kMes$(Cm3q6O*!_R5T@tFc#|ITxtv-Et9)6^$oAO1 z&#bG>|0NKwj%`r$0wl&+JWFnvmaDcK^P#WJ%ANUc__GYXy2PzDb27f{`Gn|c!1c17 zmr4BKR>X^!co<<#>p`uh?{9ZV<9a<#Q?%h^>D?$GiL3ah=m-Dbediw^7bibH`M*Jn z4)6>*Fo4l~YfB+xAc15zw|%RrJfS!WhCHJi`;1aj6s73^qm?67QWt)y!Xe9Q^FGRi zLthQgUR*#iga160SZ_6Jbo=1&P??dSlwt1oXZ1n$B&>qlAN)pFBTU6Jo^oY#U%*{c z&F|RXZ=u02!?8K3$1OysCF4wzaX0$AS3Ru62yISTBRJPh%NRfYb?OwJo&4ZA$Ir)C zaKyC+G}nn-QNsgyvN!D?JUxjT42VE7ng%VE`%@u-F246Oy!h?qzeqfhYLT;imJoVZ zT33UO;K9$kk{iK-PyNB%qghx~nlGrA)@SMh@~AWTRPBrhzds1-9;9f&BGo+6*hS_I z6s9XN#UaWGnrOlA(t-=8!yIjO;2^`}7TVSXS~yPFS41OOGZYm3;4atA*>;BNk*rU| zL=*4w^ZWa!$A_Z|eN*30B^ax1zQ|OQHZ(#HbH=wljvyLzw~zS6Uvy1Ir^+V_$2+WhG>p3dfDnOc!?ad9mzA{AI$);uFItr_0WZMObsDCW6@cp?WTGDyl04fvF(GgbPBDSJ@XDsyZ-xh&X7_X%8pD#sjc zj=`JxwGiPLk{xAD1On|vjXbd`=ZObBzD%oG!b)2^^J`BYm!qVlta`&SQ{DQ05jR~# zWRga7>c@#(uB389piuRlNsbgWf*i#rNpr(Zk8?7%VU9H+-E`?SxMw1F#kRM*A-bNjf_(E+IMRZj3n=}(S-+?djnLsSj9E!-$WXE9f8gm2#5+ZYObGQuehm^=2C zrw0IYhNYdGk40831vW$SaE9~;n6-S_?6BJ}M(T%43 zs&cq4P1B3mK+*(TGI-`l%thFIy{=}A2mGy18LzwcSF09VJ%9vx0*2~vihg-c-x2;W zu67m5LcTIt{P=Xgp8Zs9P}{S0ZXP4({Obq)OHQ8u&jR@0ID@*#);~Tyv{diTUa2$f zd1B!RW9`9RlnsIcwWJod0F%Q3S>6{)ZLvtPRVKz|c&Dt*KN- zHsBm0J*xwn@`_dbR4;enGdGS3DG7$mTuojOcIq#?QPub2WlQX&~nCke5=Ssb9#0=&FMWv>BC=6%I&B=pnK3XF$lJnyf0Zs={HQ;EDgDQx*i*fa-Ku_Sf}B#G`;b%q@>1 zu+r*il=YYqMrp1jQ_py7p@W-ucXz&y6EKX?h&}~7`osjrNHtXJ^jib=G_^81{bD-! z6fpGz8fVqHDM|BChf`4tkRe~cn!mz({TTDb&;jz6mKq9rm*q^>@}9!Zsi8c9FOp~= z17f8W0_(;E(}83UabqAb1)}~cqb8ofz|kn;)NNlI-ShAFDmMdho0PnAyd^2L?i*bp z03=8(DUb)}ihelRFU!C7Yaa`fAj5H|B8`->x3>pgDd5B(9v%uhF3~CyxXR{?o~0Qz zYJcH;IR8Z4E-vcag6`(MHnHquBvwTyb9>G=_kK&J`04ROr@f1VhrgJrDsF*>!s6AN z$8&U5UcJh9Z|jO}OW6co^F;aPF`yZQzD!H?aeO(zeA%WlmlA`@l&l^{n2w4<_EKtG z%ob6fY5xxvwwTQz`2o1}_0xMd4QefA0|Or_YC7KP>h>qS{sb$yyYo{_!oa}D3%p+T z5mRFgJZavg2{`K>UUX|FDK9x@|5BXAspU%bw${?n!vncLYnM@+Jgp=`!JWbtUs8z^ z$#unDA_?x#V4|>i(`~EqiNKvcQ6Y<38L)%%@QbiiQf#Ya0S87nZkErf$BSz~h236+ z?u#N_f3iA9u)HR~9*em8M80dI^%Efm{ML;(TYDmFG&ugo-laCT-!OHa?1EWCFUh^x%< zHLV<9`2l-jLgxxM<+x^Y9gn|}T1x2W@3kvpXtp*7qf2^B@b2~d6j#&TM*(u@G zssQvUGnx(F6$0^gRR=}#_YvMv@#h&Vv=k7N+&}`0vK-Sy97tX7mlY^tgRjQX`Q>s- zlh7QWaAI-{AfKtkd|Xf0+ToD+K_p-jWN!yHrX?~)4kJ*$R8<`V)<-gvNWVnjB)J?z zEb-i2`ZtXbV~(cLZRjiHGY#O6^KKo3s*UMKHowYzpT?fOril?X_4UptFT3s=emslM z8XhP`3n=pLQ`vE4ga+lbU?4gG(Cz;~4j%7w&FpbKJv}+rdA`{4Q;#Igm|6=m)0%YK z*HFt^nc7L)vHj3b#H0Eky1sCSJX9h%Ug7PIPm{Y_LUCBdNL90z>Ssjfe)c1igLrk# zlDIu46vp$!tK`}rEZ3xb=zmYIRRil^Rh8@b*Faad!F^jP4KGEU;y+hBuKzc=VdDxl z!={1|0j|z`j_~(ZK#JDY5|Q!C%E zU43M&0fiMut{QOD1Qx$FcTCLx-KOm5ReDS64xj2bSSh;+2&nsU$=mdJNZ=CKp_^Yt zc=Wqm2OGqv>Lt`Cn`6GZJDNBTq621`!8ohhrL}hdCg)X=0u=z201D}_rgP%)q4(wE z*KaPO#wHDW^pOe$;`kc7_LI8x=ZbcrnNP*|QRA=R+fA#LgrE6hR z4ayXNt;XD9A`7#!4t$-adSvMnFYl=xu>k+Rx3_m0Qq`P#6;){5=2HvUdgbMjSVTIy zv4dMc*H73sEe#kgE&z31F8_cBd^m*jg+E?Pzq-4L~Z@Z%F03@*h|H;SdJ3aDIDEy+dUCvN-8gsSHHQu%o7d-o;Cp< zCxPshEoW!LM(1Pf!vRi`Xh1BS0Jd&pqkv%=Fo7I+iV(~C9yf#mR!hqW?mxbvuh6I@ zYfP}TKm&)r?O4@Xj*R=GHx=PHMI^}&QY0@|880)K562|wSG14;^K%yg6u`Rq;d5T7 z7>@zui!d?Azxp#fw_hy)t}*Wd4PFF`S(%Jn*{3A?4zg}Hg+>1K(Q+uyf0h^!vm%pO z^h&FzeMK_wWx|VI$d|46jBW^9UU~9?N1<$65>(67Wn15DT&=>az2wf9sbc!W6{W65 zxAAFkji2yHjKMlnW#HI*#ZjPf!90dkUQQ$J=2iYUln%ZnL=wnuhtl|yB3unwSzIX@ zvcdaxD6kg=M3vKME-ljc zSi+kgZaR~KmW4@7WoI zZf*#sE6+P+^c|V7ozINVpYN~8lSR7x?YOA^`}(Qf?_E^uxw~O5sfaW}_UmLtcCLYF zT86I{QXQzv-(L7${Z;v6793NDdV8R8X-!0j2KYE{jf?^%@(U5K^s6uLAI^PpN>Hr$ z<_@pw`posBl3bkM_?(#oH+1Eg8UDSYLHi3JNN(0V1nXIvmzKT$POUkukh~ylK&4|e zRht_`{xf^JlJB^icj1u$e6Hd{KULLOMn$}c!;6_63C*#anC01tR`9;puRwJ5!<>)Ccs`8q$Rp*2p*%{4In?oVIj5B67Z zNUI6J_$}$7swfM@I#IV_Xu3x$EL`shW*KQKf+OQEl51NQ5F3r7_F?4@DmS5}Q7 zMY-o(Kt+c}6+(Gl_$9}4gjT`~Yu}l6v+$~Az(U%RG{vI>yrBP%doU>l#Rez^ocoqh ztjNL{6;(ubJVnH5UKAB@v05+v0TN{7aa(v)LL28kfVN?KRRQq&%>s-3Np;ragMINI zr`uIVHAX2ao(CI3Cq*wGx|%w!tbtOT#qR**TSP=f!@9o!@dTeXAmy~)(lEa}y7}O4 zs1hFoBp%}jb5-yx+3Timj>^@gghVDvum&QeDfPKt+4H~2j5F1>>0B2#6mK8exbm~C zgs_GVc(rECoh}#BbGvFr1xl#fNOq1@V>@j;JCs8F&bz<2q>& zl{n+_qEVoo?=C^~a5SlJE640P3)cAiXgv0Ts~Q4G1XkYeLr`bw`=~;LOlY(hm&%vc- zmt)bdDYO0f+MxFXhgU=mPd{}a;J?fXnxG#yYyO>ARW5+^J$Yqzt0YDv$l}+zK1swq z^ji=DM$@Y_=qAw1gp$Xo;j5SntT#Y6u|v3>wX-2@ z(csM^<}8gUR;FZ~EMNK1!lL|_BzeLdIR}HR=&8cPURML6Mh&^6mk!npy?h0Pe*v6Y z3Ak8}jz>pF*2`fW%5vknVbg|kiqv@WPEJ)o3@lk<<$bRK{rGQ;dUM;E@f>tdlSRH* z^uBTZE*#9n8c7u1V8;-8mLe{ZU|MA{pFAK6n*XgfL{UXYlW5`1(Ze8_=xfD+{dZ@$ zCW0{wDMODy0JpE%_#_N7zRF~U zXBARB8@GCZy!{t+I;Am36jyf)E-Kz}w0yuq2f!$5b&RdXU`-2?f#JH$4GX4JhxngCrjj?hG5btlxPiGyZ7i5wouS{0vK04ud;oO zfIL@Z0C$vA?3~kN)dchfil{z(d7nMFberwcvfbgoF7l$m$lO4~CE0?E|7QWutxYL= zN~z`f5%Z?|WpsKEI2e@-#FrJ`NcVS`Zga=>-_?h5VvqaA z@ll4ZjQTsAZ|c2V01*VHmBlKfMc}cTpYNZ!QvDQD*ATY#14tE&jEpES&aAAAzJpq~ zgUOhP`wfTXgwj_PGV4EAZ^!eBWF^v>p~T`km`vJTm%pc&M4}%#EKio1-F!lO-pz-8 zkj!MMr#Di_Uyd00`*r_aK5xIx>;dkxhd`D%nqQ4hqoJ0C&n*^Y!K)vi0w*Qz@3#iy zPk%KdH@d?BaT5~{IF5uY6E-|b9v-uEoIdE*bATiD`@FbX`#t}H~p&f+@Be4-F#KQ`GZ+XC70p;>3Zda?EBvYZd$a_^w;_O zl=TL-vbHapzN|6Ba18Z`WD{*tBR^#r=*;rLaFkH!NR}l=rRz_S+MWH#vg!Pwm*rL! ze}C*={Wkn@y#9ARsPF6f_^L-vy1e;MH?;(yJNxa7WdbA?&_;mzTKnJ2fZf}W=itf@ z5YWJd+q<{72PAjQ;|CC5>^|^G8&9(D)KO+yr!X0e7zVqk_6`|IE|QavQ~p$(<%`?G z9+DuZYYiRYq%xSlZ0@Asd{8090#VWcGTS%X&vNDJLEd&ffrurj@`=m^^c`VQ0`45vLcE zilwVkuM4)vKfOFWK9JeJKX>xuX${hnVko}V^1SvH#oA#WnmVmD{=Hu^F{91~zN2yoS=6M?&V;S>&NFuX(1KYl1DtKTe zcn6T}2|z|-*cu28bBzn0M;~u#17OKp^e{I`Z;DJVolAR!Ym;s`TrQe8uuE zF3d%8;|6)jJX)#;ExAb;lE-;~Kqd1C^8>|XQrY95bfSUM7q-8G`> z^O1D13KFU^6BfQ3wVv^AWgv(QhY>HheB}KmQ4(Wl6)ko*j5*@`mX68hVfKkoaPs8| z{3Z3q%QbyNs=z6RzEAVh9zdUA6QBpR40 zAMAKCeZ+#!fA<#@6zH(oU{{T!LMc-&{|qOuuC5w2I=VF*4_l8MdymV_?vzqu(UmS+ zPN23_zlzf8+S6Xl+*UNr)|8Wbz7&H%hzN^1aMQhd8-e=Bwj3H&SUkHAj28fn$i(6P z+8$mcA*rW@z%hWo~2fF7g^xdgSbhaT1V&zphfJ}F%8+9WYs(cQj6s-QxoU{IS zKv3du_Y3S$SHKGeyy()pc$wdv?Uz3%au>5TrI4H0HeB1=KpdLCN7F z+P`g{c_ z`|L-H+vj5=mF<6nA=qfB|EnrS_B|(UU#nJ5NOimD;2eKa{g$ zwzJ+4E%@V)6^|DE+u=v<SN51XbQO5&}4KAm_rTCy?#6ee=B$TKy#hq%9o;~A^sIfY` zbPr0Y9%B1!I?)llUQj@%jV}F}06SG*FWh!m0lee?CXq0SQ7t;glq4B-Atiyd5UQiA z%bZ-U!YnbklU)eC3+T@AzU&Y6{g{mt28}`hi&D`t@$nI<&gDFURziqfZ)kHML1n*; zp)|m#__Aa9VK3H7Ddtq{?V3P>u#X#`@Km`e+2<8lUNatyPcR+`TL@F-9j`P2A?CHf zo7FM=zMKITq-KRzxh{oW6srow$iioC>bDD`By^tZfj3uISF5hQxGG)(6}UOa&WvzC z>y&<;G?bj>Gfb-qkEu&AKo1urq%)D)CdEtG_Bi^(h%SCu;VJTZREas);;o**8bBOP zeYZ;rlU!93X%=tT<4`(rJSJCIWRd4D$sK>AeQD5BbmK<9)=6^UAiT$i>6I z5yiY!=bB0!O{M$$2%Xe#m~VuH_OASx6fHflhcSBX@)rtRk~9gU3T5c=wOOBi(bYkF z^-9|N-uOA$4n90#VnQv#idpx+w5LIPiw(zifGlp_ZlDBbNnSwxKlXyl;A)x_0$EKU zu%IienG&GFN5CZOP?Hm z8K}K%mq&BgXEgHh)?j?$qy1rIOq%eUFA-wVydTaVA20=-TJS(rcoFxq2UmV$)a>Y0xh`nb{y&AH#-r~9;izo-`Lwlc60NBCr}*JXIcAS zIPqRqlW+dgktd6mTy}Xcqoq1NCMF}jB;`yjB^6z|Aj;wO+k4<(Od%9+a7=@+5rc&w z5;*p!T#6S>9Bp0NF(3)n1yX@?l>s`M^N}iZ+wKy7H}b!KXD3AK-v3@>++0^(eIotx z&fw#d`DU~>oSfW*h9EEC`@gCFv6ar5E7H~x(8i)X{bc@U3FM;k$6I}`R*4TBMFb#? zOZw+ATwdRsny7_bhbSC4$#8&Bd>f!_x@v%4ospi`yUF#!&(E*a|Hf6w*i<6#8Qu0=!!<44tA1$2VQUsQKzX`>sNc0+Cxk0`OEg(kZRjqkNr$+D!9H%Wpegix6d0 z8;apF+dA7jT3h~oeC$X!d))F`bYkP4&iu6M{Ir4jbQJOC-+2-fZiQZzNZ=jc^IIKl z?Ox=+`pL)h#uaZ}oj>5nj|~SdO)KNbHd=64nDlV5qw`Egj5Y)fNX|3=%BCeRNg3EW z$8ssMc!w83hLiRQMjS2C_h3y6NBLS>KK5=iY988BT{in3uE9f&`GpCyl%N`&i(i~D zgo{~3c;a`XlTq4h2Ou^AK!)DlIoo8mSFcXnZ(ajAnj360stTY{RkZh1kZOIrUd>B^ zfpCEQTc?cTCyjELH1#nHkSDh;K`F&ter%R)QDGUpVr=*w`iD18(`NJcTzk9oz4;&&A zOq`}Y7O!b<6im*{P_yLuyW}e;_aQ&>SR#2GM_zsys&VWY-+0I?zw};F@>NCD489ZF z+3i1Iq^xgY_+|w}ZY4_?6qBG)01t3(dLG(^C*b_cXL;oz_#cSyALI#guRqI|Uh%_l zZd`C(Xk8ZsI`fIjo>eD(rB^xSdAz-AiW3n*;y6~?j{={1_M+`-*)IQ$*MUx8V0-nU zxVSjkR_jSizwM|~8y_z`e)m=b`o~iQ2sQ8la)6*kt(1%;LQAQf4h)>|Ir9?-{?w>G z2TfGE?^c7clj1i4E-oyC1vaBuCLHP2hXC*!qs>LH9LBg@P)%1Xy+#FT5*e!P7RkTJ z7xT^8ZKf6_>Fd*nVb#Y1vGvy*6u(`CXng;O*BSt)?br>q4!!+>xU-qR(~}J+humb# zttTv7k{hcFN{$ZFw)4C3t5G%ho}{Uy$VbsIGM}Sn$4+v;dK%OeaC-r~>?=PLjzu&V zFbhxX41V&8!xi!s_qd?P2 zED)li<`jF%DJ)i2@x%*;_#v}hJ_ubOt=#xQiLf!kfJs|FB>0?{HPEx!7+8tJD@KB0 zYo1IsJ05b~MO*-#SS=J*a+RO~c5Kf0fG8D!i?`2z)bKx_&HyPS*#8t_W{dj$aI=mHdb%>}T&mw~_>cCarltyH!?}0QeR#-k`$=!iV~mUz z0n0<|{s`GDy$0FZi8`@saTv_~t{|t%JYsR#^nu-$@OWV04!OHhB`1SGIIef(qH9`Q z>jTruuCNp&g9UehiY|QdP`M-tI1Ts^5(kxoN2yXbFr) zhK3vcq)%KXyF0)n{+Zs)vd|+k+xaJ*;!H&ijn78N{lS6#^OPKJ9($2~z)MlAYhA7O z6iHSpA(qu6;vdZi$yMocO-BD`xhQg^hdrRtnJ*tJcQBaN?4Goq+B-PB@x7Sa?2U+{ z@@;QxD{K?{bM7NEJoeedCN3TkL*~2druCJdEsX^Qrb&+L_iOdqO8X!X z(Z~P(FM#&b-}rq0quLjqp2jUcwSj|ix$94l>T%Sf(?45+M$=SX{8z+vbyLlr?wUMI zpYAqXe>MLr;k9Z^;>;ma2{b#TPyZV!_O{8X1#wKay<`l1s6sL59vNF06XJUYKRzh!8w3j|e~6>> z@x2>A`sVfkWQe>D7i*f2CM6UR^07wZTB+ev~s{YCry;OIX9v$`$80Y{6PEA1p9Kbs{ zq!bFgld<>+90NxU>B{1-NM|p9eLG=BUTqHNeN$hnPXaPOBHk8?!~F{^!ZSz`12u;< zaBRcMN?I%r6ijOND{!N$dtu=UbT+5`G_D44TKSiOKY(M6#$TDAG5qbu%zC_}+*Qe* z7UYO)b93u^yR+p|{V=*h(#&cKCAym{lOT^B*b(|i4xBFh7qm|Q`9?p>zM3pWD}J!u zeH(khsHHl)-Hzg0rpaJSq8D_~?f95FrmhECM8R}2HvV(wz1W}y^W4jI|03!kH4;*F zo5W~?CzXozrP4jN`*E(Ao(BP3o-C(c1KuU6YgwMkU6$Yk?pz)^u$2^}{kLHkWhhf3rhl&x9pA#L(Z|FLPpX2R$OoK0X|-|4$KD9u9@~_0>12h`uOA zOd^C53fZQ}zDz}pHDoD->@>p^vPY8a23fKz`!X}x!yt{F8T-DBF=ob?8S_rR_xHT- z{o_3MJfHi=eV%ikbMLwLoX>Z~67x4hIfyX@R!rFdGBAr57g_!{dA#AZ!ORfTr>h~5 z2TBM;gcH1zyp=}OfQ+$2Tbat!Wf!A5zMq1AU*#+;S#kTBVQ)}!ube4pdDBawRQ|bh zZ#$bKLOJ7g+tm5Ucjcv47dXcK`XnRl(Ut?;amP7ZXN&IZPTp&nD#*O!R3{mcWuOT9V9hVo&a^Ub1Yt(e2VqoKm#G>2U?twi;je2shxodn$Z=<=%BD%Ti{lTWjyi zI-GpSaui;Pyexby|D_A2r~%knL#e#KL>PZXqsybKUs;?T{~_*R3AE7PZpiJQx}H}|b%A_EKtNTj-i0~|!C z?4NfV_bffW1z_tNLiS2()|*UY8`A8_#nf?&*K3eU*vhY=28avsT2q)zW?dhL^J`E! zy+SA)e10m>D(!b{|JZA!LuVp=4i9K@?kL@eZQdxH#_j(uM%K0HAi^&@;Z{ zM8%11&L5J;BurkiyVSUcfs#ii?T)H|2zOgYZJp7+vtDnQt2v(iXu=!ITzGNIp{%Zy zhaJM1=vdV$p?Ti%fJ#9vi=oWw(F1W`;^JKfVKk0(8ge&aISQ21kA8DDmKP@!Iyx*Q zvc928DjUM9GY{;bWhUu(>GO9iV39R20f8k!-;`V{Ej^{mHB1otLM;ve+&hw--x&fj ztRSo)egp{F5l$&ak`7{)px{@-Uq^_F+?x^gQZH(*YkM+r+C0!}(Ej2aO=x9l z0+Q$*4eaNC_W;Bgi~>G{Pbe3#eG5S`&>hp(U!IP6wo>JgB;7DJwoVGJWhbFZgV5kL zSzFrd6WpHwWG<8;B$>oyujwB}MLv_Unan-4V!dglrrz$kD!>GNPBGk3*p2IGLwKCA zt{ASn12MTrpak#ab=5a%K=8IOrc8Df7W2_vPHow9XgHbB3zk@q8v-89Rmgl9NdZ?* z?fqmj>2n9;7i2T>!`94!>`iNF?f$1&dXiU`{;3%03`nf|Nfp`4@_ex8y^U?3wK-IGHfr`XP}@dalVdtwj(=H99`mJO5set(_&?&gE3 zAX=qA6&zdg^rI1(mOlg8c8SF^o5UR6GM@#oKO9A(c(`qeupt0rRgjCWKDfjyn@-lVq9rsR?@aG zv$Wq<;FYCfAhm1?#q5e1z(n#At4m&DO{itCv~ zK%%WGiHPz6l8!(k@ip_Q>cqOmGUojHKdGwZqcx51RVd;PW#<{IdTnBS_&XlREMWEn z7~aJhExkU}%EZ~C&^2Cuwr{q3 zX&grkIe4?UNu$dV&NQ33QM<=ZpqwAJMs%EdGLy*;xuX7<#P984vE z@LL&|L)|X)Yx^=Na%LY|nRi~MR74my)*F;)>S7;?{ZY z`d&pG(6BvcD*4SG3|AGuxA&sf^k@x*gi`d$4CRw{2km7h07!M);aU+etH5={VPU!? zK!cG|c^2mD&dy;&9Z2-pIy{60y0WpYlkuo4N7NSpoQrZnSelmtO_MV%*gR>ZX((V)Sv6(U$LwZzF7snaL zZ2kTI{keSkMx~9MFNfW$A(tuD6Ie*t0e`pGRjjf=td3S*S&a&`%e!Z!HAwEscJJfQ z)pDBcDKFetYi>E$V1|n8I=lN-d|F|N0t45pj9a@8qnn z=O3lis8u*`mi;_?(RR$~^Mtf5`Mfgapa8}}*)Smbgq!d2Pl{hS66*_-0PLf?r``Y* z_U6Oa1kUnj(-c?uLP*yN-rk(?^nWcVB zVB>3!kFKsE+sXz}`e|)W23tpP8{9=*^Yv3&U;^EBets;t1a+x`8I6nZ%jXRnb}=X4 z!aJFG^s3=1weo)TLa0qs5LiD%T>BJ>GIo7SLQR2VWAcn7r^mlnrIg#p?t`P2RSa^! zCGU%k%vx8~a{4%}hk|pVQ$`OH&TY7>WCzBzNZ-}$G!;?}q*u;-NB~}r{=h{}ua{nY zzPZ_$@>N68%FZrWBAA{Go5eqofr!*%2Tl<#>#q&-DWw42zi`i(7x`j?r>+;ut8ht- zo8ZN4D;|o?h)%z$m|5~+{3Hpu6@-Q|c1@TbM%c9IT)B{PeP6Vhnz$J!kHU{+bKVkF zFNXhOSTvh*;v>_mlFUZy?Ft3-qSRF7-AWr6EUQs{2if*8F&;EMJl0%AH!% z-*P*;jq=>UGfvm@3iBD@`_1sQu_M1xVqiy z+&`n?e-Pgok?nlPT17EEXsrBpZ`&UUS4@-G4Psyfr^mVHXY@(V+ZoCFHw3i=eMO!x z$hiLgv5(WsEd2VegF&e(*SK)0Se=S)-(umHOGqdANshMf zVqA-YqWXtiE{0s%C?)RX)T!APzq0Chq~B=#ve6Se0ft{wcc^!D_=oq1?8Wb$Rf{7j zPnXMp`5RgzW~Q_H*Q@vg<_rBJ@rstTH>%>Y4a+5qN694H%+~E`P-%F8Zi~WMnY2%) z{J*Oz+)x1peU1!XO4~V$9h8v|6aQj->WNKNUCnavC7qO^!=)iR9rJ%=eS$5bW z$a`d$hQ&iCw=M#1YS|E)^(~)SIRr!Ct%$3@8+L+Jh*#L&vHLaxp;miI2gWw&dFdEI zQ3LI5(twN;Cm%SM()Y* zgnG_fqtu4a0xmlUkCo}%2sg8na_Z_KvePYvAI&{2S`=yRLy2&M6t}{Hro)*$?X!cv zwvz>X&p0lbDey+cO9TxpL`L}&Hs*p5LZeI_H{1soSG)1>PasVs#weuV0;@uD2CY1r zDl0{^r#A*Ty|NKwH-NVp$IP##&fnH3MZE-_hM0VgUgZ_;peqpLrKQm^4z6Ae-tiN{ zLr1cjg>%J+o`r_P7z@h)`^`b=nA10%x*xwhGJIDK(-0OEayS48_+M5Fpavy4dHbXx z2)6(7{fT)@31^z$J`eCXGb!Tw+VHKW3wbOza_f^WyWBws-?T6?<}{fYtB;%q2;^#v zvFvne7C21lE{gWfF#ZNniNDf2WYd&haurk38 zYx=lsm(_TPi501wg<#k@)6c&LhY><4#s>TPmOu_ z@6t>%8Y;f29TLOth{!%rn&%L8FzjCVIDDeYlD>QECa&$2L{ZMnHY{YbJZ9k|NubdS z;$w2LoIai1##A`-4%oAn)DWuE(~SJe2i*GQCLcz+N5?R-VC zL+(+* zR^J(GTs=w7t>$BoJUtQrmwuG()``Cw&wn*GHnEe?A*sIr3wllmq*>}^xhgSt|LO)h LrVlE$?8E*C)+eu@ diff --git a/src/calibre/manual/images/add_books.png b/src/calibre/manual/images/add_books.png index 1a0b341bbd2627ba3f66c61538b4b57dc7db6876..624a5bf8a5febba4f76446c37c4c318e06a1ace6 100644 GIT binary patch literal 2705 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 literal 4054 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 literal 0 HcmV?d00001 diff --git a/src/calibre/manual/images/catalogs.png b/src/calibre/manual/images/catalogs.png index 8e5ba480e30141723ec1be9dfdb856eb755e8576..49357d15b2f7bde2cbaa51512d97731a010217d3 100644 GIT binary patch literal 13227 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 Blz#vK literal 8581 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 diff --git a/src/calibre/manual/images/connect_share.png b/src/calibre/manual/images/connect_share.png new file mode 100644 index 0000000000000000000000000000000000000000..0275089d1cf512635fd0fd73cb18f65537cf791e GIT binary patch literal 4929 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 literal 0 HcmV?d00001 diff --git a/src/calibre/manual/images/convert_ebooks.png b/src/calibre/manual/images/convert_ebooks.png index e82725e17079684e79fc5ca4da2469af12ba9a65..2218a541b8d15504a1da075b8f7e84806e08d913 100644 GIT binary patch literal 3788 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 literal 2555 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 WFykG)QH)Cf0000kX3T{Wqu!w96# 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 literal 0 HcmV?d00001 diff --git a/src/calibre/manual/images/jobs.png b/src/calibre/manual/images/jobs.png index ab0716af481147c48494a19cfc2a0804d8f9fa20..2c70a947d447c386ff426b1c9b5a9fe38a93de86 100644 GIT binary patch literal 1753 zcmXw)dpy(oAIHBs+Zb|->)k@%rz58|!`Uu&kym004(E zXphU{d|n*7G7#~9x1W_MPExeX=iC8apZ21-0EHtjA_1W0p4=`TEUux^=s+3(D7=z{ zRL)5SEisg)V=j71PspnLWFjwpK#**grh5j^kuh`55`y~IlApwqjg_?(Lh|hOZEO*?_K4GV zRo8xF008(3#sld`Lajc;po4;rbsa3xj%rG4m;A>f0F30G^$@m?lC+Ru@H=SCh8gQR z7gVC99-*#MH1kX;Yqm7Ek#xMAOg1eeVJ{7`P+V2*)|Bg`SGL}*zk1dC&!$~-o}wi? zp)YoAkGW9LH$q@C_YKX=WTR?)ekBloDvEO3m1#h3%+V8^mp10Q;yw$NeauIPgNL|{ zeE#6@Fd=MpXUD4p1ZO&gv%gC4@ioS1Cw6(QoM50VZ*qD4% zcz==gTtR+*G=mX#1cWq%%E&bQ%<1dzPlw?A{S6QZO*uKaxV>+6YOJ|A0%V}4M~=y4 z)=T>(Cc08-w864OYP|JjHFN|K?^F5 zuO}x9q)I^{At4z)#V!V}u6i088oi==%6r2zXLJGs105V4+d4YH=&rFb^@N0kfWSaJ z$E#_Gor}Uwcw2)GNj)}$O;@sO<7d4sPT4b@F<{gBqt#u@<5Qt(YHC8E(9PZbke$8# z;M=#XrKJdgK)`wS?0&pfo3B}pXk!Dfdyd20-@RQ|2QMrts!gb=sgY4o*msRnMVg_C zpJ-$wbRZ{_n{BLjMC!7s9HmGSsr8XltQ8!ddg_;EPFWc^c6}PI=@V~y;)INolT+2~ zAO+F>jvuSIzrWAe7KNo2olkaI^Y=9V%39d}h;g`#C7`?eeY=Hhw#tk6Pms%%syR82 zDM9Wil(MpN+l$OrMD}uWqr5dLARu+3-Bn4e{p=L9DgI-L5y#>Akv}JhhlkP4K6yNk zCecftPF-Ey33Kz){1d7p5%AE^(3Pc2GCUq{_WSnw&X?7Kak#B5p{z?!RRh<#8auB~ z4-W9MyUWRizS(?mC7Z?Tv5rzoq*-&>)Dn<#J}kz|2i8w}9zUj8kDKo17v8RbC4M@f zKF`AkmvJ~V4w%n3I~N|f8ToR3N>YMLi-|HC!5LXFBcnSF%J8f1QaAHq8y_4OEaIsO z`GxCTgY#bhbE>ba8;OWaOw{|Og-N`9#>Qr-+|u7E!Y-T54oHbLan8ImGjrxq^}U@1 zJr1|ZtHD80^%!dC3Vfew!>&N7lkk(5C9?abx<*lu)szGgC-RIw#g0#LjZ)&~@ zbg?}%XzipScgM#c>DfqARB^!5v;nhQ4zB-fT0uh5-J9%@W1l!kA#UbXh*K5}Pm^C3 zHZ`a`@Lm~EN`_oodN!8UBT+38ff7H^{%l3A+@aDxu@*n%V z)4FP$U*`(Z^@uGLcwc0b4^skDQnKVNx4S;M_Mv&9Qn5!^X{JjXBTWKPc(Q~2r8 zrT2b5lh7J$r(N69R|d8z@u0{b!4`?4N9pC|<+amyR2bKg{0c4^RMj%@xFRF4dB3?EGC^W~m(E-`&|TpSPDxT&7>VvE=(K73ZizyD#@LCn;i;=pf8^zH%v l&Ak^DjmQm;c}T|*L5pjPx#t(2rsP%u7*B5xp8KyU{|E3<8;t+} literal 3726 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 diff --git a/src/calibre/manual/images/library.png b/src/calibre/manual/images/library.png new file mode 100644 index 0000000000000000000000000000000000000000..781c87430fa84e52d3ec05eec4186ec5d69955db GIT binary patch literal 5737 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 bUkmv^J=K?7D{|~f00000NkvXXu0mjfVi>>B literal 0 HcmV?d00001 diff --git a/src/calibre/manual/images/preferences.png b/src/calibre/manual/images/preferences.png new file mode 100644 index 0000000000000000000000000000000000000000..ad939d238872713ae0f7ea8df48ac7520a0639a2 GIT binary patch literal 4505 zcmV;K5oYd*P)fFDZ*Bk+2_Yi@000VfMObu0Z*X~XX=iA30IUzpIsgCw4s=CWbVG7w zVRUJ4ZXk4NZDjy8_YVmG000SeMObuGZ)S9NVRB^vU2y+80000BbVXQnL}_zlY+-3_ zWpV(wz_gD5000PdMObuKVRCM1Zf5|%8|H@q000McMObuGZ*_8GWdQa6gX;hQ00?wN zSad^gZEa<4bO83umcIZ100wkLSaeirbZlh+sP57y000nVNklTiF_XtUlR1z3N65%PhD^u_A@}z8`J7KO`>eh9+P_(Q zud~+KdxV;r8ijvC73ctpi;FRv&A42yj@IY4fzfEhY&N$jr`PK-8jZxq$D=cuOjK1> zF=^5yx^(Gs3)Ji!*uH%`4?p~Hi*gQ!gS@;v6h%R2Hk+9|c`|yvo`!~oTcGCckI>Li z-~TOf5*ZoE*s){TzkfeEx7&?gugBx@w6~6(28yEi{z{T`Ls?0Z(ChWM-R{OU6F`>b z_SLWzkQD`uAOLW@u$=7gO#nPHDG6h2x9eouRhL%q;v=)AZ{Sv--YatGTq)HK4?i9e zPvK=71($5dk_f<&f0R;H>mWX^JG%~_C#hcyDG71tw3>F)sWrUlpwXOf2g}@jxPS{~ zRsb$sszR&LVCWXfpx)8QibA#BP4+P>3JQt>7HcgIw}(l?`m3tP)zdr}UYg`@i)pSX z3W6Ze%g}}Vi{*6HhckK95JnE}M^t1uq9g+fI<1zfS_gUON;r7(0$x#~S9DioS@yM| zHd;N+6-Du}d#mAT@UrJ{KD}e2IC#34L}MI}OiRNniX1#qKz@mZT8A4!fas`5h7Ih? zq?AF78ERzH?r-_*;3@7(?oUOHgZtBlqS2^JXlr=UwJg%U`1W)$1?F-J%;h8}^kM$} z6UaSN$ma)7;;Hxg$=1|4DJrettGu(!nVQP8vnP|WJ%^m51qgyb-yn@dU9LMWzK$658UiA$PY}HYRHr4OcQhY;agh4@`k?F9*+p``JI=U~N#q

1#J$pnkV`2(At@cU{!8fI4(Ti7$le{Ac_)- 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 literal 0 HcmV?d00001 diff --git a/src/calibre/manual/images/remove_books.png b/src/calibre/manual/images/remove_books.png index 9d798394d90e1f93ab06db4b56b3aa688c6d4673..065de14be503302c401f5eafc4ed565d659189cf 100644 GIT binary patch literal 4993 zcmXw-cQhQ_)5lluC3^HOg6O?Px6u-1MJFs)+tmr82hpO2h!U&U2v%FYvj};xYKZ7{ z5jIM^@;m3f=g!QT&wTIPx&PjT=Y~2Iq|BrM0DuCht7&{6?e0y7nDE{^jOO9p2OM8x z9d$t6Bdg72bcpauXmq>|k@5Zvb^FkK5@0DyAfpW$Q)QL@}aB0r#k7SST<0|s(w z)zRI59f|z3Uizu|`?*4W0F`wp-Frm-4{3sZ9ep4$KM2$dKuf~KbI(ctaSbRe*aza` z>IbNyLMhx+%KuRxu){worys-<43NI0BDt@S{HvHio&5qGe82!3*xf%l+5ehDd>uU; z?xj9}mY$~6drbTfn>+Y;LA+c5JuF*s_w0Y8nLz!09KnF!chUR*FVlc}dV;x`4e_NJQTuwn;LP1gr)#Nb;0MOt9 zHPuXmY!7WntTTrf?nJ)`3+wzkA%0=X8)UX0$;ie2fR2aQmP?xll1@|8!0-{RZLrVC zvN$zR1cdX>mXsvFa3r4_(|P_%e}HySlOUS3plF2eazb|MpliQ_Z2Y?KsF z_4zKImbSLGuY&_uXjs_#&dwvVi(X$I;!w;WV~%nNf>(u}o?h3;D6XSJk**`)(5*ns z0oPS?Z-1YUOqJ6$A)>Zc1pj1zZ*MV1x6;&y!gs9)=cSpsx$m00o7*=u8p|07h~9FZ z_zJ8yW}=ylkzKDtxBI)F)mSthJq)|^e?tf=xFHTU(?V(l%ss2{JSakddLug(7OK`u zO#5@evRRVIe2!jp9p3bC15phfC=mRLCPy*wD8`zV;58d|b8|DWbp5S40}+`CeK8A z-X8q8{JlJ+&TP342?cE=n-s2fu$0RO+1XxErV*`1{XjfgZncT8cdi+`O zqwrmIj&P8#{dky}SuDw)h6(-1g&X~};4fE+v=#Ux#hjnD&%FO2>^$s~;Fy{(kBNxB z&!GHe0J|;vPWI+FE!?5=4vM)c+Wp$YNa#A%3`cwKTG@o3E?hO74(P-ywa#&e(M5|A zX(*p4nyAv$=j-=Lk~S{kHziPvy=}C6H8CCT_da%`M^~qvI!&yN8deYop2?WouZQzp>hgS+OZJJ0h6*9&@iHRzb%> zJd((pHj4%8l?Z>@4}I@E9+s6#EnwHCd+0$~r)p(}UDAKSMTmyRcELm{S?S>vHZs8} zeUK-O<^p*Bi`XF)6+;(UB<96XRpXf^amH3rEfs(ht7bxm-eTG>Na~(!RD(k=y$)d)`dWr zr}6%xj(6IJIMiEdX{!{HG1vBLo0GWpGZ8|h;F>=(Hss83jaO1&Gbc&Y(Ype(}IwvNXS*UJba z>n(<`p}(7F|5DwRrleg7Ul4rU%p+N3(lb^6l=%DJk6dvSLH+meQhsF=Uedpl%JsHp=-B|36EU1s{TU-uiOP!xX~?FUUgx)wmO1ye-Ql%is2X;UP<>sK2udXr>?Id{NWGu^x`S0kCIS}d9o^U{Y3!52 zeKb-omsL11_tHTBX5q8ZtA%gD6}7dqzy&J$wh{Z8eOLFXM!f36Zu1!z>1&Uv*^ic$ zQOabBOAR=>ih;OyzBi6e4BM+|Am_Qd(_8weYcc3TQi8sL1l#THEjaHZ5f!@>2UaNM z4ll$v)vXDK19ZDOtz#v`LP?23zqXsGnjHQhMVR$^Vv{yr@mz3{&RWwLt04E^!VY~| zWHD2#!@1dwMUYW%W(SiyPMY>tJ0Vj6OKv!uB`oiWXuHUqkVK@X z)0i@3^^Oh|ES(!OjKCt{$s%#G6 zISJNK0;_n}y&N7FM!VjQxR$X~r@Y*@wm;`y%T8}11d(yC&xetp)xHLiHhN#i9>W?A z+JT|5G8tytmC9k9uN#3~oHR>cFN*65i?@rAt z2j1w5cz{kugN-dEiGZx`vc=at!;`(;g(+G-zqFGutbL`w&ro3_!gRqUG@aEhh?|aK z1b6*ScFIgU;vrPuLfG*F=Pa%v`A!?2J-Qe7>OQ*Ag{n%gEcR%B-82!K_P80`<%xbqB?u~5S%=GVo zVcKI`e6dt5wmGvrS~^n%`y(~!P){(0>XaR#t)(3LOnSv!6g0}H1$Tw zGr(>Nmh*&F_!j{;JcbnFp_+;AexhNO5B+1Wq?`!~E#+%EsNO2ibekpiYda*5O#3Ej z{~dXi=6IZul@9ZfJu8ld$B1A)zch-U+Q9B7x!!~wk+P=zAuklh3Q5!#44-3vto>>h zt}xpot4pvF1CP-$jlWW8jJC5gPt{6|bq`{CsbGXnimaXi4j0PI3Vs8PPI_d6KAgeX z|9D_fB5f(CC|33oy^hd#gW>1!jL`*1t95#Lb>Ub>szc5rYw>)7{nv7>>l;m?YnK<2 z@j&b7{T687;OfKm{&EY=DidSNz*X|@ZA@r8tHWgCgU2C?C}6yr^Iw9_$=bYIopbM< zNLAi?9eTW^^8gz>Nuyj+H&-wG*yz!-614~AY-DrAg)B=rjtPW9q2m&SDkk!aB~FCV ziTRStZ0#pnc?`{a?Un&56?C!mr4=}Y zGSsM&9AEa;_KkDj@Sw?D-xGqG$|(^-72qB1?NCwpWta5~8yaClza$4K;aNY#uPrW1 z*Spn;1MX=xst@%FVxC_31T*Ogs0g_i&YIe9X0|Y42au5#D&tYMzZ7oxI}Yr}kIcQ_ zN<2}Bhm3sWI@xEosIaWBNwN}J?B&)G4se#rOP8o;9#xytWKN7SnmPUvBDa-Fwh4-z z(I%O>6)|FLVY?EkuZw`^Gbi$^z^#&&6eE1K4F_`yH1t=iWgb8~f3~A3YkRUsn#}cR zS`@D|&=M!NR}}7A+bv=7Rp}P$PA_6oKfOIN^s@e~n}5it8s3yA@R#*eLbhCFTBr9l zSE9Dzt)`2(yN(i)_m<8bQZ;+9r+TbP^q6HSpt3-M|4$|zD%DacSgnJ>W9IBG)SJTN zqp-rLq7;`xsaD^ny_*9xK;LQQChN-v9;cBDSsA~DUgKM$K6oPXuy2^1Ez)M1qo~^E zL&&ogVxC#SwZy@wvNzw>hA|UkQ`GXi5b`rt{9~`q_1(S5qsb%K3)KOmlIfo{C8&c_ zX2evrJ1hgYI~T=WSRDHy%6U%M%V~mDzPXl-pPVT=)y^{dQ134#D8r)jk}{z+O%`c!9xYFk$Bvt;eF}6KBmK48vaMyz_2XR4QEix0sw3@?` z{4EV`59=x8 z*i050&cpQCPFn{fzv4$<_Cs{NZalD&PS^PUiKt^Q(1G=f#}d^Qxq|I5>5RGK^& zKpe~ZPRV~~sPyHU znkUpN*(kBVWkXqnLsoX0+%x$@QI(%$JALFLWB+1(rGTu;&g6k?+-phK4yBVzJ}!q$ zDs(eAn@O%~AxKL}hyn8Z2&0enaKhwzKF}q$!zVueQMPUBML_8JeE>T11Em>6o~IWE zKY6B!n;rwvLUI>qKD7!R$fpiERfwcVif9KtytUN!;+dGpAckzltEG_S?ISmqUDoI9ayV zNk7kDCaGNT;F)K}xSW65mgBGFFNxrbpIGew<->8|6zlNr1LBGA8KgQPY5oE&tVA!O z-wPPPbQuh@o13?`Yv+YcWPlWHU+At>?%j`Q(9PdMTay#u!r=QG8e_yF~qB(Fp> zsA%!+JQYJ}``=IQOAS>Y%1~3{crS^=+C-y_SpgSSyKqsOewnB9Qox>H4^HxH*4FGZ z!m;Y?9fkb#hfaKad|bS|niqz1M=Kr2KZ5=mIWW~893K98BXC%W5Rkz{TueggNTQx* zC(%8Lk-UWwtxw+h4%Aw;V8c_2MA=JHxO)DQ;HztB@R8A;2pE3)cC$@Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO7` z0wV<9C>VhN000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000ilNklhtVu{DFrck78D=z$s8p1ZiAZZ1tBw}2YAae- z`dGJG?T9`o#gUGq9nnXItyUJpB7`jrViHKekoAVUujickBjko)Hqa^8a=y=#=gED~ zd*AnW-|zd|-sK1`SCfK@gn%xQg;Nv-Sq4c`ICaWHBoZMM3KNM$iN#__l7t`#Xfzsh zIvoas9#It0YBi_J1q1;Ep{qTuR*S=7Rmm7S0T7MK_LyblGw6k8;1@ZqOPtES(dwm z6a@0}^3MN93IfB24<{odgOZYBL{Up3@{tf^$g+lAyQ+EXt+$B9V(9hyuhq%P$w8<4 zW{Mn%L^yi%D3z6!6cng9WLZWK1Y}u``-!s=jYes1Za(k6T3cHQg+lSZBuS#BrG-!^qLKkn zTU$qdem-`)Js#nNLLnqc>a)Jb z20&-0i&Ljgv1G{-EEY>#GeV(IzodA*UXC3*hTH8P&}_-FjK|}lzP_Hewzjxd$g+&Z zV&Q=Y9>DAM;&QdC(Glqr?RGY7*g#cP6$XQWl9EYWam8dc1J`Q1y4UOVY~Q|}J$v?0Qc^-iMFn%` z&c*NdQ&UsJ;lqb%Y;2^Xql3=QPW*m9kw}C{B!Z$S=yWPf!YiqIDY+Q25 zC1hu3Q(Rnp&Iw;M8l|-M3P+wn9Fc>5~J)P3hQaU?3ak*Sw1EABZWOQr9*|1nF zI2;b_b~{?FmX3}N8XFslL?Q@+fYE3~uh*l|Xwd8R==FMJStc9~6Ny9!1Oh}NUE!+P zY$iQDo&5ZKPMtc1%jJrb(AR{xsL3!G361zu!+% zQW6G(f#l?5Qd3j0TCIqph$KnzmECYSJb(Ly1JT< zjt&Gtz-%^?o105TMFpZLey1ixLXcrJ8qX=t@9ga4%{Sj97z|=C7??S8CTrKOB^Ha} z@p!1Nt|lcVh4S)pqS5G}J9=8JX22lgqB2umGc#$(bvJI@7>|s?;V>SLhvMSmUUjx^ z-OA?8o7ug4_qW>jML~wyJTy~v+5@!+3j}5jT?vEZjYCR!(sOB-AhSH$)IhT zOez^?kzpRRPAnE<{rdI2$_fe!uv)EXG#UyE3wwT$M#Bv^+z?-E9GDD~N=EODdvG!& zNg^*V4~<3>_ccXDMF6z4w9wkx%A`q?m^yVTvuDrd$dMx~TefV_&8YJUApU9{IDpO8 z|2d`;Cr)tu_;E}o69okYWMyTsZQC|Rj2IEmveVMi$jZt>6h&HET3EYwEgp{tMNwF{ zZXNUH%^N@~lT|W?O2){MBiXfU7gbeN$g+&pYUSpeZ$^@&_^w^=oI%9xcE_Wry1F{P z{PIh(va-GtWL$7FWw+b{=8?vUQr7?MO@4bmln>O{^zSU|` z$>^;a{gY8!Tg%a-M|+Xe+S*EMYiqyXx%%p>dpYK_S7}u;2Gk5|+%cbxwzjrjp9>2M znKNfjp9_M1zaN*&MN(1{*I$2qeE*}YtgP=JuFg!psw%-|grmZ)bOiZ6X9RP>J z@wK`;ckYabvt!4OWyz8yELyaPl$4Zy^P5CFbDI!5D>j=Ix7+)*@{EiOa&mI0udnCI zE3YIPjk06M4tzcz(P$J&lCW4T6crV*Z{I%l?%f+dw9vgTK4;FHenRTRGEoUbhSO>9 zlMH}avu3e;`En*qn83>~zl_J@iJ$mT6a|OFfubn!>jB;6ilX3jIw>e9i0}L*vcE_O zGu1_gV*sCGXU?2C`2Bu-K3~64S6^k}1AW%_J!K6u(@OV7&6Ne^~36sgh z#EBCrE-sE|5&+Kv5ld ze;78*iOpsu5bzKVhtX=aL?RJ99uI*);Jk>DWf{NUPkVbiKA#U!6bXfbG&g^R!(qqa zuqPZD33CtJ|~ zO~7KY5DJCx`~CR+euBXu;cz&9*4Ah=Vl)~_N=m|PHe)uMkt7L^$3t!H7aTlz0I%1B z)9GZ!jA>Y{iTTP3A<tJR9ZV2s~Z1>v-2=;LL< zU;ww<%~xL?r@g%mMNzQZZHygzIip8kny{~`NJuiyL|a=sCr+H;2#8wp2nzAnWUr)7LFDj6zNGE_2DsALQRPZhH!-N-giVz;kqMnY@7$A$zxy4I1kZR!RX?%}^?46uynBAf+=->kd-VW5 zIZDg_Ji{%2Q^=_FEV2t{bMIR<_~apzp%C>nuzBV0XtYl!O$>4Pxk?^BG>u>VX+I5z z{)>AotN77FyYO_&<2%eN2gdU72RmsvR>gnZ;^x(xuBGzR%Xr}Z?HoI{owt9`%!@yH zhsFqipXy&OU|G{OyteZ&$9DdfYnz_spC8{(X!w=fKlL~-{^xOePRT}T_`|C-egCIi zof;inp0nXQ!tyW5cya3?j_qE~4eie{|A~VH7+4nnke+uBTa@OHmojVKdtCCw2dr2$ z9&@mUr4M~b=7aBZu(6hdYaV1`{U4|c3`U0gGb*w(a5_hlmR-gV{@uaPUSGhaQax|3 zf!m*2z_gLc7_B)}EV-LuJKyPPGMm*JX0|O1Aw5zq>=G7 zHE_H=Owy=QDj)kL6U{^R84Wb-Su zZAr8yMkV)b@(a2obb1q+XO(H?2r@v-M?=)gL`TngDWh`&mgq5jF)&_w6L*c+%(I(2 zkdbNM{34&_-OCM`dKij4XTxY`f}`h>jlnS1+Rr?+&KUOqSlmzRn)8!mj;z_1TzpfHsxCyMHou&#&P`-~{i#)WppD%W!G{ zz2)5HiJW48XSC;I=Rtgi(|rvl%V5s|k}l`5KQ5#AgN5AsoBe0_1TD6rTY38JkNEtH zgKT-afOSisrpAAcd4@jY8t%#6&kLKaR9+|Z@&n8HwBAEF7NoUi11~LpkZSLFl3~hb z{#8LCC~ryx4a|X&h2@pU%HZ%!@_fw zCs@lXkE~)(TbNK=H7g%kLGb(Y$T1B;mO*7bJzgU#`1J>mlfC*j=Dk>rR|dTMSbYDh zY&h&96q7*!1-Z|3Vc?`s=Wy@lNJ>)m)vm+_-1?JTdHPIl&a z{&wk6{^{voFusp--s(=Dx;CXkB|{}cg-V7>h69Q@;^ZK@3bd`Mv=IZ=~idT*oq7ytm&^VcY{Btbl6Nb6^8 zs!uz^z{;V*th3Y2{U6e|@zeJAb4U9E$|?tp$O!01MtZIoq_2m!p9k6tz(y}9MCJ^C zxh~o}*w@3&-49UCJfKRZp#P|^tJ7bpfS(7-6`**`Oi#|x|IJvSANU12`MLt&-j{#n zjQ@S^fkApYk)^(XhR)g)GN${BVNSkY9$s#MPM+0RGNb+f_x`>}SHR(A)YkuGx@Z*2 z)yofXH1NEG%xM0~EIs@@T>)>m@uFlR_?PJZuO!RACCNc+N*^{E+X@x9goBys48-qk~*jBK^^Dmd*RC|kT)dCnwf z9I;k4W5W+Dno%p5x2pZ}bBqF8bPp^kF)db35qSL}c-B*x@?j!cD>Jr6>i5f*bJ-Tn z%k2vSBGtVTLmPOB*@hmstmR|2n~oi--ovVnmS(S0Q^?XBjF(xcU{-;us;b2bA!-U> zE-rD1k5y!3WM}Q&yLWe00|+)dS(32S)YS0QR2Eok;J^WDw%+M<|Ch{{*~!V6nHk$e zekeDhC4jhTdg~UYkf#DSTyBB>A1oGor<1U`>8rZJDr69M1%CfN{m#&k8O2HxkFuj2 zuD#-^Ho9s$Y1aXk1My0{w!B{Fzco2;c>PoI0L7#3Kd`!IyAs@I?_5 z*B9@uQ|FWqL7~uln}^9}C+8tTkG-UHC=GxTIoNi@BzCI4pF4^u_kFBX2R&f|H3@My zS?S^I*%)1hNK6$d)Q0}dB3LueqOZ0JUW}U$Kqs-k``*NUww9;Wk@b9FU_c`_pXrRg zu(za_m6bgS3hf#nOK8m5%Ylfn3xz#CdzUhJiRyq|m=81Fes|}|QMy%WoX;ZXRi%4j z?W3+edl_!TGbf@=cGkbHz{0}9sSiln=hAjD&!2N-qa=P?5Bl{NW_0QW)Vv`4GPMmL z1+Hcq{X3kjkEgQObqoVOFiq#*0B(-jn&vabj}z{dh~s^ zk0#yPZnL|m0HQOKuk-+QYb7 zwcQ^+)WKjr=J;2(O4!=j`4DFm?K`l1u-sgq4;%05_-qe2xqeCpHOZwkU%LoUdjAjxS)8=1p?BG@<}7tVFED>Dt8lAg_Ip%b(3|3B2h6aGM$sF_Y=u^; zca@c&TZ0dJ9(=ZcxRli{JVZ3jSNY6PtfT3feX2!E zNSx1b#o}uBI$5LOojbZ?e2Umwc=mOf$tjjT-dHu1@pltD=7GyMV#Y9!68P9reE0e* zXeEkgFGFbb{n2=>zxA=u*o!T&O_Y&Fj#5N`>`jJsBdCK%Q_S&gP*GV)ox`hq6(ob# zd}|pv56r?%(bgi+x0C@Y{jvX=q6I&2shF?7*m1-tFmXHZ(-ef^#PE>kk?i0|HGFk` zem>O-#YZIzMeA6+N6q&V<{hG#kNNe~r1!9(=%A}2gW96M7$!)FU3{XvYf{AQqFn0H zKW$Q18ba=8A@2mxe#K;z(M}X_@6NQec(0t$`;8$Gx4#vMChN`>)3Mqe!3LemadH%O z{y<>nsQWz5JC~3#v)s2pq6o-_6=nsf+M4wcYD4x;YN%_49!{_)WuNjbhL77GEi}`x z@04|Zdr|-Mb-YAP61#45A4bM*7h;gooNzP`s*hV4kEs~Ue20^ewF}sVJk*qb)t1Nh zxpK@0vt1Aqy-={GkRYsZkbJPJDo?Sf<1%EbJrIDiS5CR%5KWnPaXr&F5NoXil&KA^cC=5D?s8tr5 zpL3B*$9UV{gxz$T1h$&}{I%+WG?-)e_8#_VOt>nueoHFHoay{naLm4GY*OHAL+QFJ1)ns65?JEMbv>HYP-XD6)Ep&HG1z^(jDb6_{y^BcM6O%wX=rBzi`?B+xB z!{dX7wU4t<)5F$MSKZWxifBI4mcSd5`>soQvPV)}`gnK|RWp!P zGWg_6GRQD&&N4RpQ_v24--l}wb;6c!Q^(OU^oMF*ChQu_uIi>`ZR$@)b@fZ__w;wq zcsO#!E$9yY(|ewt_m+rM;7zsKFD4(5FyCTVriWR7!rcp5%4&!ysv> z!qGJE>o{?~y&q8D;xQ9&!L{gQhKUt7oZ8GR@#K&^;ti%>ynp?2f8RF(dRd2x-S{Ut z#LYl9&vr}(PG|{pou!G@GG-nOe20_2mJ^XCw1X!!=Y@Ns>V}gxvqsresqa)M6-SjF zt@``>gIq5c(|hBR{v@voPrT~XD!+e_*==c$To(5$t4t21Oa~%19N)G14i<99w&Wvb zsyZ%a9MamoBN`*cg8CzR%@cY{P0<2!*FOp7%vCn#d0MyvmW+AuU6uud;|1#U-B)Q$ zxlW0odUM(KM%F7=O2i~)B2zSFxAKloK3yz z4_hJ(jEsB_MLUkVU`(eq<16PPLQ+yDLEe?gHN;SjGrBc#(BW@H1`vRnt==A-7V3X% zTR0@xENG3eUafx25vTp@9QX3OOUsrK$B-)O;(RuDuMBvarDP*=G!-&q`AKslw@h)i z-04a1hO6ziLr^ggl_?eM^@qk@bR-tZ1%_N13_Zfx^Qwi6OY@%8?|p0vR`FSSYDd!T zQgCtHcbo#PYP50ecwWRda+NoP`R)qjlX_)+NC(5Q1bykYn!}H{ZHVgf-tn>FBvO*a zq)g6#k#Dp#l9KfABkK5i&nrWQ-$tvMemLBXSSUv%EkIk$JfRcOdDfH26s8wf-Fp=Y znVIYj!^m-}m)R<`dt+~wqlmMqANOHz)xA46?Dx#XA`v(8ReY{T>PGe+9V|sBxVyhK z{BF87^X*SqBT~(}!v5LUKeTtOFh=o+>M`+>5lLxj(`8lUrHoDR(e{r=*uZq0OWWu- z$Nf>gmA2z00?eWRW~nzIO^)@J=0sg=Nq9ecQ%+@LW23oCN?bgxL-}%>bn2|-W>&y& zDbU2M#C%KBXROqi0-s?}{7B@By}n&P2YwNkZ`YkqSG5}x6MbD?l5rk{e@sQ}h7V?f zL}r;U^r;b%x>h#2!CPf(ifm9hCLYKko!Xqo95u#hd0-J#^k$zPlJ#*RVs5ehhX+@7 zMB?3%P*tAp$c_);&Yvh1RM`xelVYQMfFgnX{K?+8O(nf0-nlvValb7OnBz^Nf_zKO zu4dz^GhOmuEiJv?GcnOJ-OEy=zjmiOFKS(ofUlPn{iY7esJJJ*oCQm#c0g+9TG@4X zj|s3_yZi8eEtej15i1}n%;}(&rwrK3=fk^Wl?5WKBWx%F)a!{ekQw~HEFJe%wtO2h zEKrnR_uYZEH9<;@piUEmkO0A&pl54`+C6anHA0=cq=)BSUL{geeuhE0&>1+ow)~&y z=?x>1pabw`wVAu}#0-#NUr~=5?F&Aj9?1Vg`S95Tv>9~IQ_DUL_vR>CHnk+3qUeW4 zZmI23LvMr@yiE|K{~VjJwCMhW)ksQ8yGc4FK4!s29u1ayg51`9xvp%!Te7kiRUC2kk*4W3`o+e_&pB6s znZcuibDcW#=b#Xm;#?1;h*13l=oGk7N>Oy=RhQ6NAHqeG+^@VTQBFYU&65Pm z6^>n9nmP_1HYSzRESyrzfaMLjekHpcI74ZH7SBMAr3aff4XHy!3F4`9Ij<2#hWDM`#<_3CH369}G2Wj%_%0RDdPcIRuxn$gjWn-Ib2}@yh zG8QepA8ZO7y4Iq5FFo*R`XbQnWTm}S0CbcK&jPg47B0BkDOPSe6A0B2jOe1 zE$Le&skfmw5%9-I^0^Fr6AYr+?@JR}bqM&i!0YAi&eBmODcQ7nFA@!im|x&sT~Khg mZRZj0B+(=ic?6d(DQsWgL}JP^#K?Ogz*yf*uTsY`^8WyPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO7` z0xC1MR|dxb000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000opNklZy z1uS||@O4niQ7rWWS3z6Q%RO8@idP)@GPbX-gT*qo1|6^*U5|^VX{1tVbbWlguItBK0K(xg+qZA0 zsi_H%$HRH&Ek#k3sSPF^4r8;~c;}sWSg~RS;cyt2%SCf@Gqts~q|<5A=`@01A(KfT zg)s)mVzH3TX3Y*(6opJC!`{7J2!dcjIi6^mMmn8FQ55#=+edqQJK=Ej?*fcvGM)dn zZQB6}S(cF`2~|}Q1cB=6YV3A9nx>f@2s*lMXn=<0s48jNSleQ;plKT6aD-qmh^nfH zqG-Y~)|pHOhr@x>=|s~sbX`XjMRK_unM?**h9yfDPIXh3pt7>Y?Bs!g0VGKx91bIj zV!Z1pkuXHq2Z;oUzc{f-K8rFm}7WKtntpPr>U_n&NOcsI9HVYPAxN#~B(LVrXcH zTrNjzYwH9vm;c%TpePEesv^ts1TczXFN3k$?WTsvvW&ywD9|ADA|#25iV7+#D-lJJ zWHL#2cefc9S5{V@@J=^6-eR#}x7$l^Jh5Gt>ve_(t zzuz=*s;ZJor5G3(V03g8UDt6soj4qhQ~Ippj&?eo1>5omtFkPUOr~%+>{Am=BoaZA zY^Hhf`~BuPA`}V{jYdf(lO&T#WLd`TcK;v3^1{2{<#J6J8yV5r*Z?~b_3 zLzZQ7xg61G6pO`zAP9_%j4(Pn%E-tF*=&}|%1WG0=Lr*%CrVc4i`8mHlB9xgJQ|In zsw$Es5sk*Cu8&Ej#uAi|Jn{&NqHyuW7c+0(JTy&XaBz^?+S-EA`^h9FkEJd7$5|{E zDl01)9v;T+b|VM^J9g~gx4-=@qA0RW} zd-3^v6QKO9U`l=|Nus8vhQ7W&nwpxJKYu=nL;{b;gQ6(pa_ZCtW8A%S=gu`>_xAQu zRaI3o&-HGC85`Wnc)eZ|&hq8U3nIqTT_(-PmS66q^4qcKYL{TK2P7{m8h{xmPaye`^n>iLa znWe6-j-H;LqCmkibxoPgrkHndI-NFWFH5EBi`Rl6FgQ4f!{NYcwH9d0=;$b_s^ax} zNu^Q~!s6n9!0mPu3WZ3g(^#$6qt|Aex*C(8rwWBaW@i+qNJ=fcckjmKav@35g!e>I zM3!at@84hY9HmT~&1NGM3Yo9}9uk?80>&6&8yyslj?J^52#BU>jE;_yNF>bjlv)6~ zy1IzRy0VX_|TWAJ1VMo#ylT5Jiz}Hhav#!sqju zkc;PbikJLkrg3~cp1|dDPAxEzNEAu3o1N}-I?Y^|amODks*+`yY15|B($YdAksufh zn!dzlvr%1LjjrotvsnZ|I3XB85KvVWkH=$vhA4`J!_lb+CK`?5^*YQBuc)YCWMst5 z8lNcKO{dcwIBi-lw|iQDZq zrxuJc(dnL+nG`TaB}#q~gxBjuRn?MyrWBY`nSo*;$MY-3VuaQP6k~n5r)4GujILXX zDpSTn)?6-!)oLZ3PL~XAjcq3ab23l_LBMLYVzpY$C@de&>7JIE6flOpFNR}GG288S zjvP61TyLg&;%4v)shy|UI4@Xs10)YU{&CM)W zuz)}yKwn=UnM~%SHKvr=5=D`wrY7p^>j{NI1Ofq5JB;(>*8y0q?|oXPs>*l5eS*Qj z7`6mCX=DFvy+B~2K;_Mjg5^20s#Vn0O4@>l)!jA9(+C@KA#U&Rq5&JVQ6T` zjJ}FZm~mak4Ci|(!C>IHa11Du0w%u-zc??JuQi&c(bv~Ue}6xXjg2%mHqzA8L^_@3 z$dMyNA`#;8IH^?1jPfK&LQxbP4hJ5OhpMV7(`4=6zn_7D0W%4jpCu@+m@&4$A13Ws zaPpzRBs_)@43089JXXrOZQC}Qnwn^BZJpp3O69g(E*G`6wRpW=bGEURB$G)ZkqDts zh~eR3;_TZ_xID*)`rXF!sn~T?RLE{J|rJbF_cNsm~c3PD2jA; zcCvEiO15m-!pxa7Pnf(k5}3hYu)smvY&NqbR#jEg7v=kxVr?jn5Dl&A>gwXc3om5P zo;|d+wJ|yxe&4_tno|nOq-e~pU3+jiDzI2A1Ofr->+8+5NWP|&(wgE3?pPgN94Z%U zNO9X(OOnLEzyQ;yPe1zDV3av?W>1Z%?Df~TarW8EfU%0mNF*{LLdzda7K1R}KVBN9 zILazM{#ft;GocF5(Xn;vfa&hu&(^ISc)i|&?KL$u?Ao=9hK7cdI!|L`qd70*a5xIu zhYlTj7feZz+S;nAGmf!Zt%O1$B9TbJ_Dm*2M@I(>7A!bP=U9a-%M1(*P+MDD&^~zZ z;3=kv^a&cLsw$0*Qz*M!S?OiLf(7RMdOk4VqzlCrMZs#d;&QpL+wI7*Y_=CKUVKW| zv{BoLpb1}PY2k2}A( zie=4}D3XM|riBlF@@5|1^aGZ<0W=Z^UgE*kEBL?}P1M%Uq3tv4dFgNt_3#UPX6b6S z94^e}s)wIv)v_zcwr2+T-F;WlKKo4Sr!VHh&u`$(s8(8A7Ji!l>3xMu{XVK@jBAdb z=wj1tm$TUKr`~@KAHVHs-box=o%LiFPp-X$xo0%vo4taozxz6)YALPEGW6nueD1u( zoKfG5fAQtq`t#kyCS0CI^vxgh*@bPaesouf_up+W_C_u}qmTR6{e%}f4lt4`)nOfc z{+7*D-S{}Kb{$|~-+yxdyg%{f+g~PJeF1lz+sF6*qmS{Vf0l#KJWAlhUu4C!ES=xI zhP&Tx=i7hS$-%dO#lN~Yal==(5z$MSm>th@Uemce-xDBsz%Vy)wtwR~z7_a5k8SOw zXX}r+B=8Vd+_#g`69Nf#-oJ)_8@ZgHzpa>MyE@G2sbtC@>#xs`@@eoarx&BC>-P&YlsTk-KP`{>gW z*WNN0XR@0ow!rn@ypHxpC$@?+x%AGpRBwH%@XH@h5(n7$2Zc4?yozPh6qIRabKL{i zVE_FuN}nUq&Cmba%9{JHVyUtJH*a8OsmV)=ghSAX1P;|omo{L1ubjW=S;*(^d6eg0d4mIo-l5~!uksJ6C%ERSXXwuYsDxhq zF*kp#o!QfysHyf*-Fhvr9v&pAf^Eh>@r8z$dFbUMXlRVQ{5@W2y_HW-mmwQr@6cP^ zb9OUTRX(b!eALeQ0v*GLNSy3*M7bCTvlT4#j(3TzY60$S53yY7{SRa+Sm2cl_OB{c zQ|>s6b&uVQ_m2;8&4(6o=F-n{&kKX&+Mn*_smEW%@!8wC?(B+54QY>mZi|(gneAM8 z*PWcv`vQGQAhC!0);@{t`p5X=+g%Ke1Q_XjjHRxlwn&`DMRzP^|HE78PxSNL_XDiF zV>wj$$%5sNJxi$(m1U{P0T~_)~X;bS}x^-7oR|+wWp~ zv{XMS)JYL`4W-8ae!=1Ast+Z3{O%{|IGiSR_ziw`_s>Xt=$~mRH8{U&uVwZ3wiDIf z3ox#^+`Z;32A}%||9H+^e08&!fAOts3SYvHHeNxK6>!dF-Mt@S&)qAT+0eqAmFsw= zX*I3+Pi8BAuDYd)EqDH&vuZH*O-h{CZ}WDj{~v z;^tMAJi4Nl8Z#<$vH0G{xntTEu3t7A|FWCdTz4BA?_EUcDr6^%zP5qeDu2o9MYEXE zemj3@y|(n{xn^<0IU{Vi=6w9q=kt+u2e@qg*O*`Q)VW;$F~0qq^|U^_hR=QH4I+~O z$5Q^srE;#UEM+idFl8x&DT66X8BAHqV9H?1@@~lg0=G*kXO^-^DF6Tf07*qoM6N<$ Eg49X2{{R30 diff --git a/src/calibre/manual/images/send_to_device.png b/src/calibre/manual/images/send_to_device.png index 1cc45f020f60b23056a37aee080d083036550c30..ed325ed753ecdb5d20601a0afa25f64fa0d9d8cf 100644 GIT binary patch literal 2896 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 jf4E>7T*V)z4*}Q$iB}7Sha5 literal 0 HcmV?d00001 diff --git a/src/calibre/manual/images/swap_title_author.png b/src/calibre/manual/images/swap_title_author.png new file mode 100644 index 0000000000000000000000000000000000000000..e4d7470a44dc63622783cab5871240e7dd8183b9 GIT binary patch literal 1327 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 a9sd=h6Yp^g#8a!qQ5}^ literal 3575 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO7` z0xUP@U}abU000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000eANklRS$^oXD`{W%oYOz< z?%EhTQ$mBJ#J`y{_wKo8ckkzZf9H43`JF3sE$=JXHGq>tqTc-f=m??9|Sg?9_N+qdw9FM8>JMHXq0GGHGx0?AuO~}!;br)}R9AM#+>b&jur%5hnWqFv7I1`g`i`9 z2X!-QS-g1u)PbFt$gu6dcaW@aAX=NGD$(SV00z(oG``y^4N~}BUmH-`ptavl2!jxU zXrd9LJm$1Hsxxk`43mJdbVLUj4|GJuhr7m*?nP-83&;j8$2O#zJX>rwj$H zkpd=istlJc_S07tLQ)!}09g!F<^Eh$vSeBpPmBR9>|mH^RTanH>7{M?lF5Y~ z8X94CvYs&&#PtkX8w3(#H0c~z(g&0hqyWc~Xk#dLO{4&X!Dzo7m?Eej$UHm5?Ab}) z?d_d>WwY4~;YbxHmCeL>fk=f#We`Rt1jc}rU=S|F_A zkRvF2L*CN}p$WQzaiy?rd-9`kC=?j)pzkp!fsx2K2d>Z-|yZD^=xXlRJ)pg)1I zEJ?_b*p?t(X(0qy!dG1xji)sQrBJFkrW!vOIkv$qE*64CSl0sWPdG|g+6eAw33 z7NnF6o#%-EU!8 z7E6{aoP1ca?_K7(wjfjl4-~HlY=L9T z;us5-&a-#-t1MX1JT(Fo!1{Hoky3KFV>k1v4W5RU*&!rQU1>N-T`^xGIOPb_RxSLIL}aj6It-PjR? z-1jOObo}+~*%l254tI9Yee^BbR*3B<5+J6|lJT(;-Ay+cD zHb{kQ`R;3-QMKf<vIEL`F7(-)tk`{+?3(I`z#jU*BYJkMkE z=9efG6pI!$F=tM4>SPyR-`B~jyLO|sroDX)i(6Z910jrnT)|LK3Zwl+LBJ6dav2VE z>}TiB9axr4`^T;%ToK~bsS#qa80mBh*9{=0WN>hh*|TS`aAEV*$s3Q2jq~!Bo%9?# zhSr)`teU3gX5ux~%$zlg)2B~!y#F{yj~*@OjT;)~vToffBE`J%v19MDZ{GoWdwW^1 zU?KD7%_Eb^kWQxwhXY)4$+D>dTTYgbjkACMA^Q6I8B3?h<#Od6fj}TYBpRW)eY6Q^ixZ6%w{5|77eY-~hIiRXD_GUK$jUykEAQw#PNF{Kpu-~TYF z)HtoJt(-b_iby0vGMOY8^!J8FM@MLHznqGS(Da7&Q#G1L9(jyh&SUA)rM&abJGib( zZEY>lXcWt`7#SJn$}3kAi$$k5Y^e)u+Vo>Q&#-*?a=N;@@H~%bG)g=k$F^-oM@P8q zvgOQ}Q9He1OTbS*{VYleR<2yhzJ2>hrBZ~$VdC*Pfk1$CI?b|WEgyO;o^;rfz3{?M z$z~Pp?d|N@vxk9!0bJK59*E=TWHLcpTkHS--1wumHEUMW)Kt$i&pgf5S6|JNB}*{IaPs6y1_uYR zEQ`Lr6YSi%*UxWFXIOwsE@|WP%iDP9p@&$tY87p5Z8(m@>C>kU2|tgNKAwie5>uq?r~*RH{J-RTYMD>%Z# z4?o83xBm_U0|V^Yv!@)X6Nv=2ZKJi~y6e^v4p&TXSb$6>!w-J&L)NZcPd1xn-@bhe z4-c1t9mkG?+V|2OhJsVx-O#5?{ z@{j(x5CSPBQp)0IS={dx<+^htb?5_Zj@dsC#Pd9qQh1(+=c(dn52bYZTIqVJPHR=H z_kopCMQ{L92KH~MS=t*>5%wbNMc9k5zs9hso&3g%-(q`e8pGy}-p@6c-NP%R=bu`u(?8?$pZG&w z%w55=`<|jbI*nli^KRi!7VYI*&mG5me{O-EC%?<<4Y#qX*7_B2V;N`t*FVAV1OH4{ z=A7wdx`XdOuDSKgmr|8J$BpyHdH%0&r@f__ne~@&_3u5x|D-i!5Azr8*Yd3+IlrBE zg8zE3gOcN9kKD`J_P?PkJ4t;u)N&X1B>t0cZyn@J23K+NrGH?1(;stdT0S$63MLB{L8R@E_?-0w_w7$( zFpR!-A3v$Qi$7R$p4%#L*E_?+pPb z!u-Sv?%jWkp`reA8SMTy+M^(2%elGg5YO*?oad~Yxn=c6ZdU)wrdMC&VAZEt5tEY? zpw9Y8p>hwL3-5%W(4G&$#a^U+48S zV8^-Y29HgD^&bRpyMfu^S$y(Vhadgrlc*c6AZ|0+ut2bhJHIr8AAjK|B)<4r=3Vej zy&x@L`XT>##XExs)}(zlot$chOP_;4tgjwN#AMbI0`w92{m|e;f6KA=Y0z x6Zb>j=Cs%mxHvby2zwFsBJ4%ji?Gww{uft4e(;9XW32!H002ovPDHLkV1lP($4CGG From f826dcd050ae262aaef1aa7d6a75188515f54b67 Mon Sep 17 00:00:00 2001 From: Timothy Legge Date: Mon, 29 Nov 2010 22:14:23 -0400 Subject: [PATCH 07/24] Fix deleting txt documents --- src/calibre/devices/kobo/driver.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/calibre/devices/kobo/driver.py b/src/calibre/devices/kobo/driver.py index 0eddf26549..ebb3f60101 100644 --- a/src/calibre/devices/kobo/driver.py +++ b/src/calibre/devices/kobo/driver.py @@ -220,6 +220,7 @@ class KOBO(USBMS): # 2) volume_shorcover # 2) content +# debug_print('delete_via_sql: ContentID: ', ContentID, 'ContentType: ', ContentType) connection = sqlite.connect(self.normalize_path(self._main_prefix + '.kobo/KoboReader.sqlite')) cursor = connection.cursor() t = (ContentID,) @@ -400,6 +401,9 @@ class KOBO(USBMS): elif extension == '.pdf' or extension == '.epub': # print "ePub or pdf" ContentType = 16 + elif extension == '.txt': + # print "txt" + ContentType = 901 else: # if extension == '.html' or extension == '.txt': ContentType = 999 # Yet another hack: to get around Kobo changing how ContentID is stored return ContentType From 26aef9cc53b91b2c94d096597adc435e2bf5f823 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 29 Nov 2010 20:17:33 -0700 Subject: [PATCH 08/24] Conversion pipeline: Do not override CSS for images with the value of the img width/height attributes, unless no CSS is specified for the image --- src/calibre/ebooks/oeb/stylizer.py | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/calibre/ebooks/oeb/stylizer.py b/src/calibre/ebooks/oeb/stylizer.py index d10ea12394..4f8ae68943 100644 --- a/src/calibre/ebooks/oeb/stylizer.py +++ b/src/calibre/ebooks/oeb/stylizer.py @@ -240,18 +240,26 @@ class Stylizer(object): else: for elem in matches: self.style(elem)._update_cssdict(cssdict) - for elem in xpath(tree, '//h:img[@width or @height]'): - base = elem.get('style', '').strip() - if base: - base += ';' - for prop in ('width', 'height'): - val = elem.get(prop, False) - if val: - base += '%s: %s;'%(prop, val) - del elem.attrib[prop] - elem.set('style', base) for elem in xpath(tree, '//h:*[@style]'): self.style(elem)._apply_style_attr() + num_pat = re.compile(r'\d+$') + for elem in xpath(tree, '//h:img[@width or @height]'): + style = self.style(elem) + # Check if either height or width is not default + is_styled = style._style.get('width', 'auto') != 'auto' or \ + style._style.get('height', 'auto') != 'auto' + if not is_styled: + # Update img style dimension using width and height + upd = {} + for prop in ('width', 'height'): + val = elem.get(prop, '').strip() + del elem.attrib[prop] + if val: + if num_pat.match(val) is not None: + val += 'px' + upd[prop] = val + if upd: + style._update_cssdict(upd) def _fetch_css_file(self, path): hrefs = self.oeb.manifest.hrefs From a5d7a19c341326d3359798a724ed4e4d1de1d916 Mon Sep 17 00:00:00 2001 From: Timothy Legge Date: Mon, 29 Nov 2010 23:24:31 -0400 Subject: [PATCH 09/24] Allow html, htm and rtf documents to be deleted --- src/calibre/devices/kobo/driver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/devices/kobo/driver.py b/src/calibre/devices/kobo/driver.py index ebb3f60101..981bf3decb 100644 --- a/src/calibre/devices/kobo/driver.py +++ b/src/calibre/devices/kobo/driver.py @@ -401,7 +401,7 @@ class KOBO(USBMS): elif extension == '.pdf' or extension == '.epub': # print "ePub or pdf" ContentType = 16 - elif extension == '.txt': + elif extension == '.rtf' or extension == '.txt' or extension == '.htm' or extension == '.html': # print "txt" ContentType = 901 else: # if extension == '.html' or extension == '.txt': From 8a6e316e9fdcfd36c61b9a52a8a65c5ac6d0e1a2 Mon Sep 17 00:00:00 2001 From: Timothy Legge Date: Mon, 29 Nov 2010 23:51:55 -0400 Subject: [PATCH 10/24] Fix the deletion of html, htm, txt and rtf by firmware version --- src/calibre/devices/kobo/driver.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/calibre/devices/kobo/driver.py b/src/calibre/devices/kobo/driver.py index 981bf3decb..b76ee4b1c3 100644 --- a/src/calibre/devices/kobo/driver.py +++ b/src/calibre/devices/kobo/driver.py @@ -79,11 +79,11 @@ class KOBO(USBMS): # Determine the firmware version f = open(self.normalize_path(self._main_prefix + '.kobo/version'), 'r') - fwversion = f.readline().split(',')[2] + self.fwversion = f.readline().split(',')[2] f.close() - if fwversion != '1.0' and fwversion != '1.4': + if self.fwversion != '1.0' and self.fwversion != '1.4': self.has_kepubs = True - debug_print('Version of firmware: ', fwversion, 'Has kepubs:', self.has_kepubs) + debug_print('Version of firmware: ', self.fwversion, 'Has kepubs:', self.has_kepubs) self.booklist_class.rebuild_collections = self.rebuild_collections @@ -220,7 +220,7 @@ class KOBO(USBMS): # 2) volume_shorcover # 2) content -# debug_print('delete_via_sql: ContentID: ', ContentID, 'ContentType: ', ContentType) + debug_print('delete_via_sql: ContentID: ', ContentID, 'ContentType: ', ContentType) connection = sqlite.connect(self.normalize_path(self._main_prefix + '.kobo/KoboReader.sqlite')) cursor = connection.cursor() t = (ContentID,) @@ -403,7 +403,10 @@ class KOBO(USBMS): ContentType = 16 elif extension == '.rtf' or extension == '.txt' or extension == '.htm' or extension == '.html': # print "txt" - ContentType = 901 + if self.fwversion == '1.0' or self.fwversion == '1.4' or self.fwversion == '1.7.4': + ContentType = 999 + else: + ContentType = 901 else: # if extension == '.html' or extension == '.txt': ContentType = 999 # Yet another hack: to get around Kobo changing how ContentID is stored return ContentType From 549b73e248e0ec3a38b64843b0d2feb8d97de2d6 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 29 Nov 2010 21:10:36 -0700 Subject: [PATCH 11/24] Force overwrite title/author metadata to True when downloading metadata for books added by ISBN --- src/calibre/gui2/actions/add.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/actions/add.py b/src/calibre/gui2/actions/add.py index 5cc72c3ff0..9b348d8285 100644 --- a/src/calibre/gui2/actions/add.py +++ b/src/calibre/gui2/actions/add.py @@ -18,6 +18,7 @@ from calibre.ebooks import BOOK_EXTENSIONS from calibre.utils.filenames import ascii_filename from calibre.constants import preferred_encoding, filesystem_encoding from calibre.gui2.actions import InterfaceAction +from calibre.gui2 import config class AddAction(InterfaceAction): @@ -101,7 +102,12 @@ class AddAction(InterfaceAction): else: ids.add(db.import_book(mi, [])) self.gui.library_view.model().books_added(len(books)) - self.gui.iactions['Edit Metadata'].do_download_metadata(ids) + orig = config['overwrite_author_title_metadata'] + config['overwrite_author_title_metadata'] = True + try: + self.gui.iactions['Edit Metadata'].do_download_metadata(ids) + finally: + config['overwrite_author_title_metadata'] = orig def files_dropped(self, paths): From 449de8255f19acb1fd8bab750efe67885fcaf22d Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 30 Nov 2010 12:56:27 +0000 Subject: [PATCH 12/24] Refactor search boxes to use placeholders, emit refocus events when appropriate, and improve the selected-text model. Also many general cleanups, such as renaming clear_to_help to clear. --- src/calibre/gui2/lrf_renderer/main.py | 2 +- src/calibre/gui2/search_box.py | 214 ++++++++----------- src/calibre/gui2/search_restriction_mixin.py | 4 +- src/calibre/gui2/tag_view.py | 10 +- src/calibre/gui2/ui.py | 4 +- src/calibre/gui2/viewer/main.py | 4 +- 6 files changed, 97 insertions(+), 141 deletions(-) diff --git a/src/calibre/gui2/lrf_renderer/main.py b/src/calibre/gui2/lrf_renderer/main.py index 8ddda175fa..2acfd3c9a7 100644 --- a/src/calibre/gui2/lrf_renderer/main.py +++ b/src/calibre/gui2/lrf_renderer/main.py @@ -127,7 +127,7 @@ class Main(MainWindow, Ui_MainWindow): self.progress_label.setText('Parsing '+ self.file_name) self.renderer = RenderWorker(self, stream, self.logger, self.opts) QObject.connect(self.renderer, SIGNAL('finished()'), self.parsed, Qt.QueuedConnection) - self.search.clear_to_help() + self.search.clear() self.last_search = None else: self.stack.setCurrentIndex(0) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index b37d74f51f..444ba156ca 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -8,9 +8,8 @@ __docformat__ = 'restructuredtext en' import re -from PyQt4.Qt import QComboBox, Qt, QLineEdit, QStringList, pyqtSlot, \ - pyqtSignal, SIGNAL, QObject, QDialog, QCompleter, \ - QAction, QKeySequence, QTimer +from PyQt4.Qt import QComboBox, Qt, QLineEdit, QStringList, pyqtSlot, QDialog, \ + pyqtSignal, QCompleter, QAction, QKeySequence, QTimer from calibre.gui2 import config from calibre.gui2.dialogs.confirm_delete import confirm @@ -20,35 +19,30 @@ from calibre.utils.search_query_parser import saved_searches class SearchLineEdit(QLineEdit): key_pressed = pyqtSignal(object) - mouse_released = pyqtSignal(object) - focus_out = pyqtSignal(object) def keyPressEvent(self, event): self.key_pressed.emit(event) QLineEdit.keyPressEvent(self, event) def mouseReleaseEvent(self, event): - self.mouse_released.emit(event) QLineEdit.mouseReleaseEvent(self, event) + QLineEdit.selectAll(self) - def focusOutEvent(self, event): - self.focus_out.emit(event) - QLineEdit.focusOutEvent(self, event) + def focusInEvent(self, event): + QLineEdit.focusInEvent(self, event) + QLineEdit.selectAll(self) def dropEvent(self, ev): - if self.parent().help_state: - self.parent().normalize_state() + self.parent().normalize_state() return QLineEdit.dropEvent(self, ev) def contextMenuEvent(self, ev): - if self.parent().help_state: - self.parent().normalize_state() + self.parent().normalize_state() return QLineEdit.contextMenuEvent(self, ev) @pyqtSlot() def paste(self, *args): - if self.parent().help_state: - self.parent().normalize_state() + self.parent().normalize_state() return QLineEdit.paste(self) class SearchBox2(QComboBox): @@ -59,14 +53,17 @@ class SearchBox2(QComboBox): * Call initialize() * Connect to the search() and cleared() signals from this widget. * Connect to the cleared() signal to know when the box content changes + * Connect to focus_to_library signal to be told to manually change focus * Call search_done() after every search is complete - * Use clear() to clear back to the help message ''' INTERVAL = 1500 #: Time to wait before emitting search signal MAX_COUNT = 25 - search = pyqtSignal(object) + search = pyqtSignal(object) + cleared = pyqtSignal() + changed = pyqtSignal() + focus_to_library = pyqtSignal() def __init__(self, parent=None): QComboBox.__init__(self, parent) @@ -75,13 +72,9 @@ class SearchBox2(QComboBox): self.setLineEdit(self.line_edit) c = self.line_edit.completer() c.setCompletionMode(c.PopupCompletion) - self.line_edit.key_pressed.connect(self.key_pressed, - type=Qt.DirectConnection) - self.line_edit.mouse_released.connect(self.mouse_released, - type=Qt.DirectConnection) + self.line_edit.key_pressed.connect(self.key_pressed, type=Qt.DirectConnection) self.activated.connect(self.history_selected) self.setEditable(True) - self.help_state = False self.as_you_type = True self.prev_search = '' self.timer = QTimer() @@ -98,54 +91,37 @@ class SearchBox2(QComboBox): self.as_you_type = config['search_as_you_type'] self.opt_name = opt_name self.addItems(QStringList(list(set(config[opt_name])))) - self.help_text = help_text + self.line_edit.setPlaceholderText(help_text) self.colorize = colorize - self.clear_to_help() + self.clear() def normalize_state(self): self.setToolTip(self.tool_tip_text) - if self.help_state: - self.setEditText('') - self.line_edit.setStyleSheet( - 'QLineEdit { color: black; background-color: %s; }' % - self.normal_background) - self.help_state = False - else: - self.line_edit.setStyleSheet( - 'QLineEdit { color: black; background-color: %s; }' % - self.normal_background) - - def clear_to_help(self): - self.setToolTip(self.tool_tip_text) - if self.help_state: - return - self.help_state = True - self.search.emit('') - self._in_a_search = False - self.setEditText(self.help_text) - self.line_edit.home(False) self.line_edit.setStyleSheet( - 'QLineEdit { color: gray; background-color: %s; }' % - self.normal_background) - self.emit(SIGNAL('cleared()')) + 'QLineEdit{color:black;background-color:%s;}' % self.normal_background) def text(self): return self.currentText() def clear(self): - self.clear_to_help() + self.normalize_state() + self.setEditText('') + self.search.emit('') + self._in_a_search = False + self.cleared.emit() def search_done(self, ok): if isinstance(ok, basestring): self.setToolTip(ok) ok = False if not unicode(self.currentText()).strip(): - return self.clear_to_help() + self.clear() + return self._in_a_search = ok col = 'rgba(0,255,0,20%)' if ok else 'rgb(255,0,0,20%)' if not self.colorize: col = self.normal_background - self.line_edit.setStyleSheet('QLineEdit { color: black; background-color: %s; }' % col) + self.line_edit.setStyleSheet('QLineEdit{color:black;background-color:%s;}' % col) def key_pressed(self, event): k = event.key() @@ -154,40 +130,25 @@ class SearchBox2(QComboBox): return self.normalize_state() if self._in_a_search: - self.emit(SIGNAL('changed()')) + self.changed.emit() self._in_a_search = False if event.key() in (Qt.Key_Return, Qt.Key_Enter): self.do_search() + self.focus_to_library.emit() if self.as_you_type: self.timer.start(1500) - def mouse_released(self, event): - self.normalize_state() - # Dont trigger a search since it make - # re-positioning the cursor using the mouse - # impossible - #if self.as_you_type: - # self.timer.start(1500) - def timer_event(self): self.do_search() def history_selected(self, text): - self.emit(SIGNAL('changed()')) + self.changed.emit() self.do_search() - @property - def smart_text(self): - text = unicode(self.currentText()).strip() - if not text or text == self.help_text: - return '' - return text - def do_search(self, *args): text = unicode(self.currentText()).strip() - if not text or text == self.help_text: + if not text: return self.clear() - self.help_state = False self.prev_search = text self.search.emit(text) @@ -220,7 +181,7 @@ class SearchBox2(QComboBox): def set_search_string(self, txt): if not txt: - self.clear_to_help() + self.clear() return self.normalize_state() self.setEditText(txt) @@ -243,25 +204,24 @@ class SavedSearchBox(QComboBox): if you care about changes to the list of saved searches. ''' + changed = pyqtSignal() + focus_to_library = pyqtSignal() + def __init__(self, parent=None): QComboBox.__init__(self, parent) self.normal_background = 'rgb(255, 255, 255, 0%)' self.line_edit = SearchLineEdit(self) self.setLineEdit(self.line_edit) - self.line_edit.key_pressed.connect(self.key_pressed, - type=Qt.DirectConnection) - self.line_edit.mouse_released.connect(self.mouse_released, - type=Qt.DirectConnection) - self.line_edit.focus_out.connect(self.focus_out, - type=Qt.DirectConnection) + self.line_edit.key_pressed.connect(self.key_pressed, type=Qt.DirectConnection) self.activated[str].connect(self.saved_search_selected) - completer = QCompleter(self) # turn off auto-completion + # Turn off auto-completion so that it doesn't interfere with typing + # names of new searches. + completer = QCompleter(self) self.setCompleter(completer) + self.setEditable(True) - self.help_state = True - self.prev_search = '' self.setInsertPolicy(self.NoInsert) self.setSizeAdjustPolicy(self.AdjustToMinimumContentsLengthWithIcon) self.setMinimumContentsLength(10) @@ -269,50 +229,40 @@ class SavedSearchBox(QComboBox): def initialize(self, _search_box, colorize=False, help_text=_('Search')): self.search_box = _search_box - self.help_text = help_text + self.line_edit.setPlaceholderText(help_text) self.colorize = colorize - self.clear_to_help() + self.clear() def normalize_state(self): - self.setEditText('') - self.line_edit.setStyleSheet( - 'QLineEdit { color: black; background-color: %s; }' % - self.normal_background) - self.help_state = False + # need this because line_edit will call it in some cases such as paste + pass - def clear_to_help(self): - self.setToolTip(self.tool_tip_text) + def clear(self): + QComboBox.clear(self) self.initialize_saved_search_names() - self.setEditText(self.help_text) + self.setEditText('') self.line_edit.home(False) - self.help_state = True - self.line_edit.setStyleSheet( - 'QLineEdit { color: gray; background-color: %s; }' % - self.normal_background) - - def focus_out(self, event): - if self.currentText() == '': - self.clear_to_help() def key_pressed(self, event): - if self.help_state: - self.normalize_state() - - def mouse_released(self, event): - if self.help_state: - self.normalize_state() + if event.key() in (Qt.Key_Return, Qt.Key_Enter): + self.saved_search_selected(self.currentText()) + self.focus_to_library.emit() def saved_search_selected(self, qname): qname = unicode(qname) if qname is None or not qname.strip(): + self.search_box.clear() + return + if not saved_searches().lookup(qname): + self.search_box.clear() + self.setEditText(qname) return - self.normalize_state() self.search_box.set_search_string(u'search:"%s"' % qname) self.setEditText(qname) self.setToolTip(saved_searches().lookup(qname)) + self.focus_to_library.emit() def initialize_saved_search_names(self): - self.clear() qnames = saved_searches().names() self.addItems(qnames) self.setCurrentIndex(-1) @@ -330,25 +280,24 @@ class SavedSearchBox(QComboBox): if ss is None: return saved_searches().delete(unicode(self.currentText())) - self.clear_to_help() - self.search_box.clear_to_help() - self.emit(SIGNAL('changed()')) + self.clear() + self.search_box.clear() + self.changed.emit() # SIGNALed from the main UI def save_search_button_clicked(self): name = unicode(self.currentText()) - if self.help_state or not name.strip(): + if not name.strip(): name = unicode(self.search_box.text()).replace('"', '') saved_searches().delete(name) saved_searches().add(name, unicode(self.search_box.text())) # now go through an initialization cycle to ensure that the combobox has # the new search in it, that it is selected, and that the search box # references the new search instead of the text in the search. - self.clear_to_help() - self.normalize_state() + self.clear() self.setCurrentIndex(self.findText(name)) self.saved_search_selected (name) - self.emit(SIGNAL('changed()')) + self.changed.emit() # SIGNALed from the main UI def copy_search_button_clicked (self): @@ -362,11 +311,11 @@ class SearchBoxMixin(object): def __init__(self): self.search.initialize('main_search_history', colorize=True, help_text=_('Search (For Advanced Search click the button to the left)')) - self.connect(self.search, SIGNAL('cleared()'), self.search_box_cleared) - self.connect(self.search, SIGNAL('changed()'), self.search_box_changed) - self.connect(self.clear_button, SIGNAL('clicked()'), self.search.clear) - QObject.connect(self.advanced_search_button, SIGNAL('clicked(bool)'), - self.do_advanced_search) + self.search.cleared.connect(self.search_box_cleared) + self.search.changed.connect(self.search_box_changed) + self.search.focus_to_library.connect(self.focus_to_library) + self.clear_button.clicked.connect(self.search.clear) + self.advanced_search_button.clicked[bool].connect(self.do_advanced_search) self.search.clear() self.search.setMaximumWidth(self.width()-150) @@ -384,11 +333,11 @@ class SearchBoxMixin(object): def search_box_cleared(self): self.tags_view.clear() - self.saved_search.clear_to_help() + self.saved_search.clear() self.set_number_of_books_shown() def search_box_changed(self): - self.saved_search.clear_to_help() + self.saved_search.clear() self.tags_view.clear() def do_advanced_search(self, *args): @@ -396,20 +345,24 @@ class SearchBoxMixin(object): if d.exec_() == QDialog.Accepted: self.search.set_search_string(d.search_string()) + def focus_to_library(self): + self.current_view().setFocus(Qt.OtherFocusReason) + class SavedSearchBoxMixin(object): def __init__(self): - self.connect(self.saved_search, SIGNAL('changed()'), self.saved_searches_changed) + self.saved_search.changed.connect(self.saved_searches_changed) + self.clear_button.clicked.connect(self.saved_search.clear) + self.saved_search.focus_to_library.connect(self.focus_to_library) + self.save_search_button.clicked.connect( + self.saved_search.save_search_button_clicked) + self.delete_search_button.clicked.connect( + self.saved_search.delete_search_button_clicked) + self.copy_search_button.clicked.connect( + self.saved_search.copy_search_button_clicked) self.saved_searches_changed() - self.connect(self.clear_button, SIGNAL('clicked()'), self.saved_search.clear_to_help) self.saved_search.initialize(self.search, colorize=True, help_text=_('Saved Searches')) - self.connect(self.save_search_button, SIGNAL('clicked()'), - self.saved_search.save_search_button_clicked) - self.connect(self.delete_search_button, SIGNAL('clicked()'), - self.saved_search.delete_search_button_clicked) - self.connect(self.copy_search_button, SIGNAL('clicked()'), - self.saved_search.copy_search_button_clicked) self.saved_search.setToolTip( _('Choose saved search or enter name for new saved search')) self.saved_search.setStatusTip(self.saved_search.toolTip()) @@ -420,7 +373,8 @@ class SavedSearchBoxMixin(object): def saved_searches_changed(self): p = sorted(saved_searches().names(), cmp=lambda x,y: cmp(x.lower(), y.lower())) t = unicode(self.search_restriction.currentText()) - self.search_restriction.clear() # rebuild the restrictions combobox using current saved searches + # rebuild the restrictions combobox using current saved searches + self.search_restriction.clear() self.search_restriction.addItem('') self.tags_view.recount() for s in p: @@ -433,6 +387,8 @@ class SavedSearchBoxMixin(object): d.exec_() if d.result() == d.Accepted: self.saved_searches_changed() - self.saved_search.clear_to_help() + self.saved_search.clear() + def focus_to_library(self): + self.current_view().setFocus(Qt.OtherFocusReason) diff --git a/src/calibre/gui2/search_restriction_mixin.py b/src/calibre/gui2/search_restriction_mixin.py index 139d7c551d..6373e452e5 100644 --- a/src/calibre/gui2/search_restriction_mixin.py +++ b/src/calibre/gui2/search_restriction_mixin.py @@ -49,8 +49,8 @@ class SearchRestrictionMixin(object): restriction = '' self.restriction_count_of_books_in_view = \ self.library_view.model().set_search_restriction(restriction) - self.search.clear_to_help() - self.saved_search.clear_to_help() + self.search.clear() + self.saved_search.clear() self.tags_view.set_search_restriction(restriction) self.set_number_of_books_shown() diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index 7210afd770..b841706439 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -843,7 +843,7 @@ class TagBrowserMixin(object): # {{{ self.tags_view.set_database(self.library_view.model().db, self.tag_match, self.sort_by) self.tags_view.tags_marked.connect(self.search.search_from_tags) - self.tags_view.tags_marked.connect(self.saved_search.clear_to_help) + self.tags_view.tags_marked.connect(self.saved_search.clear) self.tags_view.tag_list_edit.connect(self.do_tags_list_edit) self.tags_view.user_category_edit.connect(self.do_user_categories_edit) self.tags_view.saved_search_edit.connect(self.do_saved_search_edit) @@ -910,14 +910,14 @@ class TagBrowserMixin(object): # {{{ self.library_view.model().refresh() self.tags_view.set_new_model() self.tags_view.recount() - self.saved_search.clear_to_help() - self.search.clear_to_help() + self.saved_search.clear() + self.search.clear() def do_tag_item_renamed(self): # Clean up library view and search self.library_view.model().refresh() - self.saved_search.clear_to_help() - self.search.clear_to_help() + self.saved_search.clear() + self.search.clear() def do_author_sort_edit(self, parent, id): db = self.library_view.model().db diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index 00bba2b491..cb25f75d4a 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -383,8 +383,8 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, EmailMixin, # {{{ self.tags_view.set_database(db, self.tag_match, self.sort_by) self.library_view.model().set_book_on_device_func(self.book_on_device) self.status_bar.clear_message() - self.search.clear_to_help() - self.saved_search.clear_to_help() + self.search.clear() + self.saved_search.clear() self.book_details.reset_info() self.library_view.model().count_changed() prefs['library_path'] = self.library_path diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py index f9a2432099..8fe176751d 100644 --- a/src/calibre/gui2/viewer/main.py +++ b/src/calibre/gui2/viewer/main.py @@ -237,9 +237,9 @@ class EbookViewer(MainWindow, Ui_EbookViewer): self.connect(self.action_previous_page, SIGNAL('triggered(bool)'), lambda x:self.view.previous_page()) self.connect(self.action_find_next, SIGNAL('triggered(bool)'), - lambda x:self.find(self.search.smart_text, repeat=True)) + lambda x:self.find(self.search.text(), repeat=True)) self.connect(self.action_find_previous, SIGNAL('triggered(bool)'), - lambda x:self.find(self.search.smart_text, + lambda x:self.find(self.search.text(), repeat=True, backwards=True)) self.connect(self.action_full_screen, SIGNAL('triggered(bool)'), From 9d465361a0247cfe93638845283a52139dc1ee01 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 30 Nov 2010 08:47:14 -0700 Subject: [PATCH 13/24] ... --- resources/images/news/novaya_gazeta.png | Bin 0 -> 610 bytes resources/images/news/vedomosti.png | Bin 0 -> 693 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/images/news/novaya_gazeta.png create mode 100644 resources/images/news/vedomosti.png diff --git a/resources/images/news/novaya_gazeta.png b/resources/images/news/novaya_gazeta.png new file mode 100644 index 0000000000000000000000000000000000000000..41886a64b9d1e72d5d91d260871719d982b0dbf6 GIT binary patch literal 610 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zK-vS0-A-oPfdtD69Mgd`SU*F|v9*U87#O=fT^vI!PT!sA>pdk=q;37@De@~=l9aTX zoN|@84)!}t>=9yNoj6T5+T$Msvm#eZ)NTPL@m-uEAp$LeET&3{ThT=#3A;oX^W!Ed4! z-tT>~cayE2^-bFkTl)8>zlv>IcOv-IHuINVJjUM*Pxhu8-h0Qwp)68RZ+EW!h@Itc z#;+G6c@{r<&8GL%Q`7anlZ?;9hLbnS4-~%*y;Za1SO&|(ioIVayG-C>Z#ZmF#Lus= zI`H5Y3eKT!%89Z2aTBfYu6&*2Yo=3q(3wxP@&AT`n#Ch+sRJJNK9`VYRK2*HW zqThSzat1k*(4u3OXKaLJzcaXhDdJAa`@dxCt0%nw|8#!8bm_Uu_T|?YGUDbvON~{( zC#gKw^v)_vcBbcZS{e2nkf_}3{6EPi)@(=hSDXGQEr!D?Iy?%VGfx~|D0xkMI)j9) z^nsqo*Js___+Cfx)k@u`r{f}zeF$G)zx=+R(>#NpVl}6Maim(}8c~v5l$uzQs+$5N z7>o=I4Rj3+b&ZTejEt;|4Xg|;wGE7|3=CLP)KXy@a`RI%(<%vQh`JgO2-Lvf>FVdQ I&MBb@0Ocj^tpET3 literal 0 HcmV?d00001 diff --git a/resources/images/news/vedomosti.png b/resources/images/news/vedomosti.png new file mode 100644 index 0000000000000000000000000000000000000000..3187308f4e9ff62fc547475a1a69523dd39b0e88 GIT binary patch literal 693 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zK-vS0-A-oPfdtD69Mgd`SU*F|v9*U87#Qz)x;TbdoSr(#H(NMRq;0;nv6fztc%4db zx7(ubIt3OhDG}2h0a||rMO`Lz#qKD08DF5yvGzigW3R|AO)+QgjXNf2?a=TQX*F5# zK&hv#%&54(yKvb|KkljrhisqU`@HY`UK!W$H6hPh>pPM*Mg+0<>!|XDX?<3jdtd3^ zvX1v`-oFoiGIQOcFMn^}w56?^a<>T*^?rc}CR;H_2 zqPMqsbDenhyGZ(B>(i&KVd3^hhK1q`zkANUxhxrwR`4&2Z>=dqTjBzSU7D|6zrR^z z&BJ$dV)oz9RU3Y4f7%>*yfijztCU+)bhXTl{rXU+nn6?8EzL@m4>slxky<^L*|*AOCsub92#^E4rJW%SVLmx%0Bb zp*rEn>v_*rIbF);YYTF^I8C~cv%Nbzduv2)$(JmZHM=~b){0#_7bs^@t9NVpWp~N_ zrOkgjV|w&N3T4<|U%sw?{BYav@9%PYV&$D#nY%J)%Dj4c(16Ezopr093dcqyPW_ literal 0 HcmV?d00001 From 2791f02c3dca565d9bc24f33613ebdadd852f4e8 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 30 Nov 2010 16:37:55 +0000 Subject: [PATCH 14/24] Enhancement #7732: add an 'apply' button to bulk edit --- src/calibre/gui2/dialogs/metadata_bulk.py | 44 +++++++++++++++++------ src/calibre/gui2/dialogs/metadata_bulk.ui | 2 +- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index f8177b7680..f2a2394e9e 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -6,7 +6,7 @@ __copyright__ = '2008, Kovid Goyal ' import re from PyQt4.Qt import Qt, QDialog, QGridLayout, QVBoxLayout, QFont, QLabel, \ - pyqtSignal + pyqtSignal, QDialogButtonBox from PyQt4 import QtGui from calibre.gui2.dialogs.metadata_bulk_ui import Ui_MetadataBulkDialog @@ -198,15 +198,30 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): ] def __init__(self, window, rows, model): + self.model = model + self.db = self.model.db + self.ids = [self.db.id(r) for r in rows] QDialog.__init__(self, window) Ui_MetadataBulkDialog.__init__(self) + self._initialize() + self.exec_() + + def _initialize(self): + # Remove all controls from the dialog box by deleting the top layout + if self.layout(): + import sip + sip.delete(self.layout()) + self.setupUi(self) - self.model = model - self.db = model.db - self.ids = [self.db.id(r) for r in rows] + self.button_box.clicked.connect(self.button_clicked) + self.button_box.button(QDialogButtonBox.Apply).setToolTip(_( + 'Immediately make all changes without closing the dialog. ' + 'This operation cannot be canceled or undone')) + self.box_title.setText('

' + _('Editing meta information for %d books') % - len(rows)) + len(self.ids)) + self.write_series = False self.changed = False @@ -232,7 +247,11 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.create_custom_column_editors() self.prepare_search_and_replace() - self.exec_() + + def button_clicked(self, which): + if which == self.button_box.button(QDialogButtonBox.Apply): + self._do_the_work() + self._initialize() def prepare_search_and_replace(self): self.search_for.initialize('bulk_edit_search_for') @@ -627,10 +646,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.series_start_number.setEnabled(False) self.series_start_number.setValue(1) - def accept(self): - if len(self.ids) < 1: - return QDialog.accept(self) - + def _do_the_work(self): if self.s_r_error is not None: error_dialog(self, _('Search/replace invalid'), _('Search pattern is invalid: %s')%self.s_r_error.message, @@ -690,8 +706,14 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): dynamic['s_r_search_mode'] = self.search_mode.currentIndex() self.db.clean() - return QDialog.accept(self) + return True + def accept(self): + if len(self.ids) < 1: + return QDialog.accept(self) + if not self._do_the_work(): + return False + return QDialog.accept(self) def series_changed(self, *args): self.write_series = True diff --git a/src/calibre/gui2/dialogs/metadata_bulk.ui b/src/calibre/gui2/dialogs/metadata_bulk.ui index 44839bbacd..344bde0fa0 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.ui +++ b/src/calibre/gui2/dialogs/metadata_bulk.ui @@ -710,7 +710,7 @@ nothing should be put between the original text and the inserted text Qt::Horizontal - QDialogButtonBox::Cancel|QDialogButtonBox::Ok + QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok From 243fcf5b3825d757c32db3f63c1db0704c052a66 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 30 Nov 2010 10:15:53 -0700 Subject: [PATCH 15/24] Search box: Only trigger as you type timer if text content has changed --- src/calibre/gui2/search_box.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index c82489d218..547dc32c53 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -140,7 +140,7 @@ class SearchBox2(QComboBox): if event.key() in (Qt.Key_Return, Qt.Key_Enter): self.do_search() self.focus_to_library.emit() - if self.as_you_type: + elif self.as_you_type and unicode(event.text()): self.timer.start(1500) def timer_event(self): From ae9fcef78828834081ae54c825fd1969a964a3f3 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 30 Nov 2010 10:17:23 -0700 Subject: [PATCH 16/24] ... --- src/calibre/gui2/search_box.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 547dc32c53..f8d5d4777e 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -76,7 +76,6 @@ class SearchBox2(QComboBox): self.activated.connect(self.history_selected) self.setEditable(True) self.as_you_type = True - self.prev_search = '' self.timer = QTimer() self.timer.setSingleShot(True) self.timer.timeout.connect(self.timer_event, type=Qt.QueuedConnection) @@ -154,7 +153,6 @@ class SearchBox2(QComboBox): text = unicode(self.currentText()).strip() if not text: return self.clear() - self.prev_search = text self.search.emit(text) idx = self.findText(text, Qt.MatchFixedString) From 1063a52c121b5ee76e62f1d4773d14d8b4ad73e0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 30 Nov 2010 10:22:01 -0700 Subject: [PATCH 17/24] ... --- src/calibre/gui2/search_box.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index f8d5d4777e..6624acf35f 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -106,10 +106,11 @@ class SearchBox2(QComboBox): def text(self): return self.currentText() - def clear(self, emit_search=False): + def clear(self, emit_search=True): self.normalize_state() self.setEditText('') - self.search.emit('') + if emit_search: + self.search.emit('') self._in_a_search = False self.cleared.emit() From d2960c801f8a6416c909d11db52a309399c9346e Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 30 Nov 2010 10:31:36 -0700 Subject: [PATCH 18/24] Restore operation of clear search button --- src/calibre/gui2/search_box.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 6624acf35f..4d598a3bbb 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -114,6 +114,9 @@ class SearchBox2(QComboBox): self._in_a_search = False self.cleared.emit() + def clear_clicked(self, *args): + self.clear() + def search_done(self, ok): if isinstance(ok, basestring): self.setToolTip(ok) @@ -318,7 +321,7 @@ class SearchBoxMixin(object): self.search.cleared.connect(self.search_box_cleared) self.search.changed.connect(self.search_box_changed) self.search.focus_to_library.connect(self.focus_to_library) - self.clear_button.clicked.connect(self.search.clear) + self.clear_button.clicked.connect(self.search.clear_clicked) self.advanced_search_button.clicked[bool].connect(self.do_advanced_search) self.search.clear() From bfdc51a2dda552c99b5570c5a2becc61165d4dfe Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 30 Nov 2010 17:37:56 +0000 Subject: [PATCH 19/24] Make the 'clear' button respect the search emit flag. --- src/calibre/gui2/search_box.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 6624acf35f..065520b4c5 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -107,6 +107,7 @@ class SearchBox2(QComboBox): return self.currentText() def clear(self, emit_search=True): + print 'in clear', emit_search self.normalize_state() self.setEditText('') if emit_search: @@ -318,7 +319,7 @@ class SearchBoxMixin(object): self.search.cleared.connect(self.search_box_cleared) self.search.changed.connect(self.search_box_changed) self.search.focus_to_library.connect(self.focus_to_library) - self.clear_button.clicked.connect(self.search.clear) + self.clear_button.clicked.connect(lambda:self.search.clear(True)) self.advanced_search_button.clicked[bool].connect(self.do_advanced_search) self.search.clear() From ff978282c72f6fea76d79a5d90dab5af00298b95 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 30 Nov 2010 18:03:52 +0000 Subject: [PATCH 20/24] Remove widgets with removing the layout in bulk edit. --- src/calibre/gui2/dialogs/metadata_bulk.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index f2a2394e9e..e67a80e5d1 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -210,6 +210,11 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): # Remove all controls from the dialog box by deleting the top layout if self.layout(): import sip + while True: + child = self.layout().takeAt(0) + if not child: + break; + sip.delete(child) sip.delete(self.layout()) self.setupUi(self) From 566d56e71e7ca8fabb3ffa812a9b9e59ed790de0 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 30 Nov 2010 18:55:24 +0000 Subject: [PATCH 21/24] Another attempt at apply in bulk edit --- src/calibre/gui2/actions/edit_metadata.py | 9 +++- src/calibre/gui2/dialogs/metadata_bulk.py | 51 ++++++++--------------- 2 files changed, 24 insertions(+), 36 deletions(-) diff --git a/src/calibre/gui2/actions/edit_metadata.py b/src/calibre/gui2/actions/edit_metadata.py index 9b3f2c5bb9..8b57b4b455 100644 --- a/src/calibre/gui2/actions/edit_metadata.py +++ b/src/calibre/gui2/actions/edit_metadata.py @@ -162,9 +162,14 @@ class EditMetadataAction(InterfaceAction): return # Prevent the TagView from updating due to signals from the database self.gui.tags_view.blockSignals(True) + changed = False try: - changed = MetadataBulkDialog(self.gui, rows, - self.gui.library_view.model()).changed + while True: + dialog = MetadataBulkDialog(self.gui, rows, self.gui.library_view.model()) + if dialog.changed: + changed = True + if not dialog.do_again: + break finally: self.gui.tags_view.blockSignals(False) if changed: diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index e67a80e5d1..4fd34e4c4c 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -198,35 +198,15 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): ] def __init__(self, window, rows, model): - self.model = model - self.db = self.model.db - self.ids = [self.db.id(r) for r in rows] QDialog.__init__(self, window) Ui_MetadataBulkDialog.__init__(self) - self._initialize() - self.exec_() - - def _initialize(self): - # Remove all controls from the dialog box by deleting the top layout - if self.layout(): - import sip - while True: - child = self.layout().takeAt(0) - if not child: - break; - sip.delete(child) - sip.delete(self.layout()) - self.setupUi(self) - self.button_box.clicked.connect(self.button_clicked) - self.button_box.button(QDialogButtonBox.Apply).setToolTip(_( - 'Immediately make all changes without closing the dialog. ' - 'This operation cannot be canceled or undone')) - + self.model = model + self.db = model.db + self.ids = [self.db.id(r) for r in rows] self.box_title.setText('

' + _('Editing meta information for %d books') % - len(self.ids)) - + len(rows)) self.write_series = False self.changed = False @@ -253,10 +233,17 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.prepare_search_and_replace() + self.button_box.clicked.connect(self.button_clicked) + self.button_box.button(QDialogButtonBox.Apply).setToolTip(_( + 'Immediately make all changes without closing the dialog. ' + 'This operation cannot be canceled or undone')) + self.do_again = False + self.exec_() + def button_clicked(self, which): if which == self.button_box.button(QDialogButtonBox.Apply): - self._do_the_work() - self._initialize() + self.do_again = True + self.accept() def prepare_search_and_replace(self): self.search_for.initialize('bulk_edit_search_for') @@ -651,7 +638,10 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.series_start_number.setEnabled(False) self.series_start_number.setValue(1) - def _do_the_work(self): + def accept(self): + if len(self.ids) < 1: + return QDialog.accept(self) + if self.s_r_error is not None: error_dialog(self, _('Search/replace invalid'), _('Search pattern is invalid: %s')%self.s_r_error.message, @@ -711,13 +701,6 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): dynamic['s_r_search_mode'] = self.search_mode.currentIndex() self.db.clean() - return True - - def accept(self): - if len(self.ids) < 1: - return QDialog.accept(self) - if not self._do_the_work(): - return False return QDialog.accept(self) def series_changed(self, *args): From 5fa54ef9adda206a6022be495095dfaec1001ef5 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 30 Nov 2010 13:52:58 -0700 Subject: [PATCH 22/24] Use the same MIME database on all platforms that calibre runs on --- resources/mime.types | 1381 +++++++++++++++++++++++++++++++++++++++ src/calibre/__init__.py | 35 +- src/calibre/startup.py | 5 + 3 files changed, 1390 insertions(+), 31 deletions(-) create mode 100644 resources/mime.types diff --git a/resources/mime.types b/resources/mime.types new file mode 100644 index 0000000000..ab98b3bf4a --- /dev/null +++ b/resources/mime.types @@ -0,0 +1,1381 @@ +## Mimetypes from my linux system + +application/activemessage +application/andrew-inset ez +application/applefile +application/applixware aw +application/atom+xml atom +application/atomcat+xml atomcat +application/atomicmail +application/atomsvc+xml atomsvc +application/auth-policy+xml +application/batch-smtp +application/beep+xml +application/cals-1840 +application/ccxml+xml ccxml +application/cea-2018+xml +application/cellml+xml +application/cnrp+xml +application/commonground +application/conference-info+xml +application/cpl+xml +application/csta+xml +application/cstadata+xml +application/cu-seeme cu +application/cybercash +application/davmount+xml davmount +application/dca-rft +application/dec-dx +application/dialog-info+xml +application/dicom +application/dns +application/dsptype tsp +application/dvcs +application/ecmascript ecma +application/edi-consent +application/edi-x12 +application/edifact +application/emma+xml emma +application/epp+xml +application/epub+zip epub +application/eshop +application/example +application/fastinfoset +application/fastsoap +application/fits +application/font-tdpfr pfr +application/futuresplash spl +application/h224 +application/hta hta +application/http +application/hyperstudio stk +application/ibe-key-request+xml +application/ibe-pkg-reply+xml +application/ibe-pp-data +application/iges +application/im-iscomposing+xml +application/index +application/index.cmd +application/index.obj +application/index.response +application/index.vnd +application/iotp +application/ipp +application/isup +application/java-archive jar +application/java-serialized-object ser +application/java-vm class +application/javascript js +application/json json +application/kpml-request+xml +application/kpml-response+xml +application/lost+xml lostxml +application/mac-binhex40 hqx +application/mac-compactpro cpt +application/macwriteii +application/marc mrc +application/mathematica ma mb nb +application/mathml+xml mathml +application/mbms-associated-procedure-description+xml +application/mbms-deregister+xml +application/mbms-envelope+xml +application/mbms-msk+xml +application/mbms-msk-response+xml +application/mbms-protection-description+xml +application/mbms-reception-report+xml +application/mbms-register+xml +application/mbms-register-response+xml +application/mbms-user-service-description+xml +application/mbox mbox +application/media_control+xml +application/mediaservercontrol+xml mscml +application/mikey +application/moss-keys +application/moss-signature +application/mosskey-data +application/mosskey-request +application/mp4 mp4s +application/mpeg4-generic +application/mpeg4-iod +application/mpeg4-iod-xmt +application/msaccess mdb +application/msword doc dot +application/mxf mxf +application/nasdata +application/news-checkgroups +application/news-groupinfo +application/news-transmission +application/nss +application/ocsp-request +application/ocsp-response +application/octet-stream bin bpk deploy dist distz dmg dms dump elc iso lha lrf lzh pkg so +application/oda oda +application/oebps-package+xml opf +application/ogg ogg ogx +application/onenote onepkg onetmp onetoc onetoc2 +application/parityfec +application/patch-ops-error+xml xer +application/pdf pdf +application/pgp-encrypted pgp +application/pgp-keys key +application/pgp-signature asc pgp sig +application/pics-rules prf +application/pidf+xml +application/pidf-diff+xml +application/pkcs10 p10 +application/pkcs7-mime p7c p7m +application/pkcs7-signature p7s +application/pkix-cert cer +application/pkix-crl crl +application/pkix-pkipath pkipath +application/pkixcmp pki +application/pls+xml pls +application/poc-settings+xml +application/postscript ai eps ps +application/prs.alvestrand.titrax-sheet +application/prs.cww cww +application/prs.nprend +application/prs.plucker +application/qsig +application/rar rar +application/rdf+xml rdf +application/reginfo+xml rif +application/relax-ng-compact-syntax rnc +application/remote-printing +application/resource-lists+xml rl +application/resource-lists-diff+xml rld +application/riscos +application/rlmi+xml +application/rls-services+xml rs +application/rsd+xml rsd +application/rss+xml rss +application/rtf rtf +application/rtx +application/samlassertion+xml +application/samlmetadata+xml +application/sbml+xml sbml +application/scvp-cv-request scq +application/scvp-cv-response scs +application/scvp-vp-request spq +application/scvp-vp-response spp +application/sdp sdp +application/set-payment +application/set-payment-initiation setpay +application/set-registration +application/set-registration-initiation setreg +application/sgml +application/sgml-open-catalog +application/shf+xml shf +application/sieve +application/simple-filter+xml +application/simple-message-summary +application/simplesymbolcontainer +application/slate +application/smil smi smil +application/smil+xml smi smil +application/soap+fastinfoset +application/soap+xml +application/sparql-query rq +application/sparql-results+xml srx +application/spirits-event+xml +application/srgs gram +application/srgs+xml grxml +application/ssml+xml ssml +application/timestamp-query +application/timestamp-reply +application/tve-trigger +application/ulpfec +application/vemmi +application/vividence.scriptfile +application/vnd.3gpp.bsf+xml +application/vnd.3gpp.pic-bw-large plb +application/vnd.3gpp.pic-bw-small psb +application/vnd.3gpp.pic-bw-var pvb +application/vnd.3gpp.sms +application/vnd.3gpp2.bcmcsinfo+xml +application/vnd.3gpp2.sms +application/vnd.3gpp2.tcap tcap +application/vnd.3m.post-it-notes pwn +application/vnd.accpac.simply.aso aso +application/vnd.accpac.simply.imp imp +application/vnd.acucobol acu +application/vnd.acucorp acutc atc +application/vnd.adobe.air-application-installer-package+zip air +application/vnd.adobe.xdp+xml xdp +application/vnd.adobe.xfdf xfdf +application/vnd.aether.imp +application/vnd.airzip.filesecure.azf azf +application/vnd.airzip.filesecure.azs azs +application/vnd.amazon.ebook azw +application/vnd.americandynamics.acc acc +application/vnd.amiga.ami ami +application/vnd.android.package-archive apk +application/vnd.anser-web-certificate-issue-initiation cii +application/vnd.anser-web-funds-transfer-initiation fti +application/vnd.antix.game-component atx +application/vnd.apple.installer+xml mpkg +application/vnd.arastra.swi swi +application/vnd.audiograph aep +application/vnd.autopackage +application/vnd.avistar+xml +application/vnd.blueice.multipass mpm +application/vnd.bluetooth.ep.oob +application/vnd.bmi bmi +application/vnd.businessobjects rep +application/vnd.cab-jscript +application/vnd.canon-cpdl +application/vnd.canon-lips +application/vnd.cendio.thinlinc.clientconf +application/vnd.chemdraw+xml cdxml +application/vnd.chipnuts.karaoke-mmd mmd +application/vnd.cinderella cdy +application/vnd.cirpack.isdn-ext +application/vnd.claymore cla +application/vnd.clonk.c4group c4d c4f c4g c4p c4u +application/vnd.commerce-battelle +application/vnd.commonspace csp +application/vnd.contact.cmsg cdbcmsg +application/vnd.cosmocaller cmc +application/vnd.crick.clicker clkx +application/vnd.crick.clicker.keyboard clkk +application/vnd.crick.clicker.palette clkp +application/vnd.crick.clicker.template clkt +application/vnd.crick.clicker.wordbank clkw +application/vnd.criticaltools.wbs+xml wbs +application/vnd.ctc-posml pml +application/vnd.ctct.ws+xml +application/vnd.cups-pdf +application/vnd.cups-postscript +application/vnd.cups-ppd ppd +application/vnd.cups-raster +application/vnd.cups-raw +application/vnd.curl.car car +application/vnd.curl.pcurl pcurl +application/vnd.cybank +application/vnd.data-vision.rdz rdz +application/vnd.denovo.fcselayout-link fe_launch +application/vnd.dir-bi.plate-dl-nosuffix +application/vnd.dna dna +application/vnd.dolby.mlp mlp +application/vnd.dolby.mobile.1 +application/vnd.dolby.mobile.2 +application/vnd.dpgraph dpg +application/vnd.dreamfactory dfac +application/vnd.dvb.esgcontainer +application/vnd.dvb.ipdcdftnotifaccess +application/vnd.dvb.ipdcesgaccess +application/vnd.dvb.ipdcroaming +application/vnd.dvb.iptv.alfec-base +application/vnd.dvb.iptv.alfec-enhancement +application/vnd.dvb.notif-aggregate-root+xml +application/vnd.dvb.notif-container+xml +application/vnd.dvb.notif-generic+xml +application/vnd.dvb.notif-ia-msglist+xml +application/vnd.dvb.notif-ia-registration-request+xml +application/vnd.dvb.notif-ia-registration-response+xml +application/vnd.dvb.notif-init+xml +application/vnd.dxr +application/vnd.dynageo geo +application/vnd.ecdis-update +application/vnd.ecowin.chart mag +application/vnd.ecowin.filerequest +application/vnd.ecowin.fileupdate +application/vnd.ecowin.series +application/vnd.ecowin.seriesrequest +application/vnd.ecowin.seriesupdate +application/vnd.emclient.accessrequest+xml +application/vnd.enliven nml +application/vnd.epson.esf esf +application/vnd.epson.msf msf +application/vnd.epson.quickanime qam +application/vnd.epson.salt slt +application/vnd.epson.ssf ssf +application/vnd.ericsson.quickcall +application/vnd.eszigno3+xml es3 et3 +application/vnd.etsi.aoc+xml +application/vnd.etsi.cug+xml +application/vnd.etsi.iptvcommand+xml +application/vnd.etsi.iptvdiscovery+xml +application/vnd.etsi.iptvprofile+xml +application/vnd.etsi.iptvsad-bc+xml +application/vnd.etsi.iptvsad-cod+xml +application/vnd.etsi.iptvsad-npvr+xml +application/vnd.etsi.iptvueprofile+xml +application/vnd.etsi.mcid+xml +application/vnd.etsi.sci+xml +application/vnd.etsi.simservs+xml +application/vnd.eudora.data +application/vnd.ezpix-album ez2 +application/vnd.ezpix-package ez3 +application/vnd.f-secure.mobile +application/vnd.fdf fdf +application/vnd.fdsn.mseed mseed +application/vnd.fdsn.seed dataless seed +application/vnd.ffsns +application/vnd.fints +application/vnd.flographit gph +application/vnd.fluxtime.clip ftc +application/vnd.font-fontforge-sfd +application/vnd.framemaker book fm frame maker +application/vnd.frogans.fnc fnc +application/vnd.frogans.ltf ltf +application/vnd.fsc.weblaunch fsc +application/vnd.fujitsu.oasys oas +application/vnd.fujitsu.oasys2 oa2 +application/vnd.fujitsu.oasys3 oa3 +application/vnd.fujitsu.oasysgp fg5 +application/vnd.fujitsu.oasysprs bh2 +application/vnd.fujixerox.art-ex +application/vnd.fujixerox.art4 +application/vnd.fujixerox.ddd ddd +application/vnd.fujixerox.docuworks xdw +application/vnd.fujixerox.docuworks.binder xbd +application/vnd.fujixerox.hbpl +application/vnd.fut-misnet +application/vnd.fuzzysheet fzs +application/vnd.genomatix.tuxedo txd +application/vnd.geogebra.file ggb +application/vnd.geogebra.tool ggt +application/vnd.geometry-explorer gex gre +application/vnd.gmx gmx +application/vnd.google-earth.kml+xml kml +application/vnd.google-earth.kmz kmz +application/vnd.grafeq gqf gqs +application/vnd.gridmp +application/vnd.groove-account gac +application/vnd.groove-help ghf +application/vnd.groove-identity-message gim +application/vnd.groove-injector grv +application/vnd.groove-tool-message gtm +application/vnd.groove-tool-template tpl +application/vnd.groove-vcard vcg +application/vnd.handheld-entertainment+xml zmm +application/vnd.hbci hbci +application/vnd.hcl-bireports +application/vnd.hhe.lesson-player les +application/vnd.hp-hpgl hpgl +application/vnd.hp-hpid hpid +application/vnd.hp-hps hps +application/vnd.hp-jlyt jlt +application/vnd.hp-pcl pcl +application/vnd.hp-pclxl pclxl +application/vnd.httphone +application/vnd.hydrostatix.sof-data sfd-hdstx +application/vnd.hzn-3d-crossword x3d +application/vnd.ibm.afplinedata +application/vnd.ibm.electronic-media +application/vnd.ibm.minipay mpy +application/vnd.ibm.modcap afp list3820 listafp +application/vnd.ibm.rights-management irm +application/vnd.ibm.secure-container sc +application/vnd.iccprofile icc icm +application/vnd.igloader igl +application/vnd.immervision-ivp ivp +application/vnd.immervision-ivu ivu +application/vnd.informedcontrol.rms+xml +application/vnd.informix-visionary +application/vnd.intercon.formnet xpw xpx +application/vnd.intertrust.digibox +application/vnd.intertrust.nncp +application/vnd.intu.qbo qbo +application/vnd.intu.qfx qfx +application/vnd.iptc.g2.conceptitem+xml +application/vnd.iptc.g2.knowledgeitem+xml +application/vnd.iptc.g2.newsitem+xml +application/vnd.iptc.g2.packageitem+xml +application/vnd.ipunplugged.rcprofile rcprofile +application/vnd.irepository.package+xml irp +application/vnd.is-xpr xpr +application/vnd.jam jam +application/vnd.japannet-directory-service +application/vnd.japannet-jpnstore-wakeup +application/vnd.japannet-payment-wakeup +application/vnd.japannet-registration +application/vnd.japannet-registration-wakeup +application/vnd.japannet-setstore-wakeup +application/vnd.japannet-verification +application/vnd.japannet-verification-wakeup +application/vnd.jcp.javame.midlet-rms rms +application/vnd.jisp jisp +application/vnd.joost.joda-archive joda +application/vnd.kahootz ktr ktz +application/vnd.kde.karbon karbon +application/vnd.kde.kchart chrt +application/vnd.kde.kformula kfo +application/vnd.kde.kivio flw +application/vnd.kde.kontour kon +application/vnd.kde.kpresenter kpr kpt +application/vnd.kde.kspread ksp +application/vnd.kde.kword kwd kwt +application/vnd.kenameaapp htke +application/vnd.kidspiration kia +application/vnd.kinar kne knp +application/vnd.koan skd skm skp skt +application/vnd.kodak-descriptor sse +application/vnd.liberty-request+xml +application/vnd.llamagraphics.life-balance.desktop lbd +application/vnd.llamagraphics.life-balance.exchange+xml lbe +application/vnd.lotus-1-2-3 123 +application/vnd.lotus-approach apr +application/vnd.lotus-freelance pre +application/vnd.lotus-notes nsf +application/vnd.lotus-organizer org +application/vnd.lotus-screencam scm +application/vnd.lotus-wordpro lwp +application/vnd.macports.portpkg portpkg +application/vnd.marlin.drm.actiontoken+xml +application/vnd.marlin.drm.conftoken+xml +application/vnd.marlin.drm.license+xml +application/vnd.marlin.drm.mdcf +application/vnd.mcd mcd +application/vnd.medcalcdata mc1 +application/vnd.mediastation.cdkey cdkey +application/vnd.meridian-slingshot +application/vnd.mfer mwf +application/vnd.mfmp mfm +application/vnd.micrografx.flo flo +application/vnd.micrografx.igx igx +application/vnd.mif mif +application/vnd.minisoft-hp3000-save +application/vnd.mitsubishi.misty-guard.trustweb +application/vnd.mobius.daf daf +application/vnd.mobius.dis dis +application/vnd.mobius.mbk mbk +application/vnd.mobius.mqy mqy +application/vnd.mobius.msl msl +application/vnd.mobius.plc plc +application/vnd.mobius.txf txf +application/vnd.mophun.application mpn +application/vnd.mophun.certificate mpc +application/vnd.motorola.flexsuite +application/vnd.motorola.flexsuite.adsi +application/vnd.motorola.flexsuite.fis +application/vnd.motorola.flexsuite.gotap +application/vnd.motorola.flexsuite.kmr +application/vnd.motorola.flexsuite.ttc +application/vnd.motorola.flexsuite.wem +application/vnd.motorola.iprm +application/vnd.mozilla.xul+xml xul +application/vnd.ms-artgalry cil +application/vnd.ms-asf +application/vnd.ms-cab-compressed cab +application/vnd.ms-excel xla xlb xlc xlm xls xlt xlw +application/vnd.ms-excel.addin.macroenabled.12 xlam +application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb +application/vnd.ms-excel.sheet.macroenabled.12 xlsm +application/vnd.ms-excel.template.macroenabled.12 xltm +application/vnd.ms-fontobject eot +application/vnd.ms-htmlhelp chm +application/vnd.ms-ims ims +application/vnd.ms-lrm lrm +application/vnd.ms-pki.seccat cat +application/vnd.ms-pki.stl stl +application/vnd.ms-playready.initiator+xml +application/vnd.ms-powerpoint pot pps ppt +application/vnd.ms-powerpoint.addin.macroenabled.12 ppam +application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm +application/vnd.ms-powerpoint.slide.macroenabled.12 sldm +application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm +application/vnd.ms-powerpoint.template.macroenabled.12 potm +application/vnd.ms-project mpp mpt +application/vnd.ms-tnef +application/vnd.ms-wmdrm.lic-chlg-req +application/vnd.ms-wmdrm.lic-resp +application/vnd.ms-wmdrm.meter-chlg-req +application/vnd.ms-wmdrm.meter-resp +application/vnd.ms-word.document.macroenabled.12 docm +application/vnd.ms-word.template.macroenabled.12 dotm +application/vnd.ms-works wcm wdb wks wps +application/vnd.ms-wpl wpl +application/vnd.ms-xpsdocument xps +application/vnd.mseq mseq +application/vnd.msign +application/vnd.multiad.creator +application/vnd.multiad.creator.cif +application/vnd.music-niff +application/vnd.musician mus +application/vnd.muvee.style msty +application/vnd.ncd.control +application/vnd.ncd.reference +application/vnd.nervana +application/vnd.netfpx +application/vnd.neurolanguage.nlu nlu +application/vnd.noblenet-directory nnd +application/vnd.noblenet-sealer nns +application/vnd.noblenet-web nnw +application/vnd.nokia.catalogs +application/vnd.nokia.conml+wbxml +application/vnd.nokia.conml+xml +application/vnd.nokia.iptv.config+xml +application/vnd.nokia.isds-radio-presets +application/vnd.nokia.landmark+wbxml +application/vnd.nokia.landmark+xml +application/vnd.nokia.landmarkcollection+xml +application/vnd.nokia.n-gage.ac+xml +application/vnd.nokia.n-gage.data ngdat +application/vnd.nokia.n-gage.symbian.install n-gage +application/vnd.nokia.ncd +application/vnd.nokia.pcd+wbxml +application/vnd.nokia.pcd+xml +application/vnd.nokia.radio-preset rpst +application/vnd.nokia.radio-presets rpss +application/vnd.novadigm.edm edm +application/vnd.novadigm.edx edx +application/vnd.novadigm.ext ext +application/vnd.oasis.opendocument.chart odc +application/vnd.oasis.opendocument.chart-template otc +application/vnd.oasis.opendocument.database odb +application/vnd.oasis.opendocument.formula odf +application/vnd.oasis.opendocument.formula-template odft +application/vnd.oasis.opendocument.graphics odg +application/vnd.oasis.opendocument.graphics-template otg +application/vnd.oasis.opendocument.image odi +application/vnd.oasis.opendocument.image-template oti +application/vnd.oasis.opendocument.presentation odp +application/vnd.oasis.opendocument.presentation-template otp +application/vnd.oasis.opendocument.spreadsheet ods +application/vnd.oasis.opendocument.spreadsheet-template ots +application/vnd.oasis.opendocument.text odt +application/vnd.oasis.opendocument.text-master odm otm +application/vnd.oasis.opendocument.text-template ott +application/vnd.oasis.opendocument.text-web oth +application/vnd.obn +application/vnd.olpc-sugar xo +application/vnd.oma-scws-config +application/vnd.oma-scws-http-request +application/vnd.oma-scws-http-response +application/vnd.oma.bcast.associated-procedure-parameter+xml +application/vnd.oma.bcast.drm-trigger+xml +application/vnd.oma.bcast.imd+xml +application/vnd.oma.bcast.ltkm +application/vnd.oma.bcast.notification+xml +application/vnd.oma.bcast.provisioningtrigger +application/vnd.oma.bcast.sgboot +application/vnd.oma.bcast.sgdd+xml +application/vnd.oma.bcast.sgdu +application/vnd.oma.bcast.simple-symbol-container +application/vnd.oma.bcast.smartcard-trigger+xml +application/vnd.oma.bcast.sprov+xml +application/vnd.oma.bcast.stkm +application/vnd.oma.dcd +application/vnd.oma.dcdc +application/vnd.oma.dd2+xml dd2 +application/vnd.oma.drm.risd+xml +application/vnd.oma.group-usage-list+xml +application/vnd.oma.poc.detailed-progress-report+xml +application/vnd.oma.poc.final-report+xml +application/vnd.oma.poc.groups+xml +application/vnd.oma.poc.invocation-descriptor+xml +application/vnd.oma.poc.optimized-progress-report+xml +application/vnd.oma.xcap-directory+xml +application/vnd.omads-email+xml +application/vnd.omads-file+xml +application/vnd.omads-folder+xml +application/vnd.omaloc-supl-init +application/vnd.openofficeorg.extension oxt +application/vnd.openxmlformats-officedocument.presentationml.presentation pptx +application/vnd.openxmlformats-officedocument.presentationml.slide sldx +application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx +application/vnd.openxmlformats-officedocument.presentationml.template potx +application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx +application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx +application/vnd.openxmlformats-officedocument.wordprocessingml.document docx +application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx +application/vnd.osa.netdeploy +application/vnd.osgi.bundle +application/vnd.osgi.dp dp +application/vnd.otps.ct-kip+xml +application/vnd.palm oprc pdb pqa +application/vnd.paos.xml +application/vnd.pg.format str +application/vnd.pg.osasli ei6 +application/vnd.piaccess.application-licence +application/vnd.picsel efif +application/vnd.poc.group-advertisement+xml +application/vnd.pocketlearn plf +application/vnd.powerbuilder6 pbd +application/vnd.powerbuilder6-s +application/vnd.powerbuilder7 +application/vnd.powerbuilder7-s +application/vnd.powerbuilder75 +application/vnd.powerbuilder75-s +application/vnd.preminet +application/vnd.previewsystems.box box +application/vnd.proteus.magazine mgz +application/vnd.publishare-delta-tree qps +application/vnd.pvi.ptid1 ptid +application/vnd.pwg-multiplexed +application/vnd.pwg-xhtml-print+xml +application/vnd.qualcomm.brew-app-res +application/vnd.quark.quarkxpress qwd qwt qxb qxd qxl qxt +application/vnd.rapid +application/vnd.recordare.musicxml mxl +application/vnd.recordare.musicxml+xml musicxml +application/vnd.renlearn.rlprint +application/vnd.rim.cod cod +application/vnd.rn-realmedia rm +application/vnd.route66.link66+xml link66 +application/vnd.ruckus.download +application/vnd.s3sms +application/vnd.sbm.cid +application/vnd.sbm.mid2 +application/vnd.scribus +application/vnd.sealed.3df +application/vnd.sealed.csf +application/vnd.sealed.doc +application/vnd.sealed.eml +application/vnd.sealed.mht +application/vnd.sealed.net +application/vnd.sealed.ppt +application/vnd.sealed.tiff +application/vnd.sealed.xls +application/vnd.sealedmedia.softseal.html +application/vnd.sealedmedia.softseal.pdf +application/vnd.seemail see +application/vnd.sema sema +application/vnd.semd semd +application/vnd.semf semf +application/vnd.shana.informed.formdata ifm +application/vnd.shana.informed.formtemplate itp +application/vnd.shana.informed.interchange iif +application/vnd.shana.informed.package ipk +application/vnd.simtech-mindmapper twd twds +application/vnd.smaf mmf +application/vnd.smart.teacher teacher +application/vnd.software602.filler.form+xml +application/vnd.software602.filler.form-xml-zip +application/vnd.solent.sdkm+xml sdkd sdkm +application/vnd.spotfire.dxp dxp +application/vnd.spotfire.sfs sfs +application/vnd.sss-cod +application/vnd.sss-dtf +application/vnd.sss-ntf +application/vnd.stardivision.calc sdc +application/vnd.stardivision.draw sda +application/vnd.stardivision.impress sdd sdp +application/vnd.stardivision.math sdf smf +application/vnd.stardivision.writer sdw vor +application/vnd.stardivision.writer-global sgl +application/vnd.street-stream +application/vnd.sun.wadl+xml +application/vnd.sun.xml.calc sxc +application/vnd.sun.xml.calc.template stc +application/vnd.sun.xml.draw sxd +application/vnd.sun.xml.draw.template std +application/vnd.sun.xml.impress sxi +application/vnd.sun.xml.impress.template sti +application/vnd.sun.xml.math sxm +application/vnd.sun.xml.writer sxw +application/vnd.sun.xml.writer.global sxg +application/vnd.sun.xml.writer.template stw +application/vnd.sus-calendar sus susp +application/vnd.svd svd +application/vnd.swiftview-ics +application/vnd.symbian.install sis sisx +application/vnd.syncml+xml xsm +application/vnd.syncml.dm+wbxml bdm +application/vnd.syncml.dm+xml xdm +application/vnd.syncml.dm.notification +application/vnd.syncml.ds.notification +application/vnd.tao.intent-module-archive tao +application/vnd.tmobile-livetv tmo +application/vnd.trid.tpt tpt +application/vnd.triscape.mxs mxs +application/vnd.trueapp tra +application/vnd.truedoc +application/vnd.ufdl ufd ufdl +application/vnd.uiq.theme utz +application/vnd.umajin umj +application/vnd.unity unityweb +application/vnd.uoml+xml uoml +application/vnd.uplanet.alert +application/vnd.uplanet.alert-wbxml +application/vnd.uplanet.bearer-choice +application/vnd.uplanet.bearer-choice-wbxml +application/vnd.uplanet.cacheop +application/vnd.uplanet.cacheop-wbxml +application/vnd.uplanet.channel +application/vnd.uplanet.channel-wbxml +application/vnd.uplanet.list +application/vnd.uplanet.list-wbxml +application/vnd.uplanet.listcmd +application/vnd.uplanet.listcmd-wbxml +application/vnd.uplanet.signal +application/vnd.vcx vcx +application/vnd.vd-study +application/vnd.vectorworks +application/vnd.vidsoft.vidconference +application/vnd.visio vsd vss vst vsw +application/vnd.visionary vis +application/vnd.vividence.scriptfile +application/vnd.vsf vsf +application/vnd.wap.sic +application/vnd.wap.slc +application/vnd.wap.wbxml wbxml +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/vnd.webturbo wtb +application/vnd.wfa.wsc +application/vnd.wmc +application/vnd.wmf.bootstrap +application/vnd.wordperfect wpd +application/vnd.wqd wqd +application/vnd.wrq-hp3000-labelled +application/vnd.wt.stf stf +application/vnd.wv.csp+wbxml +application/vnd.wv.csp+xml +application/vnd.wv.ssp+xml +application/vnd.xara xar +application/vnd.xfdl xfdl +application/vnd.xfdl.webform +application/vnd.xmi+xml +application/vnd.xmpie.cpkg +application/vnd.xmpie.dpkg +application/vnd.xmpie.plan +application/vnd.xmpie.ppkg +application/vnd.xmpie.xlim +application/vnd.yamaha.hv-dic hvd +application/vnd.yamaha.hv-script hvs +application/vnd.yamaha.hv-voice hvp +application/vnd.yamaha.openscoreformat osf +application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg +application/vnd.yamaha.smaf-audio saf +application/vnd.yamaha.smaf-phrase spf +application/vnd.yellowriver-custom-menu cmp +application/vnd.zul zir zirz +application/vnd.zzazz.deck+xml zaz +application/voicexml+xml vxml +application/watcherinfo+xml +application/whoispp-query +application/whoispp-response +application/winhlp hlp +application/wita +application/wordperfect wpd +application/wordperfect5.1 wp5 +application/wsdl+xml wsdl +application/wspolicy+xml wspolicy +application/x-123 wk +application/x-abiword abw +application/x-ace-compressed ace +application/x-apple-diskimage dmg +application/x-authorware-bin aab u32 vox x32 +application/x-authorware-map aam +application/x-authorware-seg aas +application/x-bcpio bcpio +application/x-bittorrent torrent +application/x-bzip bz +application/x-bzip2 boz bz2 +application/x-cdf cdf +application/x-cdlink vcd +application/x-chat chat +application/x-chess-pgn pgn +application/x-compress +application/x-cpio cpio +application/x-csh csh +application/x-debian-package deb udeb +application/x-director cct cst cxt dcr dir dxr fgd swa w3d +application/x-dms dms +application/x-doom wad +application/x-dtbncx+xml ncx +application/x-dtbook+xml dtb +application/x-dtbresource+xml res +application/x-dvi dvi +application/x-flac flac +application/x-font gsf pcf pcf.Z pfa pfb +application/x-font-bdf bdf +application/x-font-dos +application/x-font-framemaker +application/x-font-ghostscript gsf +application/x-font-libgrx +application/x-font-linux-psf psf +application/x-font-otf otf +application/x-font-pcf pcf +application/x-font-snf snf +application/x-font-speedo +application/x-font-sunos-news +application/x-font-ttf ttc ttf +application/x-font-type1 afm pfa pfb pfm +application/x-font-vfont +application/x-freemind mm +application/x-futuresplash spl +application/x-gnumeric gnumeric +application/x-go-sgf sgf +application/x-graphing-calculator gcf +application/x-gtar gtar taz tgz +application/x-gzip +application/x-hdf hdf +application/x-ica ica +application/x-internet-signup ins isp +application/x-iphone iii +application/x-iso9660-image iso +application/x-java-jnlp-file jnlp +application/x-javascript js +application/x-jmol jmz +application/x-kchart chrt +application/x-killustrator kil +application/x-koan skd skm skp skt +application/x-kpresenter kpr kpt +application/x-kspread ksp +application/x-kword kwd kwt +application/x-latex latex +application/x-lha lha +application/x-lzh lzh +application/x-lzx lzx +application/x-maker book fb fbdoc fm frame frm maker +application/x-mif mif +application/x-mobipocket-ebook mobi prc +application/x-ms-application application +application/x-ms-wmd wmd +application/x-ms-wmz wmz +application/x-ms-xbap xbap +application/x-msaccess mdb +application/x-msbinder obd +application/x-mscardfile crd +application/x-msclip clp +application/x-msdos-program bat com dll exe +application/x-msdownload bat com dll exe msi +application/x-msi msi +application/x-msmediaview m13 m14 mvb +application/x-msmetafile wmf +application/x-msmoney mny +application/x-mspublisher pub +application/x-msschedule scd +application/x-msterminal trm +application/x-mswrite wri +application/x-netcdf cdf nc +application/x-ns-proxy-autoconfig pac +application/x-nwc nwc +application/x-object o +application/x-oz-application oza +application/x-pkcs12 p12 pfx +application/x-pkcs7-certificates p7b spc +application/x-pkcs7-certreqresp p7r +application/x-pkcs7-crl crl +application/x-python-code pyc pyo +application/x-quicktimeplayer qtl +application/x-rar-compressed rar +application/x-redhat-package-manager rpm +application/x-sh sh +application/x-shar shar +application/x-shockwave-flash swf swfl +application/x-silverlight-app xap +application/x-stuffit sit sitx +application/x-stuffitx sitx +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-tar tar +application/x-tcl tcl +application/x-tex tex +application/x-tex-gf gf +application/x-tex-pk pk +application/x-tex-tfm tfm +application/x-texinfo texi texinfo +application/x-trash % bak old sik ~ +application/x-troff roff t tr +application/x-troff-man man +application/x-troff-me me +application/x-troff-ms ms +application/x-ustar ustar +application/x-wais-source src +application/x-wingz wz +application/x-x509-ca-cert crt der +application/x-xcf xcf +application/x-xfig fig +application/x-xpinstall xpi +application/x400-bp +application/xcap-att+xml +application/xcap-caps+xml +application/xcap-el+xml +application/xcap-error+xml +application/xcap-ns+xml +application/xcon-conference-info+xml +application/xcon-conference-info-diff+xml +application/xenc+xml xenc +application/xhtml+xml xht xhtml +application/xhtml-voice+xml +application/xml xml xsl +application/xml-dtd dtd +application/xml-external-parsed-entity +application/xmpp+xml +application/xop+xml xop +application/xslt+xml xslt +application/xspf+xml xspf +application/xv+xml mxml xhvml xvm xvml +application/zip zip +audio/32kadpcm +audio/3gpp +audio/3gpp2 +audio/ac3 +audio/adpcm adp +audio/amr +audio/amr-wb +audio/amr-wb+ +audio/asc +audio/basic au snd +audio/bv16 +audio/bv32 +audio/clearmode +audio/cn +audio/dat12 +audio/dls +audio/dsr-es201108 +audio/dsr-es202050 +audio/dsr-es202211 +audio/dsr-es202212 +audio/dvi4 +audio/eac3 +audio/evrc +audio/evrc-qcp +audio/evrc0 +audio/evrc1 +audio/evrcb +audio/evrcb0 +audio/evrcb1 +audio/evrcwb +audio/evrcwb0 +audio/evrcwb1 +audio/example +audio/g719 +audio/g722 +audio/g7221 +audio/g723 +audio/g726-16 +audio/g726-24 +audio/g726-32 +audio/g726-40 +audio/g728 +audio/g729 +audio/g7291 +audio/g729d +audio/g729e +audio/gsm +audio/gsm-efr +audio/ilbc +audio/l16 +audio/l20 +audio/l24 +audio/l8 +audio/lpc +audio/midi kar mid midi rmi +audio/mobile-xmf +audio/mp4 mp4a +audio/mp4a-latm +audio/mpa +audio/mpa-robust +audio/mpeg m2a m3a m4a mp2 mp2a mp3 mpega mpga +audio/mpeg4-generic +audio/mpegurl m3u +audio/ogg oga ogg spx +audio/parityfec +audio/pcma +audio/pcma-wb +audio/pcmu +audio/pcmu-wb +audio/prs.sid sid +audio/qcelp +audio/red +audio/rtp-enc-aescm128 +audio/rtp-midi +audio/rtx +audio/smv +audio/smv-qcp +audio/smv0 +audio/sp-midi +audio/t140c +audio/t38 +audio/telephone-event +audio/tone +audio/ulpfec +audio/vdvi +audio/vmr-wb +audio/vnd.3gpp.iufp +audio/vnd.4sb +audio/vnd.audiokoz +audio/vnd.celp +audio/vnd.cisco.nse +audio/vnd.cmles.radio-events +audio/vnd.cns.anp1 +audio/vnd.cns.inf1 +audio/vnd.digital-winds eol +audio/vnd.dlna.adts +audio/vnd.dolby.heaac.1 +audio/vnd.dolby.heaac.2 +audio/vnd.dolby.mlp +audio/vnd.dolby.mps +audio/vnd.dolby.pl2 +audio/vnd.dolby.pl2x +audio/vnd.dolby.pl2z +audio/vnd.dts dts +audio/vnd.dts.hd dtshd +audio/vnd.everad.plj +audio/vnd.hns.audio +audio/vnd.lucent.voice lvp +audio/vnd.ms-playready.media.pya pya +audio/vnd.nokia.mobile-xmf +audio/vnd.nortel.vbk +audio/vnd.nuera.ecelp4800 ecelp4800 +audio/vnd.nuera.ecelp7470 ecelp7470 +audio/vnd.nuera.ecelp9600 ecelp9600 +audio/vnd.octel.sbc +audio/vnd.qcelp +audio/vnd.rhetorex.32kadpcm +audio/vnd.sealedmedia.softseal.mpeg +audio/vnd.vmx.cvsd +audio/vorbis +audio/vorbis-config +audio/x-aac aac +audio/x-aiff aif aifc aiff +audio/x-gsm gsm +audio/x-mpegurl m3u +audio/x-ms-wax wax +audio/x-ms-wma wma +audio/x-pn-realaudio ra ram rm +audio/x-pn-realaudio-plugin rmp +audio/x-realaudio ra +audio/x-scpls pls +audio/x-sd2 sd2 +audio/x-wav wav +chemical/x-alchemy alc +chemical/x-cache cac cache +chemical/x-cache-csf csf +chemical/x-cactvs-binary cascii cbin ctab +chemical/x-cdx cdx +chemical/x-cerius cer +chemical/x-chem3d c3d +chemical/x-chemdraw chm +chemical/x-cif cif +chemical/x-cmdf cmdf +chemical/x-cml cml +chemical/x-compass cpa +chemical/x-crossfire bsd +chemical/x-csml csm csml +chemical/x-ctx ctx +chemical/x-cxf cef cxf +chemical/x-embl-dl-nucleotide emb embl +chemical/x-galactic-spc spc +chemical/x-gamess-input gam gamin inp +chemical/x-gaussian-checkpoint fch fchk +chemical/x-gaussian-cube cub +chemical/x-gaussian-input gau gjc gjf +chemical/x-gaussian-log gal +chemical/x-gcg8-sequence gcg +chemical/x-genbank gen +chemical/x-hin hin +chemical/x-isostar ist istr +chemical/x-jcamp-dx dx jdx +chemical/x-kinemage kin +chemical/x-macmolecule mcm +chemical/x-macromodel-input mmd mmod +chemical/x-mdl-molfile mol +chemical/x-mdl-rdfile rd +chemical/x-mdl-rxnfile rxn +chemical/x-mdl-sdfile sd sdf +chemical/x-mdl-tgf tgf +chemical/x-mmcif mcif +chemical/x-mol2 mol2 +chemical/x-molconn-Z b +chemical/x-mopac-graph gpt +chemical/x-mopac-input dat mop mopcrt mpc zmt +chemical/x-mopac-out moo +chemical/x-mopac-vib mvb +chemical/x-ncbi-asn1 asn +chemical/x-ncbi-asn1-ascii ent prt +chemical/x-ncbi-asn1-binary aso val +chemical/x-ncbi-asn1-spec asn +chemical/x-pdb ent pdb +chemical/x-rosdal ros +chemical/x-swissprot sw +chemical/x-vamas-iso14976 vms +chemical/x-vmd vmd +chemical/x-xtel xtel +chemical/x-xyz xyz +image/bmp bmp +image/cgm cgm +image/example +image/fits +image/g3fax g3 +image/gif gif +image/ief ief +image/jp2 +image/jpeg jpe jpeg jpg +image/jpm +image/jpx +image/naplps +image/pcx pcx +image/png png +image/prs.btif btif +image/prs.pti +image/svg+xml svg svgz +image/t38 +image/tiff tif tiff +image/tiff-fx +image/vnd.adobe.photoshop psd +image/vnd.cns.inf2 +image/vnd.djvu djv djvu +image/vnd.dwg dwg +image/vnd.dxf dxf +image/vnd.fastbidsheet fbs +image/vnd.fpx fpx +image/vnd.fst fst +image/vnd.fujixerox.edmics-mmr mmr +image/vnd.fujixerox.edmics-rlc rlc +image/vnd.globalgraphics.pgb +image/vnd.microsoft.icon +image/vnd.mix +image/vnd.ms-modi mdi +image/vnd.net-fpx npx +image/vnd.radiance +image/vnd.sealed.png +image/vnd.sealedmedia.softseal.gif +image/vnd.sealedmedia.softseal.jpg +image/vnd.svf +image/vnd.wap.wbmp wbmp +image/vnd.xiff xif +image/x-cmu-raster ras +image/x-cmx cmx +image/x-coreldraw cdr +image/x-coreldrawpattern pat +image/x-coreldrawtemplate cdt +image/x-corelphotopaint cpt +image/x-freehand fh fh4 fh5 fh7 fhc +image/x-icon ico +image/x-jg art +image/x-jng jng +image/x-ms-bmp bmp +image/x-pcx pcx +image/x-photoshop psd +image/x-pict pct pic +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd +message/cpim +message/delivery-status +message/disposition-notification +message/example +message/external-body +message/global +message/global-delivery-status +message/global-disposition-notification +message/global-headers +message/http +message/imdn+xml +message/news +message/partial +message/rfc822 eml mime +message/s-http +message/sip +message/sipfrag +message/tracking-status +message/vnd.si.simp +model/example +model/iges iges igs +model/mesh mesh msh silo +model/vnd.dwf dwf +model/vnd.flatland.3dml +model/vnd.gdl gdl +model/vnd.gs-gdl +model/vnd.gs.gdl +model/vnd.gtw gtw +model/vnd.moml+xml +model/vnd.mts mts +model/vnd.parasolid.transmit.binary +model/vnd.parasolid.transmit.text +model/vnd.vtu vtu +model/vrml vrml wrl +multipart/alternative +multipart/appledouble +multipart/byteranges +multipart/digest +multipart/encrypted +multipart/example +multipart/form-data +multipart/header-set +multipart/mixed +multipart/parallel +multipart/related +multipart/report +multipart/signed +multipart/voice-message +text/calendar ics icz ifb +text/comma-separated-values csv +text/css css +text/csv csv +text/directory +text/dns +text/ecmascript +text/enriched +text/example +text/h323 323 +text/html htm html shtml +text/iuls uls +text/javascript +text/mathml mml +text/parityfec +text/plain asc conf def diff in list log pot text txt +text/prs.fallenstein.rst +text/prs.lines.tag dsc +text/red +text/rfc822-headers +text/richtext rtx +text/rtf rtf +text/rtp-enc-aescm128 +text/rtx +text/scriptlet sct wsc +text/sgml sgm sgml +text/t140 +text/tab-separated-values tsv +text/texmacs tm ts +text/troff man me ms roff t tr +text/ulpfec +text/uri-list uri uris urls +text/vnd.abc +text/vnd.curl curl +text/vnd.curl.dcurl dcurl +text/vnd.curl.mcurl mcurl +text/vnd.curl.scurl scurl +text/vnd.dmclientscript +text/vnd.esmertec.theme-descriptor +text/vnd.fly fly +text/vnd.fmi.flexstor flx +text/vnd.graphviz gv +text/vnd.in3d.3dml 3dml +text/vnd.in3d.spot spot +text/vnd.iptc.newsml +text/vnd.iptc.nitf +text/vnd.latex-z +text/vnd.motorola.reflex +text/vnd.ms-mediapackage +text/vnd.net2phone.commcenter.command +text/vnd.si.uricatalogue +text/vnd.sun.j2me.app-descriptor jad +text/vnd.trolltech.linguist +text/vnd.wap.si +text/vnd.wap.sl +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/x-asm asm s +text/x-bibtex bib +text/x-c c cc cpp cxx dic h hh +text/x-c++hdr h++ hh hpp hxx +text/x-c++src c++ cc cpp cxx +text/x-chdr h +text/x-csh csh +text/x-csrc c +text/x-fortran f f77 f90 for +text/x-haskell hs +text/x-java java +text/x-java-source java +text/x-literate-haskell lhs +text/x-moc moc +text/x-pascal p pas +text/x-pcs-gcd gcd +text/x-perl pl pm +text/x-psp psp +text/x-python py +text/x-setext etx +text/x-sh sh +text/x-tcl tcl tk +text/x-tex cls ltx sty tex +text/x-uuencode uu +text/x-vcalendar vcs +text/x-vcard vcf +text/xml +text/xml-external-parsed-entity +video/3gpp 3gp +video/3gpp-tt +video/3gpp2 3g2 +video/bmpeg +video/bt656 +video/celb +video/dl dl +video/dv dif dv +video/example +video/fli fli +video/gl gl +video/h261 h261 +video/h263 h263 +video/h263-1998 +video/h263-2000 +video/h264 h264 +video/jpeg jpgv +video/jpeg2000 +video/jpm jpgm jpm +video/mj2 mj2 mjp2 +video/mp1s +video/mp2p +video/mp2t +video/mp4 mp4 mp4v mpg4 +video/mp4v-es +video/mpeg m1v m2v mpe mpeg mpg +video/mpeg4-generic +video/mpv +video/nv +video/ogg ogv +video/parityfec +video/pointer +video/quicktime mov qt +video/raw +video/rtp-enc-aescm128 +video/rtx +video/smpte292m +video/ulpfec +video/vc1 +video/vnd.cctv +video/vnd.dlna.mpeg-tts +video/vnd.fvt fvt +video/vnd.hns.video +video/vnd.iptvforum.1dparityfec-1010 +video/vnd.iptvforum.1dparityfec-2005 +video/vnd.iptvforum.2dparityfec-1010 +video/vnd.iptvforum.2dparityfec-2005 +video/vnd.iptvforum.ttsavc +video/vnd.iptvforum.ttsmpeg2 +video/vnd.motorola.video +video/vnd.motorola.videop +video/vnd.mpegurl m4u mxu +video/vnd.ms-playready.media.pyv pyv +video/vnd.nokia.interleaved-multimedia +video/vnd.nokia.videovoip +video/vnd.objectvideo +video/vnd.sealed.mpeg1 +video/vnd.sealed.mpeg4 +video/vnd.sealed.swf +video/vnd.sealedmedia.softseal.mov +video/vnd.vivo viv +video/x-f4v f4v +video/x-fli fli +video/x-flv flv +video/x-la-asf lsf lsx +video/x-m4v m4v +video/x-mng mng +video/x-ms-asf asf asx +video/x-ms-wm wm +video/x-ms-wmv wmv +video/x-ms-wmx wmx +video/x-ms-wvx wvx +video/x-msvideo avi +video/x-sgi-movie movie +x-conference/x-cooltalk ice +x-world/x-vrml vrm vrml wrl + + + +## calibre specific mime types + +text/fb2+xml fb2 +text/x-sony-bbeb+xml lrs +application/x-sony-bbeb lrf lrx +application/adobe-page-template+xml xpgt +application/x-font-opentype otf +application/x-font-truetype ttf +application/x-mobipocket-ebook mobi prc azw +application/x-cbz cbz +application/x-cbr cbr +application/x-cb7 cb7 +application/x-koboreader-ebook kobo +image/wmf wmf diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index 688d7793a4..096a02854f 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -3,7 +3,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import uuid, sys, os, re, logging, time, mimetypes, \ +import uuid, sys, os, re, logging, time, \ __builtin__, warnings, multiprocessing from urllib import getproxies __builtin__.__dict__['dynamic_property'] = lambda(func): func(None) @@ -19,43 +19,16 @@ from calibre.constants import iswindows, isosx, islinux, isfreebsd, isfrozen, \ __appname__, __version__, __author__, \ win32event, win32api, winerror, fcntl, \ filesystem_encoding, plugins, config_dir -from calibre.startup import winutil, winutilerror +from calibre.startup import winutil, winutilerror, guess_type uuid.uuid4() # Imported before PyQt4 to workaround PyQt4 util-linux conflict on gentoo if False: + # Prevent pyflakes from complaining winutil, winutilerror, __appname__, islinux, __version__ fcntl, win32event, isfrozen, __author__, terminal_controller - winerror, win32api, isfreebsd + winerror, win32api, isfreebsd, guess_type -mimetypes.add_type('application/epub+zip', '.epub') -mimetypes.add_type('text/x-sony-bbeb+xml', '.lrs') -mimetypes.add_type('application/xhtml+xml', '.xhtml') -mimetypes.add_type('image/svg+xml', '.svg') -mimetypes.add_type('text/fb2+xml', '.fb2') -mimetypes.add_type('application/x-sony-bbeb', '.lrf') -mimetypes.add_type('application/x-sony-bbeb', '.lrx') -mimetypes.add_type('application/x-dtbncx+xml', '.ncx') -mimetypes.add_type('application/adobe-page-template+xml', '.xpgt') -mimetypes.add_type('application/x-font-opentype', '.otf') -mimetypes.add_type('application/x-font-truetype', '.ttf') -mimetypes.add_type('application/oebps-package+xml', '.opf') -mimetypes.add_type('application/vnd.palm', '.pdb') -mimetypes.add_type('application/x-mobipocket-ebook', '.mobi') -mimetypes.add_type('application/x-mobipocket-ebook', '.prc') -mimetypes.add_type('application/x-mobipocket-ebook', '.azw') -mimetypes.add_type('application/x-cbz', '.cbz') -mimetypes.add_type('application/x-cbr', '.cbr') -mimetypes.add_type('application/x-koboreader-ebook', '.kobo') -mimetypes.add_type('image/wmf', '.wmf') -mimetypes.add_type('image/jpeg', '.jpg') -mimetypes.add_type('image/jpeg', '.jpeg') -mimetypes.add_type('image/png', '.png') -mimetypes.add_type('image/gif', '.gif') -mimetypes.add_type('image/bmp', '.bmp') -mimetypes.add_type('image/svg+xml', '.svg') - -guess_type = mimetypes.guess_type import cssutils cssutils.log.setLevel(logging.WARN) diff --git a/src/calibre/startup.py b/src/calibre/startup.py index e74660d0bc..9c9c7651b7 100644 --- a/src/calibre/startup.py +++ b/src/calibre/startup.py @@ -199,6 +199,11 @@ if not _run_once: __builtin__.__dict__['lopen'] = local_open + + import mimetypes + mimetypes.init([P('mime.types')]) + guess_type = mimetypes.guess_type + def test_lopen(): from calibre.ptempfile import TemporaryDirectory from calibre import CurrentDir From 788138cd97cf4cc44f33748e377311e183e581b5 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 30 Nov 2010 14:40:31 -0700 Subject: [PATCH 23/24] ... --- setup/installer/linux/freeze2.py | 2 ++ src/calibre/__init__.py | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/setup/installer/linux/freeze2.py b/setup/installer/linux/freeze2.py index 0379c0d839..684b33b80d 100644 --- a/setup/installer/linux/freeze2.py +++ b/setup/installer/linux/freeze2.py @@ -340,6 +340,8 @@ class LinuxFreeze(Command): __builtin__.help = _Helper() def set_qt_plugin_path(): + import uuid + uuid.uuid4() # Workaround for libuuid/PyQt conflict from PyQt4.Qt import QCoreApplication paths = list(map(unicode, QCoreApplication.libraryPaths())) paths.insert(0, sys.frozen_path + '/lib/qt_plugins') diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index 096a02854f..a8cbe87e3e 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -21,7 +21,9 @@ from calibre.constants import iswindows, isosx, islinux, isfreebsd, isfrozen, \ filesystem_encoding, plugins, config_dir from calibre.startup import winutil, winutilerror, guess_type -uuid.uuid4() # Imported before PyQt4 to workaround PyQt4 util-linux conflict on gentoo +if islinux and not getattr(sys, 'frozen', False): + # Imported before PyQt4 to workaround PyQt4 util-linux conflict on gentoo + uuid.uuid4() if False: # Prevent pyflakes from complaining From 065edc6a1f8680f2c7bc5f2c851cd4a1a1fbfff4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 30 Nov 2010 15:38:40 -0700 Subject: [PATCH 24/24] Fix #7751 (Does not detect after 2.2 upgrade on Android) --- src/calibre/devices/android/driver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/devices/android/driver.py b/src/calibre/devices/android/driver.py index 2d944c8519..811acbe55b 100644 --- a/src/calibre/devices/android/driver.py +++ b/src/calibre/devices/android/driver.py @@ -19,7 +19,7 @@ class ANDROID(USBMS): VENDOR_ID = { # HTC - 0x0bb4 : { 0x0c02 : [0x100, 0x0227], 0x0c01 : [0x100, 0x0227], 0x0ff9 + 0x0bb4 : { 0x0c02 : [0x100, 0x0227, 0x0226], 0x0c01 : [0x100, 0x0227], 0x0ff9 : [0x0100, 0x0227, 0x0226], 0x0c87: [0x0100, 0x0227, 0x0226], 0xc92 : [0x100]},