From d3bfe958aa6d7315493cc2dbb3649528bc772d1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damian=20B=C3=BCchel?= Date: Sun, 30 May 2021 20:04:44 +0200 Subject: [PATCH] SEBWIN-491: Implemented basic display configuration monitoring. --- SafeExamBrowser.Client/ClientController.cs | 15 ++ .../ConfigurationData/DataMapper.cs | 1 + .../DataMapping/DisplayDataMapper.cs | 55 ++++++ .../ConfigurationData/DataValues.cs | 4 + .../ConfigurationData/Keys.cs | 7 + .../SafeExamBrowser.Configuration.csproj | 1 + SafeExamBrowser.I18n.Contracts/TextKey.cs | 6 + SafeExamBrowser.I18n/Data/de.xml | 18 ++ SafeExamBrowser.I18n/Data/en.xml | 18 ++ SafeExamBrowser.I18n/Data/fr.xml | 92 ++++++---- SafeExamBrowser.I18n/Data/it.xml | 18 ++ SafeExamBrowser.I18n/Data/zh.xml | 18 ++ .../Display/IDisplayMonitor.cs | 8 +- SafeExamBrowser.Monitoring/Display/Display.cs | 18 ++ .../Display/DisplayMonitor.cs | 111 ++++++++++- .../Display/VideoOutputTechnology.cs | 40 ++++ .../SafeExamBrowser.Monitoring.csproj | 3 + SafeExamBrowser.Runtime/CompositionRoot.cs | 3 + .../Operations/DisplayMonitorOperation.cs | 76 ++++++++ .../SafeExamBrowser.Runtime.csproj | 9 + SafeExamBrowser.Settings/AppSettings.cs | 6 + .../Monitoring/DisplaySettings.cs | 34 ++++ .../SafeExamBrowser.Settings.csproj | 1 + .../SystemInfo.cs | 2 +- SebWindowsConfig/SEBSettings.cs | 3 +- .../SebWindowsConfigForm.Designer.cs | 116 ++++++------ SebWindowsConfig/SebWindowsConfigForm.cs | 7 +- SebWindowsConfig/SebWindowsConfigForm.resx | 172 ++++++++++++------ 28 files changed, 708 insertions(+), 154 deletions(-) create mode 100644 SafeExamBrowser.Configuration/ConfigurationData/DataMapping/DisplayDataMapper.cs create mode 100644 SafeExamBrowser.Monitoring/Display/Display.cs create mode 100644 SafeExamBrowser.Monitoring/Display/VideoOutputTechnology.cs create mode 100644 SafeExamBrowser.Runtime/Operations/DisplayMonitorOperation.cs create mode 100644 SafeExamBrowser.Settings/Monitoring/DisplaySettings.cs diff --git a/SafeExamBrowser.Client/ClientController.cs b/SafeExamBrowser.Client/ClientController.cs index 225425ef..a0fd0284 100644 --- a/SafeExamBrowser.Client/ClientController.cs +++ b/SafeExamBrowser.Client/ClientController.cs @@ -514,6 +514,21 @@ namespace SafeExamBrowser.Client actionCenter.InitializeBounds(); taskbar.InitializeBounds(); logger.Info("Desktop successfully restored."); + + if (!displayMonitor.IsAllowedConfiguration(Settings.Display)) + { + var continueOption = new LockScreenOption { Text = text.Get(TextKey.LockScreen_DisplayConfigurationContinueOption) }; + var terminateOption = new LockScreenOption { Text = text.Get(TextKey.LockScreen_DisplayConfigurationTerminateOption) }; + var message = text.Get(TextKey.LockScreen_DisplayConfigurationMessage); + var title = text.Get(TextKey.LockScreen_Title); + var result = ShowLockScreen(message, title, new[] { continueOption, terminateOption }); + + if (result.OptionId == terminateOption.Id) + { + logger.Info("Attempting to shutdown as requested by the user..."); + TryRequestShutdown(); + } + } } private void Operations_ActionRequired(ActionRequiredEventArgs args) diff --git a/SafeExamBrowser.Configuration/ConfigurationData/DataMapper.cs b/SafeExamBrowser.Configuration/ConfigurationData/DataMapper.cs index c694d176..a020881b 100644 --- a/SafeExamBrowser.Configuration/ConfigurationData/DataMapper.cs +++ b/SafeExamBrowser.Configuration/ConfigurationData/DataMapper.cs @@ -20,6 +20,7 @@ namespace SafeExamBrowser.Configuration.ConfigurationData new AudioDataMapper(), new BrowserDataMapper(), new ConfigurationFileDataMapper(), + new DisplayDataMapper(), new GeneralDataMapper(), new InputDataMapper(), new ProctoringDataMapper(), diff --git a/SafeExamBrowser.Configuration/ConfigurationData/DataMapping/DisplayDataMapper.cs b/SafeExamBrowser.Configuration/ConfigurationData/DataMapping/DisplayDataMapper.cs new file mode 100644 index 00000000..0006d5d3 --- /dev/null +++ b/SafeExamBrowser.Configuration/ConfigurationData/DataMapping/DisplayDataMapper.cs @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2021 ETH Zürich, Educational Development and Technology (LET) + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +using SafeExamBrowser.Settings; + +namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping +{ + internal class DisplayDataMapper : BaseDataMapper + { + internal override void Map(string key, object value, AppSettings settings) + { + switch (key) + { + case Keys.Display.AllowedDisplays: + MapAllowedDisplays(settings, value); + break; + case Keys.Display.IgnoreError: + MapIgnoreError(settings, value); + break; + case Keys.Display.InternalDisplayOnly: + MapInternalDisplayOnly(settings, value); + break; + } + } + + private void MapAllowedDisplays(AppSettings settings, object value) + { + if (value is int count) + { + settings.Display.AllowedDisplays = count; + } + } + + private void MapIgnoreError(AppSettings settings, object value) + { + if (value is bool ignore) + { + settings.Display.IgnoreError = ignore; + } + } + + private void MapInternalDisplayOnly(AppSettings settings, object value) + { + if (value is bool internalOnly) + { + settings.Display.InternalDisplayOnly = internalOnly; + } + } + } +} diff --git a/SafeExamBrowser.Configuration/ConfigurationData/DataValues.cs b/SafeExamBrowser.Configuration/ConfigurationData/DataValues.cs index 9af8e874..1545d5f3 100644 --- a/SafeExamBrowser.Configuration/ConfigurationData/DataValues.cs +++ b/SafeExamBrowser.Configuration/ConfigurationData/DataValues.cs @@ -150,6 +150,10 @@ namespace SafeExamBrowser.Configuration.ConfigurationData settings.ConfigurationMode = ConfigurationMode.Exam; + settings.Display.AllowedDisplays = 1; + settings.Display.IgnoreError = false; + settings.Display.InternalDisplayOnly = false; + settings.Keyboard.AllowAltEsc = false; settings.Keyboard.AllowAltF4 = false; settings.Keyboard.AllowAltTab = true; diff --git a/SafeExamBrowser.Configuration/ConfigurationData/Keys.cs b/SafeExamBrowser.Configuration/ConfigurationData/Keys.cs index ee843585..7f728b6b 100644 --- a/SafeExamBrowser.Configuration/ConfigurationData/Keys.cs +++ b/SafeExamBrowser.Configuration/ConfigurationData/Keys.cs @@ -170,6 +170,13 @@ namespace SafeExamBrowser.Configuration.ConfigurationData internal const string SessionMode = "sebMode"; } + internal static class Display + { + internal const string AllowedDisplays = "allowedDisplaysMaxNumber"; + internal const string IgnoreError = "allowedDisplaysIgnoreFailure"; + internal const string InternalDisplayOnly = "allowedDisplayBuiltinEnforce"; + } + internal static class General { internal const string LogLevel = "logLevel"; diff --git a/SafeExamBrowser.Configuration/SafeExamBrowser.Configuration.csproj b/SafeExamBrowser.Configuration/SafeExamBrowser.Configuration.csproj index 4d9aa905..6b609add 100644 --- a/SafeExamBrowser.Configuration/SafeExamBrowser.Configuration.csproj +++ b/SafeExamBrowser.Configuration/SafeExamBrowser.Configuration.csproj @@ -60,6 +60,7 @@ + diff --git a/SafeExamBrowser.I18n.Contracts/TextKey.cs b/SafeExamBrowser.I18n.Contracts/TextKey.cs index 7cb909e0..344a544c 100644 --- a/SafeExamBrowser.I18n.Contracts/TextKey.cs +++ b/SafeExamBrowser.I18n.Contracts/TextKey.cs @@ -52,6 +52,9 @@ namespace SafeExamBrowser.I18n.Contracts LockScreen_ApplicationsAllowOption, LockScreen_ApplicationsMessage, LockScreen_ApplicationsTerminateOption, + LockScreen_DisplayConfigurationContinueOption, + LockScreen_DisplayConfigurationTerminateOption, + LockScreen_DisplayConfigurationMessage, LockScreen_UserSessionContinueOption, LockScreen_UserSessionMessage, LockScreen_UserSessionTerminateOption, @@ -95,6 +98,8 @@ namespace SafeExamBrowser.I18n.Contracts MessageBox_InvalidUnlockPassword, MessageBox_InvalidUnlockPasswordTitle, MessageBox_NoButton, + MessageBox_DisplayConfigurationError, + MessageBox_DisplayConfigurationErrorTitle, MessageBox_NotSupportedConfigurationResource, MessageBox_NotSupportedConfigurationResourceTitle, MessageBox_OkButton, @@ -163,6 +168,7 @@ namespace SafeExamBrowser.I18n.Contracts OperationStatus_TerminateBrowser, OperationStatus_TerminateProctoring, OperationStatus_TerminateShell, + OperationStatus_ValidateDisplayConfiguration, OperationStatus_ValidateRemoteSessionPolicy, OperationStatus_ValidateVirtualMachinePolicy, OperationStatus_WaitDisclaimerConfirmation, diff --git a/SafeExamBrowser.I18n/Data/de.xml b/SafeExamBrowser.I18n/Data/de.xml index c4db39f7..129ae8de 100644 --- a/SafeExamBrowser.I18n/Data/de.xml +++ b/SafeExamBrowser.I18n/Data/de.xml @@ -114,6 +114,15 @@ Safe Exam Browser beenden. WARNUNG: Sie werden keine Möglichkeit haben, Daten zu speichern oder weitere Aktionen auszuführen, SEB wird sofort beendet! + + Bildschirm-Konfiguration temporär erlauben. Dies gilt nur für die momentan laufende Sitzung! + + + Safe Exam Browser beenden. WARNUNG: Sie werden keine Möglichkeit haben, Daten zu speichern oder weitere Aktionen auszuführen, SEB wird sofort beendet! + + + Eine verbotene Bildschirm-Konfiguration wurde detektiert. Bitte wählen Sie eine der verfügbaren Optionen aus und geben Sie das korrekte Passwort ein, um SEB zu entsperren. + SEB GESPERRT @@ -210,6 +219,12 @@ Fehler beim Herunterladen + + Die aktive Bildschirm-Konfiguration ist nicht erlaubt! Bitte konsultieren Sie das Applikations-Protokoll für mehr Informationen. SEB wird sich nun beenden... + + + Verbotene Bildschirm-Konfiguration + Die Konfigurations-Ressource "%%URI%%" enthält ungültige Daten! @@ -447,6 +462,9 @@ Beende Benutzeroberfläche + + Validiere Richtlinie für Bildschirm-Konfiguration + Validiere Richtlinie für Remote-Sitzungen diff --git a/SafeExamBrowser.I18n/Data/en.xml b/SafeExamBrowser.I18n/Data/en.xml index 37f4ae04..ae0cd4c2 100644 --- a/SafeExamBrowser.I18n/Data/en.xml +++ b/SafeExamBrowser.I18n/Data/en.xml @@ -114,6 +114,15 @@ Terminate Safe Exam Browser. WARNING: There will be no possibility to save data or perform any further actions, the shutdown will be initiated immediately! + + Temporarily allow the display configuration. This applies only to the currently running session! + + + Terminate Safe Exam Browser. WARNING: There will be no possibility to save data or perform any further actions, the shutdown will be initiated immediately! + + + A prohibited display configuration has been detected. In order to unlock SEB, please select one of the available options and enter the correct unlock password. + SEB LOCKED @@ -210,6 +219,12 @@ Download Error + + The active display configuration is not permitted. Please consult the log files for more information. SEB will now shut down... + + + Prohibited Display Configuration + The configuration resource "%%URI%%" contains invalid data! @@ -447,6 +462,9 @@ Terminating user interface + + Validating display configuration policy + Validating remote session policy diff --git a/SafeExamBrowser.I18n/Data/fr.xml b/SafeExamBrowser.I18n/Data/fr.xml index 18213329..d6579847 100644 --- a/SafeExamBrowser.I18n/Data/fr.xml +++ b/SafeExamBrowser.I18n/Data/fr.xml @@ -58,7 +58,7 @@ Annuler - Veuillez sélectionner l'un des examens disponibles sur le serveur SEB : + Veuillez sélectionner l'un des examens disponibles sur le serveur SEB: Selection @@ -70,10 +70,10 @@ Annuler - Echec du chargement des données ! + Echec du chargement des données! - Chargement … + Chargement... Veuillez sélectionner un fichier à ouvrir. @@ -82,13 +82,13 @@ Veuillez sélectionner un dossier. - Le fichier sélectionné existe déjà ! Voulez-vous vraiment le remplacer ? + Le fichier sélectionné existe déjà ! Voulez-vous vraiment le remplacer? - Remplacer ? + Remplacer? - Enregistrer sous : + Enregistrer sous: Veuillez sélectionner un emplacement pour enregistrer le fichier. @@ -103,16 +103,25 @@ Accès au système de fichiers - L'application "%%NAME%%" n'a pas pu être trouvée sur le système ! Veuillez localiser le dossier contenant l'exécutable principal "%%EXECUTABLE%%". + L'application "%%NAME%%" n'a pas pu être trouvée sur le système! Veuillez localiser le dossier contenant l'exécutable principal "%%EXECUTABLE%%". - Autoriser temporairement les applications figurant sur la liste noire. Cela ne s'applique qu'aux instances et à la session en cours ! + Autoriser temporairement les applications figurant sur la liste noire. Cela ne s'applique qu'aux instances et à la session en cours! - Les applications sur liste noire énumérées ci-dessous ont été lancées et n’ont pas pu être automatiquement supprimées ! Afin de débloquer SEB, veuillez sélectionner l'une des options disponibles et entrer le mot de passe de déblocage. + Les applications sur liste noire énumérées ci-dessous ont été lancées et n’ont pas pu être automatiquement supprimées! Afin de débloquer SEB, veuillez sélectionner l'une des options disponibles et entrer le mot de passe de déblocage. - Terminer Safe Exam Browser. AVERTISSEMENT : Il n'y aura pas de possibilité de sauvegarder les données ou d'effectuer d'autres actions, l'arrêt sera déclenché immédiatement ! + Terminer Safe Exam Browser. AVERTISSEMENT: Il n'y aura pas de possibilité de sauvegarder les données ou d'effectuer d'autres actions, l'arrêt sera déclenché immédiatement! + + + Autoriser temporairement la configuration de l'affichage. Ceci s'applique uniquement à la session en cours! + + + Terminez le navigateur Safe Exam. AVERTISSEMENT: Il n'y aura aucune possibilité de sauvegarder des données ou d'effectuer d'autres actions, l'arrêt sera déclenché immédiatement! + + + Une configuration d'affichage interdite a été détectée. Pour déverrouiller SEB, veuillez sélectionner l'une des options disponibles et saisir le mot de passe de déverrouillage correct. SEB VEROUILLE @@ -124,10 +133,10 @@ Dévérouiller Safe Exam Browser. - L'utilisateur actif a changé ou l'ordinateur a été verrouillé ! Afin de déverrouiller SEB, veuillez sélectionner une des options disponibles et entrer le mot de passe de déverrouillage. + L'utilisateur actif a changé ou l'ordinateur a été verrouillé! Afin de déverrouiller SEB, veuillez sélectionner une des options disponibles et entrer le mot de passe de déverrouillage. - Terminer Safe Exam Browser. AVERTISSEMENT : Il n'y aura pas de possibilité de sauvegarder les données ou d'effectuer d'autres actions, l'arrêt sera déclenché immédiatement ! + Terminer Safe Exam Browser. AVERTISSEMENT: Il n'y aura pas de possibilité de sauvegarder les données ou d'effectuer d'autres actions, l'arrêt sera déclenché immédiatement! Toujours au premier plan @@ -139,40 +148,40 @@ Journal de l’application - Les applications énumérées ci-dessous doivent être terminées avant qu'une nouvelle session puisse être lancée. Souhaitez-vous les clôturer automatiquement maintenant ? + Les applications énumérées ci-dessous doivent être terminées avant qu'une nouvelle session puisse être lancée. Souhaitez-vous les clôturer automatiquement maintenant? Applications en cours d'exécution détectées - AVERTISSEMENT : les données des applications non sauvegardées peuvent être perdues ! + AVERTISSEMENT : les données des applications non sauvegardées peuvent être perdues! - Une erreur irrémédiable s'est produite ! Veuillez consulter les fichiers journaux pour plus d'informations. SEB va maintenant fermer... + Une erreur irrémédiable s'est produite! Veuillez consulter les fichiers journaux pour plus d'informations. SEB va maintenant fermer... Erreur de l’application - L'application %%NAME%% n'a pas pu être initialisée et ne sera donc pas disponible pour la nouvelle session ! Veuillez consulter les fichiers journaux pour plus d'informations. + L'application %%NAME%% n'a pas pu être initialisée et ne sera donc pas disponible pour la nouvelle session! Veuillez consulter les fichiers journaux pour plus d'informations. Échec de l'initialisation de l’application - L’application %%NAME%% n'a pas pu être trouvée sur le système et ne sera donc pas disponible pour la nouvelle session ! Veuillez consulter les fichiers journaux pour plus d'informations. + L’application %%NAME%% n'a pas pu être trouvée sur le système et ne sera donc pas disponible pour la nouvelle session! Veuillez consulter les fichiers journaux pour plus d'informations. Application non-trouvée - Les applications énumérées ci-dessous n'ont pas pu être terminées ! Veuillez les terminer manuellement et réessayer... + Les applications énumérées ci-dessous n'ont pas pu être terminées! Veuillez les terminer manuellement et réessayer... Échec de la clôture automatique - Etes-vous sûr ? (Cette fonction ne vous déconnecte pas si vous êtes connecté sur un site web) + Etes-vous sûr? (Cette fonction ne vous déconnecte pas si vous êtes connecté sur un site web) Retour au début @@ -184,7 +193,7 @@ Page bloquée - L'application du navigateur a détecté une URL de fin ! Vous souhaitez mettre fin à SEB maintenant ? + L'application du navigateur a détecté une URL de fin! Vous souhaitez mettre fin à SEB maintenant? URL de fin détectée @@ -193,13 +202,13 @@ Annuler - La configuration du client local a échoué ! Veuillez consulter les fichiers journaux pour plus d'informations. SEB va maintenant se fermer.... + La configuration du client local a échoué! Veuillez consulter les fichiers journaux pour plus d'informations. SEB va maintenant se fermer.... Erreur de configuration - La configuration du client a été enregistrée et sera utilisée lors du prochain démarrage de SEB. Vous voulez quitter maintenant ? + La configuration du client a été enregistrée et sera utilisée lors du prochain démarrage de SEB. Vous voulez quitter maintenant? Configuration réussie @@ -210,8 +219,14 @@ Erreur de téléchargement + + La configuration d'affichage active n'est pas autorisée. Veuillez consulter les fichiers journaux pour plus d'informations. SEB va maintenant s'arrêter... + + + Configuration d'affichage interdite + - La ressource de configuration "%%URI%%" contient des données non valides ! + La ressource de configuration "%%URI%%" contient des données non valides! Erreur de configuration @@ -244,7 +259,7 @@ Non - La ressource de configuration "%%URI%%" n'est pas supportée ! + La ressource de configuration "%%URI%%" n'est pas supportée! Erreur de configuration @@ -259,13 +274,13 @@ Session avec surveillance à distance - Voulez-vous quitter SEB ? + Voulez-vous quitter SEB? Quitter ? - Le client n'a pas réussi à communiquer la demande d'arrêt au serveur d'exécution ! + Le client n'a pas réussi à communiquer la demande d'arrêt au serveur d'exécution! Erreur de sortie @@ -277,13 +292,13 @@ Reconfiguration refusée - Le client n'a pas réussi à communiquer la demande de reconfiguration au serveur ! + Le client n'a pas réussi à communiquer la demande de reconfiguration au serveur! Erreur de reconfiguration - Souhaitez-vous recharger la page actuelle ? + Souhaitez-vous recharger la page actuelle? Recharger ? @@ -295,7 +310,7 @@ Session distante détectée - Le service SEB n'a pas été initialisé ! Le service SEB va maintenant se terminer puisque le service obligatoire. + Le service SEB n'a pas été initialisé! Le service SEB va maintenant se terminer puisque le service obligatoire. Service indisponible @@ -307,25 +322,25 @@ Service indisponible - Le SEB n'a pas réussi à démarrer une nouvelle session ! Veuillez consulter les fichiers journaux pour plus d'informations. + Le SEB n'a pas réussi à démarrer une nouvelle session! Veuillez consulter les fichiers journaux pour plus d'informations. Erreur de démarrage de session - Une erreur inattendue s'est produite lors de la procédure d'arrêt ! Veuillez consulter les fichiers journaux pour plus d'informations. + Une erreur inattendue s'est produite lors de la procédure d'arrêt! Veuillez consulter les fichiers journaux pour plus d'informations. Erreur de fermeture - Une erreur inattendue s'est produite lors de la procédure de démarrage ! Veuillez consulter les fichiers journaux pour plus d'informations. + Une erreur inattendue s'est produite lors de la procédure de démarrage! Veuillez consulter les fichiers journaux pour plus d'informations. Erreur de démarrage - Une erreur inattendue s'est produite en essayant de charger la ressource de configuration "%%URI%%" ! Veuillez consulter les fichiers journaux pour plus d'informations. + Une erreur inattendue s'est produite en essayant de charger la ressource de configuration "%%URI%%"! Veuillez consulter les fichiers journaux pour plus d'informations. Erreur de configuration @@ -447,6 +462,9 @@ Arrêt de l’interface utilisateur + + Validation de la politique de configuration d'affichage + Validation de la directive sur la session à distance @@ -466,7 +484,7 @@ Attente de la déconnexion du runtime - Saisissez le mot de passe pour quitter/redémarrer : (Cette fonction ne vous déconnecte pas si vous êtes connecté sur un site web) + Saisissez le mot de passe pour quitter/redémarrer: (Cette fonction ne vous déconnecte pas si vous êtes connecté sur un site web) Retour au début @@ -478,7 +496,7 @@ Confirmer - Veuillez saisir le mot de passe de l'administrateur pour la configuration du client local : + Veuillez saisir le mot de passe de l'administrateur pour la configuration du client local: Mot de passe administrateur requis @@ -490,7 +508,7 @@ Mot de passe des paramètres requis - Veuillez saisir le mot de passe pour quitter SEB : + Veuillez saisir le mot de passe pour quitter SEB: Mot de passe de sortie requis @@ -544,7 +562,7 @@ Entièrement chargé (%%CHARGE%%%) - La charge de la batterie est dangereusement faible. Veuillez brancher votre ordinateur à une source d'alimentation électrique ! + La charge de la batterie est dangereusement faible. Veuillez brancher votre ordinateur à une source d'alimentation électrique! La charge de la batterie devient faible. Pensez à brancher votre ordinateur sur une alimentation électrique... diff --git a/SafeExamBrowser.I18n/Data/it.xml b/SafeExamBrowser.I18n/Data/it.xml index 07641dee..3c248bc1 100644 --- a/SafeExamBrowser.I18n/Data/it.xml +++ b/SafeExamBrowser.I18n/Data/it.xml @@ -114,6 +114,15 @@ Chiudi Safe Exam Browser. ATTENZIONE: non ci sarà la possibilità di salvare dati o eseguire ulteriori azioni, lo spegnimento verrà avviato immediatamente! + + Consenti temporaneamente la configurazione del display. Questo vale solo per la sessione attualmente in esecuzione! + + + Termina Browser esame sicuro. ATTENZIONE: non sarà possibile salvare i dati o eseguire ulteriori azioni, lo spegnimento verrà avviato immediatamente! + + + È stata rilevata una configurazione di visualizzazione vietata. Per sbloccare SEB, seleziona una delle opzioni disponibili e inserisci la password di sblocco corretta. + SEB BLOCCATO @@ -210,6 +219,12 @@ Errore di download + + La configurazione del display attiva non è consentita. Si prega di consultare i file di registro per ulteriori informazioni. SEB ora si spegnerà... + + + Configurazione del display vietata + La risorsa di configurazione "%%URI%%" contiene dati non validi! @@ -447,6 +462,9 @@ Chiusura dell'interfaccia utente + + Convalida dei criteri di configurazione del display + Convalida dei criteri della sessione remota diff --git a/SafeExamBrowser.I18n/Data/zh.xml b/SafeExamBrowser.I18n/Data/zh.xml index 4ce73144..c48c08ca 100644 --- a/SafeExamBrowser.I18n/Data/zh.xml +++ b/SafeExamBrowser.I18n/Data/zh.xml @@ -99,6 +99,15 @@ 强制关闭防作弊考试专用浏览器。警告:将无法保存数据或执行任何进一步的操作,关闭操作将立即启动。 + + 暂时允许显示配置。 这仅适用于当前正在运行的会话! + + + 终止安全考试浏览器。 警告:将无法保存数据或执行任何进一步操作,将立即启动关机! + + + 检测到禁止的显示配置。 要解锁 SEB,请选择可用选项之一并输入正确的解锁密码。 + 防作弊考试专用浏览器已锁定 @@ -180,6 +189,12 @@ 下载错误 + + 不允许使用活动的显示配置。 请查阅日志文件以获取更多信息。 SEB现在将关闭... + + + 禁止的显示配置 + 配置"%%URI%%" 中包含无效数据。 @@ -399,6 +414,9 @@ 终止用户界面 + + 验证显示配置策略 + 验证远程会话策略 diff --git a/SafeExamBrowser.Monitoring.Contracts/Display/IDisplayMonitor.cs b/SafeExamBrowser.Monitoring.Contracts/Display/IDisplayMonitor.cs index 72f9979c..86d6f76c 100644 --- a/SafeExamBrowser.Monitoring.Contracts/Display/IDisplayMonitor.cs +++ b/SafeExamBrowser.Monitoring.Contracts/Display/IDisplayMonitor.cs @@ -7,11 +7,12 @@ */ using SafeExamBrowser.Monitoring.Contracts.Display.Events; +using SafeExamBrowser.Settings.Monitoring; namespace SafeExamBrowser.Monitoring.Contracts.Display { /// - /// Monitors the displays of the computer for (setup) changes and provides access to display-related functionality. + /// Monitors the displays of the computer for changes and provides access to display-related functionality. /// public interface IDisplayMonitor { @@ -25,6 +26,11 @@ namespace SafeExamBrowser.Monitoring.Contracts.Display /// void InitializePrimaryDisplay(int taskbarHeight); + /// + /// Indicates whether the currently active display configuration is allowed according to the given settings. + /// + bool IsAllowedConfiguration(DisplaySettings settings); + /// /// Prevents the computer from entering sleep mode and turning its display(s) off. /// diff --git a/SafeExamBrowser.Monitoring/Display/Display.cs b/SafeExamBrowser.Monitoring/Display/Display.cs new file mode 100644 index 00000000..7981e206 --- /dev/null +++ b/SafeExamBrowser.Monitoring/Display/Display.cs @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2021 ETH Zürich, Educational Development and Technology (LET) + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +namespace SafeExamBrowser.Monitoring.Display +{ + internal class Display + { + public string Identifier { get; set; } + public bool IsActive { get; set; } + public bool IsInternal { get; set; } + public VideoOutputTechnology Technology { get; set; } + } +} diff --git a/SafeExamBrowser.Monitoring/Display/DisplayMonitor.cs b/SafeExamBrowser.Monitoring/Display/DisplayMonitor.cs index 070b4abb..f8b066d8 100644 --- a/SafeExamBrowser.Monitoring/Display/DisplayMonitor.cs +++ b/SafeExamBrowser.Monitoring/Display/DisplayMonitor.cs @@ -7,12 +7,16 @@ */ using System; +using System.Collections.Generic; +using System.Linq; +using System.Management; using System.Threading.Tasks; using System.Windows.Forms; using Microsoft.Win32; using SafeExamBrowser.Logging.Contracts; using SafeExamBrowser.Monitoring.Contracts.Display; using SafeExamBrowser.Monitoring.Contracts.Display.Events; +using SafeExamBrowser.Settings.Monitoring; using SafeExamBrowser.SystemComponents.Contracts; using SafeExamBrowser.WindowsApi.Contracts; using OperatingSystem = SafeExamBrowser.SystemComponents.Contracts.OperatingSystem; @@ -42,6 +46,41 @@ namespace SafeExamBrowser.Monitoring.Display InitializeWallpaper(); } + public bool IsAllowedConfiguration(DisplaySettings settings) + { + var allowed = false; + + if (TryLoadDisplays(out var displays)) + { + var active = displays.Where(d => d.IsActive); + var count = active.Count(); + + allowed = count <= settings.AllowedDisplays; + + if (allowed) + { + logger.Info($"Detected {count} active displays, {settings.AllowedDisplays} are allowed."); + } + else + { + logger.Warn($"Detected {count} active displays but only {settings.AllowedDisplays} are allowed!"); + } + + if (settings.InternalDisplayOnly && active.Any(d => !d.IsInternal)) + { + allowed = false; + logger.Warn("Detected external display but only internal displays are allowed!"); + } + } + else + { + allowed = settings.IgnoreError; + logger.Info("Ignoring display setup validation error and allowing active setup."); + } + + return allowed; + } + public void PreventSleepMode() { nativeMethods.PreventSleepMode(); @@ -101,7 +140,7 @@ namespace SafeExamBrowser.Monitoring.Display { var path = nativeMethods.GetWallpaperPath(); - if (!String.IsNullOrEmpty(path)) + if (!string.IsNullOrEmpty(path)) { wallpaper = path; logger.Info($"Saved wallpaper image: {wallpaper}."); @@ -112,6 +151,70 @@ namespace SafeExamBrowser.Monitoring.Display } } + private bool TryLoadDisplays(out IList displays) + { + var success = true; + + displays = new List(); + + try + { + using (var searcher = new ManagementObjectSearcher(@"Root\WMI", "SELECT * FROM WmiMonitorBasicDisplayParams")) + using (var results = searcher.Get()) + { + var displayParameters = results.Cast(); + + foreach (var display in displayParameters) + { + displays.Add(new Display + { + Identifier = Convert.ToString(display["InstanceName"]), + IsActive = Convert.ToBoolean(display["Active"]) + }); + } + } + + using (var searcher = new ManagementObjectSearcher(@"Root\WMI", "SELECT * FROM WmiMonitorConnectionParams")) + using (var results = searcher.Get()) + { + var connectionParameters = results.Cast(); + + foreach (var connection in connectionParameters) + { + var identifier = Convert.ToString(connection["InstanceName"]); + var isActive = Convert.ToBoolean(connection["Active"]); + var technologyValue = Convert.ToInt64(connection["VideoOutputTechnology"]); + var technology = (VideoOutputTechnology) technologyValue; + var display = displays.FirstOrDefault(d => d.Identifier?.Equals(identifier, StringComparison.OrdinalIgnoreCase) == true); + + if (!Enum.IsDefined(typeof(VideoOutputTechnology), technology)) + { + logger.Warn($"Detected undefined video output technology '{technologyValue}' for display '{identifier}'!"); + } + + if (display != default(Display)) + { + display.IsActive &= isActive; + display.IsInternal = technology == VideoOutputTechnology.Internal; + display.Technology = technology; + } + } + } + } + catch (Exception e) + { + success = false; + logger.Error("Failed to query displays!", e); + } + + foreach (var display in displays) + { + logger.Info($"Detected {(display.IsActive ? "active" : "inactive")}, {(display.IsInternal ? "internal" : "external")} display '{display.Identifier}' connected via '{display.Technology}'."); + } + + return success; + } + private void ResetWorkingArea() { var identifier = GetIdentifierForPrimaryDisplay(); @@ -138,9 +241,11 @@ namespace SafeExamBrowser.Monitoring.Display private string GetIdentifierForPrimaryDisplay() { - var display = Screen.PrimaryScreen.DeviceName?.Replace(@"\\.\", string.Empty); + var name = Screen.PrimaryScreen.DeviceName?.Replace(@"\\.\", string.Empty); + var resolution = $"{Screen.PrimaryScreen.Bounds.Width}x{Screen.PrimaryScreen.Bounds.Height}"; + var identifier = $"{name} ({resolution})"; - return $"{display} ({Screen.PrimaryScreen.Bounds.Width}x{Screen.PrimaryScreen.Bounds.Height})"; + return identifier; } private void LogWorkingArea(string message, IBounds area) diff --git a/SafeExamBrowser.Monitoring/Display/VideoOutputTechnology.cs b/SafeExamBrowser.Monitoring/Display/VideoOutputTechnology.cs new file mode 100644 index 00000000..605e04e3 --- /dev/null +++ b/SafeExamBrowser.Monitoring/Display/VideoOutputTechnology.cs @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2021 ETH Zürich, Educational Development and Technology (LET) + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +namespace SafeExamBrowser.Monitoring.Display +{ + /// + /// See https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/d3dkmdt/ne-d3dkmdt-_d3dkmdt_video_output_technology + /// + internal enum VideoOutputTechnology : long + { + Uninitialized = -2, + Other = -1, + HD15 = 0, + SVideo = 1, + CompositeVideo = 2, + ComponentVideo = 3, + DVI = 4, + HDMI = 5, + LVDS = 6, + DJPN = 8, + SDI = 9, + DisplayPortExternal = 10, + DisplayPortEmbedded = 11, + UDIExternal = 12, + UDIEmbedded = 13, + SDTVDongle = 14, + MiraCast = 15, + Internal = 0x80000000, + SVideo4Pin = SVideo, + SVideo7Pin = SVideo, + RF = ComponentVideo, + RCA3Component = ComponentVideo, + BNC = ComponentVideo + } +} diff --git a/SafeExamBrowser.Monitoring/SafeExamBrowser.Monitoring.csproj b/SafeExamBrowser.Monitoring/SafeExamBrowser.Monitoring.csproj index 1f8ca5f7..b8e252a8 100644 --- a/SafeExamBrowser.Monitoring/SafeExamBrowser.Monitoring.csproj +++ b/SafeExamBrowser.Monitoring/SafeExamBrowser.Monitoring.csproj @@ -51,6 +51,7 @@ + @@ -58,7 +59,9 @@ + + diff --git a/SafeExamBrowser.Runtime/CompositionRoot.cs b/SafeExamBrowser.Runtime/CompositionRoot.cs index f12daa81..8f8b6d0f 100644 --- a/SafeExamBrowser.Runtime/CompositionRoot.cs +++ b/SafeExamBrowser.Runtime/CompositionRoot.cs @@ -24,6 +24,7 @@ using SafeExamBrowser.I18n; using SafeExamBrowser.I18n.Contracts; using SafeExamBrowser.Logging; using SafeExamBrowser.Logging.Contracts; +using SafeExamBrowser.Monitoring.Display; using SafeExamBrowser.Runtime.Communication; using SafeExamBrowser.Runtime.Operations; using SafeExamBrowser.Server; @@ -63,6 +64,7 @@ namespace SafeExamBrowser.Runtime var uiFactory = new UserInterfaceFactory(text); var desktopFactory = new DesktopFactory(ModuleLogger(nameof(DesktopFactory))); var desktopMonitor = new DesktopMonitor(ModuleLogger(nameof(DesktopMonitor))); + var displayMonitor = new DisplayMonitor(ModuleLogger(nameof(DisplayMonitor)), nativeMethods, systemInfo); var explorerShell = new ExplorerShell(ModuleLogger(nameof(ExplorerShell)), nativeMethods); var fileSystem = new FileSystem(); var processFactory = new ProcessFactory(ModuleLogger(nameof(ProcessFactory))); @@ -89,6 +91,7 @@ namespace SafeExamBrowser.Runtime sessionOperations.Enqueue(new ServerOperation(args, configuration, fileSystem, logger, sessionContext, server)); sessionOperations.Enqueue(new RemoteSessionOperation(remoteSessionDetector, logger, sessionContext)); sessionOperations.Enqueue(new VirtualMachineOperation(vmDetector, logger, sessionContext)); + sessionOperations.Enqueue(new DisplayMonitorOperation(displayMonitor, logger, sessionContext)); sessionOperations.Enqueue(new ServiceOperation(logger, runtimeHost, serviceProxy, sessionContext, THIRTY_SECONDS, userInfo)); sessionOperations.Enqueue(new ClientTerminationOperation(logger, processFactory, proxyFactory, runtimeHost, sessionContext, THIRTY_SECONDS)); sessionOperations.Enqueue(new ProctoringWorkaroundOperation(logger, sessionContext)); diff --git a/SafeExamBrowser.Runtime/Operations/DisplayMonitorOperation.cs b/SafeExamBrowser.Runtime/Operations/DisplayMonitorOperation.cs new file mode 100644 index 00000000..9ead1567 --- /dev/null +++ b/SafeExamBrowser.Runtime/Operations/DisplayMonitorOperation.cs @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2021 ETH Zürich, Educational Development and Technology (LET) + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +using SafeExamBrowser.Core.Contracts.OperationModel; +using SafeExamBrowser.Core.Contracts.OperationModel.Events; +using SafeExamBrowser.I18n.Contracts; +using SafeExamBrowser.Logging.Contracts; +using SafeExamBrowser.Monitoring.Contracts.Display; +using SafeExamBrowser.Runtime.Operations.Events; +using SafeExamBrowser.UserInterface.Contracts.MessageBox; + +namespace SafeExamBrowser.Runtime.Operations +{ + internal class DisplayMonitorOperation : SessionOperation + { + private readonly IDisplayMonitor displayMonitor; + private readonly ILogger logger; + + public override event ActionRequiredEventHandler ActionRequired; + public override event StatusChangedEventHandler StatusChanged; + + public DisplayMonitorOperation(IDisplayMonitor displayMonitor, ILogger logger, SessionContext context) : base(context) + { + this.displayMonitor = displayMonitor; + this.logger = logger; + } + + public override OperationResult Perform() + { + return CheckDisplayConfiguration(); + } + + public override OperationResult Repeat() + { + return CheckDisplayConfiguration(); + } + + public override OperationResult Revert() + { + return OperationResult.Success; + } + + private OperationResult CheckDisplayConfiguration() + { + var args = new MessageEventArgs + { + Action = MessageBoxAction.Ok, + Icon = MessageBoxIcon.Error, + Message = TextKey.MessageBox_DisplayConfigurationError, + Title = TextKey.MessageBox_DisplayConfigurationErrorTitle + }; + var result = OperationResult.Aborted; + + logger.Info("Validating display configuration..."); + StatusChanged?.Invoke(TextKey.OperationStatus_ValidateDisplayConfiguration); + + if (displayMonitor.IsAllowedConfiguration(Context.Next.Settings.Display)) + { + logger.Info("Display configuration is allowed."); + result = OperationResult.Success; + } + else + { + logger.Error("Display configuration is not allowed!"); + ActionRequired?.Invoke(args); + } + + return result; + } + } +} diff --git a/SafeExamBrowser.Runtime/SafeExamBrowser.Runtime.csproj b/SafeExamBrowser.Runtime/SafeExamBrowser.Runtime.csproj index 9e94a445..3f7a042b 100644 --- a/SafeExamBrowser.Runtime/SafeExamBrowser.Runtime.csproj +++ b/SafeExamBrowser.Runtime/SafeExamBrowser.Runtime.csproj @@ -95,6 +95,7 @@ + @@ -188,6 +189,14 @@ {e107026c-2011-4552-a7d8-3a0d37881df6} SafeExamBrowser.Logging + + {6d563a30-366d-4c35-815b-2c9e6872278b} + SafeExamBrowser.Monitoring.Contracts + + + {ef563531-4eb5-44b9-a5ec-d6d6f204469b} + SafeExamBrowser.Monitoring + {db701e6f-bddc-4cec-b662-335a9dc11809} SafeExamBrowser.Server.Contracts diff --git a/SafeExamBrowser.Settings/AppSettings.cs b/SafeExamBrowser.Settings/AppSettings.cs index f5ce07a6..26872584 100644 --- a/SafeExamBrowser.Settings/AppSettings.cs +++ b/SafeExamBrowser.Settings/AppSettings.cs @@ -51,6 +51,11 @@ namespace SafeExamBrowser.Settings /// public ConfigurationMode ConfigurationMode { get; set; } + /// + /// All display-related settings. + /// + public DisplaySettings Display { get; set; } + /// /// All keyboard-related settings. /// @@ -107,6 +112,7 @@ namespace SafeExamBrowser.Settings Applications = new ApplicationSettings(); Audio = new AudioSettings(); Browser = new BrowserSettings(); + Display = new DisplaySettings(); Keyboard = new KeyboardSettings(); Mouse = new MouseSettings(); Proctoring = new ProctoringSettings(); diff --git a/SafeExamBrowser.Settings/Monitoring/DisplaySettings.cs b/SafeExamBrowser.Settings/Monitoring/DisplaySettings.cs new file mode 100644 index 00000000..30f18b00 --- /dev/null +++ b/SafeExamBrowser.Settings/Monitoring/DisplaySettings.cs @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2021 ETH Zürich, Educational Development and Technology (LET) + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +using System; + +namespace SafeExamBrowser.Settings.Monitoring +{ + /// + /// Defines all settings related to the display configuration monitoring. + /// + [Serializable] + public class DisplaySettings + { + /// + /// Defines the number of allowed displays. + /// + public int AllowedDisplays { get; set; } + + /// + /// Determines whether any display configuration may be allowed when the configuration can't be verified due to an error. + /// + public bool IgnoreError { get; set; } + + /// + /// Determines whether only an internal display may be used. + /// + public bool InternalDisplayOnly { get; set; } + } +} diff --git a/SafeExamBrowser.Settings/SafeExamBrowser.Settings.csproj b/SafeExamBrowser.Settings/SafeExamBrowser.Settings.csproj index afd1c6c3..d1b164fd 100644 --- a/SafeExamBrowser.Settings/SafeExamBrowser.Settings.csproj +++ b/SafeExamBrowser.Settings/SafeExamBrowser.Settings.csproj @@ -71,6 +71,7 @@ + diff --git a/SafeExamBrowser.SystemComponents/SystemInfo.cs b/SafeExamBrowser.SystemComponents/SystemInfo.cs index 277c1e19..6f5c999f 100644 --- a/SafeExamBrowser.SystemComponents/SystemInfo.cs +++ b/SafeExamBrowser.SystemComponents/SystemInfo.cs @@ -55,7 +55,7 @@ namespace SafeExamBrowser.SystemComponents try { - using (var searcher = new ManagementObjectSearcher("Select * from Win32_ComputerSystem")) + using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_ComputerSystem")) using (var results = searcher.Get()) using (var system = results.Cast().First()) { diff --git a/SebWindowsConfig/SEBSettings.cs b/SebWindowsConfig/SEBSettings.cs index a6bd1f96..3a4c049f 100644 --- a/SebWindowsConfig/SEBSettings.cs +++ b/SebWindowsConfig/SEBSettings.cs @@ -381,7 +381,7 @@ namespace SebWindowsConfig public const String KeyAllowDisplayMirroring = "allowDisplayMirroring"; public const String KeyAllowedDisplaysMaxNumber = "allowedDisplaysMaxNumber"; public const String KeyAllowedDisplayBuiltin = "allowedDisplayBuiltin"; - + public const String KeyAllowedDisplayBuiltinEnforce = "allowedDisplayBuiltinEnforce"; // Group "Registry" @@ -974,6 +974,7 @@ namespace SebWindowsConfig SEBSettings.settingsDefault.Add(SEBSettings.KeyAllowDisplayMirroring, false); SEBSettings.settingsDefault.Add(SEBSettings.KeyAllowedDisplaysMaxNumber, 1); SEBSettings.settingsDefault.Add(SEBSettings.KeyAllowedDisplayBuiltin, true); + SEBSettings.settingsDefault.Add(SEBSettings.KeyAllowedDisplayBuiltinEnforce, false); SEBSettings.settingsDefault.Add(SEBSettings.KeyAllowChromeNotifications, false); SEBSettings.settingsDefault.Add(SEBSettings.KeyAllowWindowsUpdate, false); diff --git a/SebWindowsConfig/SebWindowsConfigForm.Designer.cs b/SebWindowsConfig/SebWindowsConfigForm.Designer.cs index 7645ecfa..0eab55e5 100644 --- a/SebWindowsConfig/SebWindowsConfigForm.Designer.cs +++ b/SebWindowsConfig/SebWindowsConfigForm.Designer.cs @@ -30,8 +30,8 @@ namespace SebWindowsConfig { this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SebWindowsConfigForm)); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle4 = new System.Windows.Forms.DataGridViewCellStyle(); this.openFileDialogSebConfigFile = new System.Windows.Forms.OpenFileDialog(); this.saveFileDialogSebConfigFile = new System.Windows.Forms.SaveFileDialog(); this.imageListTabIcons = new System.Windows.Forms.ImageList(this.components); @@ -83,13 +83,13 @@ namespace SebWindowsConfig this.labelSebServicePolicy = new System.Windows.Forms.Label(); this.checkBoxAllowScreenSharing = new System.Windows.Forms.CheckBox(); this.checkBoxShowLogButton = new System.Windows.Forms.CheckBox(); + this.comboBoxAllowedDisplaysMaxNumber = new System.Windows.Forms.ComboBox(); this.checkBoxAllowLogAccess = new System.Windows.Forms.CheckBox(); + this.label13 = new System.Windows.Forms.Label(); this.checkBoxEnablePrivateClipboard = new System.Windows.Forms.CheckBox(); this.groupBox1 = new System.Windows.Forms.GroupBox(); this.label14 = new System.Windows.Forms.Label(); this.comboBoxMinMacOSVersion = new System.Windows.Forms.ComboBox(); - this.comboBoxAllowedDisplaysMaxNumber = new System.Windows.Forms.ComboBox(); - this.label13 = new System.Windows.Forms.Label(); this.checkBoxAllowedDisplayBuiltin = new System.Windows.Forms.CheckBox(); this.checkBoxAllowDisplayMirroring = new System.Windows.Forms.CheckBox(); this.checkBoxDetectStoppedProcess = new System.Windows.Forms.CheckBox(); @@ -456,6 +456,7 @@ namespace SebWindowsConfig this.editDuplicateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.configureClientToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.applyAndStartSEBToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.checkBoxEnforceBuiltinDisplay = new System.Windows.Forms.CheckBox(); this.tabPageHookedKeys.SuspendLayout(); this.groupBoxFunctionKeys.SuspendLayout(); this.groupBoxSpecialKeys.SuspendLayout(); @@ -1080,9 +1081,12 @@ namespace SebWindowsConfig // // tabPageSecurity // + this.tabPageSecurity.Controls.Add(this.checkBoxEnforceBuiltinDisplay); this.tabPageSecurity.Controls.Add(this.groupBoxSebService); this.tabPageSecurity.Controls.Add(this.checkBoxShowLogButton); + this.tabPageSecurity.Controls.Add(this.comboBoxAllowedDisplaysMaxNumber); this.tabPageSecurity.Controls.Add(this.checkBoxAllowLogAccess); + this.tabPageSecurity.Controls.Add(this.label13); this.tabPageSecurity.Controls.Add(this.checkBoxEnablePrivateClipboard); this.tabPageSecurity.Controls.Add(this.groupBox1); this.tabPageSecurity.Controls.Add(this.groupBox10); @@ -1196,7 +1200,7 @@ namespace SebWindowsConfig // checkBoxShowLogButton // this.checkBoxShowLogButton.AutoSize = true; - this.checkBoxShowLogButton.Location = new System.Drawing.Point(358, 337); + this.checkBoxShowLogButton.Location = new System.Drawing.Point(617, 323); this.checkBoxShowLogButton.Margin = new System.Windows.Forms.Padding(2); this.checkBoxShowLogButton.Name = "checkBoxShowLogButton"; this.checkBoxShowLogButton.Size = new System.Drawing.Size(180, 17); @@ -1205,10 +1209,24 @@ namespace SebWindowsConfig this.checkBoxShowLogButton.UseVisualStyleBackColor = true; this.checkBoxShowLogButton.CheckedChanged += new System.EventHandler(this.checkBoxShowLogButton_CheckedChanged); // + // comboBoxAllowedDisplaysMaxNumber + // + this.comboBoxAllowedDisplaysMaxNumber.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.comboBoxAllowedDisplaysMaxNumber.FormattingEnabled = true; + this.comboBoxAllowedDisplaysMaxNumber.Location = new System.Drawing.Point(833, 267); + this.comboBoxAllowedDisplaysMaxNumber.Margin = new System.Windows.Forms.Padding(2, 1, 2, 1); + this.comboBoxAllowedDisplaysMaxNumber.Name = "comboBoxAllowedDisplaysMaxNumber"; + this.comboBoxAllowedDisplaysMaxNumber.Size = new System.Drawing.Size(57, 21); + this.comboBoxAllowedDisplaysMaxNumber.TabIndex = 100; + this.toolTip1.SetToolTip(this.comboBoxAllowedDisplaysMaxNumber, "If more displays are connected, these are blanked with an orange full screen wind" + + "ow"); + this.comboBoxAllowedDisplaysMaxNumber.SelectedIndexChanged += new System.EventHandler(this.comboBoxAllowedDisplaysMaxNumber_SelectedIndexChanged); + this.comboBoxAllowedDisplaysMaxNumber.TextChanged += new System.EventHandler(this.comboBoxAllowedDisplaysMaxNumber_TextChanged); + // // checkBoxAllowLogAccess // this.checkBoxAllowLogAccess.AutoSize = true; - this.checkBoxAllowLogAccess.Location = new System.Drawing.Point(328, 317); + this.checkBoxAllowLogAccess.Location = new System.Drawing.Point(598, 304); this.checkBoxAllowLogAccess.Margin = new System.Windows.Forms.Padding(2); this.checkBoxAllowLogAccess.Name = "checkBoxAllowLogAccess"; this.checkBoxAllowLogAccess.Size = new System.Drawing.Size(199, 17); @@ -1217,11 +1235,24 @@ namespace SebWindowsConfig this.checkBoxAllowLogAccess.UseVisualStyleBackColor = true; this.checkBoxAllowLogAccess.CheckedChanged += new System.EventHandler(this.checkBoxAllowLogAccess_CheckedChanged); // + // label13 + // + this.label13.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.label13.AutoSize = true; + this.label13.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label13.Location = new System.Drawing.Point(595, 270); + this.label13.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(234, 13); + this.label13.TabIndex = 101; + this.label13.Text = "Maximum allowed number of connected displays"; + this.label13.TextAlign = System.Drawing.ContentAlignment.TopRight; + // // checkBoxEnablePrivateClipboard // this.checkBoxEnablePrivateClipboard.AutoSize = true; this.checkBoxEnablePrivateClipboard.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.checkBoxEnablePrivateClipboard.Location = new System.Drawing.Point(328, 278); + this.checkBoxEnablePrivateClipboard.Location = new System.Drawing.Point(328, 297); this.checkBoxEnablePrivateClipboard.Margin = new System.Windows.Forms.Padding(2, 1, 2, 1); this.checkBoxEnablePrivateClipboard.Name = "checkBoxEnablePrivateClipboard"; this.checkBoxEnablePrivateClipboard.Size = new System.Drawing.Size(156, 17); @@ -1236,8 +1267,6 @@ namespace SebWindowsConfig // this.groupBox1.Controls.Add(this.label14); this.groupBox1.Controls.Add(this.comboBoxMinMacOSVersion); - this.groupBox1.Controls.Add(this.comboBoxAllowedDisplaysMaxNumber); - this.groupBox1.Controls.Add(this.label13); this.groupBox1.Controls.Add(this.checkBoxAllowedDisplayBuiltin); this.groupBox1.Controls.Add(this.checkBoxAllowDisplayMirroring); this.groupBox1.Controls.Add(this.checkBoxDetectStoppedProcess); @@ -1280,39 +1309,12 @@ namespace SebWindowsConfig this.comboBoxMinMacOSVersion.SelectedIndexChanged += new System.EventHandler(this.comboBoxMinMacOSVersion_SelectedIndexChanged); this.comboBoxMinMacOSVersion.TextChanged += new System.EventHandler(this.comboBoxMinMacOSVersion_TextChanged); // - // comboBoxAllowedDisplaysMaxNumber - // - this.comboBoxAllowedDisplaysMaxNumber.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.comboBoxAllowedDisplaysMaxNumber.FormattingEnabled = true; - this.comboBoxAllowedDisplaysMaxNumber.Location = new System.Drawing.Point(527, 159); - this.comboBoxAllowedDisplaysMaxNumber.Margin = new System.Windows.Forms.Padding(2, 1, 2, 1); - this.comboBoxAllowedDisplaysMaxNumber.Name = "comboBoxAllowedDisplaysMaxNumber"; - this.comboBoxAllowedDisplaysMaxNumber.Size = new System.Drawing.Size(93, 21); - this.comboBoxAllowedDisplaysMaxNumber.TabIndex = 100; - this.toolTip1.SetToolTip(this.comboBoxAllowedDisplaysMaxNumber, "If more displays are connected, these are blanked with an orange full screen wind" + - "ow"); - this.comboBoxAllowedDisplaysMaxNumber.SelectedIndexChanged += new System.EventHandler(this.comboBoxAllowedDisplaysMaxNumber_SelectedIndexChanged); - this.comboBoxAllowedDisplaysMaxNumber.TextChanged += new System.EventHandler(this.comboBoxAllowedDisplaysMaxNumber_TextChanged); - // - // label13 - // - this.label13.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.label13.AutoSize = true; - this.label13.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label13.Location = new System.Drawing.Point(289, 162); - this.label13.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); - this.label13.Name = "label13"; - this.label13.Size = new System.Drawing.Size(234, 13); - this.label13.TabIndex = 101; - this.label13.Text = "Maximum allowed number of connected displays"; - this.label13.TextAlign = System.Drawing.ContentAlignment.TopRight; - // // checkBoxAllowedDisplayBuiltin // this.checkBoxAllowedDisplayBuiltin.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.checkBoxAllowedDisplayBuiltin.AutoSize = true; this.checkBoxAllowedDisplayBuiltin.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.checkBoxAllowedDisplayBuiltin.Location = new System.Drawing.Point(514, 184); + this.checkBoxAllowedDisplayBuiltin.Location = new System.Drawing.Point(15, 181); this.checkBoxAllowedDisplayBuiltin.Margin = new System.Windows.Forms.Padding(2, 1, 2, 1); this.checkBoxAllowedDisplayBuiltin.Name = "checkBoxAllowedDisplayBuiltin"; this.checkBoxAllowedDisplayBuiltin.Size = new System.Drawing.Size(113, 17); @@ -1327,7 +1329,7 @@ namespace SebWindowsConfig // this.checkBoxAllowDisplayMirroring.AutoSize = true; this.checkBoxAllowDisplayMirroring.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.checkBoxAllowDisplayMirroring.Location = new System.Drawing.Point(15, 140); + this.checkBoxAllowDisplayMirroring.Location = new System.Drawing.Point(15, 143); this.checkBoxAllowDisplayMirroring.Margin = new System.Windows.Forms.Padding(2, 1, 2, 1); this.checkBoxAllowDisplayMirroring.Name = "checkBoxAllowDisplayMirroring"; this.checkBoxAllowDisplayMirroring.Size = new System.Drawing.Size(263, 17); @@ -1342,7 +1344,7 @@ namespace SebWindowsConfig // this.checkBoxDetectStoppedProcess.AutoSize = true; this.checkBoxDetectStoppedProcess.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.checkBoxDetectStoppedProcess.Location = new System.Drawing.Point(15, 121); + this.checkBoxDetectStoppedProcess.Location = new System.Drawing.Point(15, 124); this.checkBoxDetectStoppedProcess.Margin = new System.Windows.Forms.Padding(2, 1, 2, 1); this.checkBoxDetectStoppedProcess.Name = "checkBoxDetectStoppedProcess"; this.checkBoxDetectStoppedProcess.Size = new System.Drawing.Size(214, 17); @@ -1357,7 +1359,7 @@ namespace SebWindowsConfig // this.checkBoxAllowDictation.AutoSize = true; this.checkBoxAllowDictation.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.checkBoxAllowDictation.Location = new System.Drawing.Point(15, 102); + this.checkBoxAllowDictation.Location = new System.Drawing.Point(15, 105); this.checkBoxAllowDictation.Margin = new System.Windows.Forms.Padding(2, 1, 2, 1); this.checkBoxAllowDictation.Name = "checkBoxAllowDictation"; this.checkBoxAllowDictation.Size = new System.Drawing.Size(126, 17); @@ -1373,7 +1375,7 @@ namespace SebWindowsConfig this.checkBoxAllowUserAppFolderInstall.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.checkBoxAllowUserAppFolderInstall.AutoSize = true; this.checkBoxAllowUserAppFolderInstall.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.checkBoxAllowUserAppFolderInstall.Location = new System.Drawing.Point(421, 64); + this.checkBoxAllowUserAppFolderInstall.Location = new System.Drawing.Point(15, 162); this.checkBoxAllowUserAppFolderInstall.Margin = new System.Windows.Forms.Padding(2, 1, 2, 1); this.checkBoxAllowUserAppFolderInstall.Name = "checkBoxAllowUserAppFolderInstall"; this.checkBoxAllowUserAppFolderInstall.Size = new System.Drawing.Size(204, 17); @@ -1388,7 +1390,7 @@ namespace SebWindowsConfig // this.checkBoxAllowSiri.AutoSize = true; this.checkBoxAllowSiri.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.checkBoxAllowSiri.Location = new System.Drawing.Point(15, 83); + this.checkBoxAllowSiri.Location = new System.Drawing.Point(15, 86); this.checkBoxAllowSiri.Margin = new System.Windows.Forms.Padding(2, 1, 2, 1); this.checkBoxAllowSiri.Name = "checkBoxAllowSiri"; this.checkBoxAllowSiri.Size = new System.Drawing.Size(100, 17); @@ -1404,7 +1406,7 @@ namespace SebWindowsConfig // this.checkBoxForceAppFolderInstall.AutoSize = true; this.checkBoxForceAppFolderInstall.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.checkBoxForceAppFolderInstall.Location = new System.Drawing.Point(15, 64); + this.checkBoxForceAppFolderInstall.Location = new System.Drawing.Point(15, 67); this.checkBoxForceAppFolderInstall.Margin = new System.Windows.Forms.Padding(2, 1, 2, 1); this.checkBoxForceAppFolderInstall.Name = "checkBoxForceAppFolderInstall"; this.checkBoxForceAppFolderInstall.Size = new System.Drawing.Size(205, 17); @@ -1418,7 +1420,7 @@ namespace SebWindowsConfig // this.checkBoxEnableAppSwitcherCheck.AutoSize = true; this.checkBoxEnableAppSwitcherCheck.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.checkBoxEnableAppSwitcherCheck.Location = new System.Drawing.Point(15, 43); + this.checkBoxEnableAppSwitcherCheck.Location = new System.Drawing.Point(15, 46); this.checkBoxEnableAppSwitcherCheck.Margin = new System.Windows.Forms.Padding(2, 1, 2, 1); this.checkBoxEnableAppSwitcherCheck.Name = "checkBoxEnableAppSwitcherCheck"; this.checkBoxEnableAppSwitcherCheck.Size = new System.Drawing.Size(220, 17); @@ -1437,7 +1439,7 @@ namespace SebWindowsConfig this.groupBox10.Controls.Add(this.textBoxLogDirectoryWin); this.groupBox10.Controls.Add(this.label4); this.groupBox10.Controls.Add(this.checkBoxUseStandardDirectory); - this.groupBox10.Location = new System.Drawing.Point(583, 259); + this.groupBox10.Location = new System.Drawing.Point(23, 381); this.groupBox10.Name = "groupBox10"; this.groupBox10.Size = new System.Drawing.Size(555, 142); this.groupBox10.TabIndex = 95; @@ -1517,7 +1519,7 @@ namespace SebWindowsConfig // this.checkBoxEnableScreenCapture.AutoSize = true; this.checkBoxEnableScreenCapture.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.checkBoxEnableScreenCapture.Location = new System.Drawing.Point(328, 259); + this.checkBoxEnableScreenCapture.Location = new System.Drawing.Point(328, 278); this.checkBoxEnableScreenCapture.Margin = new System.Windows.Forms.Padding(2, 1, 2, 1); this.checkBoxEnableScreenCapture.Name = "checkBoxEnableScreenCapture"; this.checkBoxEnableScreenCapture.Size = new System.Drawing.Size(191, 17); @@ -1592,7 +1594,7 @@ namespace SebWindowsConfig // this.checkBoxAllowVirtualMachine.AutoSize = true; this.checkBoxAllowVirtualMachine.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.checkBoxAllowVirtualMachine.Location = new System.Drawing.Point(328, 297); + this.checkBoxAllowVirtualMachine.Location = new System.Drawing.Point(328, 316); this.checkBoxAllowVirtualMachine.Margin = new System.Windows.Forms.Padding(2, 1, 2, 1); this.checkBoxAllowVirtualMachine.Name = "checkBoxAllowVirtualMachine"; this.checkBoxAllowVirtualMachine.Size = new System.Drawing.Size(185, 17); @@ -1828,8 +1830,8 @@ namespace SebWindowsConfig // // Type // - dataGridViewCellStyle1.BackColor = System.Drawing.Color.Silver; - this.Type.DefaultCellStyle = dataGridViewCellStyle1; + dataGridViewCellStyle3.BackColor = System.Drawing.Color.Silver; + this.Type.DefaultCellStyle = dataGridViewCellStyle3; this.Type.HeaderText = "Type"; this.Type.Name = "Type"; this.Type.ReadOnly = true; @@ -4530,8 +4532,8 @@ namespace SebWindowsConfig // spellCheckerDictionaryFilesColumn // this.spellCheckerDictionaryFilesColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; - dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.True; - this.spellCheckerDictionaryFilesColumn.DefaultCellStyle = dataGridViewCellStyle2; + dataGridViewCellStyle4.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.spellCheckerDictionaryFilesColumn.DefaultCellStyle = dataGridViewCellStyle4; this.spellCheckerDictionaryFilesColumn.HeaderText = "Files"; this.spellCheckerDictionaryFilesColumn.Name = "spellCheckerDictionaryFilesColumn"; this.spellCheckerDictionaryFilesColumn.ReadOnly = true; @@ -5928,6 +5930,17 @@ namespace SebWindowsConfig this.applyAndStartSEBToolStripMenuItem.Visible = false; this.applyAndStartSEBToolStripMenuItem.Click += new System.EventHandler(this.applyAndStartSEBToolStripMenuItem_Click); // + // checkBoxEnforceBuiltinDisplay + // + this.checkBoxEnforceBuiltinDisplay.AutoSize = true; + this.checkBoxEnforceBuiltinDisplay.Location = new System.Drawing.Point(617, 286); + this.checkBoxEnforceBuiltinDisplay.Name = "checkBoxEnforceBuiltinDisplay"; + this.checkBoxEnforceBuiltinDisplay.Size = new System.Drawing.Size(193, 17); + this.checkBoxEnforceBuiltinDisplay.TabIndex = 107; + this.checkBoxEnforceBuiltinDisplay.Text = "Allow only internal displays (laptops)"; + this.checkBoxEnforceBuiltinDisplay.UseVisualStyleBackColor = true; + this.checkBoxEnforceBuiltinDisplay.CheckedChanged += new System.EventHandler(this.checkBoxEnforceBuiltinDisplay_CheckedChanged); + // // SebWindowsConfigForm // this.AllowDrop = true; @@ -6485,6 +6498,7 @@ namespace SebWindowsConfig private System.Windows.Forms.DataGridViewComboBoxColumn dataGridViewComboBoxColumn1; private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn1; private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn2; + private System.Windows.Forms.CheckBox checkBoxEnforceBuiltinDisplay; } } diff --git a/SebWindowsConfig/SebWindowsConfigForm.cs b/SebWindowsConfig/SebWindowsConfigForm.cs index fc890098..22c8eaf5 100644 --- a/SebWindowsConfig/SebWindowsConfigForm.cs +++ b/SebWindowsConfig/SebWindowsConfigForm.cs @@ -812,7 +812,7 @@ namespace SebWindowsConfig checkBoxAllowDisplayMirroring.Checked = (Boolean)SEBSettings.settingsCurrent[SEBSettings.KeyAllowDisplayMirroring]; comboBoxAllowedDisplaysMaxNumber.Text = (String)SEBSettings.settingsCurrent[SEBSettings.KeyAllowedDisplaysMaxNumber].ToString(); checkBoxAllowedDisplayBuiltin.Checked = (Boolean)SEBSettings.settingsCurrent[SEBSettings.KeyAllowedDisplayBuiltin]; - + checkBoxEnforceBuiltinDisplay.Checked = (Boolean)SEBSettings.settingsCurrent[SEBSettings.KeyAllowedDisplayBuiltinEnforce]; // Group "Registry" checkBoxInsideSebEnableSwitchUser.Checked = (Boolean)SEBSettings.settingsCurrent[SEBSettings.KeyInsideSebEnableSwitchUser]; @@ -4625,5 +4625,10 @@ namespace SebWindowsConfig { SEBSettings.settingsCurrent[SEBSettings.KeyNewBrowserWindowUrlPolicy] = comboBoxUrlPolicyNewWindow.SelectedIndex; } + + private void checkBoxEnforceBuiltinDisplay_CheckedChanged(object sender, EventArgs e) + { + SEBSettings.settingsCurrent[SEBSettings.KeyAllowedDisplayBuiltinEnforce] = checkBoxEnforceBuiltinDisplay.Checked; + } } } diff --git a/SebWindowsConfig/SebWindowsConfigForm.resx b/SebWindowsConfig/SebWindowsConfigForm.resx index 7464a88d..fd7cc1d3 100644 --- a/SebWindowsConfig/SebWindowsConfigForm.resx +++ b/SebWindowsConfig/SebWindowsConfigForm.resx @@ -131,7 +131,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAi - 1gAAAk1TRnQBSQFMAgEBDAEAAagBCwGoAQsBIAEAASABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAGA + 1gAAAk1TRnQBSQFMAgEBDAEAAcABCwHAAQsBIAEAASABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAGA AwABgAMAAQEBAAEgBwABAf8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A0QABjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGO @@ -159,8 +159,8 @@ Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA Af8DAAH/AwAB/wNUAe4QAAMyAVEDTQH6A00B+gNNAfoDTQH6A00B+gNNAfoDTQH6A00B+gNNAfoDTQH6 A00B+gNNAfoDTQH6A00B+gNNAfoDTQH6A00B+gNNAfoDTQH6A00B+gNNAfoDTQH6AzYBWTQAAzIBUANc - Ad8BsQGvAa0B/wGlAaIBoQH/AZIBjwGOAf8BhgGDAYIB/wGAATgBNwH/AYABOAE3Af8BgAE4ATcB/wGA - ATgBNwH/AYABOAE3Af8BigGHAYYB/wGWAZMBkgH/AaUBogGgAf8BpgGjAaEB/wNUAa8DFwEgGAABjgGL + Ad8BsQGvAa0B/wGlAaIBoQH/AZIBjwGOAf8BhgGDAYIB/wGAATUBNAH/AYABNQE0Af8BgAE1ATQB/wGA + ATUBNAH/AYABNQE0Af8BigGHAYYB/wGWAZMBkgH/AaUBogGgAf8BpgGjAaEB/wNUAa8DFwEgGAABjgGL AQAB/wGOAYsBAAH/AbsBuQEAAf8C/gH9Af8C/gH9Af8C/gH9Af8C9AHmAf8BwgHAAQAB/wL+Af0B/wL+ Af0B/wL+Af0B/wLwAd0B/wHGAcQBAAH/Av4B/QH/Av4B/QH/Av4B/QH/AekB6AHOAf8BqwGoAQAB/wGP AYwBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEA @@ -168,16 +168,16 @@ Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/xAA AzQBVFj/AzgBXCwAAwwBEANRAZ8BtQGyAbAB/wGpAaYBpAH/AZIBjwGNAf8BhAGBAYAB/wGRAY4BjAH/ - AZkBlgGUAf8BjwGMAYoB/wGEAYEBgAH/AYABOAE3Af8BgAE4ATcB/wGAATgBNwH/AYABOAE3Af8BgAE4 - ATcB/wGAATgBNwH/AZEBjgGNAf8BpAGhAZ8B/wNiAe8DMgFQFAABjgGLAQAB/wGOAYsBAAH/AbsBuQEA + AZkBlgGUAf8BjwGMAYoB/wGEAYEBgAH/AYABNQE0Af8BgAE1ATQB/wGAATUBNAH/AYABNQE0Af8BgAE1 + ATQB/wGAATUBNAH/AZEBjgGNAf8BpAGhAZ8B/wNiAe8DMgFQFAABjgGLAQAB/wGOAYsBAAH/AbsBuQEA Af8MAAL1AegB/wHCAcABAAH/DAAC8QHfAf8BxgHEAQAB/wwAAeoB6QHPAf8B0gHRAZoB/wG+AbwBAAH/ AY8BjAEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGL AQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8DAAH/AwAB/wMAAf8DmgH/ A6IB/wOiAf8DogH/A6IB/wOiAf8DogH/A6IB/wOiAf8DogH/A6IB/wOiAf8DogH/A6IB/wOiAf8DogH/ A6IB/wOiAf8DogH/A6IB/wOiAf8DogH/A6IB/wOiAf8DogH/A5oB/wMAAf8DAAH/AwAB/xAAAzMBU1j/ AzcBWygAAwwBEANcAc8BtwG0AbIB/wGfAZwBmwH/AYsBiAGHAf8BiQGGAYQB/wGYAZUBkwH/AakBpgGk - Af8BpwGkAaIB/wGkAaEBnwH/AaIBnwGdAf8BlgGTAZEB/wGFAYIBgQH/AYABOAE3Af8BgAE4ATcB/wGA - ATgBNwH/AYABOAE3Af8BgAE4ATcB/wGCAToBOQH/AZ0BmgGYAf8BpQGiAaAB/wM6AWAQAAGOAYsBAAH/ + Af8BpwGkAaIB/wGkAaEBnwH/AaIBnwGdAf8BlgGTAZEB/wGFAYIBgQH/AYABNQE0Af8BgAE1ATQB/wGA + ATUBNAH/AYABNQE0Af8BgAE1ATQB/wGCATcBNgH/AZ0BmgGYAf8BpQGiAaAB/wM6AWAQAAGOAYsBAAH/ AY4BiwEAAf8BuwG5AQAB/wwAAvUB6AH/AcIBwAEAAf8MAALxAd8B/wHGAcQBAAH/DAAB6gHpAc8B/wHS AdEBmgH/Ad0B3AGyAf8BxQHDAQAB/wGPAYwBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEA Af8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wMA @@ -185,7 +185,7 @@ Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DkwH/A6IB/wMA Af8DAAH/EAADMwFTWP8DNwFbKAADXAHPAbcBtAGyAf8BmwGYAZYB/wGQAY0BiwH/AY0BigGJAf8BiwGI AYcB/wGoAaUBowH/AaoBpwGlAf8BpwGkAaIB/wGmAaMBoQH/AaMBoAGeAf8BogGfAZ0B/wGdAZoBmAH/ - AY0BigGJAf8BgQE5ATgB/wGAATgBNwH/AYABOAE3Af8BgAE4ATcB/wGAATgBNwH/AYABOAE3Af8BmAGV + AY0BigGJAf8BgQE2ATUB/wGAATUBNAH/AYABNQE0Af8BgAE1ATQB/wGAATUBNAH/AYABNQE0Af8BmAGV AZMB/wGlAaIBoAH/AzoBYAwAAY4BiwEAAf8BjgGLAQAB/wG7AbkBAAH/DAAC9QHoAf8BwgHAAQAB/wwA AvEB3wH/AcYBxAEAAf8MAAHqAekBzwH/AdIB0QGaAf8B3QHcAbIB/wHdAdwBsgH/Ac8BzgGSAf8BjgGL AQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/ @@ -194,7 +194,7 @@ AwAB/wMAAf8DAAH/AwAB/wMAAf8DkwH/A5oB/wMAAf8QAAMzAVNY/wM3AVskAANMAY8BuwG4AbcB/wGh AZ4BnAH/AZQBkQGPAf8BkgGPAY0B/wGQAY0BiwH/AY0BigGJAf8BqgGnAaUB/wGqAacBpQH/AagBpQGj Af8BpwGkAaIB/wGkAaEBnwH/AaMBoAGeAf8BoQGeAZwB/wGhAZ4BnAH/AZ4BmwGZAf8BkQGOAYwB/wGC - AToBOQH/AYABOAE3Af8BgAE4ATcB/wGAATgBNwH/AYABOAE3Af8BmAGVAZMB/wGlAaIBoAH/AyEBMAgA + ATcBNgH/AYABNQE0Af8BgAE1ATQB/wGAATUBNAH/AYABNQE0Af8BmAGVAZMB/wGlAaIBoAH/AyEBMAgA AY4BiwEAAf8BjgGLAQAB/wGfAZwBAAH/AbgBtgEAAf8BuAG2AQAB/wG4AbYBAAH/AbQBsgEAAf8BoQGf AQAB/wG4AbYBAAH/AbgBtgEAAf8BuAG2AQAB/wGyAbABAAH/AacBpAEAAf8BvgG9AQAB/wG+Ab0BAAH/ Ab4BvQEAAf8BuAG2AQAB/wHQAc8BlQH/Ad0B3AGyAf8B3QHcAbIB/wLqAdAB/wGOAYsBAAH/AY4BiwEA @@ -204,7 +204,7 @@ Af8DAAH/AwAB/wMAAf8DogH/AwAB/xAAAzMBU1j/AzcBWyAAAyoBQAG8AboBuAH/AasBqAGnAf8BmAGV AZMB/wGWAZMBkQH/AZQBkQGPAf8BkgGPAY0B/wGQAY0BiwH/AasBqAGmAf8BqwGoAaYB/wGpAaYBpAH/ AacBpAGiAf8BpQGiAaAB/wGjAaABngH/AaEBngGcAf8BoQGeAZwB/wGhAZ4BnAH/AaEBngGcAf8BmwGY - AZYB/wGBATkBOAH/AYABOAE3Af8BgAE4ATcB/wGAATgBNwH/AYIBOgE5Af8BoQGeAZ0B/wNcAc8IAAGO + AZYB/wGBATYBNQH/AYABNQE0Af8BgAE1ATQB/wGAATUBNAH/AYIBNwE2Af8BoQGeAZ0B/wNcAc8IAAGO AYsBAAH/AY4BiwEAAf8BuwG5AQAB/wwAAvUB6AH/AcIBwAEAAf8MAALxAd8B/wGzAbEBAAH/AuYBxwH/ Ae0B7AHWAf8B7QHsAdYB/wHtAewB1gH/AcQBwgEAAf8BzAHLAYwB/wHdAdwBsgH/AuoB0AH/AY4BiwEA Af8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGO @@ -213,16 +213,16 @@ AwAB/wMAAf8DogH/AwAB/xAAAzMBU1j/AzcBWyAAA1kBvwG6AbcBtQH/AZ0BmgGYAf8BmwGYAZYB/wGY AZUBkwH/AZYBkwGRAf8BlAGRAY8B/wGSAY8BjQH/AagBpQGjAf8BnQGaAZkB/wGqAacBpQH/AagBpQGj Af8BpgGjAaEB/wGkAaEBnwH/AaIBnwGdAf8BoQGeAZwB/wGhAZ4BnAH/AaEBngGcAf8BoQGeAZwB/wGF - AYIBgAH/AYABOAE3Af8BgAE4ATcB/wGAATgBNwH/AYABOAE3Af8BigGHAYYB/wGmAaMBoQH/AzoBYAQA + AYIBgAH/AYABNQE0Af8BgAE1ATQB/wGAATUBNAH/AYABNQE0Af8BigGHAYYB/wGmAaMBoQH/AzoBYAQA AY4BiwEAAf8BjgGLAQAB/wG7AbkBAAH/DAAC9QHoAf8BwgHAAQAB/wwAAvEB3wH/AcwBywGNAf8B0wHS AZwB/wHuAe0B2AH/Ae4B7QHYAf8B7gHtAdgB/wHuAe0B2AH/AacBpAEAAf8ByQHIAYUB/wLqAdAB/wGO AYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEA Af8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8DAAH/A6IB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA Af8DAAH/AwAB/wMAAf8DyAH/CAAD4wH/A6AB/wOtAf8IAAPIAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA Af8DAAH/AwAB/wMAAf8DogH/AwAB/xAAAzMBU1j/AzcBWxwAAyoBQAHAAb0BvAH/AawBqQGoAf8BnwGc - AZoB/wGdAZoBmAH/AZsBmAGWAf8BmAGVAZMB/wExAS8BLQH/AwAB/wMAAf8DAAH/ATQBMQEwAf8BqQGm + AZoB/wGdAZoBmAH/AZsBmAGWAf8BmAGVAZMB/wEuASwBKgH/AwAB/wMAAf8DAAH/ATEBLgEtAf8BqQGm AaQB/wGnAaQBogH/AaUBogGgAf8BowGgAZ4B/wGhAZ4BnAH/AaEBngGcAf8BoQGeAZwB/wGhAZ4BnAH/ - AYUBggGBAf8BgAE4ATcB/wGAATgBNwH/AYABOAE3Af8BgAE4ATcB/wGAATgBNwH/AZ0BmgGZAf8DXAHf + AYUBggGBAf8BgAE1ATQB/wGAATUBNAH/AYABNQE0Af8BgAE1ATQB/wGAATUBNAH/AZ0BmgGZAf8DXAHf BAABjgGLAQAB/wGOAYsBAAH/AbsBuQEAAf8MAAL1AegB/wHCAcABAAH/DAAC8QHfAf8BzAHLAY0B/wHb AdoBrgH/EAABugG4AQAB/wHMAcsBjAH/AdYB1QGkAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGL AQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/ @@ -230,9 +230,9 @@ Af8DAAH/AwAB/wgAA5EB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/A6IB/wMAAf8QAAMz AVMI/wP+Af8D/gH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D/gH/ A/4B/wP+Af8D/gH/A/4B/wP+Bf8DNwFbHAADUQGfAb0BuwG5Af8BpAGhAZ8B/wGiAZ8BnQH/AZ8BnAGa - Af8BnQGaAZgB/wGbAZgBlgH/AwAB/wMAAf8DAAH/AwAB/wEUAR0BIgH/AaoBpwGlAf8BqAGlAaMB/wGm - AaMBoQH/AaQBoQGfAf8BogGfAZ0B/wGhAZ4BnAH/AaEBngGcAf8BngGbAZkB/wGAATgBNwH/AYABOAE3 - Af8BgAE4ATcB/wGAATgBNwH/AYABOAE3Af8BgAE4ATcB/wGMAYkBiAH/AacBpAGiAf8DIQEwAY4BiwEA + Af8BnQGaAZgB/wGbAZgBlgH/AwAB/wMAAf8DAAH/AwAB/wERARoBHwH/AaoBpwGlAf8BqAGlAaMB/wGm + AaMBoQH/AaQBoQGfAf8BogGfAZ0B/wGhAZ4BnAH/AaEBngGcAf8BngGbAZkB/wGAATUBNAH/AYABNQE0 + Af8BgAE1ATQB/wGAATUBNAH/AYABNQE0Af8BgAE1ATQB/wGMAYkBiAH/AacBpAGiAf8DIQEwAY4BiwEA Af8BjgGLAQAB/wG7AbkBAAH/DAAC9QHoAf8BwgHAAQAB/wwAAvEB3wH/AcwBywGNAf8B2wHaAa4B/xAA AboBuAEAAf8C3QGzAf8B1AHTAZ4B/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEA Af8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8DAAH/A6IB/wMA @@ -240,9 +240,9 @@ Af8DugH/BAADwAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DogH/AwAB/xAAAzMBUwT/ A/4B/wP9Af8D/QH/A/0B/wP9Af8D/QH/A/0B/wP9Af8D/QH/A/0B/wP9Af8D/QH/A/0B/wP9Af8D/QH/ A/0B/wP9Af8D/QH/A/0B/wP9Bf8DNwFbHAADXAHfAbYBtAGyAf8BpgGjAaEB/wGkAaEBnwH/AaIBnwGd - Af8BnwGcAZoB/wGdAZoBmAH/ARUBEwESAf8DAAH/AQABjwG4Af8BAAGPAb0B/wEdAY0BpAH/AasBqAGm + Af8BnwGcAZoB/wGdAZoBmAH/ARIBEAEPAf8DAAH/AQABjwG4Af8BAAGPAb0B/wEaAY0BpAH/AasBqAGm Af8BqQGmAaQB/wGnAaQBogH/AaUBogGgAf8BowGgAZ4B/wGhAZ4BnAH/AaEBngGcAf8BjwGMAYoB/wGE - AYEBgAH/AYQBgQGAAf8BgAE4ATcB/wGAATgBNwH/AYABOAE3Af8BgAE4ATcB/wGAATgBNwH/AagBpQGj + AYEBgAH/AYQBgQGAAf8BgAE1ATQB/wGAATUBNAH/AYABNQE0Af8BgAE1ATQB/wGAATUBNAH/AagBpQGj Af8DRwGAAY4BiwEAAf8BjgGLAQAB/wGfAZwBAAH/AbgBtgEAAf8BuAG2AQAB/wG4AbYBAAH/AbQBsgEA Af8BpAGhAQAB/wHLAcoBiwH/AcsBygGLAf8BywHKAYsB/wHIAccBgwH/Ab8BvgEAAf8B2wHaAa0B/xAA AboBuAEAAf8C3QGzAf8C6gHQAf8BjgGLAQAB/wGRAY4BAAH/AcwBywGMAf8BlwGUAQAB/wGOAYsBAAH/ @@ -251,10 +251,10 @@ Af8DnAH/BAADzgH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DogH/AwAB/xAAAzMBUwP+ Af8D/QH/A/0B/wP9Af8D/QH/A/0B/wP9Af8D/QH/A/0B/wP9Af8D/QH/A/0B/wP9Af8D/QH/A/0B/wP9 Af8D/QH/A/0B/wP9Af8D/QH/A/0F/wM3AVsYAAMMARABxAHBAcAB/wGyAa8BrQH/AakBpgGkAf8BpgGj - AaEB/wGkAaEBnwH/AaIBnwGdAf8BnwGcAZoB/wGDAYABOQH/AwAB/wEEAaQBygH/AQABkAG9Af8BHQGN + AaEB/wGkAaEBnwH/AaIBnwGdAf8BnwGcAZoB/wGDAYABNgH/AwAB/wEBAaQBygH/AQABkAG9Af8BGgGN AaQB/wGsAakBpwH/AaoBpwGlAf8BqAGlAaMB/wGmAaMBoQH/AaQBoQGfAf8BngGbAZkB/wGRAY4BjQH/ - AZQBkQGPAf8BoQGeAZwB/wGgAZ0BmwH/AY8BjAGKAf8BgAE4ATcB/wGAATgBNwH/AYABOAE3Af8BgAE4 - ATcB/wGfAZwBmgH/A1QBrwGOAYsBAAH/AY4BiwEAAf8BuwG5AQAB/wwAAvUB6AH/AbkBtgEAAf8B1AHT + AZQBkQGPAf8BoQGeAZwB/wGgAZ0BmwH/AY8BjAGKAf8BgAE1ATQB/wGAATUBNAH/AYABNQE0Af8BgAE1 + ATQB/wGfAZwBmgH/A1QBrwGOAYsBAAH/AY4BiwEAAf8BuwG5AQAB/wwAAvUB6AH/AbkBtgEAAf8B1AHT AZ4B/wHZAdgBqAH/AdkB2AGoAf8B2QHYAagB/wHFAcQBAAH/AaQBoQEAAf8BxQHDAQAB/wHFAcMBAAH/ AcUBwwEAAf8BxQHDAQAB/wG4AbYBAAH/At0BswH/AuoB0AH/AZEBjgEAAf8C3AGxAf8EAAHrAeoB0QH/ AZcBlAEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8DAAH/ @@ -262,10 +262,10 @@ AwAB/wMAAf8DAAH/A9wB/wQAA7MB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/A6IB/wMA Af8QAAMzAVMD/QH/A/0B/wP8Af8D/AH/A/wB/wP8Af8D/AH/A/wB/wP8Af8D/AH/A/wB/wP8Af8D/AH/ A/wB/wP8Af8D/AH/A/wB/wP8Af8D/AH/A/wB/wP8Bf8DNwFbGAADKgFAAcQBwgHBAf8BvgG7AboB/wG2 - AbMBsQH/AasBqAGmAf8BpgGjAaEB/wGkAaEBnwH/AaIBnwGdAf8BnwGcAZoB/wEKAQgBBwH/AQABgwGZ - Af8BAAGmAcoB/wEeAZIBpwH/Aa0BqgGoAf8BqwGoAaYB/wGlAaIBoAH/AZgBlQGTAf8BjwGMAYsB/wGJ - AYYBhAH/AZEBjgGNAf8BoQGeAZwB/wGhAZ4BnAH/AaEBngGcAf8BnwGcAZoB/wGBATkBOAH/AYABOAE3 - Af8BgAE4ATcB/wGAATgBNwH/AZUBkgGQAf8DWQG/AY4BiwEAAf8BjgGLAQAB/wG7AbkBAAH/DAAC9QHo + AbMBsQH/AasBqAGmAf8BpgGjAaEB/wGkAaEBnwH/AaIBnwGdAf8BnwGcAZoB/wEHAQUBBAH/AQABgwGZ + Af8BAAGmAcoB/wEbAZIBpwH/Aa0BqgGoAf8BqwGoAaYB/wGlAaIBoAH/AZgBlQGTAf8BjwGMAYsB/wGJ + AYYBhAH/AZEBjgGNAf8BoQGeAZwB/wGhAZ4BnAH/AaEBngGcAf8BnwGcAZoB/wGBATYBNQH/AYABNQE0 + Af8BgAE1ATQB/wGAATUBNAH/AZUBkgGQAf8DWQG/AY4BiwEAAf8BjgGLAQAB/wG7AbkBAAH/DAAC9QHo Af8ByAHGAYMB/wHWAdUBowH/AvIB4gH/AvIB4QH/AvIB4QH/AvIB4QH/Aa4BrAEAAf8B2wHaAa0B/wL4 Ae8B/wL4Ae8B/wL4Ae8B/wHWAdUBowH/AcUBxAEAAf8B4AHfAbkB/wHcAdsBsQH/DAAB6wHqAdEB/wGX AZQBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wMAAf8DoQH/AwAB/wMA @@ -273,10 +273,10 @@ Af8LAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DoQH/AwAB/xAAAzMBUwP8Af8D+wH/ A/oB/wP6Af8D+gH/A/oB/wP6Af8D+gH/A/oB/wP6Af8D+gH/A/oB/wP6Af8D+gH/A/oB/wP6Af8D+gH/ A/oB/wP6Af8D+gH/A/oB/wP+Af8DNwFbGAADKgFAAcUBwwHCAf8BxAHBAcAB/wHCAcABvgH/Ab4BuwG6 - Af8BqgGnAaUB/wGmAaMBoQH/AaQBoQGfAf8BpAGhAZ8B/wGfAZwBmwH/AQABGAEjAf8BAwG9AdoB/wEg + Af8BqgGnAaUB/wGmAaMBoQH/AaQBoQGfAf8BpAGhAZ8B/wGfAZwBmwH/AQABFQEgAf8BAAG9AdoB/wEd AZ4BrwH/Aa4BqwGpAf8BogGfAZ0B/wGSAY8BjQH/AZQBkQGPAf8BlAGRAZAB/wGLAYgBhwH/AZ4BmwGZ - Af8BoQGeAZwB/wGhAZ4BnAH/AaEBngGcAf8BoQGeAZwB/wGGAYMBggH/AYABOAE3Af8BgAE4ATcB/wGA - ATgBNwH/AZUBkgGRAf8DYgHvAY4BiwEAAf8BjgGLAQAB/wG7AbkBAAH/DAAC9QHoAf8ByAHGAYMB/wHZ + Af8BoQGeAZwB/wGhAZ4BnAH/AaEBngGcAf8BoQGeAZwB/wGGAYMBggH/AYABNQE0Af8BgAE1ATQB/wGA + ATUBNAH/AZUBkgGRAf8DYgHvAY4BiwEAAf8BjgGLAQAB/wG7AbkBAAH/DAAC9QHoAf8ByAHGAYMB/wHZ AdgBqQH/EAABvgG8AQAB/wHTAdIBnAH/AcwBygGLAf8B2wHaAa4B/wHbAdoBrgH/AdsB2gGuAf8BvwG+ AQAB/wG7AboBAAH/Av4B/AH/EAABugG4AQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/ AY4BiwEAAf8DAAH/A50B/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ @@ -284,19 +284,19 @@ Af8DnQH/AwAB/xAAAzMBUwP6Af8D+QH/A/kB/wP5Af8D+QH/A/kB/wP5Af8D+QH/A/kB/wP5Af8D+QH/ A/kB/wP5Af8D+QH/A/kB/wP5Af8D+QH/A/kB/wP5Af8D+QH/A/kB/wP9Af8DNwFbGAADKgFAAccBxQHD Af8BxQHDAcIB/wHDAcABvwH/Ab0CuwH/Aa8BrgGwAf8BrAGqAagB/wGmAaMBoQH/AagBpQGjAf8BtwG0 - AbIB/wEUARwBHQH/AQABxAHfAf8BCQGpAb4B/wGOAaEBpgH/AZYBkwGRAf8BlAGRAY8B/wGZAZYBlAH/ + AbIB/wERARkBGgH/AQABxAHfAf8BBgGpAb4B/wGOAaEBpgH/AZYBkwGRAf8BlAGRAY8B/wGZAZYBlAH/ AacBpAGiAf8BmwGYAZYB/wGjAaABngH/AaEBngGcAf8BoQGeAZwB/wGhAZ4BnAH/AaEBngGcAf8BhgGD - AYIB/wGAATgBNwH/AYABOAE3Af8BgAE4ATcB/wGWAZMBkQH/AasBqAGmAf8BjgGLAQAB/wGOAYsBAAH/ + AYIB/wGAATUBNAH/AYABNQE0Af8BgAE1ATQB/wGWAZMBkQH/AasBqAGmAf8BjgGLAQAB/wGOAYsBAAH/ AbsBuQEAAf8MAAL1AegB/wHIAcYBgwH/AdkB2AGoAf8QAAG+AbwBAAH/AdYB1QGiAf8B6AHnAcoB/wwA AdsB2gGuAf8B1wHWAaUB/wG2AbQBAAH/Av4B/AH/CAABwwHBAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGL AQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wMAAf8DmAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wOwAf8D6wH/CAADngH/AwAB/wMAAf8DAAH/AwAB/wMA Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wOYAf8DAAH/EAADMwFTA/kB/wP5Af8D+AH/A/gB/wP4Af8D+AH/ A/gB/wP4Af8D+AH/A/gB/wP4Af8D+AH/A/gB/wP4Af8D+AH/A/gB/wP4Af8D+AH/A/gB/wP4Af8D+AH/ - A/wB/wM3AVsYAAMqAUABqAHAAcUB/wE6AbIBwAH/AQgBogG8Af8BAAGaAbwB/wEAAZcBugH/ASsBqQG5 - Af8BrgGrAakB/wGrAagBpgH/AbgBtQGzAf8BOgE3ATYB/wEAAY8BoQH/AQABvwHbAf8BAAGiAcEB/wEu + A/wB/wM3AVsYAAMqAUABqAHAAcUB/wE3AbIBwAH/AQUBogG8Af8BAAGaAbwB/wEAAZcBugH/ASgBqQG5 + Af8BrgGrAakB/wGrAagBpgH/AbgBtQGzAf8BNwE0ATMB/wEAAY8BoQH/AQABvwHbAf8BAAGiAcEB/wEr AZEBnQH/AaABnQGbAf8BnwGcAZoB/wGmAaMBoQH/AaYBowGhAf8BpAGhAZ8B/wGiAZ8BnQH/AaEBngGc - Af8BoQGeAZwB/wGhAZ4BnAH/AYgBhQGEAf8BgAE4ATcB/wGAATgBNwH/AYABOAE3Af8BlgGTAZIB/wNZ + Af8BoQGeAZwB/wGhAZ4BnAH/AYgBhQGEAf8BgAE1ATQB/wGAATUBNAH/AYABNQE0Af8BlgGTAZIB/wNZ Ab8BjgGLAQAB/wGOAYsBAAH/AZcBlAEAAf8BugG4AQAB/wG9AbwBAAH/Ab0BvAEAAf8BuwG6AQAB/wHG AcQBAAH/AdkB2AGoAf8QAAG+AbwBAAH/AdYB1QGiAf8C5wHKAf8MAAHbAdoBrgH/AuoB0AH/AY4BiwEA Af8BtgG0AQAB/wH+Af0B/AH/AcMBwgEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGO @@ -304,10 +304,10 @@ Af8DAAH/AwAB/wMAAf8DAAH/A7AB/wgAA9UB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ AwAB/wMAAf8DAAH/AwAB/wOUAf8DAAH/EAADMwFTA/gB/wP3Af8D9gH/A/YB/wP2Af8D9gH/A/YB/wP2 Af8D9gH/A/YB/wP2Af8D9gH/A/YB/wP2Af8D9gH/A/YB/wP2Af8D9gH/A/YB/wP2Af8D9gH/A/oB/wM3 - AVsQAAMyAVADVAGvAVgCYgHvAQABmgG8Af8BAAGmAcYB/wEAAbgB1AH/AREBxgHfAf8BEAHCAdwB/wEA - AZoBuAH/AboBuAG3Af8BuQG2AbUB/wG1AbMBsgH/ASoBhAGKAf8BAAGEAZwB/wEAAbsB1wH/AQABrgHP - Af8BAAGVAb4B/wE6AZQBngH/AaoBpwGlAf8BqQGmAaQB/wGnAaQBogH/AaUBogGgAf8BowGgAZ4B/wGh - AZ4BnAH/AaEBngGcAf8BoAGdAZsB/wGGAYMBggH/AYIBOgE5Af8BgAE4ATcB/wGAATgBNwH/AaIBnwGe + AVsQAAMyAVADVAGvAVgCYgHvAQABmgG8Af8BAAGmAcYB/wEAAbgB1AH/AQ4BxgHfAf8BDQHCAdwB/wEA + AZoBuAH/AboBuAG3Af8BuQG2AbUB/wG1AbMBsgH/AScBhAGKAf8BAAGEAZwB/wEAAbsB1wH/AQABrgHP + Af8BAAGVAb4B/wE3AZQBngH/AaoBpwGlAf8BqQGmAaQB/wGnAaQBogH/AaUBogGgAf8BowGgAZ4B/wGh + AZ4BnAH/AaEBngGcAf8BoAGdAZsB/wGGAYMBggH/AYIBNwE2Af8BgAE1ATQB/wGAATUBNAH/AaIBnwGe Af8DWQG/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/Aa4BrAEAAf8B3gHdAbQB/wHeAd0BtAH/Ad4B3QG0 Af8BzwHOAZMB/wGpAacBAAH/Ab4BvAEAAf8BvgG8AQAB/wG+AbwBAAH/Ab4BvAEAAf8BtgG0AQAB/wHW AdUBogH/AucBygH/DAAB2wHaAa4B/wLqAdAB/wGOAYsBAAH/AY4BiwEAAf8BoQGeAQAB/wGOAYsBAAH/ @@ -316,10 +316,10 @@ AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/A48B/wMAAf8QAAMz AVMD9gH/A/UB/wP1Af8D9QH/A/UB/wP1Af8D9QH/A/UB/wP1Af8D9QH/A/UB/wP1Af8D9QH/A/UB/wP1 Af8D9QH/A/UB/wP1Af8D9QH/A/UB/wP1Af8D+QH/AzcBWxEAAZABvwH/AQABjAG3Af8BAAGyAdIB/wEA - AccB4QH/AREByQHhAf8BgQHHAdcB/wGaAcQBzAH/ASQBygHhAf8BAAGhAcIB/wElAZ0BsQH/AR4BmwGy - Af8BAAGWAbYB/wEAAaABwgH/AQABrgHMAf8BAAG4AdYB/wEAAbMB0wH/AQABmgHBAf8BCwGIAaUB/wGr + AccB4QH/AQ4ByQHhAf8BgQHHAdcB/wGaAcQBzAH/ASEBygHhAf8BAAGhAcIB/wEiAZ0BsQH/ARsBmwGy + Af8BAAGWAbYB/wEAAaABwgH/AQABrgHMAf8BAAG4AdYB/wEAAbMB0wH/AQABmgHBAf8BCAGIAaUB/wGr AagBpgH/AaoBpwGlAf8BpwGkAaIB/wGmAaMBoQH/AaMBoAGeAf8BogGfAZ0B/wGhAZ4BnAH/AZ4BmwGZ - Af8BhwGEAYIB/wGEAYEBgAH/AYIBOgE5Af8BgAE4ATcB/wGsAakBpwH/A0cBgAGOAYsBAAH/AY4BiwEA + Af8BhwGEAYIB/wGEAYEBgAH/AYIBNwE2Af8BgAE1ATQB/wGsAakBpwH/A0cBgAGOAYsBAAH/AY4BiwEA Af8BjgGLAQAB/wGOAYsBAAH/Aa0BqwEAAf8C9gHsAf8C+QHxAf8C+QHxAf8B6wHqAdEB/wHVAdQBoQH/ AvkB8QH/AvkB8QH/AvkB8QH/AecB5gHJAf8BtgG0AQAB/wHKAckBhgH/AdoB2QGrAf8B2gHZAasB/wHa AdkBqwH/AcQBwwEAAf8B6gHpAc8B/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEA @@ -328,8 +328,8 @@ AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DigH/AwAB/xAAAzMBUwP1Af8D9QH/A/QB/wP0 Af8D9AH/A/QB/wP0Af8D9AH/A/QB/wP0Af8D9AH/A/QB/wP0Af8D9AH/A/QB/wP0Af8D9AH/A/QB/wP0 Af8D9AH/A/QB/wP3Af8DNwFbEAABWAJiAe8BAAGeAcUB/wFXAlwB3wNZAb8ByQHHAcYB/wHHAcUBwwH/ - AcQBwgHBAf8BgQHGAdYB/wEJAbwB1gH/AQABogHDAf8BAAGuAc0B/wEAAbgB1QH/AQABugHXAf8BAAG6 - AdcB/wEAAboB1wH/AQABtQHVAf8BAAGhAccB/wEBAYsBrQH/AasBqAGmAf8BoQGeAZwB/wGpAaYBpAH/ + AcQBwgHBAf8BgQHGAdYB/wEGAbwB1gH/AQABogHDAf8BAAGuAc0B/wEAAbgB1QH/AQABugHXAf8BAAG6 + AdcB/wEAAboB1wH/AQABtQHVAf8BAAGhAccB/wEAAYsBrQH/AasBqAGmAf8BoQGeAZwB/wGpAaYBpAH/ AaMBoAGeAf8BnAGZAZcB/wGbAZgBlgH/AZwBmQGXAf8BjwGMAYsB/wGJAYYBhAH/AYcBhAGCAf8BhAGB AYAB/wGRAY4BjQH/AbABrQGrAf8DIQEwAY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGL AQAB/wGcAZoBAAH/Ad8B3gG2Af8B4wHiAb8B/wHjAeIBvwH/Ad8B3gG2Af8BvwG9AQAB/wHjAeIBvwH/ @@ -339,9 +339,9 @@ AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/A9UB/xwAA/MB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA Af8DAAH/AwAB/wMAAf8DhQH/AwAB/xAAAzMBUwP0Af8D8wH/A/IB/wPyAf8D8gH/A/IB/wPyAf8D8gH/ A/IB/wPyAf8D8gH/A/IB/wPyAf8D8gH/A/IB/wPxAf8D8QH/A/EB/wPxAf8D8QH/A/EB/wPzAf8DNwFb - EAADUQGgAQQBqQHOAf8BWgJdAdMDMgFQAcsByQHIAf8ByAHGAcQB/wHFAcMBwgH/AZgBwgHLAf8BIQHI - AeAB/wEAAbsB2QH/AQABuwHYAf8BAAG7AdgB/wEAAbwB2QH/AQABwAHbAf8BAgHFAd8B/wEGAcEB3QH/ - AQABlQG2Af8BAgEvAYsB/wGeAZsBmQH/AZsBmAGWAf8BoAGdAZsB/wGWAZMBkQH/AZQBkQGPAf8BkgGP + EAADUQGgAQEBqQHOAf8BWgJdAdMDMgFQAcsByQHIAf8ByAHGAcQB/wHFAcMBwgH/AZgBwgHLAf8BHgHI + AeAB/wEAAbsB2QH/AQABuwHYAf8BAAG7AdgB/wEAAbwB2QH/AQABwAHbAf8BAAHFAd8B/wEDAcEB3QH/ + AQABlQG2Af8BAAEsAYsB/wGeAZsBmQH/AZsBmAGWAf8BoAGdAZsB/wGWAZMBkQH/AZQBkQGPAf8BkgGP AY0B/wGQAY0BiwH/AY0BigGJAf8BiwGIAYcB/wGJAYYBhAH/AYcBhAGCAf8BoQGeAZwB/wNcAd8EAAGO AYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGdAZoBAAH/AaUBowEA Af8BpQGjAQAB/wGlAaMBAAH/AZwBmQEAAf8BowGhAQAB/wGlAaMBAAH/AaUBowEAAf8BpQGjAQAB/wGb @@ -350,9 +350,9 @@ AY4BiwEAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/A5gB/yQAA74B/wMA Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/EAADMwFTA/IB/wPxAf8D8QH/ A/EB/wPxAf8D8QH/A/EB/wPxAf8D8QH/A/EB/wPxAf8D8QH/A/EB/wPxAf8D8AH/A+0B/wPqAf8D6AH/ - A+gB/wPnAf8D5gH/A+cB/wM4AVwQAAM6AWABHQG0AdcB/wEAAZYBugH/AxwBJwNcAd8BygHIAccB/wHG - AcQBwwH/AbsBwgHDAf8BIAHKAeEB/wEAAb4B2gH/AQABwQHdAf8BDwHHAeAB/wERAcgB4QH/ARoBwgHX - Af8BFAGbAagB/wMAAf8DAAH/AYQBggGAAf8BpQGiAaAB/wGqAacBpQH/AaoBpwGlAf8BoAGdAZsB/wGW + A+gB/wPnAf8D5gH/A+cB/wM4AVwQAAM6AWABGgG0AdcB/wEAAZYBugH/AxwBJwNcAd8BygHIAccB/wHG + AcQBwwH/AbsBwgHDAf8BHQHKAeEB/wEAAb4B2gH/AQABwQHdAf8BDAHHAeAB/wEOAcgB4QH/ARcBwgHX + Af8BEQGbAagB/wMAAf8DAAH/AYQBggGAAf8BpQGiAaAB/wGqAacBpQH/AaoBpwGlAf8BoAGdAZsB/wGW AZMBkQH/AZQBkQGPAf8BkgGPAY0B/wGQAY0BiwH/AY0BigGJAf8BiwGIAYcB/wGRAY4BjAH/AbMBsAGu Af8DRwGABAABjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGL AQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/ @@ -361,8 +361,8 @@ Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/A9oB/ysAAf8DAAH/AwAB/wMA Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/EAADMwFTA/EB/wPxAf8D8AH/A/AB/wPwAf8D8AH/ A/AB/wPwAf8D8AH/A/AB/wPwAf8D8AH/A/AB/wPvAf8D7AH/A+QB/wPYAf8D0AH/A88B/wPQAf8DzAH/ - A8gB/wM1AVcQAAMMARABJwG3AdoB/wEAAaEBxQH/A0MBdwMyAVABywHJAcgB/wHJAccBxQH/AcUBwwHC - Af8BNQHGAdcB/wEAAb8B2wH/AQoBsgHMAf8BjgG+AccB/wGpAbkBvAH/AbkBtwG1Af8BtwG0AbIB/wGk + A8gB/wM1AVcQAAMMARABJAG3AdoB/wEAAaEBxQH/A0MBdwMyAVABywHJAcgB/wHJAccBxQH/AcUBwwHC + Af8BMgHGAdcB/wEAAb8B2wH/AQcBsgHMAf8BjgG+AccB/wGpAbkBvAH/AbkBtwG1Af8BtwG0AbIB/wGk AaIBoAH/AasBqAGmAf8BsQGvAa0B/wGvAawBqgH/Aa0BqgGoAf8BqwGoAaYB/wGiAZ8BnQH/AZgBlQGT Af8BlgGTAZEB/wGUAZEBjwH/AZIBjwGNAf8BkAGNAYsB/wGNAYoBiQH/Aa0BqgGoAf8DXAHfAwwBEAQA AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGL @@ -371,8 +371,8 @@ AfkB/wGdAZsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8DAAH/AwAB/wMAAf8DAAH/ AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/LwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ AwAB/wMAAf8QAAMzAVMD8AH/A+8B/wPuAf8D7gH/A+4B/wPuAf8D7gH/A+4B/wPuAf8D7gH/A+4B/wPu - Af8D7gH/A+0B/wPoAf8D1gH/A7gB/wOnAf8DogH/A54B/wOeAf8DYQHmAxQBGxQAA1QBrwEXAbAB0wH/ - AVoCXQHTBAADVAGvAcsByQHIAf8BxwHFAcQB/wGTAcMBzAH/AQMBwwHeAf8BAAGaAboB/wG9AbsBugH/ + Af8D7gH/A+0B/wPoAf8D1gH/A7gB/wOnAf8DogH/A54B/wOeAf8DYQHmAxQBGxQAA1QBrwEUAbAB0wH/ + AVoCXQHTBAADVAGvAcsByQHIAf8BxwHFAcQB/wGTAcMBzAH/AQABwwHeAf8BAAGaAboB/wG9AbsBugH/ AbwBugG4Af8BugG3AbYB/wG4AbYBtAH/AbYBswGyAf8BtAGyAbAB/wGyAa8BrQH/AbABrQGrAf8BrgGr AakB/wGrAagBpgH/AZ4BmwGZAf8BmwGYAZYB/wGYAZUBkwH/AZYBkwGRAf8BlAGRAY8B/wGSAY8BjQH/ AagBpQGjAf8BtQGzAbEB/wMqAUAIAAGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEA @@ -382,8 +382,8 @@ AY4BiwEAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ AwAB/wMAAf8DAAH/AwAB/xAAAzMBUwPuAf8D7QH/A+0B/wPtAf8D7QH/A+0B/wPtAf8D7QH/A+0B/wPt - Af8D7QH/A+0B/wPtAf8D7AH/A+MB/wPKAf8DnQH/A4MB/wOGAf8DmAH/A2IB7wMnATsYAAM6AWABLQG6 - Ad0B/wEAAZMBugH/AxoBJAMMARADXAHPAY0BuAHEAf8BAgGlAcAB/wEAAbkB1gH/AQABngG+Af8BmAG2 + Af8D7QH/A+0B/wPtAf8D7AH/A+MB/wPKAf8DnQH/A4MB/wOGAf8DmAH/A2IB7wMnATsYAAM6AWABKgG6 + Ad0B/wEAAZMBugH/AxoBJAMMARADXAHPAY0BuAHEAf8BAAGlAcAB/wEAAbkB1gH/AQABngG+Af8BmAG2 Ab0B/wG9AbsBuQH/Ab0BugG5Af8BuQG3AbUB/wG3AbQBsgH/AbUBsgGxAf8BswGwAa4B/wGxAa8BrQH/ Aa0BqgGoAf8BogGfAZ0B/wGfAZwBmgH/AZ0BmgGYAf8BmwGYAZYB/wGYAZUBkwH/AZYBkwGRAf8BpAGh AZ8B/wG4AbUBswH/A0cBgAwAAY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGO @@ -393,7 +393,7 @@ Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/LwAB/wMAAf8DAAH/AwAB/wMA Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8QAAMzAVMD7QH/A+0B/wPsAf8D7AH/A+wB/wPsAf8D7AH/ A+wB/wPsAf8D7AH/A+wB/wPsAf8D7AH/A+sB/wPfAf8DyQH/A+0B/wPwAf8D8QH/A2cB8gMrAUIcAAMM - ARABOAHBAeIB/wEKAZ4BxwH/AVgCWgHAA1EBogEAAZgBuwH/AQABowHEAf8BAAG1AdMB/wEAAcIB3gH/ + ARABNQHBAeIB/wEHAZ4BxwH/AVgCWgHAA1EBogEAAZgBuwH/AQABowHEAf8BAAG1AdMB/wEAAcIB3gH/ AQABsQHQAf8BoQG3Ab0B/wG+AbwBugH/Ab0BuwG5Af8BvQG6AbkB/wG6AbcBtQH/AbYBswGxAf8BsgGv Aa0B/wGuAasBqQH/AaYBowGhAf8BpAGhAZ8B/wGiAZ8BnQH/AZ8BnAGaAf8BnQGaAZgB/wGdAZoBmAH/ Aa4BqwGpAf8BuQG3AbUB/wNRAZ8QAAGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEA @@ -403,8 +403,8 @@ AYsBAAH/AY4BiwEAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA Af8DAAH/AwAB/wMAAf8DAAH/AwAB/xAAAzMBUwPsAf8D7AH/A+sB/wPrAf8D6wH/A+sB/wPrAf8D6wH/ - A+sB/wPrAf8D6wH/A+sB/wPrAf8D6QH/A9wB/wPHAf8D/gX/A2cB8gMsAUQkAANcAc8BJQG2AdsB/wEE - AZcBwgH/AQIBngHGAf8BCwGxAdQB/wEXAb0B3AH/AR4BwAHbAf8BOQHCAdQB/wGjAcIByQH/AcIBwAG+ + A+sB/wPrAf8D6wH/A+sB/wPrAf8D6QH/A9wB/wPHAf8D/gX/A2cB8gMsAUQkAANcAc8BIgG2AdsB/wEB + AZcBwgH/AQABngHGAf8BCAGxAdQB/wEUAb0B3AH/ARsBwAHbAf8BNgHCAdQB/wGjAcIByQH/AcIBwAG+ Af8BvwG8AbsB/wG9AbsBuQH/AbsBuAG3Af8BugG3AbUB/wG0AbEBrwH/Aa0BqgGoAf8BqwGoAaYB/wGp AaYBpAH/AaYBowGhAf8BpAGhAZ8B/wGiAZ8BnQH/AacBpAGiAf8BuAG2AbQB/wG8AbkBuAH/A0ABcBQA AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGL @@ -414,8 +414,8 @@ AY4BiwEAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ AwAB/wMAAf8DAAH/AwAB/xAAAzMBUwPqAf8D6gH/A+kB/wPpAf8D6QH/A+kB/wPpAf8D6QH/A+kB/wPp - Af8D6QH/A+kB/wPpAf8D5gH/A9gB/wPGAf8D+AH/A2cB8gMtAUUoAANAAXABiwHKAegB/wE0Ab8B4QH/ - ATABuwHeAf8DVAGvAzoBYAMMARADRwGAA2IB7wHLAckByAH/AcYBxAHDAf8BwQG/Ab0B/wG8AbkBuAH/ + Af8D6QH/A+kB/wPpAf8D5gH/A9gB/wPGAf8D+AH/A2cB8gMtAUUoAANAAXABiwHKAegB/wExAb8B4QH/ + AS0BuwHeAf8DVAGvAzoBYAMMARADRwGAA2IB7wHLAckByAH/AcYBxAHDAf8BwQG/Ab0B/wG8AbkBuAH/ AboBtwG2Af8BuQG2AbQB/wGvAawBqgH/Aa0BqgGoAf8BqwGoAaYB/wGsAakBpwH/AbABrQGsAf8BuwG4 AbYB/wG/AbwBuwH/A1wBzwMhATAYAAGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEA Af8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGOAYsBAAH/AY4BiwEAAf8BjgGLAQAB/wGO @@ -1053,6 +1053,9 @@ 17, 17 + + 17, 17 + IMPORTANT: The SEB Service changes aspects of the system configuration, e.g. to lock down the security screen (CTRL+ALT+DEL). Some anti-virus software providers might falsely identify its operations as malicious, thus it is not recommended to use the SEB Service in uncontrolled environments (e.g. BYOD). @@ -1066,12 +1069,36 @@ True + + True + + + True + True True + + True + + + True + + + True + + + True + + + True + + + True + True @@ -1093,6 +1120,12 @@ True + + True + + + True + Allow locating third party applications with a file dialog if it cannot be found at the paths specified. Only applications matching other criteria specified (like Original Name, executable) are accepted. @@ -1108,6 +1141,18 @@ True + + True + + + True + + + True + + + True + The seb(s):// link to the config file can contain an additional query string, separated from the main URL by '?' or '??' (if the URL itself doesn't contain a query). SEB will then append this query string to the Start URL. @@ -1140,6 +1185,15 @@ IMPORTANT: Always copy the key(s) as a last step, after the configuration file w True + + True + + + True + + + True + To be used on Windows tablets. In Window 10, Tablet Mode needs to be activated. Not working with the Create New Desktop kiosk mode, you have to reconfigure the SEB client settings to Disable Explorer Shell.