Wed, 01 Aug 2018 19:43:34 +0200
Merged with the default branch to prepare the 18.08 release.
--- a/APIs/Python3/eric6.api Sat Jul 07 12:01:23 2018 +0200 +++ b/APIs/Python3/eric6.api Wed Aug 01 19:43:34 2018 +0200 @@ -431,6 +431,7 @@ eric6.Debugger.DebugServer.DebugServer.getWatchPointModel?4() eric6.Debugger.DebugServer.DebugServer.isClientProcessUp?4() eric6.Debugger.DebugServer.DebugServer.isConnected?4() +eric6.Debugger.DebugServer.DebugServer.isDebugging?4() eric6.Debugger.DebugServer.DebugServer.passiveDebugStarted?7 eric6.Debugger.DebugServer.DebugServer.passiveStartUp?4(fn, exc) eric6.Debugger.DebugServer.DebugServer.preferencesChanged?4() @@ -461,6 +462,7 @@ eric6.Debugger.DebugServer.DebugServer.remoteUTRun?4() eric6.Debugger.DebugServer.DebugServer.remoteUTStop?4() eric6.Debugger.DebugServer.DebugServer.setCallTraceEnabled?4(on) +eric6.Debugger.DebugServer.DebugServer.setDebugging?4(on) eric6.Debugger.DebugServer.DebugServer.shutdownServer?4() eric6.Debugger.DebugServer.DebugServer.signalClientBanner?4(version, platform, debugClient) eric6.Debugger.DebugServer.DebugServer.signalClientBreakConditionError?4(filename, lineno) @@ -526,13 +528,10 @@ eric6.Debugger.DebugViewer.DebugViewer.currentWidget?4() eric6.Debugger.DebugViewer.DebugViewer.handleClientStack?4(stack) eric6.Debugger.DebugViewer.DebugViewer.handleDebuggingStarted?4() -eric6.Debugger.DebugViewer.DebugViewer.handleRawInput?4() eric6.Debugger.DebugViewer.DebugViewer.handleResetUI?4() eric6.Debugger.DebugViewer.DebugViewer.initCallStackViewer?4(projectMode) eric6.Debugger.DebugViewer.DebugViewer.isCallTraceEnabled?4() eric6.Debugger.DebugViewer.DebugViewer.preferencesChanged?4() -eric6.Debugger.DebugViewer.DebugViewer.restoreCurrentPage?4() -eric6.Debugger.DebugViewer.DebugViewer.saveCurrentPage?4() eric6.Debugger.DebugViewer.DebugViewer.setCallTraceToProjectMode?4(enabled) eric6.Debugger.DebugViewer.DebugViewer.setCurrentWidget?4(widget) eric6.Debugger.DebugViewer.DebugViewer.setDebugger?4(debugUI) @@ -544,7 +543,7 @@ eric6.Debugger.DebugViewer.DebugViewer.showVariables?4(vlist, showGlobals) eric6.Debugger.DebugViewer.DebugViewer.showVariablesTab?4(showGlobals) eric6.Debugger.DebugViewer.DebugViewer.sourceFile?7 -eric6.Debugger.DebugViewer.DebugViewer?1(debugServer, docked, vm, parent=None, embeddedShell=True, embeddedBrowser=True) +eric6.Debugger.DebugViewer.DebugViewer?1(debugServer, docked, vm, parent=None) eric6.Debugger.DebuggerInterfaceNone.ClientDefaultCapabilities?7 eric6.Debugger.DebuggerInterfaceNone.ClientTypeAssociations?7 eric6.Debugger.DebuggerInterfaceNone.DebuggerInterfaceNone.flush?4() @@ -971,8 +970,9 @@ eric6.E5Gui.E5LineEditButton.E5LineEditButton.setMenu?4(menu) eric6.E5Gui.E5LineEditButton.E5LineEditButton?1(parent=None) eric6.E5Gui.E5ListSelectionDialog.E5ListSelectionDialog.getSelection?4() +eric6.E5Gui.E5ListSelectionDialog.E5ListSelectionDialog.on_selectionList_itemChanged?4(itm) eric6.E5Gui.E5ListSelectionDialog.E5ListSelectionDialog.on_selectionList_itemSelectionChanged?4() -eric6.E5Gui.E5ListSelectionDialog.E5ListSelectionDialog?1(entries, selectionMode=QAbstractItemView.ExtendedSelection, title="", message="", parent=None) +eric6.E5Gui.E5ListSelectionDialog.E5ListSelectionDialog?1(entries, selectionMode=QAbstractItemView.ExtendedSelection, title="", message="", checkBoxSelection=False, parent=None) eric6.E5Gui.E5ListView.E5ListView.keyPressEvent?4(evt) eric6.E5Gui.E5ListView.E5ListView.removeAll?4() eric6.E5Gui.E5ListView.E5ListView.removeSelected?4() @@ -1170,6 +1170,15 @@ eric6.E5Gui.E5PathPicker.E5PathPickerModes.SaveFileEnsureExtensionMode?7 eric6.E5Gui.E5PathPicker.E5PathPickerModes.SaveFileMode?7 eric6.E5Gui.E5PathPicker.E5PathPickerModes.SaveFileOverwriteMode?7 +eric6.E5Gui.E5PathPickerDialog.E5PathPickerDialog.getPath?4() +eric6.E5Gui.E5PathPickerDialog.E5PathPickerDialog.setDefaultDirectory?4(directory) +eric6.E5Gui.E5PathPickerDialog.E5PathPickerDialog.setLabelText?4(text) +eric6.E5Gui.E5PathPickerDialog.E5PathPickerDialog.setPickerFilters?4(filters) +eric6.E5Gui.E5PathPickerDialog.E5PathPickerDialog.setPickerMode?4(mode) +eric6.E5Gui.E5PathPickerDialog.E5PathPickerDialog.setPickerPath?4(path) +eric6.E5Gui.E5PathPickerDialog.E5PathPickerDialog.setTitle?4(title) +eric6.E5Gui.E5PathPickerDialog.E5PathPickerDialog?1(parent=None) +eric6.E5Gui.E5PathPickerDialog.getPath?4(parent, title, label, mode=E5PathPickerModes.OpenFileMode, path="", defaultDirectory="", filters=None) eric6.E5Gui.E5ProgressDialog.E5ProgressDialog.format?4() eric6.E5Gui.E5ProgressDialog.E5ProgressDialog.setFormat?4(labelFormat) eric6.E5Gui.E5ProgressDialog.E5ProgressDialog?1(labelText, cancelButtonText, minimum, maximum, labelFormat=None, parent=None, flags=None) @@ -1573,6 +1582,7 @@ eric6.E5XML.Config.pluginRepositoryFileFormatVersion?7 eric6.E5XML.Config.projectFileFormatVersion?7 eric6.E5XML.Config.projectFileFormatVersionAlt?7 +eric6.E5XML.Config.projectFileFormatVersionMake?7 eric6.E5XML.Config.projectFileFormatVersionProto?7 eric6.E5XML.Config.sessionFileFormatVersion?7 eric6.E5XML.Config.shortcutsFileFormatVersion?7 @@ -1623,7 +1633,7 @@ eric6.E5XML.TasksWriter.TasksWriter?1(device, forProject=False, projectName="") eric6.E5XML.TemplatesReader.TemplatesReader.readXML?4() eric6.E5XML.TemplatesReader.TemplatesReader.supportedVersions?7 -eric6.E5XML.TemplatesReader.TemplatesReader?1(device, viewer=None) +eric6.E5XML.TemplatesReader.TemplatesReader?1(device, viewer) eric6.E5XML.TemplatesWriter.TemplatesWriter.writeXML?4() eric6.E5XML.TemplatesWriter.TemplatesWriter?1(device, templatesViewer) eric6.E5XML.UserProjectReader.UserProjectReader.readXML?4() @@ -4963,6 +4973,12 @@ eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.GoogleV2Engine.GoogleV2Engine.getTranslation?4(requestObject, text, originalLanguage, translationLanguage) eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.GoogleV2Engine.GoogleV2Engine.supportedLanguages?4() eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.GoogleV2Engine.GoogleV2Engine?1(plugin, parent=None) +eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.IbmWatsonEngine.IbmWatsonEngine.engineName?4() +eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.IbmWatsonEngine.IbmWatsonEngine.getTranslation?4(requestObject, text, originalLanguage, translationLanguage) +eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.IbmWatsonEngine.IbmWatsonEngine.hasTTS?4() +eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.IbmWatsonEngine.IbmWatsonEngine.supportedLanguages?4() +eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.IbmWatsonEngine.IbmWatsonEngine.supportedTargetLanguages?4(original) +eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.IbmWatsonEngine.IbmWatsonEngine?1(plugin, parent=None) eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.MicrosoftEngine.MicrosoftEngine.AccessTokenUrl?7 eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.MicrosoftEngine.MicrosoftEngine.TextToSpeechUrl?7 eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.MicrosoftEngine.MicrosoftEngine.TranslatorUrl?7 @@ -4983,11 +4999,13 @@ eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.PromtEngine.PromtEngine.getTranslation?4(requestObject, text, originalLanguage, translationLanguage) eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.PromtEngine.PromtEngine.supportedLanguages?4() eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.PromtEngine.PromtEngine?1(plugin, parent=None) +eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.TranslationEngine.TranslationEngine.availableTranslationsLoaded?7 eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.TranslationEngine.TranslationEngine.engineName?4() eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.TranslationEngine.TranslationEngine.getTextToSpeechData?4(requestObject, text, language) eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.TranslationEngine.TranslationEngine.getTranslation?4(requestObject, text, originalLanguage, translationLanguage) eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.TranslationEngine.TranslationEngine.hasTTS?4() eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.TranslationEngine.TranslationEngine.supportedLanguages?4() +eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.TranslationEngine.TranslationEngine.supportedTargetLanguages?4(original) eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.TranslationEngine.TranslationEngine?1(plugin, parent=None) eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.YandexEngine.YandexEngine.TranslatorLimit?7 eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.YandexEngine.YandexEngine.TranslatorUrl?7 @@ -7657,7 +7675,6 @@ eric6.Preferences.getTrayStarter?4(key, prefClass=Prefs) eric6.Preferences.getUI?4(key, prefClass=Prefs) eric6.Preferences.getUILanguage?4(prefClass=Prefs) -eric6.Preferences.getUILayout?4(prefClass=Prefs) eric6.Preferences.getUser?4(key, prefClass=Prefs) eric6.Preferences.getVCS?4(key, prefClass=Prefs) eric6.Preferences.getVarFilters?4(prefClass=Prefs) @@ -7710,7 +7727,6 @@ eric6.Preferences.setTrayStarter?4(key, value, prefClass=Prefs) eric6.Preferences.setUI?4(key, value, prefClass=Prefs) eric6.Preferences.setUILanguage?4(lang, prefClass=Prefs) -eric6.Preferences.setUILayout?4(layout, prefClass=Prefs) eric6.Preferences.setUser?4(key, value, prefClass=Prefs) eric6.Preferences.setVCS?4(key, value, prefClass=Prefs) eric6.Preferences.setVarFilters?4(filters, prefClass=Prefs) @@ -7761,6 +7777,23 @@ eric6.Project.FiletypeAssociationDialog.FiletypeAssociationDialog.on_filetypeAssociationList_currentItemChanged?4(itm, prevItm) eric6.Project.FiletypeAssociationDialog.FiletypeAssociationDialog.transferData?4() eric6.Project.FiletypeAssociationDialog.FiletypeAssociationDialog?1(project, parent=None) +eric6.Project.IdlCompilerDefineNameDialog.IdlCompilerDefineNameDialog.getData?4() +eric6.Project.IdlCompilerDefineNameDialog.IdlCompilerDefineNameDialog.on_nameEdit_textChanged?4(txt) +eric6.Project.IdlCompilerDefineNameDialog.IdlCompilerDefineNameDialog?1(name="", value="", parent=None) +eric6.Project.IdlCompilerOptionsDialog.IdlCompilerOptionsDialog.getData?4() +eric6.Project.IdlCompilerOptionsDialog.IdlCompilerOptionsDialog.on_dnAddButton_clicked?4() +eric6.Project.IdlCompilerOptionsDialog.IdlCompilerOptionsDialog.on_dnDeleteButton_clicked?4() +eric6.Project.IdlCompilerOptionsDialog.IdlCompilerOptionsDialog.on_dnEditButton_clicked?4() +eric6.Project.IdlCompilerOptionsDialog.IdlCompilerOptionsDialog.on_dnList_itemSelectionChanged?4() +eric6.Project.IdlCompilerOptionsDialog.IdlCompilerOptionsDialog.on_idAddButton_clicked?4() +eric6.Project.IdlCompilerOptionsDialog.IdlCompilerOptionsDialog.on_idDeleteButton_clicked?4() +eric6.Project.IdlCompilerOptionsDialog.IdlCompilerOptionsDialog.on_idEditButton_clicked?4() +eric6.Project.IdlCompilerOptionsDialog.IdlCompilerOptionsDialog.on_idList_itemSelectionChanged?4() +eric6.Project.IdlCompilerOptionsDialog.IdlCompilerOptionsDialog.on_unAddButton_clicked?4() +eric6.Project.IdlCompilerOptionsDialog.IdlCompilerOptionsDialog.on_unDeleteButton_clicked?4() +eric6.Project.IdlCompilerOptionsDialog.IdlCompilerOptionsDialog.on_unEditButton_clicked?4() +eric6.Project.IdlCompilerOptionsDialog.IdlCompilerOptionsDialog.on_unList_itemSelectionChanged?4() +eric6.Project.IdlCompilerOptionsDialog.IdlCompilerOptionsDialog?1(includeDirectories, definedNames, undefinedNames, project=None, parent=None) eric6.Project.LexerAssociationDialog.LexerAssociationDialog.on_addLexerButton_clicked?4() eric6.Project.LexerAssociationDialog.LexerAssociationDialog.on_deleteLexerButton_clicked?4() eric6.Project.LexerAssociationDialog.LexerAssociationDialog.on_editorLexerCombo_currentIndexChanged?4(text) @@ -7860,6 +7893,7 @@ eric6.Project.Project.Project.getVcs?4() eric6.Project.Project.Project.handleApplicationDiagram?4() eric6.Project.Project.Project.handlePreferencesChanged?4() +eric6.Project.Project.Project.hasDefaultIdlCompilerParameters?4() eric6.Project.Project.Project.hasDefaultMakeParameters?4() eric6.Project.Project.Project.hasEntry?4(fn) eric6.Project.Project.Project.hasProjectType?4(type_, progLanguage="") @@ -7998,8 +8032,7 @@ eric6.Project.ProjectBrowser.ProjectBrowser.handleEditorChanged?4(fn) eric6.Project.ProjectBrowser.ProjectBrowser.handleEditorLineChanged?4(fn, lineno) eric6.Project.ProjectBrowser.ProjectBrowser.handlePreferencesChanged?4() -eric6.Project.ProjectBrowser.ProjectBrowser.showEvent?4(evt) -eric6.Project.ProjectBrowser.ProjectBrowser?1(project, parent=None, embeddedBrowser=True) +eric6.Project.ProjectBrowser.ProjectBrowser?1(project, parent=None) eric6.Project.ProjectBrowserFlags.AllBrowsersFlag?7 eric6.Project.ProjectBrowserFlags.FormsBrowserFlag?7 eric6.Project.ProjectBrowserFlags.InterfacesBrowserFlag?7 @@ -9900,6 +9933,7 @@ eric6.UI.UserInterface.UserInterface.dropEvent?4(event) eric6.UI.UserInterface.UserInterface.getActions?4(actionType) eric6.UI.UserInterface.UserInterface.getHelpViewer?4(preview=False) +eric6.UI.UserInterface.UserInterface.getLayoutType?4() eric6.UI.UserInterface.UserInterface.getLocale?4() eric6.UI.UserInterface.UserInterface.getMenu?4(name) eric6.UI.UserInterface.UserInterface.getMenuAction?4(menuName, actionName)
--- a/APIs/Python3/eric6.bas Sat Jul 07 12:01:23 2018 +0200 +++ b/APIs/Python3/eric6.bas Wed Aug 01 19:43:34 2018 +0200 @@ -194,6 +194,7 @@ E5PasswordMeter QProgressBar E5PathPicker E5PathPickerBase E5PathPickerBase QWidget +E5PathPickerDialog QDialog E5PathPickerModes Enum E5ProgressDialog QProgressDialog E5RequestModel QAbstractTableModel @@ -496,6 +497,7 @@ HtmlProvider MarkupBase HyperlinkMarkupDialog QDialog Ui_HyperlinkMarkupDialog IExplorerImporter BookmarksImporter +IbmWatsonEngine TranslationEngine IconEditCommand QUndoCommand IconEditorGrid QWidget IconEditorPalette QWidget @@ -503,6 +505,8 @@ IconSizeDialog QDialog Ui_IconSizeDialog IconsPage ConfigurationPageBase Ui_IconsPage IconsPreviewDialog QDialog Ui_IconsPreviewDialog +IdlCompilerDefineNameDialog QDialog Ui_IdlCompilerDefineNameDialog +IdlCompilerOptionsDialog QDialog Ui_IdlCompilerOptionsDialog ImageMarkupDialog QDialog Ui_ImageMarkupDialog ImageSearchEngine QObject ImagesIcon StatusBarIcon
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DTDs/Project-6.2.dtd Wed Aug 01 19:43:34 2018 +0200 @@ -0,0 +1,182 @@ +<!-- This is the DTD for eric5's project file version 6.0 --> + +<!-- This is a copy of the Basic DTD --> +<!ELEMENT int (#PCDATA)> +<!ELEMENT long (#PCDATA)> +<!ELEMENT float (#PCDATA)> +<!ELEMENT complex (#PCDATA)> +<!ELEMENT bool (#PCDATA)> +<!ELEMENT string (#PCDATA)> +<!ELEMENT bytes (#PCDATA)> +<!ELEMENT bytearray (#PCDATA)> +<!ELEMENT none EMPTY> + +<!ELEMENT pickle (#PCDATA)> +<!ATTLIST pickle + method CDATA #REQUIRED + encoding CDATA #REQUIRED> + +<!ELEMENT key (int | long | float | complex | string | bytes)> +<!ELEMENT value (int | long | float | complex | bool | string | bytes | + bytearray | none | dict | tuple | list | set | frozenset | pickle)> + +<!ELEMENT dict (key, value)*> + +<!ELEMENT tuple (int | long | float | complex | bool | string | bytes | + bytearray | none | dict | tuple | list | set | frozenset | pickle)*> + +<!ELEMENT list (int | long | float | complex | bool | string | bytes | + bytearray | none | dict | tuple | list | set | frozenset | pickle)*> + +<!ELEMENT set (int | long | float | complex | bool | string | bytes | + bytearray | none | dict | tuple | list | set | frozenset | pickle)*> + +<!ELEMENT frozenset (int | long | float | complex | bool | string | bytes | + bytearray | none | dict | tuple | list | set | frozenset | pickle)*> +<!-- End of the Basic DTD --> + +<!ELEMENT ProgLanguage (#PCDATA)> +<!ATTLIST ProgLanguage + mixed CDATA #REQUIRED> + +<!ELEMENT ProjectType (#PCDATA)> + +<!ELEMENT Description (#PCDATA)> + +<!ELEMENT Version (#PCDATA)> + +<!ELEMENT Author (#PCDATA)> + +<!ELEMENT Email (#PCDATA)> + +<!ELEMENT TranslationPattern (#PCDATA)> + +<!ELEMENT TranslationsBinPath (#PCDATA)> + +<!ELEMENT Source (#PCDATA)> + +<!ELEMENT Sources (Source*)> + +<!ELEMENT Form (#PCDATA)> + +<!ELEMENT Forms (Form*)> + +<!ELEMENT Translation (#PCDATA)> + +<!ELEMENT Translations (Translation*)> + +<!ELEMENT TranslationException (#PCDATA)> + +<!ELEMENT TranslationExceptions (TranslationException*)> + +<!ELEMENT Resource (#PCDATA)> + +<!ELEMENT Resources (Resource*)> + +<!ELEMENT Interface (#PCDATA)> + +<!ELEMENT Interfaces (Interface*)> + +<!ELEMENT Protocol (#PCDATA)> + +<!ELEMENT Protocols (Protocol*)> + +<!ELEMENT Other (#PCDATA)> + +<!ELEMENT Others (Other*)> + +<!ELEMENT MainScript (#PCDATA)> + +<!ELEMENT VcsType (#PCDATA)> +<!ELEMENT VcsOptions (dict)> +<!ELEMENT VcsOtherData (dict)> + +<!ELEMENT Vcs (VcsType?, + VcsOptions?, + VcsOtherData?)> + +<!ELEMENT FiletypeAssociation EMPTY> +<!ATTLIST FiletypeAssociation + pattern CDATA #REQUIRED + type CDATA #REQUIRED> + +<!ELEMENT FiletypeAssociations (FiletypeAssociation*)> + +<!ELEMENT LexerAssociation EMPTY> +<!ATTLIST LexerAssociation + pattern CDATA #REQUIRED + lexer CDATA #REQUIRED> + +<!ELEMENT LexerAssociations (LexerAssociation*)> + +<!ELEMENT MakeParameters (dict)> + +<!ELEMENT Make (MakeParameters?)> + +<!ELEMENT IdlCompiler (IdlCompilerParameters?)> + +<!ELEMENT ProjectTypeSpecificData (dict)> + +<!ELEMENT ProjectTypeSpecific (ProjectTypeSpecific?)> + +<!ELEMENT DocumentationParams (dict)> + +<!ELEMENT Documentation (DocumentationParams?)> + +<!ELEMENT PackagersParams (dict)> + +<!ELEMENT Packagers (PackagersParams?)> + +<!ELEMENT CheckersParams (dict)> + +<!ELEMENT Checkers (CheckersParams?)> + +<!ELEMENT OtherToolsParams (dict)> + +<!ELEMENT OtherTools (OtherToolsParams?)> + +<!ELEMENT Language (#PCDATA)> + +<!ELEMENT ProjectWordList (#PCDATA)> + +<!ELEMENT ProjectExcludeList (#PCDATA)> + +<!ELEMENT Hash (#PCDATA)> + +<!ELEMENT Eol EMPTY> +<!ATTLIST Eol + index CDATA #REQUIRED> + +<!ELEMENT Project (Language, + ProjectWordList?, + ProjectExcludeList?, + Hash, + ProgLanguage, + ProjectType, + Description?, + Version?, + Author?, + Email?, + TranslationPattern?, + TranslationsBinPath?, + Eol?, + Sources, + Forms, + Translations, + TranslationExceptions?, + Resources, + Interfaces, + Others, + MainScript?, + Vcs, + FiletypeAssociations, + LexerAssociations?, + Make?, + IdlCompiler?, + ProjectTypeSpecific?, + Documentation?, + Packagers?, + Checkers?, + OtherTools?)> +<!ATTLIST Project + version CDATA #REQUIRED>
--- a/Debugger/DebugServer.py Sat Jul 07 12:01:23 2018 +0200 +++ b/Debugger/DebugServer.py Wed Aug 01 19:43:34 2018 +0200 @@ -474,6 +474,7 @@ if not self.passive or not self.passiveClientExited: if self.debuggerInterface and self.debuggerInterface.isConnected(): self.shutdownServer() + self.debugging = False self.clientGone.emit(unplanned and self.debugging) if clType: @@ -1489,6 +1490,7 @@ self.clientExit.emit(int(status), message) if Preferences.getDebugger("AutomaticReset") or (self.running and not self.debugging): + self.debugging = False self.startClient(False) if self.passive: self.__createDebuggerInterface("None") @@ -1732,3 +1734,21 @@ @return flag indicating a connection (boolean) """ return self.debuggerInterface and self.debuggerInterface.isConnected() + + def isDebugging(self): + """ + Public method to test, if the debug server is debugging. + + @return flag indicating the debugging state + @rtype bool + """ + return self.debugging + + def setDebugging(self, on): + """ + Public method to set the debugging state. + + @param on flag indicating the new debugging state + @type bool + """ + self.debugging = on
--- a/Debugger/DebugUI.py Sat Jul 07 12:01:23 2018 +0200 +++ b/Debugger/DebugUI.py Wed Aug 01 19:43:34 2018 +0200 @@ -137,8 +137,6 @@ debugServer.passiveDebugStarted.connect(self.__passiveDebugStarted) debugServer.clientThreadSet.connect(self.__clientThreadSet) - debugServer.clientRawInput.connect(debugViewer.handleRawInput) - debugServer.clientRawInputSent.connect(debugViewer.restoreCurrentPage) debugServer.clientThreadList.connect(debugViewer.showThreadList) # Connect the signals emitted by the viewmanager @@ -1200,6 +1198,7 @@ exceptionType, Utilities.html_encode(exceptionMessage))) if res == E5MessageBox.Yes: + self.debugServer.setDebugging(True) self.exceptionInterrupt.emit() stack = [] for fn, ln, func, args in stackTrace:
--- a/Debugger/DebugViewer.py Sat Jul 07 12:01:23 2018 +0200 +++ b/Debugger/DebugViewer.py Wed Aug 01 19:43:34 2018 +0200 @@ -48,8 +48,7 @@ """ sourceFile = pyqtSignal(str, int) - def __init__(self, debugServer, docked, vm, parent=None, - embeddedShell=True, embeddedBrowser=True): + def __init__(self, debugServer, docked, vm, parent=None): """ Constructor @@ -57,13 +56,6 @@ @param docked flag indicating a dock window @param vm reference to the viewmanager object @param parent parent widget (QWidget) - @param embeddedShell flag indicating whether the shell should be - included. This flag is set to False by those layouts, that have - the interpreter shell in a separate window. - @param embeddedBrowser flag indicating whether the file browser should - be included. This flag is set to False by those layouts, that - have the file browser in a separate window or embedded - in the project browser instead. """ super(DebugViewer, self).__init__(parent) @@ -79,27 +71,6 @@ self.__tabWidget = E5TabWidget() self.__mainLayout.addWidget(self.__tabWidget) - self.embeddedShell = embeddedShell - if embeddedShell: - from QScintilla.Shell import ShellAssembly - # add the interpreter shell - self.shellAssembly = ShellAssembly(debugServer, vm, False) - self.shell = self.shellAssembly.shell() - index = self.__tabWidget.addTab( - self.shellAssembly, - UI.PixmapCache.getIcon("shell.png"), '') - self.__tabWidget.setTabToolTip(index, self.shell.windowTitle()) - - self.embeddedBrowser = embeddedBrowser - if embeddedBrowser: - from UI.Browser import Browser - # add the browser - self.browser = Browser() - index = self.__tabWidget.addTab( - self.browser, - UI.PixmapCache.getIcon("browser.png"), '') - self.__tabWidget.setTabToolTip(index, self.browser.windowTitle()) - from .VariablesViewer import VariablesViewer # add the global variables viewer self.glvWidget = QWidget() @@ -249,13 +220,7 @@ self.__tabWidget.setTabToolTip( index, self.exceptionLogger.windowTitle()) - if self.embeddedShell: - self.__tabWidget.setCurrentWidget(self.shellAssembly) - else: - if self.embeddedBrowser: - self.__tabWidget.setCurrentWidget(self.browser) - else: - self.__tabWidget.setCurrentWidget(self.glvWidget) + self.__tabWidget.setCurrentWidget(self.glvWidget) # add the threads viewer self.__mainLayout.addWidget(QLabel(self.tr("Threads:"))) @@ -273,7 +238,6 @@ self.__mainLayout.setStretchFactor(self.__tabWidget, 5) self.__mainLayout.setStretchFactor(self.__threadList, 1) - self.currPage = None self.currentStack = None self.framenr = 0 @@ -311,23 +275,9 @@ self.currentStack = None self.stackComboBox.clear() self.__threadList.clear() - if self.embeddedShell: - self.__tabWidget.setCurrentWidget(self.shellAssembly) - else: - if self.embeddedBrowser: - self.__tabWidget.setCurrentWidget(self.browser) - else: - self.__tabWidget.setCurrentWidget(self.glvWidget) + self.__tabWidget.setCurrentWidget(self.glvWidget) self.breakpointViewer.handleResetUI() - def handleRawInput(self): - """ - Public slot to handle the switch to the shell in raw input mode. - """ - if self.embeddedShell: - self.saveCurrentPage() - self.__tabWidget.setCurrentWidget(self.shellAssembly) - def initCallStackViewer(self, projectMode): """ Public method to initialize the call stack viewer. @@ -397,19 +347,6 @@ else: self.__tabWidget.setCurrentWidget(self.lvWidget) - def saveCurrentPage(self): - """ - Public slot to save the current page. - """ - self.currPage = self.__tabWidget.currentWidget() - - def restoreCurrentPage(self): - """ - Public slot to restore the previously saved page. - """ - if self.currPage is not None: - self.__tabWidget.setCurrentWidget(self.currPage) - def handleClientStack(self, stack): """ Public slot to show the call stack of the program being debugged. @@ -456,7 +393,8 @@ @param frmnr frame number (0 is the current frame) (int) """ self.framenr = frmnr - self.debugServer.remoteClientVariables(0, self.localsFilter, frmnr) + if self.debugServer.isDebugging(): + self.debugServer.remoteClientVariables(0, self.localsFilter, frmnr) if self.__autoViewSource: self.__showSource() @@ -465,19 +403,21 @@ """ Public slot to set the global variable filter. """ - filterStr = self.globalsFilterEdit.text() - self.debugServer.remoteClientSetFilter(1, filterStr) - self.debugServer.remoteClientVariables(2, self.globalsFilter) + if self.debugServer.isDebugging(): + filterStr = self.globalsFilterEdit.text() + self.debugServer.remoteClientSetFilter(1, filterStr) + self.debugServer.remoteClientVariables(2, self.globalsFilter) def setLocalsFilter(self): """ Public slot to set the local variable filter. """ - filterStr = self.localsFilterEdit.text() - self.debugServer.remoteClientSetFilter(0, filterStr) - if self.currentStack: - self.debugServer.remoteClientVariables( - 0, self.localsFilter, self.framenr) + if self.debugServer.isDebugging(): + filterStr = self.localsFilterEdit.text() + self.debugServer.remoteClientSetFilter(0, filterStr) + if self.currentStack: + self.debugServer.remoteClientVariables( + 0, self.localsFilter, self.framenr) def handleDebuggingStarted(self): """
--- a/Documentation/Help/source.qhp Sat Jul 07 12:01:23 2018 +0200 +++ b/Documentation/Help/source.qhp Wed Aug 01 19:43:34 2018 +0200 @@ -104,6 +104,7 @@ <section title="eric6.E5Gui.E5PassivePopup" ref="eric6.E5Gui.E5PassivePopup.html" /> <section title="eric6.E5Gui.E5PasswordMeter" ref="eric6.E5Gui.E5PasswordMeter.html" /> <section title="eric6.E5Gui.E5PathPicker" ref="eric6.E5Gui.E5PathPicker.html" /> + <section title="eric6.E5Gui.E5PathPickerDialog" ref="eric6.E5Gui.E5PathPickerDialog.html" /> <section title="eric6.E5Gui.E5ProgressDialog" ref="eric6.E5Gui.E5ProgressDialog.html" /> <section title="eric6.E5Gui.E5SideBar" ref="eric6.E5Gui.E5SideBar.html" /> <section title="eric6.E5Gui.E5SimpleHelpDialog" ref="eric6.E5Gui.E5SimpleHelpDialog.html" /> @@ -537,6 +538,7 @@ <section title="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.GlosbeEngine" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.GlosbeEngine.html" /> <section title="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.GoogleV1Engine" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.GoogleV1Engine.html" /> <section title="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.GoogleV2Engine" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.GoogleV2Engine.html" /> + <section title="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.IbmWatsonEngine" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.IbmWatsonEngine.html" /> <section title="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.MicrosoftEngine" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.MicrosoftEngine.html" /> <section title="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.MyMemoryEngine" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.MyMemoryEngine.html" /> <section title="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.PromtEngine" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.PromtEngine.html" /> @@ -971,6 +973,8 @@ <section title="eric6.Project.CreateDialogCodeDialog" ref="eric6.Project.CreateDialogCodeDialog.html" /> <section title="eric6.Project.DebuggerPropertiesDialog" ref="eric6.Project.DebuggerPropertiesDialog.html" /> <section title="eric6.Project.FiletypeAssociationDialog" ref="eric6.Project.FiletypeAssociationDialog.html" /> + <section title="eric6.Project.IdlCompilerDefineNameDialog" ref="eric6.Project.IdlCompilerDefineNameDialog.html" /> + <section title="eric6.Project.IdlCompilerOptionsDialog" ref="eric6.Project.IdlCompilerOptionsDialog.html" /> <section title="eric6.Project.LexerAssociationDialog" ref="eric6.Project.LexerAssociationDialog.html" /> <section title="eric6.Project.MakePropertiesDialog" ref="eric6.Project.MakePropertiesDialog.html" /> <section title="eric6.Project.NewDialogClassDialog" ref="eric6.Project.NewDialogClassDialog.html" /> @@ -3350,6 +3354,7 @@ <keyword name="CookieJar (Package)" id="CookieJar (Package)" ref="index-eric6.WebBrowser.CookieJar.html" /> <keyword name="CookieJar.__applyRules" id="CookieJar.__applyRules" ref="eric6.Helpviewer.CookieJar.CookieJar.html#CookieJar.__applyRules" /> <keyword name="CookieJar.__cookieAdded" id="CookieJar.__cookieAdded" ref="eric6.WebBrowser.CookieJar.CookieJar.html#CookieJar.__cookieAdded" /> + <keyword name="CookieJar.__cookieFilter" id="CookieJar.__cookieFilter" ref="eric6.WebBrowser.CookieJar.CookieJar.html#CookieJar.__cookieFilter" /> <keyword name="CookieJar.__cookieRemoved" id="CookieJar.__cookieRemoved" ref="eric6.WebBrowser.CookieJar.CookieJar.html#CookieJar.__cookieRemoved" /> <keyword name="CookieJar.__isOnDomainList" id="CookieJar.__isOnDomainList" ref="eric6.Helpviewer.CookieJar.CookieJar.html#CookieJar.__isOnDomainList" /> <keyword name="CookieJar.__isOnDomainList" id="CookieJar.__isOnDomainList" ref="eric6.WebBrowser.CookieJar.CookieJar.html#CookieJar.__isOnDomainList" /> @@ -3673,6 +3678,7 @@ <keyword name="DebugServer.getWatchPointModel" id="DebugServer.getWatchPointModel" ref="eric6.Debugger.DebugServer.html#DebugServer.getWatchPointModel" /> <keyword name="DebugServer.isClientProcessUp" id="DebugServer.isClientProcessUp" ref="eric6.Debugger.DebugServer.html#DebugServer.isClientProcessUp" /> <keyword name="DebugServer.isConnected" id="DebugServer.isConnected" ref="eric6.Debugger.DebugServer.html#DebugServer.isConnected" /> + <keyword name="DebugServer.isDebugging" id="DebugServer.isDebugging" ref="eric6.Debugger.DebugServer.html#DebugServer.isDebugging" /> <keyword name="DebugServer.passiveStartUp" id="DebugServer.passiveStartUp" ref="eric6.Debugger.DebugServer.html#DebugServer.passiveStartUp" /> <keyword name="DebugServer.preferencesChanged" id="DebugServer.preferencesChanged" ref="eric6.Debugger.DebugServer.html#DebugServer.preferencesChanged" /> <keyword name="DebugServer.registerDebuggerInterface" id="DebugServer.registerDebuggerInterface" ref="eric6.Debugger.DebugServer.html#DebugServer.registerDebuggerInterface" /> @@ -3702,6 +3708,7 @@ <keyword name="DebugServer.remoteUTRun" id="DebugServer.remoteUTRun" ref="eric6.Debugger.DebugServer.html#DebugServer.remoteUTRun" /> <keyword name="DebugServer.remoteUTStop" id="DebugServer.remoteUTStop" ref="eric6.Debugger.DebugServer.html#DebugServer.remoteUTStop" /> <keyword name="DebugServer.setCallTraceEnabled" id="DebugServer.setCallTraceEnabled" ref="eric6.Debugger.DebugServer.html#DebugServer.setCallTraceEnabled" /> + <keyword name="DebugServer.setDebugging" id="DebugServer.setDebugging" ref="eric6.Debugger.DebugServer.html#DebugServer.setDebugging" /> <keyword name="DebugServer.shutdownServer" id="DebugServer.shutdownServer" ref="eric6.Debugger.DebugServer.html#DebugServer.shutdownServer" /> <keyword name="DebugServer.signalClientBanner" id="DebugServer.signalClientBanner" ref="eric6.Debugger.DebugServer.html#DebugServer.signalClientBanner" /> <keyword name="DebugServer.signalClientBreakConditionError" id="DebugServer.signalClientBreakConditionError" ref="eric6.Debugger.DebugServer.html#DebugServer.signalClientBreakConditionError" /> @@ -3815,13 +3822,10 @@ <keyword name="DebugViewer.currentWidget" id="DebugViewer.currentWidget" ref="eric6.Debugger.DebugViewer.html#DebugViewer.currentWidget" /> <keyword name="DebugViewer.handleClientStack" id="DebugViewer.handleClientStack" ref="eric6.Debugger.DebugViewer.html#DebugViewer.handleClientStack" /> <keyword name="DebugViewer.handleDebuggingStarted" id="DebugViewer.handleDebuggingStarted" ref="eric6.Debugger.DebugViewer.html#DebugViewer.handleDebuggingStarted" /> - <keyword name="DebugViewer.handleRawInput" id="DebugViewer.handleRawInput" ref="eric6.Debugger.DebugViewer.html#DebugViewer.handleRawInput" /> <keyword name="DebugViewer.handleResetUI" id="DebugViewer.handleResetUI" ref="eric6.Debugger.DebugViewer.html#DebugViewer.handleResetUI" /> <keyword name="DebugViewer.initCallStackViewer" id="DebugViewer.initCallStackViewer" ref="eric6.Debugger.DebugViewer.html#DebugViewer.initCallStackViewer" /> <keyword name="DebugViewer.isCallTraceEnabled" id="DebugViewer.isCallTraceEnabled" ref="eric6.Debugger.DebugViewer.html#DebugViewer.isCallTraceEnabled" /> <keyword name="DebugViewer.preferencesChanged" id="DebugViewer.preferencesChanged" ref="eric6.Debugger.DebugViewer.html#DebugViewer.preferencesChanged" /> - <keyword name="DebugViewer.restoreCurrentPage" id="DebugViewer.restoreCurrentPage" ref="eric6.Debugger.DebugViewer.html#DebugViewer.restoreCurrentPage" /> - <keyword name="DebugViewer.saveCurrentPage" id="DebugViewer.saveCurrentPage" ref="eric6.Debugger.DebugViewer.html#DebugViewer.saveCurrentPage" /> <keyword name="DebugViewer.setCallTraceToProjectMode" id="DebugViewer.setCallTraceToProjectMode" ref="eric6.Debugger.DebugViewer.html#DebugViewer.setCallTraceToProjectMode" /> <keyword name="DebugViewer.setCurrentWidget" id="DebugViewer.setCurrentWidget" ref="eric6.Debugger.DebugViewer.html#DebugViewer.setCurrentWidget" /> <keyword name="DebugViewer.setDebugger" id="DebugViewer.setDebugger" ref="eric6.Debugger.DebugViewer.html#DebugViewer.setDebugger" /> @@ -4530,6 +4534,7 @@ <keyword name="E5ListSelectionDialog (Constructor)" id="E5ListSelectionDialog (Constructor)" ref="eric6.E5Gui.E5ListSelectionDialog.html#E5ListSelectionDialog.__init__" /> <keyword name="E5ListSelectionDialog (Module)" id="E5ListSelectionDialog (Module)" ref="eric6.E5Gui.E5ListSelectionDialog.html" /> <keyword name="E5ListSelectionDialog.getSelection" id="E5ListSelectionDialog.getSelection" ref="eric6.E5Gui.E5ListSelectionDialog.html#E5ListSelectionDialog.getSelection" /> + <keyword name="E5ListSelectionDialog.on_selectionList_itemChanged" id="E5ListSelectionDialog.on_selectionList_itemChanged" ref="eric6.E5Gui.E5ListSelectionDialog.html#E5ListSelectionDialog.on_selectionList_itemChanged" /> <keyword name="E5ListSelectionDialog.on_selectionList_itemSelectionChanged" id="E5ListSelectionDialog.on_selectionList_itemSelectionChanged" ref="eric6.E5Gui.E5ListSelectionDialog.html#E5ListSelectionDialog.on_selectionList_itemSelectionChanged" /> <keyword name="E5ListView" id="E5ListView" ref="eric6.E5Gui.E5ListView.html#E5ListView" /> <keyword name="E5ListView (Module)" id="E5ListView (Module)" ref="eric6.E5Gui.E5ListView.html" /> @@ -4742,6 +4747,16 @@ <keyword name="E5PathPickerBase.setWindowTitle" id="E5PathPickerBase.setWindowTitle" ref="eric6.E5Gui.E5PathPicker.html#E5PathPickerBase.setWindowTitle" /> <keyword name="E5PathPickerBase.text" id="E5PathPickerBase.text" ref="eric6.E5Gui.E5PathPicker.html#E5PathPickerBase.text" /> <keyword name="E5PathPickerBase.windowTitle" id="E5PathPickerBase.windowTitle" ref="eric6.E5Gui.E5PathPicker.html#E5PathPickerBase.windowTitle" /> + <keyword name="E5PathPickerDialog" id="E5PathPickerDialog" ref="eric6.E5Gui.E5PathPickerDialog.html#E5PathPickerDialog" /> + <keyword name="E5PathPickerDialog (Constructor)" id="E5PathPickerDialog (Constructor)" ref="eric6.E5Gui.E5PathPickerDialog.html#E5PathPickerDialog.__init__" /> + <keyword name="E5PathPickerDialog (Module)" id="E5PathPickerDialog (Module)" ref="eric6.E5Gui.E5PathPickerDialog.html" /> + <keyword name="E5PathPickerDialog.getPath" id="E5PathPickerDialog.getPath" ref="eric6.E5Gui.E5PathPickerDialog.html#E5PathPickerDialog.getPath" /> + <keyword name="E5PathPickerDialog.setDefaultDirectory" id="E5PathPickerDialog.setDefaultDirectory" ref="eric6.E5Gui.E5PathPickerDialog.html#E5PathPickerDialog.setDefaultDirectory" /> + <keyword name="E5PathPickerDialog.setLabelText" id="E5PathPickerDialog.setLabelText" ref="eric6.E5Gui.E5PathPickerDialog.html#E5PathPickerDialog.setLabelText" /> + <keyword name="E5PathPickerDialog.setPickerFilters" id="E5PathPickerDialog.setPickerFilters" ref="eric6.E5Gui.E5PathPickerDialog.html#E5PathPickerDialog.setPickerFilters" /> + <keyword name="E5PathPickerDialog.setPickerMode" id="E5PathPickerDialog.setPickerMode" ref="eric6.E5Gui.E5PathPickerDialog.html#E5PathPickerDialog.setPickerMode" /> + <keyword name="E5PathPickerDialog.setPickerPath" id="E5PathPickerDialog.setPickerPath" ref="eric6.E5Gui.E5PathPickerDialog.html#E5PathPickerDialog.setPickerPath" /> + <keyword name="E5PathPickerDialog.setTitle" id="E5PathPickerDialog.setTitle" ref="eric6.E5Gui.E5PathPickerDialog.html#E5PathPickerDialog.setTitle" /> <keyword name="E5PathPickerModes" id="E5PathPickerModes" ref="eric6.E5Gui.E5PathPicker.html#E5PathPickerModes" /> <keyword name="E5ProgressDialog" id="E5ProgressDialog" ref="eric6.E5Gui.E5ProgressDialog.html#E5ProgressDialog" /> <keyword name="E5ProgressDialog (Constructor)" id="E5ProgressDialog (Constructor)" ref="eric6.E5Gui.E5ProgressDialog.html#E5ProgressDialog.__init__" /> @@ -9786,6 +9801,17 @@ <keyword name="IExplorerImporter.setPath" id="IExplorerImporter.setPath" ref="eric6.Helpviewer.Bookmarks.BookmarksImporters.IExplorerImporter.html#IExplorerImporter.setPath" /> <keyword name="IExplorerImporter.setPath" id="IExplorerImporter.setPath" ref="eric6.WebBrowser.Bookmarks.BookmarksImporters.IExplorerImporter.html#IExplorerImporter.setPath" /> <keyword name="IRC (Package)" id="IRC (Package)" ref="index-eric6.Network.IRC.html" /> + <keyword name="IbmWatsonEngine" id="IbmWatsonEngine" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.IbmWatsonEngine.html#IbmWatsonEngine" /> + <keyword name="IbmWatsonEngine (Constructor)" id="IbmWatsonEngine (Constructor)" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.IbmWatsonEngine.html#IbmWatsonEngine.__init__" /> + <keyword name="IbmWatsonEngine (Module)" id="IbmWatsonEngine (Module)" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.IbmWatsonEngine.html" /> + <keyword name="IbmWatsonEngine.__adjustLanguageCode" id="IbmWatsonEngine.__adjustLanguageCode" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.IbmWatsonEngine.html#IbmWatsonEngine.__adjustLanguageCode" /> + <keyword name="IbmWatsonEngine.__getTranslationModels" id="IbmWatsonEngine.__getTranslationModels" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.IbmWatsonEngine.html#IbmWatsonEngine.__getTranslationModels" /> + <keyword name="IbmWatsonEngine.__getTranslationModelsReplyFinished" id="IbmWatsonEngine.__getTranslationModelsReplyFinished" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.IbmWatsonEngine.html#IbmWatsonEngine.__getTranslationModelsReplyFinished" /> + <keyword name="IbmWatsonEngine.engineName" id="IbmWatsonEngine.engineName" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.IbmWatsonEngine.html#IbmWatsonEngine.engineName" /> + <keyword name="IbmWatsonEngine.getTranslation" id="IbmWatsonEngine.getTranslation" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.IbmWatsonEngine.html#IbmWatsonEngine.getTranslation" /> + <keyword name="IbmWatsonEngine.hasTTS" id="IbmWatsonEngine.hasTTS" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.IbmWatsonEngine.html#IbmWatsonEngine.hasTTS" /> + <keyword name="IbmWatsonEngine.supportedLanguages" id="IbmWatsonEngine.supportedLanguages" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.IbmWatsonEngine.html#IbmWatsonEngine.supportedLanguages" /> + <keyword name="IbmWatsonEngine.supportedTargetLanguages" id="IbmWatsonEngine.supportedTargetLanguages" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.IbmWatsonEngine.html#IbmWatsonEngine.supportedTargetLanguages" /> <keyword name="IconEditCommand" id="IconEditCommand" ref="eric6.IconEditor.IconEditorGrid.html#IconEditCommand" /> <keyword name="IconEditCommand (Constructor)" id="IconEditCommand (Constructor)" ref="eric6.IconEditor.IconEditorGrid.html#IconEditCommand.__init__" /> <keyword name="IconEditCommand.redo" id="IconEditCommand.redo" ref="eric6.IconEditor.IconEditorGrid.html#IconEditCommand.redo" /> @@ -9918,6 +9944,39 @@ <keyword name="IconsPreviewDialog" id="IconsPreviewDialog" ref="eric6.Preferences.ConfigurationPages.IconsPreviewDialog.html#IconsPreviewDialog" /> <keyword name="IconsPreviewDialog (Constructor)" id="IconsPreviewDialog (Constructor)" ref="eric6.Preferences.ConfigurationPages.IconsPreviewDialog.html#IconsPreviewDialog.__init__" /> <keyword name="IconsPreviewDialog (Module)" id="IconsPreviewDialog (Module)" ref="eric6.Preferences.ConfigurationPages.IconsPreviewDialog.html" /> + <keyword name="IdlCompilerDefineNameDialog" id="IdlCompilerDefineNameDialog" ref="eric6.Project.IdlCompilerDefineNameDialog.html#IdlCompilerDefineNameDialog" /> + <keyword name="IdlCompilerDefineNameDialog (Constructor)" id="IdlCompilerDefineNameDialog (Constructor)" ref="eric6.Project.IdlCompilerDefineNameDialog.html#IdlCompilerDefineNameDialog.__init__" /> + <keyword name="IdlCompilerDefineNameDialog (Module)" id="IdlCompilerDefineNameDialog (Module)" ref="eric6.Project.IdlCompilerDefineNameDialog.html" /> + <keyword name="IdlCompilerDefineNameDialog.__updateOkButton" id="IdlCompilerDefineNameDialog.__updateOkButton" ref="eric6.Project.IdlCompilerDefineNameDialog.html#IdlCompilerDefineNameDialog.__updateOkButton" /> + <keyword name="IdlCompilerDefineNameDialog.getData" id="IdlCompilerDefineNameDialog.getData" ref="eric6.Project.IdlCompilerDefineNameDialog.html#IdlCompilerDefineNameDialog.getData" /> + <keyword name="IdlCompilerDefineNameDialog.on_nameEdit_textChanged" id="IdlCompilerDefineNameDialog.on_nameEdit_textChanged" ref="eric6.Project.IdlCompilerDefineNameDialog.html#IdlCompilerDefineNameDialog.on_nameEdit_textChanged" /> + <keyword name="IdlCompilerOptionsDialog" id="IdlCompilerOptionsDialog" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog" /> + <keyword name="IdlCompilerOptionsDialog (Constructor)" id="IdlCompilerOptionsDialog (Constructor)" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog.__init__" /> + <keyword name="IdlCompilerOptionsDialog (Module)" id="IdlCompilerOptionsDialog (Module)" ref="eric6.Project.IdlCompilerOptionsDialog.html" /> + <keyword name="IdlCompilerOptionsDialog.__definedNamesContain" id="IdlCompilerOptionsDialog.__definedNamesContain" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog.__definedNamesContain" /> + <keyword name="IdlCompilerOptionsDialog.__generateDefinedNamesList" id="IdlCompilerOptionsDialog.__generateDefinedNamesList" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog.__generateDefinedNamesList" /> + <keyword name="IdlCompilerOptionsDialog.__generateIncludeDirectoriesList" id="IdlCompilerOptionsDialog.__generateIncludeDirectoriesList" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog.__generateIncludeDirectoriesList" /> + <keyword name="IdlCompilerOptionsDialog.__generateUndefinedNamesList" id="IdlCompilerOptionsDialog.__generateUndefinedNamesList" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog.__generateUndefinedNamesList" /> + <keyword name="IdlCompilerOptionsDialog.__includeDirectoriesContain" id="IdlCompilerOptionsDialog.__includeDirectoriesContain" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog.__includeDirectoriesContain" /> + <keyword name="IdlCompilerOptionsDialog.__populateDefineNamesList" id="IdlCompilerOptionsDialog.__populateDefineNamesList" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog.__populateDefineNamesList" /> + <keyword name="IdlCompilerOptionsDialog.__populateIncludeDirectoriesList" id="IdlCompilerOptionsDialog.__populateIncludeDirectoriesList" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog.__populateIncludeDirectoriesList" /> + <keyword name="IdlCompilerOptionsDialog.__undefinedNamesContain" id="IdlCompilerOptionsDialog.__undefinedNamesContain" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog.__undefinedNamesContain" /> + <keyword name="IdlCompilerOptionsDialog.__updateDefineNameButtons" id="IdlCompilerOptionsDialog.__updateDefineNameButtons" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog.__updateDefineNameButtons" /> + <keyword name="IdlCompilerOptionsDialog.__updateIncludeDirectoryButtons" id="IdlCompilerOptionsDialog.__updateIncludeDirectoryButtons" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog.__updateIncludeDirectoryButtons" /> + <keyword name="IdlCompilerOptionsDialog.__updateUndefineNameButtons" id="IdlCompilerOptionsDialog.__updateUndefineNameButtons" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog.__updateUndefineNameButtons" /> + <keyword name="IdlCompilerOptionsDialog.getData" id="IdlCompilerOptionsDialog.getData" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog.getData" /> + <keyword name="IdlCompilerOptionsDialog.on_dnAddButton_clicked" id="IdlCompilerOptionsDialog.on_dnAddButton_clicked" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog.on_dnAddButton_clicked" /> + <keyword name="IdlCompilerOptionsDialog.on_dnDeleteButton_clicked" id="IdlCompilerOptionsDialog.on_dnDeleteButton_clicked" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog.on_dnDeleteButton_clicked" /> + <keyword name="IdlCompilerOptionsDialog.on_dnEditButton_clicked" id="IdlCompilerOptionsDialog.on_dnEditButton_clicked" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog.on_dnEditButton_clicked" /> + <keyword name="IdlCompilerOptionsDialog.on_dnList_itemSelectionChanged" id="IdlCompilerOptionsDialog.on_dnList_itemSelectionChanged" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog.on_dnList_itemSelectionChanged" /> + <keyword name="IdlCompilerOptionsDialog.on_idAddButton_clicked" id="IdlCompilerOptionsDialog.on_idAddButton_clicked" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog.on_idAddButton_clicked" /> + <keyword name="IdlCompilerOptionsDialog.on_idDeleteButton_clicked" id="IdlCompilerOptionsDialog.on_idDeleteButton_clicked" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog.on_idDeleteButton_clicked" /> + <keyword name="IdlCompilerOptionsDialog.on_idEditButton_clicked" id="IdlCompilerOptionsDialog.on_idEditButton_clicked" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog.on_idEditButton_clicked" /> + <keyword name="IdlCompilerOptionsDialog.on_idList_itemSelectionChanged" id="IdlCompilerOptionsDialog.on_idList_itemSelectionChanged" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog.on_idList_itemSelectionChanged" /> + <keyword name="IdlCompilerOptionsDialog.on_unAddButton_clicked" id="IdlCompilerOptionsDialog.on_unAddButton_clicked" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog.on_unAddButton_clicked" /> + <keyword name="IdlCompilerOptionsDialog.on_unDeleteButton_clicked" id="IdlCompilerOptionsDialog.on_unDeleteButton_clicked" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog.on_unDeleteButton_clicked" /> + <keyword name="IdlCompilerOptionsDialog.on_unEditButton_clicked" id="IdlCompilerOptionsDialog.on_unEditButton_clicked" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog.on_unEditButton_clicked" /> + <keyword name="IdlCompilerOptionsDialog.on_unList_itemSelectionChanged" id="IdlCompilerOptionsDialog.on_unList_itemSelectionChanged" ref="eric6.Project.IdlCompilerOptionsDialog.html#IdlCompilerOptionsDialog.on_unList_itemSelectionChanged" /> <keyword name="ImageMarkupDialog" id="ImageMarkupDialog" ref="eric6.QScintilla.MarkupProviders.ImageMarkupDialog.html#ImageMarkupDialog" /> <keyword name="ImageMarkupDialog (Constructor)" id="ImageMarkupDialog (Constructor)" ref="eric6.QScintilla.MarkupProviders.ImageMarkupDialog.html#ImageMarkupDialog.__init__" /> <keyword name="ImageMarkupDialog (Module)" id="ImageMarkupDialog (Module)" ref="eric6.QScintilla.MarkupProviders.ImageMarkupDialog.html" /> @@ -12627,6 +12686,7 @@ <keyword name="Project.getVcs" id="Project.getVcs" ref="eric6.Project.Project.html#Project.getVcs" /> <keyword name="Project.handleApplicationDiagram" id="Project.handleApplicationDiagram" ref="eric6.Project.Project.html#Project.handleApplicationDiagram" /> <keyword name="Project.handlePreferencesChanged" id="Project.handlePreferencesChanged" ref="eric6.Project.Project.html#Project.handlePreferencesChanged" /> + <keyword name="Project.hasDefaultIdlCompilerParameters" id="Project.hasDefaultIdlCompilerParameters" ref="eric6.Project.Project.html#Project.hasDefaultIdlCompilerParameters" /> <keyword name="Project.hasDefaultMakeParameters" id="Project.hasDefaultMakeParameters" ref="eric6.Project.Project.html#Project.hasDefaultMakeParameters" /> <keyword name="Project.hasEntry" id="Project.hasEntry" ref="eric6.Project.Project.html#Project.hasEntry" /> <keyword name="Project.hasProjectType" id="Project.hasProjectType" ref="eric6.Project.Project.html#Project.hasProjectType" /> @@ -12746,7 +12806,6 @@ <keyword name="ProjectBrowser.handleEditorChanged" id="ProjectBrowser.handleEditorChanged" ref="eric6.Project.ProjectBrowser.html#ProjectBrowser.handleEditorChanged" /> <keyword name="ProjectBrowser.handleEditorLineChanged" id="ProjectBrowser.handleEditorLineChanged" ref="eric6.Project.ProjectBrowser.html#ProjectBrowser.handleEditorLineChanged" /> <keyword name="ProjectBrowser.handlePreferencesChanged" id="ProjectBrowser.handlePreferencesChanged" ref="eric6.Project.ProjectBrowser.html#ProjectBrowser.handlePreferencesChanged" /> - <keyword name="ProjectBrowser.showEvent" id="ProjectBrowser.showEvent" ref="eric6.Project.ProjectBrowser.html#ProjectBrowser.showEvent" /> <keyword name="ProjectBrowserDirectoryItem" id="ProjectBrowserDirectoryItem" ref="eric6.Project.ProjectBrowserModel.html#ProjectBrowserDirectoryItem" /> <keyword name="ProjectBrowserDirectoryItem (Constructor)" id="ProjectBrowserDirectoryItem (Constructor)" ref="eric6.Project.ProjectBrowserModel.html#ProjectBrowserDirectoryItem.__init__" /> <keyword name="ProjectBrowserFileItem" id="ProjectBrowserFileItem" ref="eric6.Project.ProjectBrowserModel.html#ProjectBrowserFileItem" /> @@ -12868,6 +12927,7 @@ <keyword name="ProjectInterfacesBrowser.__compileInterface" id="ProjectInterfacesBrowser.__compileInterface" ref="eric6.Project.ProjectInterfacesBrowser.html#ProjectInterfacesBrowser.__compileInterface" /> <keyword name="ProjectInterfacesBrowser.__compileSelectedInterfaces" id="ProjectInterfacesBrowser.__compileSelectedInterfaces" ref="eric6.Project.ProjectInterfacesBrowser.html#ProjectInterfacesBrowser.__compileSelectedInterfaces" /> <keyword name="ProjectInterfacesBrowser.__configureCorba" id="ProjectInterfacesBrowser.__configureCorba" ref="eric6.Project.ProjectInterfacesBrowser.html#ProjectInterfacesBrowser.__configureCorba" /> + <keyword name="ProjectInterfacesBrowser.__configureIdlCompiler" id="ProjectInterfacesBrowser.__configureIdlCompiler" ref="eric6.Project.ProjectInterfacesBrowser.html#ProjectInterfacesBrowser.__configureIdlCompiler" /> <keyword name="ProjectInterfacesBrowser.__deleteFile" id="ProjectInterfacesBrowser.__deleteFile" ref="eric6.Project.ProjectInterfacesBrowser.html#ProjectInterfacesBrowser.__deleteFile" /> <keyword name="ProjectInterfacesBrowser.__readStderr" id="ProjectInterfacesBrowser.__readStderr" ref="eric6.Project.ProjectInterfacesBrowser.html#ProjectInterfacesBrowser.__readStderr" /> <keyword name="ProjectInterfacesBrowser.__readStdout" id="ProjectInterfacesBrowser.__readStdout" ref="eric6.Project.ProjectInterfacesBrowser.html#ProjectInterfacesBrowser.__readStdout" /> @@ -16244,6 +16304,7 @@ <keyword name="TranslationEngine.getTranslation" id="TranslationEngine.getTranslation" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.TranslationEngine.html#TranslationEngine.getTranslation" /> <keyword name="TranslationEngine.hasTTS" id="TranslationEngine.hasTTS" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.TranslationEngine.html#TranslationEngine.hasTTS" /> <keyword name="TranslationEngine.supportedLanguages" id="TranslationEngine.supportedLanguages" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.TranslationEngine.html#TranslationEngine.supportedLanguages" /> + <keyword name="TranslationEngine.supportedTargetLanguages" id="TranslationEngine.supportedTargetLanguages" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.TranslationEngine.html#TranslationEngine.supportedTargetLanguages" /> <keyword name="TranslationPropertiesDialog" id="TranslationPropertiesDialog" ref="eric6.Project.TranslationPropertiesDialog.html#TranslationPropertiesDialog" /> <keyword name="TranslationPropertiesDialog (Constructor)" id="TranslationPropertiesDialog (Constructor)" ref="eric6.Project.TranslationPropertiesDialog.html#TranslationPropertiesDialog.__init__" /> <keyword name="TranslationPropertiesDialog (Module)" id="TranslationPropertiesDialog (Module)" ref="eric6.Project.TranslationPropertiesDialog.html" /> @@ -16312,7 +16373,9 @@ <keyword name="TranslatorWidget" id="TranslatorWidget" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorWidget.html#TranslatorWidget" /> <keyword name="TranslatorWidget (Constructor)" id="TranslatorWidget (Constructor)" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorWidget.html#TranslatorWidget.__init__" /> <keyword name="TranslatorWidget (Module)" id="TranslatorWidget (Module)" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorWidget.html" /> + <keyword name="TranslatorWidget.__availableTranslationsLoaded" id="TranslatorWidget.__availableTranslationsLoaded" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorWidget.html#TranslatorWidget.__availableTranslationsLoaded" /> <keyword name="TranslatorWidget.__engineComboBoxCurrentIndexChanged" id="TranslatorWidget.__engineComboBoxCurrentIndexChanged" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorWidget.html#TranslatorWidget.__engineComboBoxCurrentIndexChanged" /> + <keyword name="TranslatorWidget.__ensureTranslationEngineReady" id="TranslatorWidget.__ensureTranslationEngineReady" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorWidget.html#TranslatorWidget.__ensureTranslationEngineReady" /> <keyword name="TranslatorWidget.__mediaPlayerStateChanged" id="TranslatorWidget.__mediaPlayerStateChanged" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorWidget.html#TranslatorWidget.__mediaPlayerStateChanged" /> <keyword name="TranslatorWidget.__originalLanguage" id="TranslatorWidget.__originalLanguage" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorWidget.html#TranslatorWidget.__originalLanguage" /> <keyword name="TranslatorWidget.__pronounce" id="TranslatorWidget.__pronounce" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorWidget.html#TranslatorWidget.__pronounce" /> @@ -16322,6 +16385,7 @@ <keyword name="TranslatorWidget.__updateEngines" id="TranslatorWidget.__updateEngines" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorWidget.html#TranslatorWidget.__updateEngines" /> <keyword name="TranslatorWidget.__updateLanguages" id="TranslatorWidget.__updateLanguages" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorWidget.html#TranslatorWidget.__updateLanguages" /> <keyword name="TranslatorWidget.__updatePronounceButtons" id="TranslatorWidget.__updatePronounceButtons" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorWidget.html#TranslatorWidget.__updatePronounceButtons" /> + <keyword name="TranslatorWidget.__updateTranslateButton" id="TranslatorWidget.__updateTranslateButton" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorWidget.html#TranslatorWidget.__updateTranslateButton" /> <keyword name="TranslatorWidget.on_clearButton_clicked" id="TranslatorWidget.on_clearButton_clicked" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorWidget.html#TranslatorWidget.on_clearButton_clicked" /> <keyword name="TranslatorWidget.on_origEdit_textChanged" id="TranslatorWidget.on_origEdit_textChanged" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorWidget.html#TranslatorWidget.on_origEdit_textChanged" /> <keyword name="TranslatorWidget.on_origLanguageComboBox_currentIndexChanged" id="TranslatorWidget.on_origLanguageComboBox_currentIndexChanged" ref="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorWidget.html#TranslatorWidget.on_origLanguageComboBox_currentIndexChanged" /> @@ -16857,6 +16921,7 @@ <keyword name="UserInterface.dropEvent" id="UserInterface.dropEvent" ref="eric6.UI.UserInterface.html#UserInterface.dropEvent" /> <keyword name="UserInterface.getActions" id="UserInterface.getActions" ref="eric6.UI.UserInterface.html#UserInterface.getActions" /> <keyword name="UserInterface.getHelpViewer" id="UserInterface.getHelpViewer" ref="eric6.UI.UserInterface.html#UserInterface.getHelpViewer" /> + <keyword name="UserInterface.getLayoutType" id="UserInterface.getLayoutType" ref="eric6.UI.UserInterface.html#UserInterface.getLayoutType" /> <keyword name="UserInterface.getLocale" id="UserInterface.getLocale" ref="eric6.UI.UserInterface.html#UserInterface.getLocale" /> <keyword name="UserInterface.getMenu" id="UserInterface.getMenu" ref="eric6.UI.UserInterface.html#UserInterface.getMenu" /> <keyword name="UserInterface.getMenuAction" id="UserInterface.getMenuAction" ref="eric6.UI.UserInterface.html#UserInterface.getMenuAction" /> @@ -17812,6 +17877,8 @@ <keyword name="WebBrowserView.__openLinkInNewWindow" id="WebBrowserView.__openLinkInNewWindow" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.__openLinkInNewWindow" /> <keyword name="WebBrowserView.__pauseMedia" id="WebBrowserView.__pauseMedia" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.__pauseMedia" /> <keyword name="WebBrowserView.__printPage" id="WebBrowserView.__printPage" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.__printPage" /> + <keyword name="WebBrowserView.__quotaRequested" id="WebBrowserView.__quotaRequested" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.__quotaRequested" /> + <keyword name="WebBrowserView.__registerProtocolHandlerRequested" id="WebBrowserView.__registerProtocolHandlerRequested" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.__registerProtocolHandlerRequested" /> <keyword name="WebBrowserView.__reloadAllSpeedDials" id="WebBrowserView.__reloadAllSpeedDials" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.__reloadAllSpeedDials" /> <keyword name="WebBrowserView.__renderPreview" id="WebBrowserView.__renderPreview" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.__renderPreview" /> <keyword name="WebBrowserView.__renderProcessTerminated" id="WebBrowserView.__renderProcessTerminated" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.__renderProcessTerminated" /> @@ -18808,6 +18875,7 @@ <keyword name="getOpenFileNames" id="getOpenFileNames" ref="eric6.E5Gui.E5FileDialog.html#getOpenFileNames" /> <keyword name="getOpenFileNamesAndFilter" id="getOpenFileNamesAndFilter" ref="eric6.E5Gui.E5FileDialog.html#getOpenFileNamesAndFilter" /> <keyword name="getOpenSearchLinks" id="getOpenSearchLinks" ref="eric6.WebBrowser.Tools.Scripts.html#getOpenSearchLinks" /> + <keyword name="getPath" id="getPath" ref="eric6.E5Gui.E5PathPickerDialog.html#getPath" /> <keyword name="getPercentReplacement" id="getPercentReplacement" ref="eric6.Utilities.__init__.html#getPercentReplacement" /> <keyword name="getPercentReplacementHelp" id="getPercentReplacementHelp" ref="eric6.Utilities.__init__.html#getPercentReplacementHelp" /> <keyword name="getPixmap" id="getPixmap" ref="eric6.UI.PixmapCache.html#getPixmap" /> @@ -18853,7 +18921,6 @@ <keyword name="getTypeFromTypeName" id="getTypeFromTypeName" ref="eric6.Utilities.ModuleParser.html#getTypeFromTypeName" /> <keyword name="getUI" id="getUI" ref="eric6.Preferences.__init__.html#getUI" /> <keyword name="getUILanguage" id="getUILanguage" ref="eric6.Preferences.__init__.html#getUILanguage" /> - <keyword name="getUILayout" id="getUILayout" ref="eric6.Preferences.__init__.html#getUILayout" /> <keyword name="getUser" id="getUser" ref="eric6.Preferences.__init__.html#getUser" /> <keyword name="getUserName" id="getUserName" ref="eric6.Utilities.__init__.html#getUserName" /> <keyword name="getVCS" id="getVCS" ref="eric6.Preferences.__init__.html#getVCS" /> @@ -19181,7 +19248,6 @@ <keyword name="setTrayStarter" id="setTrayStarter" ref="eric6.Preferences.__init__.html#setTrayStarter" /> <keyword name="setUI" id="setUI" ref="eric6.Preferences.__init__.html#setUI" /> <keyword name="setUILanguage" id="setUILanguage" ref="eric6.Preferences.__init__.html#setUILanguage" /> - <keyword name="setUILayout" id="setUILayout" ref="eric6.Preferences.__init__.html#setUILayout" /> <keyword name="setUser" id="setUser" ref="eric6.Preferences.__init__.html#setUser" /> <keyword name="setVCS" id="setVCS" ref="eric6.Preferences.__init__.html#setVCS" /> <keyword name="setVarFilters" id="setVarFilters" ref="eric6.Preferences.__init__.html#setVarFilters" /> @@ -19366,6 +19432,7 @@ <file>eric6.E5Gui.E5PassivePopup.html</file> <file>eric6.E5Gui.E5PasswordMeter.html</file> <file>eric6.E5Gui.E5PathPicker.html</file> + <file>eric6.E5Gui.E5PathPickerDialog.html</file> <file>eric6.E5Gui.E5ProgressDialog.html</file> <file>eric6.E5Gui.E5SideBar.html</file> <file>eric6.E5Gui.E5SimpleHelpDialog.html</file> @@ -19718,6 +19785,7 @@ <file>eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.GlosbeEngine.html</file> <file>eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.GoogleV1Engine.html</file> <file>eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.GoogleV2Engine.html</file> + <file>eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.IbmWatsonEngine.html</file> <file>eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.MicrosoftEngine.html</file> <file>eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.MyMemoryEngine.html</file> <file>eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.PromtEngine.html</file> @@ -20048,6 +20116,8 @@ <file>eric6.Project.CreateDialogCodeDialog.html</file> <file>eric6.Project.DebuggerPropertiesDialog.html</file> <file>eric6.Project.FiletypeAssociationDialog.html</file> + <file>eric6.Project.IdlCompilerDefineNameDialog.html</file> + <file>eric6.Project.IdlCompilerOptionsDialog.html</file> <file>eric6.Project.LexerAssociationDialog.html</file> <file>eric6.Project.MakePropertiesDialog.html</file> <file>eric6.Project.NewDialogClassDialog.html</file>
--- a/Documentation/Source/eric6.Debugger.DebugServer.html Sat Jul 07 12:01:23 2018 +0200 +++ b/Documentation/Source/eric6.Debugger.DebugServer.html Wed Aug 01 19:43:34 2018 +0200 @@ -352,6 +352,9 @@ <td><a href="#DebugServer.isConnected">isConnected</a></td> <td>Public method to test, if the debug server is connected to a backend.</td> </tr><tr> +<td><a href="#DebugServer.isDebugging">isDebugging</a></td> +<td>Public method to test, if the debug server is debugging.</td> +</tr><tr> <td><a href="#DebugServer.passiveStartUp">passiveStartUp</a></td> <td>Public method to handle a passive debug connection.</td> </tr><tr> @@ -439,6 +442,9 @@ <td><a href="#DebugServer.setCallTraceEnabled">setCallTraceEnabled</a></td> <td>Public method to set the call trace state.</td> </tr><tr> +<td><a href="#DebugServer.setDebugging">setDebugging</a></td> +<td>Public method to set the debugging state.</td> +</tr><tr> <td><a href="#DebugServer.shutdownServer">shutdownServer</a></td> <td>Public method to cleanly shut down.</td> </tr><tr> @@ -1122,6 +1128,21 @@ <dd> flag indicating a connection (boolean) </dd> +</dl><a NAME="DebugServer.isDebugging" ID="DebugServer.isDebugging"></a> +<h4>DebugServer.isDebugging</h4> +<b>isDebugging</b>(<i></i>) +<p> + Public method to test, if the debug server is debugging. +</p><dl> +<dt>Returns:</dt> +<dd> +flag indicating the debugging state +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +bool +</dd> </dl><a NAME="DebugServer.passiveStartUp" ID="DebugServer.passiveStartUp"></a> <h4>DebugServer.passiveStartUp</h4> <b>passiveStartUp</b>(<i>fn, exc</i>) @@ -1570,6 +1591,16 @@ <dd> flag indicating to enable the call trace function (boolean) </dd> +</dl><a NAME="DebugServer.setDebugging" ID="DebugServer.setDebugging"></a> +<h4>DebugServer.setDebugging</h4> +<b>setDebugging</b>(<i>on</i>) +<p> + Public method to set the debugging state. +</p><dl> +<dt><i>on</i> (bool)</dt> +<dd> +flag indicating the new debugging state +</dd> </dl><a NAME="DebugServer.shutdownServer" ID="DebugServer.shutdownServer"></a> <h4>DebugServer.shutdownServer</h4> <b>shutdownServer</b>(<i></i>)
--- a/Documentation/Source/eric6.Debugger.DebugViewer.html Sat Jul 07 12:01:23 2018 +0200 +++ b/Documentation/Source/eric6.Debugger.DebugViewer.html Wed Aug 01 19:43:34 2018 +0200 @@ -108,9 +108,6 @@ <td><a href="#DebugViewer.handleDebuggingStarted">handleDebuggingStarted</a></td> <td>Public slot to handle the start of a debugging session.</td> </tr><tr> -<td><a href="#DebugViewer.handleRawInput">handleRawInput</a></td> -<td>Public slot to handle the switch to the shell in raw input mode.</td> -</tr><tr> <td><a href="#DebugViewer.handleResetUI">handleResetUI</a></td> <td>Public method to reset the SBVviewer.</td> </tr><tr> @@ -123,12 +120,6 @@ <td><a href="#DebugViewer.preferencesChanged">preferencesChanged</a></td> <td>Public slot to handle the preferencesChanged signal.</td> </tr><tr> -<td><a href="#DebugViewer.restoreCurrentPage">restoreCurrentPage</a></td> -<td>Public slot to restore the previously saved page.</td> -</tr><tr> -<td><a href="#DebugViewer.saveCurrentPage">saveCurrentPage</a></td> -<td>Public slot to save the current page.</td> -</tr><tr> <td><a href="#DebugViewer.setCallTraceToProjectMode">setCallTraceToProjectMode</a></td> <td>Public slot to set the call trace viewer to project mode.</td> </tr><tr> @@ -166,7 +157,7 @@ </table> <a NAME="DebugViewer.__init__" ID="DebugViewer.__init__"></a> <h4>DebugViewer (Constructor)</h4> -<b>DebugViewer</b>(<i>debugServer, docked, vm, parent=None, embeddedShell=True, embeddedBrowser=True</i>) +<b>DebugViewer</b>(<i>debugServer, docked, vm, parent=None</i>) <p> Constructor </p><dl> @@ -182,17 +173,6 @@ </dd><dt><i>parent</i></dt> <dd> parent widget (QWidget) -</dd><dt><i>embeddedShell</i></dt> -<dd> -flag indicating whether the shell should be - included. This flag is set to False by those layouts, that have - the interpreter shell in a separate window. -</dd><dt><i>embeddedBrowser</i></dt> -<dd> -flag indicating whether the file browser should - be included. This flag is set to False by those layouts, that - have the file browser in a separate window or embedded - in the project browser instead. </dd> </dl><a NAME="DebugViewer.__callStackFrameSelected" ID="DebugViewer.__callStackFrameSelected"></a> <h4>DebugViewer.__callStackFrameSelected</h4> @@ -268,11 +248,6 @@ Public slot to handle the start of a debugging session. </p><p> This slot sets the variables filter expressions. -</p><a NAME="DebugViewer.handleRawInput" ID="DebugViewer.handleRawInput"></a> -<h4>DebugViewer.handleRawInput</h4> -<b>handleRawInput</b>(<i></i>) -<p> - Public slot to handle the switch to the shell in raw input mode. </p><a NAME="DebugViewer.handleResetUI" ID="DebugViewer.handleResetUI"></a> <h4>DebugViewer.handleResetUI</h4> <b>handleResetUI</b>(<i></i>) @@ -303,16 +278,6 @@ <b>preferencesChanged</b>(<i></i>) <p> Public slot to handle the preferencesChanged signal. -</p><a NAME="DebugViewer.restoreCurrentPage" ID="DebugViewer.restoreCurrentPage"></a> -<h4>DebugViewer.restoreCurrentPage</h4> -<b>restoreCurrentPage</b>(<i></i>) -<p> - Public slot to restore the previously saved page. -</p><a NAME="DebugViewer.saveCurrentPage" ID="DebugViewer.saveCurrentPage"></a> -<h4>DebugViewer.saveCurrentPage</h4> -<b>saveCurrentPage</b>(<i></i>) -<p> - Public slot to save the current page. </p><a NAME="DebugViewer.setCallTraceToProjectMode" ID="DebugViewer.setCallTraceToProjectMode"></a> <h4>DebugViewer.setCallTraceToProjectMode</h4> <b>setCallTraceToProjectMode</b>(<i>enabled</i>)
--- a/Documentation/Source/eric6.E5Gui.E5ListSelectionDialog.html Sat Jul 07 12:01:23 2018 +0200 +++ b/Documentation/Source/eric6.E5Gui.E5ListSelectionDialog.html Wed Aug 01 19:43:34 2018 +0200 @@ -63,6 +63,9 @@ <td><a href="#E5ListSelectionDialog.getSelection">getSelection</a></td> <td>Public method to retrieve the selected items.</td> </tr><tr> +<td><a href="#E5ListSelectionDialog.on_selectionList_itemChanged">on_selectionList_itemChanged</a></td> +<td>Private slot handling a change of an item.</td> +</tr><tr> <td><a href="#E5ListSelectionDialog.on_selectionList_itemSelectionChanged">on_selectionList_itemSelectionChanged</a></td> <td>Private slot handling a change of the selection.</td> </tr> @@ -73,7 +76,7 @@ </table> <a NAME="E5ListSelectionDialog.__init__" ID="E5ListSelectionDialog.__init__"></a> <h4>E5ListSelectionDialog (Constructor)</h4> -<b>E5ListSelectionDialog</b>(<i>entries, selectionMode=QAbstractItemView.ExtendedSelection, title="", message="", parent=None</i>) +<b>E5ListSelectionDialog</b>(<i>entries, selectionMode=QAbstractItemView.ExtendedSelection, title="", message="", checkBoxSelection=False, parent=None</i>) <p> Constructor </p><dl> @@ -89,6 +92,10 @@ </dd><dt><i>message</i> (str)</dt> <dd> message to be show in the dialog +</dd><dt><i>checkBoxSelection</i> (bool)</dt> +<dd> +flag indicating to select items via their + checkbox </dd><dt><i>parent</i> (QWidget)</dt> <dd> reference to the parent widget @@ -108,6 +115,16 @@ <dd> list of str </dd> +</dl><a NAME="E5ListSelectionDialog.on_selectionList_itemChanged" ID="E5ListSelectionDialog.on_selectionList_itemChanged"></a> +<h4>E5ListSelectionDialog.on_selectionList_itemChanged</h4> +<b>on_selectionList_itemChanged</b>(<i>itm</i>) +<p> + Private slot handling a change of an item. +</p><dl> +<dt><i>itm</i> (QListWidgetItem)</dt> +<dd> +reference to the changed item +</dd> </dl><a NAME="E5ListSelectionDialog.on_selectionList_itemSelectionChanged" ID="E5ListSelectionDialog.on_selectionList_itemSelectionChanged"></a> <h4>E5ListSelectionDialog.on_selectionList_itemSelectionChanged</h4> <b>on_selectionList_itemSelectionChanged</b>(<i></i>)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Documentation/Source/eric6.E5Gui.E5PathPickerDialog.html Wed Aug 01 19:43:34 2018 +0200 @@ -0,0 +1,226 @@ +<!DOCTYPE html> +<html><head> +<title>eric6.E5Gui.E5PathPickerDialog</title> +<meta charset="UTF-8"> +<style> +body { + background: #EDECE6; + margin: 0em 1em 10em 1em; + color: black; +} + +h1 { color: white; background: #85774A; } +h2 { color: white; background: #85774A; } +h3 { color: white; background: #9D936E; } +h4 { color: white; background: #9D936E; } + +a { color: #BA6D36; } + +</style> +</head> +<body><a NAME="top" ID="top"></a> +<h1>eric6.E5Gui.E5PathPickerDialog</h1> +<p> +Module implementing a dialog to enter a file system path using a file picker. +</p> +<h3>Global Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Classes</h3> +<table> +<tr> +<td><a href="#E5PathPickerDialog">E5PathPickerDialog</a></td> +<td>Class implementing a dialog to enter a file system path using a file picker.</td> +</tr> +</table> +<h3>Functions</h3> +<table> +<tr> +<td><a href="#getPath">getPath</a></td> +<td>Function to get a file or directory path from the user.</td> +</tr> +</table> +<hr /><hr /> +<a NAME="E5PathPickerDialog" ID="E5PathPickerDialog"></a> +<h2>E5PathPickerDialog</h2> +<p> + Class implementing a dialog to enter a file system path using a file + picker. +</p> +<h3>Derived from</h3> +QDialog +<h3>Class Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Class Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Methods</h3> +<table> +<tr> +<td><a href="#E5PathPickerDialog.__init__">E5PathPickerDialog</a></td> +<td>Constructor</td> +</tr><tr> +<td><a href="#E5PathPickerDialog.getPath">getPath</a></td> +<td>Public method to get the current path.</td> +</tr><tr> +<td><a href="#E5PathPickerDialog.setDefaultDirectory">setDefaultDirectory</a></td> +<td>Public method to set the default directory of the path picker.</td> +</tr><tr> +<td><a href="#E5PathPickerDialog.setLabelText">setLabelText</a></td> +<td>Public method to set the label text.</td> +</tr><tr> +<td><a href="#E5PathPickerDialog.setPickerFilters">setPickerFilters</a></td> +<td>Public method to set the filters of the path picker.</td> +</tr><tr> +<td><a href="#E5PathPickerDialog.setPickerMode">setPickerMode</a></td> +<td>Public method to set the mode of the path picker.</td> +</tr><tr> +<td><a href="#E5PathPickerDialog.setPickerPath">setPickerPath</a></td> +<td>Public method to set the path of the path picker.</td> +</tr><tr> +<td><a href="#E5PathPickerDialog.setTitle">setTitle</a></td> +<td>Public method to set the window title.</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="E5PathPickerDialog.__init__" ID="E5PathPickerDialog.__init__"></a> +<h4>E5PathPickerDialog (Constructor)</h4> +<b>E5PathPickerDialog</b>(<i>parent=None</i>) +<p> + Constructor +</p><dl> +<dt><i>parent</i> (QWidget)</dt> +<dd> +reference to the parent widget +</dd> +</dl><a NAME="E5PathPickerDialog.getPath" ID="E5PathPickerDialog.getPath"></a> +<h4>E5PathPickerDialog.getPath</h4> +<b>getPath</b>(<i></i>) +<p> + Public method to get the current path. +</p><dl> +<dt>Returns:</dt> +<dd> +current path +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +str +</dd> +</dl><a NAME="E5PathPickerDialog.setDefaultDirectory" ID="E5PathPickerDialog.setDefaultDirectory"></a> +<h4>E5PathPickerDialog.setDefaultDirectory</h4> +<b>setDefaultDirectory</b>(<i>directory</i>) +<p> + Public method to set the default directory of the path picker. +</p><dl> +<dt><i>directory</i> (str)</dt> +<dd> +default directory +</dd> +</dl><a NAME="E5PathPickerDialog.setLabelText" ID="E5PathPickerDialog.setLabelText"></a> +<h4>E5PathPickerDialog.setLabelText</h4> +<b>setLabelText</b>(<i>text</i>) +<p> + Public method to set the label text. +</p><dl> +<dt><i>text</i> (str)</dt> +<dd> +label text +</dd> +</dl><a NAME="E5PathPickerDialog.setPickerFilters" ID="E5PathPickerDialog.setPickerFilters"></a> +<h4>E5PathPickerDialog.setPickerFilters</h4> +<b>setPickerFilters</b>(<i>filters</i>) +<p> + Public method to set the filters of the path picker. +</p><p> + Note: Multiple filters must be separated by ';;'. +</p><dl> +<dt><i>filters</i> (str)</dt> +<dd> +string containing the file filters +</dd> +</dl><a NAME="E5PathPickerDialog.setPickerMode" ID="E5PathPickerDialog.setPickerMode"></a> +<h4>E5PathPickerDialog.setPickerMode</h4> +<b>setPickerMode</b>(<i>mode</i>) +<p> + Public method to set the mode of the path picker. +</p><dl> +<dt><i>mode</i> (E5PathPickerModes)</dt> +<dd> +picker mode +</dd> +</dl><a NAME="E5PathPickerDialog.setPickerPath" ID="E5PathPickerDialog.setPickerPath"></a> +<h4>E5PathPickerDialog.setPickerPath</h4> +<b>setPickerPath</b>(<i>path</i>) +<p> + Public method to set the path of the path picker. +</p><dl> +<dt><i>path</i> (str)</dt> +<dd> +path to be set +</dd> +</dl><a NAME="E5PathPickerDialog.setTitle" ID="E5PathPickerDialog.setTitle"></a> +<h4>E5PathPickerDialog.setTitle</h4> +<b>setTitle</b>(<i>title</i>) +<p> + Public method to set the window title. +</p><dl> +<dt><i>title</i> (str)</dt> +<dd> +window title +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /><hr /> +<a NAME="getPath" ID="getPath"></a> +<h2>getPath</h2> +<b>getPath</b>(<i>parent, title, label, mode=E5PathPickerModes.OpenFileMode, path="", defaultDirectory="", filters=None</i>) +<p> + Function to get a file or directory path from the user. +</p><dl> +<dt><i>parent</i> (QWidget)</dt> +<dd> +reference to the parent widget +</dd><dt><i>title</i> (str)</dt> +<dd> +title of the dialog +</dd><dt><i>label</i> (str)</dt> +<dd> +text to be shown above the path picker +</dd><dt><i>mode</i> (E5PathPickerModes)</dt> +<dd> +mode of the path picker +</dd><dt><i>path</i> (str)</dt> +<dd> +initial path to be shown +</dd><dt><i>defaultDirectory</i> (str)</dt> +<dd> +default directory of the path picker selection + dialog +</dd><dt><i>filters</i> (list of str)</dt> +<dd> +list of file filters +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +tuple containing the entered path and a flag indicating that the + user pressed the OK button +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +tuple of (str, bool) +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /> +</body></html> \ No newline at end of file
--- a/Documentation/Source/eric6.E5XML.Config.html Sat Jul 07 12:01:23 2018 +0200 +++ b/Documentation/Source/eric6.E5XML.Config.html Wed Aug 01 19:43:34 2018 +0200 @@ -25,7 +25,7 @@ </p> <h3>Global Attributes</h3> <table> -<tr><td>debuggerPropertiesFileFormatVersion</td></tr><tr><td>dictionariesListFileFormatVersion</td></tr><tr><td>highlightingStylesFileFormatVersion</td></tr><tr><td>multiProjectFileFormatVersion</td></tr><tr><td>pluginRepositoryFileFormatVersion</td></tr><tr><td>projectFileFormatVersion</td></tr><tr><td>projectFileFormatVersionAlt</td></tr><tr><td>projectFileFormatVersionProto</td></tr><tr><td>sessionFileFormatVersion</td></tr><tr><td>shortcutsFileFormatVersion</td></tr><tr><td>tasksFileFormatVersion</td></tr><tr><td>templatesFileFormatVersion</td></tr><tr><td>userProjectFileFormatVersion</td></tr> +<tr><td>debuggerPropertiesFileFormatVersion</td></tr><tr><td>dictionariesListFileFormatVersion</td></tr><tr><td>highlightingStylesFileFormatVersion</td></tr><tr><td>multiProjectFileFormatVersion</td></tr><tr><td>pluginRepositoryFileFormatVersion</td></tr><tr><td>projectFileFormatVersion</td></tr><tr><td>projectFileFormatVersionAlt</td></tr><tr><td>projectFileFormatVersionMake</td></tr><tr><td>projectFileFormatVersionProto</td></tr><tr><td>sessionFileFormatVersion</td></tr><tr><td>shortcutsFileFormatVersion</td></tr><tr><td>tasksFileFormatVersion</td></tr><tr><td>templatesFileFormatVersion</td></tr><tr><td>userProjectFileFormatVersion</td></tr> </table> <h3>Classes</h3> <table>
--- a/Documentation/Source/eric6.E5XML.TemplatesReader.html Sat Jul 07 12:01:23 2018 +0200 +++ b/Documentation/Source/eric6.E5XML.TemplatesReader.html Wed Aug 01 19:43:34 2018 +0200 @@ -76,7 +76,7 @@ </table> <a NAME="TemplatesReader.__init__" ID="TemplatesReader.__init__"></a> <h4>TemplatesReader (Constructor)</h4> -<b>TemplatesReader</b>(<i>device, viewer=None</i>) +<b>TemplatesReader</b>(<i>device, viewer</i>) <p> Constructor </p><dl>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Documentation/Source/eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.IbmWatsonEngine.html Wed Aug 01 19:43:34 2018 +0200 @@ -0,0 +1,240 @@ +<!DOCTYPE html> +<html><head> +<title>eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.IbmWatsonEngine</title> +<meta charset="UTF-8"> +<style> +body { + background: #EDECE6; + margin: 0em 1em 10em 1em; + color: black; +} + +h1 { color: white; background: #85774A; } +h2 { color: white; background: #85774A; } +h3 { color: white; background: #9D936E; } +h4 { color: white; background: #9D936E; } + +a { color: #BA6D36; } + +</style> +</head> +<body><a NAME="top" ID="top"></a> +<h1>eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.IbmWatsonEngine</h1> +<p> +Module implementing the IBM Watson translation engine. +</p> +<h3>Global Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Classes</h3> +<table> +<tr> +<td><a href="#IbmWatsonEngine">IbmWatsonEngine</a></td> +<td>Class implementing the translation engine for the IBM Watson Language Translator service.</td> +</tr> +</table> +<h3>Functions</h3> +<table> +<tr><td>None</td></tr> +</table> +<hr /><hr /> +<a NAME="IbmWatsonEngine" ID="IbmWatsonEngine"></a> +<h2>IbmWatsonEngine</h2> +<p> + Class implementing the translation engine for the IBM Watson Language + Translator service. +</p> +<h3>Derived from</h3> +TranslationEngine +<h3>Class Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Class Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Methods</h3> +<table> +<tr> +<td><a href="#IbmWatsonEngine.__init__">IbmWatsonEngine</a></td> +<td>Constructor</td> +</tr><tr> +<td><a href="#IbmWatsonEngine.__adjustLanguageCode">__adjustLanguageCode</a></td> +<td>Private method to adjust a given language code.</td> +</tr><tr> +<td><a href="#IbmWatsonEngine.__getTranslationModels">__getTranslationModels</a></td> +<td>Private method to get the translation models supported by IBM Watson Language Translator.</td> +</tr><tr> +<td><a href="#IbmWatsonEngine.__getTranslationModelsReplyFinished">__getTranslationModelsReplyFinished</a></td> +<td>Private slot handling the receipt of the available translations.</td> +</tr><tr> +<td><a href="#IbmWatsonEngine.engineName">engineName</a></td> +<td>Public method to return the name of the engine.</td> +</tr><tr> +<td><a href="#IbmWatsonEngine.getTranslation">getTranslation</a></td> +<td>Public method to translate the given text.</td> +</tr><tr> +<td><a href="#IbmWatsonEngine.hasTTS">hasTTS</a></td> +<td>Public method indicating the Text-to-Speech capability.</td> +</tr><tr> +<td><a href="#IbmWatsonEngine.supportedLanguages">supportedLanguages</a></td> +<td>Public method to get the supported languages.</td> +</tr><tr> +<td><a href="#IbmWatsonEngine.supportedTargetLanguages">supportedTargetLanguages</a></td> +<td>Public method to get a list of supported target languages for an original language.</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="IbmWatsonEngine.__init__" ID="IbmWatsonEngine.__init__"></a> +<h4>IbmWatsonEngine (Constructor)</h4> +<b>IbmWatsonEngine</b>(<i>plugin, parent=None</i>) +<p> + Constructor +</p><dl> +<dt><i>plugin</i> (TranslatorPlugin)</dt> +<dd> +reference to the plugin object +</dd><dt><i>parent</i> (QObject)</dt> +<dd> +reference to the parent object +</dd> +</dl><a NAME="IbmWatsonEngine.__adjustLanguageCode" ID="IbmWatsonEngine.__adjustLanguageCode"></a> +<h4>IbmWatsonEngine.__adjustLanguageCode</h4> +<b>__adjustLanguageCode</b>(<i>code</i>) +<p> + Private method to adjust a given language code. +</p><dl> +<dt><i>code</i> (str)</dt> +<dd> +code to be adjusted +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +adjusted language code +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +str +</dd> +</dl><a NAME="IbmWatsonEngine.__getTranslationModels" ID="IbmWatsonEngine.__getTranslationModels"></a> +<h4>IbmWatsonEngine.__getTranslationModels</h4> +<b>__getTranslationModels</b>(<i></i>) +<p> + Private method to get the translation models supported by IBM Watson + Language Translator. +</p><a NAME="IbmWatsonEngine.__getTranslationModelsReplyFinished" ID="IbmWatsonEngine.__getTranslationModelsReplyFinished"></a> +<h4>IbmWatsonEngine.__getTranslationModelsReplyFinished</h4> +<b>__getTranslationModelsReplyFinished</b>(<i>reply</i>) +<p> + Private slot handling the receipt of the available translations. +</p><dl> +<dt><i>reply</i> (QNetworkReply)</dt> +<dd> +reference to the network reply object +</dd> +</dl><a NAME="IbmWatsonEngine.engineName" ID="IbmWatsonEngine.engineName"></a> +<h4>IbmWatsonEngine.engineName</h4> +<b>engineName</b>(<i></i>) +<p> + Public method to return the name of the engine. +</p><dl> +<dt>Returns:</dt> +<dd> +engine name +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +str +</dd> +</dl><a NAME="IbmWatsonEngine.getTranslation" ID="IbmWatsonEngine.getTranslation"></a> +<h4>IbmWatsonEngine.getTranslation</h4> +<b>getTranslation</b>(<i>requestObject, text, originalLanguage, translationLanguage</i>) +<p> + Public method to translate the given text. +</p><dl> +<dt><i>requestObject</i> (TranslatorRequest)</dt> +<dd> +reference to the request object +</dd><dt><i>text</i> (str)</dt> +<dd> +text to be translated +</dd><dt><i>originalLanguage</i> (str)</dt> +<dd> +language code of the original +</dd><dt><i>translationLanguage</i> (str)</dt> +<dd> +language code of the translation +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +tuple of translated text and flag indicating success +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +tuple of (str, bool) +</dd> +</dl><a NAME="IbmWatsonEngine.hasTTS" ID="IbmWatsonEngine.hasTTS"></a> +<h4>IbmWatsonEngine.hasTTS</h4> +<b>hasTTS</b>(<i></i>) +<p> + Public method indicating the Text-to-Speech capability. +</p><dl> +<dt>Returns:</dt> +<dd> +flag indicating the Text-to-Speech capability +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +bool +</dd> +</dl><a NAME="IbmWatsonEngine.supportedLanguages" ID="IbmWatsonEngine.supportedLanguages"></a> +<h4>IbmWatsonEngine.supportedLanguages</h4> +<b>supportedLanguages</b>(<i></i>) +<p> + Public method to get the supported languages. +</p><dl> +<dt>Returns:</dt> +<dd> +list of supported language codes +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +list of str +</dd> +</dl><a NAME="IbmWatsonEngine.supportedTargetLanguages" ID="IbmWatsonEngine.supportedTargetLanguages"></a> +<h4>IbmWatsonEngine.supportedTargetLanguages</h4> +<b>supportedTargetLanguages</b>(<i>original</i>) +<p> + Public method to get a list of supported target languages for an + original language. +</p><dl> +<dt><i>original</i> (str)</dt> +<dd> +original language +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +list of supported target languages for the given original +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +list of str +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /> +</body></html> \ No newline at end of file
--- a/Documentation/Source/eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.TranslationEngine.html Sat Jul 07 12:01:23 2018 +0200 +++ b/Documentation/Source/eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.TranslationEngine.html Wed Aug 01 19:43:34 2018 +0200 @@ -44,7 +44,14 @@ <p> Class implementing the translation engine base class containing default methods. -</p> +</p><h3>Signals</h3> +<dl> +<dt>availableTranslationsLoaded()</dt> +<dd> +emitted to indicate the availability + of the list of supported translation languages +</dd> +</dl> <h3>Derived from</h3> QObject <h3>Class Attributes</h3> @@ -75,6 +82,9 @@ </tr><tr> <td><a href="#TranslationEngine.supportedLanguages">supportedLanguages</a></td> <td>Public method to get the supported languages.</td> +</tr><tr> +<td><a href="#TranslationEngine.supportedTargetLanguages">supportedTargetLanguages</a></td> +<td>Public method to get a list of supported target languages for an original language.</td> </tr> </table> <h3>Static Methods</h3> @@ -173,6 +183,31 @@ <dd> list of supported language codes (list of string) </dd> +</dl><a NAME="TranslationEngine.supportedTargetLanguages" ID="TranslationEngine.supportedTargetLanguages"></a> +<h4>TranslationEngine.supportedTargetLanguages</h4> +<b>supportedTargetLanguages</b>(<i>original</i>) +<p> + Public method to get a list of supported target languages for an + original language. +</p><p> + Note: The default implementation return the list of supported languages + (i.e. the same as those for the source) with the given original + removed. +</p><dl> +<dt><i>original</i> (str)</dt> +<dd> +original language +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +list of supported target languages for the given original +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +list of str +</dd> </dl> <div align="right"><a href="#top">Up</a></div> <hr />
--- a/Documentation/Source/eric6.Plugins.UiExtensionPlugins.Translator.TranslatorWidget.html Sat Jul 07 12:01:23 2018 +0200 +++ b/Documentation/Source/eric6.Plugins.UiExtensionPlugins.Translator.TranslatorWidget.html Wed Aug 01 19:43:34 2018 +0200 @@ -60,9 +60,15 @@ <td><a href="#TranslatorWidget.__init__">TranslatorWidget</a></td> <td>Constructor</td> </tr><tr> +<td><a href="#TranslatorWidget.__availableTranslationsLoaded">__availableTranslationsLoaded</a></td> +<td>Private slot to handle the availability of translations.</td> +</tr><tr> <td><a href="#TranslatorWidget.__engineComboBoxCurrentIndexChanged">__engineComboBoxCurrentIndexChanged</a></td> <td>Private slot to handle the selection of a translation service.</td> </tr><tr> +<td><a href="#TranslatorWidget.__ensureTranslationEngineReady">__ensureTranslationEngineReady</a></td> +<td>Private slot to ensure, that the currently selected translation engine is ready.</td> +</tr><tr> <td><a href="#TranslatorWidget.__mediaPlayerStateChanged">__mediaPlayerStateChanged</a></td> <td>Private slot handling changes of the media player state.</td> </tr><tr> @@ -90,6 +96,9 @@ <td><a href="#TranslatorWidget.__updatePronounceButtons">__updatePronounceButtons</a></td> <td>Private slot to set the state of the pronounce buttons.</td> </tr><tr> +<td><a href="#TranslatorWidget.__updateTranslateButton">__updateTranslateButton</a></td> +<td>Private slot to set the state of the translate button.</td> +</tr><tr> <td><a href="#TranslatorWidget.on_clearButton_clicked">on_clearButton_clicked</a></td> <td>Private slot to clear the text fields.</td> </tr><tr> @@ -138,17 +147,28 @@ <dd> reference to the parent widget (QWidget) </dd> -</dl><a NAME="TranslatorWidget.__engineComboBoxCurrentIndexChanged" ID="TranslatorWidget.__engineComboBoxCurrentIndexChanged"></a> +</dl><a NAME="TranslatorWidget.__availableTranslationsLoaded" ID="TranslatorWidget.__availableTranslationsLoaded"></a> +<h4>TranslatorWidget.__availableTranslationsLoaded</h4> +<b>__availableTranslationsLoaded</b>(<i></i>) +<p> + Private slot to handle the availability of translations. +</p><a NAME="TranslatorWidget.__engineComboBoxCurrentIndexChanged" ID="TranslatorWidget.__engineComboBoxCurrentIndexChanged"></a> <h4>TranslatorWidget.__engineComboBoxCurrentIndexChanged</h4> <b>__engineComboBoxCurrentIndexChanged</b>(<i>index</i>) <p> Private slot to handle the selection of a translation service. </p><dl> -<dt><i>index</i></dt> +<dt><i>index</i> (int)</dt> <dd> -current index (integer) +current index </dd> -</dl><a NAME="TranslatorWidget.__mediaPlayerStateChanged" ID="TranslatorWidget.__mediaPlayerStateChanged"></a> +</dl><a NAME="TranslatorWidget.__ensureTranslationEngineReady" ID="TranslatorWidget.__ensureTranslationEngineReady"></a> +<h4>TranslatorWidget.__ensureTranslationEngineReady</h4> +<b>__ensureTranslationEngineReady</b>(<i></i>) +<p> + Private slot to ensure, that the currently selected translation engine + is ready. +</p><a NAME="TranslatorWidget.__mediaPlayerStateChanged" ID="TranslatorWidget.__mediaPlayerStateChanged"></a> <h4>TranslatorWidget.__mediaPlayerStateChanged</h4> <b>__mediaPlayerStateChanged</b>(<i>state</i>) <p> @@ -233,6 +253,11 @@ <b>__updatePronounceButtons</b>(<i></i>) <p> Private slot to set the state of the pronounce buttons. +</p><a NAME="TranslatorWidget.__updateTranslateButton" ID="TranslatorWidget.__updateTranslateButton"></a> +<h4>TranslatorWidget.__updateTranslateButton</h4> +<b>__updateTranslateButton</b>(<i></i>) +<p> + Private slot to set the state of the translate button. </p><a NAME="TranslatorWidget.on_clearButton_clicked" ID="TranslatorWidget.on_clearButton_clicked"></a> <h4>TranslatorWidget.on_clearButton_clicked</h4> <b>on_clearButton_clicked</b>(<i></i>)
--- a/Documentation/Source/eric6.Preferences.__init__.html Sat Jul 07 12:01:23 2018 +0200 +++ b/Documentation/Source/eric6.Preferences.__init__.html Wed Aug 01 19:43:34 2018 +0200 @@ -175,9 +175,6 @@ <td><a href="#getUILanguage">getUILanguage</a></td> <td>Module function to retrieve the language for the user interface.</td> </tr><tr> -<td><a href="#getUILayout">getUILayout</a></td> -<td>Module function to retrieve the layout for the user interface.</td> -</tr><tr> <td><a href="#getUser">getUser</a></td> <td>Module function to retrieve the various user settings.</td> </tr><tr> @@ -334,9 +331,6 @@ <td><a href="#setUILanguage">setUILanguage</a></td> <td>Module function to store the language for the user interface.</td> </tr><tr> -<td><a href="#setUILayout">setUILayout</a></td> -<td>Module function to store the layout for the user interface.</td> -</tr><tr> <td><a href="#setUser">setUser</a></td> <td>Module function to store the various user settings.</td> </tr><tr> @@ -1309,25 +1303,6 @@ </dl> <div align="right"><a href="#top">Up</a></div> <hr /><hr /> -<a NAME="getUILayout" ID="getUILayout"></a> -<h2>getUILayout</h2> -<b>getUILayout</b>(<i>prefClass=Prefs</i>) -<p> - Module function to retrieve the layout for the user interface. -</p><dl> -<dt><i>prefClass</i></dt> -<dd> -preferences class used as the storage area -</dd> -</dl><dl> -<dt>Returns:</dt> -<dd> -the UI layout as a tuple of main layout, flag for - an embedded shell and a value for an embedded file browser -</dd> -</dl> -<div align="right"><a href="#top">Up</a></div> -<hr /><hr /> <a NAME="getUser" ID="getUser"></a> <h2>getUser</h2> <b>getUser</b>(<i>key, prefClass=Prefs</i>) @@ -2276,22 +2251,6 @@ </dl> <div align="right"><a href="#top">Up</a></div> <hr /><hr /> -<a NAME="setUILayout" ID="setUILayout"></a> -<h2>setUILayout</h2> -<b>setUILayout</b>(<i>layout, prefClass=Prefs</i>) -<p> - Module function to store the layout for the user interface. -</p><dl> -<dt><i>layout</i></dt> -<dd> -the layout type -</dd><dt><i>prefClass</i></dt> -<dd> -preferences class used as the storage area -</dd> -</dl> -<div align="right"><a href="#top">Up</a></div> -<hr /><hr /> <a NAME="setUser" ID="setUser"></a> <h2>setUser</h2> <b>setUser</b>(<i>key, value, prefClass=Prefs</i>)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Documentation/Source/eric6.Project.IdlCompilerDefineNameDialog.html Wed Aug 01 19:43:34 2018 +0200 @@ -0,0 +1,128 @@ +<!DOCTYPE html> +<html><head> +<title>eric6.Project.IdlCompilerDefineNameDialog</title> +<meta charset="UTF-8"> +<style> +body { + background: #EDECE6; + margin: 0em 1em 10em 1em; + color: black; +} + +h1 { color: white; background: #85774A; } +h2 { color: white; background: #85774A; } +h3 { color: white; background: #9D936E; } +h4 { color: white; background: #9D936E; } + +a { color: #BA6D36; } + +</style> +</head> +<body><a NAME="top" ID="top"></a> +<h1>eric6.Project.IdlCompilerDefineNameDialog</h1> +<p> +Module implementing a dialog to enter the name-value pair to define a variable +for the IDL compiler. +</p> +<h3>Global Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Classes</h3> +<table> +<tr> +<td><a href="#IdlCompilerDefineNameDialog">IdlCompilerDefineNameDialog</a></td> +<td>Class implementing a dialog to enter the name-value pair to define a variable for the IDL compiler.</td> +</tr> +</table> +<h3>Functions</h3> +<table> +<tr><td>None</td></tr> +</table> +<hr /><hr /> +<a NAME="IdlCompilerDefineNameDialog" ID="IdlCompilerDefineNameDialog"></a> +<h2>IdlCompilerDefineNameDialog</h2> +<p> + Class implementing a dialog to enter the name-value pair to define a + variable for the IDL compiler. +</p> +<h3>Derived from</h3> +QDialog, Ui_IdlCompilerDefineNameDialog +<h3>Class Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Class Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Methods</h3> +<table> +<tr> +<td><a href="#IdlCompilerDefineNameDialog.__init__">IdlCompilerDefineNameDialog</a></td> +<td>Constructor</td> +</tr><tr> +<td><a href="#IdlCompilerDefineNameDialog.__updateOkButton">__updateOkButton</a></td> +<td>Private slot to update the enable state of the OK button.</td> +</tr><tr> +<td><a href="#IdlCompilerDefineNameDialog.getData">getData</a></td> +<td>Public method to get the entered data.</td> +</tr><tr> +<td><a href="#IdlCompilerDefineNameDialog.on_nameEdit_textChanged">on_nameEdit_textChanged</a></td> +<td>Private slot to handle changes of the name.</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="IdlCompilerDefineNameDialog.__init__" ID="IdlCompilerDefineNameDialog.__init__"></a> +<h4>IdlCompilerDefineNameDialog (Constructor)</h4> +<b>IdlCompilerDefineNameDialog</b>(<i>name="", value="", parent=None</i>) +<p> + Constructor +</p><dl> +<dt><i>name</i> (str)</dt> +<dd> +name of the variable +</dd><dt><i>value</i> (str)</dt> +<dd> +value of the variable +</dd><dt><i>parent</i> (QWidget)</dt> +<dd> +reference to the parent widget +</dd> +</dl><a NAME="IdlCompilerDefineNameDialog.__updateOkButton" ID="IdlCompilerDefineNameDialog.__updateOkButton"></a> +<h4>IdlCompilerDefineNameDialog.__updateOkButton</h4> +<b>__updateOkButton</b>(<i></i>) +<p> + Private slot to update the enable state of the OK button. +</p><a NAME="IdlCompilerDefineNameDialog.getData" ID="IdlCompilerDefineNameDialog.getData"></a> +<h4>IdlCompilerDefineNameDialog.getData</h4> +<b>getData</b>(<i></i>) +<p> + Public method to get the entered data. +</p><dl> +<dt>Returns:</dt> +<dd> +tuple containing the variable name and value +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +tuple of (str, str) +</dd> +</dl><a NAME="IdlCompilerDefineNameDialog.on_nameEdit_textChanged" ID="IdlCompilerDefineNameDialog.on_nameEdit_textChanged"></a> +<h4>IdlCompilerDefineNameDialog.on_nameEdit_textChanged</h4> +<b>on_nameEdit_textChanged</b>(<i>txt</i>) +<p> + Private slot to handle changes of the name. +</p><dl> +<dt><i>txt</i> (str)</dt> +<dd> +current text of the name edit +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /> +</body></html> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Documentation/Source/eric6.Project.IdlCompilerOptionsDialog.html Wed Aug 01 19:43:34 2018 +0200 @@ -0,0 +1,386 @@ +<!DOCTYPE html> +<html><head> +<title>eric6.Project.IdlCompilerOptionsDialog</title> +<meta charset="UTF-8"> +<style> +body { + background: #EDECE6; + margin: 0em 1em 10em 1em; + color: black; +} + +h1 { color: white; background: #85774A; } +h2 { color: white; background: #85774A; } +h3 { color: white; background: #9D936E; } +h4 { color: white; background: #9D936E; } + +a { color: #BA6D36; } + +</style> +</head> +<body><a NAME="top" ID="top"></a> +<h1>eric6.Project.IdlCompilerOptionsDialog</h1> +<p> +Module implementing a dialog to enter some IDL compiler options. +</p> +<h3>Global Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Classes</h3> +<table> +<tr> +<td><a href="#IdlCompilerOptionsDialog">IdlCompilerOptionsDialog</a></td> +<td>Class implementing a dialog to enter some IDL compiler options.</td> +</tr> +</table> +<h3>Functions</h3> +<table> +<tr><td>None</td></tr> +</table> +<hr /><hr /> +<a NAME="IdlCompilerOptionsDialog" ID="IdlCompilerOptionsDialog"></a> +<h2>IdlCompilerOptionsDialog</h2> +<p> + Class implementing a dialog to enter some IDL compiler options. +</p> +<h3>Derived from</h3> +QDialog, Ui_IdlCompilerOptionsDialog +<h3>Class Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Class Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Methods</h3> +<table> +<tr> +<td><a href="#IdlCompilerOptionsDialog.__init__">IdlCompilerOptionsDialog</a></td> +<td>Constructor</td> +</tr><tr> +<td><a href="#IdlCompilerOptionsDialog.__definedNamesContain">__definedNamesContain</a></td> +<td>Private method to test, if the currently defined 'Defined Names' contain a given one.</td> +</tr><tr> +<td><a href="#IdlCompilerOptionsDialog.__generateDefinedNamesList">__generateDefinedNamesList</a></td> +<td>Private method to prepare the list of 'Defined Names'.</td> +</tr><tr> +<td><a href="#IdlCompilerOptionsDialog.__generateIncludeDirectoriesList">__generateIncludeDirectoriesList</a></td> +<td>Private method to prepare the list of 'Include Directories'.</td> +</tr><tr> +<td><a href="#IdlCompilerOptionsDialog.__generateUndefinedNamesList">__generateUndefinedNamesList</a></td> +<td>Private method to prepare the list of 'Undefined Names'.</td> +</tr><tr> +<td><a href="#IdlCompilerOptionsDialog.__includeDirectoriesContain">__includeDirectoriesContain</a></td> +<td>Private method to test, if the currently defined 'Include Directories' contain a given one.</td> +</tr><tr> +<td><a href="#IdlCompilerOptionsDialog.__populateDefineNamesList">__populateDefineNamesList</a></td> +<td>Private method to populate the list of defined names.</td> +</tr><tr> +<td><a href="#IdlCompilerOptionsDialog.__populateIncludeDirectoriesList">__populateIncludeDirectoriesList</a></td> +<td>Private method to populate the 'Include Directories' list.</td> +</tr><tr> +<td><a href="#IdlCompilerOptionsDialog.__undefinedNamesContain">__undefinedNamesContain</a></td> +<td>Private method to test, if the currently defined 'Undefined Names' contain a given one.</td> +</tr><tr> +<td><a href="#IdlCompilerOptionsDialog.__updateDefineNameButtons">__updateDefineNameButtons</a></td> +<td>Private method to set the state of the 'Define Name' buttons.</td> +</tr><tr> +<td><a href="#IdlCompilerOptionsDialog.__updateIncludeDirectoryButtons">__updateIncludeDirectoryButtons</a></td> +<td>Private method to set the state of the 'Include Directory' buttons.</td> +</tr><tr> +<td><a href="#IdlCompilerOptionsDialog.__updateUndefineNameButtons">__updateUndefineNameButtons</a></td> +<td>Private method to set the state of the 'Undefine Name' buttons.</td> +</tr><tr> +<td><a href="#IdlCompilerOptionsDialog.getData">getData</a></td> +<td>Public method to return the data entered by the user.</td> +</tr><tr> +<td><a href="#IdlCompilerOptionsDialog.on_dnAddButton_clicked">on_dnAddButton_clicked</a></td> +<td>Private slot to add a 'Define Name' entry.</td> +</tr><tr> +<td><a href="#IdlCompilerOptionsDialog.on_dnDeleteButton_clicked">on_dnDeleteButton_clicked</a></td> +<td>Private slot to delete the selected 'Define Name' entry.</td> +</tr><tr> +<td><a href="#IdlCompilerOptionsDialog.on_dnEditButton_clicked">on_dnEditButton_clicked</a></td> +<td>Private slot to edit the selected 'Define Name' entry.</td> +</tr><tr> +<td><a href="#IdlCompilerOptionsDialog.on_dnList_itemSelectionChanged">on_dnList_itemSelectionChanged</a></td> +<td>Private slot handling the selection of a 'Define Name' entry.</td> +</tr><tr> +<td><a href="#IdlCompilerOptionsDialog.on_idAddButton_clicked">on_idAddButton_clicked</a></td> +<td>Private slot to add an 'Include Directory'.</td> +</tr><tr> +<td><a href="#IdlCompilerOptionsDialog.on_idDeleteButton_clicked">on_idDeleteButton_clicked</a></td> +<td>Private slot to delete the selected 'Include Directory' entry.</td> +</tr><tr> +<td><a href="#IdlCompilerOptionsDialog.on_idEditButton_clicked">on_idEditButton_clicked</a></td> +<td>Private slot to edit the selected 'Include Directory' entry.</td> +</tr><tr> +<td><a href="#IdlCompilerOptionsDialog.on_idList_itemSelectionChanged">on_idList_itemSelectionChanged</a></td> +<td>Private slot handling the selection of an 'Include Directory' entry.</td> +</tr><tr> +<td><a href="#IdlCompilerOptionsDialog.on_unAddButton_clicked">on_unAddButton_clicked</a></td> +<td>Private slot to add a 'Undefine Name' entry.</td> +</tr><tr> +<td><a href="#IdlCompilerOptionsDialog.on_unDeleteButton_clicked">on_unDeleteButton_clicked</a></td> +<td>Private slot to delete the selected 'Undefine Name' entry.</td> +</tr><tr> +<td><a href="#IdlCompilerOptionsDialog.on_unEditButton_clicked">on_unEditButton_clicked</a></td> +<td>Private slot to edit the selected 'Undefine Name' entry.</td> +</tr><tr> +<td><a href="#IdlCompilerOptionsDialog.on_unList_itemSelectionChanged">on_unList_itemSelectionChanged</a></td> +<td>Private slot handling the selection of a 'Undefine Name' entry.</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="IdlCompilerOptionsDialog.__init__" ID="IdlCompilerOptionsDialog.__init__"></a> +<h4>IdlCompilerOptionsDialog (Constructor)</h4> +<b>IdlCompilerOptionsDialog</b>(<i>includeDirectories, definedNames, undefinedNames, project=None, parent=None</i>) +<p> + Constructor +</p><dl> +<dt><i>includeDirectories</i> (list of str)</dt> +<dd> +list of include directories +</dd><dt><i>definedNames</i> (list of str)</dt> +<dd> +list of defined variables with name and value + separated by '=' +</dd><dt><i>undefinedNames</i> (list of str)</dt> +<dd> +list of undefined names +</dd><dt><i>projectDirectory</i> (str)</dt> +<dd> +directory name of the project +</dd><dt><i>parent</i> (QWidget)</dt> +<dd> +reference to the parent widget +</dd> +</dl><a NAME="IdlCompilerOptionsDialog.__definedNamesContain" ID="IdlCompilerOptionsDialog.__definedNamesContain"></a> +<h4>IdlCompilerOptionsDialog.__definedNamesContain</h4> +<b>__definedNamesContain</b>(<i>name</i>) +<p> + Private method to test, if the currently defined 'Defined Names' + contain a given one. +</p><dl> +<dt><i>name</i> (str)</dt> +<dd> +variable name to be tested +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +flag indicating that the given name is already included +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +bool +</dd> +</dl><a NAME="IdlCompilerOptionsDialog.__generateDefinedNamesList" ID="IdlCompilerOptionsDialog.__generateDefinedNamesList"></a> +<h4>IdlCompilerOptionsDialog.__generateDefinedNamesList</h4> +<b>__generateDefinedNamesList</b>(<i></i>) +<p> + Private method to prepare the list of 'Defined Names'. +</p><dl> +<dt>Returns:</dt> +<dd> +list of 'Defined Names' +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +list of str +</dd> +</dl><a NAME="IdlCompilerOptionsDialog.__generateIncludeDirectoriesList" ID="IdlCompilerOptionsDialog.__generateIncludeDirectoriesList"></a> +<h4>IdlCompilerOptionsDialog.__generateIncludeDirectoriesList</h4> +<b>__generateIncludeDirectoriesList</b>(<i></i>) +<p> + Private method to prepare the list of 'Include Directories'. +</p><dl> +<dt>Returns:</dt> +<dd> +list of 'Include Directories' +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +list of str +</dd> +</dl><a NAME="IdlCompilerOptionsDialog.__generateUndefinedNamesList" ID="IdlCompilerOptionsDialog.__generateUndefinedNamesList"></a> +<h4>IdlCompilerOptionsDialog.__generateUndefinedNamesList</h4> +<b>__generateUndefinedNamesList</b>(<i></i>) +<p> + Private method to prepare the list of 'Undefined Names'. +</p><dl> +<dt>Returns:</dt> +<dd> +list of 'Undefined Names' +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +list of str +</dd> +</dl><a NAME="IdlCompilerOptionsDialog.__includeDirectoriesContain" ID="IdlCompilerOptionsDialog.__includeDirectoriesContain"></a> +<h4>IdlCompilerOptionsDialog.__includeDirectoriesContain</h4> +<b>__includeDirectoriesContain</b>(<i>directory</i>) +<p> + Private method to test, if the currently defined 'Include Directories' + contain a given one. +</p><dl> +<dt><i>directory</i> (str)</dt> +<dd> +directory name to be tested +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +flag indicating that the given directory is already included +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +bool +</dd> +</dl><a NAME="IdlCompilerOptionsDialog.__populateDefineNamesList" ID="IdlCompilerOptionsDialog.__populateDefineNamesList"></a> +<h4>IdlCompilerOptionsDialog.__populateDefineNamesList</h4> +<b>__populateDefineNamesList</b>(<i>definedNames</i>) +<p> + Private method to populate the list of defined names. +</p><dl> +<dt><i>definedNames</i> (list of str)</dt> +<dd> +list of defined variables with name and value + separated by '=' +</dd> +</dl><a NAME="IdlCompilerOptionsDialog.__populateIncludeDirectoriesList" ID="IdlCompilerOptionsDialog.__populateIncludeDirectoriesList"></a> +<h4>IdlCompilerOptionsDialog.__populateIncludeDirectoriesList</h4> +<b>__populateIncludeDirectoriesList</b>(<i>includeDirectories</i>) +<p> + Private method to populate the 'Include Directories' list. +</p><dl> +<dt><i>includeDirectories</i> (list of str)</dt> +<dd> +list of include directories +</dd> +</dl><a NAME="IdlCompilerOptionsDialog.__undefinedNamesContain" ID="IdlCompilerOptionsDialog.__undefinedNamesContain"></a> +<h4>IdlCompilerOptionsDialog.__undefinedNamesContain</h4> +<b>__undefinedNamesContain</b>(<i>name</i>) +<p> + Private method to test, if the currently defined 'Undefined Names' + contain a given one. +</p><dl> +<dt><i>name</i> (str)</dt> +<dd> +variable name to be tested +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +flag indicating that the given name is already included +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +bool +</dd> +</dl><a NAME="IdlCompilerOptionsDialog.__updateDefineNameButtons" ID="IdlCompilerOptionsDialog.__updateDefineNameButtons"></a> +<h4>IdlCompilerOptionsDialog.__updateDefineNameButtons</h4> +<b>__updateDefineNameButtons</b>(<i></i>) +<p> + Private method to set the state of the 'Define Name' buttons. +</p><a NAME="IdlCompilerOptionsDialog.__updateIncludeDirectoryButtons" ID="IdlCompilerOptionsDialog.__updateIncludeDirectoryButtons"></a> +<h4>IdlCompilerOptionsDialog.__updateIncludeDirectoryButtons</h4> +<b>__updateIncludeDirectoryButtons</b>(<i></i>) +<p> + Private method to set the state of the 'Include Directory' buttons. +</p><a NAME="IdlCompilerOptionsDialog.__updateUndefineNameButtons" ID="IdlCompilerOptionsDialog.__updateUndefineNameButtons"></a> +<h4>IdlCompilerOptionsDialog.__updateUndefineNameButtons</h4> +<b>__updateUndefineNameButtons</b>(<i></i>) +<p> + Private method to set the state of the 'Undefine Name' buttons. +</p><a NAME="IdlCompilerOptionsDialog.getData" ID="IdlCompilerOptionsDialog.getData"></a> +<h4>IdlCompilerOptionsDialog.getData</h4> +<b>getData</b>(<i></i>) +<p> + Public method to return the data entered by the user. +</p><dl> +<dt>Returns:</dt> +<dd> +tuple containing the list of include directories, list of + defined names and list of undefined names +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +tuple of (list of str, list of str, list of str) +</dd> +</dl><a NAME="IdlCompilerOptionsDialog.on_dnAddButton_clicked" ID="IdlCompilerOptionsDialog.on_dnAddButton_clicked"></a> +<h4>IdlCompilerOptionsDialog.on_dnAddButton_clicked</h4> +<b>on_dnAddButton_clicked</b>(<i></i>) +<p> + Private slot to add a 'Define Name' entry. +</p><a NAME="IdlCompilerOptionsDialog.on_dnDeleteButton_clicked" ID="IdlCompilerOptionsDialog.on_dnDeleteButton_clicked"></a> +<h4>IdlCompilerOptionsDialog.on_dnDeleteButton_clicked</h4> +<b>on_dnDeleteButton_clicked</b>(<i></i>) +<p> + Private slot to delete the selected 'Define Name' entry. +</p><a NAME="IdlCompilerOptionsDialog.on_dnEditButton_clicked" ID="IdlCompilerOptionsDialog.on_dnEditButton_clicked"></a> +<h4>IdlCompilerOptionsDialog.on_dnEditButton_clicked</h4> +<b>on_dnEditButton_clicked</b>(<i></i>) +<p> + Private slot to edit the selected 'Define Name' entry. +</p><a NAME="IdlCompilerOptionsDialog.on_dnList_itemSelectionChanged" ID="IdlCompilerOptionsDialog.on_dnList_itemSelectionChanged"></a> +<h4>IdlCompilerOptionsDialog.on_dnList_itemSelectionChanged</h4> +<b>on_dnList_itemSelectionChanged</b>(<i></i>) +<p> + Private slot handling the selection of a 'Define Name' entry. +</p><a NAME="IdlCompilerOptionsDialog.on_idAddButton_clicked" ID="IdlCompilerOptionsDialog.on_idAddButton_clicked"></a> +<h4>IdlCompilerOptionsDialog.on_idAddButton_clicked</h4> +<b>on_idAddButton_clicked</b>(<i></i>) +<p> + Private slot to add an 'Include Directory'. +</p><a NAME="IdlCompilerOptionsDialog.on_idDeleteButton_clicked" ID="IdlCompilerOptionsDialog.on_idDeleteButton_clicked"></a> +<h4>IdlCompilerOptionsDialog.on_idDeleteButton_clicked</h4> +<b>on_idDeleteButton_clicked</b>(<i></i>) +<p> + Private slot to delete the selected 'Include Directory' entry. +</p><a NAME="IdlCompilerOptionsDialog.on_idEditButton_clicked" ID="IdlCompilerOptionsDialog.on_idEditButton_clicked"></a> +<h4>IdlCompilerOptionsDialog.on_idEditButton_clicked</h4> +<b>on_idEditButton_clicked</b>(<i></i>) +<p> + Private slot to edit the selected 'Include Directory' entry. +</p><a NAME="IdlCompilerOptionsDialog.on_idList_itemSelectionChanged" ID="IdlCompilerOptionsDialog.on_idList_itemSelectionChanged"></a> +<h4>IdlCompilerOptionsDialog.on_idList_itemSelectionChanged</h4> +<b>on_idList_itemSelectionChanged</b>(<i></i>) +<p> + Private slot handling the selection of an 'Include Directory' entry. +</p><a NAME="IdlCompilerOptionsDialog.on_unAddButton_clicked" ID="IdlCompilerOptionsDialog.on_unAddButton_clicked"></a> +<h4>IdlCompilerOptionsDialog.on_unAddButton_clicked</h4> +<b>on_unAddButton_clicked</b>(<i></i>) +<p> + Private slot to add a 'Undefine Name' entry. +</p><a NAME="IdlCompilerOptionsDialog.on_unDeleteButton_clicked" ID="IdlCompilerOptionsDialog.on_unDeleteButton_clicked"></a> +<h4>IdlCompilerOptionsDialog.on_unDeleteButton_clicked</h4> +<b>on_unDeleteButton_clicked</b>(<i></i>) +<p> + Private slot to delete the selected 'Undefine Name' entry. +</p><a NAME="IdlCompilerOptionsDialog.on_unEditButton_clicked" ID="IdlCompilerOptionsDialog.on_unEditButton_clicked"></a> +<h4>IdlCompilerOptionsDialog.on_unEditButton_clicked</h4> +<b>on_unEditButton_clicked</b>(<i></i>) +<p> + Private slot to edit the selected 'Undefine Name' entry. +</p><a NAME="IdlCompilerOptionsDialog.on_unList_itemSelectionChanged" ID="IdlCompilerOptionsDialog.on_unList_itemSelectionChanged"></a> +<h4>IdlCompilerOptionsDialog.on_unList_itemSelectionChanged</h4> +<b>on_unList_itemSelectionChanged</b>(<i></i>) +<p> + Private slot handling the selection of a 'Undefine Name' entry. +</p> +<div align="right"><a href="#top">Up</a></div> +<hr /> +</body></html> \ No newline at end of file
--- a/Documentation/Source/eric6.Project.Project.html Sat Jul 07 12:01:23 2018 +0200 +++ b/Documentation/Source/eric6.Project.Project.html Wed Aug 01 19:43:34 2018 +0200 @@ -604,6 +604,9 @@ <td><a href="#Project.handlePreferencesChanged">handlePreferencesChanged</a></td> <td>Public slot used to handle the preferencesChanged signal.</td> </tr><tr> +<td><a href="#Project.hasDefaultIdlCompilerParameters">hasDefaultIdlCompilerParameters</a></td> +<td>Public method to test, if the project contains the default IDL compiler parameters.</td> +</tr><tr> <td><a href="#Project.hasDefaultMakeParameters">hasDefaultMakeParameters</a></td> <td>Public method to test, if the project contains the default make parameters.</td> </tr><tr> @@ -2129,7 +2132,23 @@ <b>handlePreferencesChanged</b>(<i></i>) <p> Public slot used to handle the preferencesChanged signal. -</p><a NAME="Project.hasDefaultMakeParameters" ID="Project.hasDefaultMakeParameters"></a> +</p><a NAME="Project.hasDefaultIdlCompilerParameters" ID="Project.hasDefaultIdlCompilerParameters"></a> +<h4>Project.hasDefaultIdlCompilerParameters</h4> +<b>hasDefaultIdlCompilerParameters</b>(<i></i>) +<p> + Public method to test, if the project contains the default IDL compiler + parameters. +</p><dl> +<dt>Returns:</dt> +<dd> +flag indicating default parameter set +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +bool +</dd> +</dl><a NAME="Project.hasDefaultMakeParameters" ID="Project.hasDefaultMakeParameters"></a> <h4>Project.hasDefaultMakeParameters</h4> <b>hasDefaultMakeParameters</b>(<i></i>) <p>
--- a/Documentation/Source/eric6.Project.ProjectBrowser.html Sat Jul 07 12:01:23 2018 +0200 +++ b/Documentation/Source/eric6.Project.ProjectBrowser.html Wed Aug 01 19:43:34 2018 +0200 @@ -111,9 +111,6 @@ </tr><tr> <td><a href="#ProjectBrowser.handlePreferencesChanged">handlePreferencesChanged</a></td> <td>Public slot used to handle the preferencesChanged signal.</td> -</tr><tr> -<td><a href="#ProjectBrowser.showEvent">showEvent</a></td> -<td>Protected method handleing the show event.</td> </tr> </table> <h3>Static Methods</h3> @@ -122,7 +119,7 @@ </table> <a NAME="ProjectBrowser.__init__" ID="ProjectBrowser.__init__"></a> <h4>ProjectBrowser (Constructor)</h4> -<b>ProjectBrowser</b>(<i>project, parent=None, embeddedBrowser=True</i>) +<b>ProjectBrowser</b>(<i>project, parent=None</i>) <p> Constructor </p><dl> @@ -132,12 +129,6 @@ </dd><dt><i>parent</i></dt> <dd> parent widget (QWidget) -</dd><dt><i>embeddedBrowser</i></dt> -<dd> -flag indicating whether the file browser should - be included. This flag is set to False by those layouts, that - have the file browser in a separate window or embedded - in the debeug browser instead </dd> </dl><a NAME="ProjectBrowser.__currentChanged" ID="ProjectBrowser.__currentChanged"></a> <h4>ProjectBrowser.__currentChanged</h4> @@ -269,17 +260,7 @@ <b>handlePreferencesChanged</b>(<i></i>) <p> Public slot used to handle the preferencesChanged signal. -</p><a NAME="ProjectBrowser.showEvent" ID="ProjectBrowser.showEvent"></a> -<h4>ProjectBrowser.showEvent</h4> -<b>showEvent</b>(<i>evt</i>) -<p> - Protected method handleing the show event. -</p><dl> -<dt><i>evt</i></dt> -<dd> -show event to handle (QShowEvent) -</dd> -</dl> +</p> <div align="right"><a href="#top">Up</a></div> <hr /> </body></html> \ No newline at end of file
--- a/Documentation/Source/eric6.Project.ProjectInterfacesBrowser.html Sat Jul 07 12:01:23 2018 +0200 +++ b/Documentation/Source/eric6.Project.ProjectInterfacesBrowser.html Wed Aug 01 19:43:34 2018 +0200 @@ -100,6 +100,9 @@ <td><a href="#ProjectInterfacesBrowser.__configureCorba">__configureCorba</a></td> <td>Private method to open the configuration dialog.</td> </tr><tr> +<td><a href="#ProjectInterfacesBrowser.__configureIdlCompiler">__configureIdlCompiler</a></td> +<td>Private method to show a dialog to configure some options for the IDL compiler.</td> +</tr><tr> <td><a href="#ProjectInterfacesBrowser.__deleteFile">__deleteFile</a></td> <td>Private method to delete files from the project.</td> </tr><tr> @@ -215,6 +218,12 @@ <b>__configureCorba</b>(<i></i>) <p> Private method to open the configuration dialog. +</p><a NAME="ProjectInterfacesBrowser.__configureIdlCompiler" ID="ProjectInterfacesBrowser.__configureIdlCompiler"></a> +<h4>ProjectInterfacesBrowser.__configureIdlCompiler</h4> +<b>__configureIdlCompiler</b>(<i></i>) +<p> + Private method to show a dialog to configure some options for the + IDL compiler. </p><a NAME="ProjectInterfacesBrowser.__deleteFile" ID="ProjectInterfacesBrowser.__deleteFile"></a> <h4>ProjectInterfacesBrowser.__deleteFile</h4> <b>__deleteFile</b>(<i></i>)
--- a/Documentation/Source/eric6.UI.UserInterface.html Sat Jul 07 12:01:23 2018 +0200 +++ b/Documentation/Source/eric6.UI.UserInterface.html Wed Aug 01 19:43:34 2018 +0200 @@ -735,6 +735,9 @@ <td><a href="#UserInterface.getHelpViewer">getHelpViewer</a></td> <td>Public method to get a reference to the help window instance.</td> </tr><tr> +<td><a href="#UserInterface.getLayoutType">getLayoutType</a></td> +<td>Public method to get the current layout type.</td> +</tr><tr> <td><a href="#UserInterface.getLocale">getLocale</a></td> <td>Public method to get the locale of the IDE.</td> </tr><tr> @@ -1521,10 +1524,15 @@ Private slot to handle the Feature Request dialog. </p><a NAME="UserInterface.__restart" ID="UserInterface.__restart"></a> <h4>UserInterface.__restart</h4> -<b>__restart</b>(<i></i>) +<b>__restart</b>(<i>ask=False</i>) <p> Private method to restart the application. -</p><a NAME="UserInterface.__saveCurrentViewProfile" ID="UserInterface.__saveCurrentViewProfile"></a> +</p><dl> +<dt><i>ask</i> (bool)</dt> +<dd> +flag indicating to ask the user for permission +</dd> +</dl><a NAME="UserInterface.__saveCurrentViewProfile" ID="UserInterface.__saveCurrentViewProfile"></a> <h4>UserInterface.__saveCurrentViewProfile</h4> <b>__saveCurrentViewProfile</b>(<i>save</i>) <p> @@ -2294,6 +2302,21 @@ <dd> reference to the help window instance (HelpWindow) </dd> +</dl><a NAME="UserInterface.getLayoutType" ID="UserInterface.getLayoutType"></a> +<h4>UserInterface.getLayoutType</h4> +<b>getLayoutType</b>(<i></i>) +<p> + Public method to get the current layout type. +</p><dl> +<dt>Returns:</dt> +<dd> +current layout type +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +str +</dd> </dl><a NAME="UserInterface.getLocale" ID="UserInterface.getLocale"></a> <h4>UserInterface.getLocale</h4> <b>getLocale</b>(<i></i>)
--- a/Documentation/Source/eric6.WebBrowser.CookieJar.CookieJar.html Sat Jul 07 12:01:23 2018 +0200 +++ b/Documentation/Source/eric6.WebBrowser.CookieJar.CookieJar.html Wed Aug 01 19:43:34 2018 +0200 @@ -70,6 +70,9 @@ <td><a href="#CookieJar.__cookieAdded">__cookieAdded</a></td> <td>Private slot handling the addition of a cookie.</td> </tr><tr> +<td><a href="#CookieJar.__cookieFilter">__cookieFilter</a></td> +<td>Private method to filter cookies.</td> +</tr><tr> <td><a href="#CookieJar.__cookieRemoved">__cookieRemoved</a></td> <td>Private slot handling the removal of a cookie.</td> </tr><tr> @@ -167,6 +170,28 @@ <dd> cookie which was added </dd> +</dl><a NAME="CookieJar.__cookieFilter" ID="CookieJar.__cookieFilter"></a> +<h4>CookieJar.__cookieFilter</h4> +<b>__cookieFilter</b>(<i>request</i>) +<p> + Private method to filter cookies. +</p><p> + Note: This method is used for Qt 5.11+ only. +</p><dl> +<dt><i>request</i> (QWebEngineCookieStore.FilterRequest)</dt> +<dd> +reference to the cookie filter request object +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +flag indicating cookie access is allowed +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +bool +</dd> </dl><a NAME="CookieJar.__cookieRemoved" ID="CookieJar.__cookieRemoved"></a> <h4>CookieJar.__cookieRemoved</h4> <b>__cookieRemoved</b>(<i>cookie</i>)
--- a/Documentation/Source/eric6.WebBrowser.WebBrowserView.html Sat Jul 07 12:01:23 2018 +0200 +++ b/Documentation/Source/eric6.WebBrowser.WebBrowserView.html Wed Aug 01 19:43:34 2018 +0200 @@ -203,6 +203,12 @@ <td><a href="#WebBrowserView.__printPage">__printPage</a></td> <td>Private slot to support printing from the web page.</td> </tr><tr> +<td><a href="#WebBrowserView.__quotaRequested">__quotaRequested</a></td> +<td>Private slot to handle quota requests of the web page.</td> +</tr><tr> +<td><a href="#WebBrowserView.__registerProtocolHandlerRequested">__registerProtocolHandlerRequested</a></td> +<td>Private slot to handle requests for registration of a protocol handler.</td> +</tr><tr> <td><a href="#WebBrowserView.__reloadAllSpeedDials">__reloadAllSpeedDials</a></td> <td>Private slot to reload all speed dials.</td> </tr><tr> @@ -813,7 +819,27 @@ <b>__printPage</b>(<i></i>) <p> Private slot to support printing from the web page. -</p><a NAME="WebBrowserView.__reloadAllSpeedDials" ID="WebBrowserView.__reloadAllSpeedDials"></a> +</p><a NAME="WebBrowserView.__quotaRequested" ID="WebBrowserView.__quotaRequested"></a> +<h4>WebBrowserView.__quotaRequested</h4> +<b>__quotaRequested</b>(<i>quotaRequest</i>) +<p> + Private slot to handle quota requests of the web page. +</p><dl> +<dt><i>quotaRequest</i> (QWebEngineQuotaRequest)</dt> +<dd> +reference to the quota request object +</dd> +</dl><a NAME="WebBrowserView.__registerProtocolHandlerRequested" ID="WebBrowserView.__registerProtocolHandlerRequested"></a> +<h4>WebBrowserView.__registerProtocolHandlerRequested</h4> +<b>__registerProtocolHandlerRequested</b>(<i>request</i>) +<p> + Private slot to handle requests for registration of a protocol handler. +</p><dl> +<dt><i>request</i> (QWebEngineRegisterProtocolHandlerRequest)</dt> +<dd> +reference to the protocol handler request object +</dd> +</dl><a NAME="WebBrowserView.__reloadAllSpeedDials" ID="WebBrowserView.__reloadAllSpeedDials"></a> <h4>WebBrowserView.__reloadAllSpeedDials</h4> <b>__reloadAllSpeedDials</b>(<i></i>) <p>
--- a/Documentation/Source/index-eric6.E5Gui.html Sat Jul 07 12:01:23 2018 +0200 +++ b/Documentation/Source/index-eric6.E5Gui.html Wed Aug 01 19:43:34 2018 +0200 @@ -99,6 +99,9 @@ <td><a href="eric6.E5Gui.E5PathPicker.html">E5PathPicker</a></td> <td>Module implementing a path picker widget.</td> </tr><tr> +<td><a href="eric6.E5Gui.E5PathPickerDialog.html">E5PathPickerDialog</a></td> +<td>Module implementing a dialog to enter a file system path using a file picker.</td> +</tr><tr> <td><a href="eric6.E5Gui.E5ProgressDialog.html">E5ProgressDialog</a></td> <td>Module implementing a progress dialog allowing a customized progress bar label.</td> </tr><tr>
--- a/Documentation/Source/index-eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.html Sat Jul 07 12:01:23 2018 +0200 +++ b/Documentation/Source/index-eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.html Wed Aug 01 19:43:34 2018 +0200 @@ -40,6 +40,9 @@ <td><a href="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.GoogleV2Engine.html">GoogleV2Engine</a></td> <td>Module implementing the Google V2 translation engine.</td> </tr><tr> +<td><a href="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.IbmWatsonEngine.html">IbmWatsonEngine</a></td> +<td>Module implementing the IBM Watson translation engine.</td> +</tr><tr> <td><a href="eric6.Plugins.UiExtensionPlugins.Translator.TranslatorEngines.MicrosoftEngine.html">MicrosoftEngine</a></td> <td>Module implementing the Microsoft translation engine.</td> </tr><tr>
--- a/Documentation/Source/index-eric6.Project.html Sat Jul 07 12:01:23 2018 +0200 +++ b/Documentation/Source/index-eric6.Project.html Wed Aug 01 19:43:34 2018 +0200 @@ -56,6 +56,12 @@ <td><a href="eric6.Project.FiletypeAssociationDialog.html">FiletypeAssociationDialog</a></td> <td>Module implementing a dialog to enter filetype associations for the project.</td> </tr><tr> +<td><a href="eric6.Project.IdlCompilerDefineNameDialog.html">IdlCompilerDefineNameDialog</a></td> +<td>Module implementing a dialog to enter the name-value pair to define a variable for the IDL compiler.</td> +</tr><tr> +<td><a href="eric6.Project.IdlCompilerOptionsDialog.html">IdlCompilerOptionsDialog</a></td> +<td>Module implementing a dialog to enter some IDL compiler options.</td> +</tr><tr> <td><a href="eric6.Project.LexerAssociationDialog.html">LexerAssociationDialog</a></td> <td>Module implementing a dialog to enter lexer associations for the project.</td> </tr><tr>
--- a/E5Gui/E5ListSelectionDialog.py Sat Jul 07 12:01:23 2018 +0200 +++ b/E5Gui/E5ListSelectionDialog.py Wed Aug 01 19:43:34 2018 +0200 @@ -9,8 +9,9 @@ from __future__ import unicode_literals -from PyQt5.QtCore import pyqtSlot -from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QAbstractItemView +from PyQt5.QtCore import pyqtSlot, Qt +from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QAbstractItemView, \ + QListWidgetItem from .Ui_E5ListSelectionDialog import Ui_E5ListSelectionDialog @@ -21,7 +22,7 @@ """ def __init__(self, entries, selectionMode=QAbstractItemView.ExtendedSelection, - title="", message="", parent=None): + title="", message="", checkBoxSelection=False, parent=None): """ Constructor @@ -33,19 +34,32 @@ @type str @param message message to be show in the dialog @type str + @param checkBoxSelection flag indicating to select items via their + checkbox + @type bool @param parent reference to the parent widget @type QWidget """ super(E5ListSelectionDialog, self).__init__(parent) self.setupUi(self) - self.selectionList.setSelectionMode(selectionMode) if title: self.setWindowTitle(title) if message: self.messageLabel.setText(message) - self.selectionList.addItems(entries) + self.__checkCount = 0 + self.__isCheckBoxSelection = checkBoxSelection + if self.__isCheckBoxSelection: + self.selectionList.setSelectionMode(QAbstractItemView.NoSelection) + for entry in entries: + itm = QListWidgetItem(entry) + itm.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled) + itm.setCheckState(Qt.Unchecked) + self.selectionList.addItem(itm) + else: + self.selectionList.setSelectionMode(selectionMode) + self.selectionList.addItems(entries) self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(False) @@ -54,8 +68,24 @@ """ Private slot handling a change of the selection. """ - self.buttonBox.button(QDialogButtonBox.Ok).setEnabled( - len(self.selectionList.selectedItems()) > 0) + if not self.__isCheckBoxSelection: + self.buttonBox.button(QDialogButtonBox.Ok).setEnabled( + len(self.selectionList.selectedItems()) > 0) + + def on_selectionList_itemChanged(self, itm): + """ + Private slot handling a change of an item. + + @param itm reference to the changed item + @type QListWidgetItem + """ + if self.__isCheckBoxSelection: + if itm.checkState() == Qt.Checked: + self.__checkCount += 1 + else: + self.__checkCount -= 1 + self.buttonBox.button(QDialogButtonBox.Ok).setEnabled( + self.__checkCount > 0) def getSelection(self): """ @@ -65,6 +95,12 @@ @rtype list of str """ entries = [] - for item in self.selectionList.selectedItems(): - entries.append(item.text()) + if self.__isCheckBoxSelection: + for row in range(self.selectionList.count()): + item = self.selectionList.item(row) + if item.checkState() == Qt.Checked: + entries.append(item.text()) + else: + for item in self.selectionList.selectedItems(): + entries.append(item.text()) return entries
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/E5Gui/E5PathPickerDialog.py Wed Aug 01 19:43:34 2018 +0200 @@ -0,0 +1,162 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2018 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a dialog to enter a file system path using a file picker. +""" + +from __future__ import unicode_literals + +from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QVBoxLayout, QLabel + +from .E5PathPicker import E5PathPicker, E5PathPickerModes + +class E5PathPickerDialog(QDialog): + """ + Class implementing a dialog to enter a file system path using a file + picker. + """ + def __init__(self, parent=None): + """ + Constructor + + @param parent reference to the parent widget + @type QWidget + """ + super(E5PathPickerDialog, self).__init__(parent) + + self.setMinimumWidth(400) + + self.__layout = QVBoxLayout(self) + + self.__label = QLabel(self) + self.__label.setWordWrap(True) + + self.__pathPicker = E5PathPicker(self) + self.__buttonBox = QDialogButtonBox( + QDialogButtonBox.Cancel | QDialogButtonBox.Ok, self) + + self.__layout.addWidget(self.__label) + self.__layout.addWidget(self.__pathPicker) + self.__layout.addWidget(self.__buttonBox) + + self.__buttonBox.accepted.connect(self.accept) + self.__buttonBox.rejected.connect(self.reject) + + def setLabelText(self, text): + """ + Public method to set the label text. + + @param text label text + @type str + """ + self.__label.setText(text) + + def setTitle(self, title): + """ + Public method to set the window title. + + @param title window title + @type str + """ + self.setWindowTitle(title) + self.__pathPicker.setWindowTitle(title) + + def setPickerMode(self, mode): + """ + Public method to set the mode of the path picker. + + @param mode picker mode + @type E5PathPickerModes + """ + self.__pathPicker.setMode(mode) + + def setPickerPath(self, path): + """ + Public method to set the path of the path picker. + + @param path path to be set + @type str + """ + self.__pathPicker.setPath(path) + + def setDefaultDirectory(self, directory): + """ + Public method to set the default directory of the path picker. + + @param directory default directory + @type str + """ + self.__pathPicker.setDefaultDirectory(directory) + + def setPickerFilters(self, filters): + """ + Public method to set the filters of the path picker. + + Note: Multiple filters must be separated by ';;'. + + @param filters string containing the file filters + @type str + """ + self.__pathPicker.setFilters(filters) + + def getPath(self): + """ + Public method to get the current path. + + @return current path + @rtype str + """ + return self.__pathPicker.path() + + +def getPath(parent, title, label, mode=E5PathPickerModes.OpenFileMode, + path="", defaultDirectory="", filters=None): + """ + Function to get a file or directory path from the user. + + @param parent reference to the parent widget + @type QWidget + @param title title of the dialog + @type str + @param label text to be shown above the path picker + @type str + @param mode mode of the path picker + @type E5PathPickerModes + @param path initial path to be shown + @type str + @param defaultDirectory default directory of the path picker selection + dialog + @type str + @param filters list of file filters + @type list of str + @return tuple containing the entered path and a flag indicating that the + user pressed the OK button + @rtype tuple of (str, bool) + """ + # step 1: setup of the dialog + dlg = E5PathPickerDialog(parent) + if title: + dlg.setTitle(title) + if label: + dlg.setLabelText(label) + dlg.setPickerMode(mode) + if path: + dlg.setPickerPath(path) + if defaultDirectory: + dlg.setDefaultDirectory(defaultDirectory) + if filters is not None and len(filters) > 0: + dlg.setPickerFilters(";;".join(filters)) + + # step 2: show the dialog and get the result + if dlg.exec_() == QDialog.Accepted: + ok = True + path = dlg.getPath().strip() + else: + ok = False + path = "" + + # step 3: return the result + return path, ok
--- a/E5XML/Config.py Sat Jul 07 12:01:23 2018 +0200 +++ b/E5XML/Config.py Wed Aug 01 19:43:34 2018 +0200 @@ -11,7 +11,8 @@ multiProjectFileFormatVersion = "5.1" # version numbers of the project file -projectFileFormatVersion = "6.1" +projectFileFormatVersion = "6.2" +projectFileFormatVersionMake = "6.1" projectFileFormatVersionProto = "6.0" projectFileFormatVersionAlt = "5.1"
--- a/E5XML/ProjectReader.py Sat Jul 07 12:01:23 2018 +0200 +++ b/E5XML/ProjectReader.py Wed Aug 01 19:43:34 2018 +0200 @@ -19,7 +19,7 @@ """ Class for reading an XML project file. """ - supportedVersions = ["4.6", "5.0", "5.1", "6.0", "6.1"] + supportedVersions = ["4.6", "5.0", "5.1", "6.0", "6.1", "6.2"] def __init__(self, device, project): """ @@ -115,6 +115,9 @@ elif self.name() == "Make": self.__readBasicDataField( "Make", "MakeParameters", "MAKEPARAMS") + elif self.name() == "IdlCompiler": + self.__readBasicDataField( + "IdlCompiler", "IdlCompilerParameters", "IDLPARAMS") elif self.name() == "ProjectTypeSpecific": self.__readBasicDataField( "ProjectTypeSpecific", "ProjectTypeSpecificData",
--- a/E5XML/ProjectWriter.py Sat Jul 07 12:01:23 2018 +0200 +++ b/E5XML/ProjectWriter.py Wed Aug 01 19:43:34 2018 +0200 @@ -14,8 +14,8 @@ from E5Gui.E5Application import e5App from .XMLStreamWriterBase import XMLStreamWriterBase -from .Config import projectFileFormatVersion, projectFileFormatVersionProto, \ - projectFileFormatVersionAlt +from .Config import projectFileFormatVersion, projectFileFormatVersionMake, \ + projectFileFormatVersionProto, projectFileFormatVersionAlt import Preferences import Utilities @@ -43,8 +43,10 @@ """ XMLStreamWriterBase.writeXML(self) - if not e5App().getObject("Project").hasDefaultMakeParameters(): + if not e5App().getObject("Project").hasDefaultIdlCompilerParameters(): fileFormatVersion = projectFileFormatVersion + elif not e5App().getObject("Project").hasDefaultMakeParameters(): + fileFormatVersion = projectFileFormatVersionMake elif self.pdata["PROTOCOLS"]: fileFormatVersion = projectFileFormatVersionProto else: @@ -223,6 +225,12 @@ self.writeBasics("MakeParameters", self.pdata["MAKEPARAMS"]) self.writeEndElement() + # do the 'IDL' parameters + if not e5App().getObject("Project").hasDefaultIdlCompilerParameters(): + self.writeStartElement("IdlCompiler") + self.writeBasics("IdlCompilerParameters", self.pdata["IDLPARAMS"]) + self.writeEndElement() + # do the extra project data stuff if len(self.pdata["PROJECTTYPESPECIFICDATA"]): self.writeStartElement("ProjectTypeSpecific")
--- a/E5XML/TemplatesReader.py Sat Jul 07 12:01:23 2018 +0200 +++ b/E5XML/TemplatesReader.py Wed Aug 01 19:43:34 2018 +0200 @@ -9,8 +9,6 @@ from __future__ import unicode_literals -from E5Gui.E5Application import e5App - from .Config import templatesFileFormatVersion from .XMLStreamReaderBase import XMLStreamReaderBase @@ -21,7 +19,7 @@ """ supportedVersions = ["4.0"] - def __init__(self, device, viewer=None): + def __init__(self, device, viewer): """ Constructor @@ -30,10 +28,7 @@ """ XMLStreamReaderBase.__init__(self, device) - if viewer: - self.viewer = viewer - else: - self.viewer = e5App().getObject("TemplateViewer") + self.__viewer = viewer self.version = "" self.groupName = "DEFAULT" @@ -63,7 +58,7 @@ """ self.groupName = self.attribute('name', "DEFAULT") language = self.attribute('language', "All") - self.viewer.addGroup(self.groupName, language) + self.__viewer.addGroup(self.groupName, language) while not self.atEnd(): self.readNext() @@ -89,9 +84,9 @@ if self.isEndElement() and \ self.name() == "Template" and \ templateName: - self.viewer.addEntry(self.groupName, templateName, - templateDescription, templateText, - quiet=True) + self.__viewer.addEntry(self.groupName, templateName, + templateDescription, templateText, + quiet=True) break if self.isStartElement():
--- a/Helpviewer/OpenSearch/OpenSearchReader.py Sat Jul 07 12:01:23 2018 +0200 +++ b/Helpviewer/OpenSearch/OpenSearchReader.py Wed Aug 01 19:43:34 2018 +0200 @@ -74,7 +74,7 @@ if (not type_ or type_ == "text/html" or type_ == "application/xhtml+xml") and \ - engine.suggestionsUrlTemplate(): + engine.searchUrlTemplate(): continue if not url:
--- a/Plugins/PluginTranslator.py Sat Jul 07 12:01:23 2018 +0200 +++ b/Plugins/PluginTranslator.py Wed Aug 01 19:43:34 2018 +0200 @@ -79,9 +79,6 @@ Preferences.Prefs.settings.remove(TranslatorPlugin.PreferencesKey) -# TODO: add support for IBM Watson translator -# https://www.ibm.com/watson/developercloud/language-translator -# https://www.ibm.com/watson/services/language-translator/ class TranslatorPlugin(QObject): """ Class implementing the Translator plug-in. @@ -112,6 +109,9 @@ # Google "GoogleEnableDictionary": False, "GoogleV2Key": "", + # IBM Watson Language Translator + "IbmUrl": "", + "IbmKey": "", # Microsoft "MsTranslatorKey": "", "MsAuthToken": "",
--- a/Plugins/UiExtensionPlugins/Translator/ConfigurationPage/TranslatorPage.py Sat Jul 07 12:01:23 2018 +0200 +++ b/Plugins/UiExtensionPlugins/Translator/ConfigurationPage/TranslatorPage.py Wed Aug 01 19:43:34 2018 +0200 @@ -43,6 +43,10 @@ """<p>A key is <b>required</b> to use this service.""" """ <a href="{0}">Get a commercial API key.</a></p>""").format( TranslatorEngines.getKeyUrl("googlev2"))) + self.ibmLabel.setText(self.tr( + """<p>A key is <b>required</b> to use this service.""" + """ <a href="{0}">Register with IBM Cloud.</a></p>""").format( + TranslatorEngines.getKeyUrl("ibm_watson"))) self.msLabel.setText(self.tr( """<p>A registration of the text translation service is""" """ <b>required</b>. <a href="{0}">Register with Microsoft""" @@ -77,6 +81,11 @@ self.__plugin.getPreferences("GoogleEnableDictionary")) self.googlev2KeyEdit.setText( self.__plugin.getPreferences("GoogleV2Key")) + # IBM Watson settings + self.ibmUrlEdit.setText( + self.__plugin.getPreferences("IbmUrl")) + self.ibmKeyEdit.setText( + self.__plugin.getPreferences("IbmKey")) # Microsoft settings self.msSubscriptionKeyEdit.setText( self.__plugin.getPreferences("MsTranslatorKey")) @@ -105,6 +114,11 @@ "GoogleEnableDictionary", self.dictionaryCheckBox.isChecked()) self.__plugin.setPreferences( "GoogleV2Key", self.googlev2KeyEdit.text()) + # IBM Watson settings + self.__plugin.setPreferences( + "IbmUrl", self.ibmUrlEdit.text()) + self.__plugin.setPreferences( + "IbmKey", self.ibmKeyEdit.text()) # Microsoft settings self.__plugin.setPreferences( "MsTranslatorKey", self.msSubscriptionKeyEdit.text())
--- a/Plugins/UiExtensionPlugins/Translator/ConfigurationPage/TranslatorPage.ui Sat Jul 07 12:01:23 2018 +0200 +++ b/Plugins/UiExtensionPlugins/Translator/ConfigurationPage/TranslatorPage.ui Wed Aug 01 19:43:34 2018 +0200 @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>494</width> - <height>937</height> + <height>1068</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout_3"> @@ -178,6 +178,56 @@ </widget> </item> <item> + <widget class="QGroupBox" name="groupBox_7"> + <property name="title"> + <string>IBM Watson</string> + </property> + <layout class="QGridLayout" name="gridLayout_5"> + <item row="0" column="0"> + <widget class="QLabel" name="label_7"> + <property name="text"> + <string>URL:</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLineEdit" name="ibmUrlEdit"> + <property name="toolTip"> + <string>Enter your IBM Watson Translator URL</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_6"> + <property name="text"> + <string>API Key:</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLineEdit" name="ibmKeyEdit"> + <property name="toolTip"> + <string>Enter your IBM Watson Translator API key</string> + </property> + </widget> + </item> + <item row="2" column="0" colspan="2"> + <widget class="QLabel" name="ibmLabel"> + <property name="text"> + <string/> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + <property name="openExternalLinks"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> <widget class="QGroupBox" name="groupBox_6"> <property name="title"> <string>Microsoft Azure</string> @@ -304,6 +354,8 @@ <tabstop>defaultButton</tabstop> <tabstop>dictionaryCheckBox</tabstop> <tabstop>googlev2KeyEdit</tabstop> + <tabstop>ibmUrlEdit</tabstop> + <tabstop>ibmKeyEdit</tabstop> <tabstop>msSubscriptionKeyEdit</tabstop> <tabstop>mymemoryEmailEdit</tabstop> <tabstop>mymemoryKeyEdit</tabstop>
--- a/Plugins/UiExtensionPlugins/Translator/Translator.py Sat Jul 07 12:01:23 2018 +0200 +++ b/Plugins/UiExtensionPlugins/Translator/Translator.py Wed Aug 01 19:43:34 2018 +0200 @@ -92,10 +92,11 @@ """ Private slot to handle the activation of the project browser. """ - if self.__ui.layout == "Toolboxes": + uiLayoutType = self.__ui.getLayoutType() + if uiLayoutType == "Toolboxes": self.__ui.hToolboxDock.show() - self.__ui.hToolboxDock.setCurrentWidget(self.__widget) - elif self.__ui.layout == "Sidebars": + self.__ui.hToolbox.setCurrentWidget(self.__widget) + elif uiLayoutType == "Sidebars": self.__ui.bottomSidebar.show() self.__ui.bottomSidebar.setCurrentWidget(self.__widget) else:
--- a/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/DeepLEngine.py Sat Jul 07 12:01:23 2018 +0200 +++ b/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/DeepLEngine.py Wed Aug 01 19:43:34 2018 +0200 @@ -16,7 +16,7 @@ import json import re -from PyQt5.QtCore import QUrl, QByteArray +from PyQt5.QtCore import QUrl, QByteArray, QTimer from .TranslationEngine import TranslationEngine @@ -41,6 +41,8 @@ super(DeepLEngine, self).__init__(plugin, parent) self.__splitPattern = re.compile(r"([^\.!\?;]+[\.!\?;]*)") + + QTimer.singleShot(0, self.availableTranslationsLoaded.emit) def engineName(self): """
--- a/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/GlosbeEngine.py Sat Jul 07 12:01:23 2018 +0200 +++ b/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/GlosbeEngine.py Wed Aug 01 19:43:34 2018 +0200 @@ -15,7 +15,7 @@ import json -from PyQt5.QtCore import QUrl +from PyQt5.QtCore import QUrl, QTimer from .TranslationEngine import TranslationEngine @@ -36,6 +36,8 @@ @param parent reference to the parent object (QObject) """ super(GlosbeEngine, self).__init__(plugin, parent) + + QTimer.singleShot(0, self.availableTranslationsLoaded.emit) def engineName(self): """
--- a/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/GoogleV1Engine.py Sat Jul 07 12:01:23 2018 +0200 +++ b/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/GoogleV1Engine.py Wed Aug 01 19:43:34 2018 +0200 @@ -12,7 +12,7 @@ import json import re -from PyQt5.QtCore import QByteArray, QUrl +from PyQt5.QtCore import QByteArray, QUrl, QTimer import Utilities @@ -36,6 +36,8 @@ @param parent reference to the parent object (QObject) """ super(GoogleV1Engine, self).__init__(plugin, parent) + + QTimer.singleShot(0, self.availableTranslationsLoaded.emit) def engineName(self): """
--- a/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/GoogleV2Engine.py Sat Jul 07 12:01:23 2018 +0200 +++ b/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/GoogleV2Engine.py Wed Aug 01 19:43:34 2018 +0200 @@ -11,7 +11,7 @@ import json -from PyQt5.QtCore import QUrl +from PyQt5.QtCore import QUrl, QTimer from .TranslationEngine import TranslationEngine @@ -31,6 +31,8 @@ @param parent reference to the parent object (QObject) """ super(GoogleV2Engine, self).__init__(plugin, parent) + + QTimer.singleShot(0, self.availableTranslationsLoaded.emit) def engineName(self): """
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/IbmWatsonEngine.py Wed Aug 01 19:43:34 2018 +0200 @@ -0,0 +1,275 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2018 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing the IBM Watson translation engine. +""" + +from __future__ import unicode_literals +try: + str = unicode +except NameError: + pass + +import json + +from PyQt5.QtCore import QUrl, QByteArray, QTimer +from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, \ + QNetworkReply + +from E5Gui import E5MessageBox + +from E5Network.E5NetworkProxyFactory import proxyAuthenticationRequired + +from Globals import qVersionTuple + +from .TranslationEngine import TranslationEngine + + +class IbmWatsonEngine(TranslationEngine): + """ + Class implementing the translation engine for the IBM Watson Language + Translator service. + """ + # Documentation: + # https://www.ibm.com/watson/developercloud/language-translator + # + # Start page: + # https://www.ibm.com/watson/services/language-translator/ + + def __init__(self, plugin, parent=None): + """ + Constructor + + @param plugin reference to the plugin object + @type TranslatorPlugin + @param parent reference to the parent object + @type QObject + """ + super(IbmWatsonEngine, self).__init__(plugin, parent) + + self.__ui = parent + + self.__networkManager = QNetworkAccessManager(self) + self.__networkManager.proxyAuthenticationRequired.connect( + proxyAuthenticationRequired) + + self.__availableTranslations = {} + # dictionary of sets of available translations + + self.__replies = [] + + QTimer.singleShot(0, self.__getTranslationModels) + + def engineName(self): + """ + Public method to return the name of the engine. + + @return engine name + @rtype str + """ + return "ibm_watson" + + def supportedLanguages(self): + """ + Public method to get the supported languages. + + @return list of supported language codes + @rtype list of str + """ + return list(self.__availableTranslations.keys()) + + def supportedTargetLanguages(self, original): + """ + Public method to get a list of supported target languages for an + original language. + + @param original original language + @type str + @return list of supported target languages for the given original + @rtype list of str + """ + targets = self.__availableTranslations.get(original, set()) + return list(targets) + + def hasTTS(self): + """ + Public method indicating the Text-to-Speech capability. + + @return flag indicating the Text-to-Speech capability + @rtype bool + """ + return False + + def getTranslation(self, requestObject, text, originalLanguage, + translationLanguage): + """ + Public method to translate the given text. + + @param requestObject reference to the request object + @type TranslatorRequest + @param text text to be translated + @type str + @param originalLanguage language code of the original + @type str + @param translationLanguage language code of the translation + @type str + @return tuple of translated text and flag indicating success + @rtype tuple of (str, bool) + """ + apiKey = self.plugin.getPreferences("IbmKey") + if not apiKey: + return self.tr("A valid IBM Watson Language Translator key is" + " required."), False + translatorUrl = self.plugin.getPreferences("IbmUrl") + if not translatorUrl: + return self.tr("A valid IBM Watson Language Translator URL is" + " required."), False + + params = "?version=2018-05-01" + url = QUrl(translatorUrl + "/v3/translate" + params) + + requestDict = { + "text": [text], + "source": originalLanguage, + "target": translationLanguage, + } + request = QByteArray(json.dumps(requestDict).encode("utf-8")) + + extraHeaders = [ + (b"Authorization", + b"Basic " + QByteArray( + b"apikey:" + apiKey.encode("utf-8")).toBase64()) + ] + + response, ok = requestObject.post(url, request, dataType="json", + extraHeaders=extraHeaders) + if ok: + try: + responseDict = json.loads(response) + except ValueError: + return self.tr("Invalid response received"), False + + if "translations" not in responseDict: + return self.tr("No translation available."), False + + result = "" + translations = responseDict["translations"] + for translation in translations: + result += translation["translation"] + if translation != translations[-1]: + result += "<br/>" + else: + result = response + return result, ok + + def __adjustLanguageCode(self, code): + """ + Private method to adjust a given language code. + + @param code code to be adjusted + @type str + @return adjusted language code + @rtype str + """ + if code == "zh": + return "zh-CN" + else: + return code + + def __getTranslationModels(self): + """ + Private method to get the translation models supported by IBM Watson + Language Translator. + """ + apiKey = self.plugin.getPreferences("IbmKey") + if not apiKey: + E5MessageBox.critical( + self.__ui, + self.tr("Error Getting Available Translations"), + self.tr("A valid IBM Watson Language Translator key is" + " required.") + ) + return + translatorUrl = self.plugin.getPreferences("IbmUrl") + if not translatorUrl: + E5MessageBox.critical( + self.__ui, + self.tr("Error Getting Available Translations"), + self.tr("A valid IBM Watson Language Translator URL is" + " required.") + ) + return + + params = "?version=2018-05-01" + url = QUrl(translatorUrl + "/v3/models" + params) + + extraHeaders = [ + (b"Authorization", + b"Basic " + QByteArray( + b"apikey:" + apiKey.encode("utf-8")).toBase64()) + ] + + request = QNetworkRequest(url) + if qVersionTuple() >= (5, 6, 0): + request.setAttribute(QNetworkRequest.FollowRedirectsAttribute, + True) + if extraHeaders: + for name, value in extraHeaders: + request.setRawHeader(name, value) + reply = self.__networkManager.get(request) + reply.finished.connect( + lambda: self.__getTranslationModelsReplyFinished(reply)) + self.__replies.append(reply) + + def __getTranslationModelsReplyFinished(self, reply): + """ + Private slot handling the receipt of the available translations. + + @param reply reference to the network reply object + @type QNetworkReply + """ + if reply in self.__replies: + self.__replies.remove(reply) + reply.deleteLater() + + if reply.error() != QNetworkReply.NoError: + errorStr = reply.errorString() + E5MessageBox.critical( + self.__ui, + self.tr("Error Getting Available Translations"), + self.tr("The server sent an error indication.\n" + "Error: {0}").format(errorStr) + ) + return + else: + response = str(reply.readAll(), "utf-8", "replace") + try: + responseDict = json.loads(response) + except ValueError: + E5MessageBox.critical( + self.__ui, + self.tr("Error Getting Available Translations"), + self.tr("Invalid response received") + ) + return + + if "models" not in responseDict: + E5MessageBox.critical( + self.__ui, + self.tr("Error Getting Available Translations"), + self.tr("No translation available.") + ) + return + + for model in responseDict["models"]: + if model["status"] == "available": + source = self.__adjustLanguageCode(model["source"]) + target = self.__adjustLanguageCode(model["target"]) + if source not in self.__availableTranslations: + self.__availableTranslations[source] = set() + self.__availableTranslations[source].add(target) + + self.availableTranslationsLoaded.emit()
--- a/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/MicrosoftEngine.py Sat Jul 07 12:01:23 2018 +0200 +++ b/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/MicrosoftEngine.py Wed Aug 01 19:43:34 2018 +0200 @@ -13,7 +13,7 @@ except NameError: pass -from PyQt5.QtCore import QUrl, QDateTime, QByteArray +from PyQt5.QtCore import QUrl, QDateTime, QByteArray, QTimer from .TranslationEngine import TranslationEngine @@ -41,6 +41,8 @@ "zh-CN": "zh-CHS", "zh-TW": "zh-CHT", } + + QTimer.singleShot(0, self.availableTranslationsLoaded.emit) def engineName(self): """
--- a/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/MyMemoryEngine.py Sat Jul 07 12:01:23 2018 +0200 +++ b/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/MyMemoryEngine.py Wed Aug 01 19:43:34 2018 +0200 @@ -15,7 +15,7 @@ import json -from PyQt5.QtCore import QUrl +from PyQt5.QtCore import QUrl, QTimer from .TranslationEngine import TranslationEngine @@ -36,6 +36,8 @@ @param parent reference to the parent object (QObject) """ super(MyMemoryEngine, self).__init__(plugin, parent) + + QTimer.singleShot(0, self.availableTranslationsLoaded.emit) def engineName(self): """
--- a/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/PromtEngine.py Sat Jul 07 12:01:23 2018 +0200 +++ b/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/PromtEngine.py Wed Aug 01 19:43:34 2018 +0200 @@ -15,7 +15,7 @@ import json -from PyQt5.QtCore import QUrl, QByteArray +from PyQt5.QtCore import QUrl, QByteArray, QTimer import Utilities @@ -50,6 +50,8 @@ "pt": "p", "ru": "r", } + + QTimer.singleShot(0, self.availableTranslationsLoaded.emit) def engineName(self): """
--- a/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/TranslationEngine.py Sat Jul 07 12:01:23 2018 +0200 +++ b/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/TranslationEngine.py Wed Aug 01 19:43:34 2018 +0200 @@ -9,14 +9,19 @@ from __future__ import unicode_literals -from PyQt5.QtCore import QObject +from PyQt5.QtCore import pyqtSignal, QObject class TranslationEngine(QObject): """ Class implementing the translation engine base class containing default methods. + + @signal availableTranslationsLoaded() emitted to indicate the availability + of the list of supported translation languages """ + availableTranslationsLoaded = pyqtSignal() + def __init__(self, plugin, parent=None): """ Constructor @@ -44,6 +49,29 @@ """ return [] + def supportedTargetLanguages(self, original): + """ + Public method to get a list of supported target languages for an + original language. + + Note: The default implementation return the list of supported languages + (i.e. the same as those for the source) with the given original + removed. + + @param original original language + @type str + @return list of supported target languages for the given original + @rtype list of str + """ + targetLanguages = self.supportedLanguages()[:] + try: + targetLanguages.remove(original) + except ValueError: + # original is not in the list of target languages + pass + + return targetLanguages + def hasTTS(self): """ Public method indicating the Text-to-Speech capability.
--- a/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/YandexEngine.py Sat Jul 07 12:01:23 2018 +0200 +++ b/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/YandexEngine.py Wed Aug 01 19:43:34 2018 +0200 @@ -15,7 +15,7 @@ import json -from PyQt5.QtCore import QUrl, QByteArray +from PyQt5.QtCore import QUrl, QByteArray, QTimer import Utilities @@ -50,6 +50,8 @@ 501: self.tr("The specified translation direction is not" " supported."), } + + QTimer.singleShot(0, self.availableTranslationsLoaded.emit) def engineName(self): """
--- a/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/__init__.py Sat Jul 07 12:01:23 2018 +0200 +++ b/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/__init__.py Wed Aug 01 19:43:34 2018 +0200 @@ -24,7 +24,7 @@ @return names of supported engines (list of string) """ return ["googlev1", "mymemory", "glosbe", "promt", "yandex", "googlev2", - "microsoft", "deepl"] + "microsoft", "deepl", "ibm_watson"] def engineDisplayName(name): @@ -50,6 +50,8 @@ return QCoreApplication.translate("TranslatorEngines", "Microsoft") elif name == "deepl": return QCoreApplication.translate("TranslatorEngines", "DeepL") + elif name == "ibm_watson": + return QCoreApplication.translate("TranslatorEngines", "IBM Watson") else: return QCoreApplication.translate( "TranslatorEngines", "Unknow translation service name ({0})")\ @@ -89,6 +91,9 @@ elif name == "deepl": from .DeepLEngine import DeepLEngine engine = DeepLEngine(plugin, parent) + elif name == "ibm_watson": + from .IbmWatsonEngine import IbmWatsonEngine + engine = IbmWatsonEngine(plugin, parent) else: engine = None return engine @@ -126,5 +131,7 @@ return "https://console.developers.google.com/" elif name == "microsoft": return "https://portal.azure.com" + elif name == "ibm_watson": + return "https://www.ibm.com/watson/services/language-translator/" else: return ""
--- a/Plugins/UiExtensionPlugins/Translator/TranslatorRequest.py Sat Jul 07 12:01:23 2018 +0200 +++ b/Plugins/UiExtensionPlugins/Translator/TranslatorRequest.py Wed Aug 01 19:43:34 2018 +0200 @@ -14,12 +14,14 @@ except NameError: pass -from PyQt5.QtCore import qVersion, QObject, QEventLoop, QByteArray +from PyQt5.QtCore import QObject, QEventLoop, QByteArray from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, \ QNetworkReply from E5Network.E5NetworkProxyFactory import proxyAuthenticationRequired +from Globals import qVersionTuple + class TranslatorRequest(QObject): """ @@ -56,7 +58,9 @@ @return server response (QByteArray) or error message (string) """ request = QNetworkRequest(requestUrl) - request.setAttribute(QNetworkRequest.FollowRedirectsAttribute, True) + if qVersionTuple() >= (5, 6, 0): + request.setAttribute(QNetworkRequest.FollowRedirectsAttribute, + True) if extraHeaders: for name, value in extraHeaders: request.setRawHeader(name, value) @@ -88,12 +92,13 @@ self.__contentTypes[dataType]) request.setRawHeader(b"Content-Length", QByteArray.number(requestData.size())) - if qVersion() >= "5.6.0": + if qVersionTuple() >= (5, 6, 0): request.setAttribute(QNetworkRequest.FollowRedirectsAttribute, True) if extraHeaders: for name, value in extraHeaders: request.setRawHeader(name, value) + request.setUrl(requestUrl) reply = self.__networkManager.post(request, requestData) if not self.__loop.isRunning(): self.__loop.exec_()
--- a/Plugins/UiExtensionPlugins/Translator/TranslatorWidget.py Sat Jul 07 12:01:23 2018 +0200 +++ b/Plugins/UiExtensionPlugins/Translator/TranslatorWidget.py Wed Aug 01 19:43:34 2018 +0200 @@ -74,18 +74,11 @@ self.pronounceTransButton.setEnabled(False) selectedEngine = self.__plugin.getPreferences("SelectedEngine") - origLanguage = self.__plugin.getPreferences("OriginalLanguage") - transLanguage = self.__plugin.getPreferences("TranslationLanguage") self.__updateEngines() engineIndex = self.engineComboBox.findData(selectedEngine) self.engineComboBox.setCurrentIndex(engineIndex) self.__engineComboBoxCurrentIndexChanged(engineIndex) - # this calls self.__updateLanguages() implicitly - self.origLanguageComboBox.setCurrentIndex( - self.origLanguageComboBox.findData(origLanguage)) - self.transLanguageComboBox.setCurrentIndex( - self.transLanguageComboBox.findData(transLanguage)) self.engineComboBox.currentIndexChanged.connect( self.__engineComboBoxCurrentIndexChanged) @@ -96,25 +89,27 @@ Private slot to update the language combo boxes. """ supportedCodes = self.__translationEngine.supportedLanguages() + enabledCodes = self.__plugin.getPreferences("EnabledLanguages") + + # 1. save current selections origLanguage = self.origLanguageComboBox.itemData( self.origLanguageComboBox.currentIndex()) - transLanguage = self.transLanguageComboBox.itemData( - self.transLanguageComboBox.currentIndex()) + + # 2. reload the original language combo box + self.origLanguageComboBox.blockSignals(True) self.origLanguageComboBox.clear() - self.transLanguageComboBox.clear() - for code in self.__plugin.getPreferences("EnabledLanguages"): + for code in enabledCodes: if code in supportedCodes: language = self.__languages.getLanguage(code) if language: icon = self.__languages.getLanguageIcon(code) self.origLanguageComboBox.addItem(icon, language, code) - self.transLanguageComboBox.addItem(icon, language, code) self.origLanguageComboBox.model().sort(0) - self.transLanguageComboBox.model().sort(0) - self.origLanguageComboBox.setCurrentIndex( - self.origLanguageComboBox.findData(origLanguage)) - self.transLanguageComboBox.setCurrentIndex( - self.transLanguageComboBox.findData(transLanguage)) + origIndex = self.origLanguageComboBox.findData(origLanguage) + if origIndex == -1: + origIndex = 0 + self.origLanguageComboBox.blockSignals(False) + self.origLanguageComboBox.setCurrentIndex(origIndex) def __updateEngines(self): """ @@ -190,10 +185,22 @@ """ Private slot to swap the languages. """ - oIdx = self.origLanguageComboBox.currentIndex() - self.origLanguageComboBox.setCurrentIndex( + # save selected language codes + oLanguage = self.origLanguageComboBox.itemData( + self.origLanguageComboBox.currentIndex()) + + tLanguage = self.transLanguageComboBox.itemData( self.transLanguageComboBox.currentIndex()) - self.transLanguageComboBox.setCurrentIndex(oIdx) + + oIdx = self.origLanguageComboBox.findData(tLanguage) + if oIdx < 0: + oIdx = 0 + self.origLanguageComboBox.setCurrentIndex(oIdx) + + tIdx = self.transLanguageComboBox.findData(oLanguage) + if tIdx < 0: + tIdx = 0 + self.transLanguageComboBox.setCurrentIndex(tIdx) origText = self.origEdit.toPlainText() self.origEdit.setPlainText(self.transEdit.toPlainText()) @@ -212,10 +219,9 @@ """ Private slot to handle changes of the original text. """ - enable = bool(self.origEdit.toPlainText()) - self.translateButton.setEnabled(enable) self.__updatePronounceButtons() self.__updateClearButton() + self.__updateTranslateButton() @pyqtSlot() def on_transEdit_textChanged(self): @@ -234,6 +240,31 @@ """ self.__plugin.setPreferences( "OriginalLanguage", self.origLanguageComboBox.itemData(index)) + + supportedTargetCodes = \ + self.__translationEngine.supportedTargetLanguages( + self.origLanguageComboBox.itemData(index) + ) + if supportedTargetCodes is not None: + enabledCodes = self.__plugin.getPreferences("EnabledLanguages") + transLanguage = self.transLanguageComboBox.itemData( + self.transLanguageComboBox.currentIndex()) + self.transLanguageComboBox.clear() + if len(supportedTargetCodes) > 0: + for code in enabledCodes: + if code in supportedTargetCodes: + language = self.__languages.getLanguage(code) + if language: + icon = self.__languages.getLanguageIcon(code) + self.transLanguageComboBox.addItem( + icon, language, code) + self.transLanguageComboBox.model().sort(0) + index = self.transLanguageComboBox.findData(transLanguage) + if index == -1: + index = 0 + self.transLanguageComboBox.setCurrentIndex(index) + + self.__updateTranslateButton() @pyqtSlot(int) def on_transLanguageComboBox_currentIndexChanged(self, index): @@ -245,25 +276,54 @@ self.__plugin.setPreferences( "TranslationLanguage", self.transLanguageComboBox.itemData(index)) - @pyqtSlot(int) - def __engineComboBoxCurrentIndexChanged(self, index): + @pyqtSlot() + def __availableTranslationsLoaded(self): + """ + Private slot to handle the availability of translations. """ - Private slot to handle the selection of a translation service. + origLanguage = self.__plugin.getPreferences("OriginalLanguage") + transLanguage = self.__plugin.getPreferences("TranslationLanguage") + + self.__updateLanguages() - @param index current index (integer) + origIndex = self.origLanguageComboBox.findData(origLanguage) + self.origLanguageComboBox.setCurrentIndex(origIndex) + self.on_origLanguageComboBox_currentIndexChanged(origIndex) + self.transLanguageComboBox.setCurrentIndex( + self.transLanguageComboBox.findData(transLanguage)) + + def __ensureTranslationEngineReady(self): """ - engineName = self.engineComboBox.itemData(index) - if self.__translationEngine and \ + Private slot to ensure, that the currently selected translation engine + is ready. + """ + engineName = self.engineComboBox.itemData( + self.engineComboBox.currentIndex()) + if self.__translationEngine is not None and \ self.__translationEngine.engineName() != engineName: + self.__translationEngine.availableTranslationsLoaded.disconnect( + self.__availableTranslationsLoaded) self.__translationEngine.deleteLater() self.__translationEngine = None if self.__translationEngine is None: self.__translationEngine = TranslatorEngines.getTranslationEngine( engineName, self.__plugin, self) + if self.__translationEngine is not None: + self.__translationEngine.availableTranslationsLoaded.connect( + self.__availableTranslationsLoaded) + + @pyqtSlot(int) + def __engineComboBoxCurrentIndexChanged(self, index): + """ + Private slot to handle the selection of a translation service. + + @param index current index + @type int + """ + self.__ensureTranslationEngineReady() self.__updatePronounceButtons() - self.__updateLanguages() self.__plugin.setPreferences( "SelectedEngine", self.engineComboBox.itemData(index)) @@ -272,7 +332,10 @@ """ Private slot to set the state of the pronounce buttons. """ - hasTTS = self.__translationEngine.hasTTS() + if self.__translationEngine is not None: + hasTTS = self.__translationEngine.hasTTS() + else: + hasTTS = False self.pronounceOrigButton.setEnabled( hasTTS and bool(self.origEdit.toPlainText())) self.pronounceTransButton.setEnabled( @@ -286,6 +349,14 @@ bool(self.transEdit.toPlainText()) self.clearButton.setEnabled(enable) + def __updateTranslateButton(self): + """ + Private slot to set the state of the translate button. + """ + enable = bool(self.origEdit.toPlainText()) + enable &= bool(self.__translationLanguage()) + self.translateButton.setEnabled(enable) + def __translate(self, text, originalLanguage, translationLanguage): """ Private method to translate the given text. @@ -300,16 +371,7 @@ from .TranslatorRequest import TranslatorRequest self.__translatorRequest = TranslatorRequest(self) - engineName = self.engineComboBox.itemData( - self.engineComboBox.currentIndex()) - if self.__translationEngine and \ - self.__translationEngine.engineName() != engineName: - self.__translationEngine.deleteLater() - self.__translationEngine = None - - if self.__translationEngine is None: - self.__translationEngine = TranslatorEngines.getTranslationEngine( - engineName, self.__plugin, self) + self.__ensureTranslationEngineReady() result, ok = self.__translationEngine.getTranslation( self.__translatorRequest, text, originalLanguage, @@ -339,16 +401,7 @@ if self.__mediaPlayer.state() == QMediaPlayer.PlayingState: return - engineName = self.engineComboBox.itemData( - self.engineComboBox.currentIndex()) - if self.__translationEngine and \ - self.__translationEngine.engineName() != engineName: - self.__translationEngine.deleteLater() - self.__translationEngine = None - - if self.__translationEngine is None: - self.__translationEngine = TranslatorEngines.getTranslationEngine( - engineName, self.__plugin, self) + self.__ensureTranslationEngineReady() if not self.__translationEngine.hasTTS(): E5MessageBox.critical(
--- a/Preferences/ConfigurationPages/InterfacePage.py Sat Jul 07 12:01:23 2018 +0200 +++ b/Preferences/ConfigurationPages/InterfacePage.py Wed Aug 01 19:43:34 2018 +0200 @@ -82,24 +82,33 @@ else: self.brTopButton.setChecked(True) - layout = Preferences.getUILayout() - if layout[0] == "Sidebars": + layoutType = Preferences.getUI("LayoutType") + if layoutType == "Sidebars": index = 0 - elif layout[0] == "Toolboxes": + elif layoutType == "Toolboxes": index = 1 else: index = 0 # default for bad values self.layoutComboBox.setCurrentIndex(index) - if layout[1] == 0: - self.separateShellButton.setChecked(True) - else: - self.debugEmbeddedShellButton.setChecked(True) - if layout[2] == 0: - self.separateFileBrowserButton.setChecked(True) - elif layout[2] == 1: - self.debugEmbeddedFileBrowserButton.setChecked(True) - else: - self.projectEmbeddedFileBrowserButton.setChecked(True) + + # integrated tools activation + # left side + self.templateViewerCheckBox.setChecked( + Preferences.getUI("ShowTemplateViewer")) + self.fileBrowserCheckBox.setChecked( + Preferences.getUI("ShowFileBrowser")) + self.symbolsCheckBox.setChecked( + Preferences.getUI("ShowSymbolsViewer")) + # right side + self.codeDocumentationViewerCheckBox.setChecked( + Preferences.getUI("ShowCodeDocumentationViewer")) + self.cooperationCheckBox.setChecked( + Preferences.getUI("ShowCooperation")) + self.ircCheckBox.setChecked( + Preferences.getUI("ShowIrc")) + # bottom side + self.numbersCheckBox.setChecked( + Preferences.getUI("ShowNumbersViewer")) self.tabsGroupBox.setEnabled(True) self.tabsCloseButtonCheckBox.setChecked( @@ -167,24 +176,39 @@ Preferences.setUILanguage(uiLanguage) # save the interface layout settings - if self.separateShellButton.isChecked(): - layout2 = 0 - else: - layout2 = 1 - if self.separateFileBrowserButton.isChecked(): - layout3 = 0 - elif self.debugEmbeddedFileBrowserButton.isChecked(): - layout3 = 1 + if self.layoutComboBox.currentIndex() == 0: + layoutType = "Sidebars" + elif self.layoutComboBox.currentIndex() == 1: + layoutType = "Toolboxes" else: - layout3 = 2 - if self.layoutComboBox.currentIndex() == 0: - layout1 = "Sidebars" - elif self.layoutComboBox.currentIndex() == 1: - layout1 = "Toolboxes" - else: - layout1 = "Sidebars" # just in case - layout = (layout1, layout2, layout3) - Preferences.setUILayout(layout) + layoutType = "Sidebars" # just in case + Preferences.setUI("LayoutType", layoutType) + + # save the integrated tools activation + # left side + Preferences.setUI( + "ShowTemplateViewer", + self.templateViewerCheckBox.isChecked()) + Preferences.setUI( + "ShowFileBrowser", + self.fileBrowserCheckBox.isChecked()) + Preferences.setUI( + "ShowSymbolsViewer", + self.symbolsCheckBox.isChecked()) + # right side + Preferences.setUI( + "ShowCodeDocumentationViewer", + self.codeDocumentationViewerCheckBox.isChecked()) + Preferences.setUI( + "ShowCooperation", + self.cooperationCheckBox.isChecked()) + Preferences.setUI( + "ShowIrc", + self.ircCheckBox.isChecked()) + # bottom side + Preferences.setUI( + "ShowNumbersViewer", + self.numbersCheckBox.isChecked()) Preferences.setUI( "SingleCloseButton",
--- a/Preferences/ConfigurationPages/InterfacePage.ui Sat Jul 07 12:01:23 2018 +0200 +++ b/Preferences/ConfigurationPages/InterfacePage.ui Wed Aug 01 19:43:34 2018 +0200 @@ -7,10 +7,10 @@ <x>0</x> <y>0</y> <width>557</width> - <height>1121</height> + <height>1300</height> </rect> </property> - <layout class="QVBoxLayout" name="verticalLayout"> + <layout class="QVBoxLayout" name="verticalLayout_3"> <item> <widget class="QLabel" name="headerLabel"> <property name="text"> @@ -456,76 +456,110 @@ </layout> </item> <item> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <widget class="QGroupBox" name="groupBox_9"> - <property name="title"> - <string>Shell</string> - </property> - <layout class="QVBoxLayout" name="_8"> - <item> - <widget class="QRadioButton" name="separateShellButton"> - <property name="toolTip"> - <string>Select to get a separate shell window</string> - </property> - <property name="text"> - <string>separate window</string> - </property> - </widget> - </item> - <item> - <widget class="QRadioButton" name="debugEmbeddedShellButton"> - <property name="toolTip"> - <string>Select to embed the shell in the Debug-Viewer</string> - </property> - <property name="text"> - <string>embed in Debug-Viewer</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QGroupBox" name="groupBox_10"> - <property name="title"> - <string>File-Browser</string> - </property> - <layout class="QVBoxLayout" name="_9"> - <item> - <widget class="QRadioButton" name="separateFileBrowserButton"> - <property name="toolTip"> - <string>Select to get a separate file browser window</string> - </property> - <property name="text"> - <string>separate window</string> - </property> - </widget> - </item> - <item> - <widget class="QRadioButton" name="debugEmbeddedFileBrowserButton"> - <property name="toolTip"> - <string>Select to embed the file browser in the Debug-Viewer</string> - </property> - <property name="text"> - <string>embed in Debug-Viewer</string> - </property> - </widget> - </item> - <item> - <widget class="QRadioButton" name="projectEmbeddedFileBrowserButton"> - <property name="toolTip"> - <string>Select to embed the file browser in the Project-Viewer</string> - </property> - <property name="text"> - <string>embed in Project-Viewer</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - </layout> + <widget class="QGroupBox" name="groupBox_3"> + <property name="title"> + <string>Integrated Tools Activation</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QGroupBox" name="groupBox_10"> + <property name="title"> + <string>Left Side</string> + </property> + <layout class="QGridLayout" name="gridLayout_5"> + <item row="0" column="0"> + <widget class="QCheckBox" name="templateViewerCheckBox"> + <property name="toolTip"> + <string>Select to activate the Template viewer</string> + </property> + <property name="text"> + <string>Template-Viewer</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QCheckBox" name="fileBrowserCheckBox"> + <property name="toolTip"> + <string>Select to activate the File-Browser widget</string> + </property> + <property name="text"> + <string>File-Browser</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QCheckBox" name="symbolsCheckBox"> + <property name="toolTip"> + <string>Select to activate the Symbols widget</string> + </property> + <property name="text"> + <string>Symbols</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox_9"> + <property name="title"> + <string>Right Side</string> + </property> + <layout class="QGridLayout" name="gridLayout_4"> + <item row="0" column="0"> + <widget class="QCheckBox" name="codeDocumentationViewerCheckBox"> + <property name="toolTip"> + <string>Select to activate the Code Documentation Viewer</string> + </property> + <property name="text"> + <string>Code Documentation Viewer</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QCheckBox" name="cooperationCheckBox"> + <property name="toolTip"> + <string>Select to activate the Cooperation widget</string> + </property> + <property name="text"> + <string>Cooperation</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QCheckBox" name="ircCheckBox"> + <property name="toolTip"> + <string>Select to activate the IRC widget</string> + </property> + <property name="text"> + <string>IRC</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox_11"> + <property name="title"> + <string>Bottom Side</string> + </property> + <layout class="QGridLayout" name="gridLayout_6"> + <item row="0" column="0"> + <widget class="QCheckBox" name="numbersCheckBox"> + <property name="toolTip"> + <string>Select to activate the Numbers widget</string> + </property> + <property name="text"> + <string>Numbers</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + </layout> + </widget> </item> <item> <widget class="QGroupBox" name="tabsGroupBox"> @@ -594,11 +628,13 @@ <tabstop>delaySpinBox</tabstop> <tabstop>languageComboBox</tabstop> <tabstop>layoutComboBox</tabstop> - <tabstop>separateShellButton</tabstop> - <tabstop>debugEmbeddedShellButton</tabstop> - <tabstop>separateFileBrowserButton</tabstop> - <tabstop>debugEmbeddedFileBrowserButton</tabstop> - <tabstop>projectEmbeddedFileBrowserButton</tabstop> + <tabstop>templateViewerCheckBox</tabstop> + <tabstop>fileBrowserCheckBox</tabstop> + <tabstop>symbolsCheckBox</tabstop> + <tabstop>codeDocumentationViewerCheckBox</tabstop> + <tabstop>cooperationCheckBox</tabstop> + <tabstop>ircCheckBox</tabstop> + <tabstop>numbersCheckBox</tabstop> <tabstop>tabsCloseButtonCheckBox</tabstop> <tabstop>resetLayoutButton</tabstop> </tabstops>
--- a/Preferences/ConfigurationPages/WebBrowserPage.py Sat Jul 07 12:01:23 2018 +0200 +++ b/Preferences/ConfigurationPages/WebBrowserPage.py Wed Aug 01 19:43:34 2018 +0200 @@ -14,6 +14,8 @@ from .ConfigurationPageBase import ConfigurationPageBase from .Ui_WebBrowserPage import Ui_WebBrowserPage +from Globals import qVersionTuple + import UI.PixmapCache import Preferences @@ -73,6 +75,15 @@ except KeyError: self.screenCaptureCheckBox.setEnabled(False) self.webGLCheckBox.setEnabled(False) + try: + # Qt 5.11 + self.autoplayMediaCheckBox.setChecked( + Preferences.getWebBrowser("PlaybackRequiresUserGesture")) + self.webRtcPublicOnlyCheckBox.setChecked( + Preferences.getWebBrowser("WebRTCPublicInterfacesOnly")) + except KeyError: + self.autoplayMediaCheckBox.setEnabled(False) + self.webRtcPublicOnlyCheckBox.setEnabled(False) self.javaScriptGroup.setChecked( Preferences.getWebBrowser("JavaScriptEnabled")) @@ -87,6 +98,12 @@ self.jsActivateWindowsCheckBox.setEnabled(False) self.jsClipboardCheckBox.setChecked( Preferences.getWebBrowser("JavaScriptCanAccessClipboard")) + try: + # Qt 5.11 + self.jsPasteCheckBox.setChecked( + Preferences.getWebBrowser("JavaScriptCanPaste")) + except KeyError: + self.jsPasteCheckBox.setEnabled(False) self.pluginsCheckBox.setChecked( Preferences.getWebBrowser("PluginsEnabled")) self.doNotTrackCheckBox.setChecked( @@ -205,10 +222,22 @@ self.autoScrollDividerSpinBox.setValue( Preferences.getWebBrowser("AutoScrollDivider")) - self.webInspectorGroup.setChecked( - Preferences.getWebBrowser("WebInspectorEnabled")) - self.webInspectorPortSpinBox.setValue( - Preferences.getWebBrowser("WebInspectorPort")) + if qVersionTuple() < (5, 11, 0): + self.webInspectorGroup.setChecked( + Preferences.getWebBrowser("WebInspectorEnabled")) + self.webInspectorPortSpinBox.setValue( + Preferences.getWebBrowser("WebInspectorPort")) + else: + self.webInspectorGroup.setEnabled(False) + + if qVersionTuple() >= (5, 11, 0): + self.protocolHandlerComboBox.setCurrentIndex( + Preferences.getWebBrowser("AcceptProtocolHandlerRequest")) + self.requestQuotaComboBox.setCurrentIndex( + Preferences.getWebBrowser("AcceptQuotaRequest")) + else: + self.protocolHandlerComboBox.setEnabled(False) + self.requestQuotaComboBox.setEnabled(False) def save(self): """ @@ -244,6 +273,14 @@ "WebGLEnabled", self.webGLCheckBox.isChecked()) + if self.autoplayMediaCheckBox.isEnabled(): + Preferences.setWebBrowser( + "PlaybackRequiresUserGesture", + self.autoplayMediaCheckBox.isChecked()) + Preferences.setWebBrowser( + "WebRTCPublicInterfacesOnly", + self.webRtcPublicOnlyCheckBox.isChecked()) + Preferences.setWebBrowser( "JavaScriptEnabled", self.javaScriptGroup.isChecked()) @@ -257,6 +294,10 @@ Preferences.setWebBrowser( "JavaScriptCanAccessClipboard", self.jsClipboardCheckBox.isChecked()) + if self.jsPasteCheckBox.isEnabled(): + Preferences.setWebBrowser( + "JavaScriptCanPaste", + self.jsPasteCheckBox.isChecked()) Preferences.setWebBrowser( "PluginsEnabled", self.pluginsCheckBox.isChecked()) @@ -368,12 +409,21 @@ "AutoScrollDivider", self.autoScrollDividerSpinBox.value()) - Preferences.setWebBrowser( - "WebInspectorEnabled", - self.webInspectorGroup.isChecked()) - Preferences.setWebBrowser( - "WebInspectorPort", - self.webInspectorPortSpinBox.value()) + if qVersionTuple() < (5, 11, 0): + Preferences.setWebBrowser( + "WebInspectorEnabled", + self.webInspectorGroup.isChecked()) + Preferences.setWebBrowser( + "WebInspectorPort", + self.webInspectorPortSpinBox.value()) + + if self.protocolHandlerComboBox.isEnabled(): + Preferences.setWebBrowser( + "AcceptProtocolHandlerRequest", + self.protocolHandlerComboBox.currentIndex()) + Preferences.setWebBrowser( + "AcceptQuotaRequest", + self.requestQuotaComboBox.currentIndex()) @pyqtSlot() def on_setCurrentPageButton_clicked(self):
--- a/Preferences/ConfigurationPages/WebBrowserPage.ui Sat Jul 07 12:01:23 2018 +0200 +++ b/Preferences/ConfigurationPages/WebBrowserPage.ui Wed Aug 01 19:43:34 2018 +0200 @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>650</width> - <height>2000</height> + <height>2300</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout_5"> @@ -127,6 +127,26 @@ </property> </widget> </item> + <item row="4" column="1"> + <widget class="QCheckBox" name="autoplayMediaCheckBox"> + <property name="toolTip"> + <string>Select, to inhibit playback of media content until the user interacts with the page</string> + </property> + <property name="text"> + <string>Don't auto-play media content</string> + </property> + </widget> + </item> + <item row="5" column="0"> + <widget class="QCheckBox" name="webRtcPublicOnlyCheckBox"> + <property name="toolTip"> + <string>Select to limit WebRTC to public IP addresses only</string> + </property> + <property name="text"> + <string>Only public IP-Addresses for WebRTC</string> + </property> + </widget> + </item> </layout> </widget> </item> @@ -370,6 +390,57 @@ </widget> </item> <item> + <widget class="QGroupBox" name="groupBox_11"> + <property name="title"> + <string>Protocol Handler</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout_8"> + <item> + <widget class="QLabel" name="label_18"> + <property name="text"> + <string>Allow websites to register protocol handlers:</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="protocolHandlerComboBox"> + <property name="toolTip"> + <string>Select how to allow websites to register protocol handlers via "navigator.registerProtocolHandler"</string> + </property> + <item> + <property name="text"> + <string>yes</string> + </property> + </item> + <item> + <property name="text"> + <string>no</string> + </property> + </item> + <item> + <property name="text"> + <string>ask</string> + </property> + </item> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_9"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>272</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + </item> + <item> <widget class="QGroupBox" name="privacyGroup"> <property name="title"> <string>Privacy</string> @@ -417,6 +488,16 @@ </property> </widget> </item> + <item> + <widget class="QCheckBox" name="jsPasteCheckBox"> + <property name="toolTip"> + <string>Select to allow JavaScript to paste from the clipboard (this needs access to the clipboard)</string> + </property> + <property name="text"> + <string>Allow to paste from the clipboard</string> + </property> + </widget> + </item> </layout> </widget> </item> @@ -782,6 +863,57 @@ </widget> </item> <item> + <widget class="QGroupBox" name="groupBox_10"> + <property name="title"> + <string>Local Storage</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout_7"> + <item> + <widget class="QLabel" name="label_17"> + <property name="text"> + <string>Allow websites to request persistent storage quota:</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="requestQuotaComboBox"> + <property name="toolTip"> + <string>Select how to allow websites to request persistent storage quota via "navigator.webkitPersistentStorage.requestQuota"</string> + </property> + <item> + <property name="text"> + <string>yes</string> + </property> + </item> + <item> + <property name="text"> + <string>no</string> + </property> + </item> + <item> + <property name="text"> + <string>ask</string> + </property> + </item> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_10"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>230</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + </item> + <item> <widget class="QGroupBox" name="groupBox_5"> <property name="title"> <string>Web Search</string> @@ -1086,6 +1218,8 @@ <tabstop>fullscreenCheckBox</tabstop> <tabstop>screenCaptureCheckBox</tabstop> <tabstop>webGLCheckBox</tabstop> + <tabstop>autoplayMediaCheckBox</tabstop> + <tabstop>webRtcPublicOnlyCheckBox</tabstop> <tabstop>startupCombo</tabstop> <tabstop>newTabCombo</tabstop> <tabstop>homePageEdit</tabstop> @@ -1095,10 +1229,12 @@ <tabstop>saveSessionCheckBox</tabstop> <tabstop>sessionTimerSpinBox</tabstop> <tabstop>defaultSchemeCombo</tabstop> + <tabstop>protocolHandlerComboBox</tabstop> <tabstop>javaScriptGroup</tabstop> <tabstop>jsOpenWindowsCheckBox</tabstop> <tabstop>jsActivateWindowsCheckBox</tabstop> <tabstop>jsClipboardCheckBox</tabstop> + <tabstop>jsPasteCheckBox</tabstop> <tabstop>pluginsCheckBox</tabstop> <tabstop>doNotTrackCheckBox</tabstop> <tabstop>refererSendComboBox</tabstop> @@ -1111,6 +1247,7 @@ <tabstop>expireHistory</tabstop> <tabstop>diskCacheCheckBox</tabstop> <tabstop>cacheSizeSpinBox</tabstop> + <tabstop>requestQuotaComboBox</tabstop> <tabstop>languageCombo</tabstop> <tabstop>imageSearchComboBox</tabstop> <tabstop>spatialCheckBox</tabstop>
--- a/Preferences/__init__.py Sat Jul 07 12:01:23 2018 +0200 +++ b/Preferences/__init__.py Wed Aug 01 19:43:34 2018 +0200 @@ -167,6 +167,13 @@ "ShowFilePreview": True, "ShowFilePreviewJS": True, "ShowFilePreviewSSI": True, + "ShowTemplateViewer": True, # left side + "ShowFileBrowser": True, # left side + "ShowSymbolsViewer": True, # left side + "ShowCodeDocumentationViewer": True, # right side + "ShowCooperation": True, # right side + "ShowIrc": True, # right side + "ShowNumbersViewer": True, # bottom side "ViewProfiles2": { "edit": [ # saved state main window with toolbox windows (0) @@ -1119,6 +1126,8 @@ "FilterTrackingCookies": True, "SaveUrlColor": QColor(184, 248, 169), "UserAgent": "", + "AcceptQuotaRequest": 2, # yes/no/ask (0, 1, 2) + "AcceptProtocolHandlerRequest": 2, # yes/no/ask (0, 1, 2) # Auto Scroller "AutoScrollEnabled": True, "AutoScrollDivider": 8.0, @@ -1291,6 +1300,21 @@ }) except AttributeError: pass + try: + # Qt 5.11+ + cls.webBrowserDefaults.update({ + "PlaybackRequiresUserGesture": + webEngineSettings.testAttribute( + QWebEngineSettings.PlaybackRequiresUserGesture), + "JavaScriptCanPaste": + webEngineSettings.testAttribute( + QWebEngineSettings.JavascriptCanPaste), + "WebRTCPublicInterfacesOnly": + webEngineSettings.testAttribute( + QWebEngineSettings.WebRTCPublicInterfacesOnly), + }) + except AttributeError: + pass cls.webEngineSettingsIntitialized = True @@ -1901,40 +1925,6 @@ prefClass.settings.setValue("UI/Language", lang) -def getUILayout(prefClass=Prefs): - """ - Module function to retrieve the layout for the user interface. - - @param prefClass preferences class used as the storage area - @return the UI layout as a tuple of main layout, flag for - an embedded shell and a value for an embedded file browser - """ - layoutType = prefClass.settings.value( - "UI/LayoutType", prefClass.uiDefaults["LayoutType"]) - if layoutType in ["DockWindows", "FloatingWindows"]: - # change old fashioned layouts to the modern default - layoutType = prefClass.uiDefaults["LayoutType"] - layout = (layoutType, - int(prefClass.settings.value("UI/LayoutShellEmbedded", - prefClass.uiDefaults["LayoutShellEmbedded"])), - int(prefClass.settings.value("UI/LayoutFileBrowserEmbedded", - prefClass.uiDefaults["LayoutFileBrowserEmbedded"])), - ) - return layout - - -def setUILayout(layout, prefClass=Prefs): - """ - Module function to store the layout for the user interface. - - @param layout the layout type - @param prefClass preferences class used as the storage area - """ - prefClass.settings.setValue("UI/LayoutType", layout[0]) - prefClass.settings.setValue("UI/LayoutShellEmbedded", layout[1]) - prefClass.settings.setValue("UI/LayoutFileBrowserEmbedded", layout[2]) - - def getViewManager(prefClass=Prefs): """ Module function to retrieve the selected viewmanager type. @@ -1978,7 +1968,9 @@ "LayoutShellEmbedded", "LayoutFileBrowserEmbedded", "CheckErrorLog", "NotificationsEnabled", "DynamicOnlineCheck", "OpenCrashSessionOnStartup", "CrashSessionEnabled", - "UseNativeMenuBar"]: + "ShowCodeDocumentationViewer", "ShowCooperation", "ShowIrc", + "ShowTemplateViewer", "ShowFileBrowser", "ShowSymbolsViewer", + "ShowNumbersViewer", "UseNativeMenuBar"]: return toBool(prefClass.settings.value( "UI/" + key, prefClass.uiDefaults[key])) elif key in ["TabViewManagerFilenameLength", "CaptionFilenameLength", @@ -2810,7 +2802,8 @@ "OfflineWebApplicationCacheQuota", "CachePolicy", "DownloadManagerRemovePolicy", "AdBlockUpdatePeriod", "SearchLanguage", "SyncType", "SyncFtpPort", - "SyncFtpIdleTimeout", "SyncEncryptionKeyLength"]: + "SyncFtpIdleTimeout", "SyncEncryptionKeyLength", + ]: return int(prefClass.settings.value( "Help/" + key, prefClass.helpDefaults[key])) elif key in ["SingleHelpWindow", "SaveGeometry", "WebSearchSuggestions", @@ -3013,7 +3006,8 @@ "AdBlockUpdatePeriod", "TabManagerGroupByType", "SessionAutoSaveInterval", "NewTabBehavior", "RefererSendReferer", "RefererDefaultPolicy", - "RefererTrimmingPolicy", + "RefererTrimmingPolicy", "AcceptQuotaRequest", + "AcceptProtocolHandlerRequest", ]: return int(prefClass.settings.value( "WebBrowser/" + key, prefClass.webBrowserDefaults[key])) @@ -3044,6 +3038,8 @@ "AllowGeolocationOnInsecureOrigins", "AllowWindowActivationFromJavaScript", "ShowScrollBars", "DownloadManagerAutoOpen", "DownloadManagerAutoClose", + "PlaybackRequiresUserGesture", "JavaScriptCanPaste", + "WebRTCPublicInterfacesOnly", ]: return toBool(prefClass.settings.value( "WebBrowser/" + key, prefClass.webBrowserDefaults[key]))
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Project/IdlCompilerDefineNameDialog.py Wed Aug 01 19:43:34 2018 +0200 @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2018 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a dialog to enter the name-value pair to define a variable +for the IDL compiler. +""" + +from PyQt5.QtCore import pyqtSlot +from PyQt5.QtWidgets import QDialog, QDialogButtonBox + +from .Ui_IdlCompilerDefineNameDialog import Ui_IdlCompilerDefineNameDialog + + +class IdlCompilerDefineNameDialog(QDialog, Ui_IdlCompilerDefineNameDialog): + """ + Class implementing a dialog to enter the name-value pair to define a + variable for the IDL compiler. + """ + def __init__(self, name="", value="", parent=None): + """ + Constructor + + @param name name of the variable + @type str + @param value value of the variable + @type str + @param parent reference to the parent widget + @type QWidget + """ + super(IdlCompilerDefineNameDialog, self).__init__(parent) + self.setupUi(self) + + self.nameEdit.setText(name) + self.valueEdit.setText(value) + + msh = self.minimumSizeHint() + self.resize(max(self.width(), msh.width()), msh.height()) + + self.__updateOkButton() + + def __updateOkButton(self): + """ + Private slot to update the enable state of the OK button. + """ + self.buttonBox.button(QDialogButtonBox.Ok).setEnabled( + bool(self.nameEdit.text())) + + @pyqtSlot(str) + def on_nameEdit_textChanged(self, txt): + """ + Private slot to handle changes of the name. + + @param txt current text of the name edit + @type str + """ + self.__updateOkButton() + + def getData(self): + """ + Public method to get the entered data. + + @return tuple containing the variable name and value + @rtype tuple of (str, str) + """ + return ( + self.nameEdit.text().strip(), + self.valueEdit.text().strip(), + )
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Project/IdlCompilerDefineNameDialog.ui Wed Aug 01 19:43:34 2018 +0200 @@ -0,0 +1,99 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>IdlCompilerDefineNameDialog</class> + <widget class="QDialog" name="IdlCompilerDefineNameDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>108</height> + </rect> + </property> + <property name="windowTitle"> + <string>Define Name</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Name:</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLineEdit" name="nameEdit"> + <property name="toolTip"> + <string>Enter the variable name</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Value:</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLineEdit" name="valueEdit"> + <property name="toolTip"> + <string>Enter an optional value</string> + </property> + </widget> + </item> + <item row="2" column="0" colspan="2"> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <tabstops> + <tabstop>nameEdit</tabstop> + <tabstop>valueEdit</tabstop> + </tabstops> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>IdlCompilerDefineNameDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>IdlCompilerDefineNameDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Project/IdlCompilerOptionsDialog.py Wed Aug 01 19:43:34 2018 +0200 @@ -0,0 +1,420 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2018 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a dialog to enter some IDL compiler options. +""" + +from PyQt5.QtCore import pyqtSlot, Qt +from PyQt5.QtWidgets import QDialog, QTreeWidgetItem, QInputDialog + +from .Ui_IdlCompilerOptionsDialog import Ui_IdlCompilerOptionsDialog + +import UI.PixmapCache + +from E5Gui import E5PathPickerDialog +from E5Gui.E5PathPicker import E5PathPickerModes + +from .IdlCompilerDefineNameDialog import IdlCompilerDefineNameDialog + + +class IdlCompilerOptionsDialog(QDialog, Ui_IdlCompilerOptionsDialog): + """ + Class implementing a dialog to enter some IDL compiler options. + """ + def __init__(self, includeDirectories, definedNames, undefinedNames, + project=None, parent=None): + """ + Constructor + + @param includeDirectories list of include directories + @type list of str + @param definedNames list of defined variables with name and value + separated by '=' + @type list of str + @param undefinedNames list of undefined names + @type list of str + @param projectDirectory directory name of the project + @type str + @param parent reference to the parent widget + @type QWidget + """ + super(IdlCompilerOptionsDialog, self).__init__(parent) + self.setupUi(self) + + self.__project = project + + self.idAddButton.setIcon(UI.PixmapCache.getIcon("plus.png")) + self.idDeleteButton.setIcon(UI.PixmapCache.getIcon("minus.png")) + self.idEditButton.setIcon(UI.PixmapCache.getIcon("edit.png")) + + self.dnAddButton.setIcon(UI.PixmapCache.getIcon("plus.png")) + self.dnDeleteButton.setIcon(UI.PixmapCache.getIcon("minus.png")) + self.dnEditButton.setIcon(UI.PixmapCache.getIcon("edit.png")) + + self.unAddButton.setIcon(UI.PixmapCache.getIcon("plus.png")) + self.unDeleteButton.setIcon(UI.PixmapCache.getIcon("minus.png")) + self.unEditButton.setIcon(UI.PixmapCache.getIcon("edit.png")) + + self.__populateIncludeDirectoriesList(includeDirectories) + self.__populateDefineNamesList(definedNames) + self.unList.addItems(undefinedNames) + + self.__updateIncludeDirectoryButtons() + self.__updateDefineNameButtons() + self.__updateUndefineNameButtons() + + ####################################################################### + ## Methods implementing the 'Include Directory' option + ####################################################################### + + def __updateIncludeDirectoryButtons(self): + """ + Private method to set the state of the 'Include Directory' buttons. + """ + enable = len(self.idList.selectedItems()) + self.idDeleteButton.setEnabled(enable) + self.idEditButton.setEnabled(enable) + + def __populateIncludeDirectoriesList(self, includeDirectories): + """ + Private method to populate the 'Include Directories' list. + + @param includeDirectories list of include directories + @type list of str + """ + for directory in includeDirectories: + if self.__project: + path = self.__project.getRelativeUniversalPath(directory) + if not path: + # it is the project directory + path = "." + self.idList.addItem(path) + else: + self.idList.addItem(directory) + + def __generateIncludeDirectoriesList(self): + """ + Private method to prepare the list of 'Include Directories'. + + @return list of 'Include Directories' + @rtype list of str + """ + return [ + self.idList.item(row).text() + for row in range(self.idList.count()) + ] + + def __includeDirectoriesContain(self, directory): + """ + Private method to test, if the currently defined 'Include Directories' + contain a given one. + + @param directory directory name to be tested + @type str + @return flag indicating that the given directory is already included + @rtype bool + """ + return len(self.idList.findItems(directory, Qt.MatchExactly)) > 0 + + @pyqtSlot() + def on_idList_itemSelectionChanged(self): + """ + Private slot handling the selection of an 'Include Directory' entry. + """ + self.__updateIncludeDirectoryButtons() + + @pyqtSlot() + def on_idAddButton_clicked(self): + """ + Private slot to add an 'Include Directory'. + """ + if self.__project: + defaultDirectory = self.__project.getProjectPath() + else: + defaultDirectory = "" + path, ok = E5PathPickerDialog.getPath( + self, + self.tr("Include Directory"), + self.tr("Select Include Directory"), + E5PathPickerModes.DirectoryShowFilesMode, + defaultDirectory=defaultDirectory + ) + if ok and path: + if self.__project: + path = self.__project.getRelativeUniversalPath(path) + if not path: + path = "." + if not self.__includeDirectoriesContain(path): + self.idList.addItem(path) + + @pyqtSlot() + def on_idDeleteButton_clicked(self): + """ + Private slot to delete the selected 'Include Directory' entry. + """ + itm = self.idList.selectedItems()[0] + row = self.idList.row(itm) + self.idList.takeItem(row) + del itm + + @pyqtSlot() + def on_idEditButton_clicked(self): + """ + Private slot to edit the selected 'Include Directory' entry. + """ + itm = self.idList.selectedItems()[0] + if self.__project: + path = self.__project.getAbsoluteUniversalPath(itm.text()) + defaultDirectory = self.__project.getProjectPath() + else: + path = itm.text() + defaultDirectory = "" + path, ok = E5PathPickerDialog.getPath( + self, + self.tr("Include Directory"), + self.tr("Select Include Directory"), + E5PathPickerModes.DirectoryShowFilesMode, + path=path, + defaultDirectory=defaultDirectory + ) + if ok and path: + if self.__project: + path = self.__project.getRelativeUniversalPath(path) + if not path: + path = "." + if self.__includeDirectoriesContain(path) and itm.text() != path: + # the entry exists already, delete the edited one + row = self.idList.row(itm) + self.idList.takeItem(row) + del itm + else: + itm.setText(path) + + ####################################################################### + ## Methods implementing the 'Define Name' option + ####################################################################### + + def __updateDefineNameButtons(self): + """ + Private method to set the state of the 'Define Name' buttons. + """ + enable = len(self.dnList.selectedItems()) + self.dnDeleteButton.setEnabled(enable) + self.dnEditButton.setEnabled(enable) + + def __populateDefineNamesList(self, definedNames): + """ + Private method to populate the list of defined names. + + @param definedNames list of defined variables with name and value + separated by '=' + @type list of str + """ + for definedName in definedNames: + if definedName: + nameValueList = definedName.split("=") + name = nameValueList[0].strip() + if len(nameValueList) > 1: + value = nameValueList[1].strip() + else: + value = "" + QTreeWidgetItem(self.dnList, [name, value]) + + self.dnList.sortItems(0, Qt.AscendingOrder) + + def __generateDefinedNamesList(self): + """ + Private method to prepare the list of 'Defined Names'. + + @return list of 'Defined Names' + @rtype list of str + """ + definedNames = [] + for row in range(self.dnList.topLevelItemCount()): + itm = self.dnList.topLevelItem(row) + name = itm.text(0).strip() + value = itm.text(1).strip() + if value: + definedNames.append("{0}={1}".format(name, value)) + else: + definedNames.append(name) + + return definedNames + + def __definedNamesContain(self, name): + """ + Private method to test, if the currently defined 'Defined Names' + contain a given one. + + @param name variable name to be tested + @type str + @return flag indicating that the given name is already included + @rtype bool + """ + return len(self.dnList.findItems(name, Qt.MatchExactly, 0)) > 0 + + @pyqtSlot() + def on_dnList_itemSelectionChanged(self): + """ + Private slot handling the selection of a 'Define Name' entry. + """ + self.__updateDefineNameButtons() + + @pyqtSlot() + def on_dnAddButton_clicked(self): + """ + Private slot to add a 'Define Name' entry. + """ + dlg = IdlCompilerDefineNameDialog(parent=self) + if dlg.exec_() == QDialog.Accepted: + name, value = dlg.getData() + if not self.__definedNamesContain(name): + QTreeWidgetItem(self.dnList, [name, value]) + + self.dnList.sortItems(0, Qt.AscendingOrder) + + @pyqtSlot() + def on_dnDeleteButton_clicked(self): + """ + Private slot to delete the selected 'Define Name' entry. + """ + itm = self.dnList.selectedItems()[0] + index = self.dnList.indexOfTopLevelItem(itm) + self.dnList.takeTopLevelItem(index) + del itm + + @pyqtSlot() + def on_dnEditButton_clicked(self): + """ + Private slot to edit the selected 'Define Name' entry. + """ + itm = self.dnList.selectedItems()[0] + + dlg = IdlCompilerDefineNameDialog( + name=itm.text(0), value=itm.text(1), parent=self) + if dlg.exec_() == QDialog.Accepted: + name, value = dlg.getData() + if self.__definedNamesContain(name) and itm.text(0) != name: + # the entry exists already, delete the edited one + index = self.dnList.indexOfTopLevelItem(itm) + self.dnList.takeTopLevelItem(index) + del itm + + # change the named one + itm = self.dnList.findItems(name, Qt.MatchExactly, 0)[0] + itm.setText(1, value) + else: + itm.setText(0, name) + itm.setText(1, value) + + self.dnList.sortItems(0, Qt.AscendingOrder) + + ####################################################################### + ## Methods implementing the 'Undefine Name' option + ####################################################################### + + def __updateUndefineNameButtons(self): + """ + Private method to set the state of the 'Undefine Name' buttons. + """ + enable = len(self.unList.selectedItems()) + self.unDeleteButton.setEnabled(enable) + self.unEditButton.setEnabled(enable) + + def __generateUndefinedNamesList(self): + """ + Private method to prepare the list of 'Undefined Names'. + + @return list of 'Undefined Names' + @rtype list of str + """ + return [ + self.unList.item(row).text() + for row in range(self.unList.count()) + ] + + def __undefinedNamesContain(self, name): + """ + Private method to test, if the currently defined 'Undefined Names' + contain a given one. + + @param name variable name to be tested + @type str + @return flag indicating that the given name is already included + @rtype bool + """ + return len(self.unList.findItems(name, Qt.MatchExactly)) > 0 + + @pyqtSlot() + def on_unList_itemSelectionChanged(self): + """ + Private slot handling the selection of a 'Undefine Name' entry. + """ + self.__updateUndefineNameButtons() + + @pyqtSlot() + def on_unAddButton_clicked(self): + """ + Private slot to add a 'Undefine Name' entry. + """ + name, ok = QInputDialog.getText( + self, + self.tr("Undefine Name"), + self.tr("Enter a variable name to be undefined:") + ) + name = name.strip() + if ok and name and not self.__undefinedNamesContain(name): + self.unList.addItem(name) + + @pyqtSlot() + def on_unDeleteButton_clicked(self): + """ + Private slot to delete the selected 'Undefine Name' entry. + """ + itm = self.unList.selectedItems()[0] + row = self.unList.row(itm) + self.unList.takeItem(row) + del itm + + @pyqtSlot() + def on_unEditButton_clicked(self): + """ + Private slot to edit the selected 'Undefine Name' entry. + """ + itm = self.unList.selectedItems()[0] + name, ok = QInputDialog.getText( + self, + self.tr("Undefine Name"), + self.tr("Enter a variable name to be undefined:"), + text=itm.text() + ) + name = name.strip() + if ok and name: + if self.__undefinedNamesContain(name) and itm.text() != name: + # the entry exists already, delete the edited one + row = self.unList.row(itm) + self.unList.takeItem(row) + del itm + else: + itm.setText(name) + + ####################################################################### + ## Methods implementing the result preparation + ####################################################################### + + def getData(self): + """ + Public method to return the data entered by the user. + + @return tuple containing the list of include directories, list of + defined names and list of undefined names + @rtype tuple of (list of str, list of str, list of str) + """ + return ( + self.__generateIncludeDirectoriesList(), + self.__generateDefinedNamesList(), + self.__generateUndefinedNamesList(), + )
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Project/IdlCompilerOptionsDialog.ui Wed Aug 01 19:43:34 2018 +0200 @@ -0,0 +1,282 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>IdlCompilerOptionsDialog</class> + <widget class="QDialog" name="IdlCompilerOptionsDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>450</width> + <height>600</height> + </rect> + </property> + <property name="windowTitle"> + <string>IDL Compiler Options</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <layout class="QVBoxLayout" name="verticalLayout_4"> + <item> + <widget class="QGroupBox" name="includeDirectoriesGroup"> + <property name="title"> + <string>Include Directories (absolute or project relative)</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QListWidget" name="idList"> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + <property name="sortingEnabled"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QToolButton" name="idAddButton"> + <property name="toolTip"> + <string>Add an include directory</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="idDeleteButton"> + <property name="toolTip"> + <string>Delete an include directory</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="idEditButton"> + <property name="toolTip"> + <string>Edit an include directory</string> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>Define Names</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QTreeWidget" name="dnList"> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + <property name="rootIsDecorated"> + <bool>false</bool> + </property> + <property name="itemsExpandable"> + <bool>false</bool> + </property> + <property name="sortingEnabled"> + <bool>false</bool> + </property> + <property name="allColumnsShowFocus"> + <bool>true</bool> + </property> + <attribute name="headerDefaultSectionSize"> + <number>150</number> + </attribute> + <attribute name="headerShowSortIndicator" stdset="0"> + <bool>false</bool> + </attribute> + <column> + <property name="text"> + <string>Name</string> + </property> + </column> + <column> + <property name="text"> + <string>Value</string> + </property> + </column> + <column> + <property name="text"> + <string> </string> + </property> + </column> + </widget> + </item> + <item> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QToolButton" name="dnAddButton"> + <property name="toolTip"> + <string>Add a name entry</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="dnDeleteButton"> + <property name="toolTip"> + <string>Delete a name entry</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="dnEditButton"> + <property name="toolTip"> + <string>Edit a name entry</string> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer_2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string>Undefine Names</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <widget class="QListWidget" name="unList"> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + <property name="sortingEnabled"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <item> + <widget class="QToolButton" name="unAddButton"> + <property name="toolTip"> + <string>Add a name entry</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="unDeleteButton"> + <property name="toolTip"> + <string>Delete a name entry</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="unEditButton"> + <property name="toolTip"> + <string>Edit a name entry</string> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer_3"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <tabstops> + <tabstop>idList</tabstop> + <tabstop>idAddButton</tabstop> + <tabstop>idDeleteButton</tabstop> + <tabstop>idEditButton</tabstop> + <tabstop>dnList</tabstop> + <tabstop>dnAddButton</tabstop> + <tabstop>dnDeleteButton</tabstop> + <tabstop>dnEditButton</tabstop> + <tabstop>unList</tabstop> + <tabstop>unAddButton</tabstop> + <tabstop>unDeleteButton</tabstop> + <tabstop>unEditButton</tabstop> + </tabstops> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>IdlCompilerOptionsDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>IdlCompilerOptionsDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui>
--- a/Project/Project.py Sat Jul 07 12:01:23 2018 +0200 +++ b/Project/Project.py Wed Aug 01 19:43:34 2018 +0200 @@ -488,6 +488,11 @@ "MakeParameters": "", "MakeTestOnly": True, }, + "IDLPARAMS": { + "IncludeDirs": [], + "DefinedNames": [], + "UndefinedNames": [], + }, "EOL": -1, } @@ -5180,7 +5185,8 @@ elif len(pkglists) > 1: dlg = E5ListSelectionDialog( sorted(pkglists), title=self.tr("Create Plugin Archive"), - message=self.tr("Select package lists:")) + message=self.tr("Select package lists:"), + checkBoxSelection=True) if dlg.exec_() == QDialog.Accepted: selectedLists = [os.path.join(self.ppath, s) for s in dlg.getSelection()] @@ -5615,3 +5621,21 @@ self.__makeProcess.finished.disconnect() self.__makeProcess.deleteLater() self.__makeProcess = None + + ######################################################################### + ## Below are methods implementing the some 'IDL' support functions + ######################################################################### + + def hasDefaultIdlCompilerParameters(self): + """ + Public method to test, if the project contains the default IDL compiler + parameters. + + @return flag indicating default parameter set + @rtype bool + """ + return self.pdata["IDLPARAMS"] == { + "IncludeDirs": [], + "DefinedNames": [], + "UndefinedNames": [], + }
--- a/Project/ProjectBrowser.py Sat Jul 07 12:01:23 2018 +0200 +++ b/Project/ProjectBrowser.py Wed Aug 01 19:43:34 2018 +0200 @@ -13,8 +13,6 @@ from PyQt5.QtGui import QColor from PyQt5.QtWidgets import QApplication -from UI.Browser import Browser - from E5Gui.E5TabWidget import E5TabWidget from E5Gui.E5Led import E5ClickableLed @@ -37,16 +35,12 @@ that doesn't fit these categories. Optionally it contains an additional tab with the file system browser. """ - def __init__(self, project, parent=None, embeddedBrowser=True): + def __init__(self, project, parent=None): """ Constructor @param project reference to the project object @param parent parent widget (QWidget) - @param embeddedBrowser flag indicating whether the file browser should - be included. This flag is set to False by those layouts, that - have the file browser in a separate window or embedded - in the debeug browser instead """ E5TabWidget.__init__(self, parent) self.project = project @@ -101,11 +95,6 @@ # others browser self.poBrowser = ProjectOthersBrowser(self.project) - # add the file browser, if it should be embedded here - self.embeddedBrowser = embeddedBrowser - if embeddedBrowser: - self.fileBrowser = Browser() - # step 2: connect all the browsers # connect the sources browser self.project.projectClosed.connect(self.psBrowser._projectClosed) @@ -174,10 +163,7 @@ self.__currentBrowsersFlags = 0 self.__projectPropertiesChanged() - if self.embeddedBrowser: - self.setCurrentWidget(self.fileBrowser) - else: - self.setCurrentIndex(0) + self.setCurrentIndex(0) def __setBrowsersAvailable(self, browserFlags): """ @@ -232,24 +218,8 @@ UI.PixmapCache.getIcon("projectOthers.png"), '') self.setTabToolTip(index, self.poBrowser.windowTitle()) - if self.embeddedBrowser: - index = self.addTab( - self.fileBrowser, - UI.PixmapCache.getIcon("browser.png"), '') - self.setTabToolTip(index, self.fileBrowser.windowTitle()) - QApplication.processEvents() - def showEvent(self, evt): - """ - Protected method handleing the show event. - - @param evt show event to handle (QShowEvent) - """ - E5TabWidget.showEvent(self, evt) - if self.embeddedBrowser: - self.fileBrowser.layoutDisplay() - def __currentChanged(self, index): """ Private slot to handle the currentChanged(int) signal. @@ -274,10 +244,7 @@ Private slot to handle the projectClosed signal. """ self.__projectPropertiesChanged() - if self.embeddedBrowser: - self.setCurrentWidget(self.fileBrowser) - else: - self.setCurrentIndex(0) + self.setCurrentIndex(0) self.__setSourcesIcon() self.__vcsStateChanged(" ") @@ -302,10 +269,7 @@ self.__currentBrowsersFlags = flags self.__setBrowsersAvailable(flags) - if self.embeddedBrowser: - endIndex = self.count() - 1 - else: - endIndex = self.count() + endIndex = self.count() for index in range(endIndex): self.setTabEnabled(index, self.project.isOpen())
--- a/Project/ProjectInterfacesBrowser.py Sat Jul 07 12:01:23 2018 +0200 +++ b/Project/ProjectInterfacesBrowser.py Wed Aug 01 19:43:34 2018 +0200 @@ -100,6 +100,11 @@ self.sourceMenu.addAction( self.tr('Compile all interfaces'), self.__compileAllInterfaces) + self.sourceMenu.addSeparator() + self.sourceMenu.addAction( + self.tr('Configure IDL compiler'), + self.__configureIdlCompiler) + self.sourceMenu.addSeparator() self.sourceMenu.addAction(self.tr('Open'), self._openItem) self.sourceMenu.addSeparator() act = self.sourceMenu.addAction( @@ -137,6 +142,11 @@ self.menu.addAction( self.tr('Compile all interfaces'), self.__compileAllInterfaces) + self.menu.addSeparator() + self.menu.addAction( + self.tr('Configure IDL compiler'), + self.__configureIdlCompiler) + self.menu.addSeparator() self.menu.addAction(self.tr('Open'), self._openItem) self.menu.addSeparator() self.menu.addAction( @@ -160,6 +170,10 @@ self.tr('Compile all interfaces'), self.__compileAllInterfaces) self.backMenu.addSeparator() + self.backMenu.addAction( + self.tr('Configure IDL compiler'), + self.__configureIdlCompiler) + self.backMenu.addSeparator() self.backMenu.addAction( self.tr('Add interfaces...'), self.project.addIdlFiles) self.backMenu.addAction( @@ -181,6 +195,11 @@ self.multiMenu.addAction( self.tr('Compile interfaces'), self.__compileSelectedInterfaces) + self.multiMenu.addSeparator() + self.multiMenu.addAction( + self.tr('Configure IDL compiler'), + self.__configureIdlCompiler) + self.multiMenu.addSeparator() self.multiMenu.addAction(self.tr('Open'), self._openItem) self.multiMenu.addSeparator() act = self.multiMenu.addAction( @@ -205,6 +224,10 @@ self.tr('Compile all interfaces'), self.__compileAllInterfaces) self.dirMenu.addSeparator() + self.dirMenu.addAction( + self.tr('Configure IDL compiler'), + self.__configureIdlCompiler) + self.dirMenu.addSeparator() act = self.dirMenu.addAction( self.tr('Remove from project'), self._removeFile) self.dirMenuActions.append(act) @@ -236,6 +259,10 @@ self.tr('Compile all interfaces'), self.__compileAllInterfaces) self.dirMultiMenu.addSeparator() + self.dirMultiMenu.addAction( + self.tr('Configure IDL compiler'), + self.__configureIdlCompiler) + self.dirMultiMenu.addSeparator() self.dirMultiMenu.addAction( self.tr('Add interfaces...'), self.project.addIdlFiles) self.dirMultiMenu.addAction( @@ -525,13 +552,22 @@ @param progress reference to the progress dialog (E5ProgressDialog) @return reference to the compile process (QProcess) """ + params = self.project.pdata["IDLPARAMS"] + self.compileProc = QProcess() args = [] args.append("-bpython") args.append("-I.") + for directory in params["IncludeDirs"]: + args.append("-I{0}".format( + self.project.getAbsoluteUniversalPath(directory))) + for name in params["DefinedNames"]: + args.append("-D{0}".format(name)) + for name in params["UndefinedNames"]: + args.append("-U{0}".format(name)) - fn = os.path.join(self.project.ppath, fn) + fn = self.project.getAbsoluteUniversalPath(fn) self.idlFile = fn args.append("-C{0}".format(os.path.dirname(fn))) args.append(fn) @@ -634,7 +670,30 @@ i += 1 progress.setValue(numIDLs) + + def __configureIdlCompiler(self): + """ + Private method to show a dialog to configure some options for the + IDL compiler. + """ + params = self.project.pdata["IDLPARAMS"] + from .IdlCompilerOptionsDialog import IdlCompilerOptionsDialog + dlg = IdlCompilerOptionsDialog( + params["IncludeDirs"][:], params["DefinedNames"][:], + params["UndefinedNames"][:], self.project, self) + if dlg.exec_() == QDialog.Accepted: + include, defined, undefined = dlg.getData() + if include != params["IncludeDirs"]: + params["IncludeDirs"] = include[:] + self.project.setDirty(True) + if defined != params["DefinedNames"]: + params["DefinedNames"] = defined[:] + self.project.setDirty(True) + if undefined != params["UndefinedNames"]: + params["UndefinedNames"] = undefined[:] + self.project.setDirty(True) + def __configureCorba(self): """ Private method to open the configuration dialog.
--- a/QScintilla/Editor.py Sat Jul 07 12:01:23 2018 +0200 +++ b/QScintilla/Editor.py Wed Aug 01 19:43:34 2018 +0200 @@ -7191,27 +7191,33 @@ @param cmd the scintilla command to be performed """ if cmd == QsciScintilla.SCI_TAB: - line, index = self.getCursorPosition() - tmplName = self.getWordLeft(line, index) - if tmplName: - if e5App().getObject("TemplateViewer").hasTemplate( - tmplName, self.getLanguage()): - self.__applyTemplate(tmplName, self.getLanguage()) - return - else: - templateNames = \ - e5App().getObject("TemplateViewer").getTemplateNames( + try: + templateViewer = e5App().getObject("TemplateViewer") + except KeyError: + # template viewer is not active + templateViewer = None + + if templateViewer is not None: + line, index = self.getCursorPosition() + tmplName = self.getWordLeft(line, index) + if tmplName: + if templateViewer.hasTemplate(tmplName, + self.getLanguage()): + self.__applyTemplate(tmplName, self.getLanguage()) + return + else: + templateNames = templateViewer.getTemplateNames( tmplName, self.getLanguage()) - if len(templateNames) == 1: - self.__applyTemplate(templateNames[0], - self.getLanguage()) - return - elif len(templateNames) > 1: - self.showUserList( - TemplateCompletionListID, - ["{0}?{1:d}".format(t, self.TemplateImageID) - for t in templateNames]) - return + if len(templateNames) == 1: + self.__applyTemplate(templateNames[0], + self.getLanguage()) + return + elif len(templateNames) > 1: + self.showUserList( + TemplateCompletionListID, + ["{0}?{1:d}".format(t, self.TemplateImageID) + for t in templateNames]) + return super(Editor, self).editorCommand(cmd) @@ -7223,11 +7229,16 @@ @param language name of the language (group) to get the template from (string) """ - if e5App().getObject("TemplateViewer").hasTemplate( - templateName, self.getLanguage()): + try: + templateViewer = e5App().getObject("TemplateViewer") + except KeyError: + # template viewer is not active + return + + if templateViewer.hasTemplate(templateName, self.getLanguage()): self.extendSelectionWordLeft() - e5App().getObject("TemplateViewer").applyNamedTemplate( - templateName, self.getLanguage()) + templateViewer.applyNamedTemplate(templateName, + self.getLanguage()) ####################################################################### ## Project related methods
--- a/UI/UserInterface.py Sat Jul 07 12:01:23 2018 +0200 +++ b/UI/UserInterface.py Wed Aug 01 19:43:34 2018 +0200 @@ -209,8 +209,7 @@ self.__disableCrashSession = disableCrashSession self.__disabledPlugins = disabledPlugins[:] - self.layoutType, self.embeddedShell, self.embeddedFileBrowser = \ - Preferences.getUILayout() + self.__layoutType = Preferences.getUI("LayoutType") self.passiveMode = Preferences.getDebugger("PassiveDbgEnabled") @@ -268,6 +267,14 @@ splash.showMessage(self.tr("Generating Main User Interface...")) + self.codeDocumentationViewer = None + self.cooperation = None + self.irc = None + self.symbolsViewer = None + self.browser = None + self.templateViewer = None + self.numbersViewer = None + # Create the main window now so that we can connect QActions to it. logging.debug("Creating Layout...") self.__createLayout(debugServer) @@ -301,25 +308,6 @@ # now setup the connections splash.showMessage(self.tr("Setting up connections...")) - self.browser.sourceFile[str].connect( - self.viewmanager.openSourceFile) - self.browser.sourceFile[str, int].connect( - self.viewmanager.openSourceFile) - self.browser.sourceFile[str, list].connect( - self.viewmanager.openSourceFile) - self.browser.sourceFile[str, int, str].connect( - self.viewmanager.openSourceFile) - self.browser.designerFile.connect(self.__designer) - self.browser.linguistFile.connect(self.__linguist4) - self.browser.projectFile.connect(self.project.openProject) - self.browser.multiProjectFile.connect( - self.multiProject.openMultiProject) - self.browser.pixmapEditFile.connect(self.__editPixmap) - self.browser.pixmapFile.connect(self.__showPixmap) - self.browser.svgFile.connect(self.__showSvg) - self.browser.binaryFile.connect(self.__openHexEditor) - self.browser.unittestOpen.connect(self.__unittestScript) - self.browser.trpreview.connect(self.__TRPreviewer) self.debugViewer.exceptionLogger.sourceFile.connect( self.viewmanager.openSourceFile) @@ -426,8 +414,6 @@ self.debuggerUI.resetUI.connect(self.debugViewer.handleResetUI) self.debuggerUI.resetUI.connect(self.__debuggingDone) self.debuggerUI.debuggingStarted.connect( - self.browser.handleProgramChange) - self.debuggerUI.debuggingStarted.connect( self.debugViewer.exceptionLogger.debuggingStarted) self.debuggerUI.debuggingStarted.connect( self.debugViewer.handleDebuggingStarted) @@ -450,8 +436,6 @@ self.debugViewer.breakpointViewer.highlightBreakpoint) debugServer.clientProcessStdout.connect(self.appendToStdout) debugServer.clientProcessStderr.connect(self.appendToStderr) - debugServer.clientInterpreterChanged.connect( - self.browser.handleInterpreterChanged) debugServer.appendStdout.connect(self.appendToStdout) self.stdout.appendStdout.connect(self.appendToStdout) @@ -480,17 +464,47 @@ self.projectBrowser.ppBrowser.handlePreferencesChanged) self.preferencesChanged.connect( self.projectBrowser.poBrowser.handlePreferencesChanged) - self.preferencesChanged.connect(self.browser.handlePreferencesChanged) self.preferencesChanged.connect( self.taskViewer.handlePreferencesChanged) self.preferencesChanged.connect(self.pluginManager.preferencesChanged) self.preferencesChanged.connect(debugServer.preferencesChanged) self.preferencesChanged.connect(self.debugViewer.preferencesChanged) - self.preferencesChanged.connect(self.cooperation.preferencesChanged) self.preferencesChanged.connect( self.backgroundService.preferencesOrProjectChanged) - self.preferencesChanged.connect( - self.codeDocumentationViewer.preferencesChanged) + + if self.browser is not None: + self.browser.sourceFile[str].connect( + self.viewmanager.openSourceFile) + self.browser.sourceFile[str, int].connect( + self.viewmanager.openSourceFile) + self.browser.sourceFile[str, list].connect( + self.viewmanager.openSourceFile) + self.browser.sourceFile[str, int, str].connect( + self.viewmanager.openSourceFile) + self.browser.designerFile.connect(self.__designer) + self.browser.linguistFile.connect(self.__linguist4) + self.browser.projectFile.connect(self.project.openProject) + self.browser.multiProjectFile.connect( + self.multiProject.openMultiProject) + self.browser.pixmapEditFile.connect(self.__editPixmap) + self.browser.pixmapFile.connect(self.__showPixmap) + self.browser.svgFile.connect(self.__showSvg) + self.browser.binaryFile.connect(self.__openHexEditor) + self.browser.unittestOpen.connect(self.__unittestScript) + self.browser.trpreview.connect(self.__TRPreviewer) + + self.debuggerUI.debuggingStarted.connect( + self.browser.handleProgramChange) + + debugServer.clientInterpreterChanged.connect( + self.browser.handleInterpreterChanged) + + self.preferencesChanged.connect( + self.browser.handlePreferencesChanged) + + if self.codeDocumentationViewer is not None: + self.preferencesChanged.connect( + self.codeDocumentationViewer.preferencesChanged) self.viewmanager.editorSaved.connect(self.project.repopulateItem) self.viewmanager.lastEditorClosed.connect(self.__lastEditorClosed) @@ -501,8 +515,6 @@ self.projectBrowser.handleEditorChanged) self.viewmanager.editorLineChanged.connect( self.projectBrowser.handleEditorLineChanged) - self.viewmanager.checkActions.connect( - self.cooperation.checkEditorActions) self.viewmanager.editorOpened.connect(self.__writeCrashSession) self.viewmanager.editorClosed.connect(self.__writeCrashSession) self.viewmanager.editorRenamed.connect(self.__writeCrashSession) @@ -511,19 +523,36 @@ self.shell.zoomValueChanged.connect( lambda v: self.viewmanager.zoomValueChanged(v, self.shell)) - self.cooperation.shareEditor.connect(self.viewmanager.shareEditor) - self.cooperation.startEdit.connect(self.viewmanager.startSharedEdit) - self.cooperation.sendEdit.connect(self.viewmanager.sendSharedEdit) - self.cooperation.cancelEdit.connect(self.viewmanager.cancelSharedEdit) - self.cooperation.connected.connect(self.viewmanager.shareConnected) - self.cooperation.editorCommand.connect(self.viewmanager.receive) - self.viewmanager.setCooperationClient(self.cooperation.getClient()) - - self.symbolsViewer.insertSymbol.connect(self.viewmanager.insertSymbol) - - self.numbersViewer.insertNumber.connect(self.viewmanager.insertNumber) - - self.irc.autoConnected.connect(self.__ircAutoConnected) + if self.cooperation is not None: + self.viewmanager.checkActions.connect( + self.cooperation.checkEditorActions) + self.preferencesChanged.connect( + self.cooperation.preferencesChanged) + self.cooperation.shareEditor.connect( + self.viewmanager.shareEditor) + self.cooperation.startEdit.connect( + self.viewmanager.startSharedEdit) + self.cooperation.sendEdit.connect( + self.viewmanager.sendSharedEdit) + self.cooperation.cancelEdit.connect( + self.viewmanager.cancelSharedEdit) + self.cooperation.connected.connect( + self.viewmanager.shareConnected) + self.cooperation.editorCommand.connect( + self.viewmanager.receive) + self.viewmanager.setCooperationClient( + self.cooperation.getClient()) + + if self.symbolsViewer is not None: + self.symbolsViewer.insertSymbol.connect( + self.viewmanager.insertSymbol) + + if self.numbersViewer is not None: + self.numbersViewer.insertNumber.connect( + self.viewmanager.insertNumber) + + if self.irc is not None: + self.irc.autoConnected.connect(self.__ircAutoConnected) # create the toolbar manager object self.toolbarManager = E5ToolBarManager(self, self) @@ -563,17 +592,23 @@ e5App().registerObject("ProjectBrowser", self.projectBrowser) e5App().registerObject("MultiProject", self.multiProject) e5App().registerObject("TaskViewer", self.taskViewer) - e5App().registerObject("TemplateViewer", self.templateViewer) + if self.templateViewer is not None: + e5App().registerObject("TemplateViewer", self.templateViewer) e5App().registerObject("Shell", self.shell) if self.dummyHelpViewer is not None: e5App().registerObject("DummyHelpViewer", self.dummyHelpViewer) e5App().registerObject("PluginManager", self.pluginManager) e5App().registerObject("ToolbarManager", self.toolbarManager) - e5App().registerObject("Cooperation", self.cooperation) - e5App().registerObject("IRC", self.irc) - e5App().registerObject("Symbols", self.symbolsViewer) - e5App().registerObject("Numbers", self.numbersViewer) - e5App().registerObject("DocuViewer", self.codeDocumentationViewer) + if self.cooperation is not None: + e5App().registerObject("Cooperation", self.cooperation) + if self.irc is not None: + e5App().registerObject("IRC", self.irc) + if self.symbolsViewer is not None: + e5App().registerObject("Symbols", self.symbolsViewer) + if self.numbersViewer is not None: + e5App().registerObject("Numbers", self.numbersViewer) + if self.codeDocumentationViewer is not None: + e5App().registerObject("DocuViewer", self.codeDocumentationViewer) # list of web addresses serving the versions file self.__httpAlternatives = Preferences.getUI("VersionsUrls6") @@ -642,8 +677,9 @@ self.toolbarManager.restoreState( Preferences.getUI("ToolbarManagerState")) - # finalize the initialization of the code documentation viewer - self.codeDocumentationViewer.finalizeSetup() + if self.codeDocumentationViewer is not None: + # finalize the initialization of the code documentation viewer + self.codeDocumentationViewer.finalizeSetup() # now activate the initial view profile splash.showMessage(self.tr("Setting View Profile...")) @@ -653,9 +689,10 @@ splash.showMessage(self.tr("Reading Tasks...")) self.__readTasks() - # now read the saved templates - splash.showMessage(self.tr("Reading Templates...")) - self.templateViewer.readTemplates() + if self.templateViewer is not None: + # now read the saved templates + splash.showMessage(self.tr("Reading Templates...")) + self.templateViewer.readTemplates() # now start the debug client splash.showMessage(self.tr("Starting Debugger...")) @@ -724,18 +761,18 @@ splitter.addWidget(self.__previewer) # Create layout with toolbox windows embedded in dock windows - if self.layoutType == "Toolboxes": + if self.__layoutType == "Toolboxes": logging.debug("Creating toolboxes...") self.__createToolboxesLayout(debugServer) # Create layout with sidebar windows embedded in dock windows - elif self.layoutType == "Sidebars": + elif self.__layoutType == "Sidebars": logging.debug("Creating sidebars...") self.__createSidebarsLayout(debugServer) else: raise ValueError("Wrong layout type given ({0})".format( - self.layoutType)) + self.__layoutType)) logging.debug("Created Layout") def __createToolboxesLayout(self, debugServer): @@ -770,9 +807,7 @@ # Create the project browser logging.debug("Creating Project Browser...") from Project.ProjectBrowser import ProjectBrowser - self.projectBrowser = ProjectBrowser( - self.project, None, - embeddedBrowser=(self.embeddedFileBrowser == 2)) + self.projectBrowser = ProjectBrowser(self.project) self.lToolbox.addItem(self.projectBrowser, UI.PixmapCache.getIcon("projectViewer.png"), self.tr("Project-Viewer")) @@ -785,50 +820,51 @@ self.lToolbox.addItem(self.multiProjectBrowser, UI.PixmapCache.getIcon("multiProjectViewer.png"), self.tr("Multiproject-Viewer")) - - # Create the template viewer part of the user interface - logging.debug("Creating Template Viewer...") - from Templates.TemplateViewer import TemplateViewer - self.templateViewer = TemplateViewer(None, - self.viewmanager) - self.lToolbox.addItem(self.templateViewer, - UI.PixmapCache.getIcon("templateViewer.png"), - self.tr("Template-Viewer")) - - # Create the code documentation viewer - logging.debug("Creating Code Documentation Viewer...") - from .CodeDocumentationViewer import CodeDocumentationViewer - self.codeDocumentationViewer = CodeDocumentationViewer(self) - self.rToolbox.addItem(self.codeDocumentationViewer, - UI.PixmapCache.getIcon("codeDocuViewer.png"), - self.tr("Code Documentation Viewer")) + + if Preferences.getUI("ShowTemplateViewer"): + # Create the template viewer part of the user interface + logging.debug("Creating Template Viewer...") + from Templates.TemplateViewer import TemplateViewer + self.templateViewer = TemplateViewer(None, + self.viewmanager) + self.lToolbox.addItem(self.templateViewer, + UI.PixmapCache.getIcon("templateViewer.png"), + self.tr("Template-Viewer")) + + if Preferences.getUI("ShowCodeDocumentationViewer"): + # Create the code documentation viewer + logging.debug("Creating Code Documentation Viewer...") + from .CodeDocumentationViewer import CodeDocumentationViewer + self.codeDocumentationViewer = CodeDocumentationViewer(self) + self.rToolbox.addItem(self.codeDocumentationViewer, + UI.PixmapCache.getIcon("codeDocuViewer.png"), + self.tr("Code Documentation Viewer")) # Create the debug viewer maybe without the embedded shell logging.debug("Creating Debug Viewer...") from Debugger.DebugViewer import DebugViewer - self.debugViewer = DebugViewer( - debugServer, True, self.viewmanager, None, - embeddedShell=self.embeddedShell, - embeddedBrowser=(self.embeddedFileBrowser == 1)) + self.debugViewer = DebugViewer(debugServer, True, self.viewmanager) self.rToolbox.addItem(self.debugViewer, UI.PixmapCache.getIcon("debugViewer.png"), self.tr("Debug-Viewer")) - - # Create the chat part of the user interface - logging.debug("Creating Chat Widget...") - from Cooperation.ChatWidget import ChatWidget - self.cooperation = ChatWidget(self) - self.rToolbox.addItem(self.cooperation, - UI.PixmapCache.getIcon("cooperation.png"), - self.tr("Cooperation")) - - # Create the IRC part of the user interface - logging.debug("Creating IRC Widget...") - from Network.IRC.IrcWidget import IrcWidget - self.irc = IrcWidget(self) - self.rToolbox.addItem(self.irc, - UI.PixmapCache.getIcon("irc.png"), - self.tr("IRC")) + + if Preferences.getUI("ShowCooperation"): + # Create the chat part of the user interface + logging.debug("Creating Chat Widget...") + from Cooperation.ChatWidget import ChatWidget + self.cooperation = ChatWidget(self) + self.rToolbox.addItem(self.cooperation, + UI.PixmapCache.getIcon("cooperation.png"), + self.tr("Cooperation")) + + if Preferences.getUI("ShowIrc"): + # Create the IRC part of the user interface + logging.debug("Creating IRC Widget...") + from Network.IRC.IrcWidget import IrcWidget + self.irc = IrcWidget(self) + self.rToolbox.addItem(self.irc, + UI.PixmapCache.getIcon("irc.png"), + self.tr("IRC")) # Create the task viewer part of the user interface logging.debug("Creating Task Viewer...") @@ -846,20 +882,17 @@ UI.PixmapCache.getIcon("logViewer.png"), self.tr("Log-Viewer")) - if self.embeddedShell: - self.shell = self.debugViewer.shell - else: - # Create the shell - logging.debug("Creating Shell...") - from QScintilla.Shell import ShellAssembly - self.shellAssembly = \ - ShellAssembly(debugServer, self.viewmanager, True) - self.shell = self.shellAssembly.shell() - self.hToolbox.insertItem(0, self.shellAssembly, - UI.PixmapCache.getIcon("shell.png"), - self.tr("Shell")) - - if self.embeddedFileBrowser == 0: # separate window + # Create the shell + logging.debug("Creating Shell...") + from QScintilla.Shell import ShellAssembly + self.shellAssembly = \ + ShellAssembly(debugServer, self.viewmanager, True) + self.shell = self.shellAssembly.shell() + self.hToolbox.insertItem(0, self.shellAssembly, + UI.PixmapCache.getIcon("shell.png"), + self.tr("Shell")) + + if Preferences.getUI("ShowFileBrowser"): # Create the file browser logging.debug("Creating File Browser...") from .Browser import Browser @@ -867,26 +900,24 @@ self.lToolbox.addItem(self.browser, UI.PixmapCache.getIcon("browser.png"), self.tr("File-Browser")) - elif self.embeddedFileBrowser == 1: # embedded in debug browser - self.browser = self.debugViewer.browser - else: # embedded in project browser - self.browser = self.projectBrowser.fileBrowser - - # Create the symbols viewer - logging.debug("Creating Symbols Viewer...") - from .SymbolsWidget import SymbolsWidget - self.symbolsViewer = SymbolsWidget() - self.lToolbox.addItem(self.symbolsViewer, - UI.PixmapCache.getIcon("symbols.png"), - self.tr("Symbols")) - - # Create the numbers viewer - logging.debug("Creating Numbers Viewer...") - from .NumbersWidget import NumbersWidget - self.numbersViewer = NumbersWidget() - self.hToolbox.addItem(self.numbersViewer, - UI.PixmapCache.getIcon("numbers.png"), - self.tr("Numbers")) + + if Preferences.getUI("ShowSymbolsViewer"): + # Create the symbols viewer + logging.debug("Creating Symbols Viewer...") + from .SymbolsWidget import SymbolsWidget + self.symbolsViewer = SymbolsWidget() + self.lToolbox.addItem(self.symbolsViewer, + UI.PixmapCache.getIcon("symbols.png"), + self.tr("Symbols")) + + if Preferences.getUI("ShowNumbersViewer"): + # Create the numbers viewer + logging.debug("Creating Numbers Viewer...") + from .NumbersWidget import NumbersWidget + self.numbersViewer = NumbersWidget() + self.hToolbox.addItem(self.numbersViewer, + UI.PixmapCache.getIcon("numbers.png"), + self.tr("Numbers")) self.hToolbox.setCurrentIndex(0) @@ -913,9 +944,7 @@ # Create the project browser logging.debug("Creating Project Browser...") from Project.ProjectBrowser import ProjectBrowser - self.projectBrowser = ProjectBrowser( - self.project, None, - embeddedBrowser=(self.embeddedFileBrowser == 2)) + self.projectBrowser = ProjectBrowser(self.project) self.leftSidebar.addTab( self.projectBrowser, UI.PixmapCache.getIcon("projectViewer.png"), @@ -931,50 +960,52 @@ UI.PixmapCache.getIcon("multiProjectViewer.png"), self.tr("Multiproject-Viewer")) - # Create the template viewer part of the user interface - logging.debug("Creating Template Viewer...") - from Templates.TemplateViewer import TemplateViewer - self.templateViewer = TemplateViewer(None, - self.viewmanager) - self.leftSidebar.addTab( - self.templateViewer, - UI.PixmapCache.getIcon("templateViewer.png"), - self.tr("Template-Viewer")) + if Preferences.getUI("ShowTemplateViewer"): + # Create the template viewer part of the user interface + logging.debug("Creating Template Viewer...") + from Templates.TemplateViewer import TemplateViewer + self.templateViewer = TemplateViewer(None, + self.viewmanager) + self.leftSidebar.addTab( + self.templateViewer, + UI.PixmapCache.getIcon("templateViewer.png"), + self.tr("Template-Viewer")) - # Create the code documentation viewer - logging.debug("Creating Code Documentation Viewer...") - from .CodeDocumentationViewer import CodeDocumentationViewer - self.codeDocumentationViewer = CodeDocumentationViewer(self) - self.rightSidebar.addTab( - self.codeDocumentationViewer, - UI.PixmapCache.getIcon("codeDocuViewer.png"), - self.tr("Code Documentation Viewer")) + if Preferences.getUI("ShowCodeDocumentationViewer"): + # Create the code documentation viewer + logging.debug("Creating Code Documentation Viewer...") + from .CodeDocumentationViewer import CodeDocumentationViewer + self.codeDocumentationViewer = CodeDocumentationViewer(self) + self.rightSidebar.addTab( + self.codeDocumentationViewer, + UI.PixmapCache.getIcon("codeDocuViewer.png"), + self.tr("Code Documentation Viewer")) # Create the debug viewer maybe without the embedded shell logging.debug("Creating Debug Viewer...") from Debugger.DebugViewer import DebugViewer - self.debugViewer = DebugViewer( - debugServer, True, self.viewmanager, None, - embeddedShell=self.embeddedShell, - embeddedBrowser=(self.embeddedFileBrowser == 1)) + self.debugViewer = DebugViewer(debugServer, True, self.viewmanager) self.rightSidebar.addTab( self.debugViewer, UI.PixmapCache.getIcon("debugViewer.png"), self.tr("Debug-Viewer")) - # Create the chat part of the user interface - logging.debug("Creating Chat Widget...") - from Cooperation.ChatWidget import ChatWidget - self.cooperation = ChatWidget(self) - self.rightSidebar.addTab( - self.cooperation, UI.PixmapCache.getIcon("cooperation.png"), - self.tr("Cooperation")) - - # Create the IRC part of the user interface - logging.debug("Creating IRC Widget...") - from Network.IRC.IrcWidget import IrcWidget - self.irc = IrcWidget(self) - self.rightSidebar.addTab( - self.irc, UI.PixmapCache.getIcon("irc.png"), self.tr("IRC")) + if Preferences.getUI("ShowCooperation"): + # Create the chat part of the user interface + logging.debug("Creating Chat Widget...") + from Cooperation.ChatWidget import ChatWidget + self.cooperation = ChatWidget(self) + self.rightSidebar.addTab( + self.cooperation, UI.PixmapCache.getIcon("cooperation.png"), + self.tr("Cooperation")) + + if Preferences.getUI("ShowIrc"): + # Create the IRC part of the user interface + logging.debug("Creating IRC Widget...") + from Network.IRC.IrcWidget import IrcWidget + self.irc = IrcWidget(self) + self.rightSidebar.addTab( + self.irc, UI.PixmapCache.getIcon("irc.png"), + self.tr("IRC")) # Create the task viewer part of the user interface logging.debug("Creating Task Viewer...") @@ -992,20 +1023,17 @@ UI.PixmapCache.getIcon("logViewer.png"), self.tr("Log-Viewer")) - if self.embeddedShell: - self.shell = self.debugViewer.shell - else: - # Create the shell - logging.debug("Creating Shell...") - from QScintilla.Shell import ShellAssembly - self.shellAssembly = \ - ShellAssembly(debugServer, self.viewmanager, True) - self.shell = self.shellAssembly.shell() - self.bottomSidebar.insertTab(0, self.shellAssembly, - UI.PixmapCache.getIcon("shell.png"), - self.tr("Shell")) + # Create the shell + logging.debug("Creating Shell...") + from QScintilla.Shell import ShellAssembly + self.shellAssembly = \ + ShellAssembly(debugServer, self.viewmanager, True) + self.shell = self.shellAssembly.shell() + self.bottomSidebar.insertTab(0, self.shellAssembly, + UI.PixmapCache.getIcon("shell.png"), + self.tr("Shell")) - if self.embeddedFileBrowser == 0: # separate window + if Preferences.getUI("ShowFileBrowser"): # Create the file browser logging.debug("Creating File Browser...") from .Browser import Browser @@ -1013,26 +1041,24 @@ self.leftSidebar.addTab(self.browser, UI.PixmapCache.getIcon("browser.png"), self.tr("File-Browser")) - elif self.embeddedFileBrowser == 1: # embedded in debug browser - self.browser = self.debugViewer.browser - else: # embedded in project browser - self.browser = self.projectBrowser.fileBrowser - - # Create the symbols viewer - logging.debug("Creating Symbols Viewer...") - from .SymbolsWidget import SymbolsWidget - self.symbolsViewer = SymbolsWidget() - self.leftSidebar.addTab(self.symbolsViewer, - UI.PixmapCache.getIcon("symbols.png"), - self.tr("Symbols")) - - # Create the numbers viewer - logging.debug("Creating Numbers Viewer...") - from .NumbersWidget import NumbersWidget - self.numbersViewer = NumbersWidget() - self.bottomSidebar.addTab(self.numbersViewer, - UI.PixmapCache.getIcon("numbers.png"), - self.tr("Numbers")) + + if Preferences.getUI("ShowSymbolsViewer"): + # Create the symbols viewer + logging.debug("Creating Symbols Viewer...") + from .SymbolsWidget import SymbolsWidget + self.symbolsViewer = SymbolsWidget() + self.leftSidebar.addTab(self.symbolsViewer, + UI.PixmapCache.getIcon("symbols.png"), + self.tr("Symbols")) + + if Preferences.getUI("ShowNumbersViewer"): + # Create the numbers viewer + logging.debug("Creating Numbers Viewer...") + from .NumbersWidget import NumbersWidget + self.numbersViewer = NumbersWidget() + self.bottomSidebar.addTab(self.numbersViewer, + UI.PixmapCache.getIcon("numbers.png"), + self.tr("Numbers")) self.bottomSidebar.setCurrentIndex(0) @@ -1087,14 +1113,14 @@ """ assert side in [UserInterface.LeftSide, UserInterface.BottomSide] - if self.layoutType == "Toolboxes": + if self.__layoutType == "Toolboxes": if side == UserInterface.LeftSide: self.lToolbox.addItem(widget, icon, label) elif side == UserInterface.BottomSide: self.hToolbox.addItem(widget, icon, label) elif side == UserInterface.RightSide: self.rToolbox.addItem(widget, icon, label) - elif self.layoutType == "Sidebars": + elif self.__layoutType == "Sidebars": if side == UserInterface.LeftSide: self.leftSidebar.addTab(widget, icon, label) elif side == UserInterface.BottomSide: @@ -1108,12 +1134,12 @@ @param widget reference to the widget to remove (QWidget) """ - if self.layoutType == "Toolboxes": + if self.__layoutType == "Toolboxes": for container in [self.lToolbox, self.hToolbox, self.rToolbox]: index = container.indexOf(widget) if index != -1: container.removeItem(index) - elif self.layoutType == "Sidebars": + elif self.__layoutType == "Sidebars": for container in [self.leftSidebar, self.bottomSidebar, self.rightSidebar]: index = container.indexOf(widget) @@ -1125,11 +1151,11 @@ Public method to show the Log-Viewer. """ if Preferences.getUI("LogViewerAutoRaise"): - if self.layoutType == "Toolboxes": + if self.__layoutType == "Toolboxes": self.hToolboxDock.show() self.hToolbox.setCurrentWidget(self.logViewer) self.hToolboxDock.raise_() - elif self.layoutType == "Sidebars": + elif self.__layoutType == "Sidebars": self.bottomSidebar.show() self.bottomSidebar.setCurrentWidget(self.logViewer) self.bottomSidebar.raise_() @@ -1366,6 +1392,22 @@ self.exitAct.setMenuRole(QAction.QuitRole) self.actions.append(self.exitAct) + self.restartAct = E5Action( + self.tr('Restart'), + UI.PixmapCache.getIcon("restart.png"), + self.tr('Restart'), + QKeySequence(self.tr("Ctrl+Shift+Q", "File|Quit")), + 0, self, 'restart_eric') + self.restartAct.setStatusTip(self.tr('Restart the IDE')) + self.restartAct.setWhatsThis(self.tr( + """<b>Restart the IDE</b>""" + """<p>This restarts the IDE. Any unsaved changes may be saved""" + """ first. Any Python program being debugged will be stopped""" + """ and the preferences will be written to disc.</p>""" + )) + self.restartAct.triggered.connect(self.__restart) + self.actions.append(self.restartAct) + self.saveSessionAct = E5Action( self.tr('Save session'), self.tr('Save session...'), @@ -1513,23 +1555,24 @@ self.shellActivateAct.triggered.connect(self.__activateShell) self.actions.append(self.shellActivateAct) self.addAction(self.shellActivateAct) - - self.browserActivateAct = E5Action( - self.tr('File-Browser'), - self.tr('&File-Browser'), - QKeySequence(self.tr("Alt+Shift+F")), - 0, self, - 'file_browser_activate') - self.browserActivateAct.setStatusTip(self.tr( - "Switch the input focus to the File-Browser window.")) - self.browserActivateAct.setWhatsThis(self.tr( - """<b>Activate File-Browser</b>""" - """<p>This switches the input focus to the File-Browser""" - """ window.</p>""" - )) - self.browserActivateAct.triggered.connect(self.__activateBrowser) - self.actions.append(self.browserActivateAct) - self.addAction(self.browserActivateAct) + + if self.browser is not None: + self.browserActivateAct = E5Action( + self.tr('File-Browser'), + self.tr('&File-Browser'), + QKeySequence(self.tr("Alt+Shift+F")), + 0, self, + 'file_browser_activate') + self.browserActivateAct.setStatusTip(self.tr( + "Switch the input focus to the File-Browser window.")) + self.browserActivateAct.setWhatsThis(self.tr( + """<b>Activate File-Browser</b>""" + """<p>This switches the input focus to the File-Browser""" + """ window.</p>""" + )) + self.browserActivateAct.triggered.connect(self.__activateBrowser) + self.actions.append(self.browserActivateAct) + self.addAction(self.browserActivateAct) self.logViewerActivateAct = E5Action( self.tr('Log-Viewer'), @@ -1566,24 +1609,25 @@ self.__activateTaskViewer) self.actions.append(self.taskViewerActivateAct) self.addAction(self.taskViewerActivateAct) - - self.templateViewerActivateAct = E5Action( - self.tr('Template-Viewer'), - self.tr('Templ&ate-Viewer'), - QKeySequence(self.tr("Alt+Shift+A")), - 0, self, - 'template_viewer_activate') - self.templateViewerActivateAct.setStatusTip(self.tr( - "Switch the input focus to the Template-Viewer window.")) - self.templateViewerActivateAct.setWhatsThis(self.tr( - """<b>Activate Template-Viewer</b>""" - """<p>This switches the input focus to the Template-Viewer""" - """ window.</p>""" - )) - self.templateViewerActivateAct.triggered.connect( - self.__activateTemplateViewer) - self.actions.append(self.templateViewerActivateAct) - self.addAction(self.templateViewerActivateAct) + + if self.templateViewer is not None: + self.templateViewerActivateAct = E5Action( + self.tr('Template-Viewer'), + self.tr('Templ&ate-Viewer'), + QKeySequence(self.tr("Alt+Shift+A")), + 0, self, + 'template_viewer_activate') + self.templateViewerActivateAct.setStatusTip(self.tr( + "Switch the input focus to the Template-Viewer window.")) + self.templateViewerActivateAct.setWhatsThis(self.tr( + """<b>Activate Template-Viewer</b>""" + """<p>This switches the input focus to the Template-Viewer""" + """ window.</p>""" + )) + self.templateViewerActivateAct.triggered.connect( + self.__activateTemplateViewer) + self.actions.append(self.templateViewerActivateAct) + self.addAction(self.templateViewerActivateAct) self.ltAct = E5Action( self.tr('Left Toolbox'), @@ -1665,76 +1709,80 @@ self.bsbAct.triggered.connect(self.__toggleBottomSidebar) self.actions.append(self.bsbAct) - self.cooperationViewerActivateAct = E5Action( - self.tr('Cooperation-Viewer'), - self.tr('Co&operation-Viewer'), - QKeySequence(self.tr("Alt+Shift+O")), - 0, self, - 'cooperation_viewer_activate') - self.cooperationViewerActivateAct.setStatusTip(self.tr( - "Switch the input focus to the Cooperation-Viewer window.")) - self.cooperationViewerActivateAct.setWhatsThis(self.tr( - """<b>Activate Cooperation-Viewer</b>""" - """<p>This switches the input focus to the Cooperation-Viewer""" - """ window.</p>""" - )) - self.cooperationViewerActivateAct.triggered.connect( - self.activateCooperationViewer) - self.actions.append(self.cooperationViewerActivateAct) - self.addAction(self.cooperationViewerActivateAct) - - self.ircActivateAct = E5Action( - self.tr('IRC'), - self.tr('&IRC'), - QKeySequence(self.tr("Meta+Shift+I")), - 0, self, - 'irc_widget_activate') - self.ircActivateAct.setStatusTip(self.tr( - "Switch the input focus to the IRC window.")) - self.ircActivateAct.setWhatsThis(self.tr( - """<b>Activate IRC</b>""" - """<p>This switches the input focus to the IRC window.</p>""" - )) - self.ircActivateAct.triggered.connect( - self.__activateIRC) - self.actions.append(self.ircActivateAct) - self.addAction(self.ircActivateAct) - - self.symbolsViewerActivateAct = E5Action( - self.tr('Symbols-Viewer'), - self.tr('S&ymbols-Viewer'), - QKeySequence(self.tr("Alt+Shift+Y")), - 0, self, - 'symbols_viewer_activate') - self.symbolsViewerActivateAct.setStatusTip(self.tr( - "Switch the input focus to the Symbols-Viewer window.")) - self.symbolsViewerActivateAct.setWhatsThis(self.tr( - """<b>Activate Symbols-Viewer</b>""" - """<p>This switches the input focus to the Symbols-Viewer""" - """ window.</p>""" - )) - self.symbolsViewerActivateAct.triggered.connect( - self.__activateSymbolsViewer) - self.actions.append(self.symbolsViewerActivateAct) - self.addAction(self.symbolsViewerActivateAct) - - self.numbersViewerActivateAct = E5Action( - self.tr('Numbers-Viewer'), - self.tr('Num&bers-Viewer'), - QKeySequence(self.tr("Alt+Shift+B")), - 0, self, - 'numbers_viewer_activate') - self.numbersViewerActivateAct.setStatusTip(self.tr( - "Switch the input focus to the Numbers-Viewer window.")) - self.numbersViewerActivateAct.setWhatsThis(self.tr( - """<b>Activate Numbers-Viewer</b>""" - """<p>This switches the input focus to the Numbers-Viewer""" - """ window.</p>""" - )) - self.numbersViewerActivateAct.triggered.connect( - self.__activateNumbersViewer) - self.actions.append(self.numbersViewerActivateAct) - self.addAction(self.numbersViewerActivateAct) + if self.cooperation is not None: + self.cooperationViewerActivateAct = E5Action( + self.tr('Cooperation-Viewer'), + self.tr('Co&operation-Viewer'), + QKeySequence(self.tr("Alt+Shift+O")), + 0, self, + 'cooperation_viewer_activate') + self.cooperationViewerActivateAct.setStatusTip(self.tr( + "Switch the input focus to the Cooperation-Viewer window.")) + self.cooperationViewerActivateAct.setWhatsThis(self.tr( + """<b>Activate Cooperation-Viewer</b>""" + """<p>This switches the input focus to the""" + """ Cooperation-Viewer window.</p>""" + )) + self.cooperationViewerActivateAct.triggered.connect( + self.activateCooperationViewer) + self.actions.append(self.cooperationViewerActivateAct) + self.addAction(self.cooperationViewerActivateAct) + + if self.irc is not None: + self.ircActivateAct = E5Action( + self.tr('IRC'), + self.tr('&IRC'), + QKeySequence(self.tr("Meta+Shift+I")), + 0, self, + 'irc_widget_activate') + self.ircActivateAct.setStatusTip(self.tr( + "Switch the input focus to the IRC window.")) + self.ircActivateAct.setWhatsThis(self.tr( + """<b>Activate IRC</b>""" + """<p>This switches the input focus to the IRC window.</p>""" + )) + self.ircActivateAct.triggered.connect( + self.__activateIRC) + self.actions.append(self.ircActivateAct) + self.addAction(self.ircActivateAct) + + if self.symbolsViewer is not None: + self.symbolsViewerActivateAct = E5Action( + self.tr('Symbols-Viewer'), + self.tr('S&ymbols-Viewer'), + QKeySequence(self.tr("Alt+Shift+Y")), + 0, self, + 'symbols_viewer_activate') + self.symbolsViewerActivateAct.setStatusTip(self.tr( + "Switch the input focus to the Symbols-Viewer window.")) + self.symbolsViewerActivateAct.setWhatsThis(self.tr( + """<b>Activate Symbols-Viewer</b>""" + """<p>This switches the input focus to the Symbols-Viewer""" + """ window.</p>""" + )) + self.symbolsViewerActivateAct.triggered.connect( + self.__activateSymbolsViewer) + self.actions.append(self.symbolsViewerActivateAct) + self.addAction(self.symbolsViewerActivateAct) + + if self.numbersViewer is not None: + self.numbersViewerActivateAct = E5Action( + self.tr('Numbers-Viewer'), + self.tr('Num&bers-Viewer'), + QKeySequence(self.tr("Alt+Shift+B")), + 0, self, + 'numbers_viewer_activate') + self.numbersViewerActivateAct.setStatusTip(self.tr( + "Switch the input focus to the Numbers-Viewer window.")) + self.numbersViewerActivateAct.setWhatsThis(self.tr( + """<b>Activate Numbers-Viewer</b>""" + """<p>This switches the input focus to the Numbers-Viewer""" + """ window.</p>""" + )) + self.numbersViewerActivateAct.triggered.connect( + self.__activateNumbersViewer) + self.actions.append(self.numbersViewerActivateAct) + self.addAction(self.numbersViewerActivateAct) self.whatsThisAct = E5Action( self.tr('What\'s This?'), @@ -2664,6 +2712,7 @@ self.__menus["file"].addAction(self.saveSessionAct) self.__menus["file"].addAction(self.loadSessionAct) self.__menus["file"].addSeparator() + self.__menus["file"].addAction(self.restartAct) self.__menus["file"].addAction(self.exitAct) act = self.__menus["file"].actions()[0] sep = self.__menus["file"].insertSeparator(act) @@ -2756,20 +2805,51 @@ self.__menus["window"]) self.__menus["subwindow"].setTearOffEnabled(True) # left side + try: + self.__menus["subwindow"].addSection(self.tr("Left Side")) + except AttributeError: + # Qt4 + pass self.__menus["subwindow"].addAction(self.pbActivateAct) self.__menus["subwindow"].addAction(self.mpbActivateAct) - self.__menus["subwindow"].addAction(self.templateViewerActivateAct) - self.__menus["subwindow"].addAction(self.browserActivateAct) - self.__menus["subwindow"].addAction(self.symbolsViewerActivateAct) + if self.templateViewer is not None: + self.__menus["subwindow"].addAction(self.templateViewerActivateAct) + if self.browser is not None: + self.__menus["subwindow"].addAction(self.browserActivateAct) + if self.symbolsViewer is not None: + self.__menus["subwindow"].addAction(self.symbolsViewerActivateAct) # bottom side + try: + self.__menus["subwindow"].addSection(self.tr("Bottom Side")) + except AttributeError: + # Qt4 + self.__menus["subwindow"].addSeparator() self.__menus["subwindow"].addAction(self.shellActivateAct) self.__menus["subwindow"].addAction(self.taskViewerActivateAct) self.__menus["subwindow"].addAction(self.logViewerActivateAct) - self.__menus["subwindow"].addAction(self.numbersViewerActivateAct) + if self.numbersViewer is not None: + self.__menus["subwindow"].addAction(self.numbersViewerActivateAct) + try: + self.__menus["subwindow"].addSection(self.tr("Right Side")) + except AttributeError: + # Qt4 + self.__menus["subwindow"].addSeparator() # right side + if self.codeDocumentationViewer is not None: + self.__menus["subwindow"].addAction( + self.tr("Code Documentation Viewer"), + self.activateCodeDocumentationViewer) self.__menus["subwindow"].addAction(self.debugViewerActivateAct) - self.__menus["subwindow"].addAction(self.cooperationViewerActivateAct) - self.__menus["subwindow"].addAction(self.ircActivateAct) + if self.cooperation is not None: + self.__menus["subwindow"].addAction( + self.cooperationViewerActivateAct) + if self.irc is not None: + self.__menus["subwindow"].addAction(self.ircActivateAct) + try: + self.__menus["subwindow"].addSection(self.tr("Plug-ins")) + except AttributeError: + # Qt4 + self.__menus["subwindow"].addSeparator() self.__menus["toolbars"] = \ QMenu(self.tr("&Toolbars"), self.__menus["window"]) @@ -2880,6 +2960,7 @@ pluginstb.setToolTip(self.tr("Plugins")) filetb.addSeparator() + filetb.addAction(self.restartAct) filetb.addAction(self.exitAct) act = filetb.actions()[0] sep = filetb.insertSeparator(act) @@ -3582,17 +3663,24 @@ """ if self.__shutdown(): e5App().closeAllWindows() - - def __restart(self): + + @pyqtSlot() + def __restart(self, ask=False): """ Private method to restart the application. - """ - res = E5MessageBox.yesNo( - self, - self.tr("Restart application"), - self.tr( - """The application needs to be restarted. Do it now?"""), - yesDefault=True) + + @param ask flag indicating to ask the user for permission + @type bool + """ + if ask: + res = E5MessageBox.yesNo( + self, + self.tr("Restart application"), + self.tr( + """The application needs to be restarted. Do it now?"""), + yesDefault=True) + else: + res = True if res and self.__shutdown(): e5App().closeAllWindows() @@ -3737,14 +3825,14 @@ self.__menus["window"].addActions(self.viewProfileActGrp.actions()) self.__menus["window"].addSeparator() - if self.layoutType == "Toolboxes": + if self.__layoutType == "Toolboxes": self.__menus["window"].addAction(self.ltAct) self.ltAct.setChecked(not self.lToolboxDock.isHidden()) self.__menus["window"].addAction(self.rtAct) self.rtAct.setChecked(not self.lToolboxDock.isHidden()) self.__menus["window"].addAction(self.htAct) self.htAct.setChecked(not self.hToolboxDock.isHidden()) - elif self.layoutType == "Sidebars": + elif self.__layoutType == "Sidebars": self.__menus["window"].addAction(self.lsbAct) self.lsbAct.setChecked(not self.leftSidebar.isHidden()) self.__menus["window"].addAction(self.rsbAct) @@ -3869,10 +3957,10 @@ """ if self.currentProfile and save: # step 1: save the window geometries of the active profile - if self.layoutType in ["Toolboxes", "Sidebars"]: + if self.__layoutType in ["Toolboxes", "Sidebars"]: state = self.saveState() self.profiles[self.currentProfile][0] = state - if self.layoutType == "Sidebars": + if self.__layoutType == "Sidebars": state = self.leftSplitter.saveState() self.profiles[self.currentProfile][2][0] = state state = self.verticalSplitter.saveState() @@ -3886,14 +3974,14 @@ state = self.rightSidebar.saveState() self.profiles[self.currentProfile][2][5] = state # step 2: save the visibility of the windows of the active profile - if self.layoutType == "Toolboxes": + if self.__layoutType == "Toolboxes": self.profiles[self.currentProfile][1][0] = \ self.lToolboxDock.isVisible() self.profiles[self.currentProfile][1][1] = \ self.hToolboxDock.isVisible() self.profiles[self.currentProfile][1][2] = \ self.rToolboxDock.isVisible() - elif self.layoutType == "Sidebars": + elif self.__layoutType == "Sidebars": self.profiles[self.currentProfile][1][0] = \ self.leftSidebar.isVisible() self.profiles[self.currentProfile][1][1] = \ @@ -3915,11 +4003,11 @@ self.__saveCurrentViewProfile(save) # step 2: set the window geometries of the new profile - if self.layoutType in ["Toolboxes", "Sidebars"]: + if self.__layoutType in ["Toolboxes", "Sidebars"]: state = self.profiles[name][0] if not state.isEmpty(): self.restoreState(state) - if self.layoutType == "Sidebars": + if self.__layoutType == "Sidebars": state = self.profiles[name][2][0] if not state.isEmpty(): self.leftSplitter.restoreState(state) @@ -3941,11 +4029,11 @@ self.__configureDockareaCornerUsage() # step 3: activate the windows of the new profile - if self.layoutType == "Toolboxes": + if self.__layoutType == "Toolboxes": self.lToolboxDock.setVisible(self.profiles[name][1][0]) self.hToolboxDock.setVisible(self.profiles[name][1][1]) self.rToolboxDock.setVisible(self.profiles[name][1][2]) - elif self.layoutType == "Sidebars": + elif self.__layoutType == "Sidebars": self.leftSidebar.setVisible(self.profiles[name][1][0]) self.bottomSidebar.setVisible(self.profiles[name][1][1]) self.rightSidebar.setVisible(self.profiles[name][1][2]) @@ -3968,30 +4056,28 @@ Private slot to handle the start of a debugging session. """ self.setDebugProfile() - if self.layoutType == "Toolboxes": + if self.__layoutType == "Toolboxes": self.__currentRightWidget = self.rToolbox.currentWidget() self.rToolbox.setCurrentWidget(self.debugViewer) - if not self.embeddedShell: - self.__currentBottomWidget = self.hToolbox.currentWidget() - self.hToolbox.setCurrentWidget(self.shellAssembly) - elif self.layoutType == "Sidebars": + self.__currentBottomWidget = self.hToolbox.currentWidget() + self.hToolbox.setCurrentWidget(self.shellAssembly) + elif self.__layoutType == "Sidebars": self.__currentRightWidget = self.rightSidebar.currentWidget() self.rightSidebar.setCurrentWidget(self.debugViewer) - if not self.embeddedShell: - self.__currentBottomWidget = self.bottomSidebar.currentWidget() - self.bottomSidebar.setCurrentWidget(self.shellAssembly) + self.__currentBottomWidget = self.bottomSidebar.currentWidget() + self.bottomSidebar.setCurrentWidget(self.shellAssembly) def __debuggingDone(self): """ Private slot to handle the end of a debugging session. """ self.__setEditProfile() - if self.layoutType == "Toolboxes": + if self.__layoutType == "Toolboxes": if self.__currentRightWidget: self.rToolbox.setCurrentWidget(self.__currentRightWidget) if self.__currentBottomWidget: self.hToolbox.setCurrentWidget(self.__currentBottomWidget) - elif self.layoutType == "Sidebars": + elif self.__layoutType == "Sidebars": if self.__currentRightWidget: self.rightSidebar.setCurrentWidget(self.__currentRightWidget) if self.__currentBottomWidget: @@ -4031,15 +4117,24 @@ @return the name of the current view profile (string) """ return self.currentProfile - + + def getLayoutType(self): + """ + Public method to get the current layout type. + + @return current layout type + @rtype str + """ + return self.__layoutType + def __activateProjectBrowser(self): """ Private slot to handle the activation of the project browser. """ - if self.layoutType == "Toolboxes": + if self.__layoutType == "Toolboxes": self.lToolboxDock.show() self.lToolbox.setCurrentWidget(self.projectBrowser) - elif self.layoutType == "Sidebars": + elif self.__layoutType == "Sidebars": self.leftSidebar.show() self.leftSidebar.setCurrentWidget(self.projectBrowser) else: @@ -4051,10 +4146,10 @@ """ Private slot to handle the activation of the project browser. """ - if self.layoutType == "Toolboxes": + if self.__layoutType == "Toolboxes": self.lToolboxDock.show() self.lToolbox.setCurrentWidget(self.multiProjectBrowser) - elif self.layoutType == "Sidebars": + elif self.__layoutType == "Sidebars": self.leftSidebar.show() self.leftSidebar.setCurrentWidget(self.multiProjectBrowser) else: @@ -4065,10 +4160,10 @@ """ Public slot to handle the activation of the debug viewer. """ - if self.layoutType == "Toolboxes": + if self.__layoutType == "Toolboxes": self.rToolboxDock.show() self.rToolbox.setCurrentWidget(self.debugViewer) - elif self.layoutType == "Sidebars": + elif self.__layoutType == "Sidebars": self.rightSidebar.show() self.rightSidebar.setCurrentWidget(self.debugViewer) else: @@ -4079,35 +4174,24 @@ """ Private slot to handle the activation of the Shell window. """ - if self.embeddedShell: # embedded in debug browser - if self.layoutType == "Toolboxes": - self.rToolboxDock.show() - self.rToolbox.setCurrentWidget(self.debugViewer) - elif self.layoutType == "Sidebars": - self.rightSidebar.show() - self.rightSidebar.setCurrentWidget(self.debugViewer) - else: - self.debugViewer.show() - self.debugViewer.setCurrentWidget(self.debugViewer.shellAssembly) - else: # separate window - if self.layoutType == "Toolboxes": - self.hToolboxDock.show() - self.hToolbox.setCurrentWidget(self.shellAssembly) - elif self.layoutType == "Sidebars": - self.bottomSidebar.show() - self.bottomSidebar.setCurrentWidget(self.shellAssembly) - else: - self.shell.show() + if self.__layoutType == "Toolboxes": + self.hToolboxDock.show() + self.hToolbox.setCurrentWidget(self.shellAssembly) + elif self.__layoutType == "Sidebars": + self.bottomSidebar.show() + self.bottomSidebar.setCurrentWidget(self.shellAssembly) + else: + self.shell.show() self.shell.setFocus(Qt.ActiveWindowFocusReason) def __activateLogViewer(self): """ Private slot to handle the activation of the Log Viewer. """ - if self.layoutType == "Toolboxes": + if self.__layoutType == "Toolboxes": self.hToolboxDock.show() self.hToolbox.setCurrentWidget(self.logViewer) - elif self.layoutType == "Sidebars": + elif self.__layoutType == "Sidebars": self.bottomSidebar.show() self.bottomSidebar.setCurrentWidget(self.logViewer) else: @@ -4118,10 +4202,10 @@ """ Private slot to handle the activation of the Task Viewer. """ - if self.layoutType == "Toolboxes": + if self.__layoutType == "Toolboxes": self.hToolboxDock.show() self.hToolbox.setCurrentWidget(self.taskViewer) - elif self.layoutType == "Sidebars": + elif self.__layoutType == "Sidebars": self.bottomSidebar.show() self.bottomSidebar.setCurrentWidget(self.taskViewer) else: @@ -4132,50 +4216,31 @@ """ Private slot to handle the activation of the Template Viewer. """ - if self.layoutType == "Toolboxes": - self.lToolboxDock.show() - self.lToolbox.setCurrentWidget(self.templateViewer) - elif self.layoutType == "Sidebars": - self.leftSidebar.show() - self.leftSidebar.setCurrentWidget(self.templateViewer) - else: - self.templateViewer.show() - self.templateViewer.setFocus(Qt.ActiveWindowFocusReason) + if self.templateViewer is not None: + if self.__layoutType == "Toolboxes": + self.lToolboxDock.show() + self.lToolbox.setCurrentWidget(self.templateViewer) + elif self.__layoutType == "Sidebars": + self.leftSidebar.show() + self.leftSidebar.setCurrentWidget(self.templateViewer) + else: + self.templateViewer.show() + self.templateViewer.setFocus(Qt.ActiveWindowFocusReason) def __activateBrowser(self): """ Private slot to handle the activation of the file browser. """ - if self.embeddedFileBrowser == 0: # separate window - if self.layoutType == "Toolboxes": + if self.browser is not None: + if self.__layoutType == "Toolboxes": self.lToolboxDock.show() self.lToolbox.setCurrentWidget(self.browser) - elif self.layoutType == "Sidebars": + elif self.__layoutType == "Sidebars": self.leftSidebar.show() self.leftSidebar.setCurrentWidget(self.browser) else: self.browser.show() - elif self.embeddedFileBrowser == 1: # embedded in debug browser - if self.layoutType == "Toolboxes": - self.rToolboxDock.show() - self.rToolbox.setCurrentWidget(self.debugViewer) - elif self.layoutType == "Sidebars": - self.rightSidebar.show() - self.rightSidebar.setCurrentWidget(self.debugViewer) - else: - self.debugViewer.show() - self.debugViewer.setCurrentWidget(self.browser) - else: # embedded in project browser - if self.layoutType == "Toolboxes": - self.lToolboxDock.show() - self.lToolbox.setCurrentWidget(self.projectBrowser) - elif self.layoutType == "Sidebars": - self.leftSidebar.show() - self.leftSidebar.setCurrentWidget(self.projectBrowser) - else: - self.projectBrowser.show() - self.projectBrowser.setCurrentWidget(self.browser) - self.browser.setFocus(Qt.ActiveWindowFocusReason) + self.browser.setFocus(Qt.ActiveWindowFocusReason) def __toggleLeftToolbox(self): """ @@ -4256,57 +4321,61 @@ """ Public slot to handle the activation of the cooperation window. """ - if self.layoutType == "Toolboxes": - self.rToolboxDock.show() - self.rToolbox.setCurrentWidget(self.cooperation) - elif self.layoutType == "Sidebars": - self.rightSidebar.show() - self.rightSidebar.setCurrentWidget(self.cooperation) - else: - self.cooperation.show() - self.cooperation.setFocus(Qt.ActiveWindowFocusReason) + if self.cooperation is not None: + if self.__layoutType == "Toolboxes": + self.rToolboxDock.show() + self.rToolbox.setCurrentWidget(self.cooperation) + elif self.__layoutType == "Sidebars": + self.rightSidebar.show() + self.rightSidebar.setCurrentWidget(self.cooperation) + else: + self.cooperation.show() + self.cooperation.setFocus(Qt.ActiveWindowFocusReason) def __activateIRC(self): """ Private slot to handle the activation of the IRC window. """ - if self.layoutType == "Toolboxes": - self.rToolboxDock.show() - self.rToolbox.setCurrentWidget(self.irc) - elif self.layoutType == "Sidebars": - self.rightSidebar.show() - self.rightSidebar.setCurrentWidget(self.irc) - else: - self.irc.show() - self.irc.setFocus(Qt.ActiveWindowFocusReason) + if self.irc is not None: + if self.__layoutType == "Toolboxes": + self.rToolboxDock.show() + self.rToolbox.setCurrentWidget(self.irc) + elif self.__layoutType == "Sidebars": + self.rightSidebar.show() + self.rightSidebar.setCurrentWidget(self.irc) + else: + self.irc.show() + self.irc.setFocus(Qt.ActiveWindowFocusReason) def __activateSymbolsViewer(self): """ Private slot to handle the activation of the Symbols Viewer. """ - if self.layoutType == "Toolboxes": - self.lToolboxDock.show() - self.lToolbox.setCurrentWidget(self.symbolsViewer) - elif self.layoutType == "Sidebars": - self.leftSidebar.show() - self.leftSidebar.setCurrentWidget(self.symbolsViewer) - else: - self.symbolsViewer.show() - self.symbolsViewer.setFocus(Qt.ActiveWindowFocusReason) + if self.symbolsViewer is not None: + if self.__layoutType == "Toolboxes": + self.lToolboxDock.show() + self.lToolbox.setCurrentWidget(self.symbolsViewer) + elif self.__layoutType == "Sidebars": + self.leftSidebar.show() + self.leftSidebar.setCurrentWidget(self.symbolsViewer) + else: + self.symbolsViewer.show() + self.symbolsViewer.setFocus(Qt.ActiveWindowFocusReason) def __activateNumbersViewer(self): """ Private slot to handle the activation of the Numbers Viewer. """ - if self.layoutType == "Toolboxes": - self.hToolboxDock.show() - self.hToolboxDock.setCurrentWidget(self.numbersViewer) - elif self.layoutType == "Sidebars": - self.bottomSidebar.show() - self.bottomSidebar.setCurrentWidget(self.numbersViewer) - else: - self.numbersViewer.show() - self.numbersViewer.setFocus(Qt.ActiveWindowFocusReason) + if self.numbersViewer is not None: + if self.__layoutType == "Toolboxes": + self.hToolboxDock.show() + self.hToolbox.setCurrentWidget(self.numbersViewer) + elif self.__layoutType == "Sidebars": + self.bottomSidebar.show() + self.bottomSidebar.setCurrentWidget(self.numbersViewer) + else: + self.numbersViewer.show() + self.numbersViewer.setFocus(Qt.ActiveWindowFocusReason) def __activateViewmanager(self): """ @@ -4323,16 +4392,19 @@ @param switchFocus flag indicating to transfer the input focus @type bool """ - if self.layoutType == "Toolboxes": - self.rToolboxDock.show() - self.rToolbox.setCurrentWidget(self.codeDocumentationViewer) - elif self.layoutType == "Sidebars": - self.rightSidebar.show() - self.rightSidebar.setCurrentWidget(self.codeDocumentationViewer) - else: - self.codeDocumentationViewer.show() - if switchFocus: - self.codeDocumentationViewer.setFocus(Qt.ActiveWindowFocusReason) + if self.codeDocumentationViewer is not None: + if self.__layoutType == "Toolboxes": + self.rToolboxDock.show() + self.rToolbox.setCurrentWidget(self.codeDocumentationViewer) + elif self.__layoutType == "Sidebars": + self.rightSidebar.show() + self.rightSidebar.setCurrentWidget( + self.codeDocumentationViewer) + else: + self.codeDocumentationViewer.show() + if switchFocus: + self.codeDocumentationViewer.setFocus( + Qt.ActiveWindowFocusReason) def __toggleWindow(self, w): """ @@ -5735,7 +5807,7 @@ SpellChecker.setDefaultLanguage( Preferences.getEditor("SpellCheckingDefaultLanguage")) - if self.layoutType == "Sidebars": + if self.__layoutType == "Sidebars": delay = Preferences.getUI("SidebarDelay") self.leftSidebar.setDelay(delay) self.bottomSidebar.setDelay(delay) @@ -5799,7 +5871,7 @@ Private slot to configure the various view profiles. """ from Preferences.ViewProfileDialog import ViewProfileDialog - dlg = ViewProfileDialog(self.layoutType, self.profiles['edit'][1], + dlg = ViewProfileDialog(self.__layoutType, self.profiles['edit'][1], self.profiles['debug'][1]) if dlg.exec_() == QDialog.Accepted: edit, debug = dlg.getVisibilities() @@ -6338,7 +6410,7 @@ self) dlg.exec_() if dlg.restartNeeded(): - self.__restart() + self.__restart(ask=True) def __deinstallPlugin(self): """ @@ -6458,8 +6530,9 @@ if not self.helpWindow.shutdown(): return False - if not self.irc.shutdown(): - return False + if self.irc is not None: + if not self.irc.shutdown(): + return False sessionCreated = self.__writeSession() @@ -6475,14 +6548,17 @@ if sessionCreated and not self.__disableCrashSession: self.__deleteCrashSession() - self.codeDocumentationViewer.shutdown() + if self.codeDocumentationViewer is not None: + self.codeDocumentationViewer.shutdown() self.__previewer.shutdown() self.shell.closeShell() self.__writeTasks() - self.templateViewer.save() + + if self.templateViewer is not None: + self.templateViewer.save() if not self.debuggerUI.shutdownServer(): return False @@ -6490,13 +6566,14 @@ self.backgroundService.shutdown() - self.cooperation.shutdown() + if self.cooperation is not None: + self.cooperation.shutdown() self.pluginManager.doShutdown() self.virtualenvManager.shutdown() - if self.layoutType == "Sidebars": + if self.__layoutType == "Sidebars": self.leftSidebar.shutdown() self.bottomSidebar.shutdown() self.rightSidebar.shutdown() @@ -6508,7 +6585,9 @@ Preferences.setGeometry("MainMaximized", self.isMaximized()) if not self.isMaximized(): Preferences.setGeometry("MainGeometry", self.saveGeometry()) - self.browser.saveToplevelDirs() + + if self.browser is not None: + self.browser.saveToplevelDirs() Preferences.setUI( "ToolbarManagerState", self.toolbarManager.saveState()) @@ -7008,7 +7087,8 @@ """ Public method to initiate the IRC auto connection. """ - self.irc.autoConnect() + if self.irc is not None: + self.irc.autoConnect() def __ircAutoConnected(self): """
--- a/ViewManager/ViewManager.py Sat Jul 07 12:01:23 2018 +0200 +++ b/ViewManager/ViewManager.py Wed Aug 01 19:43:34 2018 +0200 @@ -6962,7 +6962,9 @@ @param editor editor to show information text for @type Editor """ - self.ui.documentationViewer().showInfo(editor) + documentationViewer = self.ui.documentationViewer() + if documentationViewer: + documentationViewer.showInfo(editor) def isEditorInfoSupported(self, language): """ @@ -6974,7 +6976,11 @@ @return flag indicating the support status @rtype bool """ - return self.ui.documentationViewer().isSupportedLanguage(language) + documentationViewer = self.ui.documentationViewer() + if documentationViewer: + return documentationViewer.isSupportedLanguage(language) + else: + return False def __isEditorInfoSupportedEd(self, editor): """
--- a/WebBrowser/CookieJar/CookieJar.py Sat Jul 07 12:01:23 2018 +0200 +++ b/WebBrowser/CookieJar/CookieJar.py Wed Aug 01 19:43:34 2018 +0200 @@ -59,6 +59,11 @@ "web_browser", "cookies.ini") self.__store = WebBrowserWindow.webProfile().cookieStore() + try: + self.__store.setCookieFilter(self.__cookieFilter) + except AttributeError: + # pre Qt 5.11 + pass self.__store.cookieAdded.connect(self.__cookieAdded) self.__store.cookieRemoved.connect(self.__cookieRemoved) @@ -187,6 +192,38 @@ if self.deleteCookie(cookie): self.cookiesChanged.emit() + def __cookieFilter(self, request): + """ + Private method to filter cookies. + + Note: This method is used for Qt 5.11+ only. + + @param request reference to the cookie filter request object + @type QWebEngineCookieStore.FilterRequest + @return flag indicating cookie access is allowed + @rtype bool + """ + if not self.__loaded: + self.__load() + + if self.__acceptCookies == self.AcceptNever: + res = self.__isOnDomainList(self.__exceptionsAllow, + request.origin.host()) + if not res: + return False + + if self.__acceptCookies == self.AcceptAlways: + res = self.__isOnDomainList(self.__exceptionsBlock, + request.origin.host()) + if res: + return False + + if self.__acceptCookies == self.AcceptOnlyFromSitesNavigatedTo and \ + request.thirdParty: + return False + + return True + def __rejectCookie(self, cookie, cookieDomain): """ Private method to test, if a cookie shall be rejected.
--- a/WebBrowser/OpenSearch/DefaultSearchEngines/DefaultSearchEngines.qrc Sat Jul 07 12:01:23 2018 +0200 +++ b/WebBrowser/OpenSearch/DefaultSearchEngines/DefaultSearchEngines.qrc Wed Aug 01 19:43:34 2018 +0200 @@ -11,7 +11,9 @@ <file>LEO_DeuEng.xml</file> <file>LinuxMagazin.xml</file> <file>PyPI.xml</file> + <file>Qwant.xml</file> <file>Reddit.xml</file> + <file>StartPage.xml</file> <file>Wikia.xml</file> <file>Wikia_en.xml</file> <file>Wikipedia.xml</file>
--- a/WebBrowser/OpenSearch/DefaultSearchEngines/DefaultSearchEngines_rc.py Sat Jul 07 12:01:23 2018 +0200 +++ b/WebBrowser/OpenSearch/DefaultSearchEngines/DefaultSearchEngines_rc.py Wed Aug 01 19:43:34 2018 +0200 @@ -2,40 +2,14 @@ # Resource object code # -# Created by: The Resource Compiler for PyQt5 (Qt v5.10.0) +# Created by: The Resource Compiler for PyQt5 (Qt v5.11.1) # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore qt_resource_data = b"\ -\x00\x00\x01\x79\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\ -\x2d\x38\x22\x3f\x3e\x0a\x3c\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\ -\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x20\x78\x6d\x6c\ -\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x61\x39\x2e\x63\x6f\ -\x6d\x2f\x2d\x2f\x73\x70\x65\x63\x2f\x6f\x70\x65\x6e\x73\x65\x61\ -\x72\x63\x68\x2f\x31\x2e\x31\x2f\x22\x3e\x0a\x20\x20\x20\x20\x3c\ -\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x42\x69\x6e\x67\x3c\x2f\ -\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x0a\x20\x20\x20\x20\x3c\ -\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x42\x69\x6e\x67\ -\x20\x57\x65\x62\x20\x53\x65\x61\x72\x63\x68\x3c\x2f\x44\x65\x73\ -\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\x20\x20\x20\x20\x3c\x55\ -\x72\x6c\x20\x6d\x65\x74\x68\x6f\x64\x3d\x22\x67\x65\x74\x22\x20\ -\x74\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x68\x74\x6d\x6c\x22\ -\x20\x74\x65\x6d\x70\x6c\x61\x74\x65\x3d\x22\x68\x74\x74\x70\x3a\ -\x2f\x2f\x77\x77\x77\x2e\x62\x69\x6e\x67\x2e\x63\x6f\x6d\x2f\x73\ -\x65\x61\x72\x63\x68\x3f\x63\x63\x3d\x7b\x6c\x61\x6e\x67\x75\x61\ -\x67\x65\x7d\x26\x61\x6d\x70\x3b\x71\x3d\x7b\x73\x65\x61\x72\x63\ -\x68\x54\x65\x72\x6d\x73\x7d\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\ -\x49\x6d\x61\x67\x65\x3e\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\ -\x2e\x62\x69\x6e\x67\x2e\x63\x6f\x6d\x2f\x73\x2f\x77\x6c\x66\x6c\ -\x61\x67\x2e\x69\x63\x6f\x3c\x2f\x49\x6d\x61\x67\x65\x3e\x0a\x3c\ -\x2f\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\x68\x44\x65\x73\x63\x72\ -\x69\x70\x74\x69\x6f\x6e\x3e\x0a\ -\x00\x00\x02\x46\ +\x00\x00\x02\x8d\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\ @@ -44,62 +18,40 @@ \x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x61\x39\x2e\x63\x6f\ \x6d\x2f\x2d\x2f\x73\x70\x65\x63\x2f\x6f\x70\x65\x6e\x73\x65\x61\ \x72\x63\x68\x2f\x31\x2e\x31\x2f\x22\x3e\x0a\x20\x20\x20\x20\x3c\ -\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x47\x6f\x6f\x67\x6c\x65\ -\x3c\x2f\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x0a\x20\x20\x20\ -\x20\x3c\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x47\x6f\ -\x6f\x67\x6c\x65\x20\x57\x65\x62\x20\x53\x65\x61\x72\x63\x68\x3c\ -\x2f\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\x20\x20\ -\x20\x20\x3c\x55\x72\x6c\x20\x6d\x65\x74\x68\x6f\x64\x3d\x22\x67\ -\x65\x74\x22\x20\x74\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x68\ -\x74\x6d\x6c\x22\x20\x74\x65\x6d\x70\x6c\x61\x74\x65\x3d\x22\x68\ -\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x67\x6f\x6f\x67\x6c\x65\ -\x2e\x63\x6f\x6d\x2f\x73\x65\x61\x72\x63\x68\x3f\x68\x6c\x3d\x7b\ -\x6c\x61\x6e\x67\x75\x61\x67\x65\x7d\x26\x61\x6d\x70\x3b\x6c\x72\ -\x3d\x6c\x61\x6e\x67\x5f\x7b\x6c\x61\x6e\x67\x75\x61\x67\x65\x7d\ -\x26\x61\x6d\x70\x3b\x71\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\ -\x72\x6d\x73\x7d\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x55\x72\x6c\ -\x20\x6d\x65\x74\x68\x6f\x64\x3d\x22\x67\x65\x74\x22\x20\x74\x79\ -\x70\x65\x3d\x22\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\ -\x78\x2d\x73\x75\x67\x67\x65\x73\x74\x69\x6f\x6e\x73\x2b\x6a\x73\ -\x6f\x6e\x22\x20\x74\x65\x6d\x70\x6c\x61\x74\x65\x3d\x22\x68\x74\ -\x74\x70\x3a\x2f\x2f\x73\x75\x67\x67\x65\x73\x74\x71\x75\x65\x72\ -\x69\x65\x73\x2e\x67\x6f\x6f\x67\x6c\x65\x2e\x63\x6f\x6d\x2f\x63\ -\x6f\x6d\x70\x6c\x65\x74\x65\x2f\x73\x65\x61\x72\x63\x68\x3f\x6f\ -\x75\x74\x70\x75\x74\x3d\x66\x69\x72\x65\x66\x6f\x78\x26\x61\x6d\ -\x70\x3b\x68\x6c\x3d\x7b\x6c\x61\x6e\x67\x75\x61\x67\x65\x7d\x26\ -\x61\x6d\x70\x3b\x71\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\x72\ -\x6d\x73\x7d\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x49\x6d\x61\x67\ -\x65\x3e\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x67\x6f\x6f\ -\x67\x6c\x65\x2e\x63\x6f\x6d\x2f\x66\x61\x76\x69\x63\x6f\x6e\x2e\ -\x69\x63\x6f\x3c\x2f\x49\x6d\x61\x67\x65\x3e\x0a\x3c\x2f\x4f\x70\ -\x65\x6e\x53\x65\x61\x72\x63\x68\x44\x65\x73\x63\x72\x69\x70\x74\ -\x69\x6f\x6e\x3e\x0a\ -\x00\x00\x01\x74\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\ -\x2d\x38\x22\x3f\x3e\x0a\x3c\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\ -\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x20\x78\x6d\x6c\ -\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x61\x39\x2e\x63\x6f\ -\x6d\x2f\x2d\x2f\x73\x70\x65\x63\x2f\x6f\x70\x65\x6e\x73\x65\x61\ -\x72\x63\x68\x2f\x31\x2e\x31\x2f\x22\x3e\x0a\x20\x20\x20\x20\x3c\ -\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x50\x79\x50\x49\x3c\x2f\ -\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x0a\x20\x20\x20\x20\x3c\ -\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x53\x65\x61\x72\ -\x63\x68\x20\x50\x79\x50\x49\x3c\x2f\x44\x65\x73\x63\x72\x69\x70\ -\x74\x69\x6f\x6e\x3e\x0a\x20\x20\x20\x20\x3c\x55\x72\x6c\x20\x6d\ -\x65\x74\x68\x6f\x64\x3d\x22\x67\x65\x74\x22\x20\x74\x79\x70\x65\ -\x3d\x22\x74\x65\x78\x74\x2f\x68\x74\x6d\x6c\x22\x20\x74\x65\x6d\ -\x70\x6c\x61\x74\x65\x3d\x22\x68\x74\x74\x70\x73\x3a\x2f\x2f\x70\ -\x79\x70\x69\x2e\x6f\x72\x67\x2f\x73\x65\x61\x72\x63\x68\x2f\x3f\ -\x71\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\x72\x6d\x73\x7d\x22\ -\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x49\x6d\x61\x67\x65\x3e\x68\x74\ -\x74\x70\x73\x3a\x2f\x2f\x70\x79\x70\x69\x2e\x6f\x72\x67\x2f\x73\ -\x74\x61\x74\x69\x63\x2f\x69\x6d\x61\x67\x65\x73\x2f\x66\x61\x76\ -\x69\x63\x6f\x6e\x2e\x36\x61\x37\x36\x32\x37\x35\x64\x2e\x69\x63\ -\x6f\x3c\x2f\x49\x6d\x61\x67\x65\x3e\x0a\x3c\x2f\x4f\x70\x65\x6e\ -\x53\x65\x61\x72\x63\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\ -\x6e\x3e\x0a\ +\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x53\x74\x61\x72\x74\x50\ +\x61\x67\x65\x20\x2d\x20\x45\x6e\x67\x6c\x69\x73\x68\x3c\x2f\x53\ +\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x0a\x20\x20\x20\x20\x3c\x44\ +\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x53\x74\x61\x72\x74\ +\x50\x61\x67\x65\x20\x53\x65\x61\x72\x63\x68\x3c\x2f\x44\x65\x73\ +\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\x20\x20\x20\x20\x3c\x55\ +\x72\x6c\x20\x6d\x65\x74\x68\x6f\x64\x3d\x22\x67\x65\x74\x22\x20\ +\x74\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x68\x74\x6d\x6c\x22\ +\x20\x74\x65\x6d\x70\x6c\x61\x74\x65\x3d\x22\x68\x74\x74\x70\x73\ +\x3a\x2f\x2f\x77\x77\x77\x2e\x73\x74\x61\x72\x74\x70\x61\x67\x65\ +\x2e\x63\x6f\x6d\x2f\x64\x6f\x2f\x64\x73\x65\x61\x72\x63\x68\x3f\ +\x71\x75\x65\x72\x79\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\x72\ +\x6d\x73\x7d\x26\x61\x6d\x70\x3b\x63\x61\x74\x3d\x77\x65\x62\x26\ +\x61\x6d\x70\x3b\x70\x6c\x3d\x6f\x70\x65\x6e\x73\x65\x61\x72\x63\ +\x68\x26\x61\x6d\x70\x3b\x6c\x61\x6e\x67\x75\x61\x67\x65\x3d\x65\ +\x6e\x67\x6c\x69\x73\x68\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x55\ +\x72\x6c\x20\x6d\x65\x74\x68\x6f\x64\x3d\x22\x67\x65\x74\x22\x20\ +\x74\x79\x70\x65\x3d\x22\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\ +\x6e\x2f\x78\x2d\x73\x75\x67\x67\x65\x73\x74\x69\x6f\x6e\x73\x2b\ +\x6a\x73\x6f\x6e\x22\x20\x74\x65\x6d\x70\x6c\x61\x74\x65\x3d\x22\ +\x68\x74\x74\x70\x73\x3a\x2f\x2f\x77\x77\x77\x2e\x73\x74\x61\x72\ +\x74\x70\x61\x67\x65\x2e\x63\x6f\x6d\x2f\x63\x67\x69\x2d\x62\x69\ +\x6e\x2f\x63\x73\x75\x67\x67\x65\x73\x74\x3f\x71\x75\x65\x72\x79\ +\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\x72\x6d\x73\x7d\x26\x61\ +\x6d\x70\x3b\x6c\x69\x6d\x69\x74\x3d\x31\x30\x26\x61\x6d\x70\x3b\ +\x6c\x61\x6e\x67\x3d\x65\x6e\x67\x6c\x69\x73\x68\x26\x61\x6d\x70\ +\x3b\x66\x6f\x72\x6d\x61\x74\x3d\x6a\x73\x6f\x6e\x22\x2f\x3e\x0a\ +\x20\x20\x20\x20\x3c\x49\x6d\x61\x67\x65\x3e\x68\x74\x74\x70\x73\ +\x3a\x2f\x2f\x77\x77\x77\x2e\x73\x74\x61\x72\x74\x70\x61\x67\x65\ +\x2e\x63\x6f\x6d\x2f\x67\x72\x61\x70\x68\x69\x63\x73\x2f\x66\x61\ +\x76\x69\x63\x6f\x6e\x2f\x73\x70\x2d\x66\x61\x76\x69\x63\x6f\x6e\ +\x2d\x31\x36\x78\x31\x36\x2e\x70\x6e\x67\x3c\x2f\x49\x6d\x61\x67\ +\x65\x3e\x0a\x3c\x2f\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\x68\x44\ +\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\ \x00\x00\x01\x9b\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ @@ -128,66 +80,7 @@ \x69\x63\x6f\x6e\x2e\x69\x63\x6f\x3c\x2f\x49\x6d\x61\x67\x65\x3e\ \x0a\x3c\x2f\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\x68\x44\x65\x73\ \x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\ -\x00\x00\x01\xc9\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\ -\x2d\x38\x22\x3f\x3e\x0a\x3c\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\ -\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x20\x78\x6d\x6c\ -\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x61\x39\x2e\x63\x6f\ -\x6d\x2f\x2d\x2f\x73\x70\x65\x63\x2f\x6f\x70\x65\x6e\x73\x65\x61\ -\x72\x63\x68\x2f\x31\x2e\x31\x2f\x22\x3e\x0a\x20\x20\x20\x20\x3c\ -\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x4c\x69\x6e\x75\x78\x2d\ -\x4d\x61\x67\x61\x7a\x69\x6e\x3c\x2f\x53\x68\x6f\x72\x74\x4e\x61\ -\x6d\x65\x3e\x0a\x20\x20\x20\x20\x3c\x44\x65\x73\x63\x72\x69\x70\ -\x74\x69\x6f\x6e\x3e\x53\x75\x63\x68\x65\x20\x61\x75\x66\x20\x77\ -\x77\x77\x2e\x6c\x69\x6e\x75\x78\x2d\x6d\x61\x67\x61\x7a\x69\x6e\ -\x2e\x64\x65\x3c\x2f\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\ -\x3e\x0a\x20\x20\x20\x20\x3c\x55\x72\x6c\x20\x6d\x65\x74\x68\x6f\ -\x64\x3d\x22\x67\x65\x74\x22\x20\x74\x79\x70\x65\x3d\x22\x74\x65\ -\x78\x74\x2f\x68\x74\x6d\x6c\x22\x20\x74\x65\x6d\x70\x6c\x61\x74\ -\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x6c\x69\ -\x6e\x75\x78\x2d\x6d\x61\x67\x61\x7a\x69\x6e\x2e\x64\x65\x2f\x63\ -\x6f\x6e\x74\x65\x6e\x74\x2f\x73\x65\x61\x72\x63\x68\x3f\x53\x65\ -\x61\x72\x63\x68\x54\x65\x78\x74\x3d\x7b\x73\x65\x61\x72\x63\x68\ -\x54\x65\x72\x6d\x73\x7d\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x49\ -\x6d\x61\x67\x65\x3e\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ -\x6c\x69\x6e\x75\x78\x2d\x6d\x61\x67\x61\x7a\x69\x6e\x2e\x64\x65\ -\x2f\x65\x78\x74\x65\x6e\x73\x69\x6f\x6e\x2f\x6c\x6e\x6d\x2f\x64\ -\x65\x73\x69\x67\x6e\x2f\x6c\x69\x6e\x75\x78\x5f\x6d\x61\x67\x61\ -\x7a\x69\x6e\x2f\x69\x6d\x61\x67\x65\x73\x2f\x66\x61\x76\x69\x63\ -\x6f\x6e\x2e\x69\x63\x6f\x3c\x2f\x49\x6d\x61\x67\x65\x3e\x0a\x3c\ -\x2f\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\x68\x44\x65\x73\x63\x72\ -\x69\x70\x74\x69\x6f\x6e\x3e\x0a\ -\x00\x00\x01\x95\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\ -\x2d\x38\x22\x3f\x3e\x0a\x3c\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\ -\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x20\x78\x6d\x6c\ -\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x61\x39\x2e\x63\x6f\ -\x6d\x2f\x2d\x2f\x73\x70\x65\x63\x2f\x6f\x70\x65\x6e\x73\x65\x61\ -\x72\x63\x68\x2f\x31\x2e\x31\x2f\x22\x3e\x0a\x20\x20\x20\x20\x3c\ -\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x41\x6d\x61\x7a\x6f\x6e\ -\x2e\x63\x6f\x6d\x3c\x2f\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\ -\x0a\x20\x20\x20\x20\x3c\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\ -\x6e\x3e\x41\x6d\x61\x7a\x6f\x6e\x2e\x63\x6f\x6d\x20\x53\x65\x61\ -\x72\x63\x68\x3c\x2f\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\ -\x3e\x0a\x20\x20\x20\x20\x3c\x55\x72\x6c\x20\x6d\x65\x74\x68\x6f\ -\x64\x3d\x22\x67\x65\x74\x22\x20\x74\x79\x70\x65\x3d\x22\x74\x65\ -\x78\x74\x2f\x68\x74\x6d\x6c\x22\x20\x74\x65\x6d\x70\x6c\x61\x74\ -\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x61\x6d\ -\x61\x7a\x6f\x6e\x2e\x63\x6f\x6d\x2f\x65\x78\x65\x63\x2f\x6f\x62\ -\x69\x64\x6f\x73\x2f\x65\x78\x74\x65\x72\x6e\x61\x6c\x2d\x73\x65\ -\x61\x72\x63\x68\x2f\x3f\x66\x69\x65\x6c\x64\x2d\x6b\x65\x79\x77\ -\x6f\x72\x64\x73\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\x72\x6d\ -\x73\x7d\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x49\x6d\x61\x67\x65\ -\x3e\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x61\x6d\x61\x7a\ -\x6f\x6e\x2e\x63\x6f\x6d\x2f\x66\x61\x76\x69\x63\x6f\x6e\x2e\x69\ -\x63\x6f\x3c\x2f\x49\x6d\x61\x67\x65\x3e\x0a\x3c\x2f\x4f\x70\x65\ -\x6e\x53\x65\x61\x72\x63\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\ -\x6f\x6e\x3e\x0a\ -\x00\x00\x02\x7a\ +\x00\x00\x02\x64\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\ @@ -196,40 +89,39 @@ \x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x61\x39\x2e\x63\x6f\ \x6d\x2f\x2d\x2f\x73\x70\x65\x63\x2f\x6f\x70\x65\x6e\x73\x65\x61\ \x72\x63\x68\x2f\x31\x2e\x31\x2f\x22\x3e\x0a\x20\x20\x20\x20\x3c\ -\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x4c\x45\x4f\x20\x44\x65\ -\x75\x2d\x45\x6e\x67\x3c\x2f\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\ -\x3e\x0a\x20\x20\x20\x20\x3c\x44\x65\x73\x63\x72\x69\x70\x74\x69\ -\x6f\x6e\x3e\x44\x65\x75\x74\x73\x63\x68\x2d\x45\x6e\x67\x6c\x69\ -\x73\x63\x68\x20\x57\xc3\xb6\x72\x74\x65\x72\x62\x75\x63\x68\x20\ -\x76\x6f\x6e\x20\x4c\x45\x4f\x3c\x2f\x44\x65\x73\x63\x72\x69\x70\ -\x74\x69\x6f\x6e\x3e\x0a\x20\x20\x20\x20\x3c\x55\x72\x6c\x20\x6d\ +\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x47\x6f\x6f\x67\x6c\x65\ +\x20\x28\x49\x27\x6d\x20\x46\x65\x65\x6c\x69\x6e\x67\x20\x4c\x75\ +\x63\x6b\x79\x29\x3c\x2f\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\ +\x0a\x20\x20\x20\x20\x3c\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\ +\x6e\x3e\x47\x6f\x6f\x67\x6c\x65\x20\x57\x65\x62\x20\x53\x65\x61\ +\x72\x63\x68\x3c\x2f\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\ +\x3e\x0a\x20\x20\x20\x20\x3c\x55\x72\x6c\x20\x6d\x65\x74\x68\x6f\ +\x64\x3d\x22\x67\x65\x74\x22\x20\x74\x79\x70\x65\x3d\x22\x74\x65\ +\x78\x74\x2f\x68\x74\x6d\x6c\x22\x20\x74\x65\x6d\x70\x6c\x61\x74\ +\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x67\x6f\ +\x6f\x67\x6c\x65\x2e\x63\x6f\x6d\x2f\x73\x65\x61\x72\x63\x68\x3f\ +\x62\x74\x6e\x49\x3d\x26\x61\x6d\x70\x3b\x68\x6c\x3d\x7b\x6c\x61\ +\x6e\x67\x75\x61\x67\x65\x7d\x26\x61\x6d\x70\x3b\x6c\x72\x3d\x6c\ +\x61\x6e\x67\x5f\x7b\x6c\x61\x6e\x67\x75\x61\x67\x65\x7d\x26\x61\ +\x6d\x70\x3b\x71\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\x72\x6d\ +\x73\x7d\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x55\x72\x6c\x20\x6d\ \x65\x74\x68\x6f\x64\x3d\x22\x67\x65\x74\x22\x20\x74\x79\x70\x65\ -\x3d\x22\x74\x65\x78\x74\x2f\x68\x74\x6d\x6c\x22\x20\x74\x65\x6d\ -\x70\x6c\x61\x74\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x64\x69\ -\x63\x74\x2e\x6c\x65\x6f\x2e\x6f\x72\x67\x2f\x65\x6e\x64\x65\x3f\ -\x6c\x61\x6e\x67\x3d\x64\x65\x26\x61\x6d\x70\x3b\x73\x65\x61\x72\ -\x63\x68\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\x72\x6d\x73\x7d\ -\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x55\x72\x6c\x20\x6d\x65\x74\ -\x68\x6f\x64\x3d\x22\x67\x65\x74\x22\x20\x74\x79\x70\x65\x3d\x22\ -\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x78\x2d\x73\x75\ -\x67\x67\x65\x73\x74\x69\x6f\x6e\x73\x2b\x6a\x73\x6f\x6e\x22\x20\ -\x74\x65\x6d\x70\x6c\x61\x74\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\ -\x2f\x64\x69\x63\x74\x2e\x6c\x65\x6f\x2e\x6f\x72\x67\x2f\x64\x69\ -\x63\x74\x51\x75\x65\x72\x79\x2f\x6d\x2d\x71\x75\x65\x72\x79\x2f\ -\x63\x6f\x6e\x66\x2f\x65\x6e\x64\x65\x2f\x71\x75\x65\x72\x79\x2e\ -\x63\x6f\x6e\x66\x2f\x73\x74\x72\x6c\x69\x73\x74\x2e\x6a\x73\x6f\ -\x6e\x3f\x71\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\x72\x6d\x73\ -\x7d\x26\x61\x6d\x70\x3b\x73\x6f\x72\x74\x3d\x50\x4c\x61\x26\x61\ -\x6d\x70\x3b\x73\x68\x6f\x72\x74\x51\x75\x65\x72\x79\x26\x61\x6d\ -\x70\x3b\x6e\x6f\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x26\ -\x61\x6d\x70\x3b\x6e\x6f\x51\x75\x65\x72\x79\x55\x52\x4c\x73\x22\ -\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x49\x6d\x61\x67\x65\x3e\x68\x74\ -\x74\x70\x3a\x2f\x2f\x64\x69\x63\x74\x2e\x6c\x65\x6f\x2e\x6f\x72\ -\x67\x2f\x69\x6d\x67\x2f\x66\x61\x76\x69\x63\x6f\x6e\x73\x2f\x65\ -\x6e\x64\x65\x2e\x69\x63\x6f\x3c\x2f\x49\x6d\x61\x67\x65\x3e\x0a\ -\x3c\x2f\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\x68\x44\x65\x73\x63\ -\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\ -\x00\x00\x01\x85\ +\x3d\x22\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x78\x2d\ +\x73\x75\x67\x67\x65\x73\x74\x69\x6f\x6e\x73\x2b\x6a\x73\x6f\x6e\ +\x22\x20\x74\x65\x6d\x70\x6c\x61\x74\x65\x3d\x22\x68\x74\x74\x70\ +\x3a\x2f\x2f\x73\x75\x67\x67\x65\x73\x74\x71\x75\x65\x72\x69\x65\ +\x73\x2e\x67\x6f\x6f\x67\x6c\x65\x2e\x63\x6f\x6d\x2f\x63\x6f\x6d\ +\x70\x6c\x65\x74\x65\x2f\x73\x65\x61\x72\x63\x68\x3f\x6f\x75\x74\ +\x70\x75\x74\x3d\x66\x69\x72\x65\x66\x6f\x78\x26\x61\x6d\x70\x3b\ +\x68\x6c\x3d\x7b\x6c\x61\x6e\x67\x75\x61\x67\x65\x7d\x26\x61\x6d\ +\x70\x3b\x71\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\x72\x6d\x73\ +\x7d\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x49\x6d\x61\x67\x65\x3e\ +\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x67\x6f\x6f\x67\x6c\ +\x65\x2e\x63\x6f\x6d\x2f\x66\x61\x76\x69\x63\x6f\x6e\x2e\x69\x63\ +\x6f\x3c\x2f\x49\x6d\x61\x67\x65\x3e\x0a\x3c\x2f\x4f\x70\x65\x6e\ +\x53\x65\x61\x72\x63\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\ +\x6e\x3e\x0a\ +\x00\x00\x01\x6f\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\ @@ -238,60 +130,22 @@ \x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x61\x39\x2e\x63\x6f\ \x6d\x2f\x2d\x2f\x73\x70\x65\x63\x2f\x6f\x70\x65\x6e\x73\x65\x61\ \x72\x63\x68\x2f\x31\x2e\x31\x2f\x22\x3e\x0a\x20\x20\x20\x20\x3c\ -\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x59\x6f\x75\x54\x75\x62\ -\x65\x3c\x2f\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x0a\x20\x20\ -\x20\x20\x3c\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x59\ -\x6f\x75\x54\x75\x62\x65\x3c\x2f\x44\x65\x73\x63\x72\x69\x70\x74\ -\x69\x6f\x6e\x3e\x0a\x20\x20\x20\x20\x3c\x55\x72\x6c\x20\x6d\x65\ -\x74\x68\x6f\x64\x3d\x22\x67\x65\x74\x22\x20\x74\x79\x70\x65\x3d\ -\x22\x74\x65\x78\x74\x2f\x68\x74\x6d\x6c\x22\x20\x74\x65\x6d\x70\ -\x6c\x61\x74\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\ -\x2e\x79\x6f\x75\x74\x75\x62\x65\x2e\x63\x6f\x6d\x2f\x72\x65\x73\ -\x75\x6c\x74\x73\x3f\x73\x65\x61\x72\x63\x68\x5f\x71\x75\x65\x72\ -\x79\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\x72\x6d\x73\x7d\x26\ -\x61\x6d\x70\x3b\x73\x65\x61\x72\x63\x68\x3d\x53\x65\x61\x72\x63\ -\x68\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x49\x6d\x61\x67\x65\x3e\ -\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x79\x6f\x75\x74\x75\ -\x62\x65\x2e\x63\x6f\x6d\x2f\x66\x61\x76\x69\x63\x6f\x6e\x2e\x69\ -\x63\x6f\x3c\x2f\x49\x6d\x61\x67\x65\x3e\x0a\x3c\x2f\x4f\x70\x65\ -\x6e\x53\x65\x61\x72\x63\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\ -\x6f\x6e\x3e\x0a\ -\x00\x00\x02\x1e\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\ -\x2d\x38\x22\x3f\x3e\x0a\x3c\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\ -\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x20\x78\x6d\x6c\ -\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x61\x39\x2e\x63\x6f\ -\x6d\x2f\x2d\x2f\x73\x70\x65\x63\x2f\x6f\x70\x65\x6e\x73\x65\x61\ -\x72\x63\x68\x2f\x31\x2e\x31\x2f\x22\x3e\x0a\x20\x20\x20\x20\x3c\ -\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x44\x65\x2d\x45\x6e\x20\ -\x42\x65\x6f\x6c\x69\x6e\x67\x75\x73\x3c\x2f\x53\x68\x6f\x72\x74\ -\x4e\x61\x6d\x65\x3e\x0a\x20\x20\x20\x20\x3c\x44\x65\x73\x63\x72\ -\x69\x70\x74\x69\x6f\x6e\x3e\x42\x65\x6f\x6c\x69\x6e\x67\x75\x73\ -\x3a\x20\x47\x65\x72\x6d\x61\x6e\x2d\x45\x6e\x67\x6c\x69\x73\x68\ -\x20\x44\x69\x63\x74\x69\x6f\x6e\x61\x72\x79\x3c\x2f\x44\x65\x73\ -\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\x20\x20\x20\x20\x3c\x55\ -\x72\x6c\x20\x6d\x65\x74\x68\x6f\x64\x3d\x22\x67\x65\x74\x22\x20\ -\x74\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x68\x74\x6d\x6c\x22\ -\x20\x74\x65\x6d\x70\x6c\x61\x74\x65\x3d\x22\x68\x74\x74\x70\x3a\ -\x2f\x2f\x64\x69\x63\x74\x2e\x74\x75\x2d\x63\x68\x65\x6d\x6e\x69\ -\x74\x7a\x2e\x64\x65\x2f\x3f\x71\x75\x65\x72\x79\x3d\x7b\x73\x65\ -\x61\x72\x63\x68\x54\x65\x72\x6d\x73\x7d\x22\x2f\x3e\x0a\x20\x20\ -\x20\x20\x3c\x55\x72\x6c\x20\x6d\x65\x74\x68\x6f\x64\x3d\x22\x67\ -\x65\x74\x22\x20\x74\x79\x70\x65\x3d\x22\x61\x70\x70\x6c\x69\x63\ -\x61\x74\x69\x6f\x6e\x2f\x78\x2d\x73\x75\x67\x67\x65\x73\x74\x69\ -\x6f\x6e\x73\x2b\x6a\x73\x6f\x6e\x22\x20\x74\x65\x6d\x70\x6c\x61\ -\x74\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x64\x69\x63\x74\x2e\ -\x74\x75\x2d\x63\x68\x65\x6d\x6e\x69\x74\x7a\x2e\x64\x65\x2f\x73\ -\x75\x67\x67\x2e\x70\x68\x70\x3f\x6a\x73\x6f\x6e\x3d\x31\x26\x61\ -\x6d\x70\x3b\x73\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\x72\x6d\ -\x73\x7d\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x49\x6d\x61\x67\x65\ -\x3e\x68\x74\x74\x70\x3a\x2f\x2f\x64\x69\x63\x74\x2e\x74\x75\x2d\ -\x63\x68\x65\x6d\x6e\x69\x74\x7a\x2e\x64\x65\x2f\x70\x69\x63\x73\ -\x2f\x62\x65\x6f\x2d\x64\x65\x2e\x70\x6e\x67\x3c\x2f\x49\x6d\x61\ -\x67\x65\x3e\x0a\x3c\x2f\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\x68\ -\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\ +\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x52\x65\x64\x64\x69\x74\ +\x3c\x2f\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x0a\x20\x20\x20\ +\x20\x3c\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x52\x65\ +\x64\x64\x69\x74\x20\x53\x69\x74\x65\x20\x53\x65\x61\x72\x63\x68\ +\x3c\x2f\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\x20\ +\x20\x20\x20\x3c\x55\x72\x6c\x20\x6d\x65\x74\x68\x6f\x64\x3d\x22\ +\x67\x65\x74\x22\x20\x74\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\ +\x68\x74\x6d\x6c\x22\x20\x74\x65\x6d\x70\x6c\x61\x74\x65\x3d\x22\ +\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x72\x65\x64\x64\x69\ +\x74\x2e\x63\x6f\x6d\x2f\x73\x65\x61\x72\x63\x68\x3f\x71\x3d\x7b\ +\x73\x65\x61\x72\x63\x68\x54\x65\x72\x6d\x73\x7d\x22\x2f\x3e\x0a\ +\x20\x20\x20\x20\x3c\x49\x6d\x61\x67\x65\x3e\x68\x74\x74\x70\x3a\ +\x2f\x2f\x77\x77\x77\x2e\x72\x65\x64\x64\x69\x74\x2e\x63\x6f\x6d\ +\x2f\x66\x61\x76\x69\x63\x6f\x6e\x2e\x69\x63\x6f\x3c\x2f\x49\x6d\ +\x61\x67\x65\x3e\x0a\x3c\x2f\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\ +\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\ \x00\x00\x06\xfe\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ @@ -406,7 +260,87 @@ \x55\x35\x45\x72\x6b\x4a\x67\x67\x67\x3d\x3d\x3c\x2f\x49\x6d\x61\ \x67\x65\x3e\x0a\x3c\x2f\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\x68\ \x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\ -\x00\x00\x02\x64\ +\x00\x00\x01\x95\ +\x3c\ +\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ +\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\ +\x2d\x38\x22\x3f\x3e\x0a\x3c\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\ +\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x20\x78\x6d\x6c\ +\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x61\x39\x2e\x63\x6f\ +\x6d\x2f\x2d\x2f\x73\x70\x65\x63\x2f\x6f\x70\x65\x6e\x73\x65\x61\ +\x72\x63\x68\x2f\x31\x2e\x31\x2f\x22\x3e\x0a\x20\x20\x20\x20\x3c\ +\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x41\x6d\x61\x7a\x6f\x6e\ +\x2e\x63\x6f\x6d\x3c\x2f\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\ +\x0a\x20\x20\x20\x20\x3c\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\ +\x6e\x3e\x41\x6d\x61\x7a\x6f\x6e\x2e\x63\x6f\x6d\x20\x53\x65\x61\ +\x72\x63\x68\x3c\x2f\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\ +\x3e\x0a\x20\x20\x20\x20\x3c\x55\x72\x6c\x20\x6d\x65\x74\x68\x6f\ +\x64\x3d\x22\x67\x65\x74\x22\x20\x74\x79\x70\x65\x3d\x22\x74\x65\ +\x78\x74\x2f\x68\x74\x6d\x6c\x22\x20\x74\x65\x6d\x70\x6c\x61\x74\ +\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x61\x6d\ +\x61\x7a\x6f\x6e\x2e\x63\x6f\x6d\x2f\x65\x78\x65\x63\x2f\x6f\x62\ +\x69\x64\x6f\x73\x2f\x65\x78\x74\x65\x72\x6e\x61\x6c\x2d\x73\x65\ +\x61\x72\x63\x68\x2f\x3f\x66\x69\x65\x6c\x64\x2d\x6b\x65\x79\x77\ +\x6f\x72\x64\x73\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\x72\x6d\ +\x73\x7d\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x49\x6d\x61\x67\x65\ +\x3e\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x61\x6d\x61\x7a\ +\x6f\x6e\x2e\x63\x6f\x6d\x2f\x66\x61\x76\x69\x63\x6f\x6e\x2e\x69\ +\x63\x6f\x3c\x2f\x49\x6d\x61\x67\x65\x3e\x0a\x3c\x2f\x4f\x70\x65\ +\x6e\x53\x65\x61\x72\x63\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\ +\x6f\x6e\x3e\x0a\ +\x00\x00\x01\x74\ +\x3c\ +\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ +\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\ +\x2d\x38\x22\x3f\x3e\x0a\x3c\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\ +\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x20\x78\x6d\x6c\ +\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x61\x39\x2e\x63\x6f\ +\x6d\x2f\x2d\x2f\x73\x70\x65\x63\x2f\x6f\x70\x65\x6e\x73\x65\x61\ +\x72\x63\x68\x2f\x31\x2e\x31\x2f\x22\x3e\x0a\x20\x20\x20\x20\x3c\ +\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x50\x79\x50\x49\x3c\x2f\ +\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x0a\x20\x20\x20\x20\x3c\ +\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x53\x65\x61\x72\ +\x63\x68\x20\x50\x79\x50\x49\x3c\x2f\x44\x65\x73\x63\x72\x69\x70\ +\x74\x69\x6f\x6e\x3e\x0a\x20\x20\x20\x20\x3c\x55\x72\x6c\x20\x6d\ +\x65\x74\x68\x6f\x64\x3d\x22\x67\x65\x74\x22\x20\x74\x79\x70\x65\ +\x3d\x22\x74\x65\x78\x74\x2f\x68\x74\x6d\x6c\x22\x20\x74\x65\x6d\ +\x70\x6c\x61\x74\x65\x3d\x22\x68\x74\x74\x70\x73\x3a\x2f\x2f\x70\ +\x79\x70\x69\x2e\x6f\x72\x67\x2f\x73\x65\x61\x72\x63\x68\x2f\x3f\ +\x71\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\x72\x6d\x73\x7d\x22\ +\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x49\x6d\x61\x67\x65\x3e\x68\x74\ +\x74\x70\x73\x3a\x2f\x2f\x70\x79\x70\x69\x2e\x6f\x72\x67\x2f\x73\ +\x74\x61\x74\x69\x63\x2f\x69\x6d\x61\x67\x65\x73\x2f\x66\x61\x76\ +\x69\x63\x6f\x6e\x2e\x36\x61\x37\x36\x32\x37\x35\x64\x2e\x69\x63\ +\x6f\x3c\x2f\x49\x6d\x61\x67\x65\x3e\x0a\x3c\x2f\x4f\x70\x65\x6e\ +\x53\x65\x61\x72\x63\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\ +\x6e\x3e\x0a\ +\x00\x00\x01\x7e\ +\x3c\ +\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ +\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\ +\x2d\x38\x22\x3f\x3e\x0a\x3c\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\ +\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x20\x78\x6d\x6c\ +\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x61\x39\x2e\x63\x6f\ +\x6d\x2f\x2d\x2f\x73\x70\x65\x63\x2f\x6f\x70\x65\x6e\x73\x65\x61\ +\x72\x63\x68\x2f\x31\x2e\x31\x2f\x22\x3e\x0a\x20\x20\x20\x20\x3c\ +\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x46\x61\x63\x65\x62\x6f\ +\x6f\x6b\x3c\x2f\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x0a\x20\ +\x20\x20\x20\x3c\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\ +\x53\x65\x61\x72\x63\x68\x20\x46\x61\x63\x65\x62\x6f\x6f\x6b\x3c\ +\x2f\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\x20\x20\ +\x20\x20\x3c\x55\x72\x6c\x20\x6d\x65\x74\x68\x6f\x64\x3d\x22\x67\ +\x65\x74\x22\x20\x74\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x68\ +\x74\x6d\x6c\x22\x20\x74\x65\x6d\x70\x6c\x61\x74\x65\x3d\x22\x68\ +\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x66\x61\x63\x65\x62\x6f\ +\x6f\x6b\x2e\x63\x6f\x6d\x2f\x73\x65\x61\x72\x63\x68\x2f\x3f\x73\ +\x72\x63\x3d\x6f\x73\x26\x61\x6d\x70\x3b\x71\x3d\x7b\x73\x65\x61\ +\x72\x63\x68\x54\x65\x72\x6d\x73\x7d\x22\x2f\x3e\x0a\x20\x20\x20\ +\x20\x3c\x49\x6d\x61\x67\x65\x3e\x68\x74\x74\x70\x3a\x2f\x2f\x77\ +\x77\x77\x2e\x66\x61\x63\x65\x62\x6f\x6f\x6b\x2e\x63\x6f\x6d\x2f\ +\x66\x61\x76\x69\x63\x6f\x6e\x2e\x69\x63\x6f\x3c\x2f\x49\x6d\x61\ +\x67\x65\x3e\x0a\x3c\x2f\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\x68\ +\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\ +\x00\x00\x02\x46\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\ @@ -416,38 +350,36 @@ \x6d\x2f\x2d\x2f\x73\x70\x65\x63\x2f\x6f\x70\x65\x6e\x73\x65\x61\ \x72\x63\x68\x2f\x31\x2e\x31\x2f\x22\x3e\x0a\x20\x20\x20\x20\x3c\ \x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x47\x6f\x6f\x67\x6c\x65\ -\x20\x28\x49\x27\x6d\x20\x46\x65\x65\x6c\x69\x6e\x67\x20\x4c\x75\ -\x63\x6b\x79\x29\x3c\x2f\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\ -\x0a\x20\x20\x20\x20\x3c\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\ -\x6e\x3e\x47\x6f\x6f\x67\x6c\x65\x20\x57\x65\x62\x20\x53\x65\x61\ -\x72\x63\x68\x3c\x2f\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\ -\x3e\x0a\x20\x20\x20\x20\x3c\x55\x72\x6c\x20\x6d\x65\x74\x68\x6f\ -\x64\x3d\x22\x67\x65\x74\x22\x20\x74\x79\x70\x65\x3d\x22\x74\x65\ -\x78\x74\x2f\x68\x74\x6d\x6c\x22\x20\x74\x65\x6d\x70\x6c\x61\x74\ -\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x67\x6f\ -\x6f\x67\x6c\x65\x2e\x63\x6f\x6d\x2f\x73\x65\x61\x72\x63\x68\x3f\ -\x62\x74\x6e\x49\x3d\x26\x61\x6d\x70\x3b\x68\x6c\x3d\x7b\x6c\x61\ -\x6e\x67\x75\x61\x67\x65\x7d\x26\x61\x6d\x70\x3b\x6c\x72\x3d\x6c\ -\x61\x6e\x67\x5f\x7b\x6c\x61\x6e\x67\x75\x61\x67\x65\x7d\x26\x61\ -\x6d\x70\x3b\x71\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\x72\x6d\ -\x73\x7d\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x55\x72\x6c\x20\x6d\ -\x65\x74\x68\x6f\x64\x3d\x22\x67\x65\x74\x22\x20\x74\x79\x70\x65\ -\x3d\x22\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x78\x2d\ -\x73\x75\x67\x67\x65\x73\x74\x69\x6f\x6e\x73\x2b\x6a\x73\x6f\x6e\ -\x22\x20\x74\x65\x6d\x70\x6c\x61\x74\x65\x3d\x22\x68\x74\x74\x70\ -\x3a\x2f\x2f\x73\x75\x67\x67\x65\x73\x74\x71\x75\x65\x72\x69\x65\ -\x73\x2e\x67\x6f\x6f\x67\x6c\x65\x2e\x63\x6f\x6d\x2f\x63\x6f\x6d\ -\x70\x6c\x65\x74\x65\x2f\x73\x65\x61\x72\x63\x68\x3f\x6f\x75\x74\ -\x70\x75\x74\x3d\x66\x69\x72\x65\x66\x6f\x78\x26\x61\x6d\x70\x3b\ -\x68\x6c\x3d\x7b\x6c\x61\x6e\x67\x75\x61\x67\x65\x7d\x26\x61\x6d\ -\x70\x3b\x71\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\x72\x6d\x73\ -\x7d\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x49\x6d\x61\x67\x65\x3e\ -\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x67\x6f\x6f\x67\x6c\ -\x65\x2e\x63\x6f\x6d\x2f\x66\x61\x76\x69\x63\x6f\x6e\x2e\x69\x63\ -\x6f\x3c\x2f\x49\x6d\x61\x67\x65\x3e\x0a\x3c\x2f\x4f\x70\x65\x6e\ -\x53\x65\x61\x72\x63\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\ -\x6e\x3e\x0a\ -\x00\x00\x02\x46\ +\x3c\x2f\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x0a\x20\x20\x20\ +\x20\x3c\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x47\x6f\ +\x6f\x67\x6c\x65\x20\x57\x65\x62\x20\x53\x65\x61\x72\x63\x68\x3c\ +\x2f\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\x20\x20\ +\x20\x20\x3c\x55\x72\x6c\x20\x6d\x65\x74\x68\x6f\x64\x3d\x22\x67\ +\x65\x74\x22\x20\x74\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x68\ +\x74\x6d\x6c\x22\x20\x74\x65\x6d\x70\x6c\x61\x74\x65\x3d\x22\x68\ +\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x67\x6f\x6f\x67\x6c\x65\ +\x2e\x63\x6f\x6d\x2f\x73\x65\x61\x72\x63\x68\x3f\x68\x6c\x3d\x7b\ +\x6c\x61\x6e\x67\x75\x61\x67\x65\x7d\x26\x61\x6d\x70\x3b\x6c\x72\ +\x3d\x6c\x61\x6e\x67\x5f\x7b\x6c\x61\x6e\x67\x75\x61\x67\x65\x7d\ +\x26\x61\x6d\x70\x3b\x71\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\ +\x72\x6d\x73\x7d\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x55\x72\x6c\ +\x20\x6d\x65\x74\x68\x6f\x64\x3d\x22\x67\x65\x74\x22\x20\x74\x79\ +\x70\x65\x3d\x22\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\ +\x78\x2d\x73\x75\x67\x67\x65\x73\x74\x69\x6f\x6e\x73\x2b\x6a\x73\ +\x6f\x6e\x22\x20\x74\x65\x6d\x70\x6c\x61\x74\x65\x3d\x22\x68\x74\ +\x74\x70\x3a\x2f\x2f\x73\x75\x67\x67\x65\x73\x74\x71\x75\x65\x72\ +\x69\x65\x73\x2e\x67\x6f\x6f\x67\x6c\x65\x2e\x63\x6f\x6d\x2f\x63\ +\x6f\x6d\x70\x6c\x65\x74\x65\x2f\x73\x65\x61\x72\x63\x68\x3f\x6f\ +\x75\x74\x70\x75\x74\x3d\x66\x69\x72\x65\x66\x6f\x78\x26\x61\x6d\ +\x70\x3b\x68\x6c\x3d\x7b\x6c\x61\x6e\x67\x75\x61\x67\x65\x7d\x26\ +\x61\x6d\x70\x3b\x71\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\x72\ +\x6d\x73\x7d\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x49\x6d\x61\x67\ +\x65\x3e\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x67\x6f\x6f\ +\x67\x6c\x65\x2e\x63\x6f\x6d\x2f\x66\x61\x76\x69\x63\x6f\x6e\x2e\ +\x69\x63\x6f\x3c\x2f\x49\x6d\x61\x67\x65\x3e\x0a\x3c\x2f\x4f\x70\ +\x65\x6e\x53\x65\x61\x72\x63\x68\x44\x65\x73\x63\x72\x69\x70\x74\ +\x69\x6f\x6e\x3e\x0a\ +\x00\x00\x01\x79\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\ @@ -456,36 +388,23 @@ \x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x61\x39\x2e\x63\x6f\ \x6d\x2f\x2d\x2f\x73\x70\x65\x63\x2f\x6f\x70\x65\x6e\x73\x65\x61\ \x72\x63\x68\x2f\x31\x2e\x31\x2f\x22\x3e\x0a\x20\x20\x20\x20\x3c\ -\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x57\x69\x6b\x69\x61\x20\ -\x28\x65\x6e\x29\x3c\x2f\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\ -\x0a\x20\x20\x20\x20\x3c\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\ -\x6e\x3e\x57\x69\x6b\x69\x61\x20\x28\x65\x6e\x29\x3c\x2f\x44\x65\ -\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\x20\x20\x20\x20\x3c\ -\x55\x72\x6c\x20\x6d\x65\x74\x68\x6f\x64\x3d\x22\x67\x65\x74\x22\ -\x20\x74\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x68\x74\x6d\x6c\ -\x22\x20\x74\x65\x6d\x70\x6c\x61\x74\x65\x3d\x22\x68\x74\x74\x70\ -\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x69\x6b\x69\x61\x2e\x63\x6f\x6d\ -\x2f\x69\x6e\x64\x65\x78\x2e\x70\x68\x70\x3f\x74\x69\x74\x6c\x65\ -\x3d\x53\x70\x65\x63\x69\x61\x6c\x3a\x53\x65\x61\x72\x63\x68\x26\ -\x61\x6d\x70\x3b\x73\x65\x61\x72\x63\x68\x3d\x7b\x73\x65\x61\x72\ -\x63\x68\x54\x65\x72\x6d\x73\x7d\x22\x2f\x3e\x0a\x20\x20\x20\x20\ -\x3c\x55\x72\x6c\x20\x6d\x65\x74\x68\x6f\x64\x3d\x22\x67\x65\x74\ -\x22\x20\x74\x79\x70\x65\x3d\x22\x61\x70\x70\x6c\x69\x63\x61\x74\ -\x69\x6f\x6e\x2f\x78\x2d\x73\x75\x67\x67\x65\x73\x74\x69\x6f\x6e\ -\x73\x2b\x6a\x73\x6f\x6e\x22\x20\x74\x65\x6d\x70\x6c\x61\x74\x65\ -\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x69\x6b\ -\x69\x61\x2e\x63\x6f\x6d\x2f\x61\x70\x69\x2e\x70\x68\x70\x3f\x61\ -\x63\x74\x69\x6f\x6e\x3d\x6f\x70\x65\x6e\x73\x65\x61\x72\x63\x68\ -\x26\x61\x6d\x70\x3b\x73\x65\x61\x72\x63\x68\x3d\x7b\x73\x65\x61\ -\x72\x63\x68\x54\x65\x72\x6d\x73\x7d\x26\x61\x6d\x70\x3b\x6e\x61\ -\x6d\x65\x73\x70\x61\x63\x65\x3d\x31\x22\x2f\x3e\x0a\x20\x20\x20\ -\x20\x3c\x49\x6d\x61\x67\x65\x3e\x68\x74\x74\x70\x3a\x2f\x2f\x69\ -\x6d\x61\x67\x65\x73\x2e\x77\x69\x6b\x69\x61\x2e\x63\x6f\x6d\x2f\ -\x77\x69\x6b\x69\x61\x67\x6c\x6f\x62\x61\x6c\x2f\x69\x6d\x61\x67\ -\x65\x73\x2f\x36\x2f\x36\x34\x2f\x46\x61\x76\x69\x63\x6f\x6e\x2e\ -\x69\x63\x6f\x3c\x2f\x49\x6d\x61\x67\x65\x3e\x0a\x3c\x2f\x4f\x70\ -\x65\x6e\x53\x65\x61\x72\x63\x68\x44\x65\x73\x63\x72\x69\x70\x74\ -\x69\x6f\x6e\x3e\x0a\ +\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x42\x69\x6e\x67\x3c\x2f\ +\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x0a\x20\x20\x20\x20\x3c\ +\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x42\x69\x6e\x67\ +\x20\x57\x65\x62\x20\x53\x65\x61\x72\x63\x68\x3c\x2f\x44\x65\x73\ +\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\x20\x20\x20\x20\x3c\x55\ +\x72\x6c\x20\x6d\x65\x74\x68\x6f\x64\x3d\x22\x67\x65\x74\x22\x20\ +\x74\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x68\x74\x6d\x6c\x22\ +\x20\x74\x65\x6d\x70\x6c\x61\x74\x65\x3d\x22\x68\x74\x74\x70\x3a\ +\x2f\x2f\x77\x77\x77\x2e\x62\x69\x6e\x67\x2e\x63\x6f\x6d\x2f\x73\ +\x65\x61\x72\x63\x68\x3f\x63\x63\x3d\x7b\x6c\x61\x6e\x67\x75\x61\ +\x67\x65\x7d\x26\x61\x6d\x70\x3b\x71\x3d\x7b\x73\x65\x61\x72\x63\ +\x68\x54\x65\x72\x6d\x73\x7d\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\ +\x49\x6d\x61\x67\x65\x3e\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\ +\x2e\x62\x69\x6e\x67\x2e\x63\x6f\x6d\x2f\x73\x2f\x77\x6c\x66\x6c\ +\x61\x67\x2e\x69\x63\x6f\x3c\x2f\x49\x6d\x61\x67\x65\x3e\x0a\x3c\ +\x2f\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\x68\x44\x65\x73\x63\x72\ +\x69\x70\x74\x69\x6f\x6e\x3e\x0a\ \x00\x00\x02\x5b\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ @@ -526,94 +445,6 @@ \x69\x63\x6f\x6e\x2e\x69\x63\x6f\x3c\x2f\x49\x6d\x61\x67\x65\x3e\ \x0a\x3c\x2f\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\x68\x44\x65\x73\ \x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\ -\x00\x00\x01\x6f\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\ -\x2d\x38\x22\x3f\x3e\x0a\x3c\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\ -\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x20\x78\x6d\x6c\ -\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x61\x39\x2e\x63\x6f\ -\x6d\x2f\x2d\x2f\x73\x70\x65\x63\x2f\x6f\x70\x65\x6e\x73\x65\x61\ -\x72\x63\x68\x2f\x31\x2e\x31\x2f\x22\x3e\x0a\x20\x20\x20\x20\x3c\ -\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x52\x65\x64\x64\x69\x74\ -\x3c\x2f\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x0a\x20\x20\x20\ -\x20\x3c\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x52\x65\ -\x64\x64\x69\x74\x20\x53\x69\x74\x65\x20\x53\x65\x61\x72\x63\x68\ -\x3c\x2f\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\x20\ -\x20\x20\x20\x3c\x55\x72\x6c\x20\x6d\x65\x74\x68\x6f\x64\x3d\x22\ -\x67\x65\x74\x22\x20\x74\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\ -\x68\x74\x6d\x6c\x22\x20\x74\x65\x6d\x70\x6c\x61\x74\x65\x3d\x22\ -\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x72\x65\x64\x64\x69\ -\x74\x2e\x63\x6f\x6d\x2f\x73\x65\x61\x72\x63\x68\x3f\x71\x3d\x7b\ -\x73\x65\x61\x72\x63\x68\x54\x65\x72\x6d\x73\x7d\x22\x2f\x3e\x0a\ -\x20\x20\x20\x20\x3c\x49\x6d\x61\x67\x65\x3e\x68\x74\x74\x70\x3a\ -\x2f\x2f\x77\x77\x77\x2e\x72\x65\x64\x64\x69\x74\x2e\x63\x6f\x6d\ -\x2f\x66\x61\x76\x69\x63\x6f\x6e\x2e\x69\x63\x6f\x3c\x2f\x49\x6d\ -\x61\x67\x65\x3e\x0a\x3c\x2f\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\ -\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\ -\x00\x00\x02\x27\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\ -\x2d\x38\x22\x3f\x3e\x0a\x3c\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\ -\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x20\x78\x6d\x6c\ -\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x61\x39\x2e\x63\x6f\ -\x6d\x2f\x2d\x2f\x73\x70\x65\x63\x2f\x6f\x70\x65\x6e\x73\x65\x61\ -\x72\x63\x68\x2f\x31\x2e\x31\x2f\x22\x3e\x0a\x20\x20\x20\x20\x3c\ -\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x59\x61\x68\x6f\x6f\x21\ -\x3c\x2f\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x0a\x20\x20\x20\ -\x20\x3c\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x59\x61\ -\x68\x6f\x6f\x20\x57\x65\x62\x20\x53\x65\x61\x72\x63\x68\x3c\x2f\ -\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\x20\x20\x20\ -\x20\x3c\x55\x72\x6c\x20\x6d\x65\x74\x68\x6f\x64\x3d\x22\x67\x65\ -\x74\x22\x20\x74\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x68\x74\ -\x6d\x6c\x22\x20\x74\x65\x6d\x70\x6c\x61\x74\x65\x3d\x22\x68\x74\ -\x74\x70\x3a\x2f\x2f\x73\x65\x61\x72\x63\x68\x2e\x79\x61\x68\x6f\ -\x6f\x2e\x63\x6f\x6d\x2f\x73\x65\x61\x72\x63\x68\x3f\x65\x69\x3d\ -\x75\x74\x66\x2d\x38\x26\x61\x6d\x70\x3b\x66\x72\x3d\x73\x66\x70\ -\x26\x61\x6d\x70\x3b\x69\x73\x63\x71\x72\x79\x3d\x26\x61\x6d\x70\ -\x3b\x70\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\x72\x6d\x73\x7d\ -\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x55\x72\x6c\x20\x6d\x65\x74\ -\x68\x6f\x64\x3d\x22\x67\x65\x74\x22\x20\x74\x79\x70\x65\x3d\x22\ -\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x78\x2d\x73\x75\ -\x67\x67\x65\x73\x74\x69\x6f\x6e\x73\x2b\x6a\x73\x6f\x6e\x22\x20\ -\x74\x65\x6d\x70\x6c\x61\x74\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\ -\x2f\x66\x66\x2e\x73\x65\x61\x72\x63\x68\x2e\x79\x61\x68\x6f\x6f\ -\x2e\x63\x6f\x6d\x2f\x67\x6f\x73\x73\x69\x70\x3f\x6f\x75\x74\x70\ -\x75\x74\x3d\x66\x78\x6a\x73\x6f\x6e\x26\x61\x6d\x70\x3b\x63\x6f\ -\x6d\x6d\x61\x6e\x64\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\x72\ -\x6d\x73\x7d\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x49\x6d\x61\x67\ -\x65\x3e\x68\x74\x74\x70\x3a\x2f\x2f\x6d\x2e\x77\x77\x77\x2e\x79\ -\x61\x68\x6f\x6f\x2e\x63\x6f\x6d\x2f\x66\x61\x76\x69\x63\x6f\x6e\ -\x2e\x69\x63\x6f\x3c\x2f\x49\x6d\x61\x67\x65\x3e\x0a\x3c\x2f\x4f\ -\x70\x65\x6e\x53\x65\x61\x72\x63\x68\x44\x65\x73\x63\x72\x69\x70\ -\x74\x69\x6f\x6e\x3e\x0a\ -\x00\x00\x01\x7e\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\ -\x2d\x38\x22\x3f\x3e\x0a\x3c\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\ -\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x20\x78\x6d\x6c\ -\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x61\x39\x2e\x63\x6f\ -\x6d\x2f\x2d\x2f\x73\x70\x65\x63\x2f\x6f\x70\x65\x6e\x73\x65\x61\ -\x72\x63\x68\x2f\x31\x2e\x31\x2f\x22\x3e\x0a\x20\x20\x20\x20\x3c\ -\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x46\x61\x63\x65\x62\x6f\ -\x6f\x6b\x3c\x2f\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x0a\x20\ -\x20\x20\x20\x3c\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\ -\x53\x65\x61\x72\x63\x68\x20\x46\x61\x63\x65\x62\x6f\x6f\x6b\x3c\ -\x2f\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\x20\x20\ -\x20\x20\x3c\x55\x72\x6c\x20\x6d\x65\x74\x68\x6f\x64\x3d\x22\x67\ -\x65\x74\x22\x20\x74\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x68\ -\x74\x6d\x6c\x22\x20\x74\x65\x6d\x70\x6c\x61\x74\x65\x3d\x22\x68\ -\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x66\x61\x63\x65\x62\x6f\ -\x6f\x6b\x2e\x63\x6f\x6d\x2f\x73\x65\x61\x72\x63\x68\x2f\x3f\x73\ -\x72\x63\x3d\x6f\x73\x26\x61\x6d\x70\x3b\x71\x3d\x7b\x73\x65\x61\ -\x72\x63\x68\x54\x65\x72\x6d\x73\x7d\x22\x2f\x3e\x0a\x20\x20\x20\ -\x20\x3c\x49\x6d\x61\x67\x65\x3e\x68\x74\x74\x70\x3a\x2f\x2f\x77\ -\x77\x77\x2e\x66\x61\x63\x65\x62\x6f\x6f\x6b\x2e\x63\x6f\x6d\x2f\ -\x66\x61\x76\x69\x63\x6f\x6e\x2e\x69\x63\x6f\x3c\x2f\x49\x6d\x61\ -\x67\x65\x3e\x0a\x3c\x2f\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\x68\ -\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\ \x00\x00\x02\x54\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ @@ -654,37 +485,717 @@ \x6f\x3c\x2f\x49\x6d\x61\x67\x65\x3e\x0a\x3c\x2f\x4f\x70\x65\x6e\ \x53\x65\x61\x72\x63\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\ \x6e\x3e\x0a\ +\x00\x00\x02\x27\ +\x3c\ +\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ +\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\ +\x2d\x38\x22\x3f\x3e\x0a\x3c\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\ +\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x20\x78\x6d\x6c\ +\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x61\x39\x2e\x63\x6f\ +\x6d\x2f\x2d\x2f\x73\x70\x65\x63\x2f\x6f\x70\x65\x6e\x73\x65\x61\ +\x72\x63\x68\x2f\x31\x2e\x31\x2f\x22\x3e\x0a\x20\x20\x20\x20\x3c\ +\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x59\x61\x68\x6f\x6f\x21\ +\x3c\x2f\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x0a\x20\x20\x20\ +\x20\x3c\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x59\x61\ +\x68\x6f\x6f\x20\x57\x65\x62\x20\x53\x65\x61\x72\x63\x68\x3c\x2f\ +\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\x20\x20\x20\ +\x20\x3c\x55\x72\x6c\x20\x6d\x65\x74\x68\x6f\x64\x3d\x22\x67\x65\ +\x74\x22\x20\x74\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x68\x74\ +\x6d\x6c\x22\x20\x74\x65\x6d\x70\x6c\x61\x74\x65\x3d\x22\x68\x74\ +\x74\x70\x3a\x2f\x2f\x73\x65\x61\x72\x63\x68\x2e\x79\x61\x68\x6f\ +\x6f\x2e\x63\x6f\x6d\x2f\x73\x65\x61\x72\x63\x68\x3f\x65\x69\x3d\ +\x75\x74\x66\x2d\x38\x26\x61\x6d\x70\x3b\x66\x72\x3d\x73\x66\x70\ +\x26\x61\x6d\x70\x3b\x69\x73\x63\x71\x72\x79\x3d\x26\x61\x6d\x70\ +\x3b\x70\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\x72\x6d\x73\x7d\ +\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x55\x72\x6c\x20\x6d\x65\x74\ +\x68\x6f\x64\x3d\x22\x67\x65\x74\x22\x20\x74\x79\x70\x65\x3d\x22\ +\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x78\x2d\x73\x75\ +\x67\x67\x65\x73\x74\x69\x6f\x6e\x73\x2b\x6a\x73\x6f\x6e\x22\x20\ +\x74\x65\x6d\x70\x6c\x61\x74\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\ +\x2f\x66\x66\x2e\x73\x65\x61\x72\x63\x68\x2e\x79\x61\x68\x6f\x6f\ +\x2e\x63\x6f\x6d\x2f\x67\x6f\x73\x73\x69\x70\x3f\x6f\x75\x74\x70\ +\x75\x74\x3d\x66\x78\x6a\x73\x6f\x6e\x26\x61\x6d\x70\x3b\x63\x6f\ +\x6d\x6d\x61\x6e\x64\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\x72\ +\x6d\x73\x7d\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x49\x6d\x61\x67\ +\x65\x3e\x68\x74\x74\x70\x3a\x2f\x2f\x6d\x2e\x77\x77\x77\x2e\x79\ +\x61\x68\x6f\x6f\x2e\x63\x6f\x6d\x2f\x66\x61\x76\x69\x63\x6f\x6e\ +\x2e\x69\x63\x6f\x3c\x2f\x49\x6d\x61\x67\x65\x3e\x0a\x3c\x2f\x4f\ +\x70\x65\x6e\x53\x65\x61\x72\x63\x68\x44\x65\x73\x63\x72\x69\x70\ +\x74\x69\x6f\x6e\x3e\x0a\ +\x00\x00\x01\xc9\ +\x3c\ +\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ +\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\ +\x2d\x38\x22\x3f\x3e\x0a\x3c\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\ +\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x20\x78\x6d\x6c\ +\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x61\x39\x2e\x63\x6f\ +\x6d\x2f\x2d\x2f\x73\x70\x65\x63\x2f\x6f\x70\x65\x6e\x73\x65\x61\ +\x72\x63\x68\x2f\x31\x2e\x31\x2f\x22\x3e\x0a\x20\x20\x20\x20\x3c\ +\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x4c\x69\x6e\x75\x78\x2d\ +\x4d\x61\x67\x61\x7a\x69\x6e\x3c\x2f\x53\x68\x6f\x72\x74\x4e\x61\ +\x6d\x65\x3e\x0a\x20\x20\x20\x20\x3c\x44\x65\x73\x63\x72\x69\x70\ +\x74\x69\x6f\x6e\x3e\x53\x75\x63\x68\x65\x20\x61\x75\x66\x20\x77\ +\x77\x77\x2e\x6c\x69\x6e\x75\x78\x2d\x6d\x61\x67\x61\x7a\x69\x6e\ +\x2e\x64\x65\x3c\x2f\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\ +\x3e\x0a\x20\x20\x20\x20\x3c\x55\x72\x6c\x20\x6d\x65\x74\x68\x6f\ +\x64\x3d\x22\x67\x65\x74\x22\x20\x74\x79\x70\x65\x3d\x22\x74\x65\ +\x78\x74\x2f\x68\x74\x6d\x6c\x22\x20\x74\x65\x6d\x70\x6c\x61\x74\ +\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x6c\x69\ +\x6e\x75\x78\x2d\x6d\x61\x67\x61\x7a\x69\x6e\x2e\x64\x65\x2f\x63\ +\x6f\x6e\x74\x65\x6e\x74\x2f\x73\x65\x61\x72\x63\x68\x3f\x53\x65\ +\x61\x72\x63\x68\x54\x65\x78\x74\x3d\x7b\x73\x65\x61\x72\x63\x68\ +\x54\x65\x72\x6d\x73\x7d\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x49\ +\x6d\x61\x67\x65\x3e\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\ +\x6c\x69\x6e\x75\x78\x2d\x6d\x61\x67\x61\x7a\x69\x6e\x2e\x64\x65\ +\x2f\x65\x78\x74\x65\x6e\x73\x69\x6f\x6e\x2f\x6c\x6e\x6d\x2f\x64\ +\x65\x73\x69\x67\x6e\x2f\x6c\x69\x6e\x75\x78\x5f\x6d\x61\x67\x61\ +\x7a\x69\x6e\x2f\x69\x6d\x61\x67\x65\x73\x2f\x66\x61\x76\x69\x63\ +\x6f\x6e\x2e\x69\x63\x6f\x3c\x2f\x49\x6d\x61\x67\x65\x3e\x0a\x3c\ +\x2f\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\x68\x44\x65\x73\x63\x72\ +\x69\x70\x74\x69\x6f\x6e\x3e\x0a\ +\x00\x00\x01\x85\ +\x3c\ +\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ +\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\ +\x2d\x38\x22\x3f\x3e\x0a\x3c\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\ +\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x20\x78\x6d\x6c\ +\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x61\x39\x2e\x63\x6f\ +\x6d\x2f\x2d\x2f\x73\x70\x65\x63\x2f\x6f\x70\x65\x6e\x73\x65\x61\ +\x72\x63\x68\x2f\x31\x2e\x31\x2f\x22\x3e\x0a\x20\x20\x20\x20\x3c\ +\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x59\x6f\x75\x54\x75\x62\ +\x65\x3c\x2f\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x0a\x20\x20\ +\x20\x20\x3c\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x59\ +\x6f\x75\x54\x75\x62\x65\x3c\x2f\x44\x65\x73\x63\x72\x69\x70\x74\ +\x69\x6f\x6e\x3e\x0a\x20\x20\x20\x20\x3c\x55\x72\x6c\x20\x6d\x65\ +\x74\x68\x6f\x64\x3d\x22\x67\x65\x74\x22\x20\x74\x79\x70\x65\x3d\ +\x22\x74\x65\x78\x74\x2f\x68\x74\x6d\x6c\x22\x20\x74\x65\x6d\x70\ +\x6c\x61\x74\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\ +\x2e\x79\x6f\x75\x74\x75\x62\x65\x2e\x63\x6f\x6d\x2f\x72\x65\x73\ +\x75\x6c\x74\x73\x3f\x73\x65\x61\x72\x63\x68\x5f\x71\x75\x65\x72\ +\x79\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\x72\x6d\x73\x7d\x26\ +\x61\x6d\x70\x3b\x73\x65\x61\x72\x63\x68\x3d\x53\x65\x61\x72\x63\ +\x68\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x49\x6d\x61\x67\x65\x3e\ +\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x79\x6f\x75\x74\x75\ +\x62\x65\x2e\x63\x6f\x6d\x2f\x66\x61\x76\x69\x63\x6f\x6e\x2e\x69\ +\x63\x6f\x3c\x2f\x49\x6d\x61\x67\x65\x3e\x0a\x3c\x2f\x4f\x70\x65\ +\x6e\x53\x65\x61\x72\x63\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\ +\x6f\x6e\x3e\x0a\ +\x00\x00\x02\x1e\ +\x3c\ +\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ +\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\ +\x2d\x38\x22\x3f\x3e\x0a\x3c\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\ +\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x20\x78\x6d\x6c\ +\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x61\x39\x2e\x63\x6f\ +\x6d\x2f\x2d\x2f\x73\x70\x65\x63\x2f\x6f\x70\x65\x6e\x73\x65\x61\ +\x72\x63\x68\x2f\x31\x2e\x31\x2f\x22\x3e\x0a\x20\x20\x20\x20\x3c\ +\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x44\x65\x2d\x45\x6e\x20\ +\x42\x65\x6f\x6c\x69\x6e\x67\x75\x73\x3c\x2f\x53\x68\x6f\x72\x74\ +\x4e\x61\x6d\x65\x3e\x0a\x20\x20\x20\x20\x3c\x44\x65\x73\x63\x72\ +\x69\x70\x74\x69\x6f\x6e\x3e\x42\x65\x6f\x6c\x69\x6e\x67\x75\x73\ +\x3a\x20\x47\x65\x72\x6d\x61\x6e\x2d\x45\x6e\x67\x6c\x69\x73\x68\ +\x20\x44\x69\x63\x74\x69\x6f\x6e\x61\x72\x79\x3c\x2f\x44\x65\x73\ +\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\x20\x20\x20\x20\x3c\x55\ +\x72\x6c\x20\x6d\x65\x74\x68\x6f\x64\x3d\x22\x67\x65\x74\x22\x20\ +\x74\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x68\x74\x6d\x6c\x22\ +\x20\x74\x65\x6d\x70\x6c\x61\x74\x65\x3d\x22\x68\x74\x74\x70\x3a\ +\x2f\x2f\x64\x69\x63\x74\x2e\x74\x75\x2d\x63\x68\x65\x6d\x6e\x69\ +\x74\x7a\x2e\x64\x65\x2f\x3f\x71\x75\x65\x72\x79\x3d\x7b\x73\x65\ +\x61\x72\x63\x68\x54\x65\x72\x6d\x73\x7d\x22\x2f\x3e\x0a\x20\x20\ +\x20\x20\x3c\x55\x72\x6c\x20\x6d\x65\x74\x68\x6f\x64\x3d\x22\x67\ +\x65\x74\x22\x20\x74\x79\x70\x65\x3d\x22\x61\x70\x70\x6c\x69\x63\ +\x61\x74\x69\x6f\x6e\x2f\x78\x2d\x73\x75\x67\x67\x65\x73\x74\x69\ +\x6f\x6e\x73\x2b\x6a\x73\x6f\x6e\x22\x20\x74\x65\x6d\x70\x6c\x61\ +\x74\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x64\x69\x63\x74\x2e\ +\x74\x75\x2d\x63\x68\x65\x6d\x6e\x69\x74\x7a\x2e\x64\x65\x2f\x73\ +\x75\x67\x67\x2e\x70\x68\x70\x3f\x6a\x73\x6f\x6e\x3d\x31\x26\x61\ +\x6d\x70\x3b\x73\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\x72\x6d\ +\x73\x7d\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x49\x6d\x61\x67\x65\ +\x3e\x68\x74\x74\x70\x3a\x2f\x2f\x64\x69\x63\x74\x2e\x74\x75\x2d\ +\x63\x68\x65\x6d\x6e\x69\x74\x7a\x2e\x64\x65\x2f\x70\x69\x63\x73\ +\x2f\x62\x65\x6f\x2d\x64\x65\x2e\x70\x6e\x67\x3c\x2f\x49\x6d\x61\ +\x67\x65\x3e\x0a\x3c\x2f\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\x68\ +\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x0a\ +\x00\x00\x1b\x4f\ +\x3c\ +\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ +\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\ +\x2d\x38\x22\x3f\x3e\x0a\x3c\x4f\x70\x65\x6e\x53\x65\x61\x72\x63\ +\x68\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x20\x78\x6d\x6c\ +\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x61\x39\x2e\x63\x6f\ +\x6d\x2f\x2d\x2f\x73\x70\x65\x63\x2f\x6f\x70\x65\x6e\x73\x65\x61\ +\x72\x63\x68\x2f\x31\x2e\x31\x2f\x22\x3e\x0a\x20\x20\x20\x20\x3c\ +\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x51\x77\x61\x6e\x74\x3c\ +\x2f\x53\x68\x6f\x72\x74\x4e\x61\x6d\x65\x3e\x0a\x20\x20\x20\x20\ +\x3c\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\x51\x77\x61\ +\x6e\x74\x20\x69\x73\x20\x61\x20\x73\x65\x61\x72\x63\x68\x20\x65\ +\x6e\x67\x69\x6e\x65\x20\x74\x68\x61\x74\x20\x72\x65\x73\x70\x65\ +\x63\x74\x73\x20\x79\x6f\x75\x72\x20\x70\x72\x69\x76\x61\x63\x79\ +\x20\x61\x6e\x64\x20\x65\x61\x73\x65\x73\x20\x64\x69\x73\x63\x6f\ +\x76\x65\x72\x69\x6e\x67\x20\x61\x6e\x64\x20\x73\x68\x61\x72\x69\ +\x6e\x67\x20\x76\x69\x61\x20\x61\x20\x73\x6f\x63\x69\x61\x6c\x20\ +\x61\x70\x70\x72\x6f\x61\x63\x68\x2e\x3c\x2f\x44\x65\x73\x63\x72\ +\x69\x70\x74\x69\x6f\x6e\x3e\x0a\x20\x20\x20\x20\x3c\x55\x72\x6c\ +\x20\x6d\x65\x74\x68\x6f\x64\x3d\x22\x67\x65\x74\x22\x20\x74\x79\ +\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x68\x74\x6d\x6c\x22\x20\x74\ +\x65\x6d\x70\x6c\x61\x74\x65\x3d\x22\x68\x74\x74\x70\x73\x3a\x2f\ +\x2f\x77\x77\x77\x2e\x71\x77\x61\x6e\x74\x2e\x63\x6f\x6d\x2f\x3f\ +\x71\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\x72\x6d\x73\x7d\x26\ +\x61\x6d\x70\x3b\x63\x6c\x69\x65\x6e\x74\x3d\x6f\x70\x65\x6e\x73\ +\x65\x61\x72\x63\x68\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x55\x72\ +\x6c\x20\x6d\x65\x74\x68\x6f\x64\x3d\x22\x67\x65\x74\x22\x20\x74\ +\x79\x70\x65\x3d\x22\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\ +\x2f\x78\x2d\x73\x75\x67\x67\x65\x73\x74\x69\x6f\x6e\x73\x2b\x6a\ +\x73\x6f\x6e\x22\x20\x74\x65\x6d\x70\x6c\x61\x74\x65\x3d\x22\x68\ +\x74\x74\x70\x73\x3a\x2f\x2f\x61\x70\x69\x2e\x71\x77\x61\x6e\x74\ +\x2e\x63\x6f\x6d\x2f\x61\x70\x69\x2f\x73\x75\x67\x67\x65\x73\x74\ +\x2f\x3f\x71\x3d\x7b\x73\x65\x61\x72\x63\x68\x54\x65\x72\x6d\x73\ +\x7d\x26\x61\x6d\x70\x3b\x63\x6c\x69\x65\x6e\x74\x3d\x6f\x70\x65\ +\x6e\x73\x65\x61\x72\x63\x68\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\ +\x49\x6d\x61\x67\x65\x3e\x64\x61\x74\x61\x3a\x69\x6d\x61\x67\x65\ +\x2f\x70\x6e\x67\x3b\x62\x61\x73\x65\x36\x34\x2c\x69\x56\x42\x4f\ +\x52\x77\x30\x4b\x47\x67\x6f\x41\x41\x41\x41\x4e\x53\x55\x68\x45\ +\x55\x67\x41\x41\x41\x47\x41\x41\x41\x41\x42\x67\x43\x41\x49\x41\ +\x41\x41\x42\x74\x2b\x75\x42\x76\x41\x41\x41\x41\x47\x58\x52\x46\ +\x57\x48\x52\x54\x62\x32\x5a\x30\x64\x32\x46\x79\x5a\x51\x42\x42\ +\x5a\x47\x39\x69\x5a\x53\x42\x4a\x62\x57\x46\x6e\x5a\x56\x4a\x6c\ +\x59\x57\x52\x35\x63\x63\x6c\x6c\x50\x41\x41\x41\x45\x6c\x52\x4a\ +\x52\x45\x46\x55\x65\x4e\x72\x63\x6e\x58\x32\x51\x46\x4f\x57\x64\ +\x78\x35\x2f\x6e\x36\x64\x64\x35\x33\x32\x56\x66\x59\x58\x63\x56\ +\x46\x6c\x6c\x63\x59\x45\x47\x52\x5a\x55\x55\x73\x76\x65\x53\x38\ +\x75\x76\x4d\x46\x52\x4b\x2f\x4b\x4f\x30\x33\x51\x57\x48\x66\x6e\ +\x50\x78\x63\x54\x72\x36\x34\x75\x5a\x77\x36\x74\x2b\x38\x4f\x69\ +\x67\x76\x46\x53\x64\x51\x6c\x42\x37\x79\x7a\x72\x4c\x6f\x68\x6c\ +\x47\x61\x39\x45\x55\x53\x39\x4a\x69\x5a\x67\x4b\x4f\x61\x67\x6f\ +\x4a\x43\x6f\x67\x79\x30\x70\x51\x59\x4e\x6c\x6c\x57\x58\x62\x5a\ +\x65\x5a\x39\x2b\x37\x33\x74\x36\x5a\x72\x61\x6e\x70\x2f\x76\x70\ +\x37\x70\x6e\x5a\x42\x57\x5a\x39\x71\x75\x6e\x71\x37\x65\x6d\x5a\ +\x36\x66\x37\x4d\x39\x2f\x66\x39\x2f\x5a\x36\x6e\x58\x34\x43\x4a\ +\x6a\x41\x41\x73\x54\x64\x64\x31\x55\x47\x75\x44\x45\x49\x4b\x36\ +\x61\x62\x55\x64\x69\x50\x4d\x51\x36\x46\x6d\x68\x55\x77\x4d\x61\ +\x61\x4c\x77\x6e\x44\x65\x45\x70\x76\x49\x7a\x77\x48\x47\x62\x4b\ +\x39\x36\x51\x4e\x54\x33\x68\x42\x30\x31\x66\x56\x74\x6d\x2f\x34\ +\x34\x32\x73\x34\x48\x50\x77\x57\x32\x37\x48\x51\x56\x34\x79\x4f\ +\x51\x51\x52\x65\x51\x50\x42\x54\x6a\x41\x4e\x7a\x77\x51\x73\x56\ +\x66\x30\x4d\x34\x4b\x53\x2f\x56\x77\x55\x6f\x4b\x64\x46\x4f\x77\ +\x44\x34\x4a\x51\x68\x54\x74\x63\x4d\x79\x50\x72\x51\x63\x46\x43\ +\x69\x4d\x32\x57\x49\x49\x6b\x62\x49\x4f\x30\x50\x46\x50\x4d\x68\ +\x67\x67\x63\x77\x6f\x4e\x70\x2b\x67\x33\x47\x52\x4b\x2f\x32\x6b\ +\x73\x49\x38\x47\x4e\x39\x4e\x77\x48\x51\x4b\x74\x46\x66\x36\x36\ +\x4d\x7a\x6b\x36\x41\x39\x44\x73\x30\x6a\x48\x58\x49\x2b\x55\x45\ +\x4c\x65\x35\x43\x30\x6a\x34\x41\x55\x6f\x44\x6a\x6a\x59\x6e\x68\ +\x41\x45\x56\x56\x2b\x30\x57\x79\x68\x71\x5a\x6b\x78\x72\x6b\x65\ +\x43\x34\x71\x46\x39\x39\x4c\x77\x5a\x6c\x4e\x54\x48\x69\x78\x71\ +\x50\x6b\x59\x59\x54\x2b\x64\x6d\x69\x34\x36\x35\x6b\x70\x4c\x32\ +\x30\x63\x49\x75\x4a\x42\x38\x43\x2b\x52\x56\x36\x59\x54\x55\x45\ +\x4f\x76\x37\x48\x4d\x49\x42\x68\x49\x52\x63\x41\x4e\x46\x50\x68\ +\x64\x32\x56\x56\x4b\x71\x33\x51\x72\x6e\x73\x43\x51\x67\x79\x38\ +\x41\x35\x4f\x71\x52\x46\x41\x31\x47\x46\x6e\x56\x67\x48\x7a\x51\ +\x79\x49\x65\x59\x39\x44\x61\x6b\x6e\x73\x6a\x6a\x41\x41\x52\x41\ +\x35\x68\x71\x49\x49\x4d\x63\x42\x6d\x6f\x4d\x73\x68\x35\x63\x39\ +\x76\x6a\x45\x68\x4d\x36\x4b\x47\x66\x48\x63\x4d\x59\x2b\x4c\x67\ +\x51\x31\x5a\x4d\x52\x43\x4a\x56\x4d\x36\x6f\x4b\x6b\x4a\x4e\x4f\ +\x79\x63\x7a\x55\x45\x53\x36\x31\x42\x51\x4f\x79\x34\x50\x41\x45\ +\x5a\x48\x6b\x56\x30\x69\x78\x6b\x65\x59\x44\x6e\x46\x45\x46\x57\ +\x6b\x78\x4b\x72\x36\x70\x56\x6d\x53\x52\x35\x39\x67\x77\x45\x62\ +\x72\x55\x48\x6e\x68\x46\x49\x56\x6f\x79\x6f\x41\x32\x65\x68\x59\ +\x2f\x32\x51\x7a\x7a\x7a\x4f\x5a\x48\x51\x34\x63\x6c\x51\x49\x79\ +\x74\x34\x63\x55\x42\x52\x6d\x44\x46\x4b\x4c\x35\x77\x69\x64\x6a\ +\x4e\x42\x68\x51\x56\x62\x38\x35\x41\x6d\x30\x38\x2b\x6a\x74\x73\ +\x35\x4c\x50\x43\x71\x46\x4a\x41\x56\x68\x7a\x57\x5a\x65\x7a\x45\ +\x66\x48\x49\x4c\x6e\x70\x4e\x77\x56\x41\x33\x49\x75\x6b\x61\x6a\ +\x2b\x4a\x7a\x47\x49\x34\x59\x58\x49\x46\x2b\x44\x53\x7a\x4a\x77\ +\x58\x51\x44\x39\x41\x35\x61\x53\x6c\x55\x55\x4e\x6d\x43\x6f\x43\ +\x35\x45\x61\x48\x45\x66\x61\x77\x79\x52\x39\x41\x50\x65\x57\x43\ +\x6f\x32\x70\x41\x47\x52\x6b\x6b\x78\x66\x78\x63\x41\x4b\x4b\x53\ +\x56\x31\x42\x44\x51\x7a\x6a\x49\x52\x78\x6b\x36\x77\x6d\x4a\x31\ +\x77\x57\x71\x6c\x46\x45\x52\x50\x55\x62\x42\x37\x4a\x6f\x7a\x38\ +\x41\x52\x48\x70\x34\x41\x55\x75\x75\x59\x33\x4f\x76\x46\x77\x38\ +\x7a\x6c\x6f\x42\x4b\x52\x70\x49\x53\x67\x61\x52\x68\x47\x68\x4d\ +\x74\x71\x59\x46\x67\x33\x67\x79\x2f\x34\x79\x77\x64\x43\x4f\x4c\ +\x53\x64\x47\x56\x4d\x35\x49\x41\x6b\x77\x48\x2f\x75\x70\x43\x36\ +\x30\x63\x71\x69\x4b\x6b\x59\x2b\x67\x4e\x7a\x6f\x73\x43\x50\x66\ +\x5a\x2b\x47\x65\x6b\x68\x43\x71\x41\x5a\x53\x54\x51\x46\x59\x47\ +\x4b\x63\x46\x41\x49\x36\x68\x41\x67\x38\x58\x4a\x6e\x6d\x35\x6f\ +\x47\x73\x75\x48\x55\x50\x35\x41\x69\x42\x6c\x46\x47\x63\x71\x58\ +\x31\x47\x47\x31\x35\x36\x69\x79\x53\x41\x54\x4d\x72\x55\x7a\x2f\ +\x65\x6d\x61\x4e\x47\x36\x50\x61\x41\x52\x48\x70\x49\x43\x33\x46\ +\x66\x72\x34\x5a\x5a\x51\x65\x70\x56\x6c\x71\x6e\x4b\x77\x4b\x6b\ +\x36\x6b\x44\x41\x67\x53\x50\x41\x74\x41\x42\x79\x4d\x70\x44\x31\ +\x45\x70\x54\x43\x70\x4b\x50\x38\x76\x50\x7a\x62\x4d\x52\x33\x4d\ +\x79\x4d\x74\x6c\x45\x49\x71\x79\x56\x41\x50\x48\x38\x4a\x53\x39\ +\x43\x42\x68\x53\x75\x7a\x43\x64\x6c\x42\x34\x77\x31\x2f\x54\x52\ +\x53\x2b\x39\x69\x76\x31\x34\x44\x49\x31\x64\x41\x72\x6e\x53\x47\ +\x44\x44\x72\x47\x63\x67\x53\x42\x4b\x48\x49\x44\x4a\x49\x6c\x41\ +\x78\x45\x72\x4a\x51\x54\x7a\x48\x6b\x69\x6e\x68\x51\x4e\x4e\x51\ +\x6f\x41\x4d\x54\x64\x41\x30\x75\x48\x7a\x39\x47\x71\x49\x6c\x6e\ +\x6f\x69\x7a\x4e\x49\x44\x69\x71\x4e\x52\x31\x55\x6c\x6b\x2f\x6f\ +\x55\x65\x64\x6d\x4a\x69\x4f\x54\x53\x43\x57\x4d\x79\x49\x42\x63\ +\x66\x65\x65\x7a\x65\x77\x74\x30\x43\x70\x30\x69\x31\x45\x35\x5a\ +\x41\x55\x6c\x5a\x49\x47\x59\x4e\x4c\x6b\x49\x4f\x6d\x77\x75\x30\ +\x45\x62\x46\x44\x51\x58\x59\x36\x5a\x70\x53\x35\x42\x5a\x64\x2f\ +\x45\x55\x53\x68\x44\x2b\x69\x2f\x55\x4f\x6d\x6f\x32\x77\x59\x31\ +\x36\x49\x69\x75\x77\x6e\x65\x2b\x65\x42\x4a\x6c\x42\x69\x31\x39\ +\x4a\x46\x33\x4c\x36\x4c\x49\x4d\x46\x63\x46\x41\x67\x79\x56\x6a\ +\x50\x65\x79\x43\x48\x52\x75\x54\x6e\x70\x2f\x6e\x2f\x79\x7a\x33\ +\x78\x74\x4a\x36\x32\x30\x74\x61\x4f\x46\x78\x62\x6e\x31\x5a\x51\ +\x74\x63\x47\x4c\x52\x39\x74\x61\x62\x34\x78\x78\x5a\x50\x55\x64\ +\x56\x59\x5a\x61\x55\x66\x4d\x61\x65\x71\x58\x5a\x30\x62\x66\x32\ +\x2b\x49\x6d\x39\x66\x37\x6f\x53\x68\x7a\x62\x6f\x6e\x4e\x6c\x4b\ +\x6a\x2b\x2b\x32\x46\x62\x53\x5a\x55\x31\x43\x78\x45\x58\x48\x48\ +\x41\x53\x77\x34\x53\x6c\x42\x30\x45\x49\x6d\x73\x78\x51\x76\x68\ +\x79\x45\x41\x68\x53\x48\x57\x4b\x6b\x68\x6b\x70\x49\x35\x39\x55\ +\x39\x48\x52\x61\x50\x6c\x6b\x74\x6f\x36\x53\x69\x6e\x78\x6f\x65\ +\x76\x4b\x57\x72\x31\x34\x33\x52\x50\x75\x6b\x41\x42\x7a\x67\x73\ +\x4a\x53\x49\x6a\x66\x77\x55\x52\x4f\x78\x50\x55\x70\x66\x66\x70\ +\x30\x5a\x33\x54\x4a\x6a\x50\x64\x63\x6f\x69\x37\x52\x4b\x74\x4e\ +\x43\x6f\x47\x49\x58\x75\x78\x43\x32\x49\x6e\x6b\x74\x36\x44\x6f\ +\x61\x44\x69\x36\x4e\x74\x4a\x34\x42\x78\x2b\x38\x50\x68\x44\x73\ +\x39\x54\x35\x67\x7a\x43\x67\x68\x66\x54\x77\x70\x37\x49\x39\x4c\ +\x48\x31\x63\x43\x61\x46\x54\x47\x5a\x62\x64\x36\x30\x4a\x75\x52\ +\x66\x4b\x41\x4e\x4e\x57\x45\x70\x4f\x64\x45\x51\x31\x6c\x67\x39\ +\x69\x42\x68\x63\x56\x47\x71\x49\x4f\x2f\x46\x4e\x71\x43\x54\x4c\ +\x38\x51\x41\x34\x7a\x49\x45\x34\x48\x56\x38\x6f\x57\x6d\x32\x6c\ +\x33\x48\x72\x74\x4e\x73\x54\x48\x42\x71\x4a\x74\x39\x38\x56\x61\ +\x37\x71\x38\x68\x66\x42\x51\x74\x50\x5a\x62\x37\x33\x35\x48\x30\ +\x36\x34\x4a\x36\x33\x6d\x4f\x7a\x66\x78\x72\x70\x6e\x6e\x5a\x75\ +\x79\x6f\x4d\x52\x70\x76\x4d\x51\x74\x35\x47\x44\x6e\x4b\x38\x5a\ +\x6c\x51\x41\x52\x75\x31\x70\x34\x7a\x6e\x39\x79\x62\x39\x46\x36\ +\x72\x4b\x2b\x72\x45\x48\x31\x6d\x66\x48\x65\x36\x54\x5a\x62\x43\ +\x6d\x6b\x5a\x32\x58\x32\x6a\x79\x59\x68\x73\x48\x47\x71\x39\x35\ +\x50\x42\x42\x62\x4f\x2f\x50\x42\x35\x67\x6c\x68\x2f\x36\x6e\x45\ +\x6a\x39\x30\x77\x6d\x59\x42\x38\x47\x57\x45\x6e\x2b\x6c\x4e\x32\ +\x76\x57\x39\x47\x51\x39\x37\x75\x77\x35\x7a\x64\x6a\x74\x4c\x48\ +\x6a\x5a\x41\x70\x6e\x2b\x42\x45\x73\x64\x76\x4e\x5a\x75\x32\x66\ +\x59\x4e\x69\x51\x58\x6f\x77\x70\x49\x34\x62\x35\x6a\x76\x5a\x56\ +\x72\x79\x7a\x6f\x32\x7a\x55\x72\x64\x48\x42\x72\x35\x6d\x38\x62\ +\x61\x48\x74\x6a\x61\x63\x4e\x54\x4e\x41\x72\x37\x6a\x62\x51\x5a\ +\x73\x5a\x62\x41\x6d\x5a\x56\x59\x52\x69\x70\x48\x7a\x6d\x71\x6a\ +\x56\x69\x6d\x51\x4f\x35\x73\x65\x6f\x7a\x78\x49\x48\x47\x58\x4f\ +\x2f\x43\x52\x50\x52\x43\x2b\x66\x41\x4a\x77\x71\x6d\x68\x65\x62\ +\x6f\x70\x42\x61\x49\x67\x4b\x74\x4e\x71\x54\x72\x30\x59\x57\x50\ +\x4c\x78\x6a\x34\x4e\x54\x39\x4c\x61\x4b\x79\x74\x50\x58\x6a\x58\ +\x51\x4f\x74\x75\x44\x47\x73\x6d\x6a\x48\x34\x68\x66\x69\x44\x71\ +\x6f\x6c\x2b\x48\x7a\x6e\x30\x63\x67\x78\x76\x36\x5a\x36\x64\x32\ +\x69\x6e\x51\x6b\x53\x35\x63\x31\x51\x30\x30\x54\x4d\x61\x73\x69\ +\x67\x4f\x68\x6f\x38\x2b\x70\x58\x4d\x4b\x44\x4c\x64\x32\x49\x48\ +\x4b\x32\x6a\x35\x76\x47\x31\x59\x53\x75\x61\x61\x55\x32\x4b\x67\ +\x4b\x6b\x59\x4a\x50\x58\x56\x59\x4f\x65\x70\x54\x47\x37\x74\x2b\ +\x66\x65\x49\x6a\x46\x50\x2b\x51\x44\x43\x68\x65\x6c\x76\x74\x77\ +\x6c\x4a\x56\x53\x56\x58\x34\x44\x4f\x74\x7a\x62\x4e\x50\x41\x32\ +\x32\x7a\x41\x41\x4c\x6e\x2f\x44\x55\x72\x71\x70\x5a\x61\x64\x33\ +\x75\x48\x6b\x77\x2b\x6a\x2f\x35\x45\x4d\x62\x6b\x63\x66\x59\x42\ +\x75\x63\x6d\x48\x48\x53\x54\x4c\x42\x32\x64\x33\x6b\x43\x6b\x62\ +\x65\x47\x63\x79\x43\x4d\x6d\x6c\x44\x36\x45\x6a\x76\x51\x31\x72\ +\x58\x71\x48\x34\x44\x6e\x43\x6c\x57\x70\x68\x5a\x73\x71\x70\x70\ +\x52\x38\x32\x4d\x44\x73\x69\x48\x50\x45\x52\x45\x56\x68\x41\x7a\ +\x39\x69\x62\x4d\x6a\x51\x41\x4e\x47\x4a\x4e\x4e\x50\x70\x63\x49\ +\x34\x33\x75\x47\x69\x50\x49\x32\x68\x4f\x6c\x45\x2b\x31\x2b\x42\ +\x37\x73\x58\x2b\x5a\x57\x55\x55\x6f\x4e\x75\x39\x47\x66\x33\x6d\ +\x7a\x4c\x48\x68\x35\x49\x53\x7a\x76\x50\x59\x51\x45\x53\x49\x6e\ +\x72\x7a\x39\x75\x4a\x32\x67\x48\x77\x31\x49\x67\x54\x42\x43\x4b\ +\x62\x79\x35\x6c\x61\x41\x72\x78\x48\x65\x47\x31\x56\x34\x47\x4f\ +\x79\x61\x67\x76\x76\x44\x30\x33\x64\x76\x50\x45\x2b\x64\x37\x34\ +\x78\x4b\x4a\x73\x75\x6b\x55\x53\x43\x5a\x72\x36\x65\x4f\x77\x4c\ +\x4a\x79\x4f\x72\x69\x50\x79\x37\x47\x74\x54\x55\x52\x31\x41\x38\ +\x52\x30\x37\x2f\x55\x2b\x52\x7a\x4e\x5a\x51\x49\x47\x53\x33\x47\ +\x72\x48\x37\x68\x61\x74\x45\x70\x74\x42\x57\x4e\x38\x37\x59\x73\ +\x2b\x2f\x50\x76\x48\x50\x78\x74\x6d\x62\x72\x35\x4e\x4d\x33\x6b\ +\x57\x43\x36\x4e\x46\x78\x42\x53\x2b\x4f\x41\x55\x5a\x6f\x54\x58\ +\x64\x30\x57\x62\x4a\x2b\x58\x41\x65\x54\x46\x79\x58\x67\x79\x2f\ +\x4c\x50\x4b\x33\x64\x71\x73\x52\x69\x4a\x79\x39\x4d\x77\x49\x67\ +\x35\x75\x7a\x50\x67\x45\x76\x58\x42\x43\x5a\x64\x54\x32\x59\x46\ +\x72\x76\x32\x75\x46\x75\x30\x46\x56\x37\x76\x39\x39\x65\x49\x6c\ +\x42\x79\x2b\x4d\x76\x58\x61\x71\x31\x49\x6d\x54\x68\x44\x43\x65\ +\x73\x71\x6d\x57\x6b\x69\x67\x59\x59\x65\x79\x73\x77\x43\x2b\x2b\ +\x54\x6d\x4a\x4b\x50\x2b\x66\x75\x78\x4d\x56\x48\x47\x74\x70\x38\ +\x51\x73\x78\x41\x6f\x43\x53\x70\x38\x66\x66\x4a\x79\x51\x76\x54\ +\x6b\x63\x6d\x42\x71\x6e\x58\x30\x61\x33\x32\x62\x51\x58\x32\x30\ +\x5a\x39\x59\x4d\x64\x48\x6d\x4f\x42\x79\x67\x79\x4c\x32\x51\x62\ +\x42\x4c\x48\x73\x78\x2f\x35\x5a\x66\x49\x78\x63\x44\x4e\x6f\x4d\ +\x69\x42\x35\x35\x73\x34\x77\x4c\x73\x41\x42\x4b\x75\x58\x54\x39\ +\x75\x59\x68\x79\x78\x31\x5a\x51\x4e\x79\x33\x47\x73\x74\x74\x76\ +\x75\x63\x31\x33\x4d\x7a\x56\x56\x6c\x74\x46\x47\x5a\x48\x47\x51\ +\x6c\x4f\x50\x73\x43\x71\x4a\x48\x33\x6a\x44\x4c\x35\x62\x4a\x4a\ +\x52\x43\x42\x48\x50\x71\x32\x75\x33\x72\x42\x5a\x6a\x79\x34\x41\ +\x39\x64\x52\x75\x61\x57\x74\x66\x33\x39\x52\x61\x37\x62\x74\x32\ +\x4a\x79\x2b\x36\x64\x6a\x57\x4b\x4c\x38\x68\x4a\x6c\x42\x79\x63\ +\x68\x6c\x4c\x57\x76\x59\x41\x4a\x78\x6c\x55\x2b\x71\x7a\x61\x44\ +\x2b\x6d\x73\x34\x30\x49\x70\x6e\x6a\x6c\x79\x61\x4c\x73\x6d\x32\ +\x4e\x58\x76\x54\x55\x7a\x34\x4b\x6f\x69\x36\x51\x33\x51\x66\x33\ +\x33\x57\x47\x61\x63\x5a\x4d\x50\x5a\x6c\x53\x48\x67\x46\x61\x30\ +\x74\x71\x79\x50\x4e\x68\x73\x6e\x44\x46\x77\x42\x32\x66\x48\x68\ +\x4b\x4d\x4d\x54\x47\x56\x42\x42\x56\x4e\x53\x6b\x53\x39\x38\x69\ +\x36\x58\x72\x79\x74\x7a\x37\x6c\x55\x78\x7a\x36\x57\x44\x63\x41\ +\x45\x34\x49\x72\x49\x45\x56\x31\x72\x6e\x77\x2f\x4d\x2b\x57\x70\ +\x49\x44\x64\x41\x47\x62\x49\x39\x61\x39\x31\x66\x72\x30\x2f\x35\ +\x46\x4a\x32\x6f\x71\x36\x4d\x72\x45\x44\x4a\x4f\x77\x68\x46\x33\ +\x50\x6b\x66\x6f\x78\x33\x2b\x59\x53\x37\x6c\x6e\x4d\x54\x6b\x4a\ +\x4d\x79\x4d\x45\x4f\x6a\x69\x34\x46\x48\x4b\x50\x52\x4f\x33\x64\ +\x42\x4f\x71\x37\x33\x58\x6c\x64\x4e\x30\x79\x4b\x78\x67\x6e\x63\ +\x79\x70\x6f\x7a\x6b\x5a\x57\x4f\x33\x4c\x42\x6e\x34\x4b\x44\x7a\ +\x43\x59\x43\x44\x72\x67\x50\x37\x68\x6f\x4c\x71\x75\x2f\x33\x56\ +\x43\x71\x4e\x32\x64\x51\x73\x30\x70\x34\x69\x77\x42\x79\x55\x31\ +\x6c\x64\x7a\x56\x6f\x43\x35\x2b\x42\x45\x7a\x51\x45\x4d\x41\x6a\ +\x41\x4f\x37\x58\x51\x52\x79\x41\x54\x67\x32\x6b\x64\x4c\x41\x45\ +\x4f\x6f\x74\x44\x55\x50\x63\x4e\x57\x33\x57\x4d\x34\x78\x4b\x69\ +\x43\x4e\x4f\x53\x48\x6e\x59\x34\x71\x55\x70\x51\x31\x67\x6b\x78\ +\x75\x7a\x59\x51\x49\x51\x32\x59\x79\x63\x6d\x69\x61\x6f\x34\x41\ +\x74\x46\x32\x48\x62\x2b\x66\x70\x34\x43\x5a\x6f\x59\x46\x77\x48\ +\x67\x7a\x6f\x6f\x64\x33\x32\x39\x63\x77\x34\x41\x4d\x70\x7a\x6f\ +\x6d\x76\x7a\x41\x53\x31\x6f\x43\x6b\x74\x32\x56\x4e\x5a\x46\x67\ +\x54\x2b\x66\x79\x69\x59\x77\x77\x59\x49\x62\x69\x67\x77\x61\x61\ +\x48\x54\x70\x38\x52\x77\x63\x4a\x79\x7a\x75\x79\x2b\x63\x2b\x39\ +\x70\x49\x4e\x6a\x6d\x70\x58\x52\x6e\x46\x42\x51\x51\x55\x54\x46\ +\x71\x45\x69\x49\x77\x48\x5a\x64\x68\x30\x51\x41\x4e\x4b\x4b\x49\ +\x4c\x68\x37\x30\x71\x67\x37\x66\x4c\x55\x64\x54\x61\x4f\x4b\x30\ +\x44\x6a\x4d\x41\x2f\x46\x34\x44\x30\x78\x64\x38\x36\x35\x47\x4f\ +\x4f\x51\x46\x6f\x65\x55\x75\x4c\x47\x56\x41\x77\x4b\x66\x6c\x75\ +\x6e\x31\x52\x56\x46\x30\x43\x66\x44\x37\x70\x30\x57\x6e\x54\x6a\ +\x67\x6f\x78\x69\x32\x51\x4d\x4d\x48\x56\x33\x4b\x6e\x79\x65\x70\ +\x73\x2b\x36\x46\x61\x39\x65\x4d\x4c\x31\x31\x6a\x62\x56\x78\x63\ +\x59\x69\x6d\x76\x4e\x64\x4a\x31\x43\x53\x66\x4b\x45\x35\x6b\x6c\ +\x7a\x61\x65\x53\x48\x6f\x4e\x78\x6c\x74\x49\x51\x47\x48\x36\x55\ +\x43\x49\x4d\x35\x30\x70\x61\x33\x4e\x70\x64\x31\x70\x78\x79\x42\ +\x35\x74\x31\x51\x52\x56\x74\x6c\x48\x66\x61\x6d\x4c\x5a\x30\x72\ +\x67\x48\x41\x57\x4b\x39\x39\x31\x48\x55\x34\x56\x73\x37\x36\x57\ +\x46\x57\x59\x4a\x6b\x4b\x69\x42\x72\x31\x4c\x44\x36\x53\x78\x66\ +\x58\x75\x75\x71\x4e\x6b\x75\x41\x68\x4b\x38\x57\x49\x42\x78\x6f\ +\x4f\x4f\x76\x6e\x79\x32\x74\x66\x52\x70\x55\x42\x77\x68\x36\x6b\ +\x36\x56\x38\x70\x51\x6a\x6a\x51\x38\x75\x57\x31\x6e\x76\x4d\x35\ +\x73\x31\x72\x78\x46\x61\x4e\x59\x52\x4d\x48\x53\x67\x42\x6b\x36\ +\x66\x57\x4b\x75\x6f\x4d\x42\x6c\x74\x4e\x75\x76\x62\x75\x6a\x49\ +\x30\x6c\x68\x49\x74\x36\x48\x47\x78\x66\x51\x38\x4d\x69\x41\x39\ +\x45\x76\x56\x4b\x5a\x4e\x69\x6e\x4c\x59\x42\x41\x4e\x6a\x56\x58\ +\x41\x48\x30\x32\x50\x75\x48\x36\x57\x6c\x70\x53\x70\x39\x49\x6f\ +\x48\x41\x68\x41\x74\x68\x6e\x46\x35\x71\x47\x49\x56\x34\x68\x70\ +\x50\x5a\x37\x6e\x4a\x47\x52\x37\x69\x4d\x47\x68\x75\x53\x47\x69\ +\x68\x4f\x41\x56\x52\x47\x78\x53\x57\x30\x77\x76\x36\x4b\x45\x37\ +\x54\x54\x6f\x4c\x79\x36\x38\x75\x52\x70\x56\x2b\x6a\x31\x69\x65\ +\x36\x51\x55\x41\x52\x30\x66\x6d\x68\x6f\x49\x75\x58\x6e\x52\x50\ +\x5a\x33\x51\x77\x47\x77\x79\x58\x33\x2b\x6f\x51\x51\x70\x41\x4d\ +\x53\x46\x30\x39\x55\x45\x55\x69\x53\x30\x41\x30\x4e\x44\x51\x6e\ +\x41\x42\x30\x34\x53\x2f\x6f\x68\x64\x61\x6a\x6e\x57\x46\x31\x67\ +\x75\x6c\x62\x32\x32\x46\x35\x70\x6f\x51\x30\x6e\x4d\x63\x38\x64\ +\x49\x71\x73\x48\x56\x56\x45\x75\x5a\x67\x48\x36\x59\x4e\x2b\x63\ +\x41\x48\x52\x77\x32\x48\x47\x57\x57\x49\x4e\x36\x6c\x67\x55\x79\ +\x46\x57\x31\x72\x34\x73\x49\x42\x42\x79\x44\x6b\x6f\x71\x41\x65\ +\x76\x2f\x4f\x69\x5a\x72\x6b\x6f\x35\x30\x4d\x4d\x65\x31\x43\x71\ +\x33\x71\x33\x36\x6c\x79\x65\x2f\x63\x48\x51\x74\x6b\x5a\x37\x68\ +\x38\x42\x77\x76\x7a\x75\x39\x64\x52\x4f\x69\x61\x38\x49\x77\x64\ +\x55\x45\x46\x4f\x32\x68\x49\x2f\x51\x47\x61\x55\x54\x57\x4f\x68\ +\x66\x6c\x33\x76\x49\x76\x72\x6c\x48\x30\x2f\x5a\x54\x4d\x65\x67\ +\x6b\x37\x2b\x61\x47\x57\x74\x6e\x58\x70\x66\x39\x58\x50\x4e\x43\ +\x78\x2f\x30\x66\x5a\x53\x48\x6d\x6c\x38\x67\x30\x30\x34\x43\x4b\ +\x62\x39\x37\x7a\x56\x70\x30\x44\x2b\x70\x57\x70\x6f\x47\x6e\x54\ +\x4d\x56\x39\x79\x75\x67\x39\x75\x69\x7a\x77\x41\x47\x52\x31\x31\ +\x62\x35\x38\x75\x65\x46\x41\x2b\x76\x6f\x70\x76\x50\x6e\x79\x6f\ +\x6e\x6e\x50\x5a\x7a\x34\x38\x4e\x46\x71\x76\x45\x61\x64\x4d\x70\ +\x6c\x58\x38\x73\x30\x39\x68\x46\x75\x46\x52\x68\x47\x63\x39\x34\ +\x41\x56\x4a\x76\x47\x76\x43\x33\x6f\x66\x4a\x68\x66\x2b\x71\x46\ +\x35\x2b\x73\x57\x30\x47\x76\x48\x42\x6d\x32\x6d\x55\x33\x4c\x69\ +\x78\x5a\x32\x59\x6b\x61\x38\x42\x4f\x51\x43\x74\x48\x76\x43\x33\ +\x6f\x56\x52\x5a\x6d\x59\x42\x74\x71\x44\x35\x46\x64\x48\x42\x34\ +\x78\x4d\x68\x66\x46\x74\x4f\x78\x74\x76\x6e\x58\x45\x2b\x77\x5a\ +\x47\x35\x41\x74\x68\x64\x6b\x42\x59\x52\x74\x53\x62\x76\x38\x7a\ +\x72\x79\x35\x65\x53\x74\x62\x69\x35\x52\x56\x6a\x4b\x6c\x57\x66\ +\x49\x6e\x70\x36\x33\x33\x36\x62\x36\x5a\x67\x4e\x65\x37\x4d\x7a\ +\x75\x31\x76\x6c\x51\x37\x69\x51\x33\x46\x7a\x6c\x41\x55\x6a\x4b\ +\x69\x42\x4e\x2f\x4f\x4a\x64\x32\x46\x4b\x62\x55\x32\x32\x2f\x56\ +\x57\x37\x66\x6a\x78\x55\x4f\x66\x48\x6a\x32\x64\x74\x4a\x70\x4f\ +\x6d\x58\x78\x49\x32\x52\x32\x33\x72\x30\x56\x34\x2f\x2b\x45\x4f\ +\x35\x66\x59\x37\x6e\x42\x57\x6a\x70\x6d\x72\x4a\x38\x2f\x48\x4a\ +\x4c\x38\x64\x56\x53\x63\x6c\x4d\x58\x68\x49\x63\x35\x51\x2f\x7a\ +\x39\x4a\x62\x36\x6f\x54\x4d\x63\x54\x7a\x33\x33\x33\x69\x63\x32\ +\x30\x7a\x45\x62\x31\x67\x36\x75\x44\x34\x6e\x78\x74\x5a\x42\x30\ +\x6a\x36\x66\x39\x55\x7a\x41\x64\x74\x56\x78\x45\x68\x6e\x42\x4f\ +\x58\x63\x68\x4d\x6c\x71\x41\x6b\x52\x6b\x5a\x56\x57\x62\x5a\x31\ +\x58\x4f\x6e\x2f\x71\x4a\x64\x41\x65\x2b\x54\x56\x76\x51\x6e\x42\ +\x39\x65\x77\x46\x4d\x62\x76\x6a\x64\x6b\x38\x73\x51\x48\x78\x4d\ +\x41\x77\x47\x7a\x39\x4f\x43\x6a\x54\x75\x47\x55\x43\x30\x71\x64\ +\x4f\x6a\x74\x73\x44\x37\x51\x58\x64\x71\x41\x36\x71\x42\x75\x2f\ +\x73\x2f\x73\x33\x78\x38\x35\x50\x75\x6f\x35\x2b\x75\x57\x52\x33\ +\x33\x45\x48\x74\x44\x33\x4a\x4f\x41\x79\x6f\x76\x46\x4b\x64\x66\ +\x77\x4f\x55\x69\x7a\x76\x64\x4f\x34\x5a\x54\x56\x6a\x49\x4b\x51\ +\x48\x42\x74\x7a\x42\x74\x72\x56\x4e\x53\x4e\x4d\x35\x37\x57\x50\ +\x50\x2f\x66\x59\x41\x4c\x73\x50\x4d\x62\x76\x66\x48\x51\x76\x61\ +\x4f\x76\x46\x65\x77\x78\x32\x59\x56\x4f\x35\x62\x66\x2b\x38\x55\ +\x6a\x71\x30\x52\x7a\x43\x69\x56\x59\x76\x2f\x6d\x57\x31\x65\x4c\ +\x6b\x53\x38\x64\x6f\x2f\x7a\x70\x37\x69\x54\x4b\x35\x2b\x35\x6f\ +\x67\x4d\x6a\x42\x66\x54\x7a\x6f\x35\x76\x58\x55\x62\x62\x66\x37\ +\x6a\x30\x55\x35\x7a\x4f\x68\x71\x4d\x61\x71\x49\x7a\x75\x4a\x4f\ +\x59\x6e\x59\x76\x79\x4d\x66\x74\x72\x6b\x7a\x6b\x5a\x46\x5a\x30\ +\x2b\x79\x31\x50\x2b\x2b\x34\x57\x30\x59\x79\x75\x4d\x43\x50\x73\ +\x78\x7a\x35\x30\x45\x4b\x4f\x7a\x4c\x56\x70\x6b\x65\x66\x53\x36\ +\x48\x6c\x2f\x35\x4f\x47\x39\x41\x68\x4c\x61\x6e\x34\x46\x6c\x76\ +\x35\x42\x55\x65\x2b\x31\x74\x35\x31\x38\x75\x2b\x75\x78\x68\x71\ +\x6d\x68\x64\x74\x4a\x39\x77\x6b\x6f\x54\x79\x7a\x56\x64\x32\x34\ +\x36\x58\x4c\x54\x75\x65\x2b\x2f\x33\x72\x57\x37\x4d\x69\x5a\x43\ +\x4e\x2b\x68\x63\x71\x30\x37\x48\x41\x4e\x4f\x67\x55\x39\x4f\x50\ +\x79\x75\x6b\x4f\x39\x38\x78\x50\x74\x77\x58\x4b\x2b\x6b\x71\x50\ +\x4e\x6f\x55\x4c\x67\x47\x7a\x33\x48\x62\x6f\x43\x41\x70\x59\x37\ +\x38\x50\x52\x45\x50\x4c\x4f\x30\x42\x38\x39\x39\x64\x37\x54\x78\ +\x6d\x69\x34\x2b\x51\x68\x6a\x78\x6c\x72\x39\x32\x70\x2f\x7a\x4d\ +\x56\x69\x72\x43\x58\x5a\x62\x4f\x78\x4a\x66\x6e\x48\x33\x6e\x31\ +\x50\x53\x4f\x6a\x75\x78\x47\x78\x74\x57\x74\x44\x49\x4d\x70\x67\ +\x51\x44\x33\x52\x75\x46\x6e\x37\x2f\x46\x74\x48\x49\x35\x47\x4c\ +\x75\x55\x41\x39\x2b\x53\x39\x62\x33\x4f\x36\x49\x67\x6e\x77\x41\ +\x38\x4c\x79\x36\x39\x7a\x33\x66\x66\x5a\x58\x53\x6d\x55\x41\x73\ +\x68\x68\x7a\x50\x4a\x7a\x74\x33\x75\x6e\x50\x30\x66\x30\x59\x68\ +\x52\x77\x56\x58\x7a\x70\x39\x64\x4f\x69\x2f\x39\x62\x76\x69\x78\ +\x64\x30\x35\x6e\x41\x74\x31\x36\x74\x45\x2b\x4c\x72\x4e\x53\x44\ +\x43\x33\x45\x63\x41\x54\x6f\x4b\x6b\x50\x76\x44\x68\x6e\x67\x4b\ +\x68\x4f\x69\x4d\x77\x69\x52\x6b\x72\x6f\x6b\x58\x73\x4f\x30\x38\ +\x31\x52\x35\x72\x6f\x4a\x42\x48\x66\x4a\x55\x4e\x6d\x42\x45\x62\ +\x2b\x2b\x33\x48\x36\x51\x30\x62\x61\x7a\x4d\x6a\x43\x55\x51\x6d\ +\x51\x59\x2b\x61\x45\x73\x64\x2b\x75\x50\x2f\x7a\x4f\x2f\x38\x37\ +\x2f\x76\x62\x78\x57\x51\x54\x30\x77\x41\x32\x64\x2f\x63\x33\x4c\ +\x41\x6d\x6f\x37\x51\x4b\x46\x4b\x33\x79\x4d\x56\x78\x37\x4d\x53\ +\x45\x6e\x76\x6b\x55\x74\x4e\x43\x4f\x72\x69\x77\x67\x67\x66\x4a\ +\x6b\x4f\x39\x36\x74\x74\x37\x6e\x57\x6e\x6d\x67\x32\x63\x7a\x6f\ +\x44\x50\x67\x54\x44\x4b\x69\x73\x55\x46\x6f\x51\x62\x62\x78\x33\ +\x57\x63\x50\x47\x58\x72\x77\x77\x63\x30\x5a\x4a\x51\x58\x2f\x6f\ +\x35\x66\x6a\x78\x43\x30\x6f\x32\x54\x45\x6c\x63\x42\x61\x64\x6e\ +\x51\x6a\x53\x32\x6f\x56\x4c\x52\x43\x4c\x55\x4e\x72\x62\x6c\x6e\ +\x72\x32\x47\x6a\x53\x41\x66\x75\x44\x38\x2f\x78\x41\x6d\x51\x75\ +\x61\x45\x63\x2b\x7a\x51\x78\x55\x64\x44\x32\x5a\x61\x55\x5a\x59\ +\x50\x73\x66\x41\x67\x36\x35\x69\x58\x39\x6f\x53\x57\x74\x4d\x5a\ +\x36\x75\x2f\x41\x43\x7a\x4f\x42\x56\x57\x41\x30\x4f\x4b\x59\x6f\ +\x44\x4d\x79\x47\x4b\x4a\x58\x32\x66\x41\x49\x54\x42\x63\x47\x79\ +\x6d\x47\x33\x64\x69\x70\x44\x2b\x34\x32\x35\x6c\x65\x56\x44\x33\ +\x42\x2b\x54\x4e\x43\x4b\x63\x7a\x6e\x4e\x52\x38\x39\x78\x6a\x62\ +\x55\x50\x50\x69\x62\x6f\x70\x68\x6e\x50\x4c\x78\x2b\x6d\x6e\x58\ +\x6c\x4f\x71\x33\x39\x75\x2f\x64\x68\x71\x6c\x56\x78\x65\x68\x37\ +\x65\x31\x4a\x37\x68\x34\x79\x52\x51\x7a\x47\x41\x63\x6b\x48\x4b\ +\x36\x34\x46\x77\x66\x59\x52\x6e\x70\x73\x51\x6f\x38\x45\x61\x76\ +\x68\x42\x6b\x52\x33\x63\x61\x31\x44\x72\x4a\x74\x79\x6d\x78\x2b\ +\x47\x45\x38\x56\x6d\x70\x45\x4b\x32\x44\x68\x59\x57\x50\x6c\x42\ +\x5a\x67\x36\x66\x4d\x79\x63\x31\x4b\x65\x72\x56\x4e\x4a\x77\x68\ +\x58\x33\x67\x67\x38\x70\x65\x72\x6a\x4a\x45\x4b\x4c\x71\x66\x46\ +\x4c\x73\x6d\x73\x78\x38\x55\x36\x47\x55\x4c\x66\x49\x4b\x47\x43\ +\x2b\x77\x66\x5a\x58\x30\x30\x68\x6f\x68\x66\x37\x68\x36\x37\x35\ +\x4e\x76\x37\x46\x6c\x79\x70\x68\x68\x4c\x74\x70\x5a\x2b\x4a\x64\ +\x6d\x4e\x47\x56\x72\x4b\x53\x66\x33\x52\x67\x75\x4d\x49\x49\x36\ +\x43\x4b\x58\x55\x53\x45\x4b\x68\x46\x46\x4c\x6d\x63\x62\x6c\x31\ +\x49\x36\x6d\x43\x52\x30\x38\x79\x72\x30\x38\x51\x78\x6f\x39\x6f\ +\x4a\x77\x34\x7a\x75\x4d\x78\x6c\x63\x77\x45\x7a\x4b\x6f\x51\x62\ +\x4f\x55\x75\x41\x36\x42\x52\x59\x50\x41\x35\x75\x42\x50\x48\x57\ +\x78\x70\x42\x43\x4d\x66\x51\x56\x41\x34\x54\x33\x63\x4e\x75\x47\ +\x6b\x41\x37\x30\x33\x5a\x38\x61\x73\x55\x62\x4c\x65\x6a\x53\x75\ +\x45\x43\x4a\x4f\x55\x48\x45\x70\x35\x50\x59\x68\x54\x33\x7a\x4a\ +\x44\x45\x76\x77\x48\x78\x63\x6f\x58\x6f\x42\x71\x59\x4b\x51\x43\ +\x4c\x67\x34\x57\x59\x7a\x52\x34\x50\x71\x31\x6b\x59\x66\x7a\x55\ +\x61\x4c\x67\x70\x47\x6d\x6c\x70\x71\x4f\x46\x51\x61\x33\x34\x75\ +\x38\x62\x4d\x62\x6a\x43\x52\x56\x59\x46\x53\x49\x4f\x46\x62\x51\ +\x79\x6e\x4b\x63\x35\x48\x4f\x35\x31\x49\x39\x47\x36\x47\x45\x52\ +\x2f\x76\x73\x69\x32\x51\x75\x51\x47\x36\x4e\x53\x44\x6e\x72\x78\ +\x4a\x52\x69\x4c\x53\x54\x2f\x64\x6e\x67\x4b\x64\x6b\x32\x41\x5a\ +\x52\x6f\x4d\x5a\x45\x51\x59\x68\x78\x2b\x4f\x35\x5a\x4c\x61\x78\ +\x6f\x35\x6e\x68\x32\x63\x73\x74\x48\x33\x4e\x35\x32\x7a\x32\x68\ +\x33\x6c\x5a\x71\x36\x39\x35\x69\x66\x36\x49\x51\x63\x52\x7a\x47\ +\x56\x4d\x68\x78\x6b\x76\x2b\x6c\x63\x6a\x6a\x51\x4a\x41\x53\x66\ +\x76\x31\x62\x79\x41\x6b\x52\x6b\x5a\x48\x33\x51\x4d\x76\x66\x63\ +\x6a\x35\x49\x72\x37\x78\x39\x36\x62\x49\x2b\x66\x48\x30\x6c\x59\ +\x53\x74\x48\x57\x68\x73\x71\x6c\x70\x41\x4e\x39\x4a\x6b\x39\x46\ +\x78\x2b\x33\x68\x66\x69\x37\x43\x77\x53\x66\x66\x4c\x54\x33\x42\ +\x75\x78\x52\x78\x78\x75\x33\x39\x46\x67\x4f\x47\x41\x4a\x65\x4b\ +\x4e\x41\x56\x6f\x5a\x43\x77\x55\x2f\x73\x54\x7a\x42\x55\x48\x64\ +\x52\x30\x45\x65\x76\x4d\x79\x46\x6c\x73\x33\x72\x2b\x31\x63\x74\ +\x4f\x76\x72\x41\x54\x75\x48\x4d\x6c\x45\x38\x6d\x48\x6f\x39\x6e\ +\x70\x74\x4a\x59\x53\x6c\x79\x49\x76\x39\x77\x4b\x4b\x72\x54\x37\ +\x56\x68\x71\x61\x74\x54\x4b\x61\x6a\x6a\x68\x4a\x5a\x33\x51\x75\ +\x41\x44\x45\x46\x33\x73\x57\x4c\x56\x76\x50\x61\x55\x79\x31\x79\ +\x52\x56\x6e\x4d\x37\x59\x47\x4d\x35\x6b\x4a\x34\x35\x59\x4c\x2b\ +\x44\x35\x39\x6f\x33\x72\x44\x63\x39\x78\x68\x55\x57\x5a\x6b\x34\ +\x50\x5a\x59\x59\x75\x36\x53\x70\x57\x73\x30\x55\x33\x42\x70\x78\ +\x34\x30\x31\x39\x7a\x41\x2f\x75\x73\x54\x38\x35\x79\x49\x69\x34\ +\x4b\x54\x48\x49\x75\x74\x4a\x5a\x77\x75\x72\x62\x32\x75\x51\x71\ +\x30\x72\x77\x48\x6f\x38\x49\x79\x48\x51\x76\x30\x76\x66\x34\x49\ +\x6e\x76\x43\x43\x37\x30\x47\x6d\x4a\x35\x4d\x34\x34\x73\x53\x4d\ +\x55\x41\x4f\x49\x71\x67\x67\x57\x64\x64\x54\x48\x59\x6b\x5a\x52\ +\x76\x73\x78\x41\x78\x65\x4e\x5a\x74\x30\x38\x49\x49\x37\x43\x74\ +\x54\x51\x6f\x6a\x76\x65\x6f\x36\x79\x4b\x32\x41\x4e\x4a\x65\x78\ +\x69\x4e\x59\x4e\x50\x64\x6e\x35\x37\x56\x73\x72\x6c\x4e\x4c\x55\ +\x79\x45\x54\x4e\x55\x6e\x4a\x44\x53\x64\x78\x6d\x30\x77\x70\x6d\ +\x35\x30\x4f\x68\x69\x49\x57\x52\x6c\x6c\x47\x56\x69\x7a\x4b\x52\ +\x7a\x6f\x37\x35\x30\x6e\x78\x61\x72\x37\x70\x51\x4a\x48\x4b\x78\ +\x53\x51\x6b\x33\x72\x4b\x41\x6c\x7a\x32\x31\x63\x64\x2b\x4c\x37\ +\x37\x5a\x76\x58\x2b\x48\x35\x61\x4e\x70\x36\x2b\x63\x50\x4b\x63\ +\x6b\x4d\x71\x36\x75\x6e\x51\x46\x72\x52\x4a\x32\x65\x50\x6e\x36\ +\x56\x6d\x72\x6e\x67\x38\x47\x4f\x57\x4f\x6c\x49\x70\x5a\x4f\x45\ +\x57\x7a\x53\x65\x61\x4a\x4b\x58\x73\x46\x6f\x74\x6c\x62\x52\x48\ +\x75\x44\x6d\x70\x38\x64\x63\x32\x39\x72\x37\x34\x51\x43\x57\x59\ +\x73\x49\x49\x6d\x7a\x34\x37\x6a\x61\x65\x5a\x53\x49\x6e\x4b\x78\ +\x72\x73\x47\x4d\x64\x6a\x38\x61\x77\x76\x4e\x69\x62\x68\x30\x52\ +\x73\x59\x36\x73\x62\x2f\x78\x75\x6b\x33\x4a\x58\x57\x50\x55\x5a\ +\x37\x71\x69\x77\x65\x54\x2b\x79\x76\x53\x79\x61\x6b\x73\x4c\x59\ +\x72\x74\x2b\x66\x33\x33\x55\x34\x66\x57\x54\x55\x73\x33\x2b\x4c\ +\x63\x42\x47\x41\x71\x38\x72\x43\x6e\x31\x33\x2f\x75\x53\x6c\x77\ +\x30\x34\x4b\x61\x66\x7a\x61\x50\x6e\x7a\x4d\x6c\x36\x6f\x2b\x2f\